From 10236320506221df903a2e0f6a90b9662cb3a0b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20K=C3=B6hler?= Date: Tue, 8 Jul 2025 11:04:51 -0300 Subject: [PATCH 001/212] feat: add segmentLabel color (#2169) * feat: add segmentLabel color * chore: remove textbox link --- .../tools/segmentation/SegmentLabelTool.ts | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/tools/src/tools/segmentation/SegmentLabelTool.ts b/packages/tools/src/tools/segmentation/SegmentLabelTool.ts index 049863689b..daa5c869c0 100644 --- a/packages/tools/src/tools/segmentation/SegmentLabelTool.ts +++ b/packages/tools/src/tools/segmentation/SegmentLabelTool.ts @@ -1,6 +1,8 @@ import { getEnabledElement } from '@cornerstonejs/core'; import type { Types } from '@cornerstonejs/core'; +import { config as segmentationConfig } from '../../stateManagement/segmentation'; + import { BaseTool } from '../base'; import type { PublicToolProps, @@ -14,7 +16,8 @@ import { getActiveSegmentation } from '../../stateManagement/segmentation/active import { getSegmentIndexAtWorldPoint } from '../../utilities/segmentation'; import { state } from '../../store/state'; import type { Segmentation } from '../../types/SegmentationStateTypes'; -import { drawLinkedTextBox as drawLinkedTextBoxSvg } from '../../drawingSvg'; +import { drawTextBox as drawTextBoxSvg } from '../../drawingSvg'; +import type { Point2 } from 'packages/core/dist/esm/types'; /** * Represents a tool used for segment selection. It is used to select a segment @@ -140,13 +143,18 @@ class SegmentLabelTool extends BaseTool { } ); const segment = activeSegmentation.segments[hoveredSegmentIndex]; + const color = segmentationConfig.color.getSegmentIndexColor( + viewport.id, + segmentationId, + hoveredSegmentIndex + ); const label = segment?.label; const canvasCoordinates = viewport.worldToCanvas(worldPoint); this._editData = { hoveredSegmentIndex, hoveredSegmentLabel: label, canvasCoordinates, - worldPoint, + color, }; // No need to select background @@ -176,24 +184,28 @@ class SegmentLabelTool extends BaseTool { hoveredSegmentIndex, hoveredSegmentLabel, canvasCoordinates, - worldPoint, + color, } = this._editData; if (!hoveredSegmentIndex) { return; } - const textBoxPosition = viewport.worldToCanvas(worldPoint); + const offset = -15; + const textBoxPosition = [ + canvasCoordinates[0] + offset, + canvasCoordinates[1] + offset, + ] as Point2; - const boundingBox = drawLinkedTextBoxSvg( + const boundingBox = drawTextBoxSvg( svgDrawingHelper, 'segmentSelectLabelAnnotation', 'segmentSelectLabelTextBox', - [hoveredSegmentLabel ? hoveredSegmentLabel : '(unnamed segment)'], + [hoveredSegmentLabel ?? '(unnamed segment)'], textBoxPosition, - [canvasCoordinates], - {}, - {} + { + color: `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`, + } ); const left = canvasCoordinates[0]; From b58b602bc4abbc8a988441f0c963c8fad6704268 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 8 Jul 2025 14:08:42 +0000 Subject: [PATCH 002/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index ef52d9fe4a..22735f76b9 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -204921f9fa32d755dc3ffc0be86ef16e1c9f00b5 \ No newline at end of file +10236320506221df903a2e0f6a90b9662cb3a0b5 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index d66c939058..5028ad59a7 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.26.2", - "@cornerstonejs/tools": "^3.26.2" + "@cornerstonejs/core": "^3.27.0", + "@cornerstonejs/tools": "^3.27.0" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 3f84c16c2e..bea008d144 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.26.2", - "@cornerstonejs/tools": "^3.26.2" + "@cornerstonejs/core": "^3.27.0", + "@cornerstonejs/tools": "^3.27.0" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 1fd199ac85..8748517660 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.26.2", + "@cornerstonejs/core": "^3.27.0", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index a3a182f135..c5cf5a20f7 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.26.2", - "@cornerstonejs/core": "^3.26.2", - "@cornerstonejs/dicom-image-loader": "^3.26.2", - "@cornerstonejs/nifti-volume-loader": "^3.26.2", - "@cornerstonejs/tools": "^3.26.2", + "@cornerstonejs/adapters": "^3.27.0", + "@cornerstonejs/core": "^3.27.0", + "@cornerstonejs/dicom-image-loader": "^3.27.0", + "@cornerstonejs/nifti-volume-loader": "^3.27.0", + "@cornerstonejs/tools": "^3.27.0", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 0c887fc8a4..2b1b1847c2 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.26.2", - "@cornerstonejs/tools": "^3.26.2", + "@cornerstonejs/core": "^3.27.0", + "@cornerstonejs/tools": "^3.27.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index eedbbe24f6..b3396b02d8 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.26.2" + "@cornerstonejs/core": "^3.27.0" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 7064d98ad4..933a70318e 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.26.2", - "@cornerstonejs/tools": "^3.26.2", + "@cornerstonejs/core": "^3.27.0", + "@cornerstonejs/tools": "^3.27.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index d530755683..72b481ea0b 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.26.2", + "@cornerstonejs/core": "^3.27.0", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 1da2acf490..bfbe677c86 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.26.2", - "commit": "204921f9fa32d755dc3ffc0be86ef16e1c9f00b5" + "version": "3.27.0", + "commit": "10236320506221df903a2e0f6a90b9662cb3a0b5" } \ No newline at end of file diff --git a/version.txt b/version.txt index cc6b5127bc..d558367c43 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.26.2 \ No newline at end of file +3.27.0 \ No newline at end of file From 4fb98536f070e1358617f0295f02a5b24b1b2387 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 8 Jul 2025 14:08:58 +0000 Subject: [PATCH 003/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62ba0318eb..6818f9f138 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) + +### Features + +- add segmentLabel color ([#2169](https://github.com/cornerstonejs/cornerstone3D/issues/2169)) ([1023632](https://github.com/cornerstonejs/cornerstone3D/commit/10236320506221df903a2e0f6a90b9662cb3a0b5)) + ## [3.26.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.1...v3.26.2) (2025-07-07) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 251278046c..887622e089 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.26.2", + "version": "3.27.0", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index ea7d7dc4d1..4a403244ce 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.26.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.1...v3.26.2) (2025-07-07) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 5028ad59a7..2bc4528838 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.26.2", + "version": "3.27.0", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 916fb6c3cc..317e0325f9 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.26.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.1...v3.26.2) (2025-07-07) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index bea008d144..5f42728ef8 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.26.2", + "version": "3.27.0", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index afba663f24..a1a51e61ef 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.26.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.1...v3.26.2) (2025-07-07) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 76363ac356..6fa06d4572 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.26.2", + "version": "3.27.0", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 2f504fcb04..20156b0bff 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.26.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.1...v3.26.2) (2025-07-07) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 8748517660..9a30b95021 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.26.2", + "version": "3.27.0", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 7a587b6b25..7528a2bae3 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.26.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.1...v3.26.2) (2025-07-07) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 2b1b1847c2..25d44a9f56 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.26.2", + "version": "3.27.0", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 460ed9adb4..8e84cb30ca 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.26.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.1...v3.26.2) (2025-07-07) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index b3396b02d8..4e906604e7 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.26.2", + "version": "3.27.0", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index f1e2ca1a3c..b8ae52c334 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.26.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.1...v3.26.2) (2025-07-07) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 933a70318e..1fc8279294 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.26.2", + "version": "3.27.0", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 90b39bdc78..4619e344bd 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) + +### Features + +- add segmentLabel color ([#2169](https://github.com/cornerstonejs/cornerstone3D/issues/2169)) ([1023632](https://github.com/cornerstonejs/cornerstone3D/commit/10236320506221df903a2e0f6a90b9662cb3a0b5)) + ## [3.26.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.1...v3.26.2) (2025-07-07) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 72b481ea0b..79dcdd1a68 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.26.2", + "version": "3.27.0", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 877bed9dc602f121a7ec1da9941994d7d49da9ea Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 8 Jul 2025 14:09:09 +0000 Subject: [PATCH 004/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 39ee772ee6..6e6090974d 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.26.2"; +export const version = "3.27.0"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 95595d5981..9ba3d45a3d 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.26.2'; +export const version = '3.27.0'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 95595d5981..9ba3d45a3d 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.26.2'; +export const version = '3.27.0'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 95595d5981..9ba3d45a3d 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.26.2'; +export const version = '3.27.0'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 95595d5981..9ba3d45a3d 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.26.2'; +export const version = '3.27.0'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 95595d5981..9ba3d45a3d 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.26.2'; +export const version = '3.27.0'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 95595d5981..9ba3d45a3d 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.26.2'; +export const version = '3.27.0'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 95595d5981..9ba3d45a3d 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.26.2'; +export const version = '3.27.0'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 95595d5981..9ba3d45a3d 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.26.2'; +export const version = '3.27.0'; From 3dfa72e2c3ffa39ba51108479a21c756123ddb7d Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Tue, 8 Jul 2025 10:13:55 -0400 Subject: [PATCH 005/212] feat: Update stackPrefetch to use retrieveOptions from progressive options (#2163) * Make progressive retrieveOptions work for stackprefetch * Improve fallback * Update retrieve options for streaming image volume --- .../cache/classes/BaseStreamingImageVolume.ts | 14 +++++++++++++ .../stackPrefetch/stackContextPrefetch.ts | 20 +++++++++++++++---- .../utilities/stackPrefetch/stackPrefetch.ts | 19 +++++++++++++++--- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/packages/core/src/cache/classes/BaseStreamingImageVolume.ts b/packages/core/src/cache/classes/BaseStreamingImageVolume.ts index 6b49180033..7c5701a39f 100644 --- a/packages/core/src/cache/classes/BaseStreamingImageVolume.ts +++ b/packages/core/src/cache/classes/BaseStreamingImageVolume.ts @@ -405,6 +405,7 @@ export default class BaseStreamingImageVolume imageIdIndex, volumeId: this.volumeId, }, + retrieveOptions: undefined, }; } @@ -471,6 +472,19 @@ export default class BaseStreamingImageVolume const priority = priorityDefault; const options = this.getLoaderImageOptions(imageId); + const { retrieveOptions = {} } = + metaData.get( + imageRetrieveMetadataProvider.IMAGE_RETRIEVE_CONFIGURATION, + imageId, + 'volume' + ) || {}; + options.retrieveOptions = { + ...options.retrieveOptions, + ...(retrieveOptions?.default || + Object.values(retrieveOptions)?.[0] || + {}), + }; + return { callLoadImage: this.callLoadImage.bind(this), imageId, diff --git a/packages/tools/src/utilities/stackPrefetch/stackContextPrefetch.ts b/packages/tools/src/utilities/stackPrefetch/stackContextPrefetch.ts index 859dba9c01..2ece779333 100644 --- a/packages/tools/src/utilities/stackPrefetch/stackContextPrefetch.ts +++ b/packages/tools/src/utilities/stackPrefetch/stackContextPrefetch.ts @@ -4,6 +4,8 @@ import { eventTarget, imageLoadPoolManager, cache, + metaData, + utilities, } from '@cornerstonejs/core'; import { addToolState, getToolState, type StackPrefetchData } from './state'; import { @@ -14,6 +16,8 @@ import { getPromiseRemovedHandler, } from './stackPrefetchUtils'; +const { imageRetrieveMetadataProvider } = utilities; + let configuration = { maxImagesToPrefetch: Infinity, // Fetch up to 2 image before and after @@ -216,10 +220,18 @@ function prefetch(element) { } } - const requestFn = (imageId, options) => - imageLoader - .loadAndCacheImage(imageId, options) - .then(() => doneCallback(imageId)); + const requestFn = (imageId, options) => { + const { retrieveOptions = {} } = metaData.get( + imageRetrieveMetadataProvider.IMAGE_RETRIEVE_CONFIGURATION, + imageId, + 'stack' + ); + return imageLoader.loadAndCacheImage(imageId, { + ...options, + retrieveOptions: + retrieveOptions?.default || Object.values(retrieveOptions)?.[0] || {}, + }); + }; stackPrefetch.indicesToRequest.forEach((imageIdIndex) => { const imageId = stack.imageIds[imageIdIndex]; diff --git a/packages/tools/src/utilities/stackPrefetch/stackPrefetch.ts b/packages/tools/src/utilities/stackPrefetch/stackPrefetch.ts index 0dbeab6ffb..d62e88d4de 100644 --- a/packages/tools/src/utilities/stackPrefetch/stackPrefetch.ts +++ b/packages/tools/src/utilities/stackPrefetch/stackPrefetch.ts @@ -4,7 +4,8 @@ import { eventTarget, imageLoadPoolManager, cache, - getConfiguration as getCoreConfiguration, + metaData, + utilities, } from '@cornerstonejs/core'; import { addToolState, getToolState, type StackPrefetchData } from './state'; import { @@ -16,6 +17,8 @@ import { range, } from './stackPrefetchUtils'; +const { imageRetrieveMetadataProvider } = utilities; + let configuration = { maxImagesToPrefetch: Infinity, // Preserving the existing pool should be the default behaviour, as there might @@ -164,8 +167,18 @@ function prefetch(element) { } } - const requestFn = (imageId, options) => - imageLoader.loadAndCacheImage(imageId, options); + const requestFn = (imageId, options) => { + const { retrieveOptions = {} } = metaData.get( + imageRetrieveMetadataProvider.IMAGE_RETRIEVE_CONFIGURATION, + imageId, + 'stack' + ); + return imageLoader.loadAndCacheImage(imageId, { + ...options, + retrieveOptions: + retrieveOptions?.default || Object.values(retrieveOptions)?.[0] || {}, + }); + }; imageIdsToPrefetch.forEach((imageId) => { // IMPORTANT: Request type should be passed if not the 'interaction' From 631fbba694492442371fe31e5f4185718eb02241 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 8 Jul 2025 14:17:34 +0000 Subject: [PATCH 006/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 22735f76b9..93c322a486 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -10236320506221df903a2e0f6a90b9662cb3a0b5 \ No newline at end of file +3dfa72e2c3ffa39ba51108479a21c756123ddb7d \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 2bc4528838..63d5f39da6 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.27.0", - "@cornerstonejs/tools": "^3.27.0" + "@cornerstonejs/core": "^3.28.0", + "@cornerstonejs/tools": "^3.28.0" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 5f42728ef8..f693a54741 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.27.0", - "@cornerstonejs/tools": "^3.27.0" + "@cornerstonejs/core": "^3.28.0", + "@cornerstonejs/tools": "^3.28.0" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 9a30b95021..cf4b7ba687 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.27.0", + "@cornerstonejs/core": "^3.28.0", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index c5cf5a20f7..7a1168972c 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.27.0", - "@cornerstonejs/core": "^3.27.0", - "@cornerstonejs/dicom-image-loader": "^3.27.0", - "@cornerstonejs/nifti-volume-loader": "^3.27.0", - "@cornerstonejs/tools": "^3.27.0", + "@cornerstonejs/adapters": "^3.28.0", + "@cornerstonejs/core": "^3.28.0", + "@cornerstonejs/dicom-image-loader": "^3.28.0", + "@cornerstonejs/nifti-volume-loader": "^3.28.0", + "@cornerstonejs/tools": "^3.28.0", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 25d44a9f56..f5d80d0b26 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.27.0", - "@cornerstonejs/tools": "^3.27.0", + "@cornerstonejs/core": "^3.28.0", + "@cornerstonejs/tools": "^3.28.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 4e906604e7..3f82be361c 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.27.0" + "@cornerstonejs/core": "^3.28.0" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 1fc8279294..6ab940a853 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.27.0", - "@cornerstonejs/tools": "^3.27.0", + "@cornerstonejs/core": "^3.28.0", + "@cornerstonejs/tools": "^3.28.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 79dcdd1a68..f15f08cd10 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.27.0", + "@cornerstonejs/core": "^3.28.0", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index bfbe677c86..a84d09ebc8 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.27.0", - "commit": "10236320506221df903a2e0f6a90b9662cb3a0b5" + "version": "3.28.0", + "commit": "3dfa72e2c3ffa39ba51108479a21c756123ddb7d" } \ No newline at end of file diff --git a/version.txt b/version.txt index d558367c43..0f414fd3e1 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.27.0 \ No newline at end of file +3.28.0 \ No newline at end of file From 261eb1d12261ccd0ff6d652c070e1705fbd94daa Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 8 Jul 2025 14:17:51 +0000 Subject: [PATCH 007/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 51 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6818f9f138..d1ab4d038a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) + +### Features + +- Update stackPrefetch to use retrieveOptions from progressive options ([#2163](https://github.com/cornerstonejs/cornerstone3D/issues/2163)) ([3dfa72e](https://github.com/cornerstonejs/cornerstone3D/commit/3dfa72e2c3ffa39ba51108479a21c756123ddb7d)) + # [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) ### Features diff --git a/lerna.json b/lerna.json index 887622e089..5a7cb6353f 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.27.0", + "version": "3.28.0", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 4a403244ce..01f520f1e4 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/adapters + # [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 63d5f39da6..7a53786b32 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.27.0", + "version": "3.28.0", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 317e0325f9..44ae89d1bd 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/ai + # [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index f693a54741..8c57852430 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.27.0", + "version": "3.28.0", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index a1a51e61ef..eab7334a54 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) + +### Features + +- Update stackPrefetch to use retrieveOptions from progressive options ([#2163](https://github.com/cornerstonejs/cornerstone3D/issues/2163)) ([3dfa72e](https://github.com/cornerstonejs/cornerstone3D/commit/3dfa72e2c3ffa39ba51108479a21c756123ddb7d)) + # [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 6fa06d4572..98b0213817 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.27.0", + "version": "3.28.0", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 20156b0bff..113555b673 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + # [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index cf4b7ba687..bacfdc714f 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.27.0", + "version": "3.28.0", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 7528a2bae3..190a0c37e2 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + # [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index f5d80d0b26..f696640d3c 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.27.0", + "version": "3.28.0", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 8e84cb30ca..e5c548cdea 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + # [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 3f82be361c..bb9343e337 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.27.0", + "version": "3.28.0", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index b8ae52c334..2a4fcc8e5b 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + # [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 6ab940a853..a9cdef3da2 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.27.0", + "version": "3.28.0", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 4619e344bd..2d4d5f0346 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) + +### Features + +- Update stackPrefetch to use retrieveOptions from progressive options ([#2163](https://github.com/cornerstonejs/cornerstone3D/issues/2163)) ([3dfa72e](https://github.com/cornerstonejs/cornerstone3D/commit/3dfa72e2c3ffa39ba51108479a21c756123ddb7d)) + # [3.27.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.26.2...v3.27.0) (2025-07-08) ### Features diff --git a/packages/tools/package.json b/packages/tools/package.json index f15f08cd10..4c76a1d868 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.27.0", + "version": "3.28.0", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 5de47cea0535069b995801d4d88a53e355914152 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 8 Jul 2025 14:18:01 +0000 Subject: [PATCH 008/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 6e6090974d..812e754e71 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.27.0"; +export const version = "3.28.0"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 9ba3d45a3d..ce5d252d51 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.27.0'; +export const version = '3.28.0'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 9ba3d45a3d..ce5d252d51 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.27.0'; +export const version = '3.28.0'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 9ba3d45a3d..ce5d252d51 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.27.0'; +export const version = '3.28.0'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 9ba3d45a3d..ce5d252d51 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.27.0'; +export const version = '3.28.0'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 9ba3d45a3d..ce5d252d51 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.27.0'; +export const version = '3.28.0'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 9ba3d45a3d..ce5d252d51 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.27.0'; +export const version = '3.28.0'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 9ba3d45a3d..ce5d252d51 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.27.0'; +export const version = '3.28.0'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 9ba3d45a3d..ce5d252d51 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.27.0'; +export const version = '3.28.0'; From 94fefd34b9f359fd7eeaf246f163a1d765a1d4b6 Mon Sep 17 00:00:00 2001 From: Patrick Wespi Date: Wed, 9 Jul 2025 16:07:37 +0200 Subject: [PATCH 009/212] fix(WindowLevelTool): fix calculation of image dynamic range (#2147) --- packages/tools/src/tools/WindowLevelTool.ts | 15 ++++++++------- .../test/groundTruth/windowLevel_canvas2.png | Bin 5445 -> 6351 bytes 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/tools/src/tools/WindowLevelTool.ts b/packages/tools/src/tools/WindowLevelTool.ts index 664919f120..093e09fd60 100644 --- a/packages/tools/src/tools/WindowLevelTool.ts +++ b/packages/tools/src/tools/WindowLevelTool.ts @@ -180,12 +180,13 @@ class WindowLevelTool extends BaseTool { const { voxelManager } = viewport.getImageData(); const middleSlicePixelData = voxelManager.getMiddleSliceData(); - const calculatedDynamicRange = middleSlicePixelData.reduce( - (acc, pixel) => { - return [Math.min(acc[0], pixel), Math.max(acc[1], pixel)]; - }, - [Infinity, -Infinity] - ); + const calculatedDynamicRange: [number, number] = + middleSlicePixelData.reduce( + (acc, pixel) => { + return [Math.min(acc[0], pixel), Math.max(acc[1], pixel)]; + }, + [Infinity, -Infinity] + ); const BitsStored = imageVolume?.metadata?.BitsStored; const metadataDynamicRange = BitsStored ? 2 ** BitsStored : Infinity; @@ -194,7 +195,7 @@ class WindowLevelTool extends BaseTool { // want in practice. Thus we take the min between the metadata dynamic // range and actual middle slice dynamic range. imageDynamicRange = Math.min( - calculatedDynamicRange, + calculatedDynamicRange[1] - calculatedDynamicRange[0], metadataDynamicRange ); } else { diff --git a/packages/tools/test/groundTruth/windowLevel_canvas2.png b/packages/tools/test/groundTruth/windowLevel_canvas2.png index 6e2502f9da168d2fce614b236b605235740b655d..56ef0ebf51ff7f39e646e0592fd0215b069491b8 100644 GIT binary patch literal 6351 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prw85krwJzX3_ zD&pQ=bzHTiRkHQrrfQ`fjO}`k<_fzu^pu1j^b~ubG{;ipjE0JAj)z<0_a{LY=3gm( zc&WT#)vkZfwJYp@fB5m?;lp+YMkW@HKl7R9bDsFGnda93N!(LWP{>dE ztOQgdARurbq*S0{azn$O&a>Sd0tyZe4mIo``hhPK(>GPJKnAfKDF>NMih=ojC-~pjSN!?$@3{Hj<#8?#?3v!*+grV-{{O$n@8#?3U(MIw z_v6vWyXE(7_x=C(yZ?XP*Q??4e<|D6{d_w8xWE11FZb`?ulxOWa=n`TgY()S-nQq< z*Z(~pKmQX0(>PY z=m6U2z~S&1Fn!?S@bBBZ{C@d+|2NcUc{BZYesDMay5X zuh;LdtNDD^T>k&xPp9?mzq(ib`Sp5zKS*x>{{8>|e)s=3v!=m*{ekWOe|`Hnz5d@* zP5uuz+mE;N`&X*xJAuZ+^;H!V^h@*jy@5mJ&w)ebpLO;M14qc?yc`_jUfq$K22^rh zSYX2Q$SQT!14H?=ifGfl+0^rusMIpS`au)zm$dL$H$@_;>TV;SV6bzoO KelF{r5}E*9m%F3@ literal 5445 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prw85l(Vd%8G= zRK&f#d2sEVP$AX_>~WDrG7}hmA+m*sc+rC_51eJ{`~Yzo{@=#L*U0`rg+W?_L|T33oAG@9FS*XI-(>1VmUK0 zJyA5XS8`}zU}Q{U=Ku;mP-JBMBrscE5Gdcku#p+4UE#xo28POxv;81>hlU$qGb=nC z8f=a{a|g*QIJ{v13EHSAILIY^RtDKApil-hl!--7NI-#q<4-}5Jcoca$R;L!&Ob{T zetw*9Zx?c@8jv-bb_bo%yk|M~ao{{Q{HqI&0<``!<3 z-``jJ`(?bn?bAz4Pc(b@G6e+`bSGaq{$ChqQ}Y3!3niOMb9x#WIwf1Xw{UVy*w*># zc|9vj$6N&iptIT%WTllA9Fp7~D&;aUEy-Q<>mw7;bJJK@P6%x=N@t2wNdLmMottCA zH_q4oATI)gCWYhLMnfhhl{68(OKJ)Zx71e2-v|1%QI(N#6U*8&GaJNDNbWuK7HC}U zp`jzUBJ;^?Py0GGBPsSU!re+N&TDj ziSz$|+$`Y;;oMXI|KHo)@Ap;z{`dR+{eAy_yIx3?(qF0oRqUAp)VQ)Rdm3ulY?)>HwA)tyl zFNcObS9X|s10D4oX#4X>t4^Q_eN_dAxU4&~RDq8A47B~T&RiD^Xa8s1%^hgfTQX-8 Qa9otZ)78&qol`;+0H5yw>;M1& From dc191a7d27bfebc4a6d7ad3c4c31d0b15142a6ce Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 9 Jul 2025 14:11:29 +0000 Subject: [PATCH 010/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 93c322a486..769c4e040b 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -3dfa72e2c3ffa39ba51108479a21c756123ddb7d \ No newline at end of file +94fefd34b9f359fd7eeaf246f163a1d765a1d4b6 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 7a53786b32..19f25af571 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.0", - "@cornerstonejs/tools": "^3.28.0" + "@cornerstonejs/core": "^3.28.1", + "@cornerstonejs/tools": "^3.28.1" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 8c57852430..2d48a5eca2 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.0", - "@cornerstonejs/tools": "^3.28.0" + "@cornerstonejs/core": "^3.28.1", + "@cornerstonejs/tools": "^3.28.1" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index bacfdc714f..6ab2f18665 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.0", + "@cornerstonejs/core": "^3.28.1", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 7a1168972c..08b9e67d89 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.28.0", - "@cornerstonejs/core": "^3.28.0", - "@cornerstonejs/dicom-image-loader": "^3.28.0", - "@cornerstonejs/nifti-volume-loader": "^3.28.0", - "@cornerstonejs/tools": "^3.28.0", + "@cornerstonejs/adapters": "^3.28.1", + "@cornerstonejs/core": "^3.28.1", + "@cornerstonejs/dicom-image-loader": "^3.28.1", + "@cornerstonejs/nifti-volume-loader": "^3.28.1", + "@cornerstonejs/tools": "^3.28.1", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index f696640d3c..a574bffd5a 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.0", - "@cornerstonejs/tools": "^3.28.0", + "@cornerstonejs/core": "^3.28.1", + "@cornerstonejs/tools": "^3.28.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index bb9343e337..a2137038a4 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.0" + "@cornerstonejs/core": "^3.28.1" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index a9cdef3da2..92c81a98b7 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.0", - "@cornerstonejs/tools": "^3.28.0", + "@cornerstonejs/core": "^3.28.1", + "@cornerstonejs/tools": "^3.28.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 4c76a1d868..6e7ea5bec7 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.0", + "@cornerstonejs/core": "^3.28.1", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index a84d09ebc8..5691b2438e 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.28.0", - "commit": "3dfa72e2c3ffa39ba51108479a21c756123ddb7d" + "version": "3.28.1", + "commit": "94fefd34b9f359fd7eeaf246f163a1d765a1d4b6" } \ No newline at end of file diff --git a/version.txt b/version.txt index 0f414fd3e1..2a387102c5 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.28.0 \ No newline at end of file +3.28.1 \ No newline at end of file From 22424d3f37690e6dee559bca032673b4595f8786 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 9 Jul 2025 14:11:47 +0000 Subject: [PATCH 011/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1ab4d038a..d799a93535 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) + +### Bug Fixes + +- **WindowLevelTool:** fix calculation of image dynamic range ([#2147](https://github.com/cornerstonejs/cornerstone3D/issues/2147)) ([94fefd3](https://github.com/cornerstonejs/cornerstone3D/commit/94fefd34b9f359fd7eeaf246f163a1d765a1d4b6)) + # [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) ### Features diff --git a/lerna.json b/lerna.json index 5a7cb6353f..02f6f15803 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.28.0", + "version": "3.28.1", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 01f520f1e4..a7bcba90a3 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/adapters + # [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 19f25af571..db8251483d 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.28.0", + "version": "3.28.1", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 44ae89d1bd..583c33dd10 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/ai + # [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 2d48a5eca2..c42fc5d231 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.28.0", + "version": "3.28.1", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index eab7334a54..a82e1932f8 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/core + # [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) ### Features diff --git a/packages/core/package.json b/packages/core/package.json index 98b0213817..2630d16a75 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.28.0", + "version": "3.28.1", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 113555b673..1b0cce043b 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + # [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 6ab2f18665..e33e43b8df 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.28.0", + "version": "3.28.1", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 190a0c37e2..8731915afb 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + # [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index a574bffd5a..cfe33f2ccf 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.28.0", + "version": "3.28.1", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index e5c548cdea..0a655a4e1d 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + # [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index a2137038a4..f4e77a0122 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.28.0", + "version": "3.28.1", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 2a4fcc8e5b..0bbca0acb6 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + # [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 92c81a98b7..54f42cb8c0 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.28.0", + "version": "3.28.1", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 2d4d5f0346..7add20c3fc 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) + +### Bug Fixes + +- **WindowLevelTool:** fix calculation of image dynamic range ([#2147](https://github.com/cornerstonejs/cornerstone3D/issues/2147)) ([94fefd3](https://github.com/cornerstonejs/cornerstone3D/commit/94fefd34b9f359fd7eeaf246f163a1d765a1d4b6)) + # [3.28.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.27.0...v3.28.0) (2025-07-08) ### Features diff --git a/packages/tools/package.json b/packages/tools/package.json index 6e7ea5bec7..fa03e6444f 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.28.0", + "version": "3.28.1", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From b17eba02d079a31ed370cdf975a0fedcdf6b081d Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 9 Jul 2025 14:11:58 +0000 Subject: [PATCH 012/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 812e754e71..a2ad7f964d 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.28.0"; +export const version = "3.28.1"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index ce5d252d51..4cfc5bdbba 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.0'; +export const version = '3.28.1'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index ce5d252d51..4cfc5bdbba 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.0'; +export const version = '3.28.1'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index ce5d252d51..4cfc5bdbba 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.0'; +export const version = '3.28.1'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index ce5d252d51..4cfc5bdbba 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.0'; +export const version = '3.28.1'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index ce5d252d51..4cfc5bdbba 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.0'; +export const version = '3.28.1'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index ce5d252d51..4cfc5bdbba 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.0'; +export const version = '3.28.1'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index ce5d252d51..4cfc5bdbba 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.0'; +export const version = '3.28.1'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index ce5d252d51..4cfc5bdbba 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.0'; +export const version = '3.28.1'; From 23db01c5f548509e32ce6811eacd33c49ef807c1 Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Wed, 9 Jul 2025 13:28:21 -0400 Subject: [PATCH 013/212] fix: prefetch issues with retrieve options (#2186) --- .../cache/classes/BaseStreamingImageVolume.ts | 2 +- .../stackPrefetch/stackContextPrefetch.ts | 23 +++++++++++-------- .../utilities/stackPrefetch/stackPrefetch.ts | 23 +++++++++++-------- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/packages/core/src/cache/classes/BaseStreamingImageVolume.ts b/packages/core/src/cache/classes/BaseStreamingImageVolume.ts index 7c5701a39f..a9e66aa337 100644 --- a/packages/core/src/cache/classes/BaseStreamingImageVolume.ts +++ b/packages/core/src/cache/classes/BaseStreamingImageVolume.ts @@ -480,7 +480,7 @@ export default class BaseStreamingImageVolume ) || {}; options.retrieveOptions = { ...options.retrieveOptions, - ...(retrieveOptions?.default || + ...(retrieveOptions.default || Object.values(retrieveOptions)?.[0] || {}), }; diff --git a/packages/tools/src/utilities/stackPrefetch/stackContextPrefetch.ts b/packages/tools/src/utilities/stackPrefetch/stackContextPrefetch.ts index 2ece779333..a9a57dba8c 100644 --- a/packages/tools/src/utilities/stackPrefetch/stackContextPrefetch.ts +++ b/packages/tools/src/utilities/stackPrefetch/stackContextPrefetch.ts @@ -221,16 +221,19 @@ function prefetch(element) { } const requestFn = (imageId, options) => { - const { retrieveOptions = {} } = metaData.get( - imageRetrieveMetadataProvider.IMAGE_RETRIEVE_CONFIGURATION, - imageId, - 'stack' - ); - return imageLoader.loadAndCacheImage(imageId, { - ...options, - retrieveOptions: - retrieveOptions?.default || Object.values(retrieveOptions)?.[0] || {}, - }); + const { retrieveOptions = {} } = + metaData.get( + imageRetrieveMetadataProvider.IMAGE_RETRIEVE_CONFIGURATION, + imageId, + 'stack' + ) || {}; + options.retrieveOptions = { + ...options.retrieveOptions, + ...(retrieveOptions.default || Object.values(retrieveOptions)?.[0] || {}), + }; + return imageLoader + .loadAndCacheImage(imageId, options) + .then(() => doneCallback(imageId)); }; stackPrefetch.indicesToRequest.forEach((imageIdIndex) => { diff --git a/packages/tools/src/utilities/stackPrefetch/stackPrefetch.ts b/packages/tools/src/utilities/stackPrefetch/stackPrefetch.ts index d62e88d4de..4aecca1ce2 100644 --- a/packages/tools/src/utilities/stackPrefetch/stackPrefetch.ts +++ b/packages/tools/src/utilities/stackPrefetch/stackPrefetch.ts @@ -168,16 +168,19 @@ function prefetch(element) { } const requestFn = (imageId, options) => { - const { retrieveOptions = {} } = metaData.get( - imageRetrieveMetadataProvider.IMAGE_RETRIEVE_CONFIGURATION, - imageId, - 'stack' - ); - return imageLoader.loadAndCacheImage(imageId, { - ...options, - retrieveOptions: - retrieveOptions?.default || Object.values(retrieveOptions)?.[0] || {}, - }); + const { retrieveOptions = {} } = + metaData.get( + imageRetrieveMetadataProvider.IMAGE_RETRIEVE_CONFIGURATION, + imageId, + 'stack' + ) || {}; + options.retrieveOptions = { + ...options.retrieveOptions, + ...(retrieveOptions.default || Object.values(retrieveOptions)?.[0] || {}), + }; + return imageLoader + .loadAndCacheImage(imageId, options) + .then(() => doneCallback(imageId)); }; imageIdsToPrefetch.forEach((imageId) => { From 479414ef29fad52b2db59d86e08d81a1a42c5e79 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 9 Jul 2025 17:31:50 +0000 Subject: [PATCH 014/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 769c4e040b..28c44ec963 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -94fefd34b9f359fd7eeaf246f163a1d765a1d4b6 \ No newline at end of file +23db01c5f548509e32ce6811eacd33c49ef807c1 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index db8251483d..888255491b 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.1", - "@cornerstonejs/tools": "^3.28.1" + "@cornerstonejs/core": "^3.28.2", + "@cornerstonejs/tools": "^3.28.2" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index c42fc5d231..0c675a963b 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.1", - "@cornerstonejs/tools": "^3.28.1" + "@cornerstonejs/core": "^3.28.2", + "@cornerstonejs/tools": "^3.28.2" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index e33e43b8df..d678c1cd7b 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.1", + "@cornerstonejs/core": "^3.28.2", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 08b9e67d89..ce9d77c3b6 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.28.1", - "@cornerstonejs/core": "^3.28.1", - "@cornerstonejs/dicom-image-loader": "^3.28.1", - "@cornerstonejs/nifti-volume-loader": "^3.28.1", - "@cornerstonejs/tools": "^3.28.1", + "@cornerstonejs/adapters": "^3.28.2", + "@cornerstonejs/core": "^3.28.2", + "@cornerstonejs/dicom-image-loader": "^3.28.2", + "@cornerstonejs/nifti-volume-loader": "^3.28.2", + "@cornerstonejs/tools": "^3.28.2", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index cfe33f2ccf..3ed9b1cf54 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.1", - "@cornerstonejs/tools": "^3.28.1", + "@cornerstonejs/core": "^3.28.2", + "@cornerstonejs/tools": "^3.28.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index f4e77a0122..1a79931b87 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.1" + "@cornerstonejs/core": "^3.28.2" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 54f42cb8c0..6da03b107d 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.1", - "@cornerstonejs/tools": "^3.28.1", + "@cornerstonejs/core": "^3.28.2", + "@cornerstonejs/tools": "^3.28.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index fa03e6444f..0386cf08ca 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.1", + "@cornerstonejs/core": "^3.28.2", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 5691b2438e..e8467d7bb4 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.28.1", - "commit": "94fefd34b9f359fd7eeaf246f163a1d765a1d4b6" + "version": "3.28.2", + "commit": "23db01c5f548509e32ce6811eacd33c49ef807c1" } \ No newline at end of file diff --git a/version.txt b/version.txt index 2a387102c5..6d99b7aae6 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.28.1 \ No newline at end of file +3.28.2 \ No newline at end of file From 689e0626cd469205039b4e4ede84110a82ce403f Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 9 Jul 2025 17:32:06 +0000 Subject: [PATCH 015/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 51 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d799a93535..1ffd1f696f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) + +### Bug Fixes + +- prefetch issues with retrieve options ([#2186](https://github.com/cornerstonejs/cornerstone3D/issues/2186)) ([23db01c](https://github.com/cornerstonejs/cornerstone3D/commit/23db01c5f548509e32ce6811eacd33c49ef807c1)) + ## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 02f6f15803..dd0586ce4e 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.28.1", + "version": "3.28.2", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index a7bcba90a3..8017b1b4f8 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 888255491b..6bc06b808d 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.28.1", + "version": "3.28.2", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 583c33dd10..80659e474f 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 0c675a963b..f381d4b38e 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.28.1", + "version": "3.28.2", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index a82e1932f8..0441017de0 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) + +### Bug Fixes + +- prefetch issues with retrieve options ([#2186](https://github.com/cornerstonejs/cornerstone3D/issues/2186)) ([23db01c](https://github.com/cornerstonejs/cornerstone3D/commit/23db01c5f548509e32ce6811eacd33c49ef807c1)) + ## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 2630d16a75..716df63bb5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.28.1", + "version": "3.28.2", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 1b0cce043b..a859642d57 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index d678c1cd7b..caa3462085 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.28.1", + "version": "3.28.2", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 8731915afb..a04a1a3e15 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 3ed9b1cf54..a3c35a824d 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.28.1", + "version": "3.28.2", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 0a655a4e1d..c6bc6f1d84 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 1a79931b87..9098b404ed 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.28.1", + "version": "3.28.2", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 0bbca0acb6..3e16dcbf7d 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 6da03b107d..0f680f31a4 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.28.1", + "version": "3.28.2", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 7add20c3fc..100e7ee25d 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) + +### Bug Fixes + +- prefetch issues with retrieve options ([#2186](https://github.com/cornerstonejs/cornerstone3D/issues/2186)) ([23db01c](https://github.com/cornerstonejs/cornerstone3D/commit/23db01c5f548509e32ce6811eacd33c49ef807c1)) + ## [3.28.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.0...v3.28.1) (2025-07-09) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 0386cf08ca..10ec2656e2 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.28.1", + "version": "3.28.2", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From b05a132464096ce9a401e93dc582b711578d6c8a Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 9 Jul 2025 17:32:17 +0000 Subject: [PATCH 016/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index a2ad7f964d..df55fcf45d 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.28.1"; +export const version = "3.28.2"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 4cfc5bdbba..8f09aa5a60 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.1'; +export const version = '3.28.2'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 4cfc5bdbba..8f09aa5a60 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.1'; +export const version = '3.28.2'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 4cfc5bdbba..8f09aa5a60 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.1'; +export const version = '3.28.2'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 4cfc5bdbba..8f09aa5a60 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.1'; +export const version = '3.28.2'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 4cfc5bdbba..8f09aa5a60 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.1'; +export const version = '3.28.2'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 4cfc5bdbba..8f09aa5a60 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.1'; +export const version = '3.28.2'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 4cfc5bdbba..8f09aa5a60 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.1'; +export const version = '3.28.2'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 4cfc5bdbba..8f09aa5a60 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.1'; +export const version = '3.28.2'; From b1a7a92dc23661c1bf55fff17f3a857615e4fc75 Mon Sep 17 00:00:00 2001 From: rodrigobasilio2022 <114958722+rodrigobasilio2022@users.noreply.github.com> Date: Wed, 9 Jul 2025 14:54:14 -0300 Subject: [PATCH 017/212] fix: broken segmentation visibility api (#2188) --- .../contourRenderingConfiguration/index.ts | 14 +++++++++----- .../livewireContourSegmentation/index.ts | 18 ++++++++++++------ .../index.ts | 12 ++++++++---- .../splineContourSegmentationTools/index.ts | 6 ++++-- .../index.ts | 6 ++++-- .../examples/videoContourSegmentation/index.ts | 5 ++++- .../config/segmentationVisibility.ts | 4 ++++ 7 files changed, 45 insertions(+), 20 deletions(-) diff --git a/packages/tools/examples/contourRenderingConfiguration/index.ts b/packages/tools/examples/contourRenderingConfiguration/index.ts index 1d57704fe3..54d1d8539b 100644 --- a/packages/tools/examples/contourRenderingConfiguration/index.ts +++ b/packages/tools/examples/contourRenderingConfiguration/index.ts @@ -31,7 +31,7 @@ const { TrackballRotateTool, } = cornerstoneTools; const { MouseBindings } = csToolsEnums; -const { ViewportType, GeometryType } = Enums; +const { ViewportType } = Enums; // Define a unique id for the volume const volumeName = 'CT_VOLUME_ID'; // Id of the volume less loader prefix @@ -89,8 +89,10 @@ addToggleButtonToToolbar({ const segmentIndex = 1; segmentation.config.visibility.setSegmentIndexVisibility( viewportId, - segmentationId, - csToolsEnums.SegmentationRepresentations.Contour, + { + segmentationId, + type: csToolsEnums.SegmentationRepresentations.Contour, + }, segmentIndex, !toggle ); @@ -103,8 +105,10 @@ addToggleButtonToToolbar({ const segmentIndex = 2; segmentation.config.visibility.setSegmentIndexVisibility( viewportId, - segmentationId, - csToolsEnums.SegmentationRepresentations.Contour, + { + segmentationId, + type: csToolsEnums.SegmentationRepresentations.Contour, + }, segmentIndex, !toggle ); diff --git a/packages/tools/examples/livewireContourSegmentation/index.ts b/packages/tools/examples/livewireContourSegmentation/index.ts index e114fe3484..1c70765efb 100644 --- a/packages/tools/examples/livewireContourSegmentation/index.ts +++ b/packages/tools/examples/livewireContourSegmentation/index.ts @@ -155,22 +155,28 @@ addButtonToToolbar({ segmentation.config.visibility.setSegmentIndexVisibility( viewportIds[0], - segmentationId, - csToolsEnums.SegmentationRepresentations.Contour, + { + segmentationId, + type: csToolsEnums.SegmentationRepresentations.Contour, + }, activeSegmentIndex, visible ); segmentation.config.visibility.setSegmentIndexVisibility( viewportIds[1], - segmentationId, - csToolsEnums.SegmentationRepresentations.Contour, + { + segmentationId, + type: csToolsEnums.SegmentationRepresentations.Contour, + }, activeSegmentIndex, visible ); segmentation.config.visibility.setSegmentIndexVisibility( viewportIds[2], - segmentationId, - csToolsEnums.SegmentationRepresentations.Contour, + { + segmentationId, + type: csToolsEnums.SegmentationRepresentations.Contour, + }, activeSegmentIndex, visible ); diff --git a/packages/tools/examples/planarFreehandContourSegmentationTool/index.ts b/packages/tools/examples/planarFreehandContourSegmentationTool/index.ts index d83def9d65..0e64121d1e 100644 --- a/packages/tools/examples/planarFreehandContourSegmentationTool/index.ts +++ b/packages/tools/examples/planarFreehandContourSegmentationTool/index.ts @@ -213,15 +213,19 @@ addButtonToToolbar({ segmentation.config.visibility.setSegmentIndexVisibility( viewportIds[0], - segmentationId, - csToolsEnums.SegmentationRepresentations.Contour, + { + segmentationId, + type: csToolsEnums.SegmentationRepresentations.Contour, + }, activeSegmentIndex, visible ); segmentation.config.visibility.setSegmentIndexVisibility( viewportIds[1], - segmentationId, - csToolsEnums.SegmentationRepresentations.Contour, + { + segmentationId, + type: csToolsEnums.SegmentationRepresentations.Contour, + }, activeSegmentIndex, visible ); diff --git a/packages/tools/examples/splineContourSegmentationTools/index.ts b/packages/tools/examples/splineContourSegmentationTools/index.ts index ad42252228..8cd4bfd1d4 100644 --- a/packages/tools/examples/splineContourSegmentationTools/index.ts +++ b/packages/tools/examples/splineContourSegmentationTools/index.ts @@ -182,8 +182,10 @@ addButtonToToolbar({ segmentation.config.visibility.setSegmentIndexVisibility( viewportId, - segmentationId, - csToolsEnums.SegmentationRepresentations.Contour, + { + segmentationId, + type: csToolsEnums.SegmentationRepresentations.Contour, + }, activeSegmentIndex, visible ); diff --git a/packages/tools/examples/splineContourSegmentationToolsAdvanced/index.ts b/packages/tools/examples/splineContourSegmentationToolsAdvanced/index.ts index 6a7e19b390..f323fc795e 100644 --- a/packages/tools/examples/splineContourSegmentationToolsAdvanced/index.ts +++ b/packages/tools/examples/splineContourSegmentationToolsAdvanced/index.ts @@ -320,8 +320,10 @@ addButtonToToolbar({ viewportIds.forEach((viewportId) => { segmentation.config.visibility.setSegmentIndexVisibility( viewportId, - activeSegmentationId, - csToolsEnums.SegmentationRepresentations.Contour, + { + segmentationId: activeSegmentationId, + type: csToolsEnums.SegmentationRepresentations.Contour, + }, activeSegmentIndex, visible ); diff --git a/packages/tools/examples/videoContourSegmentation/index.ts b/packages/tools/examples/videoContourSegmentation/index.ts index 95d89eac79..51a0908927 100644 --- a/packages/tools/examples/videoContourSegmentation/index.ts +++ b/packages/tools/examples/videoContourSegmentation/index.ts @@ -193,7 +193,10 @@ addButtonToToolbar({ segmentation.config.visibility.setSegmentIndexVisibility( viewportId, - segmentationRepresentationUID, + { + segmentationId, + type: csToolsEnums.SegmentationRepresentations.Contour, + }, activeSegmentIndex, visible ); diff --git a/packages/tools/src/stateManagement/segmentation/config/segmentationVisibility.ts b/packages/tools/src/stateManagement/segmentation/config/segmentationVisibility.ts index ab88afb9a3..a7839ea0cf 100644 --- a/packages/tools/src/stateManagement/segmentation/config/segmentationVisibility.ts +++ b/packages/tools/src/stateManagement/segmentation/config/segmentationVisibility.ts @@ -97,6 +97,10 @@ function setSegmentIndexVisibility( } representations.forEach((representation) => { + // If the representation does not have segments, we cannot set visibility + if (!representation.segments || !representation.segments[segmentIndex]) { + return; + } representation.segments[segmentIndex].visible = visibility; }); From 4ac997ba02a2190f274e746c4a102a68d6292992 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 9 Jul 2025 17:58:00 +0000 Subject: [PATCH 018/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 28c44ec963..94a06e1c44 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -23db01c5f548509e32ce6811eacd33c49ef807c1 \ No newline at end of file +b1a7a92dc23661c1bf55fff17f3a857615e4fc75 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 6bc06b808d..da8b798704 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.2", - "@cornerstonejs/tools": "^3.28.2" + "@cornerstonejs/core": "^3.28.3", + "@cornerstonejs/tools": "^3.28.3" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index f381d4b38e..93b8c11725 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.2", - "@cornerstonejs/tools": "^3.28.2" + "@cornerstonejs/core": "^3.28.3", + "@cornerstonejs/tools": "^3.28.3" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index caa3462085..42a96f240c 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.2", + "@cornerstonejs/core": "^3.28.3", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index ce9d77c3b6..dba89f678f 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.28.2", - "@cornerstonejs/core": "^3.28.2", - "@cornerstonejs/dicom-image-loader": "^3.28.2", - "@cornerstonejs/nifti-volume-loader": "^3.28.2", - "@cornerstonejs/tools": "^3.28.2", + "@cornerstonejs/adapters": "^3.28.3", + "@cornerstonejs/core": "^3.28.3", + "@cornerstonejs/dicom-image-loader": "^3.28.3", + "@cornerstonejs/nifti-volume-loader": "^3.28.3", + "@cornerstonejs/tools": "^3.28.3", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index a3c35a824d..daa02b9a5c 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.2", - "@cornerstonejs/tools": "^3.28.2", + "@cornerstonejs/core": "^3.28.3", + "@cornerstonejs/tools": "^3.28.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 9098b404ed..37e818d990 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.2" + "@cornerstonejs/core": "^3.28.3" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 0f680f31a4..095ec6f36d 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.2", - "@cornerstonejs/tools": "^3.28.2", + "@cornerstonejs/core": "^3.28.3", + "@cornerstonejs/tools": "^3.28.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 10ec2656e2..15c9eb89eb 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.2", + "@cornerstonejs/core": "^3.28.3", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index e8467d7bb4..e2ab803321 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.28.2", - "commit": "23db01c5f548509e32ce6811eacd33c49ef807c1" + "version": "3.28.3", + "commit": "b1a7a92dc23661c1bf55fff17f3a857615e4fc75" } \ No newline at end of file diff --git a/version.txt b/version.txt index 6d99b7aae6..ff54b8a8d7 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.28.2 \ No newline at end of file +3.28.3 \ No newline at end of file From d27871c2c6ba622d498f81bbfd803a920016d6b7 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 9 Jul 2025 17:58:18 +0000 Subject: [PATCH 019/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ffd1f696f..c08833ed1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) + +### Bug Fixes + +- broken segmentation visibility api ([#2188](https://github.com/cornerstonejs/cornerstone3D/issues/2188)) ([b1a7a92](https://github.com/cornerstonejs/cornerstone3D/commit/b1a7a92dc23661c1bf55fff17f3a857615e4fc75)) + ## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) ### Bug Fixes diff --git a/lerna.json b/lerna.json index dd0586ce4e..2886ed6bf3 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.28.2", + "version": "3.28.3", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 8017b1b4f8..02e466a1a8 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index da8b798704..4f0c6acd8d 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.28.2", + "version": "3.28.3", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 80659e474f..0b2354833f 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 93b8c11725..f5b6a372ed 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.28.2", + "version": "3.28.3", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 0441017de0..638e5d4349 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 716df63bb5..23788058c5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.28.2", + "version": "3.28.3", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index a859642d57..f2d7a45de5 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 42a96f240c..3e6b3f1975 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.28.2", + "version": "3.28.3", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index a04a1a3e15..577b946793 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index daa02b9a5c..633f2b1ad7 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.28.2", + "version": "3.28.3", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index c6bc6f1d84..970375e629 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 37e818d990..880ef2cb03 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.28.2", + "version": "3.28.3", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 3e16dcbf7d..5b49c351cf 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 095ec6f36d..2880b22887 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.28.2", + "version": "3.28.3", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 100e7ee25d..fdba5bfade 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) + +### Bug Fixes + +- broken segmentation visibility api ([#2188](https://github.com/cornerstonejs/cornerstone3D/issues/2188)) ([b1a7a92](https://github.com/cornerstonejs/cornerstone3D/commit/b1a7a92dc23661c1bf55fff17f3a857615e4fc75)) + ## [3.28.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.1...v3.28.2) (2025-07-09) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 15c9eb89eb..473dd04d98 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.28.2", + "version": "3.28.3", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 06f1b0e842571749290d9409ebe41b99315b1ec5 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 9 Jul 2025 17:58:29 +0000 Subject: [PATCH 020/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index df55fcf45d..1710c95553 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.28.2"; +export const version = "3.28.3"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 8f09aa5a60..c03a0aef86 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.2'; +export const version = '3.28.3'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 8f09aa5a60..c03a0aef86 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.2'; +export const version = '3.28.3'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 8f09aa5a60..c03a0aef86 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.2'; +export const version = '3.28.3'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 8f09aa5a60..c03a0aef86 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.2'; +export const version = '3.28.3'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 8f09aa5a60..c03a0aef86 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.2'; +export const version = '3.28.3'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 8f09aa5a60..c03a0aef86 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.2'; +export const version = '3.28.3'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 8f09aa5a60..c03a0aef86 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.2'; +export const version = '3.28.3'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 8f09aa5a60..c03a0aef86 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.2'; +export const version = '3.28.3'; From 963a35f7e95577a87473fb0e972491f2c0175c30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20K=C3=B6hler?= Date: Wed, 9 Jul 2025 21:14:25 -0300 Subject: [PATCH 021/212] feat: enable historyMemo action grouping (#2160) * feat: enable historyMemo action grouping * feat: add tool history grouping example * feat: add asArray function * fix: preview bug * chore: add jsdocs to asArray --- packages/core/src/utilities/asArray.ts | 12 + .../core/src/utilities/historyMemo/index.ts | 120 +++++-- packages/core/src/utilities/index.ts | 2 + .../examples/toolHistoryGrouping/index.ts | 324 ++++++++++++++++++ packages/tools/src/tools/base/BaseTool.ts | 10 + utils/ExampleRunner/example-info.json | 4 + 6 files changed, 441 insertions(+), 31 deletions(-) create mode 100644 packages/core/src/utilities/asArray.ts create mode 100644 packages/tools/examples/toolHistoryGrouping/index.ts diff --git a/packages/core/src/utilities/asArray.ts b/packages/core/src/utilities/asArray.ts new file mode 100644 index 0000000000..dac8f6df76 --- /dev/null +++ b/packages/core/src/utilities/asArray.ts @@ -0,0 +1,12 @@ +/** + * Returns an array with the item if it is a object/primitive, otherwise, if it is an array, returns the array itself. + * + * @param item array or single object/primitive + * @returns an array with the object/primitive as the single element or the original array + */ +export function asArray(item: T | T[]): T[] { + if (Array.isArray(item)) { + return item; + } + return [item]; +} diff --git a/packages/core/src/utilities/historyMemo/index.ts b/packages/core/src/utilities/historyMemo/index.ts index 3a2af0daf0..0343760317 100644 --- a/packages/core/src/utilities/historyMemo/index.ts +++ b/packages/core/src/utilities/historyMemo/index.ts @@ -1,4 +1,5 @@ import eventTarget from '../../eventTarget'; +import { asArray } from '../asArray'; // Define Events from tools package // Note: We can't directly import from tools package due to circular dependency @@ -58,7 +59,8 @@ export class HistoryMemo { private position = -1; private redoAvailable = 0; private undoAvailable = 0; - private ring = new Array(); + private ring = new Array(); + private isRecordingGrouped = false; constructor(label = 'Tools', size = 50) { this.label = label; @@ -80,25 +82,16 @@ export class HistoryMemo { } /** - * Undoes up to the given number of items off the ring + * Undoes up to the given number of items off the ring. + * If one is a group (array) item it will undo every item inside */ public undo(items = 1) { while (items > 0 && this.undoAvailable > 0) { const item = this.ring[this.position]; - item.restoreMemo(true); - - // Dispatch history undo event - if (item.id) { - eventTarget.dispatchEvent( - new CustomEvent(Events.HISTORY_UNDO, { - detail: { - isUndo: true, - id: item.id, - operationType: item.operationType || 'annotation', - memo: item, - }, - }) - ); + + for (const subitem of asArray(item).reverse()) { + subitem.restoreMemo(true); + this.dispatchHistoryEvent({ item: subitem, isUndo: true }); } items--; @@ -113,7 +106,7 @@ export class HistoryMemo { * @param condition - Function that evaluates if the undo should be performed * @returns True if an undo was performed, false otherwise */ - public undoIf(condition: (item: Memo) => boolean): boolean { + public undoIf(condition: (item: Memo | Memo[]) => boolean): boolean { if (this.undoAvailable > 0 && condition(this.ring[this.position])) { this.undo(); return true; @@ -121,27 +114,38 @@ export class HistoryMemo { return false; } + /** + * If item has an id, dispatches a undo or redo event. + * @param args.item memo with id and operation type + * @param args.isUndo true if it is for undo and false if it is for redo + */ + private dispatchHistoryEvent({ item, isUndo }) { + if (item.id) { + eventTarget.dispatchEvent( + new CustomEvent(isUndo ? Events.HISTORY_UNDO : Events.HISTORY_REDO, { + detail: { + isUndo, + id: item.id, + operationType: item.operationType || 'annotation', + memo: item, + }, + }) + ); + } + } + /** * Redoes up to the given number of items, adding them to the top of the ring. + * If one is a group (array) item it will redo every item inside */ public redo(items = 1) { while (items > 0 && this.redoAvailable > 0) { const newPosition = (this.position + 1) % this.size; const item = this.ring[newPosition]; - item.restoreMemo(false); - - // Dispatch history redo event - if (item.id) { - eventTarget.dispatchEvent( - new CustomEvent(Events.HISTORY_REDO, { - detail: { - isUndo: false, - id: item.id, - operationType: item.operationType || 'annotation', - memo: item, - }, - }) - ); + + for (const subitem of asArray(item).reverse()) { + subitem.restoreMemo(false); + this.dispatchHistoryEvent({ item: subitem, isUndo: false }); } items--; @@ -151,6 +155,55 @@ export class HistoryMemo { } } + /** initializes an array for the group item */ + private initializeGroupItem() { + this.redoAvailable = 0; + if (this.undoAvailable < this._size) { + this.undoAvailable++; + } + this.position = (this.position + 1) % this._size; + this.ring[this.position] = []; + } + + /** + * Starts a group recording, so that with a single undo you can undo multiple actions that are related to each other. + * Requires endGroupRecording to be called after the group action is done. + */ + public startGroupRecording() { + this.isRecordingGrouped = true; + this.initializeGroupItem(); + } + + /** Rolls back an initialized but unused group item (an empty array) */ + private rollbackUnusedGroupItem() { + this.ring[this.position] = undefined; + this.position = (this.position - 1) % this._size; + this.undoAvailable--; + } + + /** Ends a group recording. Must be called after the group action is finished */ + public endGroupRecording() { + this.isRecordingGrouped = false; + + const lastItem = this.ring[this.position]; + const lastItemIsEmpty = Array.isArray(lastItem) && lastItem.length === 0; + + if (lastItemIsEmpty) { + this.rollbackUnusedGroupItem(); + } + } + + /** Add grouped items to the ring. If the current item is not a array, it will generate a new array. Otherwise it will push to the current array */ + private pushGrouped(memo: Memo) { + const lastMemo = this.ring[this.position]; + if (Array.isArray(lastMemo)) { + lastMemo.push(memo); + return memo; + } + + throw new Error('Last item should be an array for grouped memos.'); + } + /** * Pushes a new memo onto the ring. This will remove all redoable items * from the ring if a memo was pushed. Ignores undefined or null items. @@ -166,6 +219,11 @@ export class HistoryMemo { if (!memo) { return; } + + if (this.isRecordingGrouped) { + return this.pushGrouped(memo); + } + this.redoAvailable = 0; if (this.undoAvailable < this._size) { this.undoAvailable++; diff --git a/packages/core/src/utilities/index.ts b/packages/core/src/utilities/index.ts index 6f751d670d..122eb06a6d 100644 --- a/packages/core/src/utilities/index.ts +++ b/packages/core/src/utilities/index.ts @@ -100,6 +100,7 @@ import calculateSpacingBetweenImageIds from './calculateSpacingBetweenImageIds'; export * as logger from './logger'; import { calculateNeighborhoodStats } from './calculateNeighborhoodStats'; import getPixelSpacingInformation from './getPixelSpacingInformation'; +import { asArray } from './asArray'; const getViewportModality = (viewport: IViewport, volumeId?: string) => _getViewportModality(viewport, volumeId, cache.getVolume); @@ -203,4 +204,5 @@ export { buildMetadata, calculateNeighborhoodStats, getPixelSpacingInformation, + asArray, }; diff --git a/packages/tools/examples/toolHistoryGrouping/index.ts b/packages/tools/examples/toolHistoryGrouping/index.ts new file mode 100644 index 0000000000..65816762a9 --- /dev/null +++ b/packages/tools/examples/toolHistoryGrouping/index.ts @@ -0,0 +1,324 @@ +import type { Types } from '@cornerstonejs/core'; +import { + RenderingEngine, + Enums, + getRenderingEngine, + volumeLoader, + setVolumesForViewports, + utilities as csUtils, +} from '@cornerstonejs/core'; +import { + initDemo, + createImageIdsAndCacheMetaData, + setTitleAndDescription, + addDropdownToToolbar, + addButtonToToolbar, + annotationTools, + labelmapTools, + contourTools, + addManipulationBindings, +} from '../../../../utils/demo/helpers'; +import * as cornerstoneTools from '@cornerstonejs/tools'; + +const { segmentation } = cornerstoneTools; +const { MouseBindings } = cornerstoneTools.Enums; +const { DefaultHistoryMemo } = csUtils.HistoryMemo; + +// This is for debugging purposes +console.warn( + 'Click on index.ts to open source code for this example --------->' +); + +const { + ToolGroupManager, + Enums: csToolsEnums, + AnnotationTool, +} = cornerstoneTools; + +const { ViewportType } = Enums; +const renderingEngineId = 'myRenderingEngine'; +const viewportId = 'CT_STACK'; +const labelmapSegmentationId = 'labelmapSegmentationId'; +const contourSegmentationId = 'contourSegmentationId'; +const defaultTool = 'ThresholdCircle'; + +const volumeName = 'CT_VOLUME_ID'; // Id of the volume less loader prefix +const volumeLoaderScheme = 'cornerstoneStreamingImageVolume'; // Loader id which defines which volume loader to use +const volumeId = `${volumeLoaderScheme}:${volumeName}`; // VolumeId with loader id + volume id + +const toolMap = new Map(annotationTools); +for (const [key, value] of labelmapTools.toolMap) { + toolMap.set(key, value); +} +for (const [key, value] of contourTools.toolMap) { + toolMap.set(key, value); +} + +const demoToolbar = document.getElementById('demo-toolbar'); + +const group0 = document.createElement('div'); +group0.style.marginBottom = '10px'; +group0.style.color = 'red'; +group0.innerText = 'Recording is OFF'; +demoToolbar.appendChild(group0); + +const group1 = document.createElement('div'); +group1.style.marginBottom = '10px'; +demoToolbar.appendChild(group1); + +const group2 = document.createElement('div'); +group2.style.marginBottom = '10px'; +demoToolbar.appendChild(group2); + +// ======== Set up page ======== // +setTitleAndDescription( + 'Tool History Grouping', + "Demonstrate undo/redo grouped actions on tools. Notice that in most cases this should be done programmatically and the user shouldn't have to be aware of this api." +); + +const content = document.getElementById('content'); +const element = document.createElement('div'); + +// Disable right click context menu so we can have right click tools +element.oncontextmenu = (e) => e.preventDefault(); + +element.id = 'cornerstone-element'; +element.style.width = '500px'; +element.style.height = '500px'; + +content.appendChild(element); + +const info = document.createElement('div'); +content.appendChild(info); + +const instructions = document.createElement('p'); +instructions.innerText = ` +Left Click to use selected tool +z to undo, y to redo +`; +info.appendChild(instructions); + +// ============================= // + +const toolGroupId = 'STACK_TOOL_GROUP_ID'; + +const cancelToolDrawing = (evt) => { + const { element, key } = evt.detail; + if (key === 'Escape') { + cornerstoneTools.cancelActiveManipulations(element); + } +}; + +element.addEventListener(csToolsEnums.Events.KEY_DOWN, (evt) => { + cancelToolDrawing(evt); +}); + +addDropdownToToolbar({ + options: { map: toolMap, defaultValue: defaultTool }, + onSelectedValueChange: (newSelectedToolName, data) => { + const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); + + // Set the old tool passive + const selectedToolName = toolGroup.getActivePrimaryMouseButtonTool(); + if (selectedToolName) { + toolGroup.setToolPassive(selectedToolName); + } + + // Set the new tool active + toolGroup.setToolActive(newSelectedToolName as string, { + bindings: [ + { + mouseButton: MouseBindings.Primary, // Left Click + }, + ], + }); + const isContour = + data?.segmentationType === + csToolsEnums.SegmentationRepresentations.Contour; + segmentation.activeSegmentation.setActiveSegmentation( + viewportId, + isContour ? contourSegmentationId : labelmapSegmentationId + ); + }, +}); + +addDropdownToToolbar({ + options: { values: ['1', '2', '3'], defaultValue: '1' }, + labelText: 'Segment', + onSelectedValueChange: (segmentIndex) => { + segmentation.segmentIndex.setActiveSegmentIndex( + labelmapSegmentationId, + Number(segmentIndex) + ); + segmentation.segmentIndex.setActiveSegmentIndex( + contourSegmentationId, + Number(segmentIndex) + ); + }, +}); + +addButtonToToolbar({ + id: 'startRecording', + title: 'Start Group Recordings', + onClick() { + DefaultHistoryMemo.startGroupRecording(); + group0.style.color = 'green'; + group0.innerText = 'Recording is ON'; + }, + container: group1, +}); + +addButtonToToolbar({ + id: 'endRecording', + title: 'End Group Recordings', + onClick() { + DefaultHistoryMemo.endGroupRecording(); + group0.style.color = 'red'; + group0.innerText = 'Recording is OFF'; + }, + container: group1, +}); + +addButtonToToolbar({ + id: 'Undo', + title: 'Undo', + onClick() { + DefaultHistoryMemo.undo(); + }, + container: group2, +}); + +addButtonToToolbar({ + id: 'Redo', + title: 'Redo', + onClick() { + DefaultHistoryMemo.redo(); + }, + container: group2, +}); + +addButtonToToolbar({ + id: 'Delete', + title: 'Delete Annotation', + onClick() { + const annotationUIDs = + cornerstoneTools.annotation.selection.getAnnotationsSelected(); + + if (annotationUIDs.length === 0) { + return; + } + + const annotation = cornerstoneTools.annotation.state.getAnnotation( + annotationUIDs[0] + ); + + if (annotation) { + // Note that delete needs to have a memo created for it, as the underlying + // state manager doesn't record this directly. + // The deleting flag is set to true meaning that this annotation is about + // to be deleted (but is NOT yet deleted). + AnnotationTool.createAnnotationMemo(element, annotation, { + deleting: true, + }); + cornerstoneTools.annotation.state.removeAnnotation( + annotation.annotationUID + ); + getRenderingEngine(renderingEngineId).render(); + } + }, + container: group2, +}); + +async function addSegmentationsToState() { + // Create a segmentation of the same resolution as the source data + await volumeLoader.createAndCacheDerivedLabelmapVolume(volumeId, { + volumeId: labelmapSegmentationId, + }); + + // Add the segmentations to state + segmentation.addSegmentations([ + { + segmentationId: labelmapSegmentationId, + representation: { + // The type of segmentation + type: csToolsEnums.SegmentationRepresentations.Labelmap, + // The actual segmentation data, in the case of labelmap this is a + // reference to the source volume of the segmentation. + data: { + volumeId: labelmapSegmentationId, + }, + }, + }, + { + segmentationId: contourSegmentationId, + representation: { + type: csToolsEnums.SegmentationRepresentations.Contour, + }, + }, + ]); +} + +/** + * Runs the demo + */ +async function run() { + // Init Cornerstone and related libraries + await initDemo(); + + // Define a tool group, which defines how mouse events map to tool commands for + // Any viewport using the group + const toolGroup = ToolGroupManager.createToolGroup(toolGroupId); + addManipulationBindings(toolGroup, { toolMap }); + + // Get Cornerstone imageIds and fetch metadata into RAM + const imageIds = await createImageIdsAndCacheMetaData({ + StudyInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.334240657131972136850343327463', + SeriesInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.226151125820845824875394858561', + wadoRsRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', + }); + + // Define a volume in memory + const volume = await volumeLoader.createAndCacheVolume(volumeId, { + imageIds, + }); + + await addSegmentationsToState(); + + // Instantiate a rendering engine + const renderingEngine = new RenderingEngine(renderingEngineId); + + // Create a stack viewport + const viewportInput = { + viewportId, + type: ViewportType.ORTHOGRAPHIC, + element, + defaultOptions: { + background: [0.2, 0, 0.2], + }, + }; + + renderingEngine.enableElement(viewportInput); + + // Set the tool group on the viewport + toolGroup.addViewport(viewportId, renderingEngineId); + + // Get the stack viewport that was created + const viewport = ( + renderingEngine.getViewport(viewportId) + ); + volume.load(); + + // Set volumes on the viewports + await setVolumesForViewports(renderingEngine, [{ volumeId }], [viewportId]); + + // Render the image + viewport.render(); + + await segmentation.addLabelmapRepresentationToViewport(viewportId, [ + { segmentationId: labelmapSegmentationId }, + ]); +} + +run(); diff --git a/packages/tools/src/tools/base/BaseTool.ts b/packages/tools/src/tools/base/BaseTool.ts index 33c71818ff..3baf6d507b 100644 --- a/packages/tools/src/tools/base/BaseTool.ts +++ b/packages/tools/src/tools/base/BaseTool.ts @@ -308,6 +308,16 @@ abstract class BaseTool { } this.memo = null; } + + /** Starts a group recording of history memo, so that with a single undo you can undo multiple actions that are related to each other */ + public static startGroupRecording() { + DefaultHistoryMemo.startGroupRecording(); + } + + /** Ends a group recording of history memo */ + public static endGroupRecording() { + DefaultHistoryMemo.endGroupRecording(); + } } // Note: this is a workaround since terser plugin does not support static blocks diff --git a/utils/ExampleRunner/example-info.json b/utils/ExampleRunner/example-info.json index a60649716e..c1351f6bd0 100644 --- a/utils/ExampleRunner/example-info.json +++ b/utils/ExampleRunner/example-info.json @@ -534,6 +534,10 @@ "toolHistory": { "name": "Tool History", "description": "Demonstrates how to use the tool history to undo and redo tool actions" + }, + "toolHistoryGrouping": { + "name": "Tool History Grouping", + "description": "Demonstrates how to use the tool history grouping to undo and redo batched tool actions that are related to one another" } }, "polymorph-segmentation": { From f7603dd7e151a2dad5caa1efe70be4f00271960c Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 00:17:54 +0000 Subject: [PATCH 022/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 94a06e1c44..4d2115eb3d 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -b1a7a92dc23661c1bf55fff17f3a857615e4fc75 \ No newline at end of file +963a35f7e95577a87473fb0e972491f2c0175c30 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 4f0c6acd8d..f7697f2365 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.3", - "@cornerstonejs/tools": "^3.28.3" + "@cornerstonejs/core": "^3.29.0", + "@cornerstonejs/tools": "^3.29.0" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index f5b6a372ed..de2b8d2d6f 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.3", - "@cornerstonejs/tools": "^3.28.3" + "@cornerstonejs/core": "^3.29.0", + "@cornerstonejs/tools": "^3.29.0" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 3e6b3f1975..a2cdba4b3d 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.3", + "@cornerstonejs/core": "^3.29.0", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index dba89f678f..9d7ecb752f 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.28.3", - "@cornerstonejs/core": "^3.28.3", - "@cornerstonejs/dicom-image-loader": "^3.28.3", - "@cornerstonejs/nifti-volume-loader": "^3.28.3", - "@cornerstonejs/tools": "^3.28.3", + "@cornerstonejs/adapters": "^3.29.0", + "@cornerstonejs/core": "^3.29.0", + "@cornerstonejs/dicom-image-loader": "^3.29.0", + "@cornerstonejs/nifti-volume-loader": "^3.29.0", + "@cornerstonejs/tools": "^3.29.0", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 633f2b1ad7..fd925735ed 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.3", - "@cornerstonejs/tools": "^3.28.3", + "@cornerstonejs/core": "^3.29.0", + "@cornerstonejs/tools": "^3.29.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 880ef2cb03..fafa19cb86 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.3" + "@cornerstonejs/core": "^3.29.0" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 2880b22887..1fe704bbd7 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.3", - "@cornerstonejs/tools": "^3.28.3", + "@cornerstonejs/core": "^3.29.0", + "@cornerstonejs/tools": "^3.29.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 473dd04d98..4e24e9f895 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.28.3", + "@cornerstonejs/core": "^3.29.0", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index e2ab803321..04ae5574be 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.28.3", - "commit": "b1a7a92dc23661c1bf55fff17f3a857615e4fc75" + "version": "3.29.0", + "commit": "963a35f7e95577a87473fb0e972491f2c0175c30" } \ No newline at end of file diff --git a/version.txt b/version.txt index ff54b8a8d7..ec131a8f3e 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.28.3 \ No newline at end of file +3.29.0 \ No newline at end of file From 5e74078edb9b5a3e99e0c2aedc0238727033a8a1 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 00:18:11 +0000 Subject: [PATCH 023/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 51 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c08833ed1f..55c41d1f89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) + +### Features + +- enable historyMemo action grouping ([#2160](https://github.com/cornerstonejs/cornerstone3D/issues/2160)) ([963a35f](https://github.com/cornerstonejs/cornerstone3D/commit/963a35f7e95577a87473fb0e972491f2c0175c30)) + ## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 2886ed6bf3..6548b2c96f 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.28.3", + "version": "3.29.0", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 02e466a1a8..446296f6c4 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index f7697f2365..b53f6fa1e9 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.28.3", + "version": "3.29.0", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 0b2354833f..64f25d28a7 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index de2b8d2d6f..ed25127e2c 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.28.3", + "version": "3.29.0", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 638e5d4349..0f4c0c7718 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) + +### Features + +- enable historyMemo action grouping ([#2160](https://github.com/cornerstonejs/cornerstone3D/issues/2160)) ([963a35f](https://github.com/cornerstonejs/cornerstone3D/commit/963a35f7e95577a87473fb0e972491f2c0175c30)) + ## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 23788058c5..8a5ee27fa0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.28.3", + "version": "3.29.0", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index f2d7a45de5..aa681e6ca2 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index a2cdba4b3d..f0de6190e3 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.28.3", + "version": "3.29.0", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 577b946793..47d24c9abc 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index fd925735ed..a1605acb99 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.28.3", + "version": "3.29.0", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 970375e629..06e3111ea2 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index fafa19cb86..b2650ce57b 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.28.3", + "version": "3.29.0", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 5b49c351cf..f39b411ddf 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 1fe704bbd7..e993aacea9 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.28.3", + "version": "3.29.0", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index fdba5bfade..2efe9e848d 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) + +### Features + +- enable historyMemo action grouping ([#2160](https://github.com/cornerstonejs/cornerstone3D/issues/2160)) ([963a35f](https://github.com/cornerstonejs/cornerstone3D/commit/963a35f7e95577a87473fb0e972491f2c0175c30)) + ## [3.28.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.2...v3.28.3) (2025-07-09) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 4e24e9f895..dba65b7ec3 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.28.3", + "version": "3.29.0", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 4a25ee32eab069c6e6bbab5c9a274af38621de09 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 00:18:21 +0000 Subject: [PATCH 024/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 1710c95553..b604dcbeaf 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.28.3"; +export const version = "3.29.0"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index c03a0aef86..7b207d2474 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.3'; +export const version = '3.29.0'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index c03a0aef86..7b207d2474 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.3'; +export const version = '3.29.0'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index c03a0aef86..7b207d2474 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.3'; +export const version = '3.29.0'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index c03a0aef86..7b207d2474 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.3'; +export const version = '3.29.0'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index c03a0aef86..7b207d2474 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.3'; +export const version = '3.29.0'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index c03a0aef86..7b207d2474 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.3'; +export const version = '3.29.0'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index c03a0aef86..7b207d2474 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.3'; +export const version = '3.29.0'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index c03a0aef86..7b207d2474 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.28.3'; +export const version = '3.29.0'; From a6f3970f92f886407cbd3938be0ae8c346eaa519 Mon Sep 17 00:00:00 2001 From: Chris Nagy Date: Thu, 10 Jul 2025 14:00:43 +0200 Subject: [PATCH 025/212] fix: use correct range value to calculate voi multiplier (#2189) --- packages/tools/src/tools/WindowLevelTool.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tools/src/tools/WindowLevelTool.ts b/packages/tools/src/tools/WindowLevelTool.ts index 093e09fd60..90478384b8 100644 --- a/packages/tools/src/tools/WindowLevelTool.ts +++ b/packages/tools/src/tools/WindowLevelTool.ts @@ -193,7 +193,7 @@ class WindowLevelTool extends BaseTool { // Burned in Pixels often use pixel values above the BitsStored. // This results in a multiplier which is way higher than what you would // want in practice. Thus we take the min between the metadata dynamic - // range and actual middle slice dynamic range. + // range upper value and actual middle slice dynamic range. imageDynamicRange = Math.min( calculatedDynamicRange[1] - calculatedDynamicRange[0], metadataDynamicRange From c474c82b39010a20446cf1e7b8d861e7f1b1b910 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 12:04:27 +0000 Subject: [PATCH 026/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 4d2115eb3d..683c19c1c7 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -963a35f7e95577a87473fb0e972491f2c0175c30 \ No newline at end of file +a6f3970f92f886407cbd3938be0ae8c346eaa519 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index b53f6fa1e9..ea5f9d6c9a 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.0", - "@cornerstonejs/tools": "^3.29.0" + "@cornerstonejs/core": "^3.29.1", + "@cornerstonejs/tools": "^3.29.1" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index ed25127e2c..bdb1df1f78 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.0", - "@cornerstonejs/tools": "^3.29.0" + "@cornerstonejs/core": "^3.29.1", + "@cornerstonejs/tools": "^3.29.1" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index f0de6190e3..845a1ce646 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.0", + "@cornerstonejs/core": "^3.29.1", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 9d7ecb752f..f0b792cafc 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.29.0", - "@cornerstonejs/core": "^3.29.0", - "@cornerstonejs/dicom-image-loader": "^3.29.0", - "@cornerstonejs/nifti-volume-loader": "^3.29.0", - "@cornerstonejs/tools": "^3.29.0", + "@cornerstonejs/adapters": "^3.29.1", + "@cornerstonejs/core": "^3.29.1", + "@cornerstonejs/dicom-image-loader": "^3.29.1", + "@cornerstonejs/nifti-volume-loader": "^3.29.1", + "@cornerstonejs/tools": "^3.29.1", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index a1605acb99..7adb375d8a 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.0", - "@cornerstonejs/tools": "^3.29.0", + "@cornerstonejs/core": "^3.29.1", + "@cornerstonejs/tools": "^3.29.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index b2650ce57b..256bbfbfa3 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.0" + "@cornerstonejs/core": "^3.29.1" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index e993aacea9..1e541ebfe9 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.0", - "@cornerstonejs/tools": "^3.29.0", + "@cornerstonejs/core": "^3.29.1", + "@cornerstonejs/tools": "^3.29.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index dba65b7ec3..068037c2f7 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.0", + "@cornerstonejs/core": "^3.29.1", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 04ae5574be..8885b81229 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.29.0", - "commit": "963a35f7e95577a87473fb0e972491f2c0175c30" + "version": "3.29.1", + "commit": "a6f3970f92f886407cbd3938be0ae8c346eaa519" } \ No newline at end of file diff --git a/version.txt b/version.txt index ec131a8f3e..ffa7ee838d 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.29.0 \ No newline at end of file +3.29.1 \ No newline at end of file From 82d3089e6cde5e317e8c5a79df2f3bbc3467cbe9 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 12:04:46 +0000 Subject: [PATCH 027/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55c41d1f89..4e54c4d765 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) + +### Bug Fixes + +- use correct range value to calculate voi multiplier ([#2189](https://github.com/cornerstonejs/cornerstone3D/issues/2189)) ([a6f3970](https://github.com/cornerstonejs/cornerstone3D/commit/a6f3970f92f886407cbd3938be0ae8c346eaa519)) + # [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) ### Features diff --git a/lerna.json b/lerna.json index 6548b2c96f..26e089c1bd 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.29.0", + "version": "3.29.1", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 446296f6c4..085bc1de4a 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/adapters + # [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index ea5f9d6c9a..521260a1c5 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.29.0", + "version": "3.29.1", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 64f25d28a7..ea9ca19d19 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/ai + # [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index bdb1df1f78..2585edabf9 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.29.0", + "version": "3.29.1", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 0f4c0c7718..9271bbe72b 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/core + # [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) ### Features diff --git a/packages/core/package.json b/packages/core/package.json index 8a5ee27fa0..ab45dfc084 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.29.0", + "version": "3.29.1", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index aa681e6ca2..06d7f461db 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + # [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 845a1ce646..b945cbb6a2 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.29.0", + "version": "3.29.1", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 47d24c9abc..50a244744c 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + # [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 7adb375d8a..e55db072ac 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.29.0", + "version": "3.29.1", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 06e3111ea2..b6bfcd97e2 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + # [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 256bbfbfa3..ecdcff82a2 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.29.0", + "version": "3.29.1", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index f39b411ddf..c9ec6b47b4 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + # [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 1e541ebfe9..a5e40c72f1 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.29.0", + "version": "3.29.1", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 2efe9e848d..ab257a8fa8 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) + +### Bug Fixes + +- use correct range value to calculate voi multiplier ([#2189](https://github.com/cornerstonejs/cornerstone3D/issues/2189)) ([a6f3970](https://github.com/cornerstonejs/cornerstone3D/commit/a6f3970f92f886407cbd3938be0ae8c346eaa519)) + # [3.29.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.28.3...v3.29.0) (2025-07-10) ### Features diff --git a/packages/tools/package.json b/packages/tools/package.json index 068037c2f7..4ec219274d 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.29.0", + "version": "3.29.1", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 09e8e30f6ee9c0ba652a298c721f4022f21c381d Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 12:04:58 +0000 Subject: [PATCH 028/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index b604dcbeaf..17ea25b13d 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.29.0"; +export const version = "3.29.1"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 7b207d2474..930e8df49e 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.0'; +export const version = '3.29.1'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 7b207d2474..930e8df49e 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.0'; +export const version = '3.29.1'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 7b207d2474..930e8df49e 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.0'; +export const version = '3.29.1'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 7b207d2474..930e8df49e 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.0'; +export const version = '3.29.1'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 7b207d2474..930e8df49e 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.0'; +export const version = '3.29.1'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 7b207d2474..930e8df49e 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.0'; +export const version = '3.29.1'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 7b207d2474..930e8df49e 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.0'; +export const version = '3.29.1'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 7b207d2474..930e8df49e 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.0'; +export const version = '3.29.1'; From 6ee565be36e22a98070ce2a0536f3d821979cac4 Mon Sep 17 00:00:00 2001 From: Ibrahim <93064150+IbrahimCSAE@users.noreply.github.com> Date: Thu, 10 Jul 2025 08:50:38 -0400 Subject: [PATCH 029/212] fix(rendering): Introduce SequentialRenderingEngine to resolve canvas size limitation, performance degradation on high res monitors and enhance multi-monitor support (#2181) --- .gitignore | 3 + .../src/adapters/Cornerstone3D/Angle.ts | 4 +- .../adapters/Cornerstone3D/BaseAdapter3D.ts | 2 +- .../adapters/Cornerstone3D/Bidirectional.ts | 2 +- .../src/adapters/Cornerstone3D/CircleROI.ts | 2 +- .../src/adapters/Cornerstone3D/CobbAngle.ts | 4 +- .../adapters/Cornerstone3D/EllipticalROI.ts | 6 +- .../src/adapters/Cornerstone3D/Length.ts | 2 +- .../Cornerstone3D/MeasurementReport.ts | 1 + .../Cornerstone3D/PlanarFreehandROI.ts | 11 +- .../Cornerstone3D/UltrasoundDirectional.ts | 2 +- .../core/examples/ptctmultimonitor/index.ts | 918 +++++++++++ .../sequentialrenderingengine/index.ts | 182 +++ .../RenderingEngine/BaseRenderingEngine.ts | 832 ++++++++++ .../src/RenderingEngine/BaseVolumeViewport.ts | 191 ++- .../src/RenderingEngine/RenderingEngine.ts | 1410 +---------------- .../SequentialRenderingEngine.ts | 409 +++++ .../core/src/RenderingEngine/StackViewport.ts | 137 +- .../StandardRenderingEngine.ts | 635 ++++++++ .../helpers/isSequentialRenderingEngine.ts | 9 + packages/core/src/RenderingEngine/index.ts | 6 + .../core/src/enums/RenderingEngineModeEnum.ts | 6 + packages/core/src/enums/index.ts | 2 + packages/core/src/index.ts | 9 +- packages/core/src/init.ts | 8 + .../core/src/types/Cornerstone3DConfig.ts | 21 +- packages/core/src/types/IRenderingEngine.ts | 2 +- .../core/src/types/RenderingEngineMode.ts | 3 + packages/core/src/types/index.ts | 3 + .../getAnnotationsUIDMapFromSegmentation.ts | 2 +- .../segmentation/LabelmapEditWithContour.ts | 2 +- .../viewport.png | Bin 0 -> 132253 bytes .../viewport.png | Bin 0 -> 111262 bytes .../viewport.png | Bin 0 -> 238272 bytes .../viewport.png | Bin 0 -> 206824 bytes tests/sequentialRenderingEngine.spec.ts | 24 + tests/utils/screenShotPaths.ts | 3 + utils/ExampleRunner/example-info.json | 8 + 38 files changed, 3475 insertions(+), 1386 deletions(-) create mode 100644 packages/core/examples/ptctmultimonitor/index.ts create mode 100644 packages/core/examples/sequentialrenderingengine/index.ts create mode 100644 packages/core/src/RenderingEngine/BaseRenderingEngine.ts create mode 100644 packages/core/src/RenderingEngine/SequentialRenderingEngine.ts create mode 100644 packages/core/src/RenderingEngine/StandardRenderingEngine.ts create mode 100644 packages/core/src/RenderingEngine/helpers/isSequentialRenderingEngine.ts create mode 100644 packages/core/src/enums/RenderingEngineModeEnum.ts create mode 100644 packages/core/src/types/RenderingEngineMode.ts create mode 100644 tests/screenshots/Mobile-Android/sequentialRenderingEngine.spec.ts/viewport.png create mode 100644 tests/screenshots/Mobile-Safari/sequentialRenderingEngine.spec.ts/viewport.png create mode 100644 tests/screenshots/chromium/sequentialRenderingEngine.spec.ts/viewport.png create mode 100644 tests/screenshots/webkit/sequentialRenderingEngine.spec.ts/viewport.png create mode 100644 tests/sequentialRenderingEngine.spec.ts diff --git a/.gitignore b/.gitignore index f904defb14..9a530f575b 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,6 @@ coverage/ .cursor **/.claude/settings.local.json + +# External repositories +vtk-js/ diff --git a/packages/adapters/src/adapters/Cornerstone3D/Angle.ts b/packages/adapters/src/adapters/Cornerstone3D/Angle.ts index e825ff1c8b..c5407d02dc 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Angle.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Angle.ts @@ -171,7 +171,9 @@ class Angle extends BaseAdapter3D { const point4 = { x: end[0], y: end[1], z: end[2] }; const cachedStatsKeys = Object.keys(cachedStats)[0]; - const { angle } = cachedStatsKeys ? cachedStats[cachedStatsKeys] : {}; + const { angle = undefined } = cachedStatsKeys + ? cachedStats[cachedStatsKeys] + : {}; return { point1, diff --git a/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts b/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts index 0fc557e532..2709142a1b 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts @@ -175,7 +175,7 @@ export default class BaseAdapter3D { return tidArguments; } - static getTID300RepresentationArgumentsSCOORD3D(tool) { + static getTID300RepresentationArgumentsSCOORD3D(tool): TID300Arguments { const { data, finding, findingSites } = tool; const { handles: { points = [] } diff --git a/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts b/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts index d101518cca..c4de33296e 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts @@ -274,7 +274,7 @@ class Bidirectional extends BaseAdapter3D { const shortAxisEnd = longAxisPoints[1]; const cachedStatsKeys = Object.keys(cachedStats)[0]; - const { length, width } = cachedStatsKeys + const { length = undefined, width = undefined } = cachedStatsKeys ? cachedStats[cachedStatsKeys] : {}; diff --git a/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts b/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts index 2944412432..f396dfe30a 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts @@ -183,7 +183,7 @@ class CircleROI extends BaseAdapter3D { points.push({ x: end[0], y: end[1], z: center[2] }); const cachedStatsKeys = Object.keys(cachedStats)[0]; - const { area, radius } = cachedStatsKeys + const { area = undefined, radius = 0 } = cachedStatsKeys ? cachedStats[cachedStatsKeys] : {}; const perimeter = 2 * Math.PI * radius; diff --git a/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts b/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts index f9097a442c..43115c4ddc 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts @@ -184,7 +184,9 @@ class CobbAngle extends BaseAdapter3D { const point4 = { x: end2[0], y: end2[1], z: end2[2] }; const cachedStatsKeys = Object.keys(cachedStats)[0]; - const { angle } = cachedStatsKeys ? cachedStats[cachedStatsKeys] : {}; + const { angle = undefined } = cachedStatsKeys + ? cachedStats[cachedStatsKeys] + : {}; return { point1, diff --git a/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts b/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts index 7911f983bd..6c213b4184 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts @@ -177,7 +177,7 @@ class EllipticalROI extends BaseAdapter3D { // in the image plane and then choose the correct points to use for the ellipse. const pointsWorld: Point3[] = []; for (let i = 0; i < GraphicData.length; i += 3) { - const worldPos = [ + const worldPos: Point3 = [ GraphicData[i], GraphicData[i + 1], GraphicData[i + 2] @@ -335,7 +335,9 @@ class EllipticalROI extends BaseAdapter3D { } const cachedStatsKeys = Object.keys(cachedStats)[0]; - const { area } = cachedStatsKeys ? cachedStats[cachedStatsKeys] : {}; + const { area = undefined } = cachedStatsKeys + ? cachedStats[cachedStatsKeys] + : {}; return { area, diff --git a/packages/adapters/src/adapters/Cornerstone3D/Length.ts b/packages/adapters/src/adapters/Cornerstone3D/Length.ts index 994d11b642..c1129e51c0 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Length.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Length.ts @@ -159,7 +159,7 @@ export default class Length extends BaseAdapter3D { const point2 = { x: end[0], y: end[1], z: end[2] }; const cachedStatsKeys = Object.keys(cachedStats)[0]; - const { length: distance } = cachedStatsKeys + const { length: distance = undefined } = cachedStatsKeys ? cachedStats[cachedStatsKeys] : {}; diff --git a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts index aaf10c6794..2b6df7cf55 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts @@ -32,6 +32,7 @@ type SpatialCoordinatesState = { FrameOfReferenceUID: string; label: string; }; + data?: unknown; }; finding?: unknown; findingSites?: unknown; diff --git a/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts b/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts index bc0dc79c60..740f106bc0 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts @@ -233,8 +233,15 @@ class PlanarFreehandROI extends BaseAdapter3D { } const cachedStatsKeys = Object.keys(data.cachedStats)[0]; - const { area, areaUnit, modalityUnit, perimeter, mean, max, stdDev } = - cachedStatsKeys ? data.cachedStats[cachedStatsKeys] : {}; + const { + area = undefined, + areaUnit = undefined, + modalityUnit = undefined, + perimeter = undefined, + mean = undefined, + max = undefined, + stdDev = undefined + } = cachedStatsKeys ? data.cachedStats[cachedStatsKeys] : {}; return { /** From cachedStats */ diff --git a/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts b/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts index affef4a1d2..f5fb6e7eab 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts @@ -28,7 +28,7 @@ class UltrasoundDirectional extends BaseAdapter3D { const { GraphicData } = SCOORDGroup; const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 2) { + for (let i = 0; i < (GraphicData as number[]).length; i += 2) { const point = imageToWorldCoords(referencedImageId, [ GraphicData[i], GraphicData[i + 1] diff --git a/packages/core/examples/ptctmultimonitor/index.ts b/packages/core/examples/ptctmultimonitor/index.ts new file mode 100644 index 0000000000..38e6b832fc --- /dev/null +++ b/packages/core/examples/ptctmultimonitor/index.ts @@ -0,0 +1,918 @@ +import type { Types } from '@cornerstonejs/core'; +import { + RenderingEngine, + Enums, + setVolumesForViewports, + volumeLoader, + getRenderingEngine, +} from '@cornerstonejs/core'; +import { + initDemo, + createImageIdsAndCacheMetaData, + setTitleAndDescription, + setPetColorMapTransferFunctionForVolumeActor, + setPetTransferFunctionForVolumeActor, + setCtTransferFunctionForVolumeActor, + addDropdownToToolbar, +} from '../../../../utils/demo/helpers'; +import * as cornerstoneTools from '@cornerstonejs/tools'; + +const { + ToolGroupManager, + Enums: csToolsEnums, + WindowLevelTool, + PanTool, + ZoomTool, + StackScrollTool, + synchronizers, + MIPJumpToClickTool, + CrosshairsTool, + TrackballRotateTool, + VolumeRotateTool, + RectangleROITool, +} = cornerstoneTools; + +const { MouseBindings } = csToolsEnums; +const { ViewportType, BlendModes } = Enums; + +const { createCameraPositionSynchronizer, createVOISynchronizer } = + synchronizers; + +// Study IDs +const FirstStudyID = `1.3.6.1.4.1.14519.5.2.1.7009.2403.871108593056125491804754960339`; +const SecondStudyID = + '1.3.6.1.4.1.14519.5.2.1.7009.2403.334240657131972136850343327463'; +const ThirdStudyID = `1.3.6.1.4.1.9328.50.17.15423521354819720574322014551955370036`; + +// Common configuration +let renderingEngine; +const wadoRsRoot = 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb'; +const renderingEngineId = 'myRenderingEngine'; +const volumeLoaderScheme = 'cornerstoneStreamingImageVolume'; + +// Volume IDs for each study +const volumeIds = { + study1: { + ct: `${volumeLoaderScheme}:CT_VOLUME_STUDY1`, + pt: `${volumeLoaderScheme}:PT_VOLUME_STUDY1`, + }, + study2: { + ct: `${volumeLoaderScheme}:CT_VOLUME_STUDY2`, + pt: `${volumeLoaderScheme}:PT_VOLUME_STUDY2`, + }, + study3: { + ct: `${volumeLoaderScheme}:CT_VOLUME_STUDY3`, + pt: `${volumeLoaderScheme}:PT_VOLUME_STUDY3`, + }, +}; + +// Tool group IDs for each study +const toolGroupIds = { + study1: { + ct: 'CT_TOOLGROUP_STUDY1', + pt: 'PT_TOOLGROUP_STUDY1', + fusion: 'FUSION_TOOLGROUP_STUDY1', + mip: 'MIP_TOOLGROUP_STUDY1', + }, + study2: { + ct: 'CT_TOOLGROUP_STUDY2', + pt: 'PT_TOOLGROUP_STUDY2', + fusion: 'FUSION_TOOLGROUP_STUDY2', + mip: 'MIP_TOOLGROUP_STUDY2', + }, + study3: { + ct: 'CT_TOOLGROUP_STUDY3', + pt: 'PT_TOOLGROUP_STUDY3', + fusion: 'FUSION_TOOLGROUP_STUDY3', + mip: 'MIP_TOOLGROUP_STUDY3', + }, +}; + +// Viewport IDs for each study +const viewportIds = { + study1: { + CT: { + AXIAL: 'CT_AXIAL_S1', + SAGITTAL: 'CT_SAGITTAL_S1', + CORONAL: 'CT_CORONAL_S1', + }, + PT: { + AXIAL: 'PT_AXIAL_S1', + SAGITTAL: 'PT_SAGITTAL_S1', + CORONAL: 'PT_CORONAL_S1', + }, + FUSION: { + AXIAL: 'FUSION_AXIAL_S1', + SAGITTAL: 'FUSION_SAGITTAL_S1', + CORONAL: 'FUSION_CORONAL_S1', + }, + PETMIP: { CORONAL: 'PET_MIP_CORONAL_S1' }, + }, + study2: { + CT: { + AXIAL: 'CT_AXIAL_S2', + SAGITTAL: 'CT_SAGITTAL_S2', + CORONAL: 'CT_CORONAL_S2', + }, + PT: { + AXIAL: 'PT_AXIAL_S2', + SAGITTAL: 'PT_SAGITTAL_S2', + CORONAL: 'PT_CORONAL_S2', + }, + FUSION: { + AXIAL: 'FUSION_AXIAL_S2', + SAGITTAL: 'FUSION_SAGITTAL_S2', + CORONAL: 'FUSION_CORONAL_S2', + }, + PETMIP: { CORONAL: 'PET_MIP_CORONAL_S2' }, + }, + study3: { + CT: { + AXIAL: 'CT_AXIAL_S3', + SAGITTAL: 'CT_SAGITTAL_S3', + CORONAL: 'CT_CORONAL_S3', + }, + PT: { + AXIAL: 'PT_AXIAL_S3', + SAGITTAL: 'PT_SAGITTAL_S3', + CORONAL: 'PT_CORONAL_S3', + }, + FUSION: { + AXIAL: 'FUSION_AXIAL_S3', + SAGITTAL: 'FUSION_SAGITTAL_S3', + CORONAL: 'FUSION_CORONAL_S3', + }, + PETMIP: { CORONAL: 'PET_MIP_CORONAL_S3' }, + }, +}; + +// Synchronizer IDs for each study +const synchronizerIds = { + study1: { + axialCamera: 'AXIAL_CAMERA_SYNC_S1', + sagittalCamera: 'SAGITTAL_CAMERA_SYNC_S1', + coronalCamera: 'CORONAL_CAMERA_SYNC_S1', + ctVoi: 'CT_VOI_SYNC_S1', + ptVoi: 'PT_VOI_SYNC_S1', + fusionVoi: 'FUSION_VOI_SYNC_S1', + }, + study2: { + axialCamera: 'AXIAL_CAMERA_SYNC_S2', + sagittalCamera: 'SAGITTAL_CAMERA_SYNC_S2', + coronalCamera: 'CORONAL_CAMERA_SYNC_S2', + ctVoi: 'CT_VOI_SYNC_S2', + ptVoi: 'PT_VOI_SYNC_S2', + fusionVoi: 'FUSION_VOI_SYNC_S2', + }, + study3: { + axialCamera: 'AXIAL_CAMERA_SYNC_S3', + sagittalCamera: 'SAGITTAL_CAMERA_SYNC_S3', + coronalCamera: 'CORONAL_CAMERA_SYNC_S3', + ctVoi: 'CT_VOI_SYNC_S3', + ptVoi: 'PT_VOI_SYNC_S3', + fusionVoi: 'FUSION_VOI_SYNC_S3', + }, +}; + +// Store volumes and synchronizers +const volumes = { + study1: { ct: null, pt: null }, + study2: { ct: null, pt: null }, + study3: { ct: null, pt: null }, +}; + +const allSynchronizers = { + study1: {}, + study2: {}, + study3: {}, +}; + +// Study configurations +const studyConfigs = [ + { + studyId: FirstStudyID, + studyKey: 'study1', + ctSeriesUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.367700692008930469189923116409', + ptSeriesUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.780462962868572737240023906400', + }, + { + studyId: SecondStudyID, + studyKey: 'study2', + ctSeriesUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.226151125820845824875394858561', + ptSeriesUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.879445243400782656317561081015', + }, + { + studyId: ThirdStudyID, + studyKey: 'study3', + ctSeriesUID: + '1.3.6.1.4.1.9328.50.17.135334071755755347832616394678950029105', + ptSeriesUID: + '1.3.6.1.4.1.9328.50.17.171167119696208952720976351719238820467', + }, +]; + +// Store DOM elements +const elements = {}; + +// Viewport colors +const viewportColors = {}; + +// Initialize viewport colors for all studies +['study1', 'study2', 'study3'].forEach((studyKey) => { + const studyViewportIds = viewportIds[studyKey]; + viewportColors[studyViewportIds.CT.AXIAL] = 'rgb(200, 0, 0)'; + viewportColors[studyViewportIds.CT.SAGITTAL] = 'rgb(200, 200, 0)'; + viewportColors[studyViewportIds.CT.CORONAL] = 'rgb(0, 200, 0)'; + viewportColors[studyViewportIds.PT.AXIAL] = 'rgb(200, 0, 0)'; + viewportColors[studyViewportIds.PT.SAGITTAL] = 'rgb(200, 200, 0)'; + viewportColors[studyViewportIds.PT.CORONAL] = 'rgb(0, 200, 0)'; + viewportColors[studyViewportIds.FUSION.AXIAL] = 'rgb(200, 0, 0)'; + viewportColors[studyViewportIds.FUSION.SAGITTAL] = 'rgb(200, 200, 0)'; + viewportColors[studyViewportIds.FUSION.CORONAL] = 'rgb(0, 200, 0)'; +}); + +// ======== Set up page ======== // +setTitleAndDescription( + 'Multi-Monitor PET-CT', + 'Three studies displayed with PET-CT fusion layout, each with separate tool groups but shared rendering engine' +); + +const optionsValues = [ + ZoomTool.toolName, + WindowLevelTool.toolName, + CrosshairsTool.toolName, + RectangleROITool.toolName, +]; + +// ============================= // +addDropdownToToolbar({ + options: { values: optionsValues, defaultValue: ZoomTool.toolName }, + onSelectedValueChange: (toolNameAsStringOrNumber) => { + const toolName = String(toolNameAsStringOrNumber); + + ['study1', 'study2', 'study3'].forEach((studyKey) => { + const studyToolGroupIds = toolGroupIds[studyKey]; + [ + studyToolGroupIds.ct, + studyToolGroupIds.pt, + studyToolGroupIds.fusion, + ].forEach((toolGroupId) => { + const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); + + if (toolName === ZoomTool.toolName) { + // Check if viewports are initialized before setting tools + if (renderingEngine && renderingEngine.getViewports().length > 0) { + toolGroup.setToolPassive(CrosshairsTool.toolName); + } + toolGroup.setToolDisabled(WindowLevelTool.toolName); + toolGroup.setToolDisabled(RectangleROITool.toolName); + toolGroup.setToolActive(ZoomTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + } else if (toolName === WindowLevelTool.toolName) { + // Check if viewports are initialized before setting tools + if (renderingEngine && renderingEngine.getViewports().length > 0) { + toolGroup.setToolPassive(CrosshairsTool.toolName); + } + toolGroup.setToolDisabled(ZoomTool.toolName); + toolGroup.setToolDisabled(RectangleROITool.toolName); + toolGroup.setToolActive(WindowLevelTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + } else if (toolName === CrosshairsTool.toolName) { + toolGroup.setToolDisabled(ZoomTool.toolName); + toolGroup.setToolDisabled(WindowLevelTool.toolName); + toolGroup.setToolDisabled(RectangleROITool.toolName); + toolGroup.setToolActive(CrosshairsTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + } else { + toolGroup.setToolDisabled(ZoomTool.toolName); + toolGroup.setToolDisabled(WindowLevelTool.toolName); + toolGroup.setToolDisabled(CrosshairsTool.toolName); + toolGroup.setToolActive(RectangleROITool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + } + }); + }); + }, +}); + +const resizeObserver = new ResizeObserver(() => { + renderingEngine = getRenderingEngine(renderingEngineId); + + if (renderingEngine) { + renderingEngine.resize(true, false); + } +}); + +// Helper functions for crosshairs +function getReferenceLineColor(viewportId) { + return viewportColors[viewportId]; +} + +function getReferenceLineControllable(viewportId) { + return true; +} + +function getReferenceLineDraggableRotatable(viewportId) { + return true; +} + +function getReferenceLineSlabThicknessControlsOn(viewportId) { + return true; +} + +// Create viewport grid +function createViewportGrid() { + const viewportGrid = document.createElement('div'); + + viewportGrid.style.display = 'grid'; + viewportGrid.style.gridTemplateRows = `repeat(3, 33.33%)`; + viewportGrid.style.gridTemplateColumns = `repeat(12, 8.33%)`; + viewportGrid.style.width = '98vw'; + viewportGrid.style.height = '95vh'; + viewportGrid.style.gap = '2px'; + + const content = document.getElementById('content'); + content.appendChild(viewportGrid); + + // Create elements for each study + studyConfigs.forEach((config, studyIndex) => { + const studyKey = config.studyKey; + elements[studyKey] = {}; + + // Create 3x3 grid elements for each study + for (let row = 0; row < 3; row++) { + for (let col = 0; col < 3; col++) { + const element = document.createElement('div'); + element.style.width = '100%'; + element.style.height = '100%'; + element.style.border = '1px solid #333'; + element.oncontextmenu = (e) => e.preventDefault(); + + // Position in the overall grid - studies side by side + const gridRow = row + 1; + const gridColumn = studyIndex * 4 + col + 1; + element.style.gridRow = String(gridRow); + element.style.gridColumn = String(gridColumn); + + viewportGrid.appendChild(element); + resizeObserver.observe(element); + + // Store element reference + const elementKey = `element_${row + 1}_${col + 1}`; + elements[studyKey][elementKey] = element; + } + } + + // Create MIP element + const mipElement = document.createElement('div'); + mipElement.style.width = '100%'; + mipElement.style.height = '100%'; + mipElement.style.border = '1px solid #333'; + mipElement.oncontextmenu = (e) => e.preventDefault(); + + // Position MIP in the 4th column of each study, spanning 3 rows + mipElement.style.gridRow = `1 / span 3`; + mipElement.style.gridColumn = String(studyIndex * 4 + 4); + + viewportGrid.appendChild(mipElement); + resizeObserver.observe(mipElement); + elements[studyKey].element_mip = mipElement; + }); + + return viewportGrid; +} + +// Set up tool groups for a study +function setUpToolGroupsForStudy(studyKey) { + const studyToolGroupIds = toolGroupIds[studyKey]; + const studyViewportIds = viewportIds[studyKey]; + const studyVolumeIds = volumeIds[studyKey]; + + // Create tool groups + const ctToolGroup = ToolGroupManager.createToolGroup(studyToolGroupIds.ct); + const ptToolGroup = ToolGroupManager.createToolGroup(studyToolGroupIds.pt); + const fusionToolGroup = ToolGroupManager.createToolGroup( + studyToolGroupIds.fusion + ); + const mipToolGroup = ToolGroupManager.createToolGroup(studyToolGroupIds.mip); + + // Add viewports to tool groups + ctToolGroup.addViewport(studyViewportIds.CT.AXIAL, renderingEngineId); + ctToolGroup.addViewport(studyViewportIds.CT.SAGITTAL, renderingEngineId); + ctToolGroup.addViewport(studyViewportIds.CT.CORONAL, renderingEngineId); + + ptToolGroup.addViewport(studyViewportIds.PT.AXIAL, renderingEngineId); + ptToolGroup.addViewport(studyViewportIds.PT.SAGITTAL, renderingEngineId); + ptToolGroup.addViewport(studyViewportIds.PT.CORONAL, renderingEngineId); + + fusionToolGroup.addViewport(studyViewportIds.FUSION.AXIAL, renderingEngineId); + fusionToolGroup.addViewport( + studyViewportIds.FUSION.SAGITTAL, + renderingEngineId + ); + fusionToolGroup.addViewport( + studyViewportIds.FUSION.CORONAL, + renderingEngineId + ); + + // Add tools to CT and PT groups + [ctToolGroup, ptToolGroup].forEach((toolGroup) => { + toolGroup.addTool(WindowLevelTool.toolName); + toolGroup.addTool(PanTool.toolName); + toolGroup.addTool(ZoomTool.toolName); + toolGroup.addTool(StackScrollTool.toolName); + toolGroup.addTool(CrosshairsTool.toolName, { + getReferenceLineColor, + getReferenceLineControllable, + getReferenceLineDraggableRotatable, + getReferenceLineSlabThicknessControlsOn, + }); + toolGroup.addTool(RectangleROITool.toolName); + }); + + // Add tools to fusion group + fusionToolGroup.addTool(WindowLevelTool.toolName); + fusionToolGroup.addTool(PanTool.toolName); + fusionToolGroup.addTool(ZoomTool.toolName); + fusionToolGroup.addTool(StackScrollTool.toolName); + fusionToolGroup.addTool(CrosshairsTool.toolName, { + getReferenceLineColor, + getReferenceLineControllable, + getReferenceLineDraggableRotatable, + getReferenceLineSlabThicknessControlsOn, + filterActorUIDsToSetSlabThickness: [studyVolumeIds.ct], + }); + fusionToolGroup.addTool(RectangleROITool.toolName); + + // Set active tools + [ctToolGroup, ptToolGroup, fusionToolGroup].forEach((toolGroup) => { + toolGroup.setToolActive(ZoomTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + toolGroup.setToolActive(PanTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Auxiliary }], + }); + toolGroup.setToolActive(WindowLevelTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Secondary }], + }); + toolGroup.setToolActive(StackScrollTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Wheel }], + }); + // Don't set CrosshairsTool to passive here - do it after viewports are created + }); + + // MIP Tool Group + mipToolGroup.addTool(VolumeRotateTool.toolName); + mipToolGroup.setToolActive(VolumeRotateTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Wheel }], + }); + mipToolGroup.addTool(MIPJumpToClickTool.toolName, { + toolGroupId: studyToolGroupIds.pt, + }); + mipToolGroup.setToolActive(MIPJumpToClickTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + mipToolGroup.addViewport(studyViewportIds.PETMIP.CORONAL, renderingEngineId); +} + +// Set up synchronizers for a study +function setUpSynchronizersForStudy(studyKey) { + const studySynchronizerIds = synchronizerIds[studyKey]; + const studyViewportIds = viewportIds[studyKey]; + + // Create synchronizers + const axialCameraSync = createCameraPositionSynchronizer( + studySynchronizerIds.axialCamera + ); + const sagittalCameraSync = createCameraPositionSynchronizer( + studySynchronizerIds.sagittalCamera + ); + const coronalCameraSync = createCameraPositionSynchronizer( + studySynchronizerIds.coronalCamera + ); + const ctVoiSync = createVOISynchronizer(studySynchronizerIds.ctVoi, { + syncInvertState: false, + syncColormap: false, + }); + const ptVoiSync = createVOISynchronizer(studySynchronizerIds.ptVoi, { + syncInvertState: false, + syncColormap: false, + }); + const fusionVoiSync = createVOISynchronizer(studySynchronizerIds.fusionVoi, { + syncInvertState: false, + syncColormap: false, + }); + + // Store synchronizers + allSynchronizers[studyKey] = { + axialCamera: axialCameraSync, + sagittalCamera: sagittalCameraSync, + coronalCamera: coronalCameraSync, + ctVoi: ctVoiSync, + ptVoi: ptVoiSync, + fusionVoi: fusionVoiSync, + }; + + // Add viewports to camera synchronizers + [ + studyViewportIds.CT.AXIAL, + studyViewportIds.PT.AXIAL, + studyViewportIds.FUSION.AXIAL, + ].forEach((viewportId) => { + axialCameraSync.add({ renderingEngineId, viewportId }); + }); + + [ + studyViewportIds.CT.SAGITTAL, + studyViewportIds.PT.SAGITTAL, + studyViewportIds.FUSION.SAGITTAL, + ].forEach((viewportId) => { + sagittalCameraSync.add({ renderingEngineId, viewportId }); + }); + + [ + studyViewportIds.CT.CORONAL, + studyViewportIds.PT.CORONAL, + studyViewportIds.FUSION.CORONAL, + ].forEach((viewportId) => { + coronalCameraSync.add({ renderingEngineId, viewportId }); + }); + + // Add viewports to VOI synchronizers + [ + studyViewportIds.CT.AXIAL, + studyViewportIds.CT.SAGITTAL, + studyViewportIds.CT.CORONAL, + ].forEach((viewportId) => { + ctVoiSync.add({ renderingEngineId, viewportId }); + }); + + [ + studyViewportIds.PT.AXIAL, + studyViewportIds.PT.SAGITTAL, + studyViewportIds.PT.CORONAL, + studyViewportIds.PETMIP.CORONAL, + ].forEach((viewportId) => { + ptVoiSync.add({ renderingEngineId, viewportId }); + }); + + [ + studyViewportIds.FUSION.AXIAL, + studyViewportIds.FUSION.SAGITTAL, + studyViewportIds.FUSION.CORONAL, + ].forEach((viewportId) => { + fusionVoiSync.add({ renderingEngineId, viewportId }); + ctVoiSync.addTarget({ renderingEngineId, viewportId }); + ptVoiSync.addTarget({ renderingEngineId, viewportId }); + }); +} + +// Initialize camera synchronization +function initCameraSynchronization(sViewport, tViewport) { + const camera = sViewport.getCamera(); + tViewport.setCamera(camera); +} + +// Initialize camera sync for a study +function initializeCameraSyncForStudy(studyKey) { + const studyViewportIds = viewportIds[studyKey]; + + const axialCtViewport = renderingEngine.getViewport( + studyViewportIds.CT.AXIAL + ); + const sagittalCtViewport = renderingEngine.getViewport( + studyViewportIds.CT.SAGITTAL + ); + const coronalCtViewport = renderingEngine.getViewport( + studyViewportIds.CT.CORONAL + ); + + const axialPtViewport = renderingEngine.getViewport( + studyViewportIds.PT.AXIAL + ); + const sagittalPtViewport = renderingEngine.getViewport( + studyViewportIds.PT.SAGITTAL + ); + const coronalPtViewport = renderingEngine.getViewport( + studyViewportIds.PT.CORONAL + ); + + const axialFusionViewport = renderingEngine.getViewport( + studyViewportIds.FUSION.AXIAL + ); + const sagittalFusionViewport = renderingEngine.getViewport( + studyViewportIds.FUSION.SAGITTAL + ); + const coronalFusionViewport = renderingEngine.getViewport( + studyViewportIds.FUSION.CORONAL + ); + + initCameraSynchronization(axialFusionViewport, axialCtViewport); + initCameraSynchronization(axialFusionViewport, axialPtViewport); + + initCameraSynchronization(sagittalFusionViewport, sagittalCtViewport); + initCameraSynchronization(sagittalFusionViewport, sagittalPtViewport); + + initCameraSynchronization(coronalFusionViewport, coronalCtViewport); + initCameraSynchronization(coronalFusionViewport, coronalPtViewport); +} + +// Load image IDs for a study +async function getImageIdsForStudy(config) { + const ctImageIds = await createImageIdsAndCacheMetaData({ + StudyInstanceUID: config.studyId, + SeriesInstanceUID: config.ctSeriesUID, + wadoRsRoot, + }); + + const ptImageIds = await createImageIdsAndCacheMetaData({ + StudyInstanceUID: config.studyId, + SeriesInstanceUID: config.ptSeriesUID, + wadoRsRoot, + }); + + return { ctImageIds, ptImageIds }; +} + +// Create viewport input array for a study +function createViewportInputArrayForStudy(config, studyIndex) { + const studyKey = config.studyKey; + const studyElements = elements[studyKey]; + const studyViewportIds = viewportIds[studyKey]; + + // Create viewport input array + const viewportInputArray = [ + { + viewportId: studyViewportIds.CT.AXIAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_1_1, + defaultOptions: { + orientation: Enums.OrientationAxis.AXIAL, + }, + }, + { + viewportId: studyViewportIds.CT.SAGITTAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_1_2, + defaultOptions: { + orientation: Enums.OrientationAxis.SAGITTAL, + }, + }, + { + viewportId: studyViewportIds.CT.CORONAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_1_3, + defaultOptions: { + orientation: Enums.OrientationAxis.CORONAL, + }, + }, + { + viewportId: studyViewportIds.PT.AXIAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_2_1, + defaultOptions: { + orientation: Enums.OrientationAxis.AXIAL, + background: [1, 1, 1], + }, + }, + { + viewportId: studyViewportIds.PT.SAGITTAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_2_2, + defaultOptions: { + orientation: Enums.OrientationAxis.SAGITTAL, + background: [1, 1, 1], + }, + }, + { + viewportId: studyViewportIds.PT.CORONAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_2_3, + defaultOptions: { + orientation: Enums.OrientationAxis.CORONAL, + background: [1, 1, 1], + }, + }, + { + viewportId: studyViewportIds.FUSION.AXIAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_3_1, + defaultOptions: { + orientation: Enums.OrientationAxis.AXIAL, + }, + }, + { + viewportId: studyViewportIds.FUSION.SAGITTAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_3_2, + defaultOptions: { + orientation: Enums.OrientationAxis.SAGITTAL, + }, + }, + { + viewportId: studyViewportIds.FUSION.CORONAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_3_3, + defaultOptions: { + orientation: Enums.OrientationAxis.CORONAL, + }, + }, + { + viewportId: studyViewportIds.PETMIP.CORONAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_mip, + defaultOptions: { + orientation: Enums.OrientationAxis.CORONAL, + background: [1, 1, 1], + }, + }, + ]; + + return viewportInputArray; +} + +// Set up display for a study +async function setUpDisplayForStudy(config, studyIndex) { + const studyKey = config.studyKey; + const studyViewportIds = viewportIds[studyKey]; + const studyVolumeIds = volumeIds[studyKey]; + + // Set volumes on the viewports + await setVolumesForViewports( + renderingEngine, + [ + { + volumeId: studyVolumeIds.ct, + callback: setCtTransferFunctionForVolumeActor, + }, + ], + [ + studyViewportIds.CT.AXIAL, + studyViewportIds.CT.SAGITTAL, + studyViewportIds.CT.CORONAL, + ] + ); + + await setVolumesForViewports( + renderingEngine, + [ + { + volumeId: studyVolumeIds.pt, + callback: setPetTransferFunctionForVolumeActor, + }, + ], + [ + studyViewportIds.PT.AXIAL, + studyViewportIds.PT.SAGITTAL, + studyViewportIds.PT.CORONAL, + ] + ); + + await setVolumesForViewports( + renderingEngine, + [ + { + volumeId: studyVolumeIds.ct, + callback: setCtTransferFunctionForVolumeActor, + }, + { + volumeId: studyVolumeIds.pt, + callback: setPetColorMapTransferFunctionForVolumeActor, + }, + ], + [ + studyViewportIds.FUSION.AXIAL, + studyViewportIds.FUSION.SAGITTAL, + studyViewportIds.FUSION.CORONAL, + ] + ); + + // Set up MIP + const ptVolume = volumes[studyKey].pt; + const ptVolumeDimensions = ptVolume.dimensions; + + const slabThickness = Math.sqrt( + ptVolumeDimensions[0] * ptVolumeDimensions[0] + + ptVolumeDimensions[1] * ptVolumeDimensions[1] + + ptVolumeDimensions[2] * ptVolumeDimensions[2] + ); + + await setVolumesForViewports( + renderingEngine, + [ + { + volumeId: studyVolumeIds.pt, + callback: setPetTransferFunctionForVolumeActor, + blendMode: BlendModes.MAXIMUM_INTENSITY_BLEND, + slabThickness, + }, + ], + [studyViewportIds.PETMIP.CORONAL] + ); + + initializeCameraSyncForStudy(studyKey); +} + +// Set crosshairs to passive after viewports are set up +function setCrosshairsToPassive() { + studyConfigs.forEach((config) => { + const studyKey = config.studyKey; + const studyToolGroupIds = toolGroupIds[studyKey]; + + [ + studyToolGroupIds.ct, + studyToolGroupIds.pt, + studyToolGroupIds.fusion, + ].forEach((toolGroupId) => { + const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); + if (toolGroup) { + toolGroup.setToolPassive(CrosshairsTool.toolName); + } + }); + }); +} + +/** + * Runs the demo + */ +async function run() { + // Init Cornerstone and related libraries + await initDemo(); + + // Add tools to Cornerstone3D + cornerstoneTools.addTool(WindowLevelTool); + cornerstoneTools.addTool(PanTool); + cornerstoneTools.addTool(ZoomTool); + cornerstoneTools.addTool(StackScrollTool); + cornerstoneTools.addTool(MIPJumpToClickTool); + cornerstoneTools.addTool(CrosshairsTool); + cornerstoneTools.addTool(TrackballRotateTool); + cornerstoneTools.addTool(VolumeRotateTool); + cornerstoneTools.addTool(RectangleROITool); + + // Instantiate a rendering engine + renderingEngine = new RenderingEngine(renderingEngineId); + + // Create viewport grid + createViewportGrid(); + + // Load all volumes and set up displays + for (const config of studyConfigs) { + const studyKey = config.studyKey; + + // Get image IDs + const { ctImageIds, ptImageIds } = await getImageIdsForStudy(config); + + // Create and cache volumes + volumes[studyKey].ct = await volumeLoader.createAndCacheVolume( + volumeIds[studyKey].ct, + { imageIds: ctImageIds } + ); + volumes[studyKey].pt = await volumeLoader.createAndCacheVolume( + volumeIds[studyKey].pt, + { imageIds: ptImageIds } + ); + + // Load volumes + volumes[studyKey].ct.load(); + volumes[studyKey].pt.load(); + } + + // Set up tool groups and synchronizers for each study + for (const config of studyConfigs) { + const studyKey = config.studyKey; + setUpToolGroupsForStudy(studyKey); + setUpSynchronizersForStudy(studyKey); + } + + // Collect all viewport configurations + const allViewportInputs = []; + for (let i = 0; i < studyConfigs.length; i++) { + const viewportInputs = createViewportInputArrayForStudy(studyConfigs[i], i); + allViewportInputs.push(...viewportInputs); + } + + // Set all viewports at once + renderingEngine.setViewports(allViewportInputs); + + // Set up displays for all studies + for (let i = 0; i < studyConfigs.length; i++) { + await setUpDisplayForStudy(studyConfigs[i], i); + } + + // Set crosshairs to passive after all viewports are initialized + setCrosshairsToPassive(); + + // Render all viewports + renderingEngine.render(); +} + +run(); diff --git a/packages/core/examples/sequentialrenderingengine/index.ts b/packages/core/examples/sequentialrenderingengine/index.ts new file mode 100644 index 0000000000..1e8a3e1d95 --- /dev/null +++ b/packages/core/examples/sequentialrenderingengine/index.ts @@ -0,0 +1,182 @@ +import type { Types } from '@cornerstonejs/core'; +import { + Enums, + getRenderingEngine, + RenderingEngine, +} from '@cornerstonejs/core'; +import { + initDemo, + createImageIdsAndCacheMetaData, + setTitleAndDescription, + ctVoiRange, +} from '../../../../utils/demo/helpers'; + +const { ViewportType } = Enums; + +// ======== Set up page ======== // +const params = new URLSearchParams(window.location.search); + +const rows = parseInt(params.get('rows')) || 6; +const columns = parseInt(params.get('columns')) || 6; +const count = rows * columns; + +setTitleAndDescription( + `${columns}x${rows} Grid with SequentialRenderingEngine`, + `Displays a ${columns}x${rows} grid of viewports using SequentialRenderingEngine with resize observer` +); + +const renderingEngineId = 'mySequentialRenderingEngine'; +let renderingEngine: RenderingEngine; +let resizeTimeout: number; + +// Debounced resize handler +const handleResize = () => { + clearTimeout(resizeTimeout); + resizeTimeout = window.setTimeout(() => { + renderingEngine = getRenderingEngine(renderingEngineId); + + if (renderingEngine) { + renderingEngine.resize(true, false); + } + }, 50); // 50ms debounce +}; + +// Set up ResizeObserver for dynamic resizing +const resizeObserver = new ResizeObserver(handleResize); + +const content = document.getElementById('content'); + +// Create viewport container using flexbox +const viewportContainer = document.createElement('div'); +viewportContainer.id = 'viewportContainer'; +viewportContainer.style.display = 'flex'; +viewportContainer.style.flexDirection = 'column'; +viewportContainer.style.width = '95vw'; +viewportContainer.style.height = '90vh'; +viewportContainer.style.backgroundColor = 'darkred'; +viewportContainer.style.gap = '2px'; + +content.appendChild(viewportContainer); + +// Create rows*columns viewport elements +const elements: HTMLDivElement[] = []; +const viewportIds: string[] = []; + +// Create rows and columns +for (let row = 0; row < rows; row++) { + const rowContainer = document.createElement('div'); + rowContainer.style.display = 'flex'; + rowContainer.style.flexDirection = 'row'; + rowContainer.style.flex = '1'; + rowContainer.style.width = '100%'; + rowContainer.style.gap = '2px'; + + for (let col = 0; col < columns; col++) { + const element = document.createElement('div'); + element.style.flex = '1'; + element.style.position = 'relative'; + element.style.overflow = 'hidden'; + element.style.background = '#1a1a1a'; + element.style.minWidth = '0'; + element.style.minHeight = '0'; + + // Disable right click context menu + element.oncontextmenu = (e) => e.preventDefault(); + + // Add to row + rowContainer.appendChild(element); + + // Store element and create viewport ID + elements.push(element); + viewportIds.push(`viewport_${row}_${col}`); + + // Observe element for resizing + resizeObserver.observe(element); + } + + viewportContainer.appendChild(rowContainer); +} + +/** + * Runs the demo + */ +async function run() { + // Init Cornerstone and related libraries + await initDemo(); + + // Get Cornerstone imageIds and fetch metadata into RAM + const imageIds = await createImageIdsAndCacheMetaData({ + StudyInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.334240657131972136850343327463', + SeriesInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.226151125820845824875394858561', + wadoRsRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', + }); + + // Instantiate a SequentialRenderingEngine + renderingEngine = new RenderingEngine(renderingEngineId); + + // Create viewport input array for all 36 viewports + const viewportInputArray: Types.PublicViewportInput[] = []; + + for (let i = 0; i < count; i++) { + viewportInputArray.push({ + viewportId: viewportIds[i], + type: ViewportType.STACK, + element: elements[i], + defaultOptions: { + background: [0.1, 0.1, 0.1] as Types.Point3, + }, + }); + } + + // Set all viewports at once + renderingEngine.setViewports(viewportInputArray); + + // Prepare stacks for each viewport + // We'll display different images from the series in each viewport + const numImages = imageIds.length; + const imagesPerViewport = Math.max(1, Math.floor(numImages / count)); + + // Set stack and render for each viewport + for (let i = 0; i < count; i++) { + const viewport = renderingEngine.getViewport( + viewportIds[i] + ) as Types.IStackViewport; + + // Calculate which image to show + const imageIndex = Math.min(i * imagesPerViewport, numImages - 1); + const stack = [imageIds[imageIndex]]; + + // Set the stack on the viewport + await viewport.setStack(stack); + + // Set the VOI of the stack + viewport.setProperties({ voiRange: ctVoiRange }); + } + + // Render all viewports + renderingEngine.render(); + + // Add performance info + if (!window.IS_PLAYWRIGHT) { + const info = document.createElement('div'); + info.style.position = 'absolute'; + info.style.top = '10px'; + info.style.right = '10px'; + info.style.color = 'white'; + info.style.backgroundColor = 'rgba(0,0,0,0.7)'; + info.style.padding = '10px'; + info.style.borderRadius = '5px'; + info.innerHTML = ` +

SequentialRenderingEngine Example

+

${count} viewports (${columns}x${rows} grid)

+

Using SequentialRenderingEngine for better performance with large viewport counts

+

Resize the window to test resize observer

+

Avoids WebGL, browser and OS limits

+ `; + content.appendChild(info); + } +} + +run(); diff --git a/packages/core/src/RenderingEngine/BaseRenderingEngine.ts b/packages/core/src/RenderingEngine/BaseRenderingEngine.ts new file mode 100644 index 0000000000..9778c4c768 --- /dev/null +++ b/packages/core/src/RenderingEngine/BaseRenderingEngine.ts @@ -0,0 +1,832 @@ +import Events from '../enums/Events'; +import renderingEngineCache from './renderingEngineCache'; +import eventTarget from '../eventTarget'; +import uuidv4 from '../utilities/uuidv4'; +import triggerEvent from '../utilities/triggerEvent'; +import { vtkOffscreenMultiRenderWindow } from './vtkClasses'; +import ViewportType from '../enums/ViewportType'; +import BaseVolumeViewport from './BaseVolumeViewport'; +import StackViewport from './StackViewport'; +import viewportTypeUsesCustomRenderingPipeline from './helpers/viewportTypeUsesCustomRenderingPipeline'; +import getOrCreateCanvas from './helpers/getOrCreateCanvas'; +import { getShouldUseCPURendering, isCornerstoneInitialized } from '../init'; +import type IStackViewport from '../types/IStackViewport'; +import type IVolumeViewport from '../types/IVolumeViewport'; +import viewportTypeToViewportClass from './helpers/viewportTypeToViewportClass'; + +import type * as EventTypes from '../types/EventTypes'; +import type { + PublicViewportInput, + InternalViewportInput, + NormalizedViewportInput, + IViewport, +} from '../types/IViewport'; +import { OrientationAxis } from '../enums'; + +// Rendering engines seem to not like rendering things less than 2 pixels per side +export const VIEWPORT_MIN_SIZE = 2; + +/** + * Base class for rendering engines that handle viewport rendering. + * This abstract class provides the common functionality shared between + * different rendering strategies + * + * @abstract + */ +abstract class BaseRenderingEngine { + /** Unique identifier for renderingEngine */ + readonly id: string; + /** A flag which tells if the renderingEngine has been destroyed or not */ + public hasBeenDestroyed: boolean; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public offscreenMultiRenderWindow: any; + readonly offScreenCanvasContainer: HTMLDivElement; + protected _viewports: Map; + protected _needsRender = new Set(); + protected _animationFrameSet = false; + protected _animationFrameHandle: number | null = null; + protected useCPURendering: boolean; + + /** + * @param uid - Unique identifier for RenderingEngine + */ + constructor(id?: string) { + this.id = id ? id : uuidv4(); + this.useCPURendering = getShouldUseCPURendering(); + + renderingEngineCache.set(this); + + if (!isCornerstoneInitialized()) { + throw new Error( + '@cornerstonejs/core is not initialized, run init() first' + ); + } + + if (!this.useCPURendering) { + this.offscreenMultiRenderWindow = + vtkOffscreenMultiRenderWindow.newInstance(); + this.offScreenCanvasContainer = document.createElement('div'); + this.offscreenMultiRenderWindow.setContainer( + this.offScreenCanvasContainer + ); + } + + this._viewports = new Map(); + this.hasBeenDestroyed = false; + } + + /** + * Enables the requested viewport and add it to the viewports. It will + * properly create the Stack viewport or Volume viewport: + * + * 1) Checks if the viewport is defined already, if yes, remove it first + * 2) Checks if the viewport is using a custom rendering pipeline, if no, + * it calculates a new offscreen canvas with the new requested viewport + * 3) Adds the viewport + * + * + * ``` + * renderingEngine.enableElement({ + * viewportId: viewportId, + * type: ViewportType.ORTHOGRAPHIC, + * element, + * defaultOptions: { + * orientation: Enums.OrientationAxis.AXIAL, + * background: [1, 0, 1], + * }, + * }) + * ``` + * + * fires Events.ELEMENT_ENABLED + * + * @param viewportInputEntry - viewport specifications + */ + public enableElement(viewportInputEntry: PublicViewportInput): void { + const viewportInput = this._normalizeViewportInputEntry(viewportInputEntry); + + this._throwIfDestroyed(); + const { element, viewportId } = viewportInput; + + // Throw error if no canvas + if (!element) { + throw new Error('No element provided'); + } + + // 1. Get the viewport from the list of available viewports. + const viewport = this.getViewport(viewportId); + + // 1.a) If there is a found viewport, we remove the viewport and create a new viewport + if (viewport) { + this.disableElement(viewportId); + } + + // 2.a) See if viewport uses a custom rendering pipeline. + const { type } = viewportInput; + + const viewportUsesCustomRenderingPipeline = + viewportTypeUsesCustomRenderingPipeline(type); + + // 2.b) Retrieving the list of viewports for calculation of the new size for + // offScreen canvas. + + // If the viewport being added uses a custom pipeline, or we aren't using + // GPU rendering, we don't need to resize the offscreen canvas. + if (!this.useCPURendering && !viewportUsesCustomRenderingPipeline) { + this.enableVTKjsDrivenViewport(viewportInput); + } else { + // 3 Add the requested viewport to rendering Engine + this.addCustomViewport(viewportInput); + } + + // 5. Set the background color for the canvas + const canvas = getOrCreateCanvas(element); + const { background } = viewportInput.defaultOptions; + this.fillCanvasWithBackgroundColor(canvas, background); + } + + /** + * Disables the requested viewportId from the rendering engine: + * + * 1) It removes the viewport from the the list of viewports + * 2) remove the renderer from the offScreen render window if using vtk.js driven + * rendering pipeline + * 3) resetting the viewport to remove the canvas attributes and canvas data + * 4) resize the offScreen appropriately (if using vtk.js driven rendering pipeline) + * + * fires Events.ELEMENT_ENABLED + * + * @param viewportId - viewport Id + * + */ + public disableElement(viewportId: string): void { + this._throwIfDestroyed(); + // 1. Getting the viewport to remove it + const viewport = this.getViewport(viewportId); + + // 2 To throw if there is no viewport stored in rendering engine + if (!viewport) { + console.warn(`viewport ${viewportId} does not exist`); + return; + } + + // 3. Reset the viewport to remove attributes, and reset the canvas + this._resetViewport(viewport); + + // 4. Remove the related renderer from the offScreenMultiRenderWindow + if ( + !viewportTypeUsesCustomRenderingPipeline(viewport.type) && + !this.useCPURendering + ) { + this.offscreenMultiRenderWindow.removeRenderer(viewportId); + } + + // 5. Remove the requested viewport from the rendering engine + this._removeViewport(viewportId); + viewport.isDisabled = true; + + // 6. Avoid rendering for the disabled viewport + this._needsRender.delete(viewportId); + + // 7. Clear RAF if no viewport is left + const viewports = this.getViewports(); + if (!viewports.length) { + this._clearAnimationFrame(); + } + + // Note: we should not call resize at the end of here, the reason is that + // in batch rendering, we might disable a viewport and enable others at the same + // time which would interfere with each other. So we just let the enable + // to call resize, and also resize getting called by applications on the + // DOM resize event. + } + + /** + * It takes an array of viewport input objects including element, viewportId, type + * and defaultOptions. It will add the viewport to the rendering engine and enables them. + * + * + * ```typescript + *renderingEngine.setViewports([ + * { + * viewportId: axialViewportId, + * type: ViewportType.ORTHOGRAPHIC, + * element: document.getElementById('axialDiv'), + * defaultOptions: { + * orientation: Enums.OrientationAxis.AXIAL, + * }, + * }, + * { + * viewportId: sagittalViewportId, + * type: ViewportType.ORTHOGRAPHIC, + * element: document.getElementById('sagittalDiv'), + * defaultOptions: { + * orientation: Enums.OrientationAxis.SAGITTAL, + * }, + * }, + * { + * viewportId: customOrientationViewportId, + * type: ViewportType.ORTHOGRAPHIC, + * element: document.getElementById('customOrientationDiv'), + * defaultOptions: { + * orientation: { viewPlaneNormal: [0, 0, 1], viewUp: [0, 1, 0] }, + * }, + * }, + * ]) + * ``` + * + * fires Events.ELEMENT_ENABLED + * + * @param viewportInputEntries - Array + */ + + public setViewports(publicViewportInputEntries: PublicViewportInput[]): void { + const viewportInputEntries = this._normalizeViewportInputEntries( + publicViewportInputEntries + ); + this._throwIfDestroyed(); + this._reset(); + + // 1. Split viewports based on whether they use vtk.js or a custom pipeline. + + const vtkDrivenViewportInputEntries: NormalizedViewportInput[] = []; + const customRenderingViewportInputEntries: NormalizedViewportInput[] = []; + + viewportInputEntries.forEach((vpie) => { + if ( + !this.useCPURendering && + !viewportTypeUsesCustomRenderingPipeline(vpie.type) + ) { + vtkDrivenViewportInputEntries.push(vpie); + } else { + customRenderingViewportInputEntries.push(vpie); + } + }); + + this.setVtkjsDrivenViewports(vtkDrivenViewportInputEntries); + this.setCustomViewports(customRenderingViewportInputEntries); + + // Making sure the setViewports api also can fill the canvas + // properly + viewportInputEntries.forEach((vp) => { + const canvas = getOrCreateCanvas(vp.element); + const { background } = vp.defaultOptions; + this.fillCanvasWithBackgroundColor(canvas, background); + }); + } + + /** + * Resizes the offscreen viewport and recalculates translations to on screen canvases. + * It is up to the parent app to call the resize of the on-screen canvas changes. + * This is left as an app level concern as one might want to debounce the changes, or the like. + * + * @param immediate - Whether all of the viewports should be rendered immediately. + * @param keepCamera - Whether to keep the camera for other viewports while resizing the offscreen canvas + */ + public resize(immediate = true, keepCamera = true): void { + this._throwIfDestroyed(); + // 1. Get the viewports' canvases + const viewports = this._getViewportsAsArray(); + + const vtkDrivenViewports = []; + const customRenderingViewports = []; + + viewports.forEach((vpie) => { + if (!viewportTypeUsesCustomRenderingPipeline(vpie.type)) { + vtkDrivenViewports.push(vpie); + } else { + customRenderingViewports.push(vpie); + } + }); + + if (vtkDrivenViewports.length) { + this._resizeVTKViewports(vtkDrivenViewports, keepCamera, immediate); + } + + if (customRenderingViewports.length) { + this._resizeUsingCustomResizeHandler( + customRenderingViewports, + keepCamera, + immediate + ); + } + } + + /** + * Returns the viewport by Id + * + * @returns viewport + */ + public getViewport(viewportId: string): IViewport { + return this._viewports?.get(viewportId); + } + + /** + * getViewports Returns an array of all `Viewport`s on the `RenderingEngine` instance. + * + * @returns Array of viewports + */ + public getViewports(): IViewport[] { + this._throwIfDestroyed(); + + return this._getViewportsAsArray(); + } + + /** + * Retrieves a stack viewport by its ID. used just for type safety + * + * @param viewportId - The ID of the viewport to retrieve. + * @returns The stack viewport with the specified ID. + * @throws Error if the viewport with the given ID does not exist or is not a StackViewport. + */ + public getStackViewport(viewportId: string): IStackViewport { + this._throwIfDestroyed(); + + const viewport = this.getViewport(viewportId); + + if (!viewport) { + throw new Error(`Viewport with Id ${viewportId} does not exist`); + } + + if (!(viewport instanceof StackViewport)) { + throw new Error(`Viewport with Id ${viewportId} is not a StackViewport.`); + } + + return viewport; + } + + /** + * Filters all the available viewports and return the stack viewports + * @returns stack viewports registered on the rendering Engine + */ + public getStackViewports(): IStackViewport[] { + this._throwIfDestroyed(); + + const viewports = this.getViewports(); + + return viewports.filter( + (vp) => vp instanceof StackViewport + ) as IStackViewport[]; + } + /** + * Return all the viewports that are volume viewports + * @returns An array of VolumeViewport objects. + */ + public getVolumeViewports(): IVolumeViewport[] { + this._throwIfDestroyed(); + + const viewports = this.getViewports(); + + const isVolumeViewport = ( + viewport: IViewport + ): viewport is BaseVolumeViewport => { + return viewport instanceof BaseVolumeViewport; + }; + + return viewports.filter(isVolumeViewport) as IVolumeViewport[]; + } + + /** + * Renders all viewports on the next animation frame. + * + * fires Events.IMAGE_RENDERED + */ + public render(): void { + const viewports = this.getViewports(); + const viewportIds = viewports.map((vp) => vp.id); + + this._setViewportsToBeRenderedNextFrame(viewportIds); + } + + /** + * Renders any viewports viewing the given Frame Of Reference. + * + * @param FrameOfReferenceUID - The unique identifier of the + * Frame Of Reference. + */ + public renderFrameOfReference = (FrameOfReferenceUID: string): void => { + const viewports = this._getViewportsAsArray(); + const viewportIdsWithSameFrameOfReferenceUID = viewports.map((vp) => { + if (vp.getFrameOfReferenceUID() === FrameOfReferenceUID) { + return vp.id; + } + }); + + this.renderViewports(viewportIdsWithSameFrameOfReferenceUID); + }; + + /** + * Renders the provided Viewport IDs. + * + */ + public renderViewports(viewportIds: string[]): void { + this._setViewportsToBeRenderedNextFrame(viewportIds); + } + + /** + * Renders only a specific `Viewport` on the next animation frame. + * + * @param viewportId - The Id of the viewport. + */ + public renderViewport(viewportId: string): void { + this._setViewportsToBeRenderedNextFrame([viewportId]); + } + + /** + * destroy the rendering engine. It will remove all the viewports and, + * if the rendering engine is using the GPU, it will also destroy the GPU + * resources. + */ + public destroy(): void { + if (this.hasBeenDestroyed) { + return; + } + + // remove vtk rendered first before resetting the viewport + if (!this.useCPURendering) { + const viewports = this._getViewportsAsArray(); + viewports.forEach((vp) => { + this.offscreenMultiRenderWindow.removeRenderer(vp.id); + }); + + // Free up WebGL resources + this.offscreenMultiRenderWindow.delete(); + + // Make sure all references go stale and are garbage collected. + delete this.offscreenMultiRenderWindow; + } + + this._reset(); + renderingEngineCache.delete(this.id); + + this.hasBeenDestroyed = true; + } + + /** + * Fill the canvas with the background color + * @param canvas - The canvas element to draw on. + * @param backgroundColor - An array of three numbers between 0 and 1 that + * specify the red, green, and blue values of the background color. + */ + public fillCanvasWithBackgroundColor( + canvas: HTMLCanvasElement, + backgroundColor: [number, number, number] + ): void { + const ctx = canvas.getContext('2d'); + + // Default to black if no background color is set + let fillStyle: string; + if (backgroundColor) { + const rgb = backgroundColor.map((f) => Math.floor(255 * f)); + fillStyle = `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`; + } else { + fillStyle = 'black'; + } + + // We draw over the previous stack with the background color while we + // wait for the next stack to load + ctx.fillStyle = fillStyle; + ctx.fillRect(0, 0, canvas.width, canvas.height); + } + + private _normalizeViewportInputEntry( + viewportInputEntry: PublicViewportInput + ) { + const { type, defaultOptions } = viewportInputEntry; + let options = defaultOptions; + + if (!options || Object.keys(options).length === 0) { + options = { + background: [0, 0, 0], + orientation: null, + displayArea: null, + }; + + if (type === ViewportType.ORTHOGRAPHIC) { + options = { + ...options, + orientation: OrientationAxis.AXIAL, + }; + } + } + + return { + ...viewportInputEntry, + defaultOptions: options, + }; + } + + private _normalizeViewportInputEntries( + viewportInputEntries: PublicViewportInput[] + ): NormalizedViewportInput[] { + const normalizedViewportInputs = []; + + viewportInputEntries.forEach((viewportInput) => { + normalizedViewportInputs.push( + this._normalizeViewportInputEntry(viewportInput) + ); + }); + + return normalizedViewportInputs; + } + + private _resizeUsingCustomResizeHandler( + customRenderingViewports: StackViewport[], + keepCamera = true, + immediate = true + ) { + // 1. If viewport has a custom resize method, call it here. + customRenderingViewports.forEach((vp) => { + if (typeof vp.resize === 'function') { + vp.resize(); + } + }); + + // 3. Reset viewport cameras + customRenderingViewports.forEach((vp) => { + const prevCamera = vp.getCamera(); + vp.resetCamera(); + + if (keepCamera) { + vp.setCamera(prevCamera); + } + }); + + // 2. If render is immediate: Render all + if (immediate) { + this.render(); + } + } + + /** + * Disables the requested viewportId from the rendering engine: + * 1) It removes the viewport from the the list of viewports + * 2) remove the renderer from the offScreen render window + * 3) resetting the viewport to remove the canvas attributes and canvas data + * 4) resize the offScreen appropriately + * + * @param viewportId - viewport Id + * + */ + private _removeViewport(viewportId: string): void { + // 1. Get the viewport + const viewport = this.getViewport(viewportId); + if (!viewport) { + console.warn(`viewport ${viewportId} does not exist`); + return; + } + + // 2. Delete the viewports from the the viewports + this._viewports.delete(viewportId); + } + + /** + * Adds a viewport using a custom rendering pipeline to the `RenderingEngine`. + * + * @param viewportInputEntry - Information object used to + * construct and enable the viewport. + */ + private addCustomViewport(viewportInputEntry: PublicViewportInput): void { + const { element, viewportId, type, defaultOptions } = viewportInputEntry; + + // Make the element not focusable, we use this for modifier keys to work + element.tabIndex = -1; + + const canvas = getOrCreateCanvas(element); + + // Add a viewport with no offset + const { clientWidth, clientHeight } = canvas; + + // Set the canvas to be same resolution as the client. + // Note: This ignores devicePixelRatio for now. We may want to change it in the + // future but it has no benefit for the Cornerstone CPU rendering pathway at the + // moment anyway. + if (canvas.width !== clientWidth || canvas.height !== clientHeight) { + canvas.width = clientWidth; + canvas.height = clientHeight; + } + + const viewportInput = { + id: viewportId, + renderingEngineId: this.id, + element, // div + type, + canvas, + sx: 0, // No offset, uses own renderer + sy: 0, + sWidth: clientWidth, + sHeight: clientHeight, + defaultOptions: defaultOptions || {}, + }; + + // 4. Create a proper viewport based on the type of the viewport + const ViewportType = viewportTypeToViewportClass[type]; + const viewport = new ViewportType(viewportInput); + + // 5. Storing the viewports + this._viewports.set(viewportId, viewport); + + const eventDetail: EventTypes.ElementEnabledEventDetail = { + element, + viewportId, + renderingEngineId: this.id, + }; + + triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail); + } + + /** + * Sets multiple viewports using custom rendering + * pipelines to the `RenderingEngine`. + * + * @param viewportInputEntries - An array of information + * objects used to construct and enable the viewports. + */ + private setCustomViewports(viewportInputEntries: PublicViewportInput[]) { + viewportInputEntries.forEach((vpie) => { + this.addCustomViewport(vpie); + }); + } + + /** + * @method _getViewportsAsArray Returns an array of all viewports + * + * @returns Array of viewports. + */ + protected _getViewportsAsArray(): IViewport[] { + return Array.from(this._viewports.values()); + } + + private _setViewportsToBeRenderedNextFrame(viewportIds: string[]) { + // Add the viewports to the set of flagged viewports + viewportIds.forEach((viewportId) => { + this._needsRender.add(viewportId); + }); + + // Render any flagged viewports + this._render(); + } + + /** + * Sets up animation frame if necessary + */ + private _render() { + // If we have viewports that need rendering and we have not already + // set the RAF callback to run on the next frame. + if (this._needsRender.size > 0 && !this._animationFrameSet) { + this._animationFrameHandle = window.requestAnimationFrame( + this._renderFlaggedViewports + ); + + // Set the flag that we have already set up the next RAF call. + this._animationFrameSet = true; + } + } + + /** + * Reset the viewport by removing the data attributes + * and clearing the context of draw. It also emits an element disabled event + * + * @param viewport - The `Viewport` to render. + */ + private _resetViewport(viewport: IViewport) { + const renderingEngineId = this.id; + + const { element, canvas, id: viewportId } = viewport; + + const eventDetail: EventTypes.ElementDisabledEventDetail = { + element, + viewportId, + renderingEngineId, + }; + + viewport.removeWidgets(); + + // Trigger first before removing the data attributes, as we need the enabled + // element to remove tools associated with the viewport + triggerEvent(eventTarget, Events.ELEMENT_DISABLED, eventDetail); + + element.removeAttribute('data-viewport-uid'); + element.removeAttribute('data-rendering-engine-uid'); + + // clear drawing + const context = canvas.getContext('2d'); + context.clearRect(0, 0, canvas.width, canvas.height); + } + + private _clearAnimationFrame() { + window.cancelAnimationFrame(this._animationFrameHandle); + + this._needsRender.clear(); + this._animationFrameSet = false; + this._animationFrameHandle = null; + } + + /** + * Resets the `RenderingEngine` + */ + private _reset() { + const viewports = this._getViewportsAsArray(); + + viewports.forEach((viewport) => { + this._resetViewport(viewport); + }); + + this._clearAnimationFrame(); + + this._viewports = new Map(); + } + + /** + * Throws an error if trying to interact with the `RenderingEngine` + * instance after its `destroy` method has been called. + */ + protected _throwIfDestroyed() { + if (this.hasBeenDestroyed) { + throw new Error( + 'this.destroy() has been manually called to free up memory, can not longer use this instance. Instead make a new one.' + ); + } + } + + /** + * Resizes viewports that use VTK.js for rendering. + * This method must be implemented by subclasses to define their specific + * resizing strategy. + */ + protected abstract _resizeVTKViewports( + vtkDrivenViewports: (IStackViewport | IVolumeViewport)[], + keepCamera: boolean, + immediate: boolean + ): void; + + /** + * Enables a viewport to be driven by the offscreen vtk.js rendering engine. + * This method must be implemented by subclasses to define their specific + * viewport enabling strategy. + * + * @param viewportInputEntry - Information object used to + * construct and enable the viewport. + */ + protected abstract enableVTKjsDrivenViewport( + viewportInputEntry: NormalizedViewportInput + ): void; + + /** + * Adds a viewport driven by vtk.js to the `RenderingEngine`. + * This method must be implemented by subclasses to define their specific + * approach to adding VTK.js driven viewports. + * + * @param viewportInputEntry - Information object used to construct and enable the viewport. + * @param offscreenCanvasProperties - Optional properties for configuring the offscreen canvas. + */ + protected abstract addVtkjsDrivenViewport( + viewportInputEntry: InternalViewportInput, + offscreenCanvasProperties?: unknown + ): void; + + /** + * Renders all viewports. + * This method must be implemented by subclasses to define their specific + * rendering strategy + */ + protected abstract _renderFlaggedViewports(): void; + + /** + * Sets multiple vtk.js driven viewports to + * the `RenderingEngine`. + * This method must be implemented by subclasses to define their specific + * approach to setting multiple VTK.js driven viewports. + * + * @param viewportInputEntries - An array of information + * objects used to construct and enable the viewports. + */ + protected abstract setVtkjsDrivenViewports( + viewportInputEntries: NormalizedViewportInput[] + ): void; + + /** + * Renders the given viewport using its preferred method. + * This method must be implemented by subclasses to define their specific + * rendering approach. + * + * @param viewport - The viewport to render + */ + protected abstract renderViewportUsingCustomOrVtkPipeline( + viewport: IViewport + ): EventTypes.ImageRenderedEventDetail; + + /** + * Renders a particular `Viewport`'s on screen canvas. + * This method must be implemented by subclasses to define how to copy + * from the offscreen canvas to the onscreen canvas. + * + * @param viewport - The `Viewport` to render. + * @param offScreenCanvas - The offscreen canvas to render from. + */ + protected abstract _renderViewportFromVtkCanvasToOnscreenCanvas( + viewport: IViewport, + offScreenCanvas: HTMLCanvasElement + ): EventTypes.ImageRenderedEventDetail; +} + +export default BaseRenderingEngine; diff --git a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts index f3f2241916..6b55b5dca9 100644 --- a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts +++ b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts @@ -74,7 +74,7 @@ import imageIdToURI from '../utilities/imageIdToURI'; import uuidv4 from '../utilities/uuidv4'; import * as metaData from '../metaData'; import { getCameraVectors } from './helpers/getCameraVectors'; - +import { isSequentialRenderingEngine } from './helpers/isSequentialRenderingEngine'; /** * Abstract base class for volume viewports. VolumeViewports are used to render * 3D volumes from which various orientations can be viewed. Since VolumeViewports @@ -111,6 +111,8 @@ abstract class BaseVolumeViewport extends Viewport { ); } + this._configureRenderingPipeline(); + const renderer = this.getRenderer(); const camera = vtkSlabCamera.newInstance(); @@ -1600,6 +1602,7 @@ abstract class BaseVolumeViewport extends Viewport { * @returns The corresponding world coordinates. * @public */ + public canvasToWorld = (canvasPos: Point2): Point3 => { const vtkCamera = this.getVtkActiveCamera() as vtkSlabCameraType; @@ -1645,6 +1648,74 @@ abstract class BaseVolumeViewport extends Viewport { return [worldCoord[0], worldCoord[1], worldCoord[2]]; }; + public canvasToWorldSequential = (canvasPos: Point2): Point3 => { + const vtkCamera = this.getVtkActiveCamera() as vtkSlabCameraType; + + /** + * NOTE: this is necessary because we want the coordinate transformation + * respect to the view plane (plane orthogonal to the camera and passing to + * the focal point). + * + * When vtk.js computes the coordinate transformations, it simply uses the + * camera matrix (no ray casting). + * + * However for the volume viewport the clipping range is set to be + * (-RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE, RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE). + * The clipping range is used in the camera method getProjectionMatrix(). + * The projection matrix is used then for viewToWorld/worldToView methods of + * the renderer. This means that vkt.js will not return the coordinates of + * the point on the view plane (i.e. the depth coordinate will correspond + * to the focal point). + * + * Therefore the clipping range has to be set to (distance, distance + 0.01), + * where now distance is the distance between the camera position and focal + * point. This is done internally, in our camera customization when the flag + * isPerformingCoordinateTransformation is set to true. + */ + + vtkCamera.setIsPerformingCoordinateTransformation?.(true); + + const renderer = this.getRenderer(); + const devicePixelRatio = window.devicePixelRatio || 1; + const { width, height } = this.canvas; + const aspectRatio = width / height; + + // Convert canvas coordinates to normalized display coordinates + const canvasPosWithDPR = [ + canvasPos[0] * devicePixelRatio, + canvasPos[1] * devicePixelRatio, + ]; + + // Normalize to [0,1] range + const normalizedDisplay = [ + canvasPosWithDPR[0] / width, + 1 - canvasPosWithDPR[1] / height, // Flip Y axis + 0, + ]; + + // Transform from normalized display to world coordinates + const projCoords = renderer.normalizedDisplayToProjection( + normalizedDisplay[0], + normalizedDisplay[1], + normalizedDisplay[2] + ); + const viewCoords = renderer.projectionToView( + projCoords[0], + projCoords[1], + projCoords[2], + aspectRatio + ); + const worldCoord = renderer.viewToWorld( + viewCoords[0], + viewCoords[1], + viewCoords[2] + ); + + vtkCamera.setIsPerformingCoordinateTransformation?.(false); + + return [worldCoord[0], worldCoord[1], worldCoord[2]]; + }; + /** * Returns the VTK.js display coordinates of the given `canvasPos` projected onto the * `Viewport`'s `vtkCamera`'s focal point and the direction of projection. @@ -1672,6 +1743,23 @@ abstract class BaseVolumeViewport extends Viewport { displayCoord[1] = size[1] - displayCoord[1]; return [displayCoord[0], displayCoord[1], 0]; }; + + public getVtkDisplayCoordsSequential = (canvasPos: Point2): Point3 => { + const devicePixelRatio = window.devicePixelRatio || 1; + const canvasPosWithDPR = [ + canvasPos[0] * devicePixelRatio, + canvasPos[1] * devicePixelRatio, + ]; + + const { height } = this.canvas; + + // Canvas coordinates with origin at top-left + // VTK display coordinates have origin at bottom-left + const displayCoord = [canvasPosWithDPR[0], height - canvasPosWithDPR[1]]; + + return [displayCoord[0], displayCoord[1], 0]; + }; + /** * Returns the canvas coordinates of the given `worldPos` * projected onto the `Viewport`'s `canvas`. @@ -1737,6 +1825,74 @@ abstract class BaseVolumeViewport extends Viewport { return canvasCoordWithDPR; }; + public worldToCanvasSequential = (worldPos: Point3): Point2 => { + const vtkCamera = this.getVtkActiveCamera() as vtkSlabCameraType; + + /** + * NOTE: this is necessary because we want the coordinate transformation + * respect to the view plane (plane orthogonal to the camera and passing to + * the focal point). + * + * When vtk.js computes the coordinate transformations, it simply uses the + * camera matrix (no ray casting). + * + * However for the volume viewport the clipping range is set to be + * (-RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE, RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE). + * The clipping range is used in the camera method getProjectionMatrix(). + * The projection matrix is used then for viewToWorld/worldToView methods of + * the renderer. This means that vkt.js will not return the coordinates of + * the point on the view plane (i.e. the depth coordinate will corresponded + * to the focal point). + * + * Therefore the clipping range has to be set to (distance, distance + 0.01), + * where now distance is the distance between the camera position and focal + * point. This is done internally, in our camera customization when the flag + * isPerformingCoordinateTransformation is set to true. + */ + + vtkCamera.setIsPerformingCoordinateTransformation?.(true); + + const renderer = this.getRenderer(); + const { width, height } = this.canvas; + const aspectRatio = width / height; + + // Transform from world to view coordinates + const viewCoords = renderer.worldToView( + worldPos[0], + worldPos[1], + worldPos[2] + ); + + // Transform from view to projection coordinates + const projCoords = renderer.viewToProjection( + viewCoords[0], + viewCoords[1], + viewCoords[2], + aspectRatio + ); + + // Transform from projection to normalized display coordinates + const normalizedDisplay = renderer.projectionToNormalizedDisplay( + projCoords[0], + projCoords[1], + projCoords[2] + ); + + // Convert normalized display [0,1] to canvas pixels + const canvasX = normalizedDisplay[0] * width; + const canvasY = (1 - normalizedDisplay[1]) * height; // Flip Y axis + + const devicePixelRatio = window.devicePixelRatio || 1; + const canvasCoordWithDPR = [ + canvasX / devicePixelRatio, + canvasY / devicePixelRatio, + ] as Point2; + + vtkCamera.setIsPerformingCoordinateTransformation(false); + + return canvasCoordWithDPR; + }; + /* * Checking if the imageURI is in the volumes that are being * rendered by the viewport. imageURI is the imageId without the schema @@ -1979,6 +2135,39 @@ abstract class BaseVolumeViewport extends Viewport { public getAllVolumeIds(): string[] { return Array.from(this.volumeIds); } + + private _configureRenderingPipeline() { + const renderingEngine = this.getRenderingEngine(); + const isSequential = isSequentialRenderingEngine(renderingEngine); + + for (const key in this.renderingPipelineFunctions) { + if ( + Object.prototype.hasOwnProperty.call( + this.renderingPipelineFunctions, + key + ) + ) { + const functions = this.renderingPipelineFunctions[key]; + + this[key] = isSequential ? functions.sequential : functions.default; + } + } + } + + protected renderingPipelineFunctions = { + worldToCanvas: { + default: this.worldToCanvas, + sequential: this.worldToCanvasSequential, + }, + canvasToWorld: { + default: this.canvasToWorld, + sequential: this.canvasToWorldSequential, + }, + getVtkDisplayCoords: { + default: this.getVtkDisplayCoords, + sequential: this.getVtkDisplayCoordsSequential, + }, + }; } export default BaseVolumeViewport; diff --git a/packages/core/src/RenderingEngine/RenderingEngine.ts b/packages/core/src/RenderingEngine/RenderingEngine.ts index 04026a37c3..d0a245d66b 100644 --- a/packages/core/src/RenderingEngine/RenderingEngine.ts +++ b/packages/core/src/RenderingEngine/RenderingEngine.ts @@ -1,1417 +1,105 @@ -import Events from '../enums/Events'; -import renderingEngineCache from './renderingEngineCache'; -import eventTarget from '../eventTarget'; -import uuidv4 from '../utilities/uuidv4'; -import triggerEvent from '../utilities/triggerEvent'; -import { vtkOffscreenMultiRenderWindow } from './vtkClasses'; -import ViewportType from '../enums/ViewportType'; -import VolumeViewport from './VolumeViewport'; -import BaseVolumeViewport from './BaseVolumeViewport'; -import StackViewport from './StackViewport'; -import viewportTypeUsesCustomRenderingPipeline from './helpers/viewportTypeUsesCustomRenderingPipeline'; -import getOrCreateCanvas from './helpers/getOrCreateCanvas'; -import { getShouldUseCPURendering, isCornerstoneInitialized } from '../init'; -import type IStackViewport from '../types/IStackViewport'; -import type IVolumeViewport from '../types/IVolumeViewport'; -import viewportTypeToViewportClass from './helpers/viewportTypeToViewportClass'; - -import type * as EventTypes from '../types/EventTypes'; +import { getConfiguration } from '../init'; +import StandardRenderingEngine from './StandardRenderingEngine'; +import SequentialRenderingEngine from './SequentialRenderingEngine'; +import type BaseRenderingEngine from './BaseRenderingEngine'; import type { - ViewportInput, - PublicViewportInput, - InternalViewportInput, - NormalizedViewportInput, + IStackViewport, + IVolumeViewport, IViewport, -} from '../types/IViewport'; -import { OrientationAxis } from '../enums'; -import VolumeViewport3D from './VolumeViewport3D'; - -interface ViewportDisplayCoords { - sxStartDisplayCoords: number; - syStartDisplayCoords: number; - sxEndDisplayCoords: number; - syEndDisplayCoords: number; - sx: number; - sy: number; - sWidth: number; - sHeight: number; -} - -// Rendering engines seem to not like rendering things less than 2 pixels per side -const VIEWPORT_MIN_SIZE = 2; + PublicViewportInput, +} from '../types'; +import { RenderingEngineModeEnum } from '../enums'; -/** - * A RenderingEngine takes care of the full pipeline of creating viewports and rendering - * them on a large offscreen canvas and transmitting this data back to the screen. This allows us - * to leverage the power of vtk.js whilst only using one WebGL context for the processing, and allowing - * us to share texture memory across on-screen viewports that show the same data. - * - * - * Instantiating a rendering engine: - * ```js - * const renderingEngine = new RenderingEngine('pet-ct-rendering-engine'); - * ``` - * - * There are various ways you can trigger a render on viewports. The simplest is to call `render()` - * on the rendering engine; however, it will trigger a render on all viewports. A more efficient - * way to do this is to call `renderViewports([viewportId])` on the rendering engine to - * trigger a render on a specific viewport(s). Each viewport also has a `.render` method which can be used to trigger a render on that - * viewport. - * - * - * RenderingEngine checks for WebGL context availability to determine if GPU rendering is possible. - * If a WebGL context is not available, RenderingEngine will fall back to CPU rendering for StackViewports. - * However, for volume rendering, GPU availability is required, and an error will be thrown if attempted without GPU support. - * - * By default, RenderingEngine will use the vtk.js-enabled pipeline for rendering viewports. - * However, if a custom rendering pipeline is specified by a custom viewport, it will be used instead. - * We use this custom pipeline to render a StackViewport on CPU using the Cornerstone legacy CPU rendering pipeline. - * - * @public - */ class RenderingEngine { - /** Unique identifier for renderingEngine */ - readonly id: string; - /** A flag which tells if the renderingEngine has been destroyed or not */ public hasBeenDestroyed: boolean; // eslint-disable-next-line @typescript-eslint/no-explicit-any public offscreenMultiRenderWindow: any; - readonly offScreenCanvasContainer: HTMLDivElement; - private _viewports: Map; - private _needsRender = new Set(); - private _animationFrameSet = false; - private _animationFrameHandle: number | null = null; - private useCPURendering: boolean; + private _implementation?: BaseRenderingEngine; - /** - * @param uid - Unique identifier for RenderingEngine - */ constructor(id?: string) { - this.id = id ? id : uuidv4(); - this.useCPURendering = getShouldUseCPURendering(); - - renderingEngineCache.set(this); - - if (!isCornerstoneInitialized()) { - throw new Error( - '@cornerstonejs/core is not initialized, run init() first' - ); - } - - if (!this.useCPURendering) { - this.offscreenMultiRenderWindow = - vtkOffscreenMultiRenderWindow.newInstance(); - this.offScreenCanvasContainer = document.createElement('div'); - this.offscreenMultiRenderWindow.setContainer( - this.offScreenCanvasContainer - ); + const config = getConfiguration(); + const renderingEngineMode = config?.rendering?.renderingEngineMode; + + switch (renderingEngineMode) { + case RenderingEngineModeEnum.Standard: + this._implementation = new StandardRenderingEngine(id); + break; + case RenderingEngineModeEnum.Next: + this._implementation = new SequentialRenderingEngine(id); + break; + default: + console.warn( + `RenderingEngine: Unknown rendering engine mode "${renderingEngineMode}". Defaulting to Next rendering engine.` + ); + this._implementation = new SequentialRenderingEngine(id); + break; } + } - this._viewports = new Map(); - this.hasBeenDestroyed = false; + get id(): string { + return this._implementation.id; } - /** - * Enables the requested viewport and add it to the viewports. It will - * properly create the Stack viewport or Volume viewport: - * - * 1) Checks if the viewport is defined already, if yes, remove it first - * 2) Checks if the viewport is using a custom rendering pipeline, if no, - * it calculates a new offscreen canvas with the new requested viewport - * 3) Adds the viewport - * - * - * ``` - * renderingEngine.enableElement({ - * viewportId: viewportId, - * type: ViewportType.ORTHOGRAPHIC, - * element, - * defaultOptions: { - * orientation: Enums.OrientationAxis.AXIAL, - * background: [1, 0, 1], - * }, - * }) - * ``` - * - * fires Events.ELEMENT_ENABLED - * - * @param viewportInputEntry - viewport specifications - */ public enableElement(viewportInputEntry: PublicViewportInput): void { - const viewportInput = this._normalizeViewportInputEntry(viewportInputEntry); - - this._throwIfDestroyed(); - const { element, viewportId } = viewportInput; - - // Throw error if no canvas - if (!element) { - throw new Error('No element provided'); - } - - // 1. Get the viewport from the list of available viewports. - const viewport = this.getViewport(viewportId); - - // 1.a) If there is a found viewport, we remove the viewport and create a new viewport - if (viewport) { - this.disableElement(viewportId); - } - - // 2.a) See if viewport uses a custom rendering pipeline. - const { type } = viewportInput; - - const viewportUsesCustomRenderingPipeline = - viewportTypeUsesCustomRenderingPipeline(type); - - // 2.b) Retrieving the list of viewports for calculation of the new size for - // offScreen canvas. - - // If the viewport being added uses a custom pipeline, or we aren't using - // GPU rendering, we don't need to resize the offscreen canvas. - if (!this.useCPURendering && !viewportUsesCustomRenderingPipeline) { - this.enableVTKjsDrivenViewport(viewportInput); - } else { - // 3 Add the requested viewport to rendering Engine - this.addCustomViewport(viewportInput); - } - - // 5. Set the background color for the canvas - const canvas = getOrCreateCanvas(element); - const { background } = viewportInput.defaultOptions; - this.fillCanvasWithBackgroundColor(canvas, background); + return this._implementation.enableElement(viewportInputEntry); } - /** - * Disables the requested viewportId from the rendering engine: - * - * 1) It removes the viewport from the the list of viewports - * 2) remove the renderer from the offScreen render window if using vtk.js driven - * rendering pipeline - * 3) resetting the viewport to remove the canvas attributes and canvas data - * 4) resize the offScreen appropriately (if using vtk.js driven rendering pipeline) - * - * fires Events.ELEMENT_ENABLED - * - * @param viewportId - viewport Id - * - */ public disableElement(viewportId: string): void { - this._throwIfDestroyed(); - // 1. Getting the viewport to remove it - const viewport = this.getViewport(viewportId); - - // 2 To throw if there is no viewport stored in rendering engine - if (!viewport) { - console.warn(`viewport ${viewportId} does not exist`); - return; - } - - // 3. Reset the viewport to remove attributes, and reset the canvas - this._resetViewport(viewport); - - // 4. Remove the related renderer from the offScreenMultiRenderWindow - if ( - !viewportTypeUsesCustomRenderingPipeline(viewport.type) && - !this.useCPURendering - ) { - this.offscreenMultiRenderWindow.removeRenderer(viewportId); - } - - // 5. Remove the requested viewport from the rendering engine - this._removeViewport(viewportId); - viewport.isDisabled = true; - - // 6. Avoid rendering for the disabled viewport - this._needsRender.delete(viewportId); - - // 7. Clear RAF if no viewport is left - const viewports = this.getViewports(); - if (!viewports.length) { - this._clearAnimationFrame(); - } - - // Note: we should not call resize at the end of here, the reason is that - // in batch rendering, we might disable a viewport and enable others at the same - // time which would interfere with each other. So we just let the enable - // to call resize, and also resize getting called by applications on the - // DOM resize event. + return this._implementation.disableElement(viewportId); } - /** - * It takes an array of viewport input objects including element, viewportId, type - * and defaultOptions. It will add the viewport to the rendering engine and enables them. - * - * - * ```typescript - *renderingEngine.setViewports([ - * { - * viewportId: axialViewportId, - * type: ViewportType.ORTHOGRAPHIC, - * element: document.getElementById('axialDiv'), - * defaultOptions: { - * orientation: Enums.OrientationAxis.AXIAL, - * }, - * }, - * { - * viewportId: sagittalViewportId, - * type: ViewportType.ORTHOGRAPHIC, - * element: document.getElementById('sagittalDiv'), - * defaultOptions: { - * orientation: Enums.OrientationAxis.SAGITTAL, - * }, - * }, - * { - * viewportId: customOrientationViewportId, - * type: ViewportType.ORTHOGRAPHIC, - * element: document.getElementById('customOrientationDiv'), - * defaultOptions: { - * orientation: { viewPlaneNormal: [0, 0, 1], viewUp: [0, 1, 0] }, - * }, - * }, - * ]) - * ``` - * - * fires Events.ELEMENT_ENABLED - * - * @param viewportInputEntries - Array - */ - public setViewports(publicViewportInputEntries: PublicViewportInput[]): void { - const viewportInputEntries = this._normalizeViewportInputEntries( - publicViewportInputEntries - ); - this._throwIfDestroyed(); - this._reset(); - - // 1. Split viewports based on whether they use vtk.js or a custom pipeline. - - const vtkDrivenViewportInputEntries: NormalizedViewportInput[] = []; - const customRenderingViewportInputEntries: NormalizedViewportInput[] = []; - - viewportInputEntries.forEach((vpie) => { - if ( - !this.useCPURendering && - !viewportTypeUsesCustomRenderingPipeline(vpie.type) - ) { - vtkDrivenViewportInputEntries.push(vpie); - } else { - customRenderingViewportInputEntries.push(vpie); - } - }); - - this.setVtkjsDrivenViewports(vtkDrivenViewportInputEntries); - this.setCustomViewports(customRenderingViewportInputEntries); - - // Making sure the setViewports api also can fill the canvas - // properly - viewportInputEntries.forEach((vp) => { - const canvas = getOrCreateCanvas(vp.element); - const { background } = vp.defaultOptions; - this.fillCanvasWithBackgroundColor(canvas, background); - }); + return this._implementation.setViewports(publicViewportInputEntries); } - /** - * Resizes the offscreen viewport and recalculates translations to on screen canvases. - * It is up to the parent app to call the resize of the on-screen canvas changes. - * This is left as an app level concern as one might want to debounce the changes, or the like. - * - * @param immediate - Whether all of the viewports should be rendered immediately. - * @param keepCamera - Whether to keep the camera for other viewports while resizing the offscreen canvas - */ public resize(immediate = true, keepCamera = true): void { - this._throwIfDestroyed(); - // 1. Get the viewports' canvases - const viewports = this._getViewportsAsArray(); - - const vtkDrivenViewports = []; - const customRenderingViewports = []; - - viewports.forEach((vpie) => { - if (!viewportTypeUsesCustomRenderingPipeline(vpie.type)) { - vtkDrivenViewports.push(vpie); - } else { - customRenderingViewports.push(vpie); - } - }); - - if (vtkDrivenViewports.length) { - this._resizeVTKViewports(vtkDrivenViewports, keepCamera, immediate); - } - - if (customRenderingViewports.length) { - this._resizeUsingCustomResizeHandler( - customRenderingViewports, - keepCamera, - immediate - ); - } + return this._implementation.resize(immediate, keepCamera); } - /** - * Returns the viewport by Id - * - * @returns viewport - */ public getViewport(viewportId: string): IViewport { - return this._viewports?.get(viewportId); + return this._implementation.getViewport(viewportId); } - /** - * getViewports Returns an array of all `Viewport`s on the `RenderingEngine` instance. - * - * @returns Array of viewports - */ public getViewports(): IViewport[] { - this._throwIfDestroyed(); - - return this._getViewportsAsArray(); + return this._implementation.getViewports(); } - /** - * Retrieves a stack viewport by its ID. used just for type safety - * - * @param viewportId - The ID of the viewport to retrieve. - * @returns The stack viewport with the specified ID. - * @throws Error if the viewport with the given ID does not exist or is not a StackViewport. - */ public getStackViewport(viewportId: string): IStackViewport { - this._throwIfDestroyed(); - - const viewport = this.getViewport(viewportId); - - if (!viewport) { - throw new Error(`Viewport with Id ${viewportId} does not exist`); - } - - if (!(viewport instanceof StackViewport)) { - throw new Error(`Viewport with Id ${viewportId} is not a StackViewport.`); - } - - return viewport; + return this._implementation.getStackViewport(viewportId); } - /** - * Filters all the available viewports and return the stack viewports - * @returns stack viewports registered on the rendering Engine - */ public getStackViewports(): IStackViewport[] { - this._throwIfDestroyed(); - - const viewports = this.getViewports(); - - return viewports.filter( - (vp) => vp instanceof StackViewport - ) as IStackViewport[]; - } - /** - * Return all the viewports that are volume viewports - * @returns An array of VolumeViewport objects. - */ - public getVolumeViewports(): IVolumeViewport[] { - this._throwIfDestroyed(); - - const viewports = this.getViewports(); - - const isVolumeViewport = ( - viewport: IViewport - ): viewport is BaseVolumeViewport => { - return viewport instanceof BaseVolumeViewport; - }; - - return viewports.filter(isVolumeViewport) as IVolumeViewport[]; + return this._implementation.getStackViewports(); } - /** - * Renders all viewports on the next animation frame. - * - * fires Events.IMAGE_RENDERED - */ - public render(): void { - const viewports = this.getViewports(); - const viewportIds = viewports.map((vp) => vp.id); - - this._setViewportsToBeRenderedNextFrame(viewportIds); - } - - /** - * Renders any viewports viewing the given Frame Of Reference. - * - * @param FrameOfReferenceUID - The unique identifier of the - * Frame Of Reference. - */ - public renderFrameOfReference = (FrameOfReferenceUID: string): void => { - const viewports = this._getViewportsAsArray(); - const viewportIdsWithSameFrameOfReferenceUID = viewports.map((vp) => { - if (vp.getFrameOfReferenceUID() === FrameOfReferenceUID) { - return vp.id; - } - }); - - this.renderViewports(viewportIdsWithSameFrameOfReferenceUID); - }; - - /** - * Renders the provided Viewport IDs. - * - */ - public renderViewports(viewportIds: string[]): void { - this._setViewportsToBeRenderedNextFrame(viewportIds); - } - - /** - * Renders only a specific `Viewport` on the next animation frame. - * - * @param viewportId - The Id of the viewport. - */ - public renderViewport(viewportId: string): void { - this._setViewportsToBeRenderedNextFrame([viewportId]); - } - - /** - * destroy the rendering engine. It will remove all the viewports and, - * if the rendering engine is using the GPU, it will also destroy the GPU - * resources. - */ - public destroy(): void { - if (this.hasBeenDestroyed) { - return; - } - - // remove vtk rendered first before resetting the viewport - if (!this.useCPURendering) { - const viewports = this._getViewportsAsArray(); - viewports.forEach((vp) => { - this.offscreenMultiRenderWindow.removeRenderer(vp.id); - }); - - // Free up WebGL resources - this.offscreenMultiRenderWindow.delete(); - - // Make sure all references go stale and are garbage collected. - delete this.offscreenMultiRenderWindow; - } - - this._reset(); - renderingEngineCache.delete(this.id); - - this.hasBeenDestroyed = true; + public getVolumeViewports(): IVolumeViewport[] { + return this._implementation.getVolumeViewports(); } - - /** - * Fill the canvas with the background color - * @param canvas - The canvas element to draw on. - * @param backgroundColor - An array of three numbers between 0 and 1 that - * specify the red, green, and blue values of the background color. - */ public fillCanvasWithBackgroundColor( canvas: HTMLCanvasElement, backgroundColor: [number, number, number] - ): void { - const ctx = canvas.getContext('2d'); - - // Default to black if no background color is set - let fillStyle; - if (backgroundColor) { - const rgb = backgroundColor.map((f) => Math.floor(255 * f)); - fillStyle = `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`; - } else { - fillStyle = 'black'; - } - - // We draw over the previous stack with the background color while we - // wait for the next stack to load - ctx.fillStyle = fillStyle; - ctx.fillRect(0, 0, canvas.width, canvas.height); - } - - private _normalizeViewportInputEntry( - viewportInputEntry: PublicViewportInput - ) { - const { type, defaultOptions } = viewportInputEntry; - let options = defaultOptions; - - if (!options || Object.keys(options).length === 0) { - options = { - background: [0, 0, 0], - orientation: null, - displayArea: null, - }; - - if (type === ViewportType.ORTHOGRAPHIC) { - options = { - ...options, - orientation: OrientationAxis.AXIAL, - }; - } - } - - return { - ...viewportInputEntry, - defaultOptions: options, - }; - } - - private _normalizeViewportInputEntries( - viewportInputEntries: PublicViewportInput[] - ): NormalizedViewportInput[] { - const normalizedViewportInputs = []; - - viewportInputEntries.forEach((viewportInput) => { - normalizedViewportInputs.push( - this._normalizeViewportInputEntry(viewportInput) - ); - }); - - return normalizedViewportInputs; - } - - private _resizeUsingCustomResizeHandler( - customRenderingViewports: StackViewport[], - keepCamera = true, - immediate = true - ) { - // 1. If viewport has a custom resize method, call it here. - customRenderingViewports.forEach((vp) => { - if (typeof vp.resize === 'function') { - vp.resize(); - } - }); - - // 3. Reset viewport cameras - customRenderingViewports.forEach((vp) => { - const prevCamera = vp.getCamera(); - vp.resetCamera(); - - if (keepCamera) { - vp.setCamera(prevCamera); - } - }); - - // 2. If render is immediate: Render all - if (immediate) { - this.render(); - } - } - - private _resizeVTKViewports( - vtkDrivenViewports: (IStackViewport | IVolumeViewport)[], - keepCamera = true, - immediate = true ) { - // Ensure all the canvases are ready for rendering - const canvasesDrivenByVtkJs = vtkDrivenViewports.map( - (vp: IStackViewport | IVolumeViewport) => { - return getOrCreateCanvas(vp.element); - } - ); - - // reset the canvas size to the client size - canvasesDrivenByVtkJs.forEach((canvas) => { - const devicePixelRatio = window.devicePixelRatio || 1; - canvas.width = canvas.clientWidth * devicePixelRatio; - canvas.height = canvas.clientHeight * devicePixelRatio; - }); - - if (canvasesDrivenByVtkJs.length) { - // 1. Recalculate and resize the offscreen canvas size - const { offScreenCanvasWidth, offScreenCanvasHeight } = - this._resizeOffScreenCanvas(canvasesDrivenByVtkJs); - - // 2. Recalculate the viewports location on the off screen canvas - this._resize( - vtkDrivenViewports, - offScreenCanvasWidth, - offScreenCanvasHeight - ); - } - - // 3. Reset viewport cameras - vtkDrivenViewports.forEach((vp: IStackViewport | IVolumeViewport) => { - const prevCamera = vp.getCamera(); - const rotation = vp.getRotation(); - const { flipHorizontal } = prevCamera; - vp.resetCameraForResize(); - - const displayArea = vp.getDisplayArea(); - - // TODO - make this use get/set Presentation or in some way preserve the - // basic presentation info on this viewport, rather than preserving camera - if (keepCamera) { - if (displayArea) { - if (flipHorizontal) { - vp.setCamera({ flipHorizontal }); - } - if (rotation) { - vp.setViewPresentation({ rotation }); - } - } else { - vp.setCamera(prevCamera); - } - } - }); - - // 4. If render is immediate: Render all - if (immediate) { - this.render(); - } - } - - /** - * Enables a viewport to be driven by the offscreen vtk.js rendering engine. - * - * @param viewportInputEntry - Information object used to - * construct and enable the viewport. - */ - private enableVTKjsDrivenViewport( - viewportInputEntry: NormalizedViewportInput - ) { - const viewports = this._getViewportsAsArray(); - const viewportsDrivenByVtkJs = viewports.filter( - (vp) => viewportTypeUsesCustomRenderingPipeline(vp.type) === false - ); - - const canvasesDrivenByVtkJs = viewportsDrivenByVtkJs.map((vp) => vp.canvas); - - const canvas = getOrCreateCanvas(viewportInputEntry.element); - canvasesDrivenByVtkJs.push(canvas); - - // 2.c Calculating the new size for offScreen Canvas - const { offScreenCanvasWidth, offScreenCanvasHeight } = - this._resizeOffScreenCanvas(canvasesDrivenByVtkJs); - - // 2.d Re-position previous viewports on the offScreen Canvas based on the new - // offScreen canvas size - const xOffset = this._resize( - viewportsDrivenByVtkJs as (IStackViewport | IVolumeViewport)[], - offScreenCanvasWidth, - offScreenCanvasHeight - ); - - const internalViewportEntry = { ...viewportInputEntry, canvas }; - - // 3 Add the requested viewport to rendering Engine - this.addVtkjsDrivenViewport(internalViewportEntry, { - offScreenCanvasWidth, - offScreenCanvasHeight, - xOffset, - }); - } - - /** - * Disables the requested viewportId from the rendering engine: - * 1) It removes the viewport from the the list of viewports - * 2) remove the renderer from the offScreen render window - * 3) resetting the viewport to remove the canvas attributes and canvas data - * 4) resize the offScreen appropriately - * - * @param viewportId - viewport Id - * - */ - private _removeViewport(viewportId: string): void { - // 1. Get the viewport - const viewport = this.getViewport(viewportId); - if (!viewport) { - console.warn(`viewport ${viewportId} does not exist`); - return; - } - - // 2. Delete the viewports from the the viewports - this._viewports.delete(viewportId); - } - - /** - * Adds a viewport driven by vtk.js to the `RenderingEngine`. - * - * @param viewportInputEntry - Information object used to construct and enable the viewport. - * @param options - Options object used to configure the viewport. - * @param options.offScreenCanvasWidth - The width of the offscreen canvas. - * @param options.offScreenCanvasHeight - The height of the offscreen canvas. - * @param options.xOffset - The x offset of the viewport on the offscreen canvas. - */ - private addVtkjsDrivenViewport( - viewportInputEntry: InternalViewportInput, - offscreenCanvasProperties?: { - offScreenCanvasWidth: number; - offScreenCanvasHeight: number; - xOffset: number; - } - ): void { - const { element, canvas, viewportId, type, defaultOptions } = - viewportInputEntry; - - // Make the element not focusable, we use this for modifier keys to work - element.tabIndex = -1; - - const { offScreenCanvasWidth, offScreenCanvasHeight, xOffset } = - offscreenCanvasProperties; - - // 1. Calculate the size of location of the viewport on the offScreen canvas - const { - sxStartDisplayCoords, - syStartDisplayCoords, - sxEndDisplayCoords, - syEndDisplayCoords, - sx, - sy, - sWidth, - sHeight, - } = this._getViewportCoordsOnOffScreenCanvas( - viewportInputEntry, - offScreenCanvasWidth, - offScreenCanvasHeight, - xOffset - ); - // 2. Add a renderer to the offScreenMultiRenderWindow - this.offscreenMultiRenderWindow.addRenderer({ - viewport: [ - sxStartDisplayCoords, - syStartDisplayCoords, - sxEndDisplayCoords, - syEndDisplayCoords, - ], - id: viewportId, - background: defaultOptions.background - ? defaultOptions.background - : [0, 0, 0], - }); - - // 3. ViewportInput to be passed to a stack/volume viewport - const viewportInput = { - id: viewportId, - element, // div - renderingEngineId: this.id, - type, - canvas, - sx, - sy, - sWidth, - sHeight, - defaultOptions: defaultOptions || {}, - } as ViewportInput; - - // 4. Create a proper viewport based on the type of the viewport - let viewport; - if (type === ViewportType.STACK) { - // 4.a Create stack viewport - viewport = new StackViewport(viewportInput); - } else if ( - type === ViewportType.ORTHOGRAPHIC || - type === ViewportType.PERSPECTIVE - ) { - // 4.b Create a volume viewport - viewport = new VolumeViewport(viewportInput); - } else if (type === ViewportType.VOLUME_3D) { - viewport = new VolumeViewport3D(viewportInput); - } else { - throw new Error(`Viewport Type ${type} is not supported`); - } - - // 5. Storing the viewports - this._viewports.set(viewportId, viewport); - - const eventDetail: EventTypes.ElementEnabledEventDetail = { - element, - viewportId, - renderingEngineId: this.id, - }; - - if (!viewport.suppressEvents) { - triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail); - } - } - - /** - * Adds a viewport using a custom rendering pipeline to the `RenderingEngine`. - * - * @param viewportInputEntry - Information object used to - * construct and enable the viewport. - */ - private addCustomViewport(viewportInputEntry: PublicViewportInput): void { - const { element, viewportId, type, defaultOptions } = viewportInputEntry; - - // Make the element not focusable, we use this for modifier keys to work - element.tabIndex = -1; - - const canvas = getOrCreateCanvas(element); - - // Add a viewport with no offset - const { clientWidth, clientHeight } = canvas; - - // Set the canvas to be same resolution as the client. - // Note: This ignores devicePixelRatio for now. We may want to change it in the - // future but it has no benefit for the Cornerstone CPU rendering pathway at the - // moment anyway. - if (canvas.width !== clientWidth || canvas.height !== clientHeight) { - canvas.width = clientWidth; - canvas.height = clientHeight; - } - - const viewportInput = { - id: viewportId, - renderingEngineId: this.id, - element, // div - type, - canvas, - sx: 0, // No offset, uses own renderer - sy: 0, - sWidth: clientWidth, - sHeight: clientHeight, - defaultOptions: defaultOptions || {}, - } as ViewportInput; - - // 4. Create a proper viewport based on the type of the viewport - const ViewportType = viewportTypeToViewportClass[type]; - const viewport = new ViewportType(viewportInput); - - // 5. Storing the viewports - this._viewports.set(viewportId, viewport); - - const eventDetail: EventTypes.ElementEnabledEventDetail = { - element, - viewportId, - renderingEngineId: this.id, - }; - - triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail); - } - - /** - * Sets multiple viewports using custom rendering - * pipelines to the `RenderingEngine`. - * - * @param viewportInputEntries - An array of information - * objects used to construct and enable the viewports. - */ - private setCustomViewports(viewportInputEntries: PublicViewportInput[]) { - viewportInputEntries.forEach((vpie) => { - this.addCustomViewport(vpie); - }); - } - - /** - * Sets multiple vtk.js driven viewports to - * the `RenderingEngine`. - * - * @param viewportInputEntries - An array of information - * objects used to construct and enable the viewports. - */ - private setVtkjsDrivenViewports( - viewportInputEntries: NormalizedViewportInput[] - ) { - // Deal with vtkjs driven viewports - if (viewportInputEntries.length) { - // 1. Getting all the canvases from viewports calculation of the new offScreen size - const vtkDrivenCanvases = viewportInputEntries.map((vp) => - getOrCreateCanvas(vp.element) - ); - - // Ensure the canvas size includes any scaling due to device pixel ratio - vtkDrivenCanvases.forEach((canvas) => { - const devicePixelRatio = window.devicePixelRatio || 1; - - const rect = canvas.getBoundingClientRect(); - canvas.width = rect.width * devicePixelRatio; - canvas.height = rect.height * devicePixelRatio; - }); - - // 2. Set canvas size based on height and sum of widths - const { offScreenCanvasWidth, offScreenCanvasHeight } = - this._resizeOffScreenCanvas(vtkDrivenCanvases); - - /* - TODO: Commenting this out until we can mock the Canvas usage in the tests (or use jsdom?) - if (!offScreenCanvasWidth || !offScreenCanvasHeight) { - throw new Error('Invalid offscreen canvas width or height') - }*/ - - // 3. Adding the viewports based on the viewportInputEntry definition to the - // rendering engine. - let xOffset = 0; - for (let i = 0; i < viewportInputEntries.length; i++) { - const vtkDrivenViewportInputEntry = viewportInputEntries[i]; - const canvas = vtkDrivenCanvases[i]; - const internalViewportEntry = { - ...vtkDrivenViewportInputEntry, - canvas, - }; - - this.addVtkjsDrivenViewport(internalViewportEntry, { - offScreenCanvasWidth, - offScreenCanvasHeight, - xOffset, - }); - - // Incrementing the xOffset which provides the horizontal location of each - // viewport on the offScreen canvas - xOffset += canvas.width; - } - } - } - - /** - * Resizes the offscreen canvas based on the provided vtk.js driven canvases. - * - * @param canvases - An array of HTML Canvas - */ - private _resizeOffScreenCanvas(canvasesDrivenByVtkJs: HTMLCanvasElement[]): { - offScreenCanvasWidth: number; - offScreenCanvasHeight: number; - } { - const { offScreenCanvasContainer, offscreenMultiRenderWindow } = this; - - // 1. Calculated the height of the offScreen canvas to be the maximum height - // between canvases - const offScreenCanvasHeight = Math.max( - ...canvasesDrivenByVtkJs.map((canvas) => canvas.height) - ); - - // 2. Calculating the width of the offScreen canvas to be the sum of all - let offScreenCanvasWidth = 0; - - canvasesDrivenByVtkJs.forEach((canvas) => { - offScreenCanvasWidth += canvas.width; - }); - - // @ts-expect-error - offScreenCanvasContainer.width = offScreenCanvasWidth; - // @ts-expect-error - offScreenCanvasContainer.height = offScreenCanvasHeight; - - // 3. Resize command - offscreenMultiRenderWindow.resize(); - - return { offScreenCanvasWidth, offScreenCanvasHeight }; - } - - /** - * Recalculates and updates the viewports location on the offScreen canvas upon its resize - * - * @param viewports - An array of viewports - * @param offScreenCanvasWidth - new offScreen canvas width - * @param offScreenCanvasHeight - new offScreen canvas height - * - * @returns _xOffset the final offset which will be used for the next viewport - */ - private _resize( - viewportsDrivenByVtkJs: (IStackViewport | IVolumeViewport)[], - offScreenCanvasWidth: number, - offScreenCanvasHeight: number - ): number { - // Redefine viewport properties - let _xOffset = 0; - - for (let i = 0; i < viewportsDrivenByVtkJs.length; i++) { - const viewport = viewportsDrivenByVtkJs[i]; - const { - sxStartDisplayCoords, - syStartDisplayCoords, - sxEndDisplayCoords, - syEndDisplayCoords, - sx, - sy, - sWidth, - sHeight, - } = this._getViewportCoordsOnOffScreenCanvas( - viewport as IViewport, - offScreenCanvasWidth, - offScreenCanvasHeight, - _xOffset - ); - - _xOffset += viewport.canvas.width; - - viewport.sx = sx; - viewport.sy = sy; - viewport.sWidth = sWidth; - viewport.sHeight = sHeight; - - // Updating the renderer for the viewport - const renderer = this.offscreenMultiRenderWindow.getRenderer(viewport.id); - renderer.setViewport([ - sxStartDisplayCoords, - syStartDisplayCoords, - sxEndDisplayCoords, - syEndDisplayCoords, - ]); - } - - // Returns the final xOffset - return _xOffset; - } - - /** - * Calculates the location of the provided viewport on the offScreenCanvas - * - * @param viewports - An array of viewports - * @param offScreenCanvasWidth - new offScreen canvas width - * @param offScreenCanvasHeight - new offScreen canvas height - * @param _xOffset - xOffSet to draw - */ - private _getViewportCoordsOnOffScreenCanvas( - viewport: InternalViewportInput | IViewport, - offScreenCanvasWidth: number, - offScreenCanvasHeight: number, - _xOffset: number - ): ViewportDisplayCoords { - const { canvas } = viewport; - const { width: sWidth, height: sHeight } = canvas; - - // Update the canvas drawImage offsets. - const sx = _xOffset; - const sy = 0; - - const sxStartDisplayCoords = sx / offScreenCanvasWidth; - - // Need to offset y if it not max height - const syStartDisplayCoords = - sy + (offScreenCanvasHeight - sHeight) / offScreenCanvasHeight; - - const sWidthDisplayCoords = sWidth / offScreenCanvasWidth; - const sHeightDisplayCoords = sHeight / offScreenCanvasHeight; - - return { - sxStartDisplayCoords, - syStartDisplayCoords, - sxEndDisplayCoords: sxStartDisplayCoords + sWidthDisplayCoords, - syEndDisplayCoords: syStartDisplayCoords + sHeightDisplayCoords, - sx, - sy, - sWidth, - sHeight, - }; - } - - /** - * @method _getViewportsAsArray Returns an array of all viewports - * - * @returns {Array} Array of viewports. - */ - private _getViewportsAsArray() { - return Array.from(this._viewports.values()); - } - - private _setViewportsToBeRenderedNextFrame(viewportIds: string[]) { - // Add the viewports to the set of flagged viewports - viewportIds.forEach((viewportId) => { - this._needsRender.add(viewportId); - }); - - // Render any flagged viewports - this._render(); - } - - /** - * Sets up animation frame if necessary - */ - private _render() { - // If we have viewports that need rendering and we have not already - // set the RAF callback to run on the next frame. - if (this._needsRender.size > 0 && !this._animationFrameSet) { - this._animationFrameHandle = window.requestAnimationFrame( - this._renderFlaggedViewports - ); - - // Set the flag that we have already set up the next RAF call. - this._animationFrameSet = true; - } - } - - /** - * Renders all viewports. - */ - private _renderFlaggedViewports = () => { - this._throwIfDestroyed(); - - if (!this.useCPURendering) { - this.performVtkDrawCall(); - } - - const viewports = this._getViewportsAsArray(); - const eventDetailArray = []; - - for (let i = 0; i < viewports.length; i++) { - const viewport = viewports[i]; - if (this._needsRender.has(viewport.id)) { - const eventDetail = - this.renderViewportUsingCustomOrVtkPipeline(viewport); - eventDetailArray.push(eventDetail); - viewport.setRendered(); - - // This viewport has been rendered, we can remove it from the set - this._needsRender.delete(viewport.id); - - // If there is nothing left that is flagged for rendering, stop the loop - if (this._needsRender.size === 0) { - break; - } - } - } - - // allow RAF to be called again - this._animationFrameSet = false; - this._animationFrameHandle = null; - - eventDetailArray.forEach((eventDetail) => { - // Very small viewports won't have an element - if (!eventDetail?.element) { - return; - } - triggerEvent(eventDetail.element, Events.IMAGE_RENDERED, eventDetail); - }); - }; - - /** - * Performs the single `vtk.js` draw call which is used to render the offscreen - * canvas for vtk.js. This is a bulk rendering step for all Volume and Stack - * viewports when GPU rendering is available. - */ - private performVtkDrawCall() { - // Render all viewports under vtk.js' control. - const { offscreenMultiRenderWindow } = this; - const renderWindow = offscreenMultiRenderWindow.getRenderWindow(); - - const renderers = offscreenMultiRenderWindow.getRenderers(); - - if (!renderers.length) { - return; - } - - for (let i = 0; i < renderers.length; i++) { - const { renderer, id } = renderers[i]; - - // Requesting viewports that need rendering to be rendered only - if (this._needsRender.has(id)) { - renderer.setDraw(true); - } else { - renderer.setDraw(false); - } - } - - renderWindow.render(); - - // After redraw we set all renderers to not render until necessary - for (let i = 0; i < renderers.length; i++) { - renderers[i].renderer.setDraw(false); - } - } - - /** - * Renders the given viewport - * using its proffered method. - * - * @param viewport - The viewport to render - */ - private renderViewportUsingCustomOrVtkPipeline( - viewport: IViewport - ): EventTypes.ImageRenderedEventDetail[] { - let eventDetail; - - // Rendering engines start having issues without at least two pixels - // in each direction - if ( - viewport.sWidth < VIEWPORT_MIN_SIZE || - viewport.sHeight < VIEWPORT_MIN_SIZE - ) { - console.warn('Viewport is too small', viewport.sWidth, viewport.sHeight); - return; - } - if (viewportTypeUsesCustomRenderingPipeline(viewport.type) === true) { - eventDetail = - viewport.customRenderViewportToCanvas() as EventTypes.ImageRenderedEventDetail; - } else { - if (this.useCPURendering) { - throw new Error( - 'GPU not available, and using a viewport with no custom render pipeline.' - ); - } - - const { offscreenMultiRenderWindow } = this; - const openGLRenderWindow = - offscreenMultiRenderWindow.getOpenGLRenderWindow(); - const context = openGLRenderWindow.get3DContext(); - const offScreenCanvas = context.canvas; - - eventDetail = this._renderViewportFromVtkCanvasToOnscreenCanvas( - viewport, - offScreenCanvas - ); - } - - return eventDetail; - } - - /** - * Renders a particular `Viewport`'s on screen canvas. - * @param viewport - The `Viewport` to render. - * @param offScreenCanvas - The offscreen canvas to render from. - */ - private _renderViewportFromVtkCanvasToOnscreenCanvas( - viewport: IViewport, - offScreenCanvas - ): EventTypes.ImageRenderedEventDetail { - const { - element, + return this._implementation.fillCanvasWithBackgroundColor( canvas, - sx, - sy, - sWidth, - sHeight, - id: viewportId, - renderingEngineId, - suppressEvents, - } = viewport; - - const { width: dWidth, height: dHeight } = canvas; - - const onScreenContext = canvas.getContext('2d'); - - onScreenContext.drawImage( - offScreenCanvas, - sx, - sy, - sWidth, - sHeight, - 0, //dx - 0, // dy - dWidth, - dHeight + backgroundColor ); - - return { - element, - suppressEvents, - viewportId, - renderingEngineId, - viewportStatus: viewport.viewportStatus, - }; } - /** - * Reset the viewport by removing the data attributes - * and clearing the context of draw. It also emits an element disabled event - * - * @param viewport - The `Viewport` to render. - */ - private _resetViewport(viewport: IViewport) { - const renderingEngineId = this.id; - - const { element, canvas, id: viewportId } = viewport; - - const eventDetail: EventTypes.ElementDisabledEventDetail = { - element, - viewportId, - renderingEngineId, - }; - - viewport.removeWidgets(); - - // Trigger first before removing the data attributes, as we need the enabled - // element to remove tools associated with the viewport - triggerEvent(eventTarget, Events.ELEMENT_DISABLED, eventDetail); - - element.removeAttribute('data-viewport-uid'); - element.removeAttribute('data-rendering-engine-uid'); - - // clear drawing - const context = canvas.getContext('2d'); - context.clearRect(0, 0, canvas.width, canvas.height); - } - - private _clearAnimationFrame() { - window.cancelAnimationFrame(this._animationFrameHandle); - - this._needsRender.clear(); - this._animationFrameSet = false; - this._animationFrameHandle = null; - } - - /** - * Resets the `RenderingEngine` - */ - private _reset() { - const viewports = this._getViewportsAsArray(); - - viewports.forEach((viewport) => { - this._resetViewport(viewport); - }); - - this._clearAnimationFrame(); - - this._viewports = new Map(); + public render(): void { + return this._implementation.render(); } - /** - * Throws an error if trying to interact with the `RenderingEngine` - * instance after its `destroy` method has been called. - */ - private _throwIfDestroyed() { - if (this.hasBeenDestroyed) { - throw new Error( - 'this.destroy() has been manually called to free up memory, can not longer use this instance. Instead make a new one.' - ); - } + public renderViewports(viewportIds: string[]): void { + return this._implementation.renderViewports(viewportIds); } - // debugging utils for offScreen canvas - _downloadOffScreenCanvas() { - const dataURL = this._debugRender(); - _TEMPDownloadURI(dataURL); + public renderViewport(viewportId: string): void { + return this._implementation.renderViewport(viewportId); } - // debugging utils for offScreen canvas - _debugRender(): void { - const { offscreenMultiRenderWindow } = this; - const renderWindow = offscreenMultiRenderWindow.getRenderWindow(); - - const renderers = offscreenMultiRenderWindow.getRenderers(); - - for (let i = 0; i < renderers.length; i++) { - renderers[i].renderer.setDraw(true); - } - - renderWindow.render(); - const openGLRenderWindow = - offscreenMultiRenderWindow.getOpenGLRenderWindow(); - const context = openGLRenderWindow.get3DContext(); - - const offScreenCanvas = context.canvas; - const dataURL = offScreenCanvas.toDataURL(); - - this._getViewportsAsArray().forEach((viewport) => { - const { sx, sy, sWidth, sHeight } = viewport; - - const canvas = viewport.canvas; - const { width: dWidth, height: dHeight } = canvas; - - const onScreenContext = canvas.getContext('2d'); - - //sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight - onScreenContext.drawImage( - offScreenCanvas, - sx, - sy, - sWidth, - sHeight, - 0, //dx - 0, // dy - dWidth, - dHeight - ); - }); - - return dataURL; + public destroy(): void { + return this._implementation.destroy(); } } export default RenderingEngine; - -// debugging utils for offScreen canvas -function _TEMPDownloadURI(uri) { - const link = document.createElement('a'); - - link.download = 'viewport.png'; - link.href = uri; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); -} diff --git a/packages/core/src/RenderingEngine/SequentialRenderingEngine.ts b/packages/core/src/RenderingEngine/SequentialRenderingEngine.ts new file mode 100644 index 0000000000..097fa15906 --- /dev/null +++ b/packages/core/src/RenderingEngine/SequentialRenderingEngine.ts @@ -0,0 +1,409 @@ +import BaseRenderingEngine, { VIEWPORT_MIN_SIZE } from './BaseRenderingEngine'; +import Events from '../enums/Events'; +import eventTarget from '../eventTarget'; +import triggerEvent from '../utilities/triggerEvent'; +import ViewportType from '../enums/ViewportType'; +import VolumeViewport from './VolumeViewport'; +import StackViewport from './StackViewport'; +import viewportTypeUsesCustomRenderingPipeline from './helpers/viewportTypeUsesCustomRenderingPipeline'; +import getOrCreateCanvas from './helpers/getOrCreateCanvas'; +import type IStackViewport from '../types/IStackViewport'; +import type IVolumeViewport from '../types/IVolumeViewport'; +import VolumeViewport3D from './VolumeViewport3D'; +import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; + +import type * as EventTypes from '../types/EventTypes'; +import type { + ViewportInput, + InternalViewportInput, + NormalizedViewportInput, + IViewport, +} from '../types/IViewport'; + +/** + * SequentialRenderingEngine extends BaseRenderingEngine to provide a different + * rendering strategy where viewports are rendered sequentially one at a time on the offscreen, + * rather than all at once. + * + * + * @public + */ +class SequentialRenderingEngine extends BaseRenderingEngine { + /** + * Enables a viewport to be driven by the offscreen vtk.js rendering engine. + * + * @param viewportInputEntry - Information object used to + * construct and enable the viewport. + */ + protected enableVTKjsDrivenViewport( + viewportInputEntry: NormalizedViewportInput + ) { + const viewports = this._getViewportsAsArray(); + const viewportsDrivenByVtkJs = viewports.filter( + (vp) => viewportTypeUsesCustomRenderingPipeline(vp.type) === false + ); + + const canvasesDrivenByVtkJs = viewportsDrivenByVtkJs.map((vp) => vp.canvas); + + const canvas = getOrCreateCanvas(viewportInputEntry.element); + canvasesDrivenByVtkJs.push(canvas); + + const internalViewportEntry = { ...viewportInputEntry, canvas }; + + this.addVtkjsDrivenViewport(internalViewportEntry); + } + + /** + * Adds a viewport driven by vtk.js to the `RenderingEngine`. + * + * @param viewportInputEntry - Information object used to construct and enable the viewport. + */ + protected addVtkjsDrivenViewport( + viewportInputEntry: InternalViewportInput + ): void { + const { element, canvas, viewportId, type, defaultOptions } = + viewportInputEntry; + + element.tabIndex = -1; + + this.offscreenMultiRenderWindow.addRenderer({ + viewport: [0, 0, 1, 1], + id: viewportId, + background: defaultOptions.background + ? defaultOptions.background + : [0, 0, 0], + }); + + const viewportInput = { + id: viewportId, + element, + renderingEngineId: this.id, + type, + canvas, + sx: 0, + sy: 0, + sWidth: canvas.width, + sHeight: canvas.height, + defaultOptions: defaultOptions || {}, + } as ViewportInput; + + let viewport: IViewport; + if (type === ViewportType.STACK) { + viewport = new StackViewport(viewportInput); + } else if ( + type === ViewportType.ORTHOGRAPHIC || + type === ViewportType.PERSPECTIVE + ) { + viewport = new VolumeViewport(viewportInput); + } else if (type === ViewportType.VOLUME_3D) { + viewport = new VolumeViewport3D(viewportInput); + } else { + throw new Error(`Viewport Type ${type} is not supported`); + } + + this._viewports.set(viewportId, viewport); + + const eventDetail: EventTypes.ElementEnabledEventDetail = { + element, + viewportId, + renderingEngineId: this.id, + }; + + if (!viewport.suppressEvents) { + triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail); + } + } + + /** + * Sets multiple vtk.js driven viewports to + * the `RenderingEngine`. + * + * @param viewportInputEntries - An array of information + * objects used to construct and enable the viewports. + */ + protected setVtkjsDrivenViewports( + viewportInputEntries: NormalizedViewportInput[] + ) { + if (viewportInputEntries.length) { + const vtkDrivenCanvases = viewportInputEntries.map((vp) => + getOrCreateCanvas(vp.element) + ); + + vtkDrivenCanvases.forEach((canvas) => { + const devicePixelRatio = window.devicePixelRatio || 1; + + const rect = canvas.getBoundingClientRect(); + canvas.width = rect.width * devicePixelRatio; + canvas.height = rect.height * devicePixelRatio; + }); + + for (let i = 0; i < viewportInputEntries.length; i++) { + const vtkDrivenViewportInputEntry = viewportInputEntries[i]; + const canvas = vtkDrivenCanvases[i]; + const internalViewportEntry = { + ...vtkDrivenViewportInputEntry, + canvas, + }; + + this.addVtkjsDrivenViewport(internalViewportEntry); + } + } + } + + /** + * Resizes viewports that use VTK.js for rendering. + */ + protected _resizeVTKViewports( + vtkDrivenViewports: (IStackViewport | IVolumeViewport)[], + keepCamera = true, + immediate = true + ) { + const canvasesDrivenByVtkJs = vtkDrivenViewports.map( + (vp: IStackViewport | IVolumeViewport) => { + return getOrCreateCanvas(vp.element); + } + ); + + canvasesDrivenByVtkJs.forEach((canvas) => { + const devicePixelRatio = window.devicePixelRatio || 1; + canvas.width = canvas.clientWidth * devicePixelRatio; + canvas.height = canvas.clientHeight * devicePixelRatio; + }); + + if (canvasesDrivenByVtkJs.length) { + this._resize(vtkDrivenViewports); + } + + vtkDrivenViewports.forEach((vp: IStackViewport | IVolumeViewport) => { + const prevCamera = vp.getCamera(); + const rotation = vp.getRotation(); + const { flipHorizontal } = prevCamera; + vp.resetCameraForResize(); + + const displayArea = vp.getDisplayArea(); + + if (keepCamera) { + if (displayArea) { + if (flipHorizontal) { + vp.setCamera({ flipHorizontal }); + } + if (rotation) { + vp.setViewPresentation({ rotation }); + } + } else { + vp.setCamera(prevCamera); + } + } + }); + + if (immediate) { + this.render(); + } + } + + /** + * Renders all viewports. + */ + protected _renderFlaggedViewports = () => { + this._throwIfDestroyed(); + + const viewports = this._getViewportsAsArray(); + const eventDetailArray = []; + + for (let i = 0; i < viewports.length; i++) { + const viewport = viewports[i]; + if (this._needsRender.has(viewport.id)) { + const eventDetail = + this.renderViewportUsingCustomOrVtkPipeline(viewport); + eventDetailArray.push(eventDetail); + viewport.setRendered(); + + this._needsRender.delete(viewport.id); + + if (this._needsRender.size === 0) { + break; + } + } + } + + this._animationFrameSet = false; + this._animationFrameHandle = null; + + eventDetailArray.forEach((eventDetail) => { + if (!eventDetail?.element) { + return; + } + triggerEvent(eventDetail.element, Events.IMAGE_RENDERED, eventDetail); + }); + }; + + /** + * Renders the given viewport + * using its proffered method. + * + * @param viewport - The viewport to render + */ + protected renderViewportUsingCustomOrVtkPipeline( + viewport: IViewport + ): EventTypes.ImageRenderedEventDetail { + let eventDetail: EventTypes.ImageRenderedEventDetail; + + if ( + viewport.sWidth < VIEWPORT_MIN_SIZE || + viewport.sHeight < VIEWPORT_MIN_SIZE + ) { + console.warn('Viewport is too small', viewport.sWidth, viewport.sHeight); + return; + } + if (viewportTypeUsesCustomRenderingPipeline(viewport.type) === true) { + eventDetail = + viewport.customRenderViewportToCanvas() as EventTypes.ImageRenderedEventDetail; + } else { + if (this.useCPURendering) { + throw new Error( + 'GPU not available, and using a viewport with no custom render pipeline.' + ); + } + + const { offscreenMultiRenderWindow } = this; + const renderWindow = offscreenMultiRenderWindow.getRenderWindow(); + + this._resizeOffScreenCanvasForSingleViewport(viewport.canvas); + + const renderer = offscreenMultiRenderWindow.getRenderer(viewport.id); + + renderer.setViewport([0, 0, 1, 1]); + + const allRenderers = offscreenMultiRenderWindow.getRenderers(); + + allRenderers.forEach(({ renderer: r, id }) => { + r.setDraw(id === viewport.id); + }); + + const widgetRenderers = this.getWidgetRenderers(); + + widgetRenderers.forEach((viewportId, renderer) => { + renderer.setDraw(viewportId === viewport.id); + }); + + renderWindow.render(); + + allRenderers.forEach(({ renderer: r }) => r.setDraw(false)); + + const openGLRenderWindow = + offscreenMultiRenderWindow.getOpenGLRenderWindow(); + const context = openGLRenderWindow.get3DContext(); + const offScreenCanvas = context.canvas; + + eventDetail = this._renderViewportFromVtkCanvasToOnscreenCanvas( + viewport, + offScreenCanvas + ); + } + + return eventDetail; + } + + /** + * Renders a particular `Viewport`'s on screen canvas. + * @param viewport - The `Viewport` to render. + * @param offScreenCanvas - The offscreen canvas to render from. + */ + protected _renderViewportFromVtkCanvasToOnscreenCanvas( + viewport: IViewport, + offScreenCanvas: HTMLCanvasElement + ): EventTypes.ImageRenderedEventDetail { + const { + element, + canvas, + id: viewportId, + renderingEngineId, + suppressEvents, + } = viewport; + + const { width: dWidth, height: dHeight } = canvas; + + const onScreenContext = canvas.getContext('2d'); + + onScreenContext.drawImage( + offScreenCanvas, + 0, + 0, + dWidth, + dHeight, + 0, + 0, + dWidth, + dHeight + ); + + return { + element, + suppressEvents, + viewportId, + renderingEngineId, + viewportStatus: viewport.viewportStatus, + }; + } + + private _resizeOffScreenCanvasForSingleViewport( + currentViewport: HTMLCanvasElement + ): { + offScreenCanvasWidth: number; + offScreenCanvasHeight: number; + } { + const { offScreenCanvasContainer, offscreenMultiRenderWindow } = this; + + const offScreenCanvasWidth = currentViewport.width; + const offScreenCanvasHeight = currentViewport.height; + + // @ts-expect-error + offScreenCanvasContainer.width = offScreenCanvasWidth; + // @ts-expect-error + offScreenCanvasContainer.height = offScreenCanvasHeight; + + offscreenMultiRenderWindow.resize(); + + return { offScreenCanvasWidth, offScreenCanvasHeight }; + } + + private _resize( + viewportsDrivenByVtkJs: (IStackViewport | IVolumeViewport)[] + ): void { + for (const viewport of viewportsDrivenByVtkJs) { + viewport.sx = 0; + viewport.sy = 0; + viewport.sWidth = viewport.canvas.width; + viewport.sHeight = viewport.canvas.height; + + const renderer = this.offscreenMultiRenderWindow.getRenderer(viewport.id); + renderer.setViewport([0, 0, 1, 1]); + } + } + + /** + * + * @returns A map of widget renderers and their associated viewport IDs. + * This method iterates through all viewports, retrieves their widgets, + * and maps each widget's renderer to the viewport ID. + */ + private getWidgetRenderers(): Map { + const allViewports = this._getViewportsAsArray(); + + const widgetRenderers = new Map(); + + allViewports.forEach((vp) => { + const widgets = vp.getWidgets ? vp.getWidgets() : []; + widgets.forEach((widget) => { + const renderer = widget.getRenderer ? widget.getRenderer() : null; + if (renderer) { + widgetRenderers.set(renderer, vp.id); + } + }); + }); + + return widgetRenderers; + } +} + +export default SequentialRenderingEngine; diff --git a/packages/core/src/RenderingEngine/StackViewport.ts b/packages/core/src/RenderingEngine/StackViewport.ts index 1ac9813646..06903e20c0 100644 --- a/packages/core/src/RenderingEngine/StackViewport.ts +++ b/packages/core/src/RenderingEngine/StackViewport.ts @@ -97,6 +97,7 @@ import uuidv4 from '../utilities/uuidv4'; import getSpacingInNormalDirection from '../utilities/getSpacingInNormalDirection'; import getClosestImageId from '../utilities/getClosestImageId'; import { adjustInitialViewUp } from '../utilities/adjustInitialViewUp'; +import { isSequentialRenderingEngine } from './helpers/isSequentialRenderingEngine'; const EPSILON = 1; // Slice Thickness @@ -234,6 +235,9 @@ class StackViewport extends Viewport { }; private _configureRenderingPipeline(value?: boolean) { + const renderingEngine = this.getRenderingEngine(); + const isSequential = isSequentialRenderingEngine(renderingEngine); + this.useCPURendering = value ?? getShouldUseCPURendering(); for (const key in this.renderingPipelineFunctions) { @@ -244,7 +248,21 @@ class StackViewport extends Viewport { ) ) { const functions = this.renderingPipelineFunctions[key]; - this[key] = this.useCPURendering ? functions.cpu : functions.gpu; + if (this.useCPURendering) { + this[key] = functions.cpu; + } else { + if ( + typeof functions.gpu === 'object' && + functions.gpu.sequential && + functions.gpu.default + ) { + this[key] = isSequential + ? functions.gpu.sequential + : functions.gpu.default; + } else { + this[key] = functions.gpu; + } + } } } @@ -2826,6 +2844,60 @@ class StackViewport extends Viewport { return canvasPoint; }; + private canvasToWorldGPUSequential = (canvasPos: Point2): Point3 => { + const renderer = this.getRenderer(); + + // Temporary setting the clipping range to the distance and distance + 0.1 + // in order to calculate the transformations correctly. + // This is similar to the vtkSlabCamera isPerformingCoordinateTransformations + // You can read more about it here there. + const vtkCamera = this.getVtkActiveCamera(); + const crange = vtkCamera.getClippingRange(); + const distance = vtkCamera.getDistance(); + + vtkCamera.setClippingRange(distance, distance + 0.1); + + const devicePixelRatio = window.devicePixelRatio || 1; + const { width, height } = this.canvas; + const aspectRatio = width / height; + + // Convert canvas coordinates to normalized display coordinates + const canvasPosWithDPR = [ + canvasPos[0] * devicePixelRatio, + canvasPos[1] * devicePixelRatio, + ]; + + // Normalize to [0,1] range + const normalizedDisplay = [ + canvasPosWithDPR[0] / width, + 1 - canvasPosWithDPR[1] / height, // Flip Y axis + 0, + ]; + + // Transform from normalized display to world coordinates + const projCoords = renderer.normalizedDisplayToProjection( + normalizedDisplay[0], + normalizedDisplay[1], + normalizedDisplay[2] + ); + const viewCoords = renderer.projectionToView( + projCoords[0], + projCoords[1], + projCoords[2], + aspectRatio + ); + const worldCoord = renderer.viewToWorld( + viewCoords[0], + viewCoords[1], + viewCoords[2] + ); + + // set clipping range back to original to be able + vtkCamera.setClippingRange(crange[0], crange[1]); + + return [worldCoord[0], worldCoord[1], worldCoord[2]]; + }; + private canvasToWorldGPU = (canvasPos: Point2): Point3 => { const renderer = this.getRenderer(); @@ -2846,6 +2918,7 @@ class StackViewport extends Viewport { const size = openGLRenderWindow.getSize(); const devicePixelRatio = window.devicePixelRatio || 1; + const canvasPosWithDPR = [ canvasPos[0] * devicePixelRatio, canvasPos[1] * devicePixelRatio, @@ -2871,6 +2944,58 @@ class StackViewport extends Viewport { return [worldCoord[0], worldCoord[1], worldCoord[2]]; }; + private worldToCanvasGPUSequential = (worldPos: Point3): Point2 => { + const renderer = this.getRenderer(); + + // Temporary setting the clipping range to the distance and distance + 0.1 + // in order to calculate the transformations correctly. + // This is similar to the vtkSlabCamera isPerformingCoordinateTransformations + // You can read more about it here there. + const vtkCamera = this.getVtkActiveCamera(); + const crange = vtkCamera.getClippingRange(); + const distance = vtkCamera.getDistance(); + + vtkCamera.setClippingRange(distance, distance + 0.1); + + const devicePixelRatio = window.devicePixelRatio || 1; + + const { width, height } = this.canvas; + + const aspectRatio = width / height; + + const viewCoords = renderer.worldToView( + worldPos[0], + worldPos[1], + worldPos[2] + ); + + const projCoords = renderer.viewToProjection( + viewCoords[0], + viewCoords[1], + viewCoords[2], + aspectRatio + ); + + const normalizedDisplay = renderer.projectionToNormalizedDisplay( + projCoords[0], + projCoords[1], + projCoords[2] + ); + + const canvasX = normalizedDisplay[0] * width; + const canvasY = (1 - normalizedDisplay[1]) * height; + + // set clipping range back to original to be able + vtkCamera.setClippingRange(crange[0], crange[1]); + + const canvasCoordWithDPR = [ + canvasX / devicePixelRatio, + canvasY / devicePixelRatio, + ] as Point2; + + return canvasCoordWithDPR; + }; + private worldToCanvasGPU = (worldPos: Point3): Point2 => { const renderer = this.getRenderer(); @@ -3382,11 +3507,17 @@ class StackViewport extends Viewport { }, canvasToWorld: { cpu: this.canvasToWorldCPU, - gpu: this.canvasToWorldGPU, + gpu: { + sequential: this.canvasToWorldGPUSequential, + default: this.canvasToWorldGPU, + }, }, worldToCanvas: { cpu: this.worldToCanvasCPU, - gpu: this.worldToCanvasGPU, + gpu: { + sequential: this.worldToCanvasGPUSequential, + default: this.worldToCanvasGPU, + }, }, getRenderer: { cpu: () => this.getCPUFallbackError('getRenderer'), diff --git a/packages/core/src/RenderingEngine/StandardRenderingEngine.ts b/packages/core/src/RenderingEngine/StandardRenderingEngine.ts new file mode 100644 index 0000000000..d3bc9ee756 --- /dev/null +++ b/packages/core/src/RenderingEngine/StandardRenderingEngine.ts @@ -0,0 +1,635 @@ +import BaseRenderingEngine, { VIEWPORT_MIN_SIZE } from './BaseRenderingEngine'; +import Events from '../enums/Events'; +import eventTarget from '../eventTarget'; +import triggerEvent from '../utilities/triggerEvent'; +import ViewportType from '../enums/ViewportType'; +import VolumeViewport from './VolumeViewport'; +import StackViewport from './StackViewport'; +import viewportTypeUsesCustomRenderingPipeline from './helpers/viewportTypeUsesCustomRenderingPipeline'; +import getOrCreateCanvas from './helpers/getOrCreateCanvas'; +import type IStackViewport from '../types/IStackViewport'; +import type IVolumeViewport from '../types/IVolumeViewport'; +import VolumeViewport3D from './VolumeViewport3D'; + +import type * as EventTypes from '../types/EventTypes'; +import type { + ViewportInput, + InternalViewportInput, + NormalizedViewportInput, + IViewport, +} from '../types/IViewport'; + +interface ViewportDisplayCoords { + sxStartDisplayCoords: number; + syStartDisplayCoords: number; + sxEndDisplayCoords: number; + syEndDisplayCoords: number; + sx: number; + sy: number; + sWidth: number; + sHeight: number; +} + +/** + * A RenderingEngine takes care of the full pipeline of creating viewports and rendering + * them on a large offscreen canvas and transmitting this data back to the screen. This allows us + * to leverage the power of vtk.js whilst only using one WebGL context for the processing, and allowing + * us to share texture memory across on-screen viewports that show the same data. + * + * + * Instantiating a rendering engine: + * ```js + * const renderingEngine = new RenderingEngine('pet-ct-rendering-engine'); + * ``` + * + * There are various ways you can trigger a render on viewports. The simplest is to call `render()` + * on the rendering engine; however, it will trigger a render on all viewports. A more efficient + * way to do this is to call `renderViewports([viewportId])` on the rendering engine to + * trigger a render on a specific viewport(s). Each viewport also has a `.render` method which can be used to trigger a render on that + * viewport. + * + * + * RenderingEngine checks for WebGL context availability to determine if GPU rendering is possible. + * If a WebGL context is not available, RenderingEngine will fall back to CPU rendering for StackViewports. + * However, for volume rendering, GPU availability is required, and an error will be thrown if attempted without GPU support. + * + * By default, RenderingEngine will use the vtk.js-enabled pipeline for rendering viewports. + * However, if a custom rendering pipeline is specified by a custom viewport, it will be used instead. + * We use this custom pipeline to render a StackViewport on CPU using the Cornerstone legacy CPU rendering pipeline. + * + * @public + */ +class StandardRenderingEngine extends BaseRenderingEngine { + /** + * Enables a viewport to be driven by the offscreen vtk.js rendering engine. + * + * @param viewportInputEntry - Information object used to + * construct and enable the viewport. + */ + protected enableVTKjsDrivenViewport( + viewportInputEntry: NormalizedViewportInput + ) { + const viewports = this._getViewportsAsArray(); + const viewportsDrivenByVtkJs = viewports.filter( + (vp) => viewportTypeUsesCustomRenderingPipeline(vp.type) === false + ); + + const canvasesDrivenByVtkJs = viewportsDrivenByVtkJs.map((vp) => vp.canvas); + + const canvas = getOrCreateCanvas(viewportInputEntry.element); + canvasesDrivenByVtkJs.push(canvas); + + // 2.c Calculating the new size for offScreen Canvas + const { offScreenCanvasWidth, offScreenCanvasHeight } = + this._resizeOffScreenCanvas(canvasesDrivenByVtkJs); + + // 2.d Re-position previous viewports on the offScreen Canvas based on the new + // offScreen canvas size + const xOffset = this._resize( + viewportsDrivenByVtkJs as (IStackViewport | IVolumeViewport)[], + offScreenCanvasWidth, + offScreenCanvasHeight + ); + + const internalViewportEntry = { ...viewportInputEntry, canvas }; + + // 3 Add the requested viewport to rendering Engine + this.addVtkjsDrivenViewport(internalViewportEntry, { + offScreenCanvasWidth, + offScreenCanvasHeight, + xOffset, + }); + } + + /** + * Adds a viewport driven by vtk.js to the `RenderingEngine`. + * + * @param viewportInputEntry - Information object used to construct and enable the viewport. + * @param options - Options object used to configure the viewport. + * @param options.offScreenCanvasWidth - The width of the offscreen canvas. + * @param options.offScreenCanvasHeight - The height of the offscreen canvas. + * @param options.xOffset - The x offset of the viewport on the offscreen canvas. + */ + protected addVtkjsDrivenViewport( + viewportInputEntry: InternalViewportInput, + offscreenCanvasProperties?: { + offScreenCanvasWidth: number; + offScreenCanvasHeight: number; + xOffset: number; + } + ): void { + const { element, canvas, viewportId, type, defaultOptions } = + viewportInputEntry; + + // Make the element not focusable, we use this for modifier keys to work + element.tabIndex = -1; + + const { offScreenCanvasWidth, offScreenCanvasHeight, xOffset } = + offscreenCanvasProperties; + + // 1. Calculate the size of location of the viewport on the offScreen canvas + const { + sxStartDisplayCoords, + syStartDisplayCoords, + sxEndDisplayCoords, + syEndDisplayCoords, + sx, + sy, + sWidth, + sHeight, + } = this._getViewportCoordsOnOffScreenCanvas( + viewportInputEntry, + offScreenCanvasWidth, + offScreenCanvasHeight, + xOffset + ); + // 2. Add a renderer to the offScreenMultiRenderWindow + this.offscreenMultiRenderWindow.addRenderer({ + viewport: [ + sxStartDisplayCoords, + syStartDisplayCoords, + sxEndDisplayCoords, + syEndDisplayCoords, + ], + id: viewportId, + background: defaultOptions.background + ? defaultOptions.background + : [0, 0, 0], + }); + + // 3. ViewportInput to be passed to a stack/volume viewport + const viewportInput = { + id: viewportId, + element, // div + renderingEngineId: this.id, + type, + canvas, + sx, + sy, + sWidth, + sHeight, + defaultOptions: defaultOptions || {}, + } as ViewportInput; + + // 4. Create a proper viewport based on the type of the viewport + let viewport: IViewport; + if (type === ViewportType.STACK) { + // 4.a Create stack viewport + viewport = new StackViewport(viewportInput); + } else if ( + type === ViewportType.ORTHOGRAPHIC || + type === ViewportType.PERSPECTIVE + ) { + // 4.b Create a volume viewport + viewport = new VolumeViewport(viewportInput); + } else if (type === ViewportType.VOLUME_3D) { + viewport = new VolumeViewport3D(viewportInput); + } else { + throw new Error(`Viewport Type ${type} is not supported`); + } + + // 5. Storing the viewports + this._viewports.set(viewportId, viewport); + + const eventDetail: EventTypes.ElementEnabledEventDetail = { + element, + viewportId, + renderingEngineId: this.id, + }; + + if (!viewport.suppressEvents) { + triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail); + } + } + + /** + * Sets multiple vtk.js driven viewports to + * the `RenderingEngine`. + * + * @param viewportInputEntries - An array of information + * objects used to construct and enable the viewports. + */ + protected setVtkjsDrivenViewports( + viewportInputEntries: NormalizedViewportInput[] + ) { + // Deal with vtkjs driven viewports + if (viewportInputEntries.length) { + // 1. Getting all the canvases from viewports calculation of the new offScreen size + const vtkDrivenCanvases = viewportInputEntries.map((vp) => + getOrCreateCanvas(vp.element) + ); + + // Ensure the canvas size includes any scaling due to device pixel ratio + vtkDrivenCanvases.forEach((canvas) => { + const devicePixelRatio = window.devicePixelRatio || 1; + + const rect = canvas.getBoundingClientRect(); + canvas.width = rect.width * devicePixelRatio; + canvas.height = rect.height * devicePixelRatio; + }); + + // 2. Set canvas size based on height and sum of widths + const { offScreenCanvasWidth, offScreenCanvasHeight } = + this._resizeOffScreenCanvas(vtkDrivenCanvases); + + /* + TODO: Commenting this out until we can mock the Canvas usage in the tests (or use jsdom?) + if (!offScreenCanvasWidth || !offScreenCanvasHeight) { + throw new Error('Invalid offscreen canvas width or height') + }*/ + + // 3. Adding the viewports based on the viewportInputEntry definition to the + // rendering engine. + let xOffset = 0; + for (let i = 0; i < viewportInputEntries.length; i++) { + const vtkDrivenViewportInputEntry = viewportInputEntries[i]; + const canvas = vtkDrivenCanvases[i]; + const internalViewportEntry = { + ...vtkDrivenViewportInputEntry, + canvas, + }; + + this.addVtkjsDrivenViewport(internalViewportEntry, { + offScreenCanvasWidth, + offScreenCanvasHeight, + xOffset, + }); + + // Incrementing the xOffset which provides the horizontal location of each + // viewport on the offScreen canvas + xOffset += canvas.width; + } + } + } + + /** + * Resizes viewports that use VTK.js for rendering. + */ + protected _resizeVTKViewports( + vtkDrivenViewports: (IStackViewport | IVolumeViewport)[], + keepCamera = true, + immediate = true + ) { + // Ensure all the canvases are ready for rendering + const canvasesDrivenByVtkJs = vtkDrivenViewports.map( + (vp: IStackViewport | IVolumeViewport) => { + return getOrCreateCanvas(vp.element); + } + ); + + // reset the canvas size to the client size + canvasesDrivenByVtkJs.forEach((canvas) => { + const devicePixelRatio = window.devicePixelRatio || 1; + canvas.width = canvas.clientWidth * devicePixelRatio; + canvas.height = canvas.clientHeight * devicePixelRatio; + }); + + if (canvasesDrivenByVtkJs.length) { + // 1. Recalculate and resize the offscreen canvas size + const { offScreenCanvasWidth, offScreenCanvasHeight } = + this._resizeOffScreenCanvas(canvasesDrivenByVtkJs); + + // 2. Recalculate the viewports location on the off screen canvas + this._resize( + vtkDrivenViewports, + offScreenCanvasWidth, + offScreenCanvasHeight + ); + } + + // 3. Reset viewport cameras + vtkDrivenViewports.forEach((vp: IStackViewport | IVolumeViewport) => { + const prevCamera = vp.getCamera(); + const rotation = vp.getRotation(); + const { flipHorizontal } = prevCamera; + vp.resetCameraForResize(); + + const displayArea = vp.getDisplayArea(); + + // TODO - make this use get/set Presentation or in some way preserve the + // basic presentation info on this viewport, rather than preserving camera + if (keepCamera) { + if (displayArea) { + if (flipHorizontal) { + vp.setCamera({ flipHorizontal }); + } + if (rotation) { + vp.setViewPresentation({ rotation }); + } + } else { + vp.setCamera(prevCamera); + } + } + }); + + // 4. If render is immediate: Render all + if (immediate) { + this.render(); + } + } + + /** + * Renders all viewports. + */ + protected _renderFlaggedViewports = () => { + this._throwIfDestroyed(); + + if (!this.useCPURendering) { + this.performVtkDrawCall(); + } + + const viewports = this._getViewportsAsArray(); + const eventDetailArray = []; + + for (let i = 0; i < viewports.length; i++) { + const viewport = viewports[i]; + if (this._needsRender.has(viewport.id)) { + const eventDetail = + this.renderViewportUsingCustomOrVtkPipeline(viewport); + eventDetailArray.push(eventDetail); + viewport.setRendered(); + + // This viewport has been rendered, we can remove it from the set + this._needsRender.delete(viewport.id); + + // If there is nothing left that is flagged for rendering, stop the loop + if (this._needsRender.size === 0) { + break; + } + } + } + + // allow RAF to be called again + this._animationFrameSet = false; + this._animationFrameHandle = null; + + eventDetailArray.forEach((eventDetail) => { + // Very small viewports won't have an element + if (!eventDetail?.element) { + return; + } + triggerEvent(eventDetail.element, Events.IMAGE_RENDERED, eventDetail); + }); + }; + + /** + * Performs the single `vtk.js` draw call which is used to render the offscreen + * canvas for vtk.js. This is a bulk rendering step for all Volume and Stack + * viewports when GPU rendering is available. + */ + private performVtkDrawCall() { + // Render all viewports under vtk.js' control. + const { offscreenMultiRenderWindow } = this; + const renderWindow = offscreenMultiRenderWindow.getRenderWindow(); + + const renderers = offscreenMultiRenderWindow.getRenderers(); + + if (!renderers.length) { + return; + } + + for (let i = 0; i < renderers.length; i++) { + const { renderer, id } = renderers[i]; + + // Requesting viewports that need rendering to be rendered only + if (this._needsRender.has(id)) { + renderer.setDraw(true); + } else { + renderer.setDraw(false); + } + } + + renderWindow.render(); + + // After redraw we set all renderers to not render until necessary + for (let i = 0; i < renderers.length; i++) { + renderers[i].renderer.setDraw(false); + } + } + + /** + * Renders the given viewport + * using its proffered method. + * + * @param viewport - The viewport to render + */ + protected renderViewportUsingCustomOrVtkPipeline( + viewport: IViewport + ): EventTypes.ImageRenderedEventDetail { + let eventDetail: EventTypes.ImageRenderedEventDetail; + + // Rendering engines start having issues without at least two pixels + // in each direction + if ( + viewport.sWidth < VIEWPORT_MIN_SIZE || + viewport.sHeight < VIEWPORT_MIN_SIZE + ) { + console.warn('Viewport is too small', viewport.sWidth, viewport.sHeight); + return; + } + if (viewportTypeUsesCustomRenderingPipeline(viewport.type) === true) { + eventDetail = + viewport.customRenderViewportToCanvas() as EventTypes.ImageRenderedEventDetail; + } else { + if (this.useCPURendering) { + throw new Error( + 'GPU not available, and using a viewport with no custom render pipeline.' + ); + } + + const { offscreenMultiRenderWindow } = this; + const openGLRenderWindow = + offscreenMultiRenderWindow.getOpenGLRenderWindow(); + const context = openGLRenderWindow.get3DContext(); + const offScreenCanvas = context.canvas; + + eventDetail = this._renderViewportFromVtkCanvasToOnscreenCanvas( + viewport, + offScreenCanvas + ); + } + + return eventDetail; + } + + /** + * Renders a particular `Viewport`'s on screen canvas. + * @param viewport - The `Viewport` to render. + * @param offScreenCanvas - The offscreen canvas to render from. + */ + protected _renderViewportFromVtkCanvasToOnscreenCanvas( + viewport: IViewport, + offScreenCanvas: HTMLCanvasElement + ): EventTypes.ImageRenderedEventDetail { + const { + element, + canvas, + sx, + sy, + sWidth, + sHeight, + id: viewportId, + renderingEngineId, + suppressEvents, + } = viewport; + + const { width: dWidth, height: dHeight } = canvas; + + const onScreenContext = canvas.getContext('2d'); + + onScreenContext.drawImage( + offScreenCanvas, + sx, + sy, + sWidth, + sHeight, + 0, //dx + 0, // dy + dWidth, + dHeight + ); + + return { + element, + suppressEvents, + viewportId, + renderingEngineId, + viewportStatus: viewport.viewportStatus, + }; + } + + /** + * Resizes the offscreen canvas based on the provided vtk.js driven canvases. + * + * @param canvases - An array of HTML Canvas + */ + private _resizeOffScreenCanvas(canvasesDrivenByVtkJs: HTMLCanvasElement[]): { + offScreenCanvasWidth: number; + offScreenCanvasHeight: number; + } { + const { offScreenCanvasContainer, offscreenMultiRenderWindow } = this; + + // 1. Calculated the height of the offScreen canvas to be the maximum height + // between canvases + const offScreenCanvasHeight = Math.max( + ...canvasesDrivenByVtkJs.map((canvas) => canvas.height) + ); + + // 2. Calculating the width of the offScreen canvas to be the sum of all + let offScreenCanvasWidth = 0; + + canvasesDrivenByVtkJs.forEach((canvas) => { + offScreenCanvasWidth += canvas.width; + }); + + // @ts-expect-error + offScreenCanvasContainer.width = offScreenCanvasWidth; + // @ts-expect-error + offScreenCanvasContainer.height = offScreenCanvasHeight; + + // 3. Resize command + offscreenMultiRenderWindow.resize(); + + return { offScreenCanvasWidth, offScreenCanvasHeight }; + } + + /** + * Recalculates and updates the viewports location on the offScreen canvas upon its resize + * + * @param viewports - An array of viewports + * @param offScreenCanvasWidth - new offScreen canvas width + * @param offScreenCanvasHeight - new offScreen canvas height + * + * @returns _xOffset the final offset which will be used for the next viewport + */ + private _resize( + viewportsDrivenByVtkJs: (IStackViewport | IVolumeViewport)[], + offScreenCanvasWidth: number, + offScreenCanvasHeight: number + ): number { + // Redefine viewport properties + let _xOffset = 0; + + for (let i = 0; i < viewportsDrivenByVtkJs.length; i++) { + const viewport = viewportsDrivenByVtkJs[i]; + const { + sxStartDisplayCoords, + syStartDisplayCoords, + sxEndDisplayCoords, + syEndDisplayCoords, + sx, + sy, + sWidth, + sHeight, + } = this._getViewportCoordsOnOffScreenCanvas( + viewport as IViewport, + offScreenCanvasWidth, + offScreenCanvasHeight, + _xOffset + ); + + _xOffset += viewport.canvas.width; + + viewport.sx = sx; + viewport.sy = sy; + viewport.sWidth = sWidth; + viewport.sHeight = sHeight; + + // Updating the renderer for the viewport + const renderer = this.offscreenMultiRenderWindow.getRenderer(viewport.id); + renderer.setViewport([ + sxStartDisplayCoords, + syStartDisplayCoords, + sxEndDisplayCoords, + syEndDisplayCoords, + ]); + } + + // Returns the final xOffset + return _xOffset; + } + + /** + * Calculates the location of the provided viewport on the offScreenCanvas + * + * @param viewports - An array of viewports + * @param offScreenCanvasWidth - new offScreen canvas width + * @param offScreenCanvasHeight - new offScreen canvas height + * @param _xOffset - xOffSet to draw + */ + private _getViewportCoordsOnOffScreenCanvas( + viewport: InternalViewportInput | IViewport, + offScreenCanvasWidth: number, + offScreenCanvasHeight: number, + _xOffset: number + ): ViewportDisplayCoords { + const { canvas } = viewport; + const { width: sWidth, height: sHeight } = canvas; + + // Update the canvas drawImage offsets. + const sx = _xOffset; + const sy = 0; + + const sxStartDisplayCoords = sx / offScreenCanvasWidth; + + // Need to offset y if it not max height + const syStartDisplayCoords = + sy + (offScreenCanvasHeight - sHeight) / offScreenCanvasHeight; + + const sWidthDisplayCoords = sWidth / offScreenCanvasWidth; + const sHeightDisplayCoords = sHeight / offScreenCanvasHeight; + + return { + sxStartDisplayCoords, + syStartDisplayCoords, + sxEndDisplayCoords: sxStartDisplayCoords + sWidthDisplayCoords, + syEndDisplayCoords: syStartDisplayCoords + sHeightDisplayCoords, + sx, + sy, + sWidth, + sHeight, + }; + } +} + +export default StandardRenderingEngine; diff --git a/packages/core/src/RenderingEngine/helpers/isSequentialRenderingEngine.ts b/packages/core/src/RenderingEngine/helpers/isSequentialRenderingEngine.ts new file mode 100644 index 0000000000..04e37fc415 --- /dev/null +++ b/packages/core/src/RenderingEngine/helpers/isSequentialRenderingEngine.ts @@ -0,0 +1,9 @@ +import { getConfiguration } from '../../init'; +import { RenderingEngineModeEnum } from '../../enums'; + +export function isSequentialRenderingEngine(renderingEngine): boolean { + const config = getConfiguration(); + return ( + config?.rendering?.renderingEngineMode === RenderingEngineModeEnum.Next + ); +} diff --git a/packages/core/src/RenderingEngine/index.ts b/packages/core/src/RenderingEngine/index.ts index 3b41cdfdbd..0b57a53e99 100644 --- a/packages/core/src/RenderingEngine/index.ts +++ b/packages/core/src/RenderingEngine/index.ts @@ -1,4 +1,7 @@ import RenderingEngine from './RenderingEngine'; +import BaseRenderingEngine from './BaseRenderingEngine'; +import StandardRenderingEngine from './StandardRenderingEngine'; +import SequentialRenderingEngine from './SequentialRenderingEngine'; import getRenderingEngine from './getRenderingEngine'; import VolumeViewport from './VolumeViewport'; import StackViewport from './StackViewport'; @@ -8,6 +11,9 @@ export * from './helpers'; export { getRenderingEngine, RenderingEngine, + BaseRenderingEngine, + StandardRenderingEngine, + SequentialRenderingEngine, VolumeViewport, VolumeViewport3D, StackViewport, diff --git a/packages/core/src/enums/RenderingEngineModeEnum.ts b/packages/core/src/enums/RenderingEngineModeEnum.ts new file mode 100644 index 0000000000..c9673c99f1 --- /dev/null +++ b/packages/core/src/enums/RenderingEngineModeEnum.ts @@ -0,0 +1,6 @@ +enum RenderingEngineModeEnum { + Standard = 'standard', + Next = 'next', +} + +export default RenderingEngineModeEnum; diff --git a/packages/core/src/enums/index.ts b/packages/core/src/enums/index.ts index 646aecca85..e2f295994e 100644 --- a/packages/core/src/enums/index.ts +++ b/packages/core/src/enums/index.ts @@ -16,6 +16,7 @@ import * as VideoEnums from './VideoEnums'; import MetadataModules from './MetadataModules'; import { GenerateImageType } from './GenerateImageType'; import VoxelManagerEnum from './VoxelManagerEnum'; +import RenderingEngineModeEnum from './RenderingEngineModeEnum'; export { Events, @@ -36,4 +37,5 @@ export { ImageQualityStatus, VoxelManagerEnum, GenerateImageType, + RenderingEngineModeEnum, }; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index f1b2ed078b..acebb0ca13 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,7 +1,11 @@ import * as Enums from './enums'; import * as CONSTANTS from './constants'; import { Events } from './enums'; -import RenderingEngine from './RenderingEngine'; +import RenderingEngine, { + BaseRenderingEngine, + StandardRenderingEngine, + SequentialRenderingEngine, +} from './RenderingEngine'; import createVolumeActor from './RenderingEngine/helpers/createVolumeActor'; import createVolumeMapper, { convertMapperToNotSharedMapper, @@ -120,6 +124,9 @@ export { VideoViewport, WSIViewport, RenderingEngine, + BaseRenderingEngine, + StandardRenderingEngine, + SequentialRenderingEngine, ImageVolume, Surface, // Helpers diff --git a/packages/core/src/init.ts b/packages/core/src/init.ts index 430c0fbb8e..f91422d033 100644 --- a/packages/core/src/init.ts +++ b/packages/core/src/init.ts @@ -4,6 +4,7 @@ import deepMerge from './utilities/deepMerge'; import type { Cornerstone3DConfig } from './types'; import CentralizedWebWorkerManager from './webWorkerManager/webWorkerManager'; import { getSupportedTextureFormats } from './utilities/textureSupport'; +import { RenderingEngineModeEnum } from './enums'; // TODO: change config into a class with methods to better control get/set const defaultConfig: Cornerstone3DConfig = { @@ -14,7 +15,14 @@ const defaultConfig: Cornerstone3DConfig = { // GPU rendering options preferSizeOverAccuracy: false, strictZSpacingForVolumeViewport: true, + /** + * The rendering engine mode to use. + * 'next' is the new rendering engine that uses sequential rendering and has enhanced support/performance for multi-monitor and high resolution displays. + * 'standard' is the old rendering engine implementation, which we will eventually move away from. + */ + renderingEngineMode: RenderingEngineModeEnum.Next, }, + /** * Imports peer modules. * This may just fallback to the default import, but many packaging diff --git a/packages/core/src/types/Cornerstone3DConfig.ts b/packages/core/src/types/Cornerstone3DConfig.ts index 7241a947e6..977d88a1c5 100644 --- a/packages/core/src/types/Cornerstone3DConfig.ts +++ b/packages/core/src/types/Cornerstone3DConfig.ts @@ -1,11 +1,13 @@ +import type { RenderingEngineModeType } from '../types'; + interface Cornerstone3DConfig { - gpuTier: { tier: number }; + gpuTier?: { tier?: number }; /** * Whether the device is mobile or not. */ - isMobile: boolean; + isMobile?: boolean; - rendering: { + rendering?: { // vtk.js supports 8bit integer textures and 32bit float textures. // However, if the client has norm16 textures (it can be seen by visiting // the webGl report at https://webglreport.com/?v=2), vtk will be default @@ -18,8 +20,8 @@ interface Cornerstone3DConfig { // Read more in the following Pull Request: // 1. HalfFloat: https://github.com/Kitware/vtk-js/pull/2046 // 2. Norm16: https://github.com/Kitware/vtk-js/pull/2058 - preferSizeOverAccuracy: boolean; - useCPURendering: boolean; + preferSizeOverAccuracy?: boolean; + useCPURendering?: boolean; /** * flag to control whether to use fallback behavior for z-spacing calculation in * volume viewports when the necessary metadata is missing. If enabled, @@ -29,7 +31,14 @@ interface Cornerstone3DConfig { * in scenarios where the metadata is incomplete or missing, but * it might be wrong assumption in certain scenarios. */ - strictZSpacingForVolumeViewport: boolean; + strictZSpacingForVolumeViewport?: boolean; + + /** + * The rendering engine mode to use. + * 'next' is the new rendering engine that uses sequential rendering and has enhanced support/performance for multi-monitor and high resolution displays. + * 'standard' is the old rendering engine implementation, which we will eventually move away from. + */ + renderingEngineMode?: RenderingEngineModeType; }; /** diff --git a/packages/core/src/types/IRenderingEngine.ts b/packages/core/src/types/IRenderingEngine.ts index d18799cef5..c4fe4bc715 100644 --- a/packages/core/src/types/IRenderingEngine.ts +++ b/packages/core/src/types/IRenderingEngine.ts @@ -1,4 +1,4 @@ -import type RenderingEngine from '../RenderingEngine/RenderingEngine'; +import type { RenderingEngine } from '../RenderingEngine'; type IRenderingEngine = RenderingEngine; diff --git a/packages/core/src/types/RenderingEngineMode.ts b/packages/core/src/types/RenderingEngineMode.ts new file mode 100644 index 0000000000..fa878e7700 --- /dev/null +++ b/packages/core/src/types/RenderingEngineMode.ts @@ -0,0 +1,3 @@ +type RenderingEngineModeType = 'standard' | 'next'; + +export type { RenderingEngineModeType }; diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index 52f1f26fce..9fe2f445ed 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -161,6 +161,8 @@ import type JumpToSliceOptions from './JumpToSliceOptions'; import type GeometryLoaderFn from './GeometryLoaderFn'; +import type { RenderingEngineModeType } from './RenderingEngineMode'; + export type { // config Cornerstone3DConfig, @@ -313,4 +315,5 @@ export type { HistoryMemo, VoxelManager, RLEVoxelMap, + RenderingEngineModeType, }; diff --git a/packages/tools/src/stateManagement/segmentation/utilities/getAnnotationsUIDMapFromSegmentation.ts b/packages/tools/src/stateManagement/segmentation/utilities/getAnnotationsUIDMapFromSegmentation.ts index c166279e88..ac10804d5d 100644 --- a/packages/tools/src/stateManagement/segmentation/utilities/getAnnotationsUIDMapFromSegmentation.ts +++ b/packages/tools/src/stateManagement/segmentation/utilities/getAnnotationsUIDMapFromSegmentation.ts @@ -5,7 +5,7 @@ import { getSegmentation } from '../getSegmentation'; * Retrieves the annotationUIDsMap for a given segmentation ID, if available. * * @param segmentationId - The segmentation ID - * @returns The annotationUIDsMap (Map>) or undefined + * @returns The annotationUIDsMap (Map of segmentIndex or Set of annotationUID) or undefined */ export function getAnnotationsUIDMapFromSegmentation(segmentationId: string) { const segmentation = getSegmentation(segmentationId); diff --git a/packages/tools/src/tools/segmentation/LabelmapEditWithContour.ts b/packages/tools/src/tools/segmentation/LabelmapEditWithContour.ts index 192502e913..5bce524e02 100644 --- a/packages/tools/src/tools/segmentation/LabelmapEditWithContour.ts +++ b/packages/tools/src/tools/segmentation/LabelmapEditWithContour.ts @@ -164,7 +164,7 @@ class LabelMapEditWithContourTool extends PlanarFreehandContourSegmentationTool * representation. If not present, it automatically adds one to enable contour-based editing. * * @param viewportId - The ID of the viewport to check - * @returns Promise - True if contour representation is available or was successfully added, + * @returns Promise boolean or undefined - True if contour representation is available or was successfully added, * false if no active segmentation exists, undefined if already checked * * @remarks diff --git a/tests/screenshots/Mobile-Android/sequentialRenderingEngine.spec.ts/viewport.png b/tests/screenshots/Mobile-Android/sequentialRenderingEngine.spec.ts/viewport.png new file mode 100644 index 0000000000000000000000000000000000000000..6641f2eccc6c184e5b03ec80452eb5ac9db83dab GIT binary patch literal 132253 zcmd?RX*gEx8$ODJ5R#D0d69%9^Y|o5rjTS#LJ~rzj7gG&BuSk zndf~zzkU3VeeCc1+wQ~rYVcU=UiW=n=X9-5UF|b_soAJWNJ#dcRaey`AtCK0A=wp7 zMTS4g+BMjW|B<@togt9CZ(*MxA>k%DtEyt)`C_`XNmnZT z-!^Rb{Mkr>eU*X0cWy6i>1!>wN)9S@TJJb4l;6yw zx*qud#VT)`9R8PcxyIaQzV@~PHSv*tj9<-uSnuWKm231aD{CfcXLGEavx$pbB-TVv z&n5c|e(aq=mL1=HG71VD5p_+Y|JqZ}EO?f!udm-$csamG{W8W3^Vf4w7FD-{p+z!3O{(_&v<+4inm?mVFRHHe2gk7y6tvPYKFge zcJ@#0<58ZY9IiZaM*Hm9gA#VSYHIfeXCvxH=t632@^=TRl$#HJ`^FeiH@ieKEB?kn zD7I;IVJ%ufr)z4-Q(lpkR>ZvQ$H=^}Ma3pAV1;01#mg41t)+ELRJ66Vm7bgox4Gi2 zTPgajqa*CWgU?p;<(yP^Zb#gHdRWxtgD`X0WwB?LVyhz&N|I7iJCpwz2o=72r^6*uT(lM%+^{R=Zw(N(n@Q$ zQ%s7e8GhFMM_2Ik$UGsXttCOue{6o>h)whJTAO_T>k}tWo{UlEZnG=kIdyNyS(-8Q zw@dM&_tvcB*W2_l8mIXfLsfZWo34t-6)kXYas?=Ji^VtZtmM6stK;H`iqRNdoai_& z$P`o^pz74}LI#V_(%AU3@Ot+#ktYq-K@@wbDT1hjKaDM5{|Yl-&+n zjf;y54-fYra&V-fSK1Wgj7ZnZFcNkj{uIm>{--|baHaQw7!3{?7rrQUJ_agjcJ0*m z-@kva`cznosi$|$d-|A|^m2)B4&K{$SWVfo)4q@_(DLiE<8~73?tf@b-*J}KOw&8_ zkaZt*Fe4-5uld!72Tv$&Ep|*#PY0SFW0i6=igl)%lFGx*Q}2r}pg?-fZ9JHTgY*kirm5IA&JDPAB|~z{`|Q*-=~rJhiX^&7^^MC z1evJA)poXPW(90o6T=B9FSKpFyw-|c#~c@g@Q~B=w)~VrYK{ovUU~QI*(1z6g~P!c zRc|S_*^*izg+nIK**d$@VJAULQDZ4qZ|$O^(^}5iJxfCoH0)CBxDc_^c3=K#BU4yy zo@2i(6ZM4)7j8}ezzN2pJ{7gtZa>4Nu+ryx`t)i1jZ!%SuYolCy)#d=(@(^G^;-CI zqrYV7-)K`tMusqR(}Wvi=w~Gt*~$kYoZfqMKXR`)`KFkP zu!Pm-+cZ;$)C@ZtrRc71`5Af3u+xRAt}C4JO{by=`rj1~Y+pO2m+?d+O`Q0_7fekx z`J+?Y1;c8;*-2De>IyP#4~EqTg_=k+4m!k*7Q-MbMsLLRMDR)}g*9NA&+KEL_Yo-n~<5+scW% zw-z@O>F&1h->N?xvAH$tpLFs%GiOAl+r&4mZnf0&!Gz2CJ-_BZnu<7GyXLhqQxwSX zqtf5s&#%Hbi;kR3FQdT!%0@!uix;%Ro*T7bhX;KWxx#8o`u`>-avFsPtcbDFT8n#G>Sg*>`VUt43Nkg?7ji24e0=lf ze$6nulHX>R?cDFt(PGp08T#pjYUZG7Y-dX`s!6H%W{S*qF6oFtl2BEvLSrp{eL*JF zjw07kjWjDUR#OqF|43Ia%P)yysV& z6CpLBsBOe^(>(0V_uqfmF)>e`^jTG|4pOD)-d9VF)8r3TCEH8DuBHe&toBga>)-FJ z?D7k$EiEnljG_4DqiB(3=yB`TzR=GPA3oF-yjwSt+CJ`NJb0JDbN9+>cC*bnZS6;@ zyzZstsi{|%r+a#foCb5RoG~{3sl|d)AQF2nMOTbf^URr$-kE#Hs+MPZv1lBjs-_|r zCD^nyHOV;xY*>p7Jdt^JIa_YHDiw`W?qa&I`q$0Sr6Sa>}!Yt3|8x3B|Bck#G7{c26Ck z4rZqlV5eJIUfw2thP90i;f|AdoU)&{+;Os3JRU*{pMXFFrvlsJ`6EY;7zlMv zEzx~#SU!Yv!W@PktIkK@V@%UK65srHdive__xSH-XOsW=EyMHYFBkQq)%`7|X)_DM&&j)!c5Ak$=rj#BWkL|wr}?{dW?ofO^A zR=K}^{lc;EU7Z_dq8@#HJ+=K!$HXhW40P?LQ6Z)W-@bjT+#D6f!8zH-b?n$NJTEk3 z5A_^$&1VVfe2igu5YL)z#{T?y{fhWYFh)Z$$$umJkF#{LV`#PIr{SDV``~@3(Rc2U zm78Ctl=g8ui3hb-W+E&(n-dcg`mZ(D z(lTY`Dgw%EiNfg%;tf+K6z+f(GZ_cNpSki^WOW*vJCAw34-=WZ0hF#mnhMz6`gK?ID z&`Dsyu-XBSL0@|Lxhg<1o0b=7{3ay_fpJQ2{fbGm zl1hb1!OGlN!V@-MpGi3ld=A}zCY){ei<5Dhbiss3N|onxnE|R*jzzICG1by4X|`gl zZFUl2wP*$GbYtl}oO!jng1=Wb^!4>8+`I=D*3fm_JUmtw7jc(C)g(vz61aJIco?X} z;xthL()6%9$jL~PT6NBz-507FIWxfT;_AAGoJ{^2X9Q(S*Xh)DR@yIP3+)q&0|Vy4 zgyXg?FOtj;Q3q3z6K>o%7NtHtIr+<_m_NF~zEDq)33bp}8b2vA!b5tnlnTJgy);EF zyw>Un6E!Z9oXlGMU{Lk<@84-TWEW%K->|a_*b;V=?{Sc%rHFp|REScNd;UV4!BUZ*_(wbW7z1sQ23aGi0HLyyY{vosU+ z{Mx3GFc^c2i;JiHK!V+|fR#8jNC!S&#Ux!p;iE?n$+`(LhaD3ZF5B7O7@ptgjAaAR z)6t30NMlp-E9;%H5s$MkWP7q}?(FjNvY~+iO5OH!YLiv2CV$683*S*^>F@SSCAX$N zI1SRNc>tdpXMHFrV0x>(l_>1YZ7NcflOu-ZIexr-YU$JagI((Koc80yS0KK&l%#Y45+A=AoSt5+r1vPw$WLTZXlMSiG{ z{{C$w{M4f4==xk(((XXz04_Z}y_fB8aE(;tIUCHOs%<&RdKrEf+RV?NZ}05vY;Wg@ z(ctmPHxjmt1+-A+#y+3-lxGYD;)>De?CN5Us1wkB;W;-{UBQylF(Db>JnFJFS3|F# zu6;U17j=@;n44?V#S4W+f~|bX(vj5CAKUo%2eLpCcP{LN)H4xi);WK--j*FXd^okZ zSVmM-^yty1v4yL)wxy;bk&LHufQ}{DjsXmKcmQdI)&8s6MUQ)?_s!NdGgELI*EI@B zHoLL4z7(mYlPKRawe)Rb@p||B{uBp6ws3FxMD!l!u&a{ss6jVw+yLrsYPynZ#3E{r zPN;kV(B5Ru;@Y)q+`_dZ^XAzrSw#bP1}j&8h3UR@lV;z$cP}1F&9G(ekEE=Bm$JI> zFp7G$xEZG1Z(CXY%5POHwQhI}l%&o_wqEJiT0pOn#u!xn+3L7Fr%q}+&@pouIHPv@ z{>A%|^!5^LtY2C+uJW9<&NZ6jHZU*{i~HKrqFrptNf)y6xBt3i{1GM%Y4)xOH|Mh` z`wsgasvS;h1&Pzk_&&DqpMXG7LBZnkGFk6mH`zmMY|hf`fyy6Egv`*X9`QJKS_)sq!4s|W zS0vbUUPwp1c<}sPR|Ftt=I{%B2peW94j64Lemwasf1#uqQfYVwEGjm$M4 zkNb)r#Z_^hB8YUI&rWP3ZL-olyS1_L)39^$uRF(%flgbBO?79pgsO^`&5^0@7zrC% zSokkZUSJG$8?n7hNU^uK|M%}79y%W*=`c${w84c7)iin;2Kak{Lte$Ef1Raql5_>X z+ZQUo1>|S=ff}or)M_b)eQ^2mWhW<5oWg67BySweD*eoOqtw&BartjXwT^jsc#O<@ z#%Zc?GZ-5iKYsl9o#D}-YG88v!u8h*D&F2D=Gk?_&Tg_Cy!(7c0np!E0NjsKe{Wv? zbGG4A`d+T*O`~_XsHv#|i0vfU;+qpCu6-M>2^pD}w!4CZA5yb+jpt&90b%Di5JSbr z-%{Yk|IR&4))kCxf?|=NJ@zf_T$1->25=KfSZr*O>sU*3ywolgrf{_eYjL1qJOaA0 z?Ty)P`$CPhf1|M$imrbiHjNq=Ire{zJJHe6Q5V6rgZ3UERy)(((l+-#qGxHw{aLyF|JvS%VuaU2>!gu)q#jH1P-n@JFLf-2iG$v8= zGHIKytZmQ!jEzZ2O1{VOXnK0gRAdFj2pR*p=i+#~1ltVgG4u>o6_i$O4UNh1agxT5 zB_+oE(R+eFJ$b?uQd4a$p7Pj9G9IwZNny8xMf2y`mBD9MKGnrWMe)QoDR4rh>a>$^ z{qyzUaVu3nzisf+WXHo%>R@Wp?99}`O2;x<<4%MqbA!PA`{z<<4CP>9Vd3b}qciRs zpd&QBaU*pR^jwN%VC2QcUTw)LC@KKc>FHx%%od=7fK(9e3~Eoh-3F9Kt0l zEBiuQAfyHj237cVFzLGf@EDJy6!e%ynuP;YtZv1o?xkiay2{OO z(I_(v%s)B<;R4uYc6yKWHouVB|2t&AfHpSOu(N01$D95A{VBTRQ`wbIn?|9uDskPO z&h0PtU}0eiQ+@gPF=L_ejr^YVd*O8>U?$Br@sc;#`pk=qi{qu70CiE1`ifm`xfueo z-eX_1v>0Y~ZaouL2Zp|6Zk}i)yu9YqcGrri&78Y^`?iLLhM}RM`~QAvYipl66*M>t zJu@eCD!TMs+PA*GzPvo~6kQ{9FPGo-C_5%uT{FE!79X958)J?hIB)>s920eD?Jw|< zj*eX!fl&>w7#Am+1F=-v!cSn0EM9NkfGX`sRoI=eh)d}%o)lUjlC2>*esI;xr%`u zhmFldeHGOh<^AxPN8jxvK&hpqii(R5^63NPIo!xF5W=^QG4TzUXM6mvkFpl;8C!@_ ze-(Ga7D~#)hqM_6#=5$?7cY)EOTRIAYb1P+c`S6lz^BH&x0tY{S2jGRf3$!9Ze3^$ zBAC?bAV6Xz7PijsDK9Ti z(S4JiUNv~(>?h%`D>v9i2+~tMAU)g|8$Vd?4&lCoajggc*mC( z1>ghfe4g@&%G`^Ki+p^1RlBw!KtqWG--?Z;G?;7EUS?UK!?uZS5;ZG%)oCBdkIE?? zH;rxJDZicVzm?fN1+Xs9=>!p$=w#&2hp~v}^-NQ8`9x}@q0QpcPKD4B#T@Gj&WJin zdQN%AK56F?G}3mvf_LxU&C&xZ4$gv79aQx3w6_ATFfIT zARs_Peg~dI&8c%lDo7FC@IvAC2P5Ivx`H`QVrd@mec> zd3KQgi(i|AI23H&C~5oeZ~SzasX6^BD+>zTU;~Vfj-tf>LASMSakzGEcwr67FDwda zm*4lhr-H|KU7}ii3o!|g^J{|K3i>Oy25_EyB7BU2;NZ8M&?aLJUU)$ zp{u@8=7va-YXoWks*TNKbv}p<*Skdml_R60qmz=9&~)r3pjOn@*4Bj3vrq?1`90jK zK@~^W2`2DFsrx7<)eLJsm%y1vnS1*5DL)_I_>wmSpKvvhGswJmp9412h3wMs2hUIM zz~@38ueZ5Jdyp)}ACf6l5auw5S8cni&7iISX^sa=LybZiv7-KC2_7Y-r3#!nVyy4pz6CZz-vZ%h5iuoc zuswf13WDXQt);1M8X6jCo|B!KDUm=#$^q#1cpm}rIP&en?3#&mw$`AcSIdn+k-AD{~X zvIZc47gE7mubOK_Yf=O;gE5qxZN^T*Ti<3r9wjJXdSPP=ewQYH&3<%nWiqPJorY)u z4mwIE`9CcQQ_j-w46hF+4o##d@kgn%(^0;GUJr_~F<>=N=EZGa&^rSxfZmHW8Z5bW zlp+YK9$WZ5O@7ql?CvH@F}OLGFY{0budh#K1B_BPfu%YZo05}NPq+;{IlN=2d=2oJ zAZcuFPFIvkNEx4)7@qf(O%M?fp!^^TNti*2z!>*`vH(`$W4isShRgA`eFA_+blr=P{LscQZ0{20x zmZV{jxSWN8N*6MsUBE2OP6t&){S_|K#@hOB&G4f~kHA!>;U$0pAT-hZ{A87v%9R7b zgg`pqIL)r~;{`^-ZHK(UEO0WHyoo!D9KPiC)&}en3AUI9>#A$84eB?Z$H%Kk?~Y=N zsM{a<8BGf+|DNwfgMKDPM)kwa0p#~~v>%qZapBRKowoW0*x-OLhfOSb3&k{|=2`&Te4B6^vPB)eS8H{UmLifi zS(m)4G(DY?`5X{y#?f~sA@p4LvcEbOQ3k2RX};FW0LCA8TgO^nzkZ!ZJy80ACVzep zOuVkXKGd%XH`zWoP?JIQia$y{L>)RoMP7|@MvS4EZzYPpn#2Y5d2{)#UQX`_tr@;k zojf=jvgG&u&3PyXc6N3sI61vjfB#Z+-R{Y|ii2l=`gCy9Xr6JFdujiSI|PL;jQ zD_;0wRiexdJ2X%ksRHFNR~;RC1EI@g@|?42vF6?*;ZkU)5{dsUEa@G-^R+BG3QJGA zry%Zwx}%H)6AB9oa7~tf%gmjiMa602g6hA1WtVjuUuadL@BPo&hV+shuyB#{g)GAw zJq_NdfW$i|eHxz}!P%)Gq!<<2cfP%liB9*#`f@si`#>v-mg~SW5Y?1(fQbPli%sdY zOhGp8edY=#C@g$E0iODEw9q)K*~X;6F3L!F;N#6JV4YOtZ7$S}l=7UFSDT(*$TY03 z14hH`)boP3tMg43Q3YzGeX%-T)SJ~k1s^9$9jO{%*pRY~)Cfhg z43v4pLuj9YEp%joZEbC0j(s0LeE5K)s{LGIqAG9~)DNiLs;TYRR`so|*+2tXS;vkZ z?ajBP2gV+D_ED_NW?_=7$Cf}~B>Vk)K;v}n1hNk-6@z#hhze{sGcCS`QyfxLSX30m zOjfX|v^jSQs~9<=s~z%+nmo3xfb4V&c24zJbZo3`u2Gc~g)k|^8M!pQxX8#Hr$I$H zzG-^4&Cf?&iix64MF}Hrq4o(n>pv$VIj_x5^srLpkSVFxXdOEhtqLpbZ=T_E zh}tydGF?IP#{G8p4~bjf@0dVR1Zt_KrsmzpkNX`5%Ws2|dqZd6O-9i72@=GS}%3j{i4!Q8D|w^W|%U%UuJ)Z5i% zBf$odqOa14>4&CRW^mR)H&(b82*W5Ig!>A7p3E2gbWqV>oFu6FqxX`%xw$#qY^ab6 z02_m=A|P9Rur*Mw;Dv&1L(P(tl?~X<8{I%i5d(dM#jla}T$4YN0OJSUZijk09>P{I z0r8_jg$K%S|E+C)`t%9*3t}_u+8`GYJG_@BQLZUVZG>W;KY0Qn;Bp=wEOZOsrdEW2 zrrqU!I4WPd)&BA{@z^-`g%CkhX0>pGgXAvy+y8!_MPh}IQ9$zkT5OtJnq~G%UNB=CHg9EM5|B*cK1$BPAcG7 zg1L+~#+-{4xsYK1o8YmBT|dR!tfHb=wbVd|(AF_%HoLBDZ>fh^47uo|9`?DmPPmnn-(HbCc{2Qvlr}d5OeSb9Y~gBeR;rHD zvPq~T6yfg9DdY0lu_&bGavOK+v*W4n-qHRLg3BfupJjO6+gsLj3DRkeF`dQHucNpM zh)UbNgWDgj)IEX;?%4ZbCby1r3PN3?b$ujH5d+=UFD2}#(tf|u#si3KjJoi20(znG z@zi(Y362g7m?u9)Ssjl9cXHJ~SdgE;Kd2gdCp%sD&!6i!!pF?ZkesT8nElBWXZv51 zXiXCSj5VZY5BZ(GK2y37S9~_|RX0b}{uc^Sd&n9E&ojLPHdTy9unR+iwp5&E&SALW zAaeZCOB;vaoI)#l6@`c5z&zx0Vbymq2_@iTc$v8Q-^Ps}7a$Cu5oB8TQ5+|7*hA2=%e|Lgo(>Bz zCd&9%t{lG4pE9uUiAFSlW(q17tWv1)2uifuz3P~V=GU^naih>kSoiqk-@nMZkiVo2 zSF^o(wf~dZGRxtAfx9TN8z5Xhi$jbI_Y5_Tt`6*Kvzn62`s&rR*RKHqG7O$W1%kOx zOTq4Pb7Tq*Dk!wwuafrD<5*1!SLV52Jpf2{DIf-I5|QSC&5^BRLGoPI?Pg|X*rrF1 z(%jGTl=p*!46RYXPXby1@+5$~;?Cer3&m7jT9=gdNKyqohQe8)9R^R*(Ek#l*4$h*tf}rN( zXoM8@}W!va1J|< zyUD(BQfQO>CpTtQLMg{XI=Z?0Hh?7 z4-TZ|@?}kl3b&sMU;5V82CXf{htlK)5ILk=LDf@F$SYj%Zv}J`Umy>2ch7$17K9;_ z#auTA5|zT>x8|{XK5~%k1;pH5NZNU4R=Nyjo0j6r_U0PoURba1RKV7Wf?1*hO)5Yz z*?~4&&Cpr(ANe(P+1dd=#Ubp~gl9!(kyJ@eMEL36U$2le$e^nGH6G|b9KG}@i z*XtlzXx!h`MNzcRU?!QtU%%)mmG}DRhuP)JKXK|VzBgS10R%Uk#Bsh<;&wz;7U4OQ z^!0V`U;=3cHR5!s?aJL5sE60C9glBbT3P~_b*lhfD=K0!nviQqL3A`8a@y!_-AWY` z^5_Qgw>PJ{vXsA9H9~<(v3uV=wITV>av7llkovpvq6nE5cAMWG4rWR8UA~mrS>m^~ zPOPvfSnc+OR=FQPeq?=e3OSOGSL#Oq1(ZF9T#CUIDH}Wq1Tx`ks=PN5wM6`5a3HVu z!wu-X> z7<>4OzQltd6jVLeA~#z_M;BCWZEFh_1v-MhD9<_A-X4{ZFhk5&2!yLaz8Z?z{o)Uj zS&aMlBXZFMG;WF?LA^(Jc7_XH6ml>iP4UgTcMw%a!!Im6$xeqLEmG^~KgioNP`%PS z5~qnH1c@B6yOEnotrss{@|yX1Qa8Y1uwpAS8(c{@I5^m($WZ}V3h0Z&;oJgbDJ?MF zRT_DjsHY|;le-|&pGt|WwVGH^fsP3M0=#6m1!uXrg_)VJ0LO78WVO=~Cl)j&7=8rF zrwc*vW@BTkSp7v)+P{tG4GG&e(d+ex4_(8~^7EhfGaS)QkloE?AkPUG9-`Cru6M<= z6&piDSF?R((0?b+HZgDqRfTwAZsYI=f{a^^W|!qb*Z{``2r4x81>lTrI_WR~Lx1|MuD#up}_pcgT=MH+nxHYA1?&ff(psN{lS#Oi&i5S6c=Q zR_($iY9}dfArTGgvI9&yzp({=gSv|vWGVvF`stG=0DE(nN`qtSvSb@kW6x=5fE6Qq z4NqLT<*FDfCI=vF^*d4)B4YPIEtQWk2J2^Rll%b0_Iy!1;?Ui^%a%q=4bBb>LjJrjd=f2+uMPg~z z4gdZ=2VKfAvk-d)B7xyyyH|>+NtHWWPT&SNI}3Ah18 zP_A(nj7->gfb<}9$ud5xV(PB=iQKd2&Yi=kOPdz?!Q($vX9mh|f4;vDxX3W`z`I>P zdwWluIFa(UXJ9~^KRQrDL{xMKD*3v?C0H|1c@ccYbzP2C=C&&|MvyTwQtZ~`cX-~1 z4!7|NM6G^7SoO<(2VX9G@GmxhdTT9X%!GI)ps2PoVN(@9>`(&VxZZZ%pApJ!rQ> zHm2<({Rvs;p#WfhW%|8S+UW~`Hvr2R7Xdib+pDVv?J2Sxd1RFD{GKwKX0{>Q;bWZs zoAYpMgkofo#8ej@T2M{V)m;eqprFprPFH8*RKC<*xm}o-_ibtke!(-%*YDm5!v^DK zK*2#p-N;(*1u&SlxV#0|7i!P|7=I4Do#c#+21_wv#LaLx$66AQszgl1SB1HRU>Wfb zKHYT`7TCpLplwbcQ0%c&$u`fvGn_)cwj6^YShv|9xrYS=(&2~0Ud7gI#NbM6E2X~* zEk(Xn?E|SnpA&L&hnDxZJt}jbF}CB`7gp<|xMLe{>9iksf>R+)Zx8=585tRjNVu1v z4FIZNy^7de;LkI{%qyYN*d!*##>;>E5r_npdHVdh@uf>L*7Xc{GC!_FpuNrEB*EE6 zB)}-gQU!?=w`l#0?@+_4jzad$d-)P$KMMa4l2=?G2V}!x3-d>3g|guyn^0{zHxHx* zyoW&MV%~t@^Rhjazvj>5XIOo{55W-70-3F#spQ@n3Xuy!F(sxVbMFGwh~q6jt8)o* z9*@{gLLyS$%6;=jkev>!329ikrauxfs z!Eqs^H)!O(kkkArGXDp{a`(J<$EJ0zPO%5N6>3qTk?wTL$|;?R)TmI>#^M9kXm363b{u zGXC3T%{IH54y1QXxR(+qEYNm8akWh>;{UjGHoh^02!Ww>8OG*40XOhFOa~yP<*l&k zrvz)rwie1rB_fxAQqN&?_Bc?8JVUDZe|BZhQ@xD7!t2Om3>3SjgLtU(X{6=hKA&4* zFbC%@xehTG$Daig+TSgGMZTu!Qhn}*Vr-RbU}%W@3s>9K9D))S+h7f@Ug|Mx4iFIC zAn&{GCdO)zVc?_a4|5QGj%^$|I)V@Eqk!0b_=k|prxw9y4&f@TV*<+q^urrP^^FC2e$Y~88eP|_-^#9= z5GoK@#=}{JOmHMdLnsD)4EP{FKVPMV{HIt%9h4@@8>9GkBJRRm3L@ow>X@zw*v~J+ z{zz94xdf2&J_H$3;wf4rU5ibzrIc9_!?JLp-l!FsR76@GkVXcGqKDS^Y2^Bvk0Ni> z_`+HX&?_wMAGJEqCH92XBGe1XqtJNC+t#$w#EPh3Rpb@G*ou z1ft8`XP#@Mp*Cx1X+f8ER(q(jr7N=*ICJ~y(mVo~ha8(dP z1)-|Wl1E{RQ5xwEK`}~_^U&svLSz`Ozizsf*fY2&+|1z97_^Af9CpSKnexaNQ1Ald z8_2#w2vywKbPZSQfFp;wL|O`vU+TWAJAY{GD{(!b$Vdur{(-pRxw(4N?u-wH2C;Dg z9&f@v#GEAf)G-8_k=t`~BS}ARWb~t_N5=lU;13bVG*Dbd=5vguv4kHSdI+!&HOM|k zVaN{H91%6480rtdVJFrML++TXb(c+m>-Gcis9Fjs9r{nd0HY2@)H%JK-s+M&=yp5# zCZe8E>ejGK5pYFe0(V6}LZT9rb6yys!I`D$nMdIPA2Sd#gHMV(#VihjcZgvTQtTWY z?mmgD87`auatN4Q!pJI6!CPNHy4EVt%G1N6NG%n|7$?H4+`ACbC-^i8?>~HCW|stl zva}F)8*f8chiG=fNJhqs-y&>Kb`S}~pwG+>Wz+5(h@|uy7&ugOcZ1)H}OU!?sJn24hSRG+_rIhkF$*&H2G~L8d#)q^pn6HekW8y22SF z7*UE~gcr$1caAf|+%rXY5ZcTNen+N)i$jz25056DM%Hw0FL#B1E6?viRt}GLPnhMAM z68PF*U&t&Vn2dP0hvS}d9I&!7`J&!ta1J}~nZoWrtx5EJ zaQN^Q9CYI>LzIbNLS`q_2$c&M>#KSrsDwD&+Jf%K4REUDTCR|q-B26^$p_>B?}bMb zJ%5EFhLiJh_xwrq^dX`^v9;XmRP^D4y~J}AH9QFus%zUx?DPiWm9h)K?~;;|zzRXt zn7i)jf=>F zU}oc}i`_u!R5a`ZD6U73p3CgiekOJqt={sct#}+#znBW{%C=Ctz3h-v6!Pi_XT(a+ zw^JLU&T>N*qM9ohfZ-@8X~-wsB%V-b=w*lgk5!_FT86XiFDE(d&3AOF02S9Gbg z#dsz7e~4p2(SUd6`}dECHuyd0q*)NZ0YHYGSHa+&%I5D?TYmIe6XzpsW5@8=@U(XQ zRN#JTP(BEnYLD3C5C-J%fT$ZhBfofobRX$&449KJT7u-lDnParJ|x&{n^{+XzXA{% zNauQ`+zSUxsCG{!oV@o;~;sEik(D}ah7-- zt#`+DdwaA$TgiB2=CGv01^-|H1IuB29RYFW?q5h!N}aJLfq1o$<19^kT1J|4FD)tN zg*>PF?qewXlLF;wrE!tVVywv4o;(S90>FDVyL+%--*bZ_YJ)`L_~MfdAH@sxNeY=NeQ<|ChepKaxal(~WNOd-#7XHbt60}Aj>`m~@S$q5Djc#UVj)qtHK(7p2 z-e5F`oV$aG$su;aVFoJH!x)X`#zx~(_Zg&7RF1-1Lf)_1($3NGi=~+5UUj6GlaOEn zeTTGknFPM+-FItfX~`ZG7p+2SQjiW{p_d|IJq>gxNKtiX@1_~-$E@P-+szk6Vr$H# zkP$?;CfZpbh!J(Rm@vKRH1o4im3JPI0^?k(-JW8&T{~`+2qH7>KtK!=KbW?JdV`{e zMvJjgr~{dA-&URc1(O-rxr+Og)ow`#XOi~~)+h>hm{r@Bg7(h$C%nUmV15tKt7Wbc zRBez1Yyd^14+$v&tKzPIH2*hM3g$`CJc^)(;Tf^T0J-AS)KlPmQ6#eWQa0kMEiu@O zwgg;>N+%t-UxEM{joBEw_keeJ*968^NF8#vJny7~$9d8twmG3QB4yE25;qTw00K+MzA`vxlvIdI4I zWMYmeO|PfFKdaNe++5UwEkN~Ns!l*TVvR#n&}*wJ=gqa;p;-e?K(s>j+k9MAM?;=y zo*hd_A@OjKU{g_}7M6jp-!uvzp8UG;50Yv!#CLfrYBXVMht-l@Ji?%Q=MCN4JAfzXW>=$mRAlK4+Kfwko0++vkrC`RTsjfkTW zer{*APRa5*O-rujZ*q5$$SoE6<4?S__@nDa0tq4vh06I=E%a6%*uFT6IYz>P%CLaR z$x@P&xtYUMSj2^u+DKu>;5p$DULHgrcDa_iI#nXxK%n^|}*#h<=REhU4VJug|4jE0eY2mw=- zp7m>GL**Xr9mk<}L$n--XERazU-;NF+kj9Vi4@g!wVOBR2k~MP@Pb3+VmX(CPcrg7 z1hF-Zyi?5`QbYQBcSW_L>rp{A(9Km}Ogs_LxgW9~C-Zqf{OmJi7M$TKN-ByYk^Gdp3$mK3b}5#1)_=xT=7-NLzz?r6QO8BT7uGtOfEy32BXXgv=i z85nsHCKtZnMR7uK)H>CdSv!)WW`%~#Kg*CNAw0)Ba9-)zX1{lyy6SdiP^nxGW?n!A z5a?~#sT;Wc<;;Z}5rekgvkDD-n&K0CCKw2NQmFM}{*3Zk4!^t~a8XzECGSP$syp}Z z#Jr@UV%e?gEkK~+3BMaT02(;EBrn=E7Oh0jP0nb!SzMX@$=N2UeC$Pj%g;=T-6|xy z$?aQ9BE|)8l9Q85N=i;t|3sdZ?<6a&ZeCoi)v)w7LKXf0`r%t3t;o#Gd`B2K7lBem zMNT$#Vn85>_JA}GW1L!QwGO5qxZf8~mA-ToaYy!s+oxLm&&md>!J`qpWk6b*2rVAi ze(HUhm9=+zHIfzS1v&bAu?$ZZ?_@*|_gb z$Ghz^{j+fDrp|E6LW4k36&Eo<6r<4(W>V(00JYdsG9Cj#vx$tC5aPx(OjC$dT~)w@ zKNNo5H?Pioy2AMk1S#mse(?h-1c^ll3}a%P4sQ)&cRP13Y;e}e&hBGz*a!|!it5SF zKa@p{*}|C_8TCv|FeItM1z^*bG+-@$Q<_~+k1DhfP*|85N$V`b+d4PGP5| z#~_u_Elilxid(XuU<+sX1YQ`b`VuliBzfd2LoIkhio{V>E+{j0)@aY!KyD!PVr|vu z-Xmp)38kkLt1c>JbXFDk*E)ICg_^TPoR21s$lM*zKLPIa*TAlWI5T?k=khAmkL@U#Q z1A+9ro~zYxQVCxK=NB)=J3E-R?>)NT7M=0(B_X{-WuH6iezxy~RWWi6l?NoMIx2fl z3sO>Cp8dZ?#1#j6-xKP*hZ+3kl8;WA5#&l*cEy%@OKdK7=**o_RV9B@4zs~yK6&7d zMj9Y1WWVIqQ$ehDg_NV2-0${(w-r1WhlxsPL6m;`4~ITf=H8xNuslt$zkYo-ajPvs z`-;aa6OQhEc&ko(5I6Df83M^3*W8FcPV%#ZT=VVfq#ecV~FZ@oznLF8=G&(-WW`x+JE1=`6c{N_x=vA`_uiU zEHybqpXjE}@Al(x(=Y<_HzFV03eK-HG52;nBjmJBxn%Nf*~Q*%xg6+MVgibPL)~IG za*TzIa)vIq{8kyCj+g?;OSw#sFmv|ebU^=an3q$VrTJ&C>Kq4fPvpqiP)=~No2IB; zE@>ETiX8->d^5+81CQX%nJ~M=M8ac6sMrW?crEyu$hc zHhUt6|4>yR>%CiD_aFoMwSpkIy_IP@a|L#>f}G-`kzEwD_ah=O-})TJ`AGi_Bp|@% z8b|*j?Rfmk7q|3-3p2{sEXUREjeLZ8$x5pry}c_kK0a(j`q2o2iZuY^fg`I(x^?IW z+1lEkT6j*v19M_K!1vgrkp$naS%OFA&3pIm4VWIDOv!WT$$Kw6VdGuKX1lY!HGFa| z2QLuln(;OI+hS3&D7eT`nVr3PtNXS^LPLO~VfycdHNVP1jK>ONROIQI<*$lj{g<51 zpFa=Obc~Dma*UhBzbd!ar*IYXB9!u;CtHYSB#h$Xwdi=!8F=?{2TC}Hk$lHH8^)*4 z-U^c*sPNsuTUxy5+=>>-InX>5q2y}X)%TWE1hrfhwcjem*EA%m=Y2ZA=v4bgzDX%bk|d;(BuSDaA(bSwk|ZQ4W0D3!Drqi~O6EkFlPFV2DoN%Gjf2iK#$9<2ShcIwx8euv}uOozkuXRcSPvOf=|b9(UL#+1o$R5zgENA(_k50eAU(aSn;2=fzL0}nps2EKpa0+;;Dy5!?m-~t4LaioBBWBILb z_Ca9@&wUlhrDN&WWfvpv;~ErP4%$kcFDuJLo=GN0iT^1b=$CV@dD*sXoEcxgJ66RX zwLfpGnVsF-a-#d|x=qd1N9`Ly8K2L8`dk|$g}9VL6Zikrvc%5nL8?>nUl}ePSU9z} z-kgBD-b)qRwAvP|$P(XLwtwfenhc4Q3sE&nCov=j{O&)sV8yHshbu0{OZ7eb_PG4Y zA8=0mcD%BKD(2>COCdzNnNwRwbE9-O(=P_aHJGv(*uweOC z(KTBg&NbIh362_~to$c^Zt)DmgaK1+yX*#Lc0|>8-_dEky_rI0xx)Tq$Nn@~dF4#G z^+Vv^`mTL1e)`3&A3C+WJo_ptRTb3dr5`yOY~dfdYJJuAKffa;{tRhu(r(x@Vveut z*_p3PdkwyQr*)Z@JPZp#Xvx+zx4=*Z%VFc7&5DbQp9T0MUhSJ7-BBB)|M{7;u7LsZ zGp2Jl{4_z97XQE@V|f85p>mt0vf>Sgr%pP?!BE?OT`0BQzEmxUq_8q*zjV*UTp}4p zRFmV@5Bs`37Req(=>I%=all9`*A?O3G)iq7f>n z6cckEEW>>QC$yzyX=QP7vx~OgxqCafNw-vI*j_WCvM^R@FkZ7NVdjHBm+d*TXKw#h zc>j%S_V(0*uF8KqGVQRIlrx9{9ij`p!Z66 zdkHxSUS^D+bWG%oF=G_Mw|#3{)cD3VV|(V0t~B|MElb8e|DVVB|6fHaTe`?fQm(U9 zlDF0TvHRGcV-Ek@Q}g(={Le8numx-g&HsE(#{Jgy^=8+bCI8!3H9m=&VaLwpEySAP zgo!lnKI=a(<^S3r?=Lmz$@Y->GwoeX4U}uqr!4>W4Sl6MUhcn7MyZxO8h|McJ5*%0 zZ^2UM;BbUAiW?68MsGf~EU>dPYMAwV6c{u&51wK!21JFk%g*-1qJgo_Ac2!aPZ(So3lpA?KD;iyl~|&-BeguxQu(MUy-$n454Er z*ShcSudM8$Hy8=YUkC)(-$(Si=kOvMCc^QjrD0s;hi~y~Xp6Ab1h15nEO5PQZf1si zpt*a`2M-^9^O^Ej$+7gW${3F^4!F#6F%grAjWtSw+(&Q?AhW~+f#;Tb%UWaNwBuWb zA-!Iy%S(M{fQsKq1J)Nv!+bbFV7+_SbxnOS-^|R6_bDAQTz1DTM{?gd`1KS1p`Xll zG)!~{X?crf5>7R7*{-OlkS)8)>#?j7N!Qqh_(DB?P``e0ad9|ni9XE#umKr;w0ZB) zg&wxHa^EwM$0(7awQn}MX`n|4BFBp_1wYixGcR~o4%$$nO*3-d@Ms9GF*6H&<%VuB zIXM~L{jDc}(9a!UvDyyT@fl8^KAq$rC7(T0hsRAf#V@xL`*-j8OP2T@2;n#GG*k#@ zrNdB{$9%5L%5=Qwv3@;rGlSjvebIivh$h);qRjhyvk^=~DNZf8xcqelVS@m?zS&iE zKe)KbH@W=k=Ffu#_wG@0u22wc-7*rInwmh2WH5F7CP)QYSK`yiNC}@VJ_t&$fBuQ) z0u{V-2@h5h3Fy5v?6W%VaH}&b6h8j&<$mSXu0u>g`T}}KJ|=LV)hX16X-P@l@^uso z-^MpJHBrrJ?t2Z`S5dL6=6e2HgrEUA$1K%jl&3jr$RW0Q;iPl--o1AQNJuvwvi#_6 zNN9((29y&rbs`E57u?y$gC<(;gn2aU1)(g-Dg>gr=@W{XdyVeZC)*KIeoH%vvhd|> z{5&V}6o{o*eVJ<&?I$5}D=)FbX*R(15Q6$_$sp_+f+B4F`aO=Z9vWGF04MQerEW&qLcgdj!Ex zoMl8vIXWug4{!D{IyP2US2kZqKB}~R6P@fTzRt69e~nc_k4}L|Nd)-4DLiR6rj5ipUeu4lzV2#Esl87U!Sc0Q@897vazO) z-wNSKz2~Ob&OT-1<4%q-p?hy~au6et_K6^dl_@7F7LgCjk5+~a!CC601K!UEml5wf zfWL@O*ZY?c<#hQKKgRj0{ZyrxM;~_X*a5r^HEKnKous7Zs8PLo_g;s8uRO6}IYGzQ zCq$dqVCLfKL0bLIoYOuKWtt3y8gHgbd>e2qY~bU^kAY?&7%3N3Wbo0uUD{<{lkcdG z#H6IG?5tfXO3kPE&sKh0b8H)H5@}74F_cWJ5Nk&8Uf;obwO~$?VImFoKG*Qf1D<@} zfVW9ennaOAT)RXt=XG0g)8WF;pFeRa<=tV^9V?nRIGXLcIg41#*=n+9UJ#CE~7KTr`4=NxFnS`AK>bY6lmWv)G5@EXZ@F>^2B691O*UT8CQ z5ADKf{)BYCuPyCFJ^T9p!sDoJbwpy}5o48VgDR|#PPu`H4-b~g7sPZwe37^xi;MI6 zUOO-Tfu74V73~A-bPs_?MVntPuQ%A;JIqw~&=fu@JXce@Kju?eSzHDLT+N>S5Mo>T z!}4)b>)hRm2*Ly-S4b>oYU#tbo)zv}I0Y%hH{2kw!iTg4I42=a;CDycqm`Es0pPO_ z3k`)p2j2girA2@@h($nG`oAm~-|M&djzwEK@v}wo8RMFl`<+InZ_C%XMdi;17=XhkK#jIJA zHhtM!UeC+N^Qxs~DFi1DhUFeGU{mXmm)2tctp)h{icjEqhb-j>4+cf$&(o*(*j1F@L{S4cJ|VXFFD_{Dz)XK-ZtQnlRFzSV(8f^P0_v?&2+)PR4J5;reiOmra!DFjjL zwx$bVX>UqW=HqVy9W?o~bJwoWI;{7QHz@rNJRFp^YptGJ<4xk#`8 zifEH1ilkCGJHI83^zR);6cq7oZu$rI?_aI}$qFWU>&!pu{f`xi$GfjvS2y&`%ga$b z#U6RzOXknb``xpAYfNGOr@X6?VvaKl+9Z3X-u)QJ9ulJ?PqN@A72KerOw#*5Nc#vf^*E9$LU_P(0}*s zi$;HHK&KDNIE`DYh13oIraWVT)z{XtpHUL=$fbHB6Bm+!fPV0^v(S>vD_;({Id=Jq z72~96(h;a4a&pinCZtHgZN@PiAVTZlW30hjBdS&V0LIV7Ix;9AF^I-l@H=t|=8YI5 zA4LjjvC9$NRg&B^+(154z`JZx^teZP8kl{6bP?V~bf_a%A2sSTdL6!uz|X#GGx&wo zWZxP{FWG?4yQ+%afTx3_`jDlq=BDQ-XAz@SznObpu@H&#uX{s00O25=DNQI2zd&oeI=2odSL2=#GlYAT9WGIntR zkCPgLa*Vir#B5Y;q%LtV)A(@1qo;f9q{9Xvkv0B7(y7BwR>S?P#}ko4Fm_S+?#ejK zZN!6eJ}DLg{*ZR_7`>fqU@s1#yjWqgLcQSvH&GBIuTDUna;fk3cm#<10;lmIHj@Oa&* zh>eXUd4&k7j`;)^wsi=aNsw8*vqaU!D2!8`FySiJ8)}gJw|5H)D0=yF9cvmFnx4P? z6mo(icWRpXrhwCs>rn-GzL|M&CqJJ~2s4Oe7^?&DIdfWOrNh_$bEi1#C(wVGuF=Li(yf|Z9$ z>!WPci70LxVcvu)6jxLnL8F0!grLet>w*8|16|!KF zqG)SqXlQBBqs=Zb+wLy@iD;??ED^TOnt-%GF&)scUq{? zS&bYqg8mudAaVx9LgzW}n|-RYDPwq_<|ojIz>9489JY5^ zH2kYCV+bJn6*7ds0TJasC>$MtHk5qlIQ5?9pPt%WI7x5~6sou z|4US!qN3D=G87sR_+Q4;?F`CI96DqOHH6?eBbUx0Yx5Yo#$m&PEY%m<*|DVH)FtwD zki?vstNb@zW^SS(@m91(w2=6m&K|c*-Djx|V^QFq$?+U#A=j^;iHZz`D6T!9DXfds z(*1k)vglK6edo9o_gMClg+V;6n(T_@%kjm+4-~uTj6j+4l)%KkU47_=JPlOdeS#YL z^O20i`SXP^AMW^{{zghMnMg}$A9DNB@+0jPxJL@EoIq~kBdAO8;`h{ z81D;K@#jw;-2M6qA;H1gOKm~9@T#68@` z8GYsjAAG%jIi~>BTmgKDtg0^80+}gjw2oMvF;gAH-=QJ3ENg6|^^nRxiZY&`$(==- zA2w{VU_A{8?JD{r56=;PpPm$3A_X!Td_&v0chJ~Wk8JaqLQzdS;^FR&TP-F!nslR8 zJP70Uma}L7;uceRZ=7OF#xSo2@(htO`FYAxr@g$qc+S;sk`t8MakL*$ zPO>%D?NV1f9f*s}I_oz!JoROk&D$Ton+%5eBs|d`Go}(FAfWeqfM;BxAgl|*B2i?JlNM9BvBhWxjc~y`maFUzR1sE3r|fVp z!xK%DNGikBuaqn#y$+R*c(OVR9W5=;?wac6h9)vV5exe2^YH6K+(YIIrQ4Z0t zfsW)0$lSihfg{NP7@=H@FaDsrilcYMRaotZ+! zLtMc-1+ewvGeBvvi$Be+j?@yQmkCecq_Zs56UMKxLjS@SV;>(!DBy|Wvf^Ts6UCH1 zqFt)g5ydWm)6@;G+%_91@mxIj?Iuz8wdF1?-SDnt#29I`ax8i`#=0eEm+%RI!Wa6O$k!zra?4sj& zPjab*=+B4T&;rTG+nB~IBb-08Plbnu1}5sOtM@GQVtIdlJ_6_Y{eIS8>01OX07zlan{h4@G!Z~DY6G+&A z>NQ&C=y(*;8WTL_uNN^lSo`nYy_-7$QxI-WiVB5rreEo)shy;TCF&i65gTgmlx9)H zrEu1$i^l8fs(h(M=T9sz1t;B`)frlBa_y9qq?1RXX$|?Qi7`8BOIKdW&e~cR`hd2M z0g^KSX*g60mV0qN8%SJyHoq|tQ)Gb%#1!H^=F9>hyK-f(`3XWqXcYGmc%4f2_*Bv%G)9f0 zK4c79Yj%B))Oj0j9KqrC;5`*Ri;y>j%^*0`)y)m-2i${GA3X&ryHv;-!E6eegN6gy zVCNNN_%`Ow84TJWEr7?9o=)K5W^(@xc9XReIZ(21-v}>4GHp_D0m3`jTUkk$Z9H-O zI3F@}3PRD$@@;|ljvAti4d2VUwpYF%?`X-2$RZsvf8iV#wTf|DF@@@hvU_{b4NvEJWWf>$0t<3 zO5x5_(n2o>cJtS(!677;)}$$`Y)TymSS4hYw+HAMS9q`aI)&TrH8{rmROv4UG5rhC)5k8FuBQzn{$ z%mB#~5f3NBn45@v$RI9W%5DB}y42F{kD2=R)P2oH=jGYsGIs48=DAic8r#-gwdcS+ z-9OrV{<39_E$u)NDgrRZx|lj?(pLIQHQCQpo6$RVaGZ8O5rAjU>`_Em7)33vyE0X( zBfti-qXKfOtE+|ad9((we`czYq5NEQhWPifr?J5dc2oV1s7k^+g@UHB3c1H2`%sUpr#)P-OlzS8~f{eGzNudUdz*w4;wcoIZ65 zD?Nk=M;s~&lCWiWsMM;C9}jwuRtWdpF~&6d+zJj31|tXa1;k#xj2P#yW#iIk{~_ZL z8JaSwd2B5DA@ADQM;`_=oQw+t2Dh*Vc&jN_na;pcUD#}`>(;If8Y$v`Cm`oft4gT& z61PQ*4jQX4Qh@pmEEP#do)e}2Kbrg4WS9c3q5ebcSLlUcY2d)NB8=r9FP=Gh5<@ft zA|NW7zSHO85^+*Ms(&595e@;#ux~`R-&wa7TNkDGb~YAPLW+Ix9pkk?o$DDaIA_lI zgeUHqOH^c-$w--g`n3A9cK5NNO-^-KfSN>^OBrsgLVtSSHApI)ff1fMaI<-vTjj}X zi;x=h9Bg^@Wf-xuoq|)@;v_!C#@&!<;(bl;;@#8M=uf4JXp{5>3dhHC>1RZjerXuk zrX(wj=Df0_wzk$P3voZvZ3q$q`N0W5_3^BRRo?~!C%e^F^V5@rHV`HZc_HVRT?pw& zeMQ!`wYAK?*<35wMMBTNtjpf;VW(XxH$B%i38{RW!C>_GM_xRC&Q4^XgSBDuG&jE| z%-XCk7awwrosU`aCr<`nDa7@{h5Yxnj|R2k*DpZ7)HD+-MSpa?_Za!!Qg>GB=4H9) zD5$I)ptl<-6~QDQHUQC(aPIrvg&nhM6@A83`poOs4Ky{G5=ite zytIzOb%zGnv1~`W;cX_4xVTxc14i4qTzw6^1EXYp!fAW8w;{qBj|_dIvTzI*fsf{? z$zq{2I_8nFhztXw@n@eR06gXVc_vZEv@Pq-VGJgD6f{b{!{$e77NNwg1ixw@SW4iS? zHx&7n$E$Lqvgy4?DNzDJ-s?p0aUt2pjbUJBS{kHpTiwgPS30`p1@s14F5ZR~q9GEevL^RxaGnWs z2$HL-yT|Gb(+vo!r|}gYr@D=!V->>-I4V1S)QKnibDh%`57u{sJuC$1VPIUhCHzGF z#QIuEl`|>LUd))Ra8Kt;5 z60H~mN{u3|phI3VoPbZun{6}N7%ioIk6$+y^HT$iToFqW=L zyzK1#yx;?mN}oRmKU=Y41*!UFKupvs5IG4?HWRIfqm_wItY!QXCIRl5LrzY)mHlBu zJ6nSGKp0Z9Z{LUmk49^1(icBj&FDtYV^FzhNErJ7?M7namNgma|EzO!BXb-QMGF3A zqA&gH?i%t%(OBr|UBO8#6W=W()Aj0MoHQO^m^pcP{2FPs*TnmcV`E$@2lZz3M&2*( zO(JvF7}VekUglSS71Q+AY{zsnz~<=^Gg(r!_AoXor(N;$(ZilQhbd+&74TBM{K`b| zyj*E!Nd?Y0`egO=ZjVWY>Qy{hrl1V)z|O8`6$!%|T2y!fWcbD|W+^lgq=u`q`!_Fa z*khC|JXP0TwQssMT5cycOz0`j3Q~@2ZMnfXvuJ?NJ_hdlk|$aMDoJD!=JF#)D%u~1 zm?ao)`a&g$VT;a#(H|Tpg5GYj^z-(1f)RkB^;~31_P;{lTkj!V4e^8lnO_EX6gLdB zg?8yz@77ItLfn`CG<q8;)c?EE(`3Vjc1UwSXH#-bSJ%z6f&KY*? z7qd#T9yL>VQ;vj8jD6EMjX<5d{{&Y(sAp2=BwE!9j+3O-^kxWnrk~ZIZLXuc(5Y*4z&Olcdx03;&y}hO7W8lf- zCr;#bsme!Typtd6=+Ed3;d-MHLO~QX)PbM!vkku+P)m59A#4@cKR36p0ITe~9zn{n zMVj(aKYXY1Q8f4QTyJ*lY#{Xyg{6vW-lrZpR~;`B3kWy~TyT3H=aw2KU9(Kbm|AfmNW=AP>-QZB;9+>`hYC2A80pU-W*ogGI`$T(C zf|qq-`=%HeEIMVA7f1cWuLnLTGiY<6T3koLri<-WNr2=NbDEUjsEgHKFKIh*HOZ_@#nP?#Fl+iuPZ%frd zg+Sr_e#4})U&Q%<1Rt^bL=3C1wQ0}<#n#=97Z>6-SKEWQ35mm*7lf!_@h$o!NEcLY zW%amNN-hr57XJw5?_)bwNNg3%3*Fan-Eqrtcr~~Clhk$N29mL0lS|pzLv056xn_fa z5>6l|XRM(odeg*O=ejD*mLvO`?^e0-?D6Brc}`py8H+0RnXaa94!G%s=^7Q`wz_j0N zGXM^&GpXm#gCAOBXrZSU5{(3~&t^Q4(Q*XL5HS-Q>!f=K>8+*shx(ZmP2-DcHrJuoB;2;=6XKr|1$2M&Y7 zfE&PnU0>6wR(2M=qm<@wA&oLxanhcG<){ZyzHGh|+6zKK?&PlN>9hOJUWuv9eF-U+ z-J|H;k(->dG1=fxy|lXqbpl;W{kwynHKy-_(NZ^^G=Z+hDZ)+Q&8~K9)?^22e zGQl^8tEyJ#ARpt03~OM*$pCqI)BS0To1nR6ko)?jBW0F*_2z@HWC1&)e^^waK8~|u;E50O)GiI@+t2e&kDhB{meEpP9^?< z`3WyNBSc7vx~pg#&?m}xpxB|{AQxbwhtge(%BPRU<`B#<%yEcKYO;6ln8K{~bb2~d zQEzMOSfbW+6w=S|D}!p$Mi4|1dvCG5J!3GFO6IKjalFCvOUWpUoB3W93|Y&rg4HE3 z*YiF(Iw3(-HO(aOK=@Xkh&EwcDQ4`nR373R~5QQ_nGz}ZKz(88`@vEE5m z!n+GS1t3R0k2mi646p z90c*KI?L2ja_r_k8>}KD>1x7<1(oNHY2Zvip;CQ`!W(4~+z8n&uTaEsTXIMB4$BLq z9%H1f#koA4^CW7+wsG+QEnO1gQMIT}z!5Yb2s7I`po@$;z6veJ@#7?;LL<`z>Y=)# zJg0wHs?fW!*L(0H1`vHMX z#hh4EZE%~B=;`YOo!CA+IGj((;@!iYnb(Ouhjdlar3sW7WZ5-vK!# zN(Zukcn^mRyi}3P5TcUQHSzAu{Ho&#QB&Ed8#i9I)f~!1SX)i8gb4;$=|&-|7>$D| zY?!)9n%xkoaO%RdOME7i69gUxvTR7xNsH|eMf!>g!;$w7&-wLbv|*x>tn9lVzVyZR zX-~;efO)2Q5Mo@rCs0?Z$x==PW*@cqI;ftpZzj)c1be3SQ<4F65R%Xq28&NnS3k`e z1$}Bg{G;}CUKF=Mp<4ii6jS*2ttQ+DvOM5&aLGO~Nn_>UOXavn7k zTC&TddUvqP2V}VXX5E&X5A#VGzx&k8Zps}zlVJ+d%X3vO%mU!2)a7&@%Yt}lZLs?f z9zSGjGM*cXYDkg2yscxiMY1E613v?ST_&I=Vf!jFDv@?huBqlJMyKViGR1o9IJGcTk!Sf5kW#(j6Dh(KLs??Ry7e6Q!nAZ4b zG3+k`vOszaC!7}A(32-|zRl5)3ut*VQGl2SNdX0n=NyC((ulJV#A8m(DR~B8!gP8t zn;-S%3$albl%j>BzPn8zBUc5XgqQRiZXEY}o|1+a0z6D(A8DW`Z9cO^g^azQP0pm` z0R!*f-->u(`tD}{^fVTLZ(st~*^l?HhE(JTCrO`10Cjf);~l$^9%uenxN+{kb>c)=r z+|H&InmOIDH;p4@B#`J)sYg3#!!hF7cUa?DN-ip(;Y7H}o+0z>?IkB1-DSRF?xy)d z@+H^x4zt;omZG1EI6lZ4`>BcKN$C4h#zEyxF3G)lLU!S@Wx_6CaKskQ0T58~wSJLkf5n7eAg9~$UtF@m3{AqcUd zusv?AK~2pCgcx*_kI!}Hb8>44@sEUaEs=fh9?rz|F>S!tLtMK+dWHFT2qkxijWXP_ zA58wsMrQ?lEiY3Sjzyrd>VDGgnQg=ECcny9F_S@5kNdlBWUv(7J~|MMVdc-C)9L|M z>u>MsWcF;uDh&d1yE?a?l^m+16hL9glMe2=bte4}ry{Of8N}>u9mxl$9xIAScZuBg zb?5J2RkH28CXnLUvT!LbyRmF+Z~s7CCh=_8Mc9BUM@H!BmDDtchKD2nM>9%UeCCBP zm?DgFV;a)=htnvhTXniWs85>wd1dna%YpqAgm zRACSUf7h)GnO#NOz$G(PZvsP2iIrt$>eHg4zLJu`vha9RHpjV}w=|YMpCQn{07|r7 z)GF{2K8%@t$Gw%lrCISklq;nTjzS*Za+;H zT}%w2URrX-5`Fq?gFB>eVK5~IXb=ID0F26`#*X!%-b=Mh8_dOp!h{Zo_-6YwAP;oh zl`-qSihjAxkZuA7nfiXVK*(^T0r>R(JwtS)FR3PfQx12AaKBaTLKdpWCkZNgFsE}X z5M07+djGQs|4KKHNq5f?v5&o@a{l^TV-4rrx?@!CqG!5XRBgIx zJrrs>)FK39*3a?7zWOo`kr0j)+W^MVVU*|^zhlaZdyIh_GO>4KK0~Kaho_Yz8p68?@yCb%@$K_W%boEoCH2W_dO`5>nYCuQ0R_s*dSX zU;RxHiEd{$G2*QG*}LJjSxzJm{(#ik z#>E47;uJ!|gDgT#P4rbwfcp_jKU#g6X_T*qM~Pj`1=zd4@{*;xpxUvr`ncgn;yZ=&H&sHC zr2j?X3J;Qe@ij+-^TI_?G_TiP9DzbeU7h6e?6YTGAf98TK|x886kT7y7Tes7Vf&-+?!nAG=_MLXdxI#)~h6n zYbto_N}77G>H`P^Q@k-MLN9zhVu>{3%JD$gTGZbAKTfWEkEA2?VVKOaH|XW|-7xlp zP~aRuPYgGQOx`+s@XkryAT~Lah>JwCov6&*n?8Gh^vCNp+-w&n6CAE|-%gAwGSMsc zW3KpzBxcy8gc=D@56Z-6epkc?_TCzo-O*XM#~39Qq_oz`!XPtCnP=-i!hyWvnorPHq;(-D%?BuakWfBF>az>8QM z=&p!GbH~Wv9QeiiCh*k#(_zn3()(y>Yio}l4HI5Lp8`Gbh+teuZd*3D)fvX%40O8< z|4##C{c9>oN8h$!X@%q90^ul}F+=SAv+4V8vx30Q_RR(b>G@$UVM5inz?jiA1CM}E z5ll>HpILXma#R^&q_KRt`OKM!)HBQbh*_9iq%uK@6B?kwW=)!j6c2IIzi#@_{Trxr zz&IJq0mz!dP_|K{1i+XB26U0PPN7!C$q!FMX(T;JR}Dj)uP!1d<^mAmPjlaANY}L1 zs>$gozQ1dVj9#TK{^y1MXYIZF=Si;GKPErVI_Yt$s-$Du&OqN8GBS$G251Ki5Z~!3 zHp9yc*=Nb6QKwE_F;1ymo1i~=?(~iCwn>o$pMYojqe(krqG*5kcKjp!LjYh}T z+yc%-J#M{=z@u>ry57IOuT|Ju`avRf@;H4!%BxowTzrXjmZ~3N1O^iu8zE^%k!@{c z^I{VR54g9C_V zXWzYxR3^H{;E1NazPwFV`Xz?8@a>`5L?}pH4$dP8GQBpyO{thz~d=vH7Bl|(geTxCq-Ls6>7>pjBnl)nUnibRShYQos zgT$4{$$89S34fMB^IQ8*@Y)sDDQwujhtr!rDE<|f5_|O%q^3{81pHP2g8bSWZ#Yj= z7%%|s0|GAH@#CTF&~$n`k}U6+T}7SAzV6$!21O71(0d#3_k_Ghc%)1o~4Kh(Ol~5w=#JG ztpT*!g$vSZx1F*Z+d4+b_B!wg-i3DlnG!Qwkev$YE+jubT@6vKSAy#x@E+sfmg^D` zHtyDtsn#uLQ&YiQ^dr+qt}{V$Q10ueKfmOZ^W^yyG*2c#iN6I}NqUb-+R za@u*4vY5_?+Y&|Y&X|~m8gc*`g0F;!h`%u@Z)URf&))%OHy~8cdoeSUE25LhDwQQA z3_5rI(Id^5Af=~#^n8^XcumD=0Tl?@gIAQ*hb_Lz zz^F@+O?!D+OpiiI+t%?Lgvc)S2cu425t?eBri62ib_uU>0N5u}ar#dJ$vjG#%6-6l zpcvy`1Q0Y#bR^acePXbR60WY!PJb*Wx`&tn1y95Q397qDE8ydyHPj%K1+U!hc`3f% zXd<06(=>6IKmwq11@T~m2;*&0-#2vtqJm~C7A8yO!d0b+A1i9Ctv$%lXo<_{XH3dD zf58~zTMVYiw_J(K4i(EwDr<8{1xqfs0wVNp^z3#O015_#&E?Lt1%|r%5 zA&KKGYe!zf54h{4X!``ii~p&)N2eSDAUb%kmZ?V~%TP1BT|<3FElR;aEy1+9?!iix zA5J&kEdzl9GlEZl{d%YKL7SA5)*3+DfTM_+xZdG(H)l=N)C8O7oMtxfL91>*hAD)j zD9e2z_I~HR809}4j>2&B0|&V7s0d+pi;og{M8j}aoa^b?D8$Z?F34Eu`su$3;b)Ue zjJp7ErJXvv!SnH5Al0k(^}IX`1Z;Qk9i)t#H@CuVCgv|94hdmybu^sor}Nsu-%W@7F0lf(@2zZ+j& zW=aUn-JsUZTa6hOqy5 zlz{vIH+LU)kC%o7mkB=^i;nEye~o@h$a(+M)xkYMt-(>vpdD^@<^}cB=oKRQ5G-}x z(xv$7lPc3<>X-Px!2_Tbg*Jo&P2`dazmsp_{nSizE$5o@xdi*`L&Nze7n zwU^7eON+D=mf0;^cF`_1d4R%eNoU*3mF@#2M0LcFD@!Om} zrvvkK&bHOcD#Z-+c|YY$DZE{qdjazbd+7?fmrYZF3npB7A7XdL@uGO2elqUi%ZHOI zUg^Raih7PlXnZo97$w;K`|z3RwsdDY1=1&_8RY3?F(4uz<|TdeehW2@dZgI~yAcL8 ze!TrYU7>e>v0=diIzx+s7JDc+x3;#l?|Q^hMW3)sCmrZ>qj#-8ibt-9B%|*3eGo7K zFzM^tsmKt-5Nu?qaW`LT^Zjf2-!GHfJzq60_aE}n$&RI@>M_Sn;_Z*{Y&5=kUW%Jn z@NS2KZ(@H2KbmgwfE{JpvH(#zZ2!6|GDFi=w;@o{y6!4E?Dbw9KT z*r!qY3WBjaE1+99zmRd>4hNy4i8hT4S&M+SJsAS;KGpt=^fhGMVtnPc68_ z<%zCf(&RI{0xy4#2T<~96b-$fGnAD5y@kt*vGX8vJz#wCh zNtu|bo}C29_)1rR+P~7Ba1a^EzK*> z9Yj+yc}-{jI<3&hlz9LNOP40X1@aX_4DpXI3*c&X6rAd%UaS>Bk=;F1({;?gaS5Y< z=h#n9ehc9kRF;7g=JKni>Kmk%JM@Yvq{2t8uQN98uc8Af7dKVV6}`KHeO#tj@Z`+Q z3l~ts8B37X6l7r3I-4G8xTJ~ILhkGXgSIMP-#S~WR@qd zz%DdiVHc-4M_jx&v*m{T%yZH~v>B{IrC;nKI!Sk#a#znPodzA}V{}*jZa`Ui`Nfz|mGi zPG?;`V>>`*nu-a)6VppaSkhK|BIaIUVMx-7S+jaoJXTR**ugwN(zg-HN(P=usF*Ll z%wIi`NJZ79)_X*iwlWl(<;H@>=}|$A8qPeiAwxQta^hBg?H}y}A=ay6cXv*L(24sv9_Pp@V~ezG$@ejh2yPbeL^GX4;A(6EnHsWJE2R`Y#Yd>rrh~C^AMpbA?hQ2TK*0!K&F6H{lA6e{j_zyMMiuCK zR86T(2;S07WHE3DcN9q@SicS|k# zkS~)gS<7i+_5Fxj!yt+n^$CY*B8ul{Bixv>evpynr@;W5UzLrp88E(Mv1F-d&wLo<;AF2MrRU0kdL1eAPkPL&usqMXymAud#UTJvk)C#cM@tfh#{la}_XwN&v*OiF>H=+2cA-JGsjGZdR{s5dccrcG`?*XHHuXhf znY@FYthB)1-HBmw&{WoHMNT@^yCZD7S;k}8lq~4IMcqMZkZ&yUiK{NZqKIW2+nE_8 z0061lrAEiZWWI7!8Pjv;6rJKht|vuW23DJweD-D?S&8l0q!Tal{G|2ke%9O2Xwmft zH=NG7SH=j)`lzwD1LqCyzQc=)sIpJ`=b)ghrXCh@Xeqg9E{Y7lLR3w-v&_@uFFvD7 z&`HCdapzz#)Um`ik`ELMdj)rk8^f3O3!x(I6l;CT$YlbQWz(9_m?>J@NUri!IV^eN zM6yF)bLl(B1-H=gvnsP1ybZaE`1DS@`iGgeBY9!~9LxC<>YQ4XJUpfp+t=g-5a83l zf5_K>J1%YnlJgZJ8=pN6c38%GvF!pA7l=@ey_gxx((dT?@2Q)6ub+Q^e@E-?gZ?I! zVBQ7ebaL*VGL46vu=ZefpJ7HmbA#6n342sUNyTqn^8pwBJbn!(D14A#)TA@b}ltMc|!GP3h@Vf$`%;r8^qgr4oEY z(-F*J_i=VNn7Sdfzj=(J6GRAC7^i9YF6!5NmH6ot6v@6H*0wJ;Hn7GZ+C25*#j%>2 zzVCL7blP*?>I}4D$U|!d)d53?_PMhIkIthHJ>xcauG_WkOUfCfnZ!Qrk|8K1_FsUS zSa(EJG7{mZ%Mf8Kau$2qZHb@4)D;|b_mHqPeqG{4yGc74470ssYAd-% zG~J$)mJtq! z%jzqy++xE{7rQh)U@epxqKVCaHuk=}@r6hgiG8!h>XWtyWhYG|nemgiAvm1VotvbG zme)5uV>q+Uj^HP&L)62Wc~Ur1RF(@Fy1Aob_2oQwB{@}WfW$uNEy}$j33zq51Tx@s z9R5S4EK|cFLyoFv`t8iMSKli(+480Iv&9ut@APt+AWB)~#Z>STtlm=wM`I0UCQ#L4 z`-zb|C%w19FguHiNI!v$5C+H%Z5EJn)28gz|Mc~TDoNU@gFS-$b>k^=ccPjUIWwx0 zX~;xRNCcC~BWeP4J}<@g{u9%~%$`S0UREEZ>5sdVZcj~eS7%TkzeP8-JqFzWIbG~G z9eMW^5!8jl21}ptSJ}+5$gEN=9RvjyNyY~e8i?LGku<#f7+a3hCJQvooP^c4jE`4+ zYN5RaS_)qm?yCV3FrsNHCj_V-w}7Y;b)b`-p@V{3ho@qM+yTPFS9@_Pc!*75L)jZw zond&?>pY-eAgaO9&-BOe5=4UR(+I^!<(^%tCSdu-{_SKYP}-%6xh z>`Wnf(4za+_kWa=OD3syjeTCDm-t7W9=Y zMOPkgh_&8(wrgGByrEkeZRc#C#@GLb|%83 zhTivO+LD3$r?`1^n;&iR$4G0WFlCQ%xf>R`?(r4%wc`sA8%LsPJd6F{(hEwE-#}T_U!led@ObgVjPMm(`g|luq zOErl{lky7)&3PMPef!4Li!p+lRAum>En?Q@;lpfHcK5sY<@l)ir$vu_`Z=&i%_T|( zi@~y@{mf^y;2F}M`K@AxNb8+jJ%d$5Ubj1UKWQt{X9bS)T_bZAh~)Qx3ii8xE#XnF z$B;8GdfhupNgDu}A$uYIjZ#p6UfHf-E3fNTj*A!fYVA4Lq47dC*G*H8EBP{_{btuM zwU}&o-NPxsMy=_|#5cKpo9g>CYAu1Um2B3LYq-!q*2ey->jDpj-f0eXzYQfSe*1D)sHFe9n3heIjAMWWB z@5lbzBpcb>^PGSTDBR4*l$qX1opxu!`tfGQnU^O^1WRalZjQ)Rd|oyAPahnrJ=>QB zs~F!td4O@5dCNNA0#b_$|H*eks*u`S-P$vJN|>0!Yx(N%!fqP9!<#?2C$$_ruH8#& zxb#5ixQ5Oma>qAyjWm%V<^R^jvOx+doASp_o^uu`TX)ykfsu(K6Yu);3JyFJI&8zb z#fjxUr>8Oqi-|!!r^tqM>#@*1>B0r=TLU+yR#eT=Vj!AM?7P*%7zy9Ni74|@wEx^b zVAp@*M!&HcWN=sC-oy|^mfVf@HXXmF)kI$?^=jQbN#B66B0l?MC>_b zKN>ZL)_w~AgP=?pUPy0Ku}W;tmi1@TOK&e&;W2-0EtIhMyml&S#X{udbMcJ88<8nA zh7btO0+)&Y`*Hdf*384IBN1LLEuqTEB4Y_Bt8(Q5W;OIRn)?P19g3N$S1=(%SON2O ztoM^nQaS6|8_Vn8XWtys?@f8d^SZ8O6I&fGw;k0L{(UVv`=6yzIlt>Y1i!513vPAm z)KZK~P|fhT(vcTy3>+CBprZh9252lcjmVchYm*j&z#3bU{D)A2${S}NbKZiUi|;Tq z^l3^GA}GUjl9O)V{!8j+_r5*-rvFBG_g9nl#L{)d`Ndg$N2X$V%qS5pg4x)z=^!GI z&7WDzQlbZquj<~PQ?V~0<j|1K=I8ML`bl`i#EFU5ASzYn2CbwLUh@v;gln^6WwV8F$w^><*HtpC!h| zXCO&eXGg)M5_)kb%i06OK$|cN7`|<@RNefDWR2TcF@i4jc)5)%Br*A@#R2=(G8V=LFK-qc%4 zS)$@l?$72L=lfM)jezO;P;M&$;o&^StCD)kOdhVQLNqd>wW<aG1;JOuG zQX`f|_us3~_VpEmt|6uA3%|2=IWPIXB#i0l)DXkQIO5E5E*NrHVbh+EmX4TyqS&bk z6XS0@ERH^J#bRrRPH?pi2rxRk*mug&^2in8m1POXT3E34s7V;92{Ay30{Lc;dAy>S zLM&*Qk<~Qd7^bY1>KRh$PB4UNvJUbB9<{gOZ=lVIp;hi4!}@RbqZVYe^yELQkxMbO zoAwA=i)&7-*Y?=+p&33&y`<+z9z2UN?>{0Y-n7%rN*YzwXJrXvR|qEY=x9N6;3(KK zpP>T9`N2r@b?Z>k>Wmf*?~C74W)puP=FP|`fGhyYVgzm@|3(n_0dl@C@4$OVUjUy# z>i(TOcZAU!Q?zzPg%rtcZpFTZU|`X@|FGNS$vIm*?2~Q3#obL|%D1Hz;y)}rYKO!9 zZ2^M`+Kw?+L8|-wTft_rZznN<#!HcaQRs0{)nsc*5SpjpG*pH4FE74X@33I(pbqAP zXfXwEZ;owhsZP&c&!0eJ2Ho`?TRfx{@WjkMMfcf|djMmb59RC-_06vmSiI2-j#3;8 z*Pvfv_+sT73oE^V|2=xwR%!w}vIMO>j)fW?m%+sfPa!%CsZN9?q ztPCa(6)65fXSld$;l##`jYlLLt_MyQ;7fp%PwB^|h}4U1xrMljWfk7`*jcZ2Z0StI zmfa;9r?)gfLODwgvb+~MD2n4E{M*Bomr(7SAD(=Bgd@s9;!5%l4r`XY|6v2et|l=O zo+Qh)dawCps!xWBOEkOV-w9C+oPA1CH$%_ZXUViX7M@%1$3RW7Vo8W~zE=d3N0DNy z8P;nQDutE0LvDi4byQx%%RYNA zS0J2;{j&tbFrzj6-ENHFmg;l&eq`>y@2eO$ z1+sm^p=$A$t{jD&H*a3Q_FZ^0qT!BIzor5S(RY6&<5IqVTlQdTatFcwGJi(?EE+t? zCoXrpa@*eQw!Il`hlPLt`O$iOg04uAv6Sfa4ZH$%v=Z`!M`|6Qo zJuJL%!jEc1KvU;hrw_|tqJE&GQJmDzK?48U}__MvMT=#b<9WOk9~jx|d&dzI6ONbev~3dTH1=Vr;Or+N3~X z0d8^RSezu%LUSK7;94RVlb?L{hJ(tgykL`p=C!;YzklDx5ySX#q49#lLtwQCfdNO3bNgcpDQ4$*=A z_rRlZQrt^%9-F{Xo~(XR_XC#_Hzd9t#<2Yj&IYRoi-#h`08129vNg%ClnQj=w;abF zvi!I12i{7+Hxy?nwz!!^=>SM=V#A;`$K6AzlE}>!}VLe5dakAEcFyjyzdSii2`tGtU++R;g?LhOKe6ab(FJE8^z< zRe3vhi3(X+Dv{_%t=;dEbnw^Sjgm9b3Z7g0z#J|4nOzT6|Bggmu7GF>vB19BKid8O zMu~2ARHx^W6(xKRG9{`2yfW#Y{g(O-o z>Z&l)Syom`Q+#w#!7kEbUu0)b9Wi1R>jhftd`e1C4jKbW8_|5!gb7c;qA>SSPT|={ z#f6If?Ax|Wi;>Bkgn@LRM6LJLVzm%q`$*#qg5_AG?Uw(|e zntT-C_DI3*i1q;6I5%@Ev2DkSM(&$UR!C!~WPW2DuL*qu4=3RXY=(E_%svV_j6R^k zq>-p1--v`lMzzrMh5c5|$6TQL)f?oDoNKuskW68v{k$%hnoy9n0&5F`=7o zI5dgjhUI!E@7q9;SiM6N$I*IJKLm=oTY~ti)OC}AB5}I)n@QDYmr3M){^5(klC<3A zUI;Mk(+H3H8!XFS$B~+B&08=((d?U@K5(}NF5;f4_BaM@QeY=${vAO0vW}n!QIlAU zld!q0ZKM@99F871K=6;#ANQ;Fy@D;Qtkfk$losZ6ew(v&X(g2>Exqdc#JJelXRlww zczyQ%1^Gmn&!Z2-_uSPvf8qr1wi8+!3K@X~;KoEnCN6wqOymx;|A)Ol|I2ZG#l}3w5EL_`LYGy#v8)bk z(UxCi>Ef#%7l+YZl|apv??>1t9--U}Tz{BHFF1$Y1*GS@-silmJw31RUAnQ{PPJY9 z=x$2_7m>QwwwvD-G&(9}dqM5lxqHJ(%7eV9e#P;4g4Xn`RSc<}H|{Xzu-HS49e zMM_a80osQCFAfvF5Szm>#iGhOWs;E*4b-O%%YF=_XJU^9+>0t;Sjo1Cleoc~&)+w| zS?K;ED6gk(*7$v)qyY^hLrfj1;8Ad0+E5pe#u;iJi%1`;7=A(!UzaamZefwPBD2}V za^_5y;=^@?MzP32Pwl^}y%{qsKf@Sv#^!zs-5Cr_4Eo}z<&^~c+WIDPR7r0o&I z)mL&^?f?TDTiYq%p?o&x!2){}i=GdgDTLt^PS3X1{W8pP#g?*?^M|6MHYwvsPrTYu z9d!bL&%cBy+r>t}2mbt>-B329tWki7$MobH9 zx3!h*HnMt}HJ!E#kon}v61Q0z&wXps4Yain2uTO+j-WSiBD8Yx7B&}K1{#`&34YmbFU0;-x{yXxT(S>l%2V-n7Yf>SOcpC!)QjGbEv ztt>>>L;3dpU)K!2U{1*9livcHgVDQgY&qu?w5*Z_i2WlK_F|Xr`c#wAWZ-&eJSeVX#;`W|EL{ zKo73!`z3=#fx8$U~`T$XoRYfT}sIc>>SLu;0(QZ#KM|P zgQ-(vu{Lvu-;Nfn*UG$nUgwDQ^N}cF(sLaYr+8GeP4`$w-r6s+@9BfE+!2sPnJp^q zZ^!J-%&wRIhV*`TfN#lOPRzl%h4{t2ecNy9Y__HrZw7$Nmn+9Srgh~xf^TK>+*R*w z<2GAANCNK}iIX|O-kM#$?5*hc2Qm61M_m!KTbdKl)m=R?Bt(a{@DM${=D(r z5v?x|NR`QV)kB+pyUJu|x1Yk^58r(p$97-6;i^882jDw0@3}kq#L^qvQY$u?Z2xxJKJ8hLb1nkro|F(( zT^FxnTU0HrKOEkE#8_^VGO6sazG}vwI6Yl;N83L=AtMk}`vx(U!=rLWQpNKF#{1gM zpFgi_rN{tNDQRd!?;>V=s|mUR9I(T!CO_+wWRD7}YibIza8M2htGA7nN}0L%+(Hi0 z8A;=N>|?|8a@qRC`xqYN_(j7}*2qG1)x&IAm@vZb2z+N8oU6ke7L!X^$(!~YQJk@J zA;Z9m-vH?GdPNg(=0MTj=QJ>#_YpPvvhpo6M)Z}MQA5VtIcM6Pu&(3MP{m^Rw&2{o zP32A*Xy8Ck7{5@`G0)0;Hc;ySZ~^kux8iuOr!+6^HNaK}jEs{z+W)%OfCZB&y>8vZba=ZZGNiqh(Z!U*ponm#my}cdz zXwj-oj(U*D*wYeiT(ipRp2Xr_jd*}sY3T2>d^X0na=VEaNmgC?PT<38$#2N|1v-q= z#gqdj4W9i%<$QY2P;BIXcnl@S0Hg%+Qv1jJHEWn(1?K|Se)Y*w*gNuYj4l3|AwHz@ zgosi}H)fxkzGnpK=6ALCS*PSp-wL;x;2_Uwq;p^?{l=ZCA0^7(XLXb}f-fx!rjhuX z^2vbkvY?#MH~~ZQzzE?uOpYDxa3*pi#kALXFGT}Ohk4jD@_c&=&yPtwpwSkX3v`S1IdP9+>N?A8KE|m zX4Wu+F}Q1(WO$6_r^uUg)}_dAnk}WGuMJ*S>4(q{)- zO=I++Z6PMV#g+n)Lt1r@dRgradKz~0v5xr+KmpWiQOEs-{JOxIjf{J|A z;+{5VSEO!72D3vx{?kEd4!pVVW^=ps zyi5L(CQY=fjU$mfS;QT3Y4IgR z*>~ZOpdQ61SeN=_w4>sYqen}zn+B@q-zsp}Xr|1I!_`&a>E12|J;q<}^kHa6 zdCvTIn>e2nt{{xPpXsT zyYGj90v(&?i$*~r%B{iyCP*TiP$t0%w*F(*`3_nHe!-mu~pWy!| zEa~8x>XqCsn8-M|xjZ?_wsX)r#Ueh^Jdv7Gd}(mF3Z?)ZgUw`x7A3&{s|AKP{ZGDN z|DaArzF+M6Wm9ikd;3Z*6`fpNYo^`!5So?dmA_?~zSv|wsPXu+?H3sf$K&HGD~92X z->biX7shu~uw-n*1CL!&1 zG?au}4j;et(&{ zu)dwE(gz`|jkbtc4He~?loY67)|DSZ3hV!6YicNA2Wey{`we6G@t)nBi4@|mDMyrPJ2nh&83h^)-)onHR82vDh23jSQ%U83D#zaiOssZVV0p* z4tqOOtNQ*XWhb8=r}nk1{Tzp-Lren&vM97_w@l1cS=ch)I)u|d%+cm|KK`NZR~MX9 z)^)aun9zm`$esPCDG2;;qtWA5?u|Zpu(#Nf9FTuZ8zZBkBG_1|zHeqximg@Ol>yBi zDyaDnn+Uk7_Su`oP8}mLK~0i=)8%ro-@5DXw;68s@e#7;FjCOjhwHMkOpqFwhm{7% z!L{xGrsJy4kwZyg0CpviP3imzKDhjb5TcM4CT^4uaN-hblbNyf(A`WGZmAX2G+3H>2T^LB#bNX4> z3-muCiVq)=Op{pI%GL|H zq(i>^ttR)p%zEnBvHef|7^m=fLzabBc7A;g&%|6=QF?~KMq!Q!6m~KI3{uv`QG`jk zq%L9YOcmmJ?98?q%g*{@R2_#!FJmW2may1jwyrnP;gOaFbN<7Zju#qp{6F^>xi zg`ftYC8>=Ep||8nhB@N?b9hp(td9r58-T=KNfpM$PiO9c{1YWf>s*+ZdHd?>fNZ2`G>eGrau~1=G%*zS{=YU z<-=y|=8^nV48|kcc2qTOLQT_GNgjm11Cj-IcqkF%vbY%*j$!1p>s1c6P?&6 z>MwY9Y*I3#?L`*a+-`{8hj z=E9gBI$kxrsUDbskira-CGko(bTLZJ+eGJ2i_S!gQb!jnmR_SA~bgM%| zm`F-{%>=|TRH+${XHUWoOl8239di1n?puMyIQp5G*x0@iy|p?*PK|qbkWcXN8XF9K z-sbFtCEOChbM%u;FuQYt>ChubVG#(r5XO~|C;PP=seWHqX9CLyYM$kA?qz9_#lUGd zw4EtkP6~gv6r@FrxbJjXJZYgV;MA=DR!Y1DUhrT;-+j26V4UJoiWn1s z5ge$^{WlgjKj?_Rsdxk{({*kDwaE)0OC~(*EfOPYhP8&K(0J4GMAhsb^o4i&C-$c>X1)L)a{T>U?B`c>pSNCM$nAG9*naV$zOqaG*T zVcQMZ65$=bn0`sD-Yct(;mcR!L8AOxiXqkI((NEUHuG@A9Wabkgs+Yi{IIkAO(2s` zQ5O78yz&>EdvW~uap2C*e!K4rlmH+nyazGV+BKVRa;=aV!t#1mU9_=pRf{tZ~)6Q!gENGY;w@P(@uU7Zy{4(p3@A!3S(u6`n_Y+Vy1{EA=_F ziZYoBB(Caz#9tsddzF0M&*QTAd}exjk+ZJZ#yOz>uqY#ZMdWtt;ngmLt`HpJlmRSU zT3SlQ0uBN60HeToWofG^CxC&X6b}}(k(t;{qIV+*B0|iL2u@c$vMso2!s*Gz%h8)( z%Ms@Jrow9yjA+5HGWh>$wJN+$d=+I4RY)UQs8;&YB-2^BZ@ z3|QFHx5_6#H6Frgx5MeRw3Ku}<4%AoBptg4t1U7M-3^gPHAhK=|rvsIlBXeaRk_7*g^Nr zFNBIAI6Pq1%Le3rl{X|Y^($TBa_q!o9z$YaCI1bM0tFbY z8>n~Z`-3y7F4YHN#Y)q}pd6?#SlOR%#SC!=o?i^Qm=N*B1bZA->@}tfwL2F`zMY{a zCfc3Fx}@AaVY1UW=J7}>A3OOOzC7MTRdbdH#LKnPL74$Rwq)E(9|F$@IBo_qb7m4M46 z4XWVD0*Ci+@0!9T*yz&9TUqfOE9YYkLc>$NSjztkmy`?p#+`v?l;%7hww^Ngul)~r zB0|1>0$6vDA7?MLEe!X}bf(#iR6ZVQsLN<8!xoc_lU2|*y`2Jm#C7QTsr!4frDhCB54cxI3uvVW+=*aKx+ zU7uy@+wHG;sE_-Ul$6A?#-j^L^Tr*>)IsOw*Sr0V;!{qYdWW-T;7ODyjynP!OOXNu zDSyWf6kOnl+Ab_XN=t1~YYmqZH49k74&hZgy(*U6oqnOZ>t2mBK3P>+*|hD(Cgmld zxoJ!AEHoW|?_WMS{z?Kdf z2B8xYIZ#t8h6U=_YrQTiE>@3u%tM9@1dNjO*?I~5i%b6wZHYseV!C@gu66h*u#c|1 zspiSwt3M z9UOE@;h{e6?)&p7`TF8}rFX3@Qu75`vQ&?Y#o4^jBYBTuYG+G~Ik8gVo$S~Ak%sTx{C>1s;O%)@?S z$^igZN)7fX>po<(J zP9QrIZqb4gAVq7C~J4F0x zTrBpBVUARrbZ`lqB$WaM&70qvJjJsdO)SXd1w5F!1sujaY3fR+gZ?zJ6KD2Vc7uOL~Sv+;UoG?Dl9h?t93Z ze|sqF#2|p{bw!g%E$D0P@56lRSyo~$;hV?E?Y@GO0DZI!o@Fcl{9Lljw|DmPTWd=+ zWy`RQv}ZV0(%_CBV2^cC)aT+CMS(#YT3*4=%_)C*GqNr>fyBn|SQEefV=UKzOfgB_ zY(alu_!<5v&4QX+@1eHdI&k@yDj6KE3!+u*)=u$R?lk|_?K0jeaeT%RQ!x zR5X{(QnOZLeYO!SVfIb@ed;w#V!enXf5;q|Fw(>g@!;_X2E z91A{d{@N{jDcpUk-wCrU{pIa3KdB&G5DnHAMnbi zn?zIFQhhQq43klLTPtRpx)_YtMvEXZ=1qwK67ntT7K84^^-1)Z2+0GH8inqE*d!OJ3yI9WAf1htpG|ld z7l9g8Z(WFYZ=<_T8PwbMY2h1|SiObY4Cb{|O%_DhRdm2XjN?Fn7!V0DwW+Dn`7NmR zwI5bxUAc0z<-t%C3M@IBG1R>%B8puP7dSHwdsY{oaYuFb8(<^RM^r}CMrDmo8QvV# z2nZ@(F8A8aD0_A?8e`$OTPUp?`viEoy8n9m&X~u5?G$FWO>~lj%oFiFz^Sjst9ZN6aHkZ39T*F;qR9LDGWDX> zyhvWq;(fEJ?Nfs4g;tZqUSD!LDwjb~$0OxHEjX!_so!9yAr&Xc!xmgaXKY~rN(Jha z0l%Q$Bloh-wZ7`xorBcWj;+;?L+alrIvX>^ymZ9x8MewlwN+33!-nUNeCK*p_l-bg zrE`*>L;WSi_n;LsKP`I}wALr_ze;2$B+PVJ>xYaRE8W49WJA!1ZOHP?4HDCjTaV+D zdi;8pEk?rF1tH=<<|b`_s=tGxxb7puCbZ1aYO!w(vU*agojeSnK2+I|X;OPq(ab|{7rM+r78#!U zr+FP?AgWG}e(Y6aY@x{td2AiOEGB%!NTUCXP39Gz2`5ISulRgv(1ejAG0&LG+4Xio zg2dnrQ{xIruE>ji5VC0}^95HufQT504~-0#U$|wmD^|R$Q>AqXtNP784+x=idiMF3 zcOTrZZ6S_4px?R}%5vBrv_ht4{k6g@dMi8Y<|$_0*`zEo#AYrkSxz)pF#~;l@d;OQ zVzD-0Aaqh-kknN4_uFpvE@=*qCo;#D+ALa~RYnhIsuo}?eRiIxI>%|>nL^p}8PB@( z7}2$66pFQf%&!c3^^i^9X7#|?OJ~u*`}^Oz?{si>G9mRM;WG0@P}Gz(BsA;a>n|yW zxm9JQ%nUP|zWt035JAJ`e{2w zlbMY0@+1tUWiaWbvJ@PDEO+7G@0lO^*#6;Z$`n>L45XqbL^c);?%T1ge$7zQi!h>O z2;WZ(oqbGRjp$t&w5+#(L^3SS(|lXk$~(m63qiBNi8osE+YsjF zA43-~#@$=|{KEf=Hm(X%y9)i4!52TiGRFr~5Azra!|Y(?`fWETzCDl3N`8)kCN)`Z zT(6o-bb>bAr|ku*@M^9-=xdpM_%8HaVRXd?YH&44vF{1gpLMNp;-^3S z2ZeQ@BhTtN_`UBhuh5Qp>Bf`(-{TLTHmx6cXr`)(zhT>dxLup2R*g-&c?pHZ$T>#< zU=)`xTq#%(J+XNzzS39L7hja7jADf`SztWl_B*ssj)^g36R#?OW#WL; zp>Oxs`X>|&`0usyzj8PLIJ8BVG~t%0JXP-fS@=D!wxNrIp!PR|a(Yft#^G9TZjeOg zhQ5mT#I!NXxP`wFE(RnRrAr`MgO0UbtFEDZ1<(yU*^@1h`;gD{x(1q_Rr-QSYIw0hmFu@iy zEZKGO!E44}7$4MsBKDXwHRPze&SO9F_Bsm-D`Ch>yu&%yfkvw*s2rNv&D1XO@vi(@ zzHhhXf`to3)g3r?>RK7vEI5bx--d`3J7jL2BmaBp21+~hhiZgKTJKz^i2TdjTV0S; zTNRt0Qj@nZe@{KnhK?5yMgWB_UJB>eZP*ZY?=7Ar7E7n1TE^o%8ioKvBCN=KXl{KB zMQ4{M_{UqPq}gT=x_USNO=+oQ?y2eeEhft3wc<8=eza{X z)pJ1k+_h^*-xJSs*6Q27#{c$hI3abdRL6AM{%{Le+L}?jty7r2vY^IKoS2c{>bapd zNamQ({j15E4y^=22v!zs%dEx(#a{!|qI%|u$1O9a=&`ps)Yn1zo3xe()>z_b!6%cQ zc+|*u+pfC6kVdv9+xN6w!M;-Mf+fp>l=~m zpXmQPJzD&4ht$Q;NZ6$2De#&hcP2EI28eE1e+4HP&KjPI(xLAfo= zmqdr#Fn5_geHrJ+lC$tf3tdL_c+rHr&d~}`m<#9wBg|^;tX2Pq3$XZn=pxmJQG-N5 zkC<&`F&0;ScG)3ULt;TJH z-N@}Z^(t-U{FD+nNSjen(KFttxP_ZC=>)1(HG;KWm8Sb(P#5}(sw4yOc341jtgJky zoq*uVIs?WLc_iy0b;J57R9{$>hWFry@$v7~wHhGR!E-jpp1Bwgk>rBUxdo3Nxoy~R z07ziZ9x|`JwbsGXt7D34BhPgH4`#fM|FYjMU%2pIZ3|_$`InoL0>mnKw6oFl+1-J( zg!~K}JZ>W9E?vs3d54hEr)n}nD?FgZNY(`r2sg@IE5a?qRw~(sXkOe~r|pX!B zL;J2^0ZfF_!b**W8g`&oNJxbz#&CgC0Zti?&b$7ejg0E-fB(UvnQ{Ouo37IkY?O6b z-(sq?|0?~&Sy$i&Yz_&-wE5oOF--ND?59s7;1uQ8Qgx6Rc{Wm7DjI8BvXEd>;Vg&2 z$IqYF8I@|<1Tc9?lyzo{HZz~JS7AIpTEbWZU`DNod}cA-`1!U=7@b1j&F0D8))7D0+v-N}Rpt64-rd96D-Cr%p5OcDSVZCnuie-OCFZhs~B)=$mVP^7w|BYSo;)tEy;7{i=|JGRe+|ue{yp?X$ESIV^ zw{{+{@{0F6Sg@;at8e-1l>=LUJTZ#>aoo2#yY6Ph%b%3qL_p>)C#Q9KMbr0&5{bNY zxPXX$1d~^frlIPT?G<`kXP2R1 zh6M9)*)m#>=@q@qM(&!cIeqi{T_;bjWRn@Sc?neyN#$%P;C6Jr!I42k!=uPD?SAoj zSQAhXCLOb834!By9{KI3II_`F)^m;Y&6zeN!9nnyn)baVedt4Qb-bQ93rxlRnI|T^ z5=ltfDerR#E^` zu}%3A_-!P#;q}8_b^dOB=2(-BPM>kK>BK;aWT`v{kzUgK6B5*96GV*u!}W_DeZt2{ z*Ets?{Ny~RHd{?8oiFqQ))oaJz~4wyIz_U(73lMJnF?JpRyyYPlPK-RY;y`8lB z(P5$v!9ZsvFF3meEJ|DQ3(q_zcz4b;Lm_Ipm;p9>$&SeR=QSPyu|*m}*nxb%)pr7V zBUj>zG@W<>6oUR(*xRZ5fkol}pp>&-*T~?(m+^qy?s`ujZW2U5nT*k{!^LiRFR4h% z>SWrSumYEcqN9V`_7PLS03J=D9@iLEe#efwuin3Lx~%lB-A@|^P0*ilVEmW%py1%` zhW5B`d3bo>lNp?g87_GZSFSKOB0v|Oi|^}FVOJZm9x(1NO%J1^H^wP#O1CWmXj(UNZ1zCAnc`s5)@(jxN7%htw?j~1Iu4B!FHC`1Ez??IKmQBnDi z!j_mHaFbyta=ay88gg&6NoRE*&8X2ak8v_XlZ!jRujg|nu=Ho9z5c^$gvJ55+%!ok z5S)WSmqo^1DikbQUWZlG zM-iDOo53Yp%ELlsbb3C$>{&gd9Y6Kvevd!gf19wpnE9y;S~zC#LO(2oNj2`9M>eW{ zQn6N4fncVSQnLM7Y-ULVe2SzwmsI}C_Lx!*x(%Is`5$*&_16f1eWDHG5r?c>99D3B zpw&ecfM@(8x!C*AnMyI5vzo|&0%wfq0yi{63}zTkvd-SUzD)KJ-Y0f<#;;=^6MWd2 z?V%-Raq`6+Whcdj5Gv(!O5zqr9kw3sZf-#(`ruI9Y8Hq2^y5$j@^)@52`__s!j$sv z(RAD3dc$42aM8gZ$%!SaQXm142frTM0lZ`9om+SjmI%)!J=F%|6Z{X3d^~XfvcAf5 zjHypadAZcAw|ySYMKc~R~#V#pqt zGjy7#R@;7dcDZ|hv2T_f+;^-$B8ekM5R4=S)+|}ML(J(1w^3OppALNUnQuj^+Zl=3 zj9ap35tKFcVcqPs;U?Myz~J=QFO-ARmkCgfjgUB+oD50h@*8C(CEOvr1n$J^i}3Dt zzeJSSg2b_MH&Dkg| z7!%Df_G@{+XH!W!=;1jq6`@T|Hzb%An>hhxc6G2w3jt#g^sRhme#bV#W#y?|qb>+V0*F0tldPIB0PvBmcayz^Ja30JP@Ey+H&Zc+a+I|jT^ zQ=a6)Q2GJzDWx}}0Q#cDa7nH9c*E_N2u~&cX~&@%F;jiowC1+L0Rk2})<;No5RRXN zCYRsb0FqUV@5f=0f9){O$nMFA^W1``t1e!YN$FVyx z|3V>5qQQ;4N_Kl5M0S=FhT9Jj*|+ALu>UW+id2Z8#9DT_H9Cp|_JyGk0f|_5Mi`mt zRbU^74YrZN*w6U9lL|`JM4b0py<T4Ww0sJxK6XU?#+|P7L_Aba zJ(rgDhrUX%3K1jRj-O@Iz(MQ$%TJ7HfI68Cjba!yCfa=M=r-4Y#`KZ~oHu{7PyFuc z!afWE!>(z7hY)Bv5O^v3aSAxZ%E+O3`2o6S+}*iq*K&(X27B*g#-!HgMR7pcs5$Mg z+%`=q{}7%rmgyI~`z={8oHvk;%epv0t!2 zD2daGU17H_TP8SX2;S7g=TV{{onOv2M7*EU>W34S<1K+d%I({KAR*nxv={7@C@}5; z9M9k*$RIpts{B2yqLh|B@Op-IN`FbofKT>4ER*|?Rw2jsq}2*w5~%PFoK-3E#*QBS z1Kb#Xfs4yWCZal00)>my%7c;wbfDIYn{ktnkk?iqw{Dlja@Aprc zfcZARnCT<7DZRaOr>(8x|KMk8f5B3UU&uB}S+C_6v1?a=y-v}hHK5E)oDIFds>M7W zEGY_N3re3pd#g$yk*=s*45aH-i%a2Fc+UiDt8kB={eg!7u{Hv#!^C$D8y1mY%cu{3 z-L9@K04{YKV}VgQiwM5~?}|C?e0XLV;qoELgF^z}g=QeLsvQoy_xDdP5w8erQA;WA z!33=#m>z_jQAm)$P`_$kJCwLvSFawiP9a2yBC05?3$H&^<~w*^xX&kP*?#;+Hxl#w z3xCCco(Z534>i;b&E26xB7fgx+vOOZb7Y**W*Rk5hIYk=>hybkVJTeV-2Na_pj4uw zqHtPpJ2n`y9j0+L0_=)@}QVlfLvHlgZl>zK+D&cegeoP|^9 z!ZU`)EYu2^!MK1JdJrzWECvad3&F$M zi~)%y}55*`+YUT5I$drX=MwmHdYoyn8hWVjz3k(UJ`b+yCrgJ&0<<8Va&t=6b= ztZrLW4x7XCPUEEfjl_ zAHRNK8pv}M{GT=E#xalaSdN_Pk2MPyih7GWsDXMO3b|XRzJb9XLXpx#F<R#NB%P=!IBGV)oXsz-O<_oXFHC-;~~eT zV7eFS2psj}EmF8U(t!xU8XQJK$%lzWNdrO>Iw#ZVq_|+X>~%8d;sX(|^l=KjU$&9H zq2^Zg%K;l9@fX3`f%i$%2~`z}2S|iOL_QYB4?lbpTpB#g&CCD|&{xsele(Sl-6A-E zza7#IR6EeVytK3v#7*#XR@+TtyO4|!xhF(*h^o>rk9E!ttVL=9W`hl$Y}e>y15E=Q z6+?c%aQn_wSa3nQ;e}j5V&uLeeIzD&lPA+b&7M7*^FJSNv6(3B3|<+(n+penGvS_7#*8GqRY^h3rcu6Efj8;w zJw4#o&rqtjV!b%NNwMUIerzN_|g=5sa&i>lB1KT}pRLDUO&ztJiw44KjgmTEY z3spq|Bje&&Ej+T!fKK}{CkZw0EujS4Dl9%#NE1SNg&Ant@@$dulkNnMmEXgpg*Jlr zh&`T~mgP-F6;bE{xCQzMi(|N<;muR0M4W>v#(pq4l_L|ridD$d2Mnzthk_Xx8PXh7 z|3_WS?QipNhdENWA~0ubx4ppYn_maJxygruvMCzF?)9;*PU4dlk7rv)2Uuo65>r1Qk*NEgZw>nfV`f!t7s&H@RqRv8*3yNy)QmLQN96 zwZHia{yAZ>H|eYo{n&&2j7`Rkd$Qx){iL0-q~A)#sYbe7t%czZ+UApTp^YHjeYo1LL zc~&9RT9mh*t|^jx0BD^>9Ah~gP9lS(+7`8OOtP)|w0!Kcu2 zBcE%$0;rrMLg0vq31i0wFCS~8jA+S5)Db@P*s(wSZr#3Z5m;ldO0 z<+J2v0u#N2jORj^L6V~Bix`3Y5)Ns=pOq^Id@r;KB=_dcTJ6hA_R&BFHy+5VDf;}q z$i+rY7LrUokjTM<2YEB;QvxQZE!W=Y?jEu@_2Sk6%IX2i5~pQB#L*NcB6}~ zhr20+Eg+FeU2qO(X}#oEZkg56s=+zD4qfp9k9nGdTvHG;2|K5|K8LBbltvWJvJ1zo z&ah>Hv*}U)GRI>11DXUq$S=AaZ8=;_R5akH;JUt1rj+x|tM%hN*{!fXnHb&GY#MpF zdE(W*s)Fypf^%(DbqUj)v&yJ_FjTI8ly{438EvY@nsHs>rlaU>7(d7M9uy7xA@W(M zO`-~zzGHp5TszBlTv6XbhFszQO4?$Dg&W?_(NsexKDzsU*dk^Eu8x_E;}a^fgz^E> zadfYzgG~FHcqWSH)rj@zaI_}8_n5-o`m7F`7~*`W&3~OEpLN=_p8ys%eg9(=Zf(ZuaUDWXQ;tCHIu5B5>a|n?WVr!*j&vUmPNT*kPkq#ro0ON zKH{{;oshSl&PNCEcD!)5bCwWz9M1TaM= z^hrOYJa#J=pI?+zjH=H`kQ-;!?2}Q3Z#Aj&8QNXi~UnCm) z`wF_T$gQbqY2lM)=H^^%I`5%{=d$!LY31K^p}8MNBka|^?$EpUC)f0_fS-uW?>XzD zo^fzcy8yf4c(~gYdxLFsMHp%T$Sq!c{gtPUXn*NhiSzZZ%nBW&&PFnQU8(4uERh!n ziJ$&lEG{;Zx&RY+HL?Hp)SSJ{#**hJ*ZlU^)9K9w-+?jOj%IV@OIA{}sByTgB=XOZ z))<^7W@1MUq#tR3eH^+lhn13(6yQ%~^ba*BD$QYyRQy{kDv&@5F|FZpD=OX{+%YI^ z`skG(&*`?Wz1-3BXI4%|b|PxAJ|=9=odeOAP~i8Y?naOQ14J+q~gfs6qBN2!K-dDI=mN3AB&vtv+x z)C`RiL5@d99m=17yzd}Q!=LkXq!R|8eAsvOD0oJD!8V8?S368gM-=jFwjb>K&S{_N4m3`j2!g6Cx zYWJeX{X!hI(e0ue^Ngn5AJpPK-*sc!Gvhn)lKMX8zN^d>Ul}wklzd_Fw(RqvEng>t z={|2*XW006MWsb{!@e%>fVo?>eh1fNrivvs&Dg$$)#g>UmQ$}+qboEBw>!% zyU!=RYN^QWYBw)-@Y;C|FvqJ424>DLdzFcd9en-!+?qc0h?Qhq* z!FCnQn8shrs#YC)9kZvS*ABg=AIbCzU0-HNeo0hhKKAS5gpRV$6&tR0Y`LAo8vK6Q zE21~Uy62S@;Fj;=4|;3Gm#uD^*d8C<39|d4A`AGyqhaQapMl%-jy6@tXI-1QWFy_L zz25}gSRuCIwMp~9Uf#B=hH0zSR~DKSjS!j(I&o^bkde>2Am@%@`iKFBp<#K{P)N-6 zKR$l%+wQL;wWTBkFXiu0UsZT#@Uv7_WFo?1GV!6iB%40t`Z-Gf|YHqXHr?GxtwPth zRehISuq`hB6ZF-`7vsrosO@4-mG!~D3K;U*%3rU6LDpVrPk*p2W6$-H_>zizi=50X zw}~eY=gg1Jm>-uj|6VC$dyp6H{T=_94cjo&J8=&Qw!h-;GYbJwUJp)*R((8GR`o$s zHLE#uwp@NL)xZBx{3YET1`QfSiHWe{cdo>+@-!c*$45qe>$tD;g~qERqK>L~1)07y zb96`?=~!`tEb-BsKQ2a5(!!|zlg7uP33g>Z2eY`TS>O3#BtK7dItitJxH{C2Vg5w}{HnBNItNCFnU`{*gWpK8L5byS02^xeCeCC#iNI;o zL(O>|hLZiHr2J@3=`+V3w0fI$sBNh)#rf>y>vXWexiF}`VA`NuaB~xxIfq=G=#OV+P%WLN};0jS2X zqDV=^Zh%GW_$8lZjZY#nA@nFRGExV+DC>-272>96ufGT#3A4`TKV9H%blpNqBh`S- zf|sAaQ;{BaF`Ea9jfxFZ>C12K=0QIl7Ju+y3+|+(rX$-vzvJ-l;{D%)+RH4Y?>>8m zKTvL2cHa?K>&OCMTea$AV!e#m=mCu%TD)OJVE_@4pLO*rF|{D&^DnybmhYa8zmQQ> zs3iLLrYV%JH%Me(aPCXnm~#t1o%wUrH~vBng*}y@S`9HzB+tER7&&6bK97>akB#OR zl|q9@0cc|)QL(W8slAO&b+>uZy5_rg_%T3RhqPP=4Dx^a3m-Es-9dFZy(!$4fAi61ieS)4TO=k)Ul6igSYJ2<2yvp)5jY3X}QG;wp zYx%#zFFKi)BFIemCeeLAQVV0^$@;z6h z@$AWlFgMUqmZ9mE6g4NHhl!S7qs7*m2P!G2PXl;i#UJySC|v47O|hbDz5N5K927x) z=qK>O%Gz+^nbI#)FODRn4}JRd!J#YWG2X8jWI}uSIqFIT)F$-$aAUsvxIV%<9hu_b z!5=QSS2ly^Znm_v1OtdG44a@+y4O)r>rLLR%I`JY*7|9Qi_e4eF>d*M`N7rjLKg{f z@vx8(`XMH@Q3arZyDU#x4&P*S+9BrGF9*eswe8Fg&%P-y9z1Pr|L1)g>_L!995h99 z6HhiosXok6n`{ks@pW*Iy|(1an%n>M-_^_5$Z%1+@uCOD>xDnNpOx)>^$_Jk&Db6* zJK0+z-~Ru9{lBip)gQAWdIe&Z*~?Dw!VF0ZfYvz5C@lZpZ6zfJv`13%DpMYnrWF3~ zPx~H6NXeDGw>$sem;V39{~B2Tv%o3Cu=t?o5HPF2+kZ}8`CkS9zdv8E{<72P(&F=z z;|k|*u&NN*d;e4YmaeM*x61$j)cRU(!hQJv$^w-&@|G3}^xku)mPu0!ibyLBV1LRZ zqpz#s63_vqy~Z>POSnWEZK{w`iC<^Y6{KIke#|`a%GIk#LUoA!?F3b(-^VydPmeqy zG=euOHt5D8S$yd>QdSZRD9|wbVFSKBoF4$|TVd}a8=HjJpHH^gUbjXBVQNY$<4@=` z(|qR5ol90I?T2+r6vx>1n>%6;A3jWOL%&c+PU98&qddUBLuou{>vudN6{BY}Tf;)D z&}D?&ZcqzTwQ?pVyAO1!V+e=3W7>%WLJW|2=L=Z*3l|X|D$f zLgcqaMUlsj`E)d`2+l2HT#enJ;oAO&d?Jk9(2O|faO}-a){PV5Xb7^-&L(n~TgFT4 zDUo3ScJ}!@*g&`7Ur30Xx;n4S;H7R>-1Dixm0Y{o$)7x-4&lGT1Zv=4f9-a(Wm4nl z=mBqCY-?*7negeG-rb|+g(!h15}qtio}i*< zO*D9Z`{8%_jUT@oXKnpBntyL^Z_XNeiX2_TX5aS^LXdY1J%cYH1r8jeyc)cPCHwd1 zEhLm#CfcC2H%~;Zmz$dlB*x4iJUu+mQIR1VIaZF2iLb-!R#a1v$Lj3FLeYD6gQpMg z7H|hK0nT0xo_486EQjM#IAO|^qdd;L?*Xgp>*---K}R4VCI*6MvUXj0G5?G?z1(iR z*kF*VMhr99pzL=k-B}A9`2CWNZ*nkMVD9ZhltV;^)x_VbfqWx^ED^tmn@sC~7(8lH?a+ zpa;f6<{!gCAD^Ghm?2+4!5E-w$fOPHw8*Haq{ZiJ4kGfz_HR(*bcURI1_n4F@Wj=4 z05D9Xin?>>j&NZ@LMV4!;M>eRp!@?19_F>|0SFZye}KWjxCQq^Ps)c2Q;}X>0Z)Sq z!h)8{V>AMy50*V_M@VJcL;m>|9}3Dp`~rsS0loWR6bWO9uLB2Qj|iOxaD^~7%&Q?k z*v1AXOfXl5i882{O!%@J+lX&B-1bEgI?UR&%ug6h*efRvL6C>@XJR6=lj@dEtOoGx zQj>)~R_uDEtPxeJre@ge`r;<rF?Cifp`#>;3`^kfz>%a)ZCnw%=I5)QHb}EJGPUD~TBk)tA?e=6S z`*tg*~M ze;S_0)nTrNIVw>ynRbB3_nlhk*>Jk)O?n;)b4vRcj`@D>{$^L#v(_nFrk!xhoCcX1 zx-IQ!o(|@r#FT2s43(3^K_1}2oWX#d9o}zf!OI%c&+u$xxV}U!K#Z8X$>VGT%f!(1R!9KRe+q)A6$|PM~ zMB>+BJJMq?Rni$Z&K;Q>Z%tSC8}Y+vLyTyI+}-!>*<(j|25XXGu7x0x+`r`2BKy{d z40b?KWt{}}82%6S~U$`QM z*y*Fn?<*RF7f8QQoIVl~?zrl)W#G3AtpZ0LLGnDStYak_y2(n?Y|n4pze+I(B5s{0 zsMY%>93~DYHX)ACz4tFMzw4aAd5_+osSLir1VQxO0GSF0)>ly5pdpe`49)Hj^oNR3 z>p%RFh%5Zq;>{&Udkwv9-@bjSMm}%>1m`2xPvc6q<9{)^gd3D3dSl)m><6z=lX#!(p z7}s`deUWaw%VQ-t5xdHp4GB7B4LBE z97=PKGdLdtP@FqAYn;NG)vNa_PJD+DmR%oTiChQD90tBrLxNrc{A;LRDIMvAoVMqf zD(t`x0`U76@wR6!O5;2P=HB^ZrL;6Os>dVB#zxP^#g(3p2jGo6l6aJ(v~mKE`SO~G z&#Q%$O9HQXfObHK#VZ-+D~E?v-rFiSy8gME!UPXRGS59@QO{|}%rhHrzTVHIiY*wO zVD)MoHkhZRrZ#d({HkFJtvq@7FeQ+}1XxXbg%H_4>x484W?nF=8DNuuk^gE%S=06k zdnjj#3k+4URD6$11JideM~6mX8-cLIeX0frT$=lU&$VR4LzkeeO{tL6|loCOP5uP*H z1J^Wem4J)!V~lEORX1b}k_>?&5S|n5C0tqDPY+zxks1nn214%=Yc*D79E*)5@apBu zzxK~KVJ&g~V|Y%4SEIC)6uUfC#QB#8RHo}|X$cbM*LgAxfuyV8GA2v{DKooIQ`lX& z@Fj7>yT4cE-Mz~rj>B7AVUKA+2O_69IB*vG^NpC&;}eDfChk-L9{G9J=Jr=m{T-RB zxh~TVZ&c`DtXaG_+Y-fV&lwy>V9nSV&C2b*nNn+Is=e;axKY)d&Nn{h)oX z8$97CHC&n=HtslE0SV^wkLtiD0v|nkW%;BJQ6dZG0Z8G03S0{5?`E{DV20prr4~MS z_(ALnBERmIRdJ*#{or5ltbGqYScfK*y@HBrN|U2AGSSk|#qYr((& z66x6E^g&_GV?k;AuNQEZLr1MT1)1Pv8Iezu3USrtGNw94-%4+oo0iq@<$5M~DUI@tPL;j{q5MHms^`rbTy`P14Kkv@HU1rq)>= zZi=nV?zz_^bu5M-Bwo>WTs)lQl$en4aEpsWL(O^EtY^=LFvBI$=HIe&5r>F_L&B)M!Y5C@RNW?uP-UW%Xzbju z=6g{;RrBooDvxwtj1^WLa;z_H{{c5bYzYYH)iFU}9K(Ql==_a?1z1dZC=4Jhu8sN| z!cSs&g98bbEE^b<9X3+m&FHXc+#rG&8X8hVcU21`3&LEdh@v0RkSlQ2LvPpore?H< zYu}V2v`snTo0-LdS#mSv(r8RM-!W#>GcreWI=K*@sH<_(U7ZY`;fsc?OhPFT-$&Y zEM478C3EED?lq>VArnxjSy_)Avh!2}F!gq1eG<={VV=(u`w83Ng6CZ$_A*J~cGPUSvgzE9|Z;sYGXx6_y zIxG~nBCm5`Gm|7K@w}+XwVdpPP^wvg2436Q!Y#mUmXct`0p;C}ih$5j1uB`fjf(*q zL(OYErbL?6I6eV}0~!Paw3?c3m&$?gtnNnkdnOYI@d*N>;ogviKhgn_r4=(N6muOI zizM<$|)++d*M!_kE?M| zWpka8^iT2v5MJgHPrE)7{Q!rRqfY9;8EPjAJ4s1NgrPWga!HY87k*$WahFLr;~pMy ziueRfc+q80+s;Vly4~|}VsnqObFDx80PBb_uh_zhdX97_A zqPO`eP6)c3rn^UP)E{JE03tf=gk9<@rwmjzIJ#XG47uja8H%5fji?-VF@31cN4sRjR4T*iVPJ`ybz2Y+0l3sJcZ$2Z9K3x$$|)4QG? z0%-PgG6jw%)j^%;exXx0pE8Jw0f zw$!i&etrKu3g?G-Ky}cMrKs7=`h`HQtZO6LA5E~Fv72u{| zM+y_ZU~iYxMO9c;67o7?mwr zuPiIuYw||?CzxAUKbbC)rvvL@a6DyRey!2f5zB4WZpfHJ$4;`*DqndhI{Jg%+Do<< zii9sbq@~ICfz$(L;u8y)fUROA#C#K#_kGsJ0$ zfztt%vIfDjbhx*k);r*$;Rm%wjud+yz&Ts7(%#-aJ|<>nQt=hLRKTQSS8u~x>n2_c zzwfTUN>TjLP&PoM7)+BI+QyV3Sa#Xv1WDK8k$#|Qz31R|+&u(qWHoj1$zrnOTjJ*p zaDg99nvD>aqJ-x`+Deo8sz!imI*Qfh(Tt}GRBijEsK7NUnNFhk0j0_Pp5CY~{;CoG zYZs3dU}{gK2xch3!NKTGs~Q&dFk+mYoqzMo{wKe9q{;TiR=PPGAzYWrf9KCTj*{N} z8&FtJuPt##caiGUapR<3ZAe!;RN!1wQ-fSN_1AgR=sr$+WmPdSp%DgnX?s5}(YVaz zvYCPohgNd=D%-gZ`|w*TV!FkMg^|GE$5W0tXbIhA#KkR#B;kofKV>I?Qi6F zjs4m1#Hfg$BMu!td{00kQ{K2EgOKlcKk9N|db$pbww($#mSp-ugvSZYRd1WpC?k$W z)_#0!?70Q!dIDA)brgBim6JZ_nrdUEmm#>T=ep|M_55Z^27^>aD8w4LIM32vx*2F!X>?u}E*N3~KWf=adL>|!ylhFoTONnsrYi2AffZ+lE!r83;Z!5McFOc^{deou z%s1}ZW5&SBN&hlQY5&(&8bmZ<#SLS0CQcmqZa+&kuZA7+>yh|Y57ntgMk~@@gBYVj zcGm3~t~GjANED>neD3W8xV9(1mWmT)`RX-mynKEz`$Rx+2b`ntKPFm%pI@b~^78|x zWKU+6duzT^hT_71D;P89rUeG{!9}XUQ$y}tm;5DExDxhM^Of{`yLL(L63gw*6N_kx-6n-LL1pzsFYgXtMgG6PCjvWU9P(f#fwidGnuJFg!sk zI4bn7a^#q*0e&}GhXtpip9(*(=Gz;CAwM(9&Q^ zRs8uTx20bLo~g*W8t}*R#(ZN7c5 z>{{l1Uc{{UnBQu-s4dpjKn$Va>v8G1&(p2qty!k3JxA?LfER57MY_v%7wq#L7|Pa*(H$ z{XKs0#QXR|(e*?uxw7#a8=&&VM`Uc+vT>EX>%mEB91C5Yy7Td$qUm>aut<{3K|z3V zbZK2zrNsupdmB|Igpd9q=Yi~~*Z;Fap!um@g7U`0S@INyE!9qMljMHLSa#OUnoVOu z+(S1Rfldi^CuTM1m(CRl*V3C4&<29{?X%RB2Z!J!r8C3*C1>N&qoNz%jmT6yuV@Zs4jZH+j~9LaQKkC7T!2N3 zaNG67LkqiB!l_=VXlZFpn2k*9vWvsG@ z#A3ByA5prs-IYUV@-%gZHd`D#u6M6&3X?^P7aMdmg5B`YA6Sz$U|eVxIzs0LAZ=1o z5=NP3-jH8S-Z-f%-WwHcr1D4%&qnBW`pV#EoMf$ral#vBu++bg$e&%52_nlRimN#l zV_=bsuiv#|gn`Q8W>-%(IDU8M`p^LDxDN>)EGJiUYosD|b+6kel?$;ML*=P`Y<~$B zE|5eF6nh?D#sOx1*)+88uE$B)+rPh2o-8?Bf|ZcE23y+-$EGo31?^4x)Z*+4=+qaM z9~w6O$+OW(27Zh6#gR6eGG#DQnG)eJZP>9z!WfMx_WKJf{O_S%ZY5_`Uw4tpVc>}F z@CL$GW;Xald&`IB=0rd}XUO3=r0>KbTR4)rj|23Fh-#~-s8Cz%(ypLHVBn2@?7a3T z#${Lrz*M)H;jmyRu~4^*2ypIWP=|hSvJiYpi*3PY2|prZYaqJ z7R#v?RMH{lcYyEh#?V7xxwxE=nUkMPA0cx`!D~6JMRhQN3sY%$e`1NHMN5^rV@qgk z={C3)VKYUZzp~T>GNVC(7yaqks>^2EnP90sOuTdnGl%C-pZc4Xfs4|%qN;gjD}+D5 z){Qe&`yYAatmah|C6teViLMzGo`lsv-oYaQ&aH%*bpNk1#ryqoeLmY`AtrRNBe^^V zP*3e2N-kT%YjkAiUeIrkj8i?fh%evYUS2uHV>Xf@k|@9qB9_O0z`#YJPsF6K@b79H zPqvbMAzbPH)CRoOBJgQ2a`!TWGwwx$V;CdUTUt6Y20`}!YNIy8^AR#)y_v)!Tcgw+~~p@ev0|AYdDCWS}*4{9{D-tCP# zGw-dZLxhp58jTH@!cVx}7&!90F_o#>mhif*bj#IekveIkc1xC_6!^>XE~DaJsmnQF zP@sxhSWX*OF*afLM48P#PklgbXV0E(H@LdlI zVjPLN_a+u31?ej@FQP%ft#703tt*;J+U%DZCA zFV3?Ai!MC*_>CJ2$%)lfw?|pv024d^;G4(DwfmY0^f|T|+?MMJmHB6bn zoU5jW;&#lE6Fq8daT5%_J&A&KwBA&xj))6e0_4m=9{3MS2j?^OVW>RP-YB+E5E39$ z9(U}C0AGS~a$Gr0lQy}Ee*xQ!SyF|hAX}Qa)y@u|m3-arl5qpL9%la2bG=9)S`{do zeWVn`D%4d*jna8pw+5x2tjRs|8hkSZnk$1!{Dc=TUVLoP=vViefB#|7l=1z!4nJ(i zY;SmLk0vq9L4E?b5KyTtv^W9gj^0;g6hoocF%#x8MCHfO_MGf>&d3Eph*tplIbLxI zCx?qYt65)1%e$C#?a=j1$?|F@PWiF%^w)E#=4JeF5)-i(nEL!$s-8?odfRFET&BNexc zD7x90^`$S~;UsnCg`KkI2ipTXI+o2MkOL3a19=~DO8C?no_%hy3iNtG6Ga_gE-7L- z$Vdfeya7h-i~-@CbvyK$dpcU_QZb{Z3DX!LC%4+dqRB~1d(!kj2^#1ARX3su~jQqrqeFXeBI zgZccH8)p)B=DHI{gPn3NXWCkbAO?P5K7>M4Yn>jsAqs|BK=};i5)%bdFD5*`GEwbj zT@22#0_N2+gj8NQ0i+%#0ru-pJO)VSDBr9~+h(!A1E?85q@e!?pUZ1fpAhc#N%GId ztSrS4ec&Xx1dA@5oVqDw?DDZ;j?2&~QMbJoWx9ILzh6?+H}}Cx4!s#hOtX_&X`5V9 zKeN*H+_}L|(a^7dcH8nX11E-`#G0uy=&8Qf`%xKBLYp;B;iNZo4(uDC*Bv{iGESJX zGVZX?=EvzR_b$$lG1Y%oNx2bSc<9vPql-qL4&!SPq1srQT1Vw!PGUTb`rqrl~f(Y9DuDr}U4Pd)SI2CWFuV>*x4 z@6eF!<27pifCkPts^a>xZFjKsR2^6gBH3W^=gEYtch9x!TegA{QIUUGZD2WU{Hlyi z6QpK{atek_er3OlyB5rI{IL;{D$HyX*Q7#zLNDT^GGWza??flw1o7~P=0RwJTtpe^ zSE#EXmBx3NS>>5>ZZhfSA9$uX$D-J-Ies}_pO>%_x$lh$^I?3pD%&-MM_{mU?9@tlg~a8dtmaUxUmL*KhiP^S&D-d6cBY( zL!4^;eFNZkS7fm{P4En_u-T$V-i<15?dsu!#~U*cD{E$;N*ND$Q572M-hEph2wwA- z|4D(4Bv=3_NVQ^1(Ej`Pt%Zsw^*m;X4kCU)hS^BXcZ@R;H)}3Qcs=Xdv98{2orEqj zBGvndc-P=djF-fT_TQKaavx-x%=-Nys!C2)_E&p5BY203+k>-)!`ODdy2u@2o|->S zI)sY>A@Gs4v{=UOU$;o!b(?bjjlqDE^UeW&G^YK-WS5>?S~nE*3Z4O;0?%xPi~+{k z4l~jd6Q3=uR{t;zGXcO}19?5DM2~Im_4Esu>}YDXJU}f^on*RtU{@i6bXes_m-0#Y4Fp*$w~9{u1vhWM^tQuVuPsPUu4O?_`sl`oDFr4f9ZXD z6t)&@gPNQD!3-Jq1pLd))~sO^)wJ2*%{XDO4ElpYEYMjhD5pD(v~}q!&<`vY2rA=- zMu`M{u8pVbXD6X$s&Qbp{x+k}Qz(kNzMtvxw(wRs>#dRA55ZA=Kh0MfV)VbRn)5~t^$cr^fJoHh$VsvFgH@4vMUFy zT1i-wYyESPj~1r)?EP1H$%hQgt397C9X-K+k+QAe@`AAf<@-u_;g`my_|^d38LBQ) zlSM;KS4s$C>Kf2z!C)!m%I!NMA__au(FzuXbQ7urA+?=9e?9{*Nu&xw4=H$eyr|%g zkVqZK7;NYi8?k-bKEqBI>0L|ExcS&-yoN^Kegm+fjqsFK9X0AbAIBx#3-7io77YD& zASO_5tt=>jvxBcFxiLBS2gj!?nVLCn-rNsa2!CCqF&fOU`lg?kZA|5SGyaaN@0}WG zJX%XiQCFYijp?ITGYw`K0cKhmyr!@Fe!_+t)r^*~R~R*ERSq z5M`<|+y=FECot!sfg)!3D^yK?)o$daxzI#YMMD+OA~YfteOk6SRHfa~qx=!E@~ z9m|g{Jv)5naaG%M@h9!97rv35e(}V`hekza8*XMpH3 zQ_~*RtHbklwbcI;dd(>aBTHO1*G@c+wJZgjLCRSsAR~5PEfr?0S|QleoLF*^7b>_X z!F&)kI1lu4V{-4BRQI3u`P+nWH2?(s&RJ4(0E-9!dP)0b2R+hV(>D8A!&wg>Q{ge*Qd(YSDY)QMr z^vo%j6&Cf(+~&Jwfbi2WPR-WZAwTu=;>6om6>njecD2aj_D&p~_`pAY>?~ewxbzfe z^K;Mi{+DS)EmFibaum>b35H6bnclu8;mag4&ATuQC-SncYj>qv4Y#rPl#}N9(h7e$ ziym(d>&X~Nb5DQ8V-=T5`4FZoznABk5E}+ut8mQE&u?{pMFWI@N+_^l7t-)@gJklP zko8}x3m>v5o3``Vq7DL;a7Ut-h_=3-hnW-Mk{B?>rD_qN##+Q?$;$44k9pMY zDzCJu$xo;*7{oG%R}aUb6PR06;tIe2^MlWS?^p;@$EpTZkrltd2%Jplh)q%Cb7SWI#!ygsJ~Ikr>iw!}o~!FKTmR_HaF0QrV3QoB=#?LK()W^Q(Kw*FXRQOjLK!IQ$Ri9UH5hj|e#o zdvxPiGHsZCuMYbyO3` zx%Iw=tKVYV3yH`f3gcwOp(fmLC|Pc5>TSi9wIZo6^*SAT$E&?@uj;DYZymdCez zWL?(Kg84-U9|w*u`5l0bS|J|WF4Xm;DuN7z>#OOG4)m0FRc*21!~s!hzCtF}zse^3 zbecQd7{QQYJSsmr8|Yq1xmEy`2G;~s@6NZ%iCzC8=BF7M$~z zS=dg%MFvoqQI| z_+hr<8xvbt;y3yAdW`SId~c#%dS;vV{CQ>a1|p@uQD#>r8W*9bk~zW&4x} zHZFO=r|9uzrkU3}Ez-(hrP4!UYep&XRY)5&JYXE#Za%wclI0*Lm{$J&{U851{p1>;R3H9g}x77-GY z@S2>{H8&iF+8C4C4F&`%8t(g`qPKkoR!Uc1+Z%jug=PvRK&T(`EINCAdA~jiCNfl* z8^-R!9WTh0u^h<^y|c)~Bxs=Ql!!l2J898a#5{_-y@sBg<#8B}Ku9-4ZYc2)pDWyI zHHHM!5FI#h;P%l%QEn`zqhfbaPMNA5<@97zdGIy_H`P0Wo-ud1+EIvbyf5*9YgnT8 z@mscXnzDiF9B%Bzlrq!i z-QH#@K@bv56T$ZtLtFWRd#M1RShqG8C0XSFId|(NWG8;{Di65RQo02?!2aN1bO*#i zvk4g&YlXD`8vP}3e&w}|!GNO3^*zLg*Kk74_J6;LOG}61 z;`&zOgF?niBR6@RzaUCs^#l`X-Z`dzh$E;#`}TeSeY!H~>Ll0)q#bbzYlTdW0K5Hl ze~<~Zx|EV~Oc)lgeDcw`e_PkxAAc#0)&f}8-dcK{vl^I1La8l6Be19=4fB5d)h zb4NqC*L= zzHYZ&sw{I_&%*_Z9j3|Ton+mz%=V>u_{q&09az)*^VUf1UE>eUTZ=o?fx#0jGoHYi zL@2&=SDdpR^Qbk@~cg3lHPRqwSLcWQfi(q7{Xhcy>%6O0Mo8UOGo zmHu*8RabXp`>aAMQS}{#sQ<4fJpJN;v z7}5*<*g^)AMJ3f>)`I67eDZG2lJ@As3(%>CojCD}bHc-|aK4h)v~lA$gRz^=Po=Nq z3bgC=d9!53sfG>WseKvH(H4;ah#6-@w&hzb@Psp{7nozKha<`{(r7ybe(Bd1OHc)T zd6#r7s?$A-2{HIX2{VG0vvNhe2|M>CO&Wlcia7b)oH63^sb9%s< z4Q;O$HdNhFa*v0wHyguVSQGTU?_t{GvG^L|X~vz@MHdbnJm`OlD0;+io}`bgH=ecB z#ALU2BvN!R>MCJ`Q7{-dO&>o!1DWOpb)%5vT3f3a$lyg4FzY8bw7g5>g%lApZnvjv zL=O)Md#g5n{FiUGeRef5JH@Z{-tL%7m&9%F|8Rd7t0yECcwHbA+37w9t{X;anHDY_ zH0D>kUhY8kM$81<#wSk5_#zES|n}fp%{7->RqF= z#1WEnEpD*Lp#|T|7=*v(h$_|&6D|nLqDvj~mu+}>@HZU*f}xFxtIFmz)Kjg-gAs0j zC;B7rhFdxZ9QPN*pi*)J#XQ)3sKw&rH$yK2ntx^ssoQm7zkBrxzucC2=^^AhuhVjG zk+{(wP#9oT6k!#PXQppiWn*)GRRTT-i=nK^bN2>B4hDVh4AmgJswo%DtcUI zwjjC-sGb;uq3IQSuy=yIkUzpj1W5^C+4GarC(N8F*Y-TRZ(?-xTN*$}0pHJ7^Y#_u zj`-}+j@tm##9I4$Wyhoxm8LyJi-y zN1?f8w|6C!H9UXx2wB&|K_WMi%*?Ac?p7oVN6c7{0s-P_3IHy#qf&v&1KKCy>ZoYM|uU9_Y8SS7)Y8XHPCXJ zn;FlA4-7V+>;i5Fb+X_!3PtctCqjo&K=P~IMZ3Kv%{dhM^lX-{W!xD8?Tv~7*z)em z8!df}PiPuomAh%s(bvNHdD4qGcOV5OU#?2^ySZ1JLg+88~8yy z3L81>&?hc=?`xKX9Dl#=IrB!Dq8sNk^ac_ja3<)2FyUvPPR-`+?aeq4i!Fd-hUv+@ zWwr!u4#gpC%z-mHyQTi!pgd5l@L_biMf^&rjcSH%j8V5M%yxR~U04ep3X8C7*9H!o zL%1F1Ok-wn%<5T192nP1>fx8|`zly&w~3U%hd||mIJIWsFHj0_(W;xn%+VrmOhD`IlI3V6MRNKV(J93=mk1NTX zzErNXHN0}zKE|y9UXX3NXYQ*m$_IrR4)XGye29UfJtxO8 zq=6}jY>=`LrZ~MEpz@N zs~2*wagIckq%0?Ws}NWNw1AEY2M%;;{9Qg_lP?cN4L5bqAJ@3CWpoDg6g(;xAnO*4 z0j{9kMzv#4knj3sHxosRu^`fxM6={x)+d>i^z2wyaGLRzarnl+Ge5>yTU+bD5jiOd z>}rmXhvRzPx(rr^uQCq{M8FxPm}JhtL4z>o=`r{;TRA$^lV|qp4XQXsoCKVlzkC`0 z2xin@r~>fNf%b{4m0}AyE_yru$baU!0O!ggRS^%(Es9SaIZ_Cr;E68$>5(JpgqVd{ zApwLnmZS}ZoLNkeR4PwWC_t(18F3VhiaLE-ftH!}LpVOzA55_^LFDrEpP2c=jt-H> zb@7EAwHYV=@DCm_9+qG-=BitDrm*UCetnBDnRdf@(P+bVTQln^F@ zin{W*%dC#)gY=18oo;Ju!>0$MEe=jTSpOgGBSR!BcCK%<_jpl>EN|uN)qZ<)Ki~7# zZl@VzZeZ!c$(NXrzyZZd)r?7HV@{j4lQ}DY4;OR=+$1!aVAZ$QX@0|j8igGB<)&)n zLn9Ey*{JtJWR5J+oB4yqAFv4;PbCY?Y%mN$Q->V_eSqQyXa{LS*`l}Kef-3(VM^_* z{K|g1>>r3a@JzoQ60%)zQKKeC{?Kpfpov3R{-D3Is;*+bYU9SesQZcIUg9d)Y6TH~ z!=mtN|Lq)^xv`0n2?(T^Ni@ixRL}}y$p8Hp0W34&=v^%g7}Y0DVhAXs{#`OnC_byY zI(IAN@@@YcoIkLRSsvfVZzPt_-!_5CaFZR}w~y0SBwH6%i1lyrfU_yCk#ZY6-W{%9 zcx_X@Vt15+a_4Xv85H6A1w_3glKoud>u&WZZ<(4bgzClb5iUc)Iw5VBRu<#l^KwAy zSj^1rrm<^i+mthU=&e_Fl~qtEw{0r85a0Uk7C?+SitnA;VlVV-A2EQbzDJvnD){n` znAZbedTZV#Vv-5Kej}*xa9FGgd-(o{UMhJ+hknRPOg-d1GuRuhZ^yuY*7Nagx16}& zh&aS>h5pkMu%Wy~a=eS#hg^ekiO zYv_t)#D(RYUbHkxb}v+9zF->PD`H1jGB`@o<6?}br>S$KVnNF8o2n(|E02kO_>OXq z3Nv|YF5G@oA|&%A#~dkn^-6S$@{Ci2TkLF((p-TC8)PujcqScAn3s2?g4!v+8+t#6 zATPtvc`X5b5$M<;(dB*gHFLylVo7O6R|~lZ1aFJ`-iwZxSRO$k1`f{w09XRUS6Ofh z{OAl-6e73)&=BedeIS0N_|(!!7x!3pM1$`wsE$f2Q0lycrmmS^7h|rYRHx}YlBHA5!2QA%Xv?WD{BZ;@hlkZ`*60I zo%fH?aiPA(vt`p@B>827fK^Apap@~5f7enI76gnb1lUephX`!z{o^2HM(E9Sk3<@2 z%3I!qG=u#zHG>0Y3*zD`V!dQ7t6lDGR~R!JE-1l-gKDkh2mYDhW33Tq3VbCm(=YW( z*39-FS2B~@CIpN`ALW)uBD`8#(n>hnw+pIkxc;e)-kP}YSl4qxJ@Y%*Yo{Z_)qUOFRAfM znsP$qj{it!Q3IGYCoU{xGx_$=8)7;LUy|nE*kb?QhAay2k3Gzm@#Deot=$u!HFDo?jl5-1^~g$C<2O z>pG72eNx=_S>=DfzIoWPCvEt>`R?m?zv%k9tnNMD_>Fw+^qtt^Lxur77bGyN#S__6#X&$rt1zMrFTI-zO;j8if`0ah8(i%g5%-R>X_v;mxCY{8Fh7$k6cKz^C zXT8p+CU<(yBzrGq_4C3~bBk$r+X7~H)S6^EN4q4({p$C5^q~A)N>2tftT(o`?g4~M2mJ@GO+@dOPe%$si-r85!zq($A*^ATX_F_&z$m{_J=elI)5@lzg)=TSo*Oqt$L68 zWpmf+0I9uIat~d8eQueyzfx(<)&6VuUiFNSESRJzS?4szX|~8!cwYx=YTjH(_4-=v zqE*&Bt7fr&Se%}hRTBtCSyv~pLw&`}Z@oV2^h$gnp`%b;9M$;uom4l`)S;i>1<%^M zd$Zok*i*Y7^@CX0>!{`{IWM*fU zX6In8mn|K!vr=0b8T20c>CGJnJ)P~O%w%?6OkAO}^_5!s7Kc{dDNkQ~uD_a?yI+J{ z2mwI|k5P#+y-6IWR6tFp89b_qs%(Pr?tfeKVM(aGr*~ z`!|Rt(c{*@Ggog1S<1UmL`!usuDsAwDa?a|oMX?Md$QWP0TKgBqK% z}1uF@>c3Ym{V+Io+_{hmivW#ub< zEyz)~|6JbmM(5{{3irCoFAsG0cK!h>a^IQRYIH|Foy4&gi=_5BcZxaAbZc&%(KX%e zytm{O9uTqb&uO2_eb|yTNAzJ<>` z69{(??Jl4=v_U92Ko~}xe5GOHJ7Cnj>s@2b3FyT_1&Rc-*cotGVC48^CsD1cOU$Mc zoeEe%PehKkh&%OmWz34tavNX}7sMn}NoVqWp#hDQLO4!8TpwI1fCCsoYVZ28GAJh* z2N(`;OU*U8%k_Q)XEH&vSS8=NV{DaD+sCCQxX5=k;Q#&kt4>SCCh2nQlh~XqsOML# zNC7bt5*x;hxky5J!fQPFIDeQfO^MLe2<*2K*5EuCA;hWKv)ewOiyC&26|t>5If*x0jRcvzV+CmptfZ{e4OO>)?1(PdAB zaOP*9tjH;%1qSKou{n0Q?6GbFPAZWbrz}6={cnrelU+c6fLyYqx7CbosZ_cPK36rh zF*SJDyA_J3^bFq%k%6aHOUY|0j~mzTyw6A%zA~rDT8(Ra{(POEpPx8&QpZp4t@+$A zYs(T=j;{`CN&be$?(=86gx6f{W)j@eB&UCSSrvP zofd}|96fn*QH&|F8_R*pK{<5cK0ZF0HwK%(aW5@qx9H9`IXUgINxc_viPvr={^O9~ z-ijCKdXN&wuY6Nfl(u){mfh%GY-UduGHF_~R|`ALq&`zRKMo8qPESj=3;CJ6Dx zm?JDK_}r+O@nfoXLW0z^2_)pqp{1~@;Z?h>oDxC$kho~CS!YO~RvsiHBlFfJJw|!p z%1o<2qMvWhkrd6*JP|B1N1~&|Ts#1UW$z7-Au?g;M5QDq+H7(2jMwZ_IGb(S04au{ z`GN%~>G2(+kx)5|O9Ey{`|$XgRuwQ0Zv(1R6OZf>f>8v55R8o$jFRum49ZF}y5@mq ze8iH*v&sz!`0M6wXkXO+3}1SiT^0|&{|P@^RENudX?2g^U3$Wla=OU7J0s*r7gep^ zex~`1)Wh~1fpAn6UNCNf(opo0e|mp7jI8ON#joA3-tC=d`D(tRnun6w2Bm4juU$0_ zbGLLm^2vqGpNEus@BcXR{l9-#Qz@SU6eQN?ZX-e1%Ig{xOA*^ zV5aoZWa*Rt^Q+yVgZ%E!|1pcy_|H4?|N4J@{T;bSUD1Tv34{#=b=w^JOldJlY3=^C zXhZ!Sy=&NItV!(Hz0j*ycwR$&x6R@I=l7(gCjV!1`2X`+z78rAQDh06G0v=)cd&E7)iTPFfrUUzlsDvL8=C(NQc*4 zFGHL_*xK5WS|N}Wlg-dfW7t6 z!mu3|zVr(DK*VZkWg~_UuXEDEMB-T6-bUZ$jFjl#thDa&N{Xb{^P0ym}GG!4iC4VHd4WZ1b*~RZDfI-+bSGqLL=z5 z=>f6*yiLc`8lV;`H@!PwFn%R}^T7RTvXFm!E@pl~fJ#}JbuvQFpd1u>>(q= zkFrhqC*d`m67;;B-9v(@t6o&O?BxIBTEP?I5h{!I@tce-7A7xxV9oq=pw1KM0hWvz zCDtqIzSBx9?uci5U~M%eLe!wZZW@M#Xk~^B`INtS!7p3bG~J*bHo!(I5oCjVdV22M z`GZb|B&9SY0Z@ItW4TL(C`P=u`zm>wl6xYJ?bu~9c2r@2vXF&# zYU4Eg&%`&>ckN}@Li$Nd-*Nvr9#?=Pk1?yqRu4y^g(fBzK(vb%9bkc{SMZ{Notr%o z9PQMuu+)?h<;8cqZHUw4r@-T4*kzvXl9;A`HC%6s=WPbq=v1teq2?ORpP&2i;Vc{~ zX>Tw;q#K{W5cSAo5Pjq%_+CIzh+oMy!vk53*K~y|$NK z6uxZGYxRgF$MZf4USIq6fx^;q(GYECyyW0ePr@xoAzEYZ8hkvU7`wQ**xK6SWCve~ zNa>T|;TWsIWUhDdU>IU!^8qbwTiG?KeW-ctQ)QNuCK0Op?GaUh3EnPlpUCq(E->as zj;yALji9%6vD66dDR^&L$iSdD7SnojTQyb-e<~ zkt#iKf>|<#GjsMIPpW4EGeA}-;sf)} zRcmG8K~Dt){pcG#>9Z$KeCL{>tUdDhdWi#vh^6NJhYwp;UC%7ibtbzA@1VECB9<60 zUW`u|#}IAEu_tJeYnfcZ%Z!PsMwv_rIwbfbzLBAa4h8J9!IGW1#)ajzMBZ}b<$c6C zm1zK^sH$13i}R_M@r{@eKzs1u{(WX1oDu*z-NDLwP!l*(pAl6A(`4X&xM>_G&_aTZ z&SGAs&C~(+5H0*DFit@evvesXA=15$t>t@V1`iIfl0WizTEr5}4;lGzc~W9>CfTMy zOR8nTVOe8{qj@*8>y!(Ya{C^7pMmIxQHT1(iFCFf$VY2wtnh$M1S1n2x=Xq+vF)}` zDXd!6d8)bD$yfRA!e?}g43k*+fYT$u>-qQVYql~{WZ=humxMG@ompzs)$~bt)y5aq zb$tuJ!#0YIjYWWS`t)hAR5^3knE3d9Gk%R6Ig*)O$JTduV5b9bYK1W9rawV$q^YcI ziO2vQDZp@QDd&r!r1+2w8CNEPP&*3&_o3a0`3j_xak5V^{fC{8U}`5Gk+{FeigP{# z>vtJx;`6a~)hfhf+#-dwJY$shyivxz*a>k)8peQ1k{K49_c1Uapn)VlDP6ettZ+i+ zuC7Xe7KCP`r!|-Ba>IsE7^chI zhx>}=8#K6fr>KGcL|Z5?>{l>}1oNvwySrUFz9ln;r^CY316ELpLnre^WD<;ID`ES< za1pXHDJtfNcF5uv<9w_6``I@4f%|_v)+-y1oyiLn#JGjAfY3q1Sos8J1mM}?5m|wE z&=qWzx_sqI79?;cvjD-rJhQL_77v&*| zu5lPmp8OT!EzM-}6zxc%DCi=Y8lyqd1?i6l?)Nv26-b?sKiTF?es13UCGZwPm6WF2 z%Z9ucqBPbfN>2MSxu6h#7f8Nf-<3?sOhaXLt4k@x{@-@`d%$PO>U4_i^ z3k77kV;X9pj{fHZu{yADuN9(lUf7Wo03myOeeq;h*CPwgmzJ*CtGO!1R4dZh7k%s} z)N9)n_;{`a;{lLYRM!RdAHHh&azhpF-l4}9^_P<3#^Ts-F5)l}5EPueYIid7+=0lX z`PqdRc2Vu;l^RBX+%ueVSVipK^XHtpOsgF3NW?CWM@(Qh4ci8_>Dk*A2Ht=i3#Hd# zh9F^?IPoAtm;3h}%5NUdeNTR(LN0B0{_)VnLz$~XbwO2N7lW#7I!(?42R3hQt(loC zd>E9cZstRklq|??$NK2bP!g5{3~xacts8_>;WA|zd|)85c`=B^1VmX3j&I6?xmT-l z*+w+3LcAVyyu%R@%oaW@eu;DMPS-6^ID%P$cGsay#1=AQ!F)CUMq1_;2c+hljLx@Y ztdRUjcHC=`*{{=En0#VI zjj!>vVUW^Fs6xm-*!AlPr4ZH$DZpPBu{YR{O1Yn5JW@2fX*>f)1w69ya$S661!*TX zSN5r;7^zk``YJQwXnIiW@kPdsskVlB2G)&~pNJ=?Y<$A{2g^a;^^}?44VPTTXmBPI zD<=PEJYITpL-)Wk13?<;YI@M(*a~48E?Npnd7mvlIR8Ze+6z0bK(ouR|Gc2eXWe}N z_U+r}tHjx+8so;{w9G&^?;{6*c)%23!C5!|IHDSR_3|aNfAF8e+I3JI@KW*InHv^t z0$f0t-0<7|1vxyjLdY6`8_#Ug*vR}vUrpAfHiT&k zBV6X5XY#qXn7k4fBOxhyFeIcU;}d@mS`Rdp9`(t&P72JKt&_D>RL(YS{c`ltqXlM( zjLv`$WkhkwxV~hC-iDdn<99j24`vNtMHpU{;Pt(js+e z9=qalLIRkesKIq(FT94iLUBuNfeA>jHgQO+gNH|x_f%398FFzfN6iw`Al?82my(7S z7{Vl@G96!sjiN#7=?B(-p|7dyUk|o@1F=8!5Sn0@^!ATO=;Q#4lMHZ5Mf?M+u=ZOR zOC04QiB8c1SSY>a>4wKY<9)yqm&_%0#$wjw+&tJ~XdTWB(Rk6DJ;7C&QSa?B+lb7pLq22Eb`kOY5eWZ3|bWP~C0Zc;T^)@04svTUCR+GB;jc zpbGJe(eumm3$-H~{iJ6#KUmHgiX}H{MC)WIL$12!81&=g9%#jYd_eF6>`D&hU>L&& zu7bVirmMK}2L5*~`Ily;Qgo-`eBYh%K&9G$_>7$q$@1{#OijbE5KF(gjs`4npJ@4O zoV{}2bE2d0a1R+jZrnm+<0}aXe)Dy%KShPpzS)7^3vI%ONmHgy_4?=UyCHoSQOf?+ zUGsOBg!g{F)sm_+di2@-T^MZF5lomCsNQz_e({;D-wlzf-G-Ug+t{FJv6*W3?;nXV zHV>h?6s zAbbx&&m@_ia}Gg}&wD5{{rmL;-;xik$on3<={yzwI`v;e@Gk2@s?hK)3|<*(lI%GX zFwVH)svtEM+BX?>PQkc|xAgt8^ENd0WHWM9-E_^{mn^dYOW_(M7D7B=_zZ_%sEX2c zq0}2+E!t#j+b#d@6)>bbPXgQ639{nE{R|t1WOS;;C0k34-f0__(-`P+)|ro2m-qR{tp(Hk0x zWu>*cX+Q$Pl_YUh-5CT9EyfsBGj+OXOIm7*VG<&z;a=&^C<*!_nHRXCP*nBp3#ZCQ zUj|oU<}>GB6g#vqi~$Fz{s+_Hk)!#AVNlFKHZ3vk1~+8ztwYQRIV((tLyRlAF?)LJ z{ZSaye7=^lCXpk2t7E#9kL_6ed^F|fb?)V>)7l9S!0p2T;+n$33aXQd+`~1$U`?a* zEnTah?SW&>vn@4eY^yB)bi6@EI}-QG0K*u=m<1*#7=z&ao%{Y)h2yY8$B!IgmVG~_ zv>9rlrF@^S6J5O#A!JQX*r2;nl>rCkq0?k@(o__u*@dlB@7q^Yv7~nAz2yTMhb-_f zZD^q#PMt0AM}aag4;d=i=Yw;TG_=O;=@kY2rqIB?u}FIU2vyG0r#QNSi4}|pd9QW( zl5#y-jF`#cx$lu#&j?zfb`%Dqx4o#?{2vk9w*pj*w_73Fx9^>=4~NhG(>$l{j{4dg z^$^ubDpXN*#Y894IOuO288+g;ta=jz`5)eFZKp=qa;Q!eLP*Up6|;MGbleK)gn)|} zp=!$OCH$!y%JtpH1W~-6#e`p?__&6=FIdy>rxPx2^B`+pHpZ-O9dd9HuRVR!9~`GKb-bNR-Y#&+W2u=Ag^qo++C!J+1_6Zt zxk84X{j%SxC#EamH(I944IGGfzBaCNkD9FoTdw@nOWy{6mZDW-q@ zEd0|q&N|cNd~1wJREA5#n&1cTeh+eZ3nI8=44H&=UMWYa|M*5Be@lUXMupC>tF%(>*J_UU367AzrA{` zFLT;3Mt}JT-+}BP>d_lZ@fvHtDpzgL~XPfjD??Cz9S!`aJ(#ev=x5V z{!y0?vuHi*;GFe7bgU8wYsHz4>$oS#CxLH^um|z8WS%IN$ks|!#fa~6Hjc8HOBtn~ zPwo)ao5heznT8}C_}|r1FrGK>A#sGabyc;shrOB4RYh0O%cqAYkF?iVu2U*^O|=#w7!J`FmculI z^6Pvn>I53K!TXK0LUJl)XF)QBP$sIP?9_9uHUuslpW2H~g5`5=`RHSu#i-^oU7hV?qg?N87^n8yKrWROCXtwFV&j!5!Z2qO6D18tc^~5jh1`)B*cWwQzC`cn zzvgslMy(*^0BGH4YrAUoYV=!+1C|fJ-Ef#O>}7A>!&BSuII`T<70pRv!*jwF)~cIl z2ziy9|Mv>lgN1K5tukn= z`YTA9YZ zeUAF9IiZZ?g+YV9qmj;;A-2lWYikn#DSmNU&mb{8O>v^Sa|#_GiVJ4Uf}y$x7hRyJ zqioa)NmzLabrt(9bqG_fH}h~a#Q$c-2&1>9cYY4vmVx6Q`C4oW>Em)0-yhKd7{?yT zsWy#&B|rrNokDuBy!?XLLXz4I4euSFv=$})qi2@#42$5VDmU`K88!_s3k%WTRI3$_ zt_aGUq#CbWxN+JrbWmQ8cVY;{2rT#+&LcSub%*CbpYxn`X2}?G1`YdKdRWdB{Su-T z!oAY+SF(8x1COLH6k!zmk%^ni6naUxE$}e>OHa$%Ovd2);cQE=r(eBxx++TMps#Us zRJRM|(%=Ya_1WKL;O2(a3-vZBY2ZY;y&%a+eOnG*ZX7!&1gW5bj+Ur`RcO9-vi6Yz z+}5BW$(-<&s;C4zXZ5`m=bHKBm)1EU&X0c;B(_7I_QxXWxQbEL0GWN3ALF(CxsyU z|Pw+>_8r=&75QeR$r=P-kTms3_`+YZUy9{d0; zeB+!a5;>ZL6$}_q{UY*f05GNUr51W(1C%Sw1Q0cSF6Z%)KX%A0t*WjvX{3 z(o5WRFU;%Jt9OGK&)8dmj2;a;H*DF?<9y)mxezZH72oB^zHw>s zEnA;qP138M+s*IoPYb&ImW+`IxQ8{m;QsxH&ONC(C{Wq81p=ko4WG5bRQbvkd_a?s z5dfu9(7wGN^J!S)*4Vq;aI(8L8%lr<6sOdHBXnYj=CaVj&$AG2o$ zBCYpBW@Qp2qa5p@{`0mgAf$J+w`XFn9eHKyGqTK|N9o~+747vfJkxf|?drqud<@P= zp5;TonEyL~B9hjdTqO&{&zOh{TE)wk{WqR7n}`9C1EWh+A7&FP2fJ8KMoVwCv-f_Z zFIQ44cxWP`^OY^C-3rw)0+4cer+@i8BEIX(ly~&s5cXE$5Aw%dF8_ih6KcRuh~}^%BTN0P%mC}Jp8TbB*B7;&z2ISf8><+lxw%w1Kx&$j!~=k4Vsad|FX*V; zXIaERw9l@8JqC{-St}j;?)z`A(*5FtViCE8Py<*r62t!R<4%F5AshAWX5J83Dpe~v-TTyjKV!NP^L4((2%_}au} z`5PT7Yrv6Ut#KX0a=#?E~_b~&?WD>=H$Z+tVq zTB7+B@jO`b=GPF2W--M>AKNvfl@ul)8kIlyN!cqXL*ov#N(uQ*f=Z-ZMb|&0tG#^G zq6-7RY$ddW+C{*FXS=|w6^t36CrZ5N=URF9iAdWPNMpPEA*;H*+T0C!_CbU-fIDx$ zx#wIC+3e`pXMloVHiGT7y9c^FMs+W}pZDBv*B)$A0K_O#RhXlrvH#C7SIBWn_8?d{Zcu#Pq- z_8>L>lcNX}iscJ@^etzcO5Zhhw}yRBkF~7A*Opl|_hVG>GG_2;m>yu9=X%qqWTJ{rpFxf=!=h4vIdy0Pm;V256Zz+5UdaKSi z!oLD*N)D^|@To9R_E`(}cnd_Ewwnu@dKL_a#=xy&epR|(zprz>`xM{VyLa>Ec%&_h z7E!X%rQocXx<>4!!R8ib#J#E-o+HT-$}Z7f23+Um*-3l9jBYROl{`SrfJD!VjvxV^ zWSnx{nR8z3CxuokMPo0Yw+ss^rN@fBW3cDfF{}P}v}nW?hH$UPC}(q zW(wm(!I(Q}EG!n&JWmYaio2)+r~%XR3>T_71U;FoX4UxcSbOJku>pooGS_O7zWwZd zx66{-fQ(ge24P`T_kBaZQVh9DDXtc=U9jsLy-Xv?1?N zw)DsHNGBH?WYYESKB%=kVal4W0D|bzen0C}0RocCtF|m( zK5&}a&*;h5SieLcW?PmsUt}%;;>oQ9&W~>I+s9_iF@CK^PW$~w|CUEbuk_R#B0q8n zRDzV|)c}aZh-%7nWZ}}wEK)dT;W_W={JqISYPFgyI-ekCZM(3#?CHP6u1ArJM>%S; zZC?=WfFhm&;FajuD2ApEo`e_b$&=twj)-$=KUoRt17)6(G@jIeM^O;oxkrtP^Vv?7p~h zHOJWYH0ahcQ~lRe%qp$C_e8ek1`2Qw>r1<~p$LnZ<)yu^iAzV zufOHYwe}Ui*fPeS;RCwx-Y!vAIp6>gNML*Sq!ma1BtUd~@VaE4LbcdSHJUqx=lj zY8^ptjZX&nuX|>tV;WLMr4{jdJ=#Vxa?AVpMKf^Aj8nnEg6!?{=$8H;FBKHOtmyRx zBfmL&`=5WJvofhx(n2Jgw@btUGjUx-4ZKlv-)GyY*kx|%a^L3}id>vKMs?t3d>1%D zF*uULA>>oUrs!KeRF9&EI&$O){@PY|8`w6?V9QE2f>Mb6W2h^(=tt(!p%tTK1aq9g zt4o1#H(mAD{mC?qV37Ck-XWXR_3Z%H^Ik;P9bZ^WLd>ZPjUZhJaZ5k>JKxGUdlp}S z(gv4^B{<{8EOel3B$Tgq*J7F|q)%fNj8=P|4!eO(LGceRH;jGEn&2wA`sau?wj91d zMV8t$e|0=$_u-dD>b3t{IrZyo?{Cvj9KvNEVs)b8=?^^4C>Dk1H7-hlF}^9PgC=F` z9>M2Xup4yh->gyfkH@P_CP+;C>fbee)GaU)c~%8`gF3o-eZM+Iga&@Hxa(Z_|+SDspGdaqlUrf!Mg?s`{lrAO}EU7NbPcEq-t ztBK5MnyWv+!024@-2KDWo_+Y^V*HrU>lF?&9;n_fS^D(SLYEZ>7cNPjJMBvULuSib zR&AT`zg&Q2mz2G{YcmOOf3KV6`R5-e{U`NpdpZMLn<71K?tb3hF{^2ZdC($qrGcF? zGBPX%1?$gd=H+w3eA`}+xS}towj7&(caFiCT85L_%l1h@TsU$^83896Mt;KoXeb4Xwef~ek zAM=>S$T{)DN$B0KJW3Ty9@pNmdP6xHjrM_;;3R_zhpPPBXW4c66 zX+z9OyoXzw;2S(Ef&&5f(<)4H03y?C3~21}ndm#UprF97W8V+=a_7lr`%s_=E!CAl zQ&J({sIF@g-DRqdsc%9_Wm#FE{ZYn7hd!5ke!EvExI=(snA{$dk{Fo2;*vvQ_=cLL zDoBqd<+^=+eeFsWZz^xkS`}e`6oUXMsXgW&16TL7m|}3$beFZ<7$Ss#;!^BbXguR< z>9Wh5nnun?2#e$xgX!|yZx7HqoiLLiW z5s!5;8a|!o#PPwwypqDLw=Q3H2Z@2P=tCA{%)x^*^z}ubntbZ}?Tu=gNbTXg5~-&n zmoHmpwAqOR-y`o<%c+sNx0E(HNq^wHeII&=lftE#OYlDpX#Pepp8VR zk-_cTw@;dBK;tMKGN82o-LzhZ;IY1I_pN^MLdYq&y}W07eeKWPt)1yRyT(T}M46R8 zf8OtRuBwD=-OSFnlXlu)dCs_D@G1KhZX4FCk-cLNg$nUSPLA@~H(iG;V$C#Qr*SeQ z#=mLvq4?yYT>g#Ox(Zn_89A`+eh;z9Nqs+W)|BwMfc1%@mT*idB$1rYd-$K{1OJ?f z*Nz}9|J@ZZR`-_9we4h^`g`c^vKVA(0gY1as`8B?fic8*|Ngd-M|s9++@X(F#?$k{ z=eX)cAm9dNz5VUU-=!myGbLnCD{nWbO$%8wD8@7amMRyEwVvv%aiKIUhM{ z8wE7@CuuKX_Ho5Jr&C8%WdM7s{#Bm74JN}cxOyMjf6vB~Bx8D?>gky?RNPmlcZ^CX z0gcB8Y}6>CvmH_jL!hkMtXw%rP7d$~N1}>!i^ll)cvU@wrVXUh^x9s5hx zQOAT>v+T%BOZ0qMX0XmwCWv_+_s?no1U+`u_>_^TNtZMo;+T6WXY@`AEO{%6bu@At8i{NEV2!X}gx0 zY2w3xa9O>zX^GLWFo|E)ZMi-6h13tioE^9 z{T>t-d%|OD6utSRtN%1pSrhlIx8o{8YbLtvz!{7j^WA;YP&oBOlauQ%Ia7}OL zhl!o-$fdYUKDj69Z@`G4C(C7fPOad67p2`N(fh`~c+_s$G8>u){a?o!c@I3+Fw~fQ z>@l?hz_5c~V0mu*%>9Ln*Q`N;1iAm8e^TpYF?S?wI?-I@;<3=`L}4f zq&hv0JgR`N2@1lmXV1iv4)iKiPkh*he}UMZBVWFNoXk31AQQV~yTQqb2Wwg(HG&3~EDD^+QLFygF+AB=qtVPO}yGF7o@S3pnuWH!e^e-2c(ThwCYB;CSVw zZte}?m%eMt6x{e)JZ5w(bNqw3CKqTyfP#edkEY~~#%PRMTE6}Y_*pN`_=2N&m290) zHY_?O?RyvX!p{YC6c>P~@+6hY^;g1GX4<4#nOvE~D_gPR`J_R=QCSOacihq9!&bvC zhc({&WHm-3<8&y|81nNKbpI`BraV2{c=pVhnXpwDl&MF9iH#j}^U}uZ#0G+lnx8j# zWmCyg2`l@|7W7=XkT%DUA8<7ou{={hSM$rQ!C?H1y5Sh9M?YSVUH?x;q2kW-5}Da! za}!~l#H-qX$46j^5*phHQDXy7D3P@8W2GK%Av0jW+9}5%()aLy^7I$K>L(aRvX~~(hjC=TS1&nr@vmvfGBLuU$SQS| zTo}hd*F#qn`&^>n$(Dfw>D?xcilPg;@_d!G^$qV&wpgRSx^#V~%66LHs1;xMawz+L zb#=r3U$fG+Qk=&Ip$jWJ^6p_@4Z`IRuVj%m7l?#~)VrJX-nP4gn8j0&*Smf5o}<+Z zHgGDr5yxJ9@aS&YvNL#LVfE{FU!fy{GIZj^3Fb@=n7agemq|-W6+e2kB$a|F8H8i1m$x3C0C zl>ZitGKR#b;Fon!bX_anwavwRLJRiVnZ?@$d*)DSqxsA0swH7T3Rxw5mrp-B=RKGYs3uPD9CnqC=}fJ zkEeF!v;;JcIt9DI znaF=F-R15N?>CiW<{6~dvDfhU37i+&8U;BIXg$Yv#L%HXu&lX_S8wLbQL|_N0ic5( zp6%5FYZda{`2B^xpK^YPXm&D5^u!Xh^!gTS?!VQLzMw6LPI;)-1} z^*;wTNe8x*L_R(CHR-7@k2ZQJ!v*>FYsZvhnkf2{lh-oH2Xo>63cNK)mUMlpK)qW%+y6Y(cR^7|(Zl7cwyyf}jGmI3O z$;q|{;~Os+kRF{}0CW154>gcXy{OHtQ>P}h5Zbse*0V_A<-Rdv!vwl zfri$($n4vjNIF*apBiOY42X`{AnN#W%EtlDH#0Y%)4yRJr$Zfc5}ujrnpcx3QU6;4 z?g+4+KYNW&eP8SOx5#|v5C7!1VpqdYrjc3hZx;|vfp-oe>gmVt*@`W`@`K;cy6L~? z3pLp2QKJIy^?j`P`$i2F#rv06puK>N3;swMbA_`QGFOM5H_Z+h7i>b#vd=|9Vy?aS zS=3C2zd}p_m=E$2t_A7^-eFTi*=s%6oR!a?4^ve9jREjx))pFnT16o}V)LsoWc~00 zFIi)ve}Kww*i*&OtNC}sNhmOwBg&XWGh%$tqB;WT`iQo zpa{VqAEq7E*=$1}U}YsAVvn~8S|+^&P3)rFlxFYvnNj9+i*Jv}XvE}a0LSFUokH5- z-hI;d<9S>oEqIn(KH1qF6tPHiZdYWX(85)RQb}w!o@EpT5lYjiI3BLq4JTWwsEwUY z)+Q`;+znRdMCnD${+uU@bm~Nfvyj%I|LN8hIEri#+`Js|df>o}f8eBm5H@!F_&BC>pi@X5dc5Q4@Vj2r+%`eRgq;#ZE$U@0rdpIx0W2rI zi1CB>HT^zmSTH`6*qC#fTFv{cx%Hs;i3=2cr~z~9_|67 zDxqY+pw4DvG2Bt`2S}vg#70URX$}y$wTa3YM8(DZJvs)FBTI%d6?U8Q;hXi zC4$$m@V4PZ=3tYUkV52Q$l(3MSs)KMq%dMn+JA?IQ(jiqc7J5#s+%7DirN@De*U$? zI!!P}LUh0!cXUiwjZLdTE@*d&;PPJllre>oS{fIaanFLJ4Knw0KAjIwBKY-_74EaE~>c#3y6Q{oD7 z^Edx`uRSu_3@+}54UHVcAe*;2*U+H}UYoct!Ut!&qbkYHUWs3o%k^H~4-7Y|1O!}6 z-H%nkX2b7t61y39G1hO;8ykd#M_!|m3t}UwsTCF1HdpKD30k|B4<9f#$ha{;MrO8m ztJ2kGEX|prath1#DJd={v24;e@mLnFDkKYl(-aAY%SzA9!<&f;Wupo$Pn+9W-u6>6HNcc*pVh*@KMQ zZ)eL(Mqf(2+G}P-m5Y~=Q9j?9v4jvT#(9W$6x0ci8O(^SHQ{17Uz?$!ar(@ezT-}_ z1qUIXpjZRtS%@XuW!rS|uP~S2UlUv*=rtJ&{yxK4Kfv>%;wnFw!NizqJmOsDrxLat z9tYbqnz!@d(~scRL^BP7EE&web=1+ho|GgEb8sprGtbgNw67|KlrY{JuBe!J_OF>U zyYN-+<*61|d>zNL`}cpm@ugo z2hC37JRM~glD>*COBzb5Ju3C2!?6z>zkhf6-qA&Ej}z?p9dnZ6P8ZbU-^|zrr+>rM zpN)206rA}vANvg3nAlg5vshVqvk;^zEwSHlag!r96uv^^3c`Ic9Dt*u(WEOL7agJJ zX2>(skc;vZ|Fy+wu5`FERSAW>=qoR$Uj_AUzbks#yM+_{1S_s~B_T>bI_T@GpFbx) z+3?!Srgr0UkN4f8&hIilhF(bO(U~!agK>dS27`GY13s)m2(^6pT+DWg8^0b}aK=y- zDLRXBr=ci*) zJQFkY$~?`gsHg~oZqy*MSA#DO#@JH2Q~7pTRiK}v9bQp?epluuHi#Zj!QW@``N3i_ z9AT7fW}~4BphHYb>h1iPy@bcHJXH1<^>9l5^%eSR+*RcFGgE%<0^yKuI3RaKftHh$ z7KdWqnWJJ|S$Fm|vy>oiW_*77!2{ZW&0`9cHf&$^q5o%Gv{Bmz?3uqoD-5a;%>aKs z|D~y&8dkpB36XGGn$(QL!MCKfHCT`S?yL8K^88aM8Xk3r&$gC|Z%J{d)Yj44b>V`gTizLIp*zR-$ZgFnEjt2;aScKuav zT5FzhZSKz5xNm>`C2JP8ckeEh)xz3(^cH|bE7XaARB~igxY&{`Q^!yI^u@S z`;uOlhrk3qSZ*YFpm@Fb(U94v@9i@^wE?0!#8wDB>d~BV5|;FrC_r0VTg6p;h=6Os zZ}(x4(IewDE7(^Y9P0f`x0E-2%|F`zB601%x&nad3l=j*+alE^@nS&3#CQv#UkjfL z1s&mqnp&XwXeOr>7!9O7qizR#SiZcd@hj&YR&=%F*#(YQeElw(toUn3ImK>>Jwq3M z-{;dMaf*KDRE9a`87?AX*l3K3tnbkMg<3}$92j0%HSyDCC#i+J2^njN9LuDW;>U+U zb^!re_mH^BXHTBcvC)O;nwEHSi6NHw^kYqyJ3lCY@z4cP_CbU+GSa#bBv=x@r4m)` zCl&8sKOb7-d(VYQmM|r+T)zCxcV=91H?F)Q5A24CtyTN--c1iuMZUK6`RzHjPKr`n zCfrI-Y-wrtC84{|<~&=cFMXcR0T68bYUKR}?LU4>V!>@pJb(PS81i2&F`m~!@N#l$ zTD(l+hJ)E9mmya%%Z8@t_6&+VwDujise(;kvw<8Dy9-P3k0EYC#%SUMlM#!17i`ho zy9&#;)F0#f)i~d>o%B z2YRAP>z{F%2OAVt)!a^cQr$91c1`y1U3ukZulhQeDV!2pyVtJH>R4r9WwQ94)srX8 z!8_$o|KDHk>$cqgHT$uU!u(r4Bry+MKsWe~fb(6Xwc~4ntLhz~nHBX)dHT+!D{pCo{ zZ?Y0e>k=A`qPFhq+mr_yE^CuUid)oH>pIQoZ`C^{nPDUUWJ=BoK6B&u8v9R3E_KIN z{z})9UtB5vc7~BFg6^kH?f%-6-w!o%)zn^E;iOGNHzGE*Z&nVK;F-mJPx%eCRLaUN z-V_>$hNZn*umqQGEetNMrJbow=x`l4vsX}YRnxsnqhnKTA6;AccW|KXC_t{+@7+U; ze!2k#uUc4ep;B73U_Q6lrxJ+T!G2pM3tVmXxi6V;x;{x)3~L(kP5)K>ZEP&!@v*<0 zZ(%fs^dhkXWU!oPeT)A%?roO-jK*lZxMl4#UFtV)+5RDADL)q4UUr}JDWU% zZ!<=wZ~pT8-0ZINvojUP>b9(ul>D%!^X$W8{NcSH#{Afi_V>5dpJ}J>ojrHX#IyNY zuFIxPO84h58IPJ7>v?PTju8HDxCHe;XpQ)@X*h>YeTpmRAE-ig-&25h6_E zhyPsKL|1`*f6%>QnWG@jM-?P4l>e+2__^NlMF#?d)~ZV*^Hg%uZ+&?vH2rml#+VDNzu^IfRlW~iFUa(QZdx6`OF{BjTl<0I9y_POsqR5(ogcDOEi}`fY^@{NC!@F>C z5dCn*okHA&Xho?v_w)8hh8EerzuE!SL)=~KvtVTSBw&xBYM&btH=b4Xwpuis<~=b> zx3f-9#b>uuhVx|F*OsKCgI^sUI9UheWKBz{c=W(a_-jX)DTyv!C}QA~aUdRmIio!} zD`MdG8;q&_wzmUU#@|twMkwW2PX_f7rxN&9>iLK4X;)lzU@K{_V{2+Qh@%G~a0W(Sl{h6+u6&CKsu>36hFK5VE;R#Knf zoYFPUDJ{x_*NW$ll=&b_J7XBMeecEDy~vq8wf@29dxBEjWNTYs;GNWF^Z&yIu&-jU z9rFIQ-IiV3j~4)VP*K%dt{SG@kJdZn^=nblf($w-nXVZ-L1E8k6Qsi(c&yCSh&R|3D5ssaSe+KMmObV0iymI7-t?ysz z>JD#QZjLH_pH9)8`AJLrzxN#%$gX++^zGMQu?yCjn%?z{{6b2V#DAd!+IAm5u87(K zr}2qLN*V#*KP%-g;nGr%mU#V5L+(Mn8=p_F=B@kcBOkag1mXPNd(vkW8xgil*}Hr| z09G$E#vUB-XNcrVjfrMAJ`Aqkc_{Jt19tY=ln4p4@IiP41^v(KP2KuuZc1Uzbo77G?;>ehxTf-&6x^PB(wf9!c0%>~i7Mf+fc*vlzG@Nml)fqAC$ z~%HSDyY zQ^`v7!G!8Z2ewS~KJ$Lx>sUyBM?pQrc8omo?Z7)hM6Nu)vFf75Ikr1vEoi5y71%*2 z6>U|bD@TaNDhs;{!8rPQ;?Bn>XLf){pzEKgOWGvWiNGNNz)btlT_O>?tLN-BsE zjNAe(BmoV2(PreDYAY5yT;l8V6Dyn%hCX_W>IQ5E2ILNJ>WRcx6|$4*CE+8ydLuTx$D$C$L-wv59LfxXRM;;Bq60gnY)TvY8PC8G#UY=ys zgH)-gHjQmVJLa#y-2K@yo9r8ULXeL;2;T4GfT3O*j5)$L)f8vxN&QK6oHAA=Xv# zZuRh0h#>hc^jx_4Wvzl72QbDR`|>1AB1SeGABlG$niIA8gHHsIaTm8S{0D{ z3WJwJ4}bpjA=MV!=IHAm-VJ85QCW%EASrYV>{L{2EiIWWVF$#vRSfTObP?uv%)Dx^ zZsaN3-$Sqjd# zB!KncL3~mxoTnXmRJiqJLtB*DX&}c|h&R`&Tab^#>H=lq-iEM0YE<6~KvuwJ6DLNP zX^1`OY??vF1T{{fL+^RGyg@p}DyEwvv`&xcNfTpZVC4sn=-wp7ME|>7-NNbtAfrzP zRaKAv*~QnFk;XJ7Y{40^#z#aJ;z~?lD$qoA3+75CjmwuWryZ9I8;lvqnZ3FqgYz9Wa?hs>3S+cj9!{m$BtR3Q*cl; zt`F)v;AVC2lDC`?aH6 zNXi*8;t$W3Io&`Qlxvlp#fZ@BpZR&A=}g z!8yp+K!xMjO^<2Uy5urF*Ox>})^a+mTsdBTKUDBXZ)Y>Z?R2GP32}PhI~QJbh15 z!-x0pnYG%c!>s#897#~Ucu^Z49B&kK_Yqh9{}h2ALN%kP(~^wS+v-4mi1|5eXCNjp zYs(+c37K4mwGe}4n9+fT5}X-Zw)}(Jqk<$X9i9~qE3ws>KD!F__WwO2MPrOavK z5kN&Qr_nL6)WIyVvcyND#x-=0F>FV~QRF%Wo6e391A?I#M2Rb?$|j^)5d4{iS|q5<}?SazleF*~HV;mlIw|4jLJ_^{q)gzM;rpil!Y$1?BAHp}f{DbEB z@lZW+T>ap&w*(Iv8_mPdo>>JNM!`QP`1wElC=Cs{s0tL&@&@Hsamur}5VIzfWI`r_ z=F87dvb0{aCgJ4Ci%Z8rapbbmY!~hut5%z}@E_X+3#9`Fj8948DN&^WcetkRDkiT415 zhwPdNduzrVe5Nl9?#F0o@Cfdl$jr+61#boIUUqg|z8wK1jLrs1?B>U<$9@UW9afJy zE}nSQdwE^2aPF#p)qS1E!L<}$=m3BX&GqXqVZO*F(7#oozv0Ezjhi=b&X{^EK3-Wx zWfq1Y;E+Vy2qvVdkKW?E3W0$-Lh${o#SdlJ)b&*@-??+nEY5;s(WCCvWj4g<4=BpZ z(-ZKt0KhTo*^3v)j~!dFY}vFY*X6h>DA*7hXbD~t=%F)i`~p&dbA%0|pP%2nd7))a z=H}*Hfgm^h)*id>^hy@Q?;p8;y1+EB{7i(Xx9y!dNAH1WfY%&hpr8C^GYx3I!TDNG z-pL7OJ1OdNVJIw+dZjFNwz7K0_z{N3%c`oe5b~_X-`&geMzU}>Pxo>o>8>v+IN!=FhpQ%*@VSH3xXh^wzY349-p5B!ZdN1z<__`_~=a>A30#&-Rc zz>bK>NC;DuwsVs`y}a%`{A=RGR@fT}TK3ej9IR9v&Mq#nN!MTb#Wh{cv7lVrqD=bI zeKQ{m&JfBi!D$sW1j@vheul6>*`8m2QI=uc3 zn1zG)8kPazJeuUTf}ufs`{2Q*h5Sh^s(0$&3>p(gtM8-&|&D&s;LA zd8Ko`reiDSq!Slrddg7M`i7fuvh?e7M-Y>@)-cB4?!aU6z}#f)1#^6_6|bjbK=%Dw zkgAQ2!9g|JP<02aC4mHQt=U@h9sg9Ko{)`XVr<}v#Ri5rjmX`*@1HH6uOSCfv(0C( z>1)VkoUiLLtNG;Q=kki|rbpUW9US$yYHA-ZC$&yCQ@Vd6L`g=LR*M#0A_D?B5&sXN zS+=))7NuELyXX*Vy?F6uzaOmwwRP~ZJ+qj4QQ&zIWwZVY&s&hUVS<^F5oK|X(uO*$ zz6a;c8-VQw#=a18FrbHc0h9A^bhN#;BAebHZ;B(25bj4RO}|WvFo^8Hu)E6oUV8Dw zN5VTee)zD?<>@+1Ox4w)iyC0qD=C(I?p!0B8O*R-yr2}o3}GCK4=dM1Rr!7d<$L$O z|M-!+9>)o8#f(W(YDF+n2@iDBgQ?29pj@TE4T{@^s}l1=S_fTZLTUy zk*%eGdohI!5|SI={YD*m#HhT+^&fL{>Yu2IXp}nxX751O@Gte|hkCxB5ZVMh%#f9j z)XJ;JeQP_`O4zy<)aPj(FjeO|>prf#chd-(Ar+PX94^6m3jh#?EOCD9ZzhoxJn zY*Nnq;w2l-u9DS00o#NH&nrN$07Jof(}-CzqWNH*C1_y&BE%T z3xsm8cb&b$dYw2-M{+flP1lZDcpP;OS{BI|4%4r`Ij}Bp#9_lvnpD#GmHh^16m!Nv zeJ)v%z{Fd(I$0OUx|zv^Z0W*HYs8Jw7|DP9`0(*#1Gl+pG2EFA^A6-}IP&eklSCK#a&D z!PEpVqjTk$g5wHIuo~QMtOqWUGp0i=K+&K+bIO#<=gx^=|G-?9Aq<6XgO^U-*I(!o#>+}zXh2jQ7m8@A4l0nWQA@`S5jjiHAt!XV zewZo47{oVBb>n8Z!N=V9sW&KZH)*wNc5qrY4PRPo>XgL;3G+a-K;KjyK znv$&>RM~0s<~`=~!siAz+%Q$oiqYM^OJzC~@dXALr+D!kx$^p+dI8CCDJt~cDQC@( zF@c5TiM=Jx;#lYP7@kL!{UyJjXE8T93~}cE{RLX|wpex%3;k_4Ybo=7|Fv~ zpxeU=-PX328&G`x$9RL~IQh#;kfcoS$$`M%K!F6$0wiNMF|eh7q?N{Q%ii^GunOnA zMl3uB9=P~9*eZ2T-CsVFkNzY}bQ?RIAwSP&UWC$z)>fQ+5nQhM)Rw3~QWC|U+MjP2 zo?;_NjVKUJl9B{Mf{Y9|9@rI)<@!A^~dwXZT`c(4h5pR-ngdUL+4v$qkn%9^I z<_i`OzR)9yQgMGlwsuJ)Z8Z@O)|&U-H*MYwq+$n}Ni)b~3kT{4j%Y_veKEYJ{vR>J zL*nvzlm|8GhQ)lVBS+>590)I0*H*4*KuGq$Xr^5wMv!=ibD73SZx0WqP=f|Fxasj^ z$uRQw&#~5o6Oa2LF6DeH))FNL+l-wnDb@gMfF_G;7$-MFRR)?V6(9LO0jSU|CzmM< z8B&ox?x4{n-KkRtbyj2W0t`kd{14{Ps8EcK#+l+0uAW)FnqH@-MtR^s)JL>9+{cCI%GEm5XU_D` zlkwhlQ=W;6p(;u_JZruAylg^VHQSblMXk*9BJOne#`GSd5GO-tY)`-?vc(oJ%zAK! z#?qPk9@I~0%u@ZPj;Q|!Q{|nMgd}m!N|>!)Rsp?-s5~mcFjIWMh=;sNDMSC5&K<#> z8RcD8UJkbg7k6S3qRq%8$hR~6JkU7xvlv*WSu=##Az&?MeDlg3UmlF13x>ybLVKfJaDL+A^KxN*#)*=o4xzw23}+^K9m}yN zW_bQJ)rcHqvHZzC1dfh~E_R+KbTj?qch&+j3pOeRdM%5F@w87H^kkIxCKzEUNU%6m64 zuza}MCV@Eq*8T0fcif6p2sBr`V$&1gZBiuu5H~9?ft8q)8j=qVqh{nSNfM#CeE+4c-Tfu=lAJ%GxPY-1R2l zKBX1TQ{XP?zeinHcX^T}SG`HG9JG-(A5J>7wFO$RAp4on>YiB)6H4OdvEudCP1@6@ z5#6c~2G1PO53N|C18J!gNIE)Jn(}zbvYoB#=+7n3<=`F5u}u90(`mDd3k%>09SCm7 zdyHW%VFYKJzFbunHk-8?1jM6#jG`ruJj!va=aegVz6MK~d@YJ0ygm`b%4R<3u};_O zV!7pZeUE$f>Bs{|*UY$rddVx7crCBnd~nvmoj5rey~^Ww{h_00fM8BM!pXWfffxwz z@gz$wH9VJbvei=p6wSBG`+fwMJqlrpT1@K&EMn8_Gq-Qgf`te=NqF4ZvzRggtX|Jo@r9VVWEKL#!dl$RI7`tre{>E?49?_`5Ldfc>T~J zL-M`eaA4yON663J+^&F~D_0KZ4xX`btbgE;6V)x>f!DVaR|~{UwYu^4q~tIm8%}Y*eF|ISEzWmuV$G*Ld(YATf)*OzF zy?^>@kiq}q0=)eKF_(kNa%|m@w{1Q;arioWd3dmU?sqv%IfmwH!I^^(sIk^tKUq9> zuyp8GwlnZP&xJDvW(}-!Rs}aI>(DHfE0BJ4!o-OT9Ef>78drGj>Q&GmDBBzvw&rrIf-(?V0`RCD^ZiWZ6 zAknoT8Ml_IT{XaoG zXc`5$-KJ3EBs&ElnB^;0U@L*O2~`nC^)YkXt4@m?99~ld3fc$0RPL)ua$(oGbwGEx z^Qb~gSn6gP($-a{Uu}JZQC1O9?nf6k0JzIHB#*~>++^WaBFk=V4O!aXEnn7~35}BU zx$NxWqa%sLd6tz?+TfmL*-x~?M=#0CE3x{<6WL4yu-@9fuS0G8ykyma zFf$F5GqTQ!YCn5Tdj(VNgNL!bwu?hmi&yFEz#%b}O?wvYGfrZ7I<`7BJw5cM`869R zS9YE<7U71fe2uq)))%_rs+hUSQgN4hLJR~M88lJqUfDMGAufe3I-IOP(TDENP39x8 zj0+B^s;i6Kv!Qz5W2{vHN~X0A=Q|8Gkd?4DX&+m>3a*EhGzL$x$XbP;lj?A_JcAhh z%%LYfFfF7Cgzj!M^*##RRTHt|yDj!`!8FB%=H`-bsyJ}KT^65L9khljdXI6HGE)#J z;93b(#5@O1sd0y>)1ban4B@`OMDM_X19ZsSvR*Dqp4<1vB=^R9h@So@{2_he@AFF; zmQwwLx;VNs-J^Ww7)`BE2*E2ZxyGCjv456FF?*#>^ZO(5>%b@0%Ufxqbea>=FV8f3c z{E+>kI)EJ>^k@Js<74JVlQ_ddtvLYt*-nF6^@}dt;{g-s3k)Gt@rN*Gb-jhxx$+Js%H;=bzX? zfQHD9L!U}(U%zHPsyt+fCwe)YooWBV=ZYqcF_RAT4(k<~?_CXY`VPQBDGsunlBYNz()|5c~ zAhW)vrtQ8thN=|O>d`5{JmbbWgSO(NN74ar6cHnmyhB6&do0xk)yqR=8iQLI}9UU)tKSJ%_~DrOM6# zc=@NO=}lUP{v;blLQWj;#5idwhRFSUU3XnLdeBc*e8?L5KOR91zWDrZJpxg_u=WUR z114mY#VO8|rHqog+$3cXKsUcQ9<^o;b5=F{j`)=^3Z?k2+CxPRxS-Qe$*v7t6#BrC zuoX`D`|J9I$zZP1z0**--|1NL*wQQgnyW4`(XRTr=gv#Qd1S1HN8MCCv;aZua)}v5 zckfCD=k$0JGIb`^WCKN^srvjgi|?Oh=8c^_C#=%2+ghqGiV%qoJwq`E0N*`}i|C=F zZ_N0_`{8C93{Y?-qv++%VUSa$fcJK7ws(5IUDSdzRCLN>Yw0}zSh!CFQRdO9cjQhM zH5knpYPKeD?#Mn9adZKF1%iLw&_D^W+c?QMX;;7gVWvSdCgr}`NzDUB3LFDX`oz>p zlO|1`ylCPPDoD&0*>;cPbknb1MLr-?-L2vzi|{eOIS~IUA&7w}844^U0R8u5i0sPH zGqYfF$1EPg{H%mmIIAqM=Zq3kbGK{>oe@om52r)nG@T-FG#5MKDH?jBebUokvD%== z+wE4#i~mtFlHtW2d8NoAefKvKr_~iD#kd0;E;W1U4=#hm2SN;~FRR=#3zCUslW*0C zy$25LJ~PO1^v|yD+O`!`wAo3|{{|?dUA`MHt{GCg2HSN+FM1oFoaUJsMMKgl{ooPx zoJvpC<>QYIRDf{5-!u~AxW~A6Bhey$oY?6pAKd^#e3 zDYOBm+QPbvgn$4;=hl#8=B^tz_TF<3osGm7dVXtjn97kT`8+*SP7MaFKszuoEoU@zsBn#+w^X(+asOv3v_AxVZS{7;{ znt|->>~rU6M~u!~t8n(zQvxl~XU@VOBX|w?{1*P8!xMu0`{lkGp{y*mJsU&?nlV!e zEvXaSQd(8R<>ZV<$BdHeC(*pi(3LbwI@0nFw78DFc+WMipFV!<&ydN-05=}(Kwb_& z5`jKOm!?jeCXhQ*`m1MB8BkWRa6fp+lbIG00;VzUkjNJ@TvcCWjKpvIQ^wrn4{2*| zMSuw$#1QqZJJ8FR>|=qVO(QLLg!CG4p{Twl=#&@)8~OeAa}U@n>^_)dJ1JHU2;HUj zR@U|FR>@^IYFw$=j~T|t#{;C&t_06{N%zIEy0c~8PTWbzH|7gnpY-&Q)L)5lOBOBa zJ%2FMpMN{lzVsT^E5mfx{K@74SU$34d~+z%Pp?!x3plR2h&j|cM@Pf!Vj8D#1-i2e z&(4>CEIGP%+KQEFE5#o~n{0O3x^;4hJ&#Et1lpLa1cL#7#CNRrm6t9zo}=D8$J?`O zXN$kzs`B>kKROB-!>e~~KJduyrBVI>+s{Em2Q#^Us&f2z{FkM#EIco3M;zK{772|bX1cg0 z_}d12-|k=gsj}&p@2qvm*!R*rCk_pthuzaM;6K9az*6(GNRYv`CogR>$)96G8sEM} z6x?T=2yoZf^V#}BHZ;AP9Zj$nceT9N?cny zj(89CZ!0aYEMR=x<0DWt*)VoNdS!6Xo(XFily2L0B{w(MI7#7-*!`>n|HBaI$=^N4 zp4I3uWRY*}?eLY3rWa`FJv?hE`T5Hi^XO`Glw?k>8n9xjS?U`?uK~Po-7%`y|agXr#hA86=j>J zL?HM3m<;O+n3G)S<2fVVT66BYV2L`=-2Pxagb-3OAP|(7SkQ< z+2K46W#FcirKD}P`_0Nyf={Hn8=01PpFX?hiWqH>4jrVT0u;ogYr2vJ$mG5|uw_7b zoV1y_I4nWQ6k5o0z1?$WB@l^9_=ttYyRX0QyTTc|WMDc%L0tyQ1l49kkZX9Xsd`db z?1>XR`KG3(vgM&4FJ)%x%B6tE+hzp6gF(mG6!d{#5JteV!9j!b^|+8i3-TxSS3Fsl zSwCNA;}eb2)VvN!DJh0c9MzYqTVTI@YHn5vkrLuDR@l+8)fvN$gA4Kd=g&TU`@(}s zj-V|m3LlPV6DJU^bX)&Sw9Zf^RTbShRlzHzf^wc&;bw`mkNdn0Gxq_yE^?a z2*rQ(nhiY!-B?`lGaf5ZTu{MW`Q7C zoTvBIjIXabvlzRao1gj}P@LvWLr71QJt$KQ{VyAip#q$N!+)gbjgW8;>Mzn_seM~% zmBr4Tf4C)M9xPqF*g;_5jvTA)WP8b4^Ra~C!0JbjQmDJ|X(tW4vhj z@}b0m4IK(*tUY2x0(YvLNm*X(f-_?$0`6;IZ%GOIy?Cpm|)0EnWlI!>iMvlzQlm?KTu=!y+_$YawN!^ zqGJDNyml3SB=xPfqLjij@Oh-l2rv~o1MPTUx=>13E@Q{$d68e0zhf;t(Ucd{{k~W@ zI+|~00E%wKZcW&l;a<<`N*p%7s;x!hy~jcVmXb{xp7sLg&`JnPZV`-x9v`KpNmRk3 z4e$%luUbFB1RhUhq>N9o)7G0ZuvHS>>{~*XiCW)-LO~H*V8Oobaq=)TvDX9c0m1po zWSA%GqN6{0H0+8rn`{3jCNjH)!U4z}Bxwt!3 zR#XHghqv_gHO&JjNbIb0jh}s?PyQB@q2uwj)zXsPYCldr+8!+~m^w{cd+=is zP5sZo3}~;+-v^QCRy-^AZ2xs_7J723+;l2cm522grqae0eiJr61=`!JP%?%7w7+Z{HFt<|mf{ zps`0fySh5$7whZmcXf54z|3wLgDDaMO0Z1|v^jJ7Mi!Z@9=<6L`oV?SdD%E?SxW?e z-CZ_Da!^T}Zi$n&gXBM{6?dfj-x_Jk`+z26IOEPKg$tH1CC1LW`AptPl|P4Ql)EqJ z+wz_6I49n`d7RvBe_0h3=}dG8yY(Ey*HgZb0Y?9RJX34A#y~adFPfy|DIAlo&hE^rp zWejL`M`f*~1c^+6O1on2fs-K8ReM2JdlK|0Gi7WB?%QJaP5Rv(;T51tOWOMP2{Y#? zTWE~dH|pnD+Gd=-GYt*^vn2xqC9z@HtofHuzMrP0MN46{{py+-CxLhny|%iIhV$I7 zEUg$)IAyvpa8bDhAf;c%v;ZrfH99lV#^0JzMxw|M;<-oE$!n znUK&4e5tD#4ik9XA$;AKOhAE&qz~-#ovy|kX4&&z!*a8-w$r1ak=zpY(oSn{;cGxW zdus>~|Kdh<=JaU+zbX}ZK|_}n&^1GG1uArY#I{2rkazi3TWfn^&P&Bf-)`0Q3!AVW0|Yv5au^E?--)P~DOm46aNzDLp3F`#70Lmv zL~gUA@LD)iTPS+B_h#3HU(rS=^}pMc16{EcKxw%$H{pwIju1=7|1 z;^H|QWHM#1PPdd64PJJxy#AopvB%i9w9mZ1a!XEMBPRxR4tFJ*_bBhh^?ZisI1Rs` z;9&8S1t4c_lOnQHl9KYzJH-dVjoY+o>M?Wa=x~4q@tQQ?=q6L^9S(DT39gx+26i`+ zD<5RvyLWGbQxh6IOaFtGAvnm;_Hy^lX5KS#qHA5%-x#_x89Hz(_)ERC&-U#Yhf}AZTQSCKb0u}qZ_ItPRr8v&cc3Nb0)NXH7rs*8DY0a87v1PR5963~e z&y0+dWZ$lJ9C2nb6~%yra!w6?2O!GUZA-O?>ajG2p#Xpcut#Q+iw?FnTd}&K((}{&>=|_E45tjj-LiP<>6J~0C|N?W3m7pI z;f!VpRC@NGPE5u|er&$c7itL!c8avxH7YmXTEyQPG;EmE_|Mh94^Lb4g=AT_l2hG` zdpDn@uX*)Jm3}v6u6@?iEfYF%=wS?qZr0)I`nu`ZRbggBMH?hm_pC#H2R57#DGHa6c=VjDp_*#8|9egUk zqPlv&yf&5zD&X4Jp1b^9RuKPe{gwGbB=J4w(HAa*rbHH%H??zUqdb~2o zd{h4(0H>SV&JJ~7Kh!ASs7fIq4d;DD@%nq$J*M6hbAsAn)mxz zF2OR+`I=(3uBmU^>q0=Oqmx%^%4fWydM3FBX8SSo^_((`77ctSr=+nc%=AfhHF53z zepKNq4X@Jh!o!+{17mw%GHw6zg%KOGW$U=LOK5)co$h*~agx<7N~vY};bHW_&4&X& z7A)4S-WXEzzp+uJaj*t-(%&agP0S?M8pvm7c!E&FwRD$|IU9L|&|)eE_GS=TSKR zJa}_^q1qAAn?bA|o_xf_*I2uOHeFg?==)GjjGR^Jq77gnHLkO9FYT;=DF1u%1zhDJ zh)^QA2}RP170>gw`4B@e*&BPGmmjs68dgxLy^A?G_o!U z3gz3zM!0V`4zm0>{dUlHBdHK<^s-jf;+wAK9@R!e8($IQ{`%Z!J{H-zd{FueP&Bzo z4jRWz)s5ctp7D*^KKffBb{+_r5Y$ZWl)k+o_Xo_G(zGg^DDNQIVFvKyh3f>aDRW8u5l;f@>5OVfbAa6@O_f5CnKMaz)2wlxyGv+~t z`%*!epfblXW5uPX#-g%Uce<>wx?mk069c_iU=Uha@uE25B8xCqV-!iH&WdLOh3#tZ zp$k-H^UgCXfFz}5%Hyn2blI`vmQ9+glT+1ge|_y*uB25*GNSk&kIskroM$j0p=8UZ zO+c(@U{EpvMF_VkFAlrKSHjG939gE zy>ycME%(oLMg}VxTtmqgJDG?5fZ$@iv{g#XBzIikqkP9HbnrNU)!+6lrmkefFF7O{wX|)$eaUeTrN#pmSl~ z6Va{CluJ=X{@BiQRs|0oAuC&o&F~Rb$p!*sB#-7T9<(5v0fgHEN)m+zrK#)9jf?_2 zf@*Si?sRtk2;$F8U+)@xZU6#F4Yj!ei?V{gOdEW0pyJsaC2xP)I|gUiSE(sM2Y-{1 z6#Nnx&tl=ime$s}o&$}Kz=Op9P?(P(usR~XDgvMZQd^l5@v?%e%AK1MBPVb}U}A>A zh`#;(t5d(9K7Sr|b9R{NP4prwRt)1$KFB~G|3H(vG+O67L#g>wD@e<+8P=tE=n13xB_o6MO(Cm(fsJepLDS9NzsYvC!9(D6uKv zkyQwm7S}#iL*h6vEv~QKCLQp4EdS3L3IIZvHnY-^RUWOP9(N|YHIQ$K`dav zO38oVd~>q5PdR!L>WN?u`S~PLs5ILgMNyZdGVYr9I*cbCId|qv4QKAOX%#gAlOao; zKfjSTsRjlBj(J@B7Cql(e{=eEg(|;_}u#YQ>Bq_p_tzC`frcEJAi^|BPm6EMx zObf~q*|Su_q>{>(X3(fK5hBY-G!)eot;&*=EJcKPzW2O%UOs=p!DUDtV@ z$MHLU%R_$!v2$aBmp;4h5ZcguV*DXq_yY&Nki@P+(lKE>X0f`{aeL#$m|gNdr8ro* z@dT^wmdcMyn|wo|8lrF&V%YqRbD>CDwf!ib;?^^1-12`@b-`c zXM^`5Dk=&x?yTT15;RZNeGPSa>>@YDypp|#sV*>n42}{xc!&pMa}ASY4NXlqGm(HV zZHtXJF}eJRg!=FNk%zUJqOgtFJ%L#>`GL5dhN-@u;$mPb`9!sv1_fN^1m;Uq9)l=@ z3^Zm|ulo$rZFOaB-9DQb^PZ#ojWsLJcrZmzPmeJBvWD)jUsd#+-<(PkI5(^~;x*NVzW$570fXCZuQ<*>&*n9R zeXnhV=%XjL8~vAsFP-zDAu+}#*LC@ojcDR|L6i+VEq-5z*<_-5@YayU`d!IC&9Jn! zwFMcy69a|aHjto&n)EHAPd0k2JXUsviP0SSshT5$0`Bizxnf12$#7+lyjLnpN>ba7 zBS(z71&oM+PBmBJ%7Az3N_+DOGYYXzd>l?YeRjc;FNN9J3VX&V&L`VgSjo{CX{6hQ z^>7e~*^T>U+{P80TdG*R8wIA z#;)=k-PKzV1G0<}-<)2p(+^w&?NBHaUzdjbvUul>S66=xFdUtk5cibMuHBGX-LdX8~kUuH_@gdf+QRMdj=i<{=TQqL)ljS2vyV z8y_}NDuhFBQU50skr^K|hJEPwa&hV8uVs%9eQ|GHe_tP?dul_N7koh>#sv%@BBelB z?4bd@o9v+wD%*=C825G#W@TpI`}+G!*elExQ^!b4(=`bdOP)Vek7Tg)@Q5^)VoNXHc-y$6pYw}_pom*$Z6>0N(hC-$77s}HG4_R=@rRL zlIdmyza`}k%afUSBE-grDwYnO@JDoqfGRM8(Q*N}q^|$K%vz%RB9xx@jnKx*tpfKa z*L<98`53$hPB)cZ3y%F>yA|tk3WDBBAtfBv(D1{ZvAhA;@jz9swPSAJxDNzjQGj$} zf0Uem2K#4hF}b<$#8DKPofRadr?>J~mT1f~IGE^nBG)fmf*JGIukN{9rImwO7^TnV zcr2O<DT_A~s3{{Ok}$1HB<^x2d`UV0I@%#rN^NaN^fD;8cue@R$$xscq#o@M{CDai z`|El@0#H*JF>^N$UjAoDSnk3M#*+Y7j_;=bw3R?4;6mWnF{N5eKzNoF1qkU%8JmjS zC+yj(m|t)6y)CbuIlL?@>KUOEO<)b%S8-Iu~Pr=4uB}~7(P%8XRal=|}A1{{ez)VJ^b#+6yEp8VIw6-7q z8B+0?GdFR)H~Sb+1vxmW?Zi6cl`F+bO_mJid<2u#Klt7P832Vslj|X)2L=5ZuxCtn z;6{R(wtc4ZfV!Mh;<`gEkEW-s_rj(g`L3#J{L)$(~+g$ATjHfB61^P%# zcE^0TI5KJ<-2^uibcP+@KxMyR+3~!d5CRC`7NW9dhuebXwr0PlXwv%G!ob78K=5qJ z?*cSk5JuwT0G{9+>b$xNYCutO0BtG}ke&-&03VMp4o8+vg_i=unS* zL8IDnJM`c@uO&bNxR?dIPCZziw*Etv(a_6(|Go3p8QK7-MzzAoaNXi4%V$Bw)ZnN0>Mvx$PV8+_%0yYWE+! zq#4@07FyR~eLvxJ7f=gqb*#w}Sb+c)k4i-49JM8bPo6!SDijE;CKQK_iR~@n!i5XK ziZT)*wtwnmdO|<~R)8o5CXE$KzRug|@e?OnG2B#AI?Q@Q*84@nRfB3NLf+~GhZBr~KakulCi1EO0#?q-sAm?t|FQ|t_+LOFv>*x~Ku32;5;E*eK9o`geV2JZOlM-50 zG+rM+eY(wn+}Ef4#amu>#YRRccqqId{!^@Oll#)-?->;3Y?LJ0Ah~v+SS-1j?p!_z zG8~i9AtD+kRjx!7r1Ju!7T_tqZelIGvr@53YUF_<5OTpB@0XROWM&@Ji?hLE=hCX^ z#Is)C``k=d`ygWw%6Qz{U;EH53;8j%8A;kV7Q@joPa*SRvA%vk8%IS|6$X<{U_u?6 zd?H_hqT1LjwvhHjYgGHh-NOTv<514<>2^`XZ}fiqhF>+r;qoTe+cw*+tRyGNbqr8B zYRE_caAMBb1<-8L1y2;Ar}Fr2wVAddsni4z`RuO?1qxClO%Oix_hWB>niPzZ6BS(Q zYgUa-9$gih1uPjF+v_$kA+fr0GexLRb7bzKu6kp0I?XXzIDSL@b?E(;=7Gy;YiSMQ zhzH>f-M0|Yj5F`S?~y(&GdCCKk0D{c?3F8QA|S|9B06@$s0^M&l~_g)D+J8Tk6SQ) zwmz|<;olXH1CksYdFdWJcz}IuroV5`)u7=bUi0w93mEZ$H*#$DZ7_|2wgvS+zGjnl zHVrN7E(?G{kY%-P{rXHMos9Cu75d$4dCMU=2<2Ic(Y@dqoZ(G$)uBSJqB;3U|CO(NtF&`S{5evnRKt1-jEMO1x+pua{3>y7FD^eVe$iH#7KU;VY|-BY(r$-qB!6BJEH{C#aAUVJB;|N(kd1; zvyb4Cr{%hJECALoMnP^kYx8^yWW9Vkd2uk_dcR|&B2zWI7pmh zdot3x&U#8Iiqd>i(DvW%ekyeCtB4fUF6gyKgyZZiFfifLgdWmwBNqV0Vblk)0fMal zN#B_oF%>~UK|*H}QhO{dZ%}X?J0|)2I&R_v4y_N}eU$jZFi={-U!SJu?wB>eo#44w zR#c$-R;x7pTt2l!T=AW)j(yCjQ;he7Cft#W`%QAu?B@+1k3*z@p+)8gD4z18<=#j~j|9@x-UR!$vn?zKQ0Jx$rHalf|IRj)qF;PUa6>g=usi}X}wBx0#O-+l+x1-PGQ=mA5iP)~# zH+Ld|BAPK32&;+IEi4=|UVdcBNc}tEkk{oktqx+^jzLE8xyK}S#z2XnR5yw~`s3Te>Jb4KX>shr)$jx-S|V|zO!gNRYvP%{m+;MVC&ejgQ3Nsbd08!$gyDkFI( z2It&IcgijL+sv%2V#h|NTcMH91meiG-Eap%Ng^G}a0{@3_94f+XJ7Erag=&862?pY zo%LhQLWUn-ksNS&%d%x+HqZ?yAY~5V{3dN~4P6<2G{Uu8ZXX#0ySU)TsBmuK=o`I4U;wQ0Rs*>!7&#dqF>e54Irxfa5(f z4Ei<&K;l3TEr^Mc$kpK^gO;evA&oJBRKUy=sjvSOL_}iuu!Oc*w8=| zV0WEJc!CR{;*db+Rx#&O z$(I-$9E9FKb-%#wEN2z75laFpCrs!DKq0vR;yV0g_nPI=ljtE5XmT19PhkOTY7r4#)FCqytX8R?b$}n?@Q;*7t#hP z#c6ffzuC62A>pcTLQ{F3^j_a&x_IHHuC$-m0AZs1I5OFwb#{@p$YWdXky`4;jT`AQ z@rj@nf|G9jy`<+cs@hVR1rE6k+^V(8E4*c%90HJ zo9y$jgeAMl9x>7VS7#AXpW1j%=FBr$IqLNy#YpOm5GUXv!s~(~onV$|{_ws;Ui)3m z+=)NILqrk`Wt4gw_!!ONsYtxs_K+qdTbYYL05Ve{S_g(f$Os=4U`%>=(gv}n8RSZQ zQs@}qP!1|q3>;=%XB+p8Yd%@xPCT4WeilhqLsc@&OeX3 z<)ZB-OUo~;5ISvW$Sn4CUPO1nLj>w&%(&gs5&)dy6li{>V#rd}M`-~GdF{1dO94oI z=yP~%0!5TkBwKRrRCE#ZZ1?ZizVHOi-TC`>2U3?!5vG9f`~-huO%gV$D1Qs-)Y!Mo zn>RsDj>Go(bE_-mH(cEjQ?q|{eECumE-z>ECL`4MAQL4ng}s@c0%tZmtLvOd1(VX>MrJ1_ z+ET}X7iCD$A+1@vHpN1{!z{o{H*@oE8x|@(K&O?5=V7CP60_l%n26q*1^xb+>_>&x zZC8Hl%pinA(IP{v>%suZ)>z=D^!?U6#x>HzM?$m8sb z42LD&&6IsPMPT}tx%34O&VA1rSk?dXKot+JXp1Oa1nBDK?+jFqmfA~spxa`n=-pvF ze*r+A*^EdP!-+L28Vz*ERNsgN)#uhQTjtq>F6sbah8OT{bFp1 zG}|N4HUFe_ut>g^o_?fd6F@y}6f2#L^LQ!X_E|3;I7@ZUd?-EDZpxV%NzZoWOs%c4 z@!pGY8t1>fJbfLV>mcM)rd%YJgGwnXjS(J(WQcC&pWk~YY@Daw6GmCx<;VDXPo76a-Z2+Fe@?gbuNi)6o(Y8t>AJnrtORAYICnpD)r<16{wXqLesOeBlTnB?9-57pNF7usctv6RGIUK z%&Mh3lvkHAv6>nwBNlK#YA_b?iN>ow!N=(>SnFn+Wq1oDpjOWw!dhhf&;%WZyf|8rC;8baXm-BVqimRjbu9j==v@ zZ`x?4DT3C>d+XI>sBrWQ8OAJ0h%U7!Z&1N!MC7pr&_GaI%7h#G^v&IUII7#fITK-z zyjc8PP)wd@|ESa(4Shh4y&_BICSS9SZx$0aTw(K#|Gbf(Pn=$W0~f;1;rI(Y9wn={ zyYaMS3p5*dy*bF-Af{rubxylR!OGG+4p!F1NuBVjq{ZNsw9s=MA%7@c=|{0m@;r0N z+VkCAUB=EojDGiiZ408shJl_J+t`);~!?;L_3oV9yL)(VoR>Y9gg$W}iN`#53p2lI19> zFWw&QGxqm&h=nK+(7zs9uuE5}c(|~$M9u}&c*!WV1X}=R6a4CGrvU$yXM6BDVuF0* zMs!s(xH6^j^9{{{3!Q)y&`;3xU*8-){gKSZE{~&crHIhHe_^2|#jka1i?rf9&vwne zksrNu{K`XKO~2q&_sTl;iBpu8nqz=b*PmDQ-u)Gl_@Fs}6sx@73kLmkMjGw;Ru@2; zl(&zh-@2TdeE%Y~VbVwZUGz8qeVurp$%Qm9y~z8~ti!Oz%k#1TnWz$ms0FU3223O}8XQ#|QX}$@PbGaSb%h=1e z$FMLO52eph%fmy&na=nhJ-#LaqU+>O@Ai50CD}pTsIGRt_mIgt`EyMtO>#%&q|>-u z{O_l5rz+}ozc*~#@j{ZQ3A&GRy;e9{H`agz$4ckiMt?1#7iE%la+#TP7`+fFc!U(V2A|0|b)$qpS;{DM}R znua+{YWz9vP)A|ok{ykVmLLDDrWzO#qW`A+C-_w^hqS#Z##AQoDN;LY8Z`LSW{Iy9 z!&*jzGH)`b(l2PgbUC~-pZWYjJ}l6o@1F7xm-h?1nKr$_C>_%|<5JXcx#{#;AMDgI z=5De3R|~ZSY^*-LuCDT|-GE{2R;`{he!*(nvOczm-|-fYxr>=gZiDy!T{`04XNz0C zLPW&+L2K&T#$0{AdaPJ@toZP&Rcj48kLVY4dE^-~VsGnx4N7TUAl)YC-l05D#R-$s6;kLXx~1NUtC*gc2~}t##i4Iw1_Ec10SAz0|TvHP9CVYG~T4 z(x&1}v^!B@)AHq|npMTYUq*NoX$B#z#TL5#$2z~E?@Wv@7W&@eF;)!t%UVuWQEd5jfwz8k{%me$0}BZ;^|Y z6QZMO1qX!RsA$YsIkMsNh=GR<%7eBj-#|Jns(SWyVxu#5Yv4<1t)nLTKQ%NWK8~pjzbs=#u*0MQUoS5&Ca`2Kr=`L6Qt57W5$SnSt)=Dr z<-5%uCnq3$*UWtek`gzu#bBn~{?R>e8)jfPpiaH`&yTC?F?3P}NSXP}ZZB{=z;=VN>$MjAyOZHb05mUV2nrEgWkoEcV>GB{whBt;&0N zq}O2HB)`kHLwh&RC_5pZ+p z8)2v9djuO(xIFc5y_oY=@>Ou~M{eC*Q#vS&{jtjy{y3=;@|2nw?-?gCAUK+9g$u?w?k%wuUT^ziKQVAm0N;zS;P<_bW)Yb|{if&W^DC@XGxA&39QzY$i@>09L}g z(5FdGET1PI{%=YLF){BP9LGYJ;(tVQjuQs+E=UU$z4)&%8fuN7Y`8615B|-LRUnT7 zPZQzvQY-U+1QO%%aDK9t!}FGv`mYccK$7D^-e>9mqbv3+wWpkeo&eMb`~O5rW6MN5 z6Lk8oMsYz;lMaYiHh%vn(g|CpQ>gy@e_Au)VwIxl82bL7$a!p;3xq|rB>$_mI389h zo}g5N(El}3?K93n1clany8qQ03cxC*jw4n=`2P&?f58xY7cxz^CqtP-qRnOZFD>pF zgDIqE^Iiwuo!j;DT)m*utIA|gMW}~bntla4G46wVZPR!&pT7%$%*0V`% zV?~~$V(K*EIl^|qZ(tvqeQ>btH~dZ)fd;TW>pnQdW?QDy<=sHB?smWE!hk{5U)BEr zHTW+Cna!pg{!0+VwsuM0K3mBVN{1OxK4V`!mSsW{Oq6B|4_vA6k5bl$8_cRs%`0AVSI+^GJ0m@H23~i zt;^gl+k;_4Uh@0@6bS(lml+A0Mql*Fw7J3RO3lk}&(?01?=eZPjBwc*@)s$OUQaG! zF6vzr?{@SmnMu`${>|87uLdnQnX|Y@BV8&2&P!$Lo0kqUGM8^R`BrlRG1sqG5xiXc z&feWD(#WQnx?k`PZA z?CtHAlI2cK3)bH7E1Zn37HMQjJB18pE)OCFiR<~v#=N|@t>%{|Ne zkEb!lE!J)(-sCkQQ0SmZc!IeVSkEBU(Sdh6bp>B1h9C%Yl$ zbBFcI0dE#AKPgkbx47FimZ|jH5Z3;=AkLcm#JW_kUert49!HiN2eF4fEs7s#v64b{W=DToz5lT@*NV(+8tf9?8z>P;1R z)t#v>zee+hKRYjhdkgF0i9i~Cch`>Fkgb@+%Tf3~4g&c&Q(w#XA;RpzU*ajf#o zFU(8t=EefR6&sipA|-*pbU2Km8l)99?0%?DgDDAhOOKy?_cQfv9=lgMV!VW=2YMeT zlQVK}|MC+kBkjtE1JF~s46IJEAIwVsXp6PF7gx+QtcP5wE1o18okjGDuL-|x*xGxG zNC>=HSWXGi?MQY#_$dJ9J=GR%v`wpEbYB>eS#AMbn0#KPZD#@VLLk%6=M?ZzJ<4r& zY5nrWoepx;x#-^|5eEU~?-L@u8oJqjS$B)3@(z{oSz>(u_-vI+LE;|2TCCxTNm#z> zlZiOA?<{vbg5}-q61F>LkGj%cxU5d+Xu9)K2ItSVhAR%=N%BMGcGu(^D%>Oy9y zAG!1|g64FpX96B3b|oBj$LA_u59&ETdh0oB6}gE;i}ES9i+o$&YnK*{)J}BmQNN@l z7cMtOWI7>U&mAUx0#FF^Ius+ak-i ztNh#iu1|gz*h}gKk6y>nDz3fF84JXm5(ret z=4K3%IbA;~p?~CL)3+U#`g%vNS4mN_YjG!jq3MuQEKOT4B;}B^@MLb;TsVZMIy#MD zy@NBCr_yrQQ_dQ9}e_*l~H{V|wa&roxJUz&oxz_y|q_6uHIg1$$f(BsVIeG8odp6?2wQe{_EPSNy_-yyBx2+t}vKccTb_Bfl*@HC}dYUi4VKI5<3| zy_?#T)XHs|uU78QF`Tb>jVFha2jB zk8K#b!VX0yJc7h)eQOPHm?(Vn5MtV`7l@u3vU{kI&6%!JNcGXDoSUn{Tx&+9s(B@Z z?AM5RRLPNB?4CAlc?W0Ew+o5$mnIdBge>Bs6amuZaTOLcp?2i zS(;Eg7CoA$jMCpmkDgTZ^DA8sK37=~P7)_7zW*9Vv7;x(8no3AesDaP;Q1TadW_1o zS;Bg$s3xr92x!W@F68SA{@g)bKZkVlvkipQgl|ciBNjgleIO~UkS6f#y-fNe^}N$O zFM~{uNuz-F2Ofdtc?qb;3h{Dw6+eKkt(HmU88`09>r=XIw_ZL`VSmgLn3rs8KBnHI z?A>QqE6po}ugL5h3G*&gCh1zKPb?$pqG%Vt8->L!J=I*$i``19n0RYd({#zX4@{je z3V^O4TpsSwz0$)E8&Bm9Y7I_nOBBj$r!A=2)fT@DzIFogWc|>^+bRoMhtiUCLHyGi zRJ2le4u1k4ogZJ+x3}`LL*Hvt(*#Ec7(GHuw^x*&OwN%9(sPjWkbGc53xT2U72Use zrm&x%lP`^U&t{e75y;5lI1=ICr8BOLE93IvE__eZ-R5Ct_1&*7B2LuU*=eo?)*I+4 z)R_s_grsPog0mlT?RQ6ScOI$)^-{s4L`O9)<~?Y1dAwobv)}DyU-!~@wcT!rr5>|M zRvc`khgG~t|=g^Q1x3QT^-OK{g_9vzEb|I*6ncs8Au2PwM$gwJ(Q+JS5LO!dOMy$R2gylCy~~GCP);6n&6} z4<>#Z{?pK5%i1{vA?Asmba?6Kgg8tK_D&YZUpAw8CK9L{ zsq9VA3~UvVS0&LgpBI<0nZtw&SGaD@h2&cDh1MH6_riJFuSZ-&ap^IrC!1+Dzsvwe z7nz@bL%EpOm^d~Zs%(|f0`^T&+(e#^Z%Sud&iNHr5~{CrgC1%=@D)uoyRK|Qm0k3Y z#u)lB*w811>^`UU?kX6a+Do@>K0pYk{zc8o_YmG13^eKyMtJ1hcE~(Nt0oTS0;O+X zK5`Sytg2D$9ToFiCF@mZWu%+CE9AI)rz!3CK0hiv(+5I5`)nhWR4PCzxgi~lsS4t% zS}9$_W9jIisJ_$pg8ZfNOVXHodSVDV>EBYkY~(v^uvjcR13ocv1aW6rbdGN3LkpgQ3D- zo2@uHqX*}fZ=T$OLVaeLKh1A}g+1LL%RHNpH}BKu zt#;^52wmm%lf_-ybtXR4u^YlPuGPVyM{_^U&5u4BlekB+e|+~nZmHE7xuJ06qqmAv z@jcB-h=irxa$AS!V&%-0UVP8Edf)kK{=vQ#QQ&$v3xT9?;1k0<(i4F~YEaX|Igsv`Zta9lkw3}s4IdfeU(hlzB zxXSSXQQ7U8*|)>xhz?P2gw0MpShq}Dn7S9~wLsiCG}R#@Zjnw3|IQCZ-3~gb0$e*Y zEKqAKv}FbAC;AF?Cy*ymzA~QI8-zJA!Re$Tz4-nH5;ga zYmQroOBA2JMpIbJ*!`3e=M-urFZlHjaR*NDRTS|*bTy9)IEz5L?wu_m1OQ-r*iJ@T zM|dr5A_==|2X4G2e?h3{**M|*B|#x(ocKiQZUz%eIYH`ZfSreh=3?df~baYGWCn z<0A2+Ttvb8;4tqf7+zvmJRF2)Hx?p)hwhaU?uR<2;_A`!h`aSmJ9puTxi-yfTVm(S zoNBYvHkvL#e5#ATXS9)*qrD34Dn&S`y>~hO5wS@Uz7)IPj$WZ)iih1VgQE>BPPLzO z>2lNb0K81+-5JVIPpLQQT7>E||poEeySeEqyK&|mX+gUG~#Oc#(ko?ZPjW}w{N1kIMl(uOz(h;&7Ri2mLOODCcY~xvCtl&~=5W!g4 z+XWw~@12zvq&-si>~x4x{wt-W_~P{rz55svG>QgNEwkK{{E-z7kAB}EV6nY^syB_ep8x~LXW}|=G=0( zX^?m2%kLPTw?lN+L~=U(p|c}Ca$lmq1=ypWi)X_OaT@|Amc1+!2|5=y_8#(fq|dq! zmI{@)*t)}4-q-!jDE?J(A4vd8>tBuJuo#H(&RR_4&vNb3!p*yI;w$Dzo)POP#Yw7= zqRHe4rNOl`D+uJRGO2qr1Y!+_iRajzMwEKGhlP8VWP6&_6r_%WIQ&cKf=O`!`n+zb zAZ}L^(>6d`42^1R*n2sKXeSTS2S$!cT#sqHf+$f^o=bgJV=>96KtXhB+QZ}I_)SAi zU1M)I2tx89(S|sys`#AGR(5P5gslTFf^}4$HxVOND6DhVhz)tsD`uKfBw-2@)q%ne z&z2YC2X*IZgTE4f9IIk5Ea!v@jLW8qEFZ(Y=!p>Azf+dx@Q8*z7OletAjI6>e}lzP z-E^3KB`8<=M~w#|6o*=$5N&g_LikFq1Bbu~3)ii^`LtLSljQHx2ys4}Q#!fX0@AXT zfr_(n#v83|yzI!oXV^$UaaKt4CeKqXdT-~{po528q+A!>V%}A$)u@Q}HO~90m7wpu z9h;yK{08A_!GbIs=R4~|@os($zaWw$o%+bnU$0D3??B#cJ^VZ1sSK6pOWPR$p)shM z*=*;e?XtDkj$Wiw=dX6{-_bb|1+5HC3SJh3xQZ z@6oG6d z^@R>e{qEYe)}2eSZ#gU&{CEwAxX(?tP~`@@QffBDT=WROvDP3Eh%k=l+;{JK|6-v0 z@S#2l5h(Yy$T?XgKE10B1GQ9xTUbDKtAG`!g1#FqFu4)~InY!Y&0mkPptd#qnpQ5p zebj#7&<7Qm=FO(*xN<#VcHAzoE{etLx?L@`k7&;;uR6ZYb5%V3G0o9W4_!V#x8@43Ur;K|+h4JkWp-XR|7Ss_ee^MM>fH`r%fa>hqZDn3dVMBTi%6j*fn z9veQe80TQf!l_osjD+HeT~$>>)zmdRea*sXazJAUTOhIw#JqI=rUGw{1-nq6x7~gH z6nLh9>NP8$k9tZR`GenVb?X(GkT88Ou{oc-weBXaOYn1QL#qUXZ7na{ky{}}Pdry$ zoS#JwksVuSD|_yV!^3pyBlv2YVF^Yn@a5Zn$rhqs)>WHByo%~_Gzmvfu8CvED991f zQa>Wdc|y0Q1QSfzCmnyW@^{(uN0xDH?xeR);4sTuZQo{EaGrHS^`gyc@wiyPaV+1% zj8v6aZEt(Z&4-+sr8ewW>lg}xI$NuH%Dy_0+ql=^B7Sn+MXYB15(xdzp#IxlUGFM_ zo0X*tlGtpmr>I*`Kqc?>yazp?;=fM9 z^pLDqS5_|!WDTYiZhsERdbQCpI}JKiD-X^-E)x~db>xs}n@$ySe96m}{DHlTS=ris zcqZH7Z9qpCg)HKn7q5dS?Jo{J-q)t=tyV4d0x9WiSu2Vea%iS@(T-%E_Jcko)rSNF zYVt;s{l#7fxT}X>s>KNp9-+EnJepOIURKPzlZ+Iz$*Cdf*Ph0s?F~nBhs^ ztcUzs_V~D-kpLKSgA&s<9UvB*dn**ZbWjx`NK}_h?jCZhLYvIh$c&19agm;D;vGIq za8d^admqmk@Hfh24LM`~MziwMkA?7g=445^Q5S$djJc#L(Wko34hB2}a?=v!9ODZ^ zNT%#=fo-=C?tf&=Y)zTKG~Wos{UjN4jTMp70d+cg^k%DHSN?f>PU06Kc<*k8qSsN7 z6CG$I`@_c}|Cg%g+S~YMjc8Ncd6jXER$(Wchyf3P+)cO}Hy{t;8@>u1vvS5%t#w~L z+gXJb%4$5^Hf*@OIh%QY1}tca7n&d)B9+l4Gj_Zr+;m6a`=El{$_aYo-}v z*c-CMoY1DOZZ#mhMcCoZFC!BF@_TMC-?#P21}GZ`Sg}BIf@sX;>BaqUkv&|}(&`uC z;h?^R9v{z6qf-e>nRM{630Eh>rb&HCukqpeo|WFr|j(7zSEDZiwf~R)8BOy@K(`Iq&N$`ZNJm1e|A@<`zaX4h4X=n z|AhEyk8~b1FCNP0b7haSzqizkVj$n{v#JZ1)PLe^rebGF!blZIBm;-1&7UpQlPh*{ z;A#arehs8*cMpy1v-Vx+QGtFS_i~+DB+!ISB-}F)XrJygvIcRe(|uZ8wCN3Q_5=W) z6Pjn-{49P4Sq~5vS$gd| zZmdL0b^keSm6x!Y`8PJ8k<1yV%pagigkY*S%+cKT>+1IF;c5HMBre)wrs%#Cq3Eao zSV~>~Z@qi3jGVsbonJA>sf^uSlY7tDO6j{k^IT!iV{qD>A82#yUofIKti;9%n z^#kP)CmzGNVM2wn7UA@&A!|~wG%GMYYmE7a2B$k+!!`~pq5iA)>ihuL97K>R4kynE zRJ`KO(|?nE)27JaoOYPtjSNd8B3>tlq-FJ0_A@#3JR-bW5l!&Q$OrMyj`N12Zy#GN zzykbU=!1;ZcV}6-E;oowA$5Am>u)EVTJ~W>$@{RGw_reWugIQwm zS9JQdmW8uo&oj^i%W*5aj}F4G#|IaADURys!T^%ENfO1T3KaOBR%GR;nu13;d(GB?BA{lZqatMW9Q zSo>ruzZLwVAVXJSkXwStNZ}?0S!bi|sI3F{LsgQ_tOD{%{kM=(wrQ2SR`Y%VD#%vD zA?Z6);wiqz$prL~l9W|uRI6!#V^$u-Q@H%ez$6Dx6P$~NrIfTIkgZk{BhdMjoykOdPI>Mc7mAh~S&GF^E?He~(Pf^Y zp<3CBq))6JUUM4TUbQ+lxe5>vkQ*J*N@2TIMV^X$QgK?h`#Nc0ovnlbskY{?Lo&NC zI`%n}kl@QC`nWj0cOMTVFM^xHIH9!gp+k@UUWr>|Ko+;e(uA0vE;p`r}V7 z0#CMM_Sn(3EUNM5ga@nLn^mC_**%PY*`jUqs!uT08U4%w%6gdaEmS9s7lCkwV`6Ni z_!MDrRfQ`2(qkg1nSHHb9UVf(>O|3e-GAP(+rJ-D=wa98FxxroT{y zihu=|Rv?OR+z4+5_K9#1pm_JngwHIHXO8rRRPnDV{#6{QYw;wc(b-X&(N9HOwPhg< zk*mj)c#6f+%a?#oL z-tP>KTKXg#+)Vu3;2jS;kYP`iR5R?CXA~*5e&W5lXG7hcx*kl}?dO4Plx=*R2!@rS z^7v&n(B9!L>|pz>NqNU`2O=@)LPpWwiZ}gi=Te!~JS->b>xOakL2WRLqj=E9X9KM+ z!`n5ScHp>!)i(|_>23%sC8RgARE6vkBU1nC{q5sG&1d6D-d7Dc-(1X$SEkJc8YVht z!ItN3c<2*5#3{2V>a|%P5Ck{a9{aOKuoRE09K6gL6*iP}DBK;8i^wzQISrK5M)9aXLJ?5Suapn=ICH;BJ&P4>c(19 z>AAT=X(yA}HRgvha_o$CBeRsMP^Dr$=1@cFzl1nxN31De))W73z8*Hrnnz333-Oqio=c?8{X-IQ9mOVU%iG~D7}2aF5ctnoGm z5OG)Ysu)b%5#_7SQLh6g%^>wBcY8>rAMuG64qP(ANpwx>1UD+U*2?UZI?9m-Y(7L{ zgAN5GWpLvu;*qG+H*9|msgbgBNF=_kGPq06MU3){mIGa6$8T)dtE9xD#~W3Yq6)h9 z?!A27zXx}>Bxd77uDJ`5sLwrhp&SbI;`24K{@bb?r$PD0S@qc6vd0(@M&QqEj_Bs* zlX#$fe}`a*Sf6wtw>Mc+5;Ggn6;F=nq>b=%6Huu0Nvc1ZEd5QZFEwHe3_aRV*k+pWVw)zFnFxfhtl{f>mem4*qx67W{X z)UBbrxMFLyfDI4UP0+9&3PX*`Z+~yavEL&0bnOL}-kZ4pmL=8#5cxZ)`#LF{stZ#* zoApNhr9;aw1WcGy8~v^dt#ogcP^}8*8ck32URiV_T}W>RMX;>lJN5`y4~S;sss8+s z{EdkZzVZk|(lu|q#H%>#AV%1D;Ud$yJ6c4hY6@)7811DLJPZYg$Ov3JsyQ`htAL?c^ZwJ=!WT#7D>)+i9 zFV(DuO(K8WGYDAeKuqlO(LWnquQg9JcFcEwu^vHY?>u ztrzA!eC0c0yjrZcbzL~jyVzBU(z-2Bk~eSrBs|=mb)Ef}z@>UvK`}|B zeXV)TGF~}}YoAy76n0?bXhWo$W^_Z+`lWJR#fqHKiBIRq0keH6=TYb6-^L8h;teW2I7Am z=6l!Jgm?L#E(O@jT-en{t5F&+{1*Kk ziCgNt{t@AnA2^--^x*)>>?V%nnyzgx`SY~YAfAp1WXsOGAuS^U;V)b|P}}q2W56rT z-mTHuKn^ zcQjh3uw3Oh6qa-L6N3NuSfYI^fTly#>xDlD->U7f1U zf$!nUi7ZCj9#tbmy+6w?np6=c#Fas2u|~frs%EmHR)Re1=GnziYDk#yFFtkxY-(PKS~i;=M^ZW}h%sbj8NlOgGKUpoKeH6F{YE`o*A z3Ln;KIaw$7RUK$a2`B1f|b62#|9#|8a-YW=d$$RAWp(Ge8qO@%A2`oA47%>^sk8h;X_}{-(~A!@xu?!qodhI5o4&_iASa~0)BMmk?yOq* zcuhVo4u>^8beNZT^;OZqn3TOs_%|l;2npHPmHea-o<(Ti^>8+UKq`_kmxuYFB|0 z>zpxXrRgfL5G_yY8H2z60dz|fHAh<+7tNBCy7wfYnJHkN1WHQDv{t-ES_}#$3ZYua z6lU)VTS*Ba%<(YQqkh984QoT9B1@4W*!?k{rMT|7^Jhc{!@*0S@`L7$*5_1=ah0ye z>*9ZEhVtS9?B*jxpBlGx<2GnJpLtS>c09F? zz`Z5VA`o8?jLNb(+#HOYqkc$g4hzl2c?3Fn*5W=zZaGr|5QUx?EPCEYcmuQtnKmtA zaYG-IdZO11{P5LX@x8W#WMF!_z&@rl&Ko>4+AoEa=*8`=Kfa1xV)HD6y>yRxMS2y$ z3{-07LUnT~4pUw6u${+~ZNhmFFyI?;1Ug)yJ^W28e>dK*mLAnc6--b~Bb}TF>Zfam zgoF-x5DhuKg!T6!soOcyF&UnCodIv7^!IpG?^?c5sK8WK3V&zacNKp zASGFmm2Eg9?;gHmCF#)WzOIOD{5E=Q&-pT+``a`n+s>*~_6WYfd|Llkm9FRV&(hW* z>D+16BP5-}{R!d_5@OG=Kjg6>cZRrHkN8i?U8J5Wc;ZA5PEdbX_20t>6n2jvhHQ^1 z--kTB`F7!GzGE6rPUru!^5 z{U&fMj83CN2t0Nc+1T9abdbT*Pd5y3VOrA!rZqcciOy^Gfp{fEcghJ@N~rE8M$V=D zuNOm?=7P%Wj0MTQp`@t3fD~&wS4Q=wtv=h$Lgt#C)s3TRUCN%0#8)655IlWGW6XR1 zEMKl{l^CC?d&uGRAEh?IRUtf}Egpl?4CN7@CuAiLVm&%qm;m72i6J3XYKe%obwJ|j zg5Z~UxzmyhXnVExR>E`k4TU>CZ~!-0fGN&pnnwafgu8SY=`(k+(G1ofdY;PJ9FLR6nK)tN&4pXBtROuQq9(}*xdilp7ZF-6QaxW@(REDZ8 zG&!lTalLYByAU?*$ir(Pe{NXhS7 zMq&fQJ6S|8=~UkO6JHS*X1wxu!+F+uJrE`?<^9@CA_Um*wb)YSjr%jz^LLbSUjsRx z*h$k+%l{y+`B}atUNKFZ1rV{xY!0yc3KF*qW@l^nH~e)(F`ug6WG|u5{>Qyln@`5Mwi-ISp)f;Q$^##D}QY7*c#r>#_R6$`c$Pi zLPUsp!T4aPV^lI838rJBPD$9J=~ROCw2Z10zwLdF)Ro*=*75vxjMc%heu$Jy+Nua! z)|Ow}9uvp6i`CqaY`kAu`t38Aw_0g7(bG$3(tE zg=<}nFB*&;UHL3Y!tY<#UAM`N?o4HsW3tJpG-o7kL&%giY`~E7`k?p(-~H+3gxLXh z>$2*V$OKOwdNKE+RF$I}G(rtX zIm&;V>^~cOMD00|qj(EZS}SWKd_&!w4@TT&YgY7l;PGw^XJz1!2~6iR>07JlKO=sx zlU2x>pef-_ah3EFM$=bwDl4Z<5`*3x4svC;TaW6i{PH-2W?CI+>#ktq5mTG+BxD%)GN8vTA;GD)ep^d*inG8HegLp%s z%*r`D_Al+{UHU^XH{N&aU%wi)?)N@AE{+8VYH@lUs7(N0r`S7Y(CT{^@W%|(_Cgt?$m9= z^HVNY2`WWC5|pZH2^5#i>~jmRTy$&)8CCSkJNQ+h2zy%U1t|?{uU@Cdd4df?YcmbWE^*)_KMm0H*BVd^z>-+WFPi0h_WDR9PS2`ddSB4j(|z+H%$jMq4` zGDT8c11vPYg6*#cymko4xHT8P|NQY;!xg94I?JasObPjySWNzJpmo^u3E8@Va5BoZ zPd?h>sPNJo$sXEf8?+snuvycSl7Q^VRt{Pk79mpl*Q1%AqnbrEAy*m^XABA0!6iD- zkyO&JZ26P8opil+*PqQe{wrLYyN*8j5zEBFyp_vCj%qE28|Xu04R~LVaH(lHj&8Tb zzGMZ+$}DT9&u4!)!CzHZLf5hRl)pMbEO)$F&_Q%3%h91f<<=j8h$W)nP8`Piy1H1#7 z{Li_fuDLk37_LAJA)Hvh=-K8<>ty39Rqg`39oUi2MN05OcA3Ge!VaYl!5 zmfUsI^m0)eamQA{uK+;;CQ*TxyidL|ZktbavqkF!b*sWVt)9ZywNGquWm86|1pTe1Zj8tu;XanWN+2 z*fE`RT~&4L8@UC@Xn2X+N-3x7;*0QPhC$8XHMta8!u#Z>2U-n=Tvfs+xyQQ~Sy#ioX!DISU?Pwee%Wqf%zlwVHfw0<60u)sq6;5W z=CbxL{CU_(s?lB zsT>(p?H`;*D4h+^$+U!xR=UZ!S<0bB5XD9v^r~)Jh$l0oY zFskA$$lmp4eN3|NxIh9%1;<{y3Y30&aAmdA>L3)tLBx>f=Um|dETRIo@!}F$W0J^j z0m_i~RC2+j2t{N<52cOnPJAh6k3 ze5!Jck0bc^23{#OdYEs$s{#Z2U>1}qYg#nH7|`<^503XFIA3-~C5UX)V6nrJ=HcL4 zA!N(%G@Rm5?ZyzP+WLtXNv~ZFupRt$I_EaX*?Wx86$};JUyV+7EcryAJLfLS%ospQ zy%-$5Hy)#a&Sa!%$Hr#)Y_HPVuMI83lTSr@dQ=Fw71vX;TLP91o<;?arqU}wDX8w& ziX`YoW0=h%OYLS)oEj!cE}>h++E=p6jYGbrhjX^n&C$FIbMz1cB^H45;viy;d*WIM zpzq2)$~)lx`U@E~A~^9|Kx#c)GIuPwN0-xN5*r2&BGJdI?-)AfGu1p_|w#v3l5Y77(|*Qw8x%%%+Oe;Aw_ z^cKEp?HrQWA(}Q99g+w&aIvkm?$&ft0KlBKHWmrBG3x1q7bngA-@|= zDr>3$lzUb1r<^}CS%d{_aX|PfwqV!r}M=!0~M)*jAr8? zsVAwD_iO=zj{?8#S41B&(i}&+!+3qQ7IsbC%$%(2PHkG|y_NKAKgn_H`F?vY6`ss@ z+Xek>sULHGR`uFPqgtaKnjirG-|>(k0qccU?4d>+45121nhlV!(gVus@h zYi?}lY`otHqW!dm60ejln9jsPjv3rPo&GLz+9U1a&inh711F-WVv>=ZpcOq$CLB6v zTa3f2sly+@rOU;up=ANKq%E_3(X_v*BQx5N(1;t^P$9CSO}Uwu_fkiL6R*~sPfnON zw!<0u^f}FMClPJdB!J)IvB-A~anfwGNjq&A8$QAn9>yK5F*?69C7DP~FOSa0&-R;E z|5?@QDC~}%nwS?r6UBj$!+^_2$LXopS|2<^b`KM;HBwMUJv2_OGGj5aeo!2qJ8ii5 z**C-_L+W`sMUI?azMW$~J>a%eqS;P7rRo?~>_S0b^!7U0R*npGEkIl*LVQ+fSnj!{ zT)aSu05%tE+_R0-iqVYo84cDx+(_T#3G)5ah}QsEd8>tt=HpwZ)>P?Aap(QU*Qza~ zn3}bxr_j{aI{wvqU0A6~pI##eyCm>7C!>U=$~#POy|&*g@H&Dx03%XL{#W3^Sgq=V-+R%ibb>Ef01l#X?u`z*I! zroHI%P+oVmiMx?h;(XQHDpXO~1Q#J`8huiBr52)1MO&#N=%)3H_NS9oGc~vxTtV9s zR<=^j!a1ikFj{Z4|H1GMq0MMc=%M$MO@;U9f9SB#KQylVE&T%eVm`Gy-9pG8UuqjA zn_uMC)LoDHBWvmg?EYgtGBD#wO^hOIv5rHw6ZgO5SqBj;xz?e4NAmc8sElc1Sa#+A z|DH(_FF@!wg+h5p`O>8FR}IpF~KE&E6x zd*lZMADL~P)pPh|+sZ`^;C(#05C5pr#Pza$2zjud1^k!j%fx{vT$yaQjb!}ee=IXe zfvd!Mm@B0o(&5Lm645O%vRp3mm$4~P|IO&lq<{NR6qu<0%7x9AE z6O;med|7@UPagU7ehkg#wdmHJEpP46elvfc=AOjyYRO2qzI#>uX6dW`R<%|k2`j3` zzwb1GVeziH?W92_M4kXx>K&chyARu;oq(fC)pF5 zHB-8BFGh++Vs!^++PN|`ZQ^fJcYUcC7RchKkhkEKCsaHaPyJU z=!t)s#)VS2|6NziFzcpv+=eCbzr4kfe@_&h4!T1a^JxA zG8`_qu)}m)R4#3<-^rk)RQ7<|y=5&1f9pvQ2SKhb;P5)d2{BiEo~M7x|KEQBd|Gg- zH{V07+iznc$`SMSMTc$J9k;Txwzhv+o_j++z82f1)re)A7A)0glcEL_3@(FAWO@DZ z*)Tc$UXnBK_wSi+%aNL)?op2og`I=BfNZp7EC<-UMghH02}d4spuVV;no*Il-w$K{ zWsKfCuHK%Gxjgg{@oAFP&bbRmxjXId`ZbNsv$9;5D$%Ej3>{%{TDtA_OR(hg{jT`# zl6_m`kHFG$v{(uGrji^hmef@mXG%3(1ap$%7=!IRHtzzVw+mTF7NjEr8K+gT1km~u zmqN7h547x77VPbT?(sj_FYFZFKj%Pmq+$&Ebsn4NTN|yl%w0(s1m5+hikQv_JgLX> zhcMk!7=v>RA#AR>{ot#m*93vfqK@}wx}7JO%GodQa>>iGC}FOxf4d?;hNZ%p<_Nl# zTSF!6i6La#n(czL zT3IJ^uFdGVq@3BC*w}T&S~>yZQuHWy+jjwM@`% zMRU`B(Rp}ZwS8hgd8KgGNhNx(HKr7l>IamtZ9Sh6zQ;I=W;;x*-p^|-8topV|J1PQ z9W0_Ym-nvu&vN)CG91nOFWQ4#d>0l{0_l%hoa&cmrp6yfEe#KaxDN8Ay8lQqK74a~B-(=NdOP((hApt)X8#yV{;@~QTE|LUfZ8f% z0EZ%mYy>ZHKm32}y=7aQLHq8DdvPsLyto$#?(PMGyA=rT#e;i`yGx5}u;NzS3Iw;J zMT=9QJN(zvXYKs~)_%1P-h~{Qx#vEw(d+yTO)Q*f{-StfZ=agvO7*?@1Euat55Po3pe21V%jDmG7;VO63j^US^gVY%ssp%Dq^Z#`V!~;TS~w z?|t&e&S`>bU*)E!?pMOhZ0%PaZ(W=Vk6Nb**u~g>$SAjj=X^MnCuX@FGX9pxw}epR zgvb^~&RxNAWiV&u8I(UoJeKwLI%^VUtZrD=F->mUcbcDPcHr@1%=MT(3ag1*3;H{1 zuWO@#47{!NQcd!+REH3)v~)k6OuQt4Z`7pihZ}G=!|%X+$@h67mBtnuM@foq&K4uYdZ!Or z&Y4!$JR9zrXQoeNHzb;So0ckN;jy^`lh4)6BK^s69S z&#s}I9{^8X=dRPgnTM6}J9!&2$tSI;j&mFItjYX4wIh!F>pnYt`cLyUe=L6H3CrwD z4+R8(#60pGu)2BpOdH<*eLbf_+P3ATw*+dOh9rf1@_+y+IN4(m(AwNCXS2QCe=}0^_iC*)K;?2J0aorS(}S%JiRr-UXxgX zYZsVaYxS77%a-YmKX3F(t^e^8)L?i7FEBeJ@;_QeA`BbiS2fG?kMY3>n*s>;rX~Nw zBQ(jwcpIWXJF@@qHVOz}bB0{AF~xr~i)A_(vExl;6W0HFBI;>$7}7(nZnxy$lb_(h zm>-Ec2LI3s2Vt-x8KG|P|JCW{g&H!Lx}gk zl0rkM#{E7DAyTpX@B0x(_yua3k<(xD>Ty1c<>auXY@3mzoHXfBNB1gT62J2t=7f3< zPiFSk3J1czG|XZ9Pb?q8VPav;m}UB>1#g%ZIxN$9|B0pPMJ)f{vJ@d}^<$a;#A5Iw z7L2lY|J4E|Obe&b-SL0=tbSqAAZxw;7ZL{vup+&W-E98p6ZoP}FmwFBknng331P4Q z4c}pf)yc3oMebjb?Jprg*^%?#m?47cv)W9l_+OE0u#h-OFrNHx%wWLk1mr5!{8!}Z zOPK!OX81qR40TRHm1CUU-`b8F#vX8XuY>TQW}&aLt`|*%fFj_Ht8=7|LsvV$cX!RQ z_VZr7PC6h++8!{;Oa@HAUKlao(EihZa*@H* z#2D)E@gKN}3l;(=goM6$|LN__cwpjCLs`7~2W~QZQ4cfIZ`%LFNRQPE;s&ec@E^FT zhY(h#md5|zSRMM6ktJ$ItvxL9H3*Rirz(*|QDDTA%wNw}Y{tnTqoz`z(!g~7@@)Nmm%V}94*#f1_a z47BrC{|)R>&xnyFZeb3r>=(w!1YeD7JpP>+jNFs>t`@e&sJI{G44ip{F=aTrhW{d| zhnxy6wy9mHPHn*8Dsr!FJ@fq&{Z@;SE*y-18NA}yjPOmWG`X&r@P_?zq0XvH|10GN zmu=_3%WS!%L4gqki#|zAw860#;!5EkQw7GC4tXLK27@WW|2AG7Gk?GiWBu^#v(~g0 znfaYKn0DO5ir(Uw{fNj}yqz}ZIay`I|8?#1d9~T{Reu;{W!9Ong=KopU&w6RS z2~}7E7s_NZlL4`6gANTZ8g)n%2uss?Ctje26O#<@yc4@N#o+_h4?}rhCYs)ba|5)9xSu+0$pM-qvcv7uCR1&71UxpeCX-U!G=I=Wan%gHko=%)ife0^Ppz@em z7`|zL&=kq{`D(s4(9_3MiFS0yx?|^jO^RE_+@h2&TzMr-UG8s*zGhE zWws8AQ}*w_c;0tK0)h^tsaW>sBtgQrtL`N4fT5#nH;@+gOCELCh}tcT?j$Vn>#yoW zZ!%ka4tT>?@}IBD@&B;rY~I1<%hh+q&r5J`9;r@Yev_c1MZjI)g1&8P-|Xn(A6F88 z0#yi@5}X0Bz)h}Pq1x@i3OX+K`%&^m=n)1?5Os9G4!9U3N$(<)5eIy>DcjyG#0mI7V=b-+7Weaqk#9I6 z9c6nJ!?73>Vp<2VdtfU@tz|>&I~8I0t^Z*f8IbqR2_{q9XqN0yVUKZNjDK^TqNsuc z6ctRu3o?nYs(%}99Bm_F1rok$>NS7-tZ;$Kku%#id6^0R36J9=LG}k~naD1i@6Lb^ z6`XP~O3hfB*Smhu96n5VdRIy3-q7x|(3q#=V~cs(c^2SYFMtJm`BW(d){~xrb(dt^ z&V~WNS3t7!juBO-Sp_JVf&&&wK^%%Zuuj2)Y^?3JeX%oZCqcNztmW-ntVoJ`xPhyY>>A!ahP19N+KK7>o4eIddkD4O(!9 zU0>F;@_wi6!PKrb)0+_1wZHT6CqUtQvDhvx;21NsZeYVX4QZx7n)4JM@ER!9Y4MI$+izxYbF9?(|2mTc4foRt)@7=tu zG@SyhV{YuNx(d`}k`!$M1S|w!;wt1^N#7UzN(HVXy~M~6FBjDx=rFNa$gmyNWyWxd zBLPtz%O_3JIM{AP;Gf^mU`&n=c~>QjM18yon>|cX_uu8k8a^4!;$H!VRpy(fL@Pkg z8^0L#Z=y`CbM7*67?)w`>RId%XwiY;MN#B@YnY;$viI-0NYN@>0>vr=^U}`kzHgmC zyM7|gEf5714eJHuQU7W`wF-A`|2$H^`U{>>-TC-rBN6M+)fXPcV9`w?D`MKA#2GNQh&uA(%L6irv)OR#T{#%h!8j>Ofh=Jps#N8K7N|K z>$N?=q%&$9j8peQ9dCZfTWfy0S#cf}xGn~GJ;O}Gx_gs}OOlUa;$li&%cSHaTm5n- zu>=-HQ}O*K7^M)N{JRT05wo3A<#aU$*~>o3=L#Q!xuzBGjR4F=;8o1FG>&MK*?8^v zTFylz68KF;k!Kop~Vsd_~!(9VZ$fN6ue;+18l0?~sKK0xp3Zku+;G^_cBz!(9EEC3NX&*Kt~JW+@g&=nH<;bvMYFMk}we^E2s_&R2<1?7FZ@d(HRFZlCo4-|DZe z{W1bRC14|bxkT1vbwE$EYz(=b%vRgO6mFftk(=`09 zq77*dyw<7>Z$LbqpuddHm+GTHV(=;#=-7^JgYJ2b$LP`^>QV%cyo?azRCsBmYViQYIhQX;Sb(jLGIzo5c4t7uPp$wliH1Y`vxMN}oVHrqE1Q zsw-GJ8xqOIWCBVq<^IMoj=Eyw>APM^TSCh^!RsGd1Ea; zq1qNP_646{Z{r|kerTfzb$*Ysh&y{)KFfoe&|!&u7^-+?^1I-bNqQ>AJLP0>BsLD!yzPNkIY~}fQr<`q;_TjlIoLiaa!Eq6B$_TV9Y~WHMJ5szXt{9fHjhM$T)Bw2l9s^o_&Qu7 zaUtIZj-=}?{P!_Gfao)5XznK!utb&ZPBWXz?~S)$oae0lm%+biB)$7_cdutzFptA~3q z0uDpG6%9WD9Svdcg*&zfdnKkYx3CNL^U&S^NNzvNN-nJE@{mj0r4PGS#P7%E_!Km+ zMm_L%vNGH-pZj&DyZFOQB5|H$;{<;xSN$3@H=0pv*>tkRxUqTU8O*!NKRq-GFR+9o za99AnXtP}I8RzCNO`NZh3iOQ8QQsvMMY2Z6a~>dtE)V}oE$xGk zznr3c=Vn%+%hzz8R`|Y#4 z%VHHV8eVv&qq?7%_bNMX(g2v-yHGdwIA%;&f$D8jKvQM`PrYZd4a3+5`StzkK+ zLJJ|mvS%oLNdC|)O>D)bPITUjO0{|nvp!G!HYqL3(6Cc}mxnC+1h{>{yeOtUL?X(| zf-D;d0-&J*CkWIT66nH{ry?1wC`c0@MUALS7Cm5z3`m|kWF(B^L=i}+$c_}Q1c?&T zrs1SjTYKhCkTicMowv9w&~rFo-Sx6Be)}5nU{t|}@ZlxFw~@o5ju+Zy;idD)s~0KB zZU%;p;2dL&lXypp)}0;LFF&3J{ry9N1xw{u3iA1l+Rj8A_bY;2gipN-G|v*PP~;E2 zc(M2G3KiaG2?vF;cc7(#ONM7n-nXbez^E>DdEJ9(42xwpk3O1d`nR59QG)>?H`~>1pRss7BHH7L1 zq~&kpnVts|1(k~D7jOnOQsdvgfb`M?U(O7y`5yKJy4%c-c}H{#TT0R`fmg(Ob*t9t z#u&rq4#OxmL&P0s*qoM8E!SD>RKdBITYH%asSY5a#mOFOFKI?YwGU=+-0cNcNnqaJ z@CxU9xM&5UmRd<6qHsqUBl>MGd@Sb#v4?{sy=zGTu~hdiyEF5dW4zJ;IDOM>J8rwx z@=a2tj22>c&j)MU<|=kLhri2!NG-%Q2cZf19)fRi&ae~UJQFO1g8_X&lq8C( zi+M}BY<=Da@sL;ZitL7X=pv~yhL(^wYvA=D2Yk$6H3pzmQSdTCnr3T6U?0)Ko49%8 zxqHFTn+>@R`(blSfdcZ9islHMve+gEhDo{^%*zRadl}oUF>;TPSJsgzQ-DS(II#*l zWIT$)QYx_$xNza@_Gks%47H(nsyx^{oGBRjcs%>`c+~qm+ysN$2>0hW&U#X_eZD%2 z*LCBsnvOI%aP443J#*cj7`K-$hW?}I^+3#mj-?r{IyH>rw3(kGxbIX{r z1YU2g|Fwafq`ftSb0{%o09VH@a)A&CVVfY4KbLBFJdYGN@}ID8cDsjR?_@3l_E|s| zGsX=yqWEHEfRNO%66X&8Z8rZ4;I|z_Q1surD+5EJ*cl5f|BEa!-jUXe%G;E4^niXG zstPBQxmQ#yRQJ^h!U)D|&BaHb*!0tOxy&0Au z%7RCaa)x4^8<;d?_#v#A|G^^#xkRdTj#ShIV^w*Rhz3ic=5t3> zsN#OgI9{U5;-3_Vs7J;gQIkTfN_{8)CPi|y{VkUJmjn&n=p3X3F0LT#QCHn77T(E9 zp@>qXQ0-+51E6LY0cOF=qA#}b&>Mze&CCKzBucoX8?CBPXL6oYzgv|Vki;ALR!Q)Y z7_JHz87>^}@snB~t`U-f9-Z(XwCTB#*19Uu~-ak&k6H&B6NdQeCeGQ$C`Ka>;*?7O%}dxE|> zYnqdjD5zb0$X6SRrpoVOkV5sUg+!p{F3n0?crNwbft*(2H(I%I$^g3*!c<M13SaEZREEzATd-S_)bG4&PYp#Ryoka z{Mw$Vyf=F+fn<^D(~&r=Id_Q#H3~F9`_OgY14eTJ<5{qY?o8)m+xD$0jDokn51DvITdJ{BE0^T+Mc}`6cOBHCg5|ya)J*= z;vRlNt{mkufC7XZZd_!&U|#cNk~^KZ;4H73{cBt0K0W~nwll{G?H=R_C8l0UooJ&d zRHk;?tgg6_f#o@G4U~{yNg%<(dX@xWdQzmTgGI8;p^~@{`cH87lwb;^rWeBkwy+~t zYS7x6AtT0*K(Mgm{JfCOiNuX$Ly)h3(GWRsCP$0>xu+tRcF=anTAs9m2M@S`&@8BM zmovc4ACdh__JJ(L)vR3oW?0~X%(SOLs)rmBMwx3SZ+fyR8&tdX1-DmRgbPQf(aNz4 zNex5l^6QGjP>877_QGY}?Kk{QvtF8|q1H!9+|LRWmUQs&XY~A*uk$I-^8&6NK$rDL zd1^!9`CW&Ri2f2Th3S682jdGaeOeUPapV|wBXKx=GTSNdhzyn$>pZa$sIc_{@J6(| zA?IdbQ-o}b5!W0db$aZK{x@mBG5=)a!@~@yG~@6fGCX14LuR5?B@;>VIZ8Sq=yB1X zQtMzRGP3rFY3M-dO!RiO@tnletRREH{rnZl)hp>|tHIc@)8ip@NFU9m6=#mv&ri}y zGgy{-y+8Eowi!WS0hb2qUe0}ef6~~1a~u+=?s1OV(1>WD0#&=niJdwtDGMC^`(f9} z1i**bRsW+W!MVe|3`*iv7cnQOWG@X)U_6~zOGZ{rMl&5#c~qf4A}ag%0M1QtXJl*t z4XB3Gi`FBxwk%olxaOU4ab^NKafO})H+7PR6z*>_+B=mxEyt`9vxXAgH5x=}__4N% zFZ@P`+bLM;t`eD5muq%qoIB8?ITF;Cc*Z3jiu%QbE2k<15k?u70AJJOZgz4xje2*N zVV&}*<2#j-%7=vCMzQD#hrdLI!m_F9?_3BgnMzz+80BRElf$2NT;pDO=PR~TWH+K6 z&HIk)>U{8Y-3&oZlc481G98TEd(vIl4gR=z>B5Uo&KIncL$aB8YEr& z=EfG;CBZV42un7#30TCK2wf0+b;>CgUH1V)(dTiO%slp+z*c4@Lcks49i{@tD*>hY z&|uv}^c0_6cf(Oox%e>Bdwx&s)4pNfoCSv|VC0<*TjhsZK@MRxg99uQ99E+nn3t)n zpobi=g_qyYof8s0x^6@dM^R6=Ee0=X=;D@ezqE#n8ue@IalzNbkXr%4f4*k^`OleY z&5TkC21&HehKD(oSa0_sBS%lxS!H}!!74wH9IivDbBH9r@e|{I&euj%R7pY)xKbAH z)k~#6B-NU>DcKj<7i54Vk5x;mzGylmxxD!@Yi-R+-5-nib(OSU2r2jTD@i2NktEGd zV5cj7D~8D4)M52ITood=3+TrXZhQdAO-*zr`Qui9z0U3c)FmvGe{!)LtOS?pvDLfY z)klLyikXT0+Hx*)Cj&DlUYu#CCjonpZBy}l$avO$^a#m?AehJ-gW0{DV3^+)=Y)YI zWR^eI%C59b;-}0WhO?f#1hnT>B9eORB6xhE0FtAc6jIowdxbz|l;eO2ThZ7OD9ZW` zZytm=>;)&rkdF9k428hJ%S7G5s-4Hu0q=+moRDKqEl{QLFC8II zPf>}dDi9{k?_2n;`vT-Wx}P~|E;F;@mIm9dtTzsU0S~Yg-ywlChciB}>`Gt#=vd~u z9}!*tvN>*-YalSIg%CD#$x_HB&f}g?_YJ!^?&_fMs;%YIh~-_a-WIFZ(6`$*0QVe% zBW?#wBJdb(fMWRQ5m)}yP^G@yw50Sfdxo$aVq3yPg8wH$iTOyI8TB1aTxu%>D@G(K`WDE19wzz9B8hHTQe-e;lZh!a znI738po3f+ZpSAl?#&Rf%qNqOKDRg!2NwHh5)HvrnZ0VBuU4lm#!b})4*bWVUgqvP3C4R?SwfdLKr5vbjR zw7$GW$5=vQiuWDK27Sra#f`UMjZCqtW|=;NL6pk8xEG=JNFc#B(DqcvG+-N3)IZ`9 zgMIPp>2YIree}yR;hV>CrTm^&Q(`yj~Qan0`p@AYtXZ*0~ASLC75=JS&g6 zok+dyY~SAj@%HKHpe?GE3nIv^iEua@){-yjSL9IP1a=Uc-g3;@NzB(6FIPF0-Ko3_ zGSvGhqunKLFruUN8srr+t_~7>3N<|ShE{{yZe31DC{0Z81T-$e2UrUs6U4{o0r1d- zSScZ?Mw8Q!_O9hoB*5XI>-?pdWnYP^5uZn+qoH8b-h%ICzrKRQm0v7J8qz!%u**4X z=10H@RgdwHi&{O`no&af&gi4hJS|(d{SAzXpC!KIhJ_+01+O$eDv9?VfgX5|U;m6G z=PpIM_+d>2SshwQN-3|#@1pV-WN(O~7|&3zpzUEpPFmU1%pLJO0WWFJd|^nmIQor= zuS|R>5)lNA>Pkws1e${mhpt;7Bx=1YTQQ0F8gT%f>q<>(OU%6n7_Eyb+6C63hSQLu%S~5dGUam z+kmJy{b^~z)@RoZHd*4B$tS9Vn!z$-MU(Xe$&)uObuWt6UBWG6q)3&Pw_lkDnMRsh zA~)UgR)cI`dqa0(L=~lsG&iFe9wjy7LLb8tTEFCyN_q32nNCdc)vSpvdN0{5HCXSa zpWpp4f(_<%OWQ5NrEpuZLqq2LCCPo6`M(jl2~3;$A{BRZT?wXE&rw)iW!T<-m>D}t z>fZh$ViB_IH_#tNVO|3$K6oQXuid7g5`jlGlL**vy*pY*q{Tir7vm-G{xj^{+0eYb zh31J#st3eDs4So%#UQ1~RQL!KlaSGl*6X|a=I8Axk9|fK9;kmH%sB)Ns@oS;+hb^)s>vY1cR7(MlLCR~JmLXu zuMdu1&A%zCqacr)kN7%_@j--i^1D`&=#SR2&c>3D?8vC#%nL!M|uO1x(;6Epp!+iMSK7Aab3|Wk;9&;1D37% z3`Aacavv0JLG^sQVXA}Sn`GjQX&e)`VCWPhgAsas z^`W@{MpqzJ_IiKJ<-k*Mf{;B_D|YQCWyXkLj7R&dDjtKA-p_g3*fXr1#_Hsg>8$;* zf4LZv1=Q0*O9tG_LYlo__*o2e%84RaOm(bT4P@;FPyfVs zp{cK0?-y36o?{Wy!- zV9j#FHXo->EX$O%X)-RW%u~mLRrm)TXTBxzyqGmk$;{Y!*0n7ltJHkKsFLZP5EHNz zm>F91u}QVKsCm|sWapsYE1q4yl4GahpbApeV`jB7?B~_EZRWnh!gXyz{?X2|`5ihp zCsFN*DpB2hMt16^rHPLP!zo{t|Ep-Ry2iPXN(cpNOJe!lyft1?`=I4Y7wFww3>3&y zPj0Sb?q3PKrQU4N$;>S@_F5`EsL734I!a6MiaxH=qfvd&;=E}-A9GuywFO>drl_;G z3NrlUgIBX#m$cYyf5YWAqM_vPtFkmdU<6#d`bCaU{B%(XB)0 z8!QiI@t+Ojx8SlH`2y7q4rurKzQ;_DE~w$G9;h%vmjdbutUS-|>MRocU1T{)?hQ7% z`b>VmPS`4fs{F*Qe?Pw0;*TP5f665UQG=k!vPBb)0K(9@%Yq%jHN4P|?h}I(2nc8E zerLu`c`lAobJUVLKXkpH#r?byf;NCtL658Luiq8m8_%kbk}7`SdBjbnk(QznP<+?w zL@QIHR7%St9TONq_?Z@e3qMsuG4qgwIZO$0;_v0^z5m}o-VcFO`hG!E>l=qpz9N&i zIcI`?wVewN0cFiM%YNAl*OQr9ZalB-9*V;V_J8I$)0Y)9^Dx>Qq!ha)Bp`Yz!pkBC z_m|X_WihAfd@UQ!+4snM-@_|wPbT_dx!7nw=}A1?Os36)l#xSnrf~VK&nKZEc3fU0 zPk|?CMP@5xa?I~uhVN*mG4ckqV}4yQ@o`tn+dbCSa?uk*G`NO(;CIZ3^3C3IZ=oUM zXc;1ee{8#w{_FPcSy%k&D9v6AEt0*??WfPClr0zcwbO&9u}f)r5=+9e?aBwOF^ks^ z+UZ>AMW_80j#s*W1mkt^&^Yw-Oj&K&XmoU+3=@*_972)#!@AryDN3HMyB}1UM|Bx* z?AO4|PVj$WX%EgMq=z)*_3<0_uaivb`hn)kGVkR9ULkI|b%>l#M|wGVUAP|g{li~r z_Rk;7YOgW>YC#%n9-p4~0Ih(s8--bJ{DFfA8EmaC>A%W94kn$_AFC>3-64;N+4!FT z5A#~GekW76%eqfWw}}&pwlC9b8mV;L>;2$ za&?&`;YC4VZnL0}F}_YMV5HkK`jM)MIj$8mj?aii$~m}yj`nt$hOE9pqtEtj=%r1Q z=c(xs%gC~FPQRG@p2}?_M0Y`b-@55)f%}1$xzH5UFC~yLDJ)9x?TY3G%X9-~gC%H_ISh10G*)u0L+;9uw{GefZBvE0hiBQziz({Zbqz`eW|^-=k8Z! zy7Rmh+#73ZK7P(Yx(p^e;T+YK7cWjY^9f^IKXsW;tt9R%<8Q0 znKgLs;A?Spzz!un9h(jLtUAIk=p^R_JMQcFGeL{4w!{OPV?lz`qI=z&sfE^CRu;$3 zV{SIu#DfPwK(H40$i4j@J91=1Kg#?Et%DX7#$YsBiI94ao2luvs+Kzfn3rKk1%P19 zluXC5zf9=^76<3t=(ub~F&kIAxhoivHVCKw_(2&yplZ9a&R@3L9DRW%B$r**3K)DX z*@n~)rkXpoL1;?=;p)e! zPA;@^4&XX{tc1u(*WfGLTm?7#BRxSMyxmU?m#6vbRIIU-S_Q-<2kAS&--R{!sz$Cn zJo^V%j6srr%ZTS{@!uN(jKx&R8Pxoha`QF~krdix7#Z6An*Ew5%hRJ120e*oGeayd zebBc3B`fRjJ|-6S$U(Ubhk(Cnxqi(BCT$ozXPg+>9z!3-U2{#$g)Jh<0E#t%I<~s9 z=e8E%VQo4o%1USS!>Mu3EQq#{Ll1_4xv8VEvl-F8n}A5p?9D$B-|waQy-v0HYj%)? zP?3k3(znrFu+n%Q5*m3u?O4=%5SO(-P1cwVOJX!2lx?D7qizOSIffEP0E-#H$jULJ_)QS zp(1Xv=?AYiG`e))(@n;WXZ_tkkR}e`r$kp=LyoCIs$UvRjf;K-2K2v`t0OdNC=x5P z%dKsW%acSq9vw_fuHRO-iK)f26zpjax6(a83OXP_9nV-*#l(D&qB=~NDaph+Vct4M zGEf`j_ZUkl`#HgsI)~?vBvmzmtMJxXfaQFaTQX*yG+gLbDQCDucXXHH$=Oh!^Ty*- z|A5ZD&4=*}00(5$a{8g~$Q4wcN2cMte;oheAPT9+)ph1}xwd8?x4EuAc1`ifh@t1A zkxyuv&bi2-XVJEx^CxS>d(ii_IYM$W$$g zcgjMA6vMqT2p}8JxdUSh5czYM<90dcy)+_v!1($SfU08S`WG(Qy9S-QN&Ho-G%)$T z#lVOpdfG8gFgQHr(gWJzCKn>S@^ql@%Qh`)MgZ@1wZD}M7iiu zGvVNRBASQ_a;fPL*)_p`VpA^A!TwyIowWO*OlTiU`Qd(l+%4w4C^xQ1v;44qs1Prc zN&x@EMTh1WFESbzFqUkAwzFJRvSyMP7xJLKrVV`m!4Gf3wF^=bY&qR@HhIUgZ9$%H zcUrlzgpv9R%y0t0<6dhLUBUuZ@IZ)rYM85t-x@>ta#y_fNVu4F305PIM}UdeT7p)D z2Il#Bk*yE+n~&p~?&~%rAkGlY8oaFMLes11jChEh8C)uAo9@61%?nmm7j%@w zH&ju*XmA9l57Z5aC6OoK2n_RPZ5d4rOnVOVJ?w-n(HjcPeua~(MSq%8&v_@l!<*n9 z&4+(Pk5$$Z=}2V>NarA0%k-&$v9->WR%0c+)gc7wbE3Jpd$eT4Oyx6Qf8YL>N)q9%#3n@Pv!n9PjIV!% zKKBT%eeYKEV!bz;^Yk0*ya^hhdoxqNCqEx+BAC}pW4LF?GPyZM4E-2iaLeL-{inA# zt+?nznF777JV?qp}; z)>#q1Exw#Lt{as1VsF#*ra1m3Pz4Ck?~*tY4%qSw=x26?OELDlm{)JTU;o=`39=fa z=Jo)MP93Jr^?$!79NLk^c}V!E6p>KwSSHFW5?Qv6j};Au;1-*qhuVqF4T0YcOF1`5 zyG*}*%(d7Y2T;>#M#v3EQ^%+OJz<1XzV^onNAFPQ|be_t2}cacc2H59ShSlzvyOBYlAbckc@DWtkN7+n23SI*(_ ztDA~BIl%0@?zG(>Jh6BM{PB;6!q#=^zghV@<{bh3RE@9w@m97jp*-Y2#m6HQNPpC$ zyhf3@>g!RIDmw}2m2k2Cn?c~kwlyR0$ZX1bzowdVQ_z@TiyMYVrBHiNKA;iwkQbmQ zGNPUxP0BKHD|bp_q~%oRX3b1E&VCTJp)%~ILfDfdY&)P2Pj{|UcE&4RO8t6FlkC+W z<46~TvV3M1OCa{0P-x$xLfZRmu>xp{h6er*Yc)u!=r3)xDaa^7e(!<8hA^;N>ZGMv z%%NO&B*Twxu`4J1qszI_dtrbz=7iB(DXyP6b-kLl%50>~XM!S1F{s5B5=qFJ1zu)D zg%~MdEU(s&Byr5N^7{gccxt0=HH|5z7T{t_OlV5=WT8t5Mc5NXdH#U5@UMXE;}pA+ z9>DzCfgy^zO6*}!G5@4t=V8vkr^Xo@ERg9)2xOZz0}2#BAb(&u#C16z9P);6H(P7R zRy(FDCi-)>&5>jrnZm;hKiFDH{g?uU1eWZN@-;T3gR-gAD1;ez@2(^^Dk=x0r1q~8 zmzd`IbBcO~O%6y5uX8n%c_umJyC_8DneKb^SME_^=?EVkw5Q|*rG5!=80W2@zbE1M z8*#IuD|m=^w%LT?+mjF`Q$3!Y9Hu$&U9w zFA|588-k-x?88R#xXP0~VmW3}%gIwhW6utl1BUusxp{pG|6VEM(?K_#7eY1;Hc0!Q zZ?y8lR>kmXuog!k_liI$z6tCCLyY=fZ~xb8gdT$kCqQ|j5Qlmz`75dH95oAXJ!Ne+ zdOnRhCB3AH+gR?T*P!w38RL_d)5vZeRCMgM6vC{K8QVvuj%yw_FA+tIjgT{;&VG;7 zwJ&C@b*_6224pca4r?e=lB5-CI(8^kNi4P8>+mI{4SevL{hsZk@XE|&m1oxBSUSTl zY82IO0HJ(j&lN2(NtsN@J{&WNZC^b%+MGT`t{i(NJ9VCmu&uw z2zL|h>DsY8s~kcN(Pm`n6Ji%;8f1$c1is;7s;kH@?lmJd6>?@>=GL3{q}CcflYO?M zVKixB+dJC=D8XcV&6}g&2cI8i6`XTH*}0b7xYt_;taO7)L(Hu6fsR@N?FyX!W#k!O z1Zp5#1IMA&&!5_O-b)U{96!qiQxs#q4i6QzDVo@yx{eT~Y7aSVznDP0SGC4A+3JNG zb0&4leqW^*G^eZd;$ZTBUq2w0LnyXHH_IX8_XrQ%`nr}wMp>vuk-TwSoO?X(tBcK(3tj|kTpOS$FVr*4sN%>dbl+CxWL0pAW*Ar$7%_s zQ^VWy=P!B$P>S=r%D0+$MptbmM5rU#W{euksJwAk@WvKekKkY@iQsxOaAt2bwS~A> zT%ki!$2qw!lv$xtFR2*@V z_(cw2{C>gBgbR@3)Gy`%@W$9-^w#&5%cR8Maj6Vda`f;bY0OXkO!;)N~sBhlQ# z(qM8s0{?`8q6uQx(ypbFpy{=nyUlZhF^iQqv#bUg)7&bZKuGY~nONE?-S{C%Hc(G7 z=X?}i8*mlkM%vcnNZ7xW5mC<;=(JTA$3Yf5b>wKE*5SGv*R20^@hJ`sA#fO9_@V#P zBnKjYAuo_&&M*#b(qps(ZmM^y&`4<9TyQwH&}yXq{IkT2_0x`?3}h0W>*Mh64!7J( zF|?lnS; z+OEgDB%TTY+Uv6439?%NzZk8#ue;NHqi3T<0HL0-Krq}F2>Zb((s(@*MZTvTI-^4G zqe-#j(px%byxuPeNhh2pLI%ITTX!fAohSS9kb=(pK5JrUm}ZB=3TnEvHX)g>tot>GxbG(Q_jDcEjHfJitR zKN6hTWzAN`Plmq_E)<%hNl-^HH++y$M^>uhnh|>lubkqs_=W_G_+@N5!`nTliUkl7 zVrq4H4I#)lC~r9IULtHS6bqcoKdLm!5g5^aq*(ll>1m@3{ed8f9bY{wfYnUK>v&!y zjgRrL-xL*an0&M4Ol~xuh6Xq`)VE1jW0(I3cpY*ezQ3KKe!${Iq|uz~l(pAynkfhH zNHKXGQk%@YbYTqLEH_aT&R8J4i)%eErbD6ksZ);~uBs{ZvjL1RWJ+>x4}4m;VEG`_ z9Zg2n!;g$J+&>EmbU$uiSho%WEz}=0c;`^g9T$g75V0N9KAbQ8vQi3sj5PalHa~X! zMaY390tG`Z-7_EMIt7}Zb#{#G=r@JZVys7Oa#^%_!^79D8UQS#09j^5lKNNz8 z9;YZzjczE$D6u_yU<|sRjLFa5t2T@}U44fHQKQfor&^Pmq?_}Y#cK(2ArWM%$jU7{4O+6uJa*YBc9NrZ|fa9RXzS5r|PG%#ms5*n~pde`??ujOqh6 zM$em~B{gZuSRyBw;?Bp+dAS^?ZDQ=Ga+pJJc;9s&qB_=4AM;A5X)dn^LIK$Orb|4? zItgc7KTPGUperWER?uwVz3RjQ+NdwPR{D_&jw;<8Nikv^mn8^*!KQ~c3$6$lpC&Cd z4~;yFTR?&r5%dCwckz_&_j&sZVxl<7*xK~+U&WDj;s@9ZhbZ-hvIa1mdd=a3I^r20 zEE(7$Ly0b=hdzH9fyy4Hluc>cPsBq;nv++#;>E`8((+myCLrJNIU+{auZ z!7DlZETfuT@0Cf=v3)hgA#cCXbwGfQk~`zIi+eMHdW19g;9s+|;H8E>W5+L%j;ud7 zailHwzQLj+lyE-{8Bpv6iu=}F%vt8d`n7UU#Re_z9Rt4yu;Y;C&!xV8xqAL-pk?B7 zxd32Jc(`sT>bb!#cAP`MhGbga#>i#QaDY0NLe-G`o7uj#%ql+U&&jzjE8R+9ArA-H z8(W6Ca=_~`J?1xnuzqgj0Uu_`ST6fw!U(3ZIWuf5I1G*stAly?uJWof9Kg>fg^(H^ z2wy|>?{C7kgFdb^5g1$6>lcNImYsFUTOh2j=mc&{DeW@hDP`;eNG!+&jga3GN{?p!W;g3c(P9HJ8Bu=ZGh zLuF(&3d((!hK1h-_DlL^u&!`lg>;$U>A9zQ%zIN5XA;7;Umt#q?h|Kb<fF{lCT4}&X+g~rSD)Dl_?{jn*e4gkGXdb>b6Od-zYXAdnZw{1#lKH zY1Iv?l4Ugd@~_!XX*CjXHLC{w@@^zb(twATekh*28sI;gbP6cr#n)5Bm|RYvp&TH^ zd63p^-uUne@ySeF$fR7FOY4mvr|<&F=)8PFw4gXM%m8CxWgqw$)B9QI5_T+hh`?H9 zY!JcN`GXiluUGS?KptGkZ(2UFRrimYsd-d= zMj?kkx~SFILnaP!l%ZAX+Cr$KGDE^Pf8}Nw8e~w`%kyJq=7<_IoUECDN+|+JkSnIw z1sQ8a^WCTgl`Dv5GV|QiP6V zdOvMkDh+yyn7dirqBrd7rLH*>EbhxC@6r1FpAlQ!7CE3$-ZF~Jvn%P;eIKH4aaF3W zuTll?+K?-ltrGHFtgiYG6pAFy0IyGWzadE%BlY65`q$wDSebt~J%p(XPHe{)O9UHU zhg)JC5wUTVtx#0*92WnsN^(jSgt{&-f1jz$hirus!7k+*m}C(g>iv6+#kJ71-lC5zU|r`}HT!w#m>Q~|qovOlY6ZYj+O+zTQ=EPV;2)Yi%mglbyutL@PgbGi zb=k$l@O%JY{2Av`-8j+R`{}(EPU5AeAM7$3+3)3l@`K}q9%?6$wrs!fm75*v2!=%VKb)YUs4GV%v5qOK#CDrrBU=T9xKY%FreB`|DN^D+lax?i}flaKUc z?rMv#y;~EJ0WLlL_4uH`yu^=$Ef_*moX@Sw?YQf?`g7dvZ84{u1G|OJsUDt7V*Bw8 z5{Du(_gaS|9(_V~hMG9qQb`bgm*aP9h^E3QfC9;CT8@aPi^d|~lc(vMr#0p92LA>3 zlbtpxdWa(d!0w|?qx{O|ho2(lR#w7{C(()4%T{rq*PR(k(Z{N01XNnupK&w5!OSzs z^kv^$7|PQ2Q{q6jMJL~s>5-(Uk)$@Q@IPQc@+wJ}s6yIz7M_&^zxf$b^MzdzuszEmF-i#0-< z3QG#BHmC30GFjki1Y`eI67NfZ8qf8Uoo>G6;f?#Stbx-~Yd)kMQQH)DBnycCrBj|V zA5NW3JfNzd?wBsx%h1c^>ii-X75h+xT` zqXDjfyzvl4zi8N>ZFHeLU6Dw_4#5Pzd2W$!T?5zcrxg62MMlHIM~|zo8#r-3PKTmw zC_1~;dD5I~lH4+|ySBw;S4=ToP z`qKG#1tPw)FZfknXH}(p;Hi4e(3_*TChwSck-Nn;r)xsw`66+Hd3HkiNYhi;RP9bu zbk)g?b0$Ah|3NXjqdH#k6DsP8*r(#0YVEaQ6OOrkt{eAx^W$gKX4CmU)ba{Ck)alK z`8#i{)#9;7;(6fx#UH2L6+C&U5$Py!XGg=4RH^tnR(LcXjRV`hKd{q?u`QgLwn(#y?Asc^X+kLl8r6;9x4Rm~~eDo}rH zOK$x13|sj(N<-l#rLOqmpv%^nV!jt?Ya?LUF6S8NE!sXjG;Py37DK*qZXjmh6W?{Z zVYLgQ8n+qY;JT-G9ofnJT-$OKV27hC$$kR7Z0IO{*>wo3QdRUhohUA00m` z7#?ao6Eyvyzb!rs5WEyS*j(@1=;#4}fZsOnI!Rpff5Sx9n}R*{o8(3cCb9=F8S!Ia z-G$OKJID8B>b?a7epHMH_Oq@If4@{ani_HJ-`}Jd-_UHhC+X?*5~Y0hpDy;wJKF#U z3!dKhT%|JxYNL*sf{4w~Tp$Z{<;|D~`sZHXPXp-#hav(;sPuPD$H>5oC-KYJPdA5F ze?h-D^K`z-_&jsBwl>W#IAXU_*a!WqyVw&LPpu!cVS8V2bTFZxJ5=;JEJ`a&G#9PL zb;1R2qCCrdeG_f{&7Of>qm$+n=;H}Jy)TZwU;?qKnvKXSD_pKGchcFV3PKxs1?HBk z?&+L4mH&Hz*@k7mudm4KK9t9T+VC^dxu{}0@SAG;;>3$;ZGy2umo$G&e(w>*p-Mgs z#xaQ>DQ$96-JL!;h#wpE5P8f5Zh3*adR*NHEHK(+R+W|+ENv8g?UC7A0#9tHH`+}R zj{Ix0&)yZp8bLcY&QYQHA9`Xf#22N^#1U79r^kW4XFiRiu+rCuu6}WO>8Ic8dSWA) zqjUb5r{6C6`ra4^@Im8uS7KU1x>0nC~T`?nPc-w;#{we%(S*W`r-KR^xS#n zR49N+)BRJE4a=Qp+_%)kWNmX#Is{ra>sxBKg<0I%z|w)GS{fxZ?*R-UpG?KS7YBLW zGj3xx+@f)AkiG9AEMSWLtecuU^Q1~@MttI7<<~V#N#qB^cJ=I^fMym;TZ1;Ku9Bl+ z?xs@IM=4C9#XqV_CGyMPE=GJ#P*Ir#CRJ^gAKJUXO@+lE^Hh9iwPNO#x{xDE%t9*2 zY&0il_hHEy?IpB3;Zcl9bm4ccpkpU9dL?o1p`4lL-(aO|r07y!HtELY*bv}^xJ5?L zyj&}fx{?r~<#O5dk)H5zo}$abl>}4&CfMe-vvTfpc27zS!zg>k`D*rfZ;qVx!pWlB ziOv(_rZ-S^1*Qz0I&*x#x?uGC947GhQ8fr3^{~2!sXcxK*5x0MinryRS?zfv*n4a4 z>7TgUWL1Eh|LkKiAGSF(Stq^O=;%sJST03>0{9U;=1|=?J@hGB0yKiL+NM6X*xi%g zTc6(~C1gvDB1=k4Ill`eEOWyBSoC*NLa=A;7m*)~Y|!nn+hD#dLfA7Ib{bUS{M2-R zorAx8Eqt$&2mtwhPM?1NsbYkMjPcUaU)~96-D0UGq2K`gJ$YK8dmlftg^Temv+4RD zu?cXmt{dRk#83X`PJVFzKdm;hKXI9x%3u4HPwetlojseUMEcUa+GAfc7-olrTTxx* zhmMrMUqHnN969X~lQPwvw9y%bW%_&UhZqPX^EwpBx|3+*hkRx?>~?&rxwg5L$k=?M zq0&$Y=J3=O>6e|4J0aA$qe(CArgwk&e|I#viPt^<28C{l2&$iBk*(G+L~<%e?Xi`7k~?pAa3PfdG|`zh(W=adUjsyWTs|3MfJE*>kM zLWsMPDE<#=m8GRE<3~l^6Nf;0er#+Lsa4<4x$m3g2W5s&nKtZ;h|HNA3x0NUM4^tl zncTW@RK8dG#4+Q`6q(U*G?CwkcsHDzP-ya7`T>+VsEb|9YW`na$d?CnzY>D3|BISQVq;=}8PcvEe(HD#%; zek?s3WtX}X-OOOYEW;-ZT|L4bTn(>b#i9Wk zR^3&yy-1(6Vlzq^Va5r5$~ogJ_55kF)gtO*P2ibVHj@~X&03)%M4GUxjVTUwtH}oB z3iuZI#bjTu`xa4pKC^Ui1Q{y2zu}Fyy|n3nk7&to%m-+DK~*q4DuaHa_GxoLH^(PH zj2HHHo3}JcAS3%oeOsl#apqO{^OP+@8%w7BP>vn z$xlX7xY}(SOM_81%y8EIKHKa5_}h)S)bKK%Po5F>z)OxO(Rd)|JuT4?!oR!)8HX42K>?Dd1? zbhDdCfMeqX5V8NHf|-@+lE_tj%i;9T3{pxlV`1<;@2zvb_ubccdfcG>t~Iuku~y9f zrVZ*)=qcrf%YJ8LAblq#ok`?>T8bE$e3xt)*zzPdN-xsvd zG&P#RJKOtUV`>CiTm)Kf#89LSQW_BMzc085Ot~=Q$+OosiT^}^mM9459ef|AY5#?T zG)U?KFypk%S4Y@&!x|gFLc(`;2+5QA?=|K*!;G1FUKb$$ZHW|(VRaf#IQl=$;tH+7 zj5T~;D{ueX5+AN&Q$D;WHr{`_;ogGIuv&2PqH!$qpO)-tk}X9M|4`8VFA#mJ*d)FN zEnJTN&oxecpc(W)8MM`TyOP|M-^wAJZXkdmCI2iv{*L-27EuYrnimBK#Bk z6KD1OK3Kj&>)*VL*gP{e?tjy-uYLaAY_*pujdnX?8`l`*+5L<`@h**K?`#- zZ&uRD{^Nph5kz4g%1`r;%>R70stnA_kTtNp|DU-pY;vC!O+^3KyWwU>!6rAqsm`bW znV-NM+NM+r&i~E*H!xr6*j2IkKl4>sV?E(?)c^IQ(w1Z}XSv|6R{cNorhkp0%1Qj! zl|~Hk!}?OW`%U}*p2+9{VH~>EM}hzQ{|+wxLzxDoZ1nYc=9PU5hJ)h#N6r}i#~>P& zgf2*)8ZRV0W+xqW05&$ZI=c1<8@oO?-Ul>}!ng!$qblZCsb-ypS3i+9SdJ=A{`K(? z@1br6Qa9QU-RS4ox~UN45KFzrFz6cEGhXRl-otslzzHs!Ay4Bxgy0-f z1%I7E4cbBVb>4=tz5E6req2wRm>#ei9Ig8Qp$zKlnf7UDeb|15ZZ~lKmCm#jB|f5H zLQ2F7#d&JNG5Io!3eW`Iyc{OIe6;!L3PW4@(c`LXhVXQE&1W=t(}hLCc_cWQmU_L& zTjss|V_S^|zupJ?6}}!=yx4gRA``PW__o*jm^yRezK#b!D-atZqYaKStB2Gp_+xP1 z1s2}>7miv$mn>XP!b`gb|FOan5qk&Ysmx&bpi_i*>TbbL8$I?`S1>e~-zC_fzuU$R z=_$7GAvP`vQk4WIA%`k!zFbSbdR@+E^?6?k244$q20`RP?lu=wEk)n&rUxIQ{l172 zJmEE_$1u9Gc)hg{T$-!;1M90DF}siqb_n8+DLc;Aho1hYo(kSXuzXnQ4)D8&XI}1H z=G@?IgI_PF(2w({J~v`^q_?31ZbEBWZwYLLrRYK)pf-|sHa$hxUk!fjRh1Z-xY0Ay zb59*k{-ZucI%-PI^D|?wk`!AjQ+o`}^z1+;3!f)9@4EILYYcj87G!jaJN%)?7TXz5 z=dUm4PRE|kC`FnEgBTah9XQk zc(RQFOSQhCL{3*8)b}27xv*IjXYq1iaRwYdm67-(bC>sZi>Q;H(%FtPU3(d1hAIx@ zGi?*)${1lYrsVTjl2S#F?-X3;f$HkH4s8CsLKeKx;XSmPvKr_Z0K*Sje)sMo%wRDakpEk-)umwegxs}Mz2>tG8pe_CHTTXzc# zeTzdcbf?sLm_3tCwn>^`&BC$y~Tjpk9&+mEa z`oC9kN)6}cl0xTOkEB4;74N!uYgn@BlP}2r@%@HXA|)k(C=#er?0|(*r<<+l^>q8? z)b_#tO-JDcdf_Y!HL`V63;LT^*tEO;ivlF@fh#XFBp_uz;0aKNd*1iv4A;q;bYv^X z=N5VmejX1#Nymswf;~fLE!NH#MOB2Vq;2Q6?!c>HyICy5H6VAsTy@d{^C`XL6}{;2 zK@*83vO(0rwUhbvx9I^SLzFW)Nm5?*n@Kky?E`DvLTOKS?};7PF$7tKo*3#)A^!=# z=bsxb2YbCdsc^T73b#gz*kwEC^tRP~{@*ROjazx$KEwRE(yWK*$M*QJqsPyYpG z|LofSD6z$Fkl+ISjwiQNu!1oQ-etW3xWWhN(FC6LBJ5HB;Z=5|3+oA4Tfym zYR;FoNAGx_Aq_7qmbl%c1&5rzrbQ59HgGr_!Zj~~nG{Io8o=7gvvpye`Cj_8J`q5NWYM8VBmPTTaUZMoE?{0Wh zMG_4w8+{!Jf-Ag;VDf&>7f4&@Lyy}EM?$vStc0x-yfb1B+h=g_our|B{xS3PL;d~+S=`rI1V9k!vJ|7Y zXUG5U2pTT=5U$?H*?Tk3nSHZymtpakL20rLxc3Y8s}y{ueMt&fEG3eBOp{#O{_*r2 zY4H#lw+-FgK9%p1AH3P{SIk4MEzNEdQj=yN!>~OQB=r6&{>ot;dyMaA#+WjACny9ScrRNu-lnY_nJtei=3R zA_ux@8j7dWM+r)Q$myuFjKv!-gL=#M2-8bNc#S7=Yg2H4xhbXYY%NHB{J3Tk1$yaQQ|)^ zByk~ht+4l@cl)V#T5C?FlwVynWFX?LXfM`?#f_ZBBBRJ148d`}j(k4z5I=JWEXw`2 zc5U{mBJNc^vnY_5?Z11l=}zrcV!nX1a6Pp&ye6b04fT5O#%g@AHXsie4xZB}<*0SO z$M05Hz2Ymlj8`8&RY*D#31Qhev{ zbnj1Ie$$Jc!+3@-9ff|DNDNOb!xHf@^daC=R=#dd-dT`--sD-YGUrQwb(8{UC8cu5 zgCt z&-X*$v3p&WDkN5J^Y8Fb?I7OatE;zM zv-MxGZN8g!{3e(D$5LKs5L$p(7?(dVc5f-qfQy3P_cTWhojdEvlsxe{^dE-#DYvt* zn!z__%YM!Vl1-63PAYBT>EFud3cgBrr1=q|mg^zkUI z+Tscp>5WJ3&NGD%*(m7Ie*x0!;Nk1BFdK&y-JlBIHdVzr?Fvo+L9a?lj# zZKtfd$ttml6JaZwY#@h_6QRh1+4ikjzT|tvcSZt=bJ39NrYCW}Z>#=ue5FPLx{!|8 za2h9~fj)eG0ZG~EJmJ=dt#jxWWpAaQw^5#Ul1u(@KEo>5l2YxGIS=^ydj@JM$S8-N zP(wn9>gEv(=fpbVPn)PTOj?(MTFIRKjY!~R<#Q>wrJc9P1b>FhAl^sY#SR`Y{d944 zxCl!jV)Lt2x=7>b+73OgyXk>wM6@lLE)X7)O@3@OM;0##jb3hB^62_bqPA|oYh{rAVR>%u3Z z2-05xj$ELK$dp)F_xxEYu2{M;e8p#~*N1UGJ4;0*SAc&uaiQM80FKJ5&BP^neJ92^ zXerfnR#a){A4*o;@0aQ!Uw0$UVU;KQa*dXPllb3tb-K#FXG+nOwp3ats=Ul(v4yuF zoX20ZE7LC%NzaOcjGqYDc1x2WaFWo;#*4scwY)1luGQGALHxq$6(QnYC5h7oiTeFt zTaPROBJYG)6@oW+vHcFMGx}z;@cn!_Vz(QA1Ww!Zm*3p2RI?h=o4_F}mttJ+HDt`= zF34#F%%_QzbKg!*YVi)v6JVj*lS#R^C0Xv}mEa*FA}@~Kgz*Zui_O?##FwDUr%&-@ z)bf#r$4A45SJJB?QV9(H)WwKuVVgD~7wXf1E^3^vcbMe&zdrT%n`mBAZeLQyZA0p} z!SQkPWW}VnBGeUPr6RD+X~s(r_F4s&x9SLuIq-mxjJ}~%db}HCEc!8+pySVU8rXqr zttCPk;G`VX`C-E?I+E}obF{l!=Lw9Mh1wQVHd{5sJUf($nN=zcm6yC^gT7T|XBBZC z^1bO4Sr|0g1ncKFcnHZLoXSu`W*bhY)4cLHhRzseJ}<1zbA?7vLkcJ@{Z?i1>w;3n zP9DVXN>Ad7f7j@2gb#zlg0B9q{n-{bm;J?9OXU^hV6NvMHZip<;Nf>DN?+n5 zLSFH>o9nb*Dj>>3hxGzicFPFabL6adZ$($3)pqQ7Yz$)ZKxadW^+xCSt3b_I41{-V ze?K!*#Z*WmM=r&yy?YQYycRZ#Vnf5Is0cCBuv1>c5C_Ey=`QeEl9aP-D-OoUB@5&a z2y3!q5Brx!mK1|9aUnv+$#xoYknyYw5S#ipB1XFJFh-;p(!8Jhk)3~M|#z7 zU!h*Y_|#vJ^eD{S*gmiI6OamG)W4E&o<++YlIAb?-U?_B%`2K~&(Wodpfs|#vfG;- zek1JQkY?ie%9HR>S5;E@?bIQC-VxNgjFEt)__7-{w%fvrwjvS_Y{@T4D4p3vbmUph#Mnw6oZ15n{EhxL%q~mOe zPWB~VhjHsDKj^)am!WJ)NyB>GDP+S>eWOlvd%ICGUk^o6P9raDpKE-Ts3(j2GSu0i zH(jIh@;6scJ(3ALCIj0UzpflSoMx%ij-{z_OO{~-ouO!!jaHnOu>45+2!D|cN&6;@ z5Oks+_N_(~0PzOh1fPrt)sbI{7{KeZWNj}+^Ms(#Me1<*Tych{EK!$DtS%Lc7?LlZ z|3fJnyf!{{H#&VI^H4XiET*_yL0xBuB^*!)^M#sMjEACO0Ec32v;->BXF$c+#pP5o z9Vu(`Z+sSKz<ZnHBUg`5z+EP88Q zyI${lEBRDq!s7a=Q=sJuBN?cZ=xZ&kJC#Q^8>P~iEn zP`#z6UCE1kE}x7LJ1Q24j@VuwzpOaKU-_XP%SZr`KjG+igjVD6vTqvo>m~I$(5fo0 z!ZW|KY@pAEKtxfT5>vLH9C@0fLfJh9&!)kj%Dn%;xg>`I`_`3wI3#@YSe(8%LeA_Oqui1Jx2hhLX_arL;JNb&B2id zzm_R<2M)N9bZ&QZS1E%I+)Sz0S&9DQ!RP9hj72NYN3CbJBiQ>){cbi0&Dz>kxTlDI zIU){yDT)AG_($Yd=L#GL1GeaH>KkgB`UQ4Dx;Zm8C|cI((4+pKQRV#f#)21+->2pB z@`CnXhn6aH?_;jKCJ-W`z`wOg2>IG~zhrs|AInBD?<1`9GuinL8SmR!RlHC5A%KpE zESFh-O#*MoD`C`eU7+8iC5v(7cYDC_m%wK*Y2Ksb0Uck~jFi)kAld9)vy$qP4%}4R zXu2Y@@_}iWSoA7gg}ds8Nl0XmBVamm&)CS-ShJ*LJ60gQ^dn0!`NpicR0sY$s0xEE zgis~X1Yw?TTH_O9?;I!Qosjkcj}S!aweQxXzrDQcEI=GILCO(C5oQ~yuA+TYFOfB? z*zqh`iPo}So3L6P*HN1b`Phl~H<_?G;}3c&ObAjAa87=?vAgBheigi(i>|O*s@0FI z<%$LgLI*Xff{)Q!g5#lII-1hNt1AVLMSTY2e>HFZ3pgD`kT{+7JVBJ5tSa!UEN)fI zDw5WRBnTXow#49HTuqcO{;s=$YmGKeh28#hl0IX}n{{tDQoc&vbr$-CbBoZ$R!4s7 zc#pVDXFs?a&3nl8#00K&WAzyHtcou&BMtX@%lStT*_pqlSsuPJ)2LM$YzS&LCdx_Q zhwp9SnKpyF$~P%$2jaZ!;P?&>qGiwhlo%|rM4lHGzP%Htw-@q?75T`8D!of0hm5gp z&|$wQ<>-C!j^`UbGb^_t)`%ucWJr|;MW>w5TY3O&?TbmWFO*QzRyaND<+7|kW)Rg`ttti7%_bMiCR;*< z%pD;>cgnZ&P;zt93L{`Cpg6s=%aA&*B~%OgrDYYaiz?`9S|2y7j)d=*p^BUwYh%A% z?E<_eNHY#5!)EunO5Yz9kzV_sH!YB!yTU88SEUzWGha5+3nQ~5DsrAT)ov!T$>lnC zw=Kz9sa2|_eua;QQg$(>U8;4rg=Zj=idCj;X-j9i7};X zQUd=LdRmq^m=!)fC|qs0I#P?>Hja=mYY_w378O5VxjARJ*^z^R_EFPVSlAsE@A*dt z>%LtZIqNWB zHTgl8=m@5*X>aRJbmsRXS@tjRfAs1|>xg*8*i;h_{~0*D+{Io z)OI;557BWeo=laXbpRKLZ;&uo0B-nfNA*qPQJ1Z6q*k1xoO5-S?;-kYka6WhVWhWt z+-+pr>6L$!D1|x0%0;m8x*eoS;naxP4ZVdi9T=+=xs8zprBuw;8oHGSmNc5&vGeKw zz}>EBR<0N)EuG$Eb!W>jQU%!C{_0pd71T-iGUUu z6-cC9R5iX-^m`i(?Tx+)B?c9$tfqB;Z1lS;)3_}Zxef>aW<6`Mll?h$=D%=1e0&RJ?U)m05f9jw5as*C-sj?DI>dEy1*3MW~t#x_L_= zjftF0hK_Y83M0IGOjjE4-v;=(5Wl+GWDU;rnhjVYv|!H z)m>AAnKzl_oq#SwAjxh8SM!44%`|iJ%-z+RMg z<}aeJN=fY-AtA5UfwhS7ZjYI6Ypc4L{zoMJAbzUC5?9FfH>~mb?dPoumh+cE6jT%7 z*?@c(0X##7=LPU$pfy2-$+lf)^z>X=RWzjHnRW>8Sm+6CnmBrx?U_NZC3xV;EAn+e z$5_a9od1{7BSqG*9hQ6=7UsCJy={j~d4;tQZBA>@khDcR2IG71-zk#)H9NWw)fv@^ zpMkohCnWTa^$NkF+!P4yyY20~vT^l=Dn6bj;U1==g4`G2`SngnZ&2#{at5|FP^lWoN z({qjibfOGq>k;$AvTjJ-vohzCo%0i)c&QgyF8=eyqCB*klcF)m!f$ER{1%^P3Mtc2 z&21f)m|Q4fX5n|v(M{*b0ConOSaN@CZp``+O&dtMU)nQ-`dsV)mIiUBcYzJIn~~2? zikA95iAP1o;hVG;d&etAUF;he{PdD3R4bvve+QT*da%3;q25drx&Q$0KV=LKb|A1Jc!tQ+)*F}S3e(#HD3R_qaNx*4RFsC9J!cPueU z>>6_$Ya_7B;mj$DuEpia(&wGxnN{SiltV#Cw z^-zrSG^ZA!5lDDZQBZ^8X&FmGY(_rHH5IY11G^X`>%(%dAJOes38%c+VAeYM(b@_uX3VoG%>$0lCr8lD3VV7*- zw6&#p(XW#f@Zr|HAbiPs%;8`WXAUxM=xs! zNq>+6Z>xOhzy>eT`45yTBEs#5qRIfuVbm-+_Jsgx*B~NL&}A4QGu<-7K*}g>Pf``iPR0=ZWERt-JA3rXN5$84cFe* z!ZaD$Mi(&Y5E)THJRuvdnd@A@M(ff(-0Qy_IdZ_{7974i5>WSf;GU-?$@<$=1iySML4a;7KuX$*U7k>!G zmpP5ZTq%mCb+RzJW%LE^j;~h7B|2btslX-2x`TemW_*5m z6DtLqOGee4T|n8C_3HZc6^FO}t1+T9HDgIwo~IKyP;ua+_zT$A`K>6$qX~L}mY8c; zvF!&7@HI5%>QVcAJu=tkxR!P(x=HOv6Th~;13(&xgFaHvE3{e@5`_yNex0I}4Z$4| zvIUM=x{Oc8=cIZTgvrc*9R6(djcE%D5BP@ynOk<22kO$!BD3@;PZdAvggqz=ps>hY zl=^#=7mq!PXCv>77ji8`U|%(H(zfl*J50$6N!i2fiZ8;)OAILnTcBqId`g2ca{}O? zwvnP*g7mU}%$_sOaozE*OFv`M)5zH5?J6!~mrBelBut3=-I+&3gJj)(`YrvW(taIN z2XI#e_aLCY@GP+??(VOKk+@E$HJho+(eSXg42)nL@a&PfO@0kg>8I2nKT-J>y z>M&5~nDNJ7sHrfyeY0Kk8{%T-zX3@&)AO`#+STSkM1Nl8jy}7=sIZX@GxUU&^7R=9 zZx995?|Fai>qrV{eZ!Xjh~R{BSVqG{vhp~y+%oPQO>V+rrYU&G?!lYD9%BWZ9>d6= z6G);U$U0PF^q2XmOWj>t010u^=OnkH{(|Exlllj?9C995rIQWixC0%g^N!5P4onG{ zhFHkgc#Ri2WJcN?glW~&th*{&^i2EUQoAQBGT@iJU9tio}nRE0Ben!7+M)@7X#kWCecynwSj8n+``nI z>&YTUJ`*0<=* zkGQc;{y(c_~$oVWkdvBn7#MW6O^;+2*c%h zc#;RM5m>++osyOnvRA(8>c{e6Z1$Tq{pZw&V6g3k8U}c67|RsOOc{lcEm3K^wWQHs zNXFyo>hcrpTVZvZrIl2z?i}y?gL~0;P__5>%^s|H)z43OPOlD{_Bss0KpyMei>R+q zVO}mM`|h839vufLo1>LvqF~mcXsLAfIkuehQa8#m-IP7aY0cZsLD!F)tKUPW6|(i_ zU!T4_?3JB5VtG*u3_iuAL4r`tx=t*BC;r^J>p4X=IN8=_ixs&a;9l>7M7%83Q~(h2RPvlP#v8QJvk4O7Z>X$!hmOPI#~>tDad@n!Pom zMB=%ll^R?Mz}#q4eY&gN{n6&z3_vd+m$>0V1-tcZI6w|2&GV?Dr;d#LXf$`;#m>)w zk3}25Be4lQ#XE?V_UuMQbexnpuLw&7&DBlJE|{+ub3sb#WloP_@6sB?4SGb1YY5au zZan+Pt4LD9ZA92VMAGrEl?HG?bPyce29wKo`{Dg8}rT_GD5 zo>7#Lfs~hY$6GtZ$zYbn3H^ghO6W`p$BYV64Vm+|gm>67jT#qXX08U6^XB!AQ1nej zd*YT7j=AY^@EnYyt;B8%6NGl?uW1PxiGBoEs#{{%hG75NTA}Q}6&!a^%!~B%u|^XD zg5CApKo9Zw3@AQ)VLs!@b9f6EcjHrg<;Ldyt`_|sxCDC8o5CY1D60*>vKANi?0I@% zyq0s#aK$!dZs~wB)SWNvMt$+;q0C=L{n7j~W7p^yN=jM^X|?ljFG~s>dtJolpRKaE zyTj9YFKVB{vl6O$%2HcNdBsOp_NXaNx~McX!wx~q$sn?Ztff4)!}T#bx3t8rQ1 zj7U7tD2>hPH~?quJNxQTJ7=BH?Q0Ef8Dl-cF$sqbbnx14FY?x~@c|r*hnpnzyNW7( z{b1+)OMfjapeik;harx-O}{*t%)>0_mb{P!ciyOyJDu-l+R!_*zbp`v-k`K~%aUvP z^F-QoPZdu6rHn5)d^8G13;cDtZ&9)k-ug%$#c}m@sc5I$1te<{K@VKD@r!#$ZeoLGEwV|) zF`O$#kqmu`Y%6j|-$afDx_U?yR3(X2)do27p`HhxG_?%K(-fB;=Z~{4 zjvK|bcW5*4KbB4QQP+T;l&U*qg-XFWw0V>2_*4gZbKLyiTbB}%FOvBHFUZnGQahg;Nb zXZbnZ&XGh)Mf@AC+_hiPzNq;ZIGg)AbrF66@|3^Q=j2+owjRmiW*D$?of~RuR51sT zWIe)WH)u;F)%y3t3(F>Nnn{X-N73O|Lp1Rvb>&e_P(2HDxN%KGOTAf9vR~C6-TC9! zl>BQ`6Pogz5I4@_S0}WK+PM^zgo0LtwT+XqOBeItN3EPc2z^)2@jf%)IiIpG zEp}|OAR;By{P{}!w?Cd|KDHxLuT1W;{jATypMHj=^*Q+!2Q01K35hN>Z`AlhK+`sf z!CoO)J>6qNL1DV%{!K55aLz&x<%^JR-*42>^iYV8Ppl;Jhnt@mfizi0JY@eXgL0 z`s^{M@3-c!BpVM?uE^4TKW|(UW-s_ye; zg&LYeWnB^J$?xX#6wg#KbuM0*ax4abU2v!xQ`ONQuM)V2y-TOp81CY1O2 zDtqJ`TG~;=lwbtCv|k8vo$-#}KIo2*ThvwQ*r`)iHD;He0|eA0b?*qB?eGbt?BZ#_ z6xGUAb#;*lq_o@&IW=P@H@4}c%q&%>?997ANWYKeNdUTai0BC^>1>Mmfhmk$NQr}5 z6G*~(i77l}EIJaQ>7{xopfR|`rSJSw@!7oM%qfq&2tIr+bT;$v#y-F&{Pk&IpLtz( zMiMz3BHotb!!Z}6z=4wLy-4Nth&d6PPk}U>E^^63PFRY;~z>RisX1?ekm#k;Wy4H^X6wDq|4mNGJCQyejWS)a=>nf&HJs+S z71=7|0{zSS=%v44KIiT%N^FB{j%y2GvOvOW##;x0q1h_fS%*%|!bJur;al$oANdZ2 zpnR$e*EZ&F?*z()VBfkK7lVZ>)Ip6@Cu5UbB-kc&&@+LVb&`FCv(09#3wxc1aN>@m z`03QuS3HSqbE>lK zQiIQz3nu}OmO}vU)>|c`vQ3xxPdLbjkMmw4eeE`mpz?0VRTC%oaHS+2!TW;WEk@Sul zrk4{jJru|k>9$DqTP5I>{~=M6)3Obf?zgO`P|rC;d}8m+0W3568>58bOd3mQkumL01oZsJ0u5 zF=0dmE_B{3_~p?!toUJ>$=p5g5lVK;p2yGs5WSUQYSYSZ*0#`bT4(;8O*YnGZ-#`w zy#P?3c(pgk3tr#?G9q;J4a&{ibc7)4p<0iG$9(|)MRtM?>OUe2goVHSF@cqU>b(9Y zsne_z?1JaMmYI@6Q{%d>*`ea_tdYg=v2R@SO8PM2kGgwBG|4Vg$h?NYl!9VN?Dg0k zVfw@SjRir!ubv=!iFu!X`NfAvY8B|XThrUVRGg0~)ekvCe}@kfJFJ*V=j^*jG;;JC zK_3duru9Vta()c#^7&cpZ!uz%pi_O0xr3pyM%K~of3nq;2}UWU7Fb>GRAJdBe0llj zw=o9vHdCu%+fyWm4grTG_Nc}%4uf5mg{iivwryiE-Or_zJpO1GX1De660#_^G^-y- z6vIKvHZ|G1o?>LyvL%R|W(`-Y4pl=@=ki1Zal?yJKs|$eII2?Q6|@vSJtB}paH9H! zCYRA?7Froszz2Z|b4J0Z{<1%hy>Mbtg>?neJC$2`qD;=f6s?`&dP9t%_^6cq{mAbl zgK=rR;HLhQE_pYC31%|U4fhbNbUGFp|8&!*cwHpDQmdyO^=5!C7KRhGoqG`nFQF*C zme0-<#qgt8sm3I=4I#tQnl~Y3Sz5=E214i^A6)=rPLTnxRTgm$k$#6KK%oP@b<_xp>Tbo6MipXr z0hKY5+qWIEn_23l3I^!nd?2n8)`TDIX=$UxyyI%xd-wRBT&@v`DmEq8x=Bl7*aOhm z?@mt@;rgyluEKiU9+~&F%*I(Q_--crQ)|z%QFzIz^H+-@qn?C`6F1v<+IQsbN*_8C0TBZu6{G z_|}wuE;36+l}dKKiuR6{Bz8X{L?KyF@r@5(AobP>%y1fre4E+T`Z_Q9WGG5MaYdZ^ z>qY#U2S3lHGHB~m<@FzmLtnlFn_XvT3fW`~BNM1sNmir7`jt*7*Eo|>8wIE=98$pz zM<%Svk6m97wd=RBw&n13QYvghI2(i8$F3&B8n`N~y@4i8_?e{`s;1(O&0%fPnCgfHLYV_Evi?Kq&2|ejnhn?agp`xX|2t`23)^@G`h5Wz2=@d;z!I zfm*(EE(z_jK)9yY--_4=>EKxz(Cl@#cRJfXML;*A%gLq88kD_5|*avKB5>B0` z++)99!rFM7$_=JFb0oYe0w$E^Mb)t-p-zPhKXqt`5ITVACl5pdHGuW6;l9?28hMo! zxd^P4>iuow=Y|&s&Z%f5VLr$TrF?WBRFsi$0Oj%XN~QLv!^x)ISQDv|eL5EF%Wh!D zcOP)Qp1WTkhP~C*@SY6){%XVL|v|& zg^CerJSHYg8%6Vd<{Zz5Z7qp}HtI+uc;*cVmF@;>TB~R~h283S^9R9i$PuY5GLJ=` zHDFr{A0EPeF|*pbunqerJye|$hpbYJLEXSu$S1)Df;W;nl@w&=DL(*q zk)xz+Vr}_SI?V7Hw2(I@>QjmvHOeTiJ$omHcjW_#%`4Ky4SQ_C74{&CIAlz)yan(v z-P|KgXs_(`C{Dm;xY()kytX$FKME_KuSf=q2yx>O^Bm|W2AXds{9WI$qCxaVm=oZ` zUP^R8%7fFJb-wtVSF%&qu0*|GIlc9(V-~*K)_W&7ltkn7&p^{qlG(myM~ooI)x^$G z^sa*uA!ep)UBiO8)?0PY91z>ORy#a4jfHQb8GL#(A9Pnu8PRx|{|ay;?+&5Pyc^9r zFX21+Nh8zpt_lsEa`v9F{TW_xvut^L0gH@gSM4= ztL39ZXMJxqUt450S}eGR-aV>?V^uO8vTWUf$TMclkG}C3yw!xsn?FYO@XuXeM4E z5q(hkK3Mkgu6%KcR^n&H2fv&lTqESpQ%e&cD|h|vqmPq_h*$GL&OdZe5|a?e>#!DI zv9z0Zx}Ga2Ou3tak==i={>+S7#U_qQs16#|@b3dD3deW<{SMx^k|6GRxt+v9M?Aer z%z0S}T4U|F(Ov$^2wgCzxTt9C8xEDQl0FyWlJ;}a=yb7woOFHmuM7wBi4Nv0e_9~2 zhr0aT1Bun)l?Sx)0nUH7cR;A$Vxf!Q%=cN#_Mhxik_W^h_l|7)-W4Z(_J6E9X>mGe zc7l3;%26cGS;d~oY$pV`O3VyS^Tf+CHsN#qSj`k^?fFzGFh`8ljz_QR>}GOu$R^rK z{jLv$nV~>UiD>~bjL(QIZ8@xh{(L3nxEc*hS_?1cMU`|y$kXTHwNn8n#tO7(DG}R$ zN!|wBB_aln5OZzJ3kPYC_SqZ*wWtPDvGJcT+IwFHu!ASD3U`9(9SWnTD!e1PUh7(N z8CI7E6BnLXyQ;%ZJ*@Rz(0k~3&cvU`JX#G_6C7a5f6_X%zSJY-0JbjWhi6Vrl`k=W z)ahVv2^gI$wcYn;k9jUsyCJ~TwaFj!$LQH+upp=dpVW)R7LawniJtA7#mJ|<;KTb- zwO%2nj%nwa-eJ6%badBYglJ7QB$#hr5Wh4~K2W|s#S4A59$#wdaOsFLbOozGi!+nZ zxwo@{v%zz`k2=>f_rpd7LJx8z(z<|e2d`ciYY&gv=DXMaCu3zPI^I0ER{>j(=?i*_ z8FAHSQNnrRg;P}8Ea8~&zu7RsTy%KIoV_gtyn!K%JJV$N(|42Ph_C{ zeToN?=@|j3#?Jh~0nIT3{jc7muAD&;4}T?FHw4$IW_45Tj??S1<3zvN{`bfx#P*^` z&U(up8MImOZ|ru|Wgc9#`-%^!GEbw;6M4$E&Mtg@`?wtfA84Op$FrN4wLPhC*6x{| zP3|!ZOB(b^7J8Y)cF}bR`fquUF%oH!3x&PxC;oEQAIv3FNdZARO|uyIXs30_=^Q;NI0wG?*>l;U38Eog%k_u}qu!JXnxaSO$@f7tt+ ztMB^1JJ(@kgg0|Z=34WaF~7miHK9<=1&nLo`AH5#L*jc5>ilpIE<|8C3w zO>V}!s*(H>yoju~&^XSU=}zuiHK~^4mbnS8WAQb7MQGr1rE`+Xn;oF!wclf^yltp> zo%)jS0+X8=ugSNm$$d-O5N^7J#;@4>&TYq0VQCHc3W zUni?;9@+zlC=X_H{7udKHMZ093T{3kCcbNpD=*^|p%Li@RU=2fO4!@NRgdA7KUzNy z#hmOD@nJHaVKlJ#218dQ4zhMykEaEl_Q|#bQC*bQ;72p_v@Mg2{png-Pe1;v@+SCc zp1fw%+%9&vs;QN?`){6NW9<@4@zm~!~L!XNQTkKPN)$8}a8p!PL@k21~fOSr+F5SBa{@U7h;A8@6)?P703{172Z!_E4@}iFJ*8H-M zg(gi_`zL9FKW)X|q|-H*JQ->2AKNERQn#T)B%<|a?97_d&swOiJ`jCNMOlf?_Fg`t zuQh7|3t3+bHK{y3&<>YYr5|G(0yQ7!+vv=zLRF3@sJ}x8OsnbDL=KjZbEh@YAd_Ntruk7gVt{v|``5oKKlyyG(`rXdkFUThd zuikTFnwZD9UC-;UbQ+qoeGn{vf&m(|i)#qSre@4TvEvcN^CIt(`3z}X<5{um&M4?o z=FQuFBnmObB$T*0C}-}i4$jUCFPebLYgZOvp$Q+DtZ_o`$FqGEU_(6PExhVC@Nwp~ z>flU6xri|Py4>nix4;F-9Pu*LBYqKBc?7ro!If&@r5L@$I>|9J05MP^+F zdhxz26noCRd1#+t5-yvmlM~Td*~wqU|J3b>HTj|FltAUr>xy#~Ud# zXJ@@Lxiy{WqFjEWY9jRJ7&Y~8Z0}K%+mman3r17x?~2yJO|QIAMoa!KQ^nu2AmQ9z zTEH6i$F>?5Y`r)(e4LD87u7|pF8maAdB5@#gCsMLR79EIUKB!QoNOU3qN51!h-ZX| z&km{2Y)_uzFP}!3eESH6{(0j?SPbRi0R+?@TbBgRJiS|oN(s8$-1OJ>b6$);%V|y6 zkJ0E}JXxJKI%mHl#6>~Y#Cj$TJC*u6DX7wqp zA@xgxz0^N3&qmA=Fg`=FVss8k1{q8*IUUOvVl0x(3C1JsrLbs)Y(D`$2*+0Sw>VCg z7I}ZuRp%|e^*L-cP*-nRzpiY$Xua8~^nNnPrU=VQI^hcPp)zJPnhRp+QVL_k=yS6 zh?A)md|I2@INM-oHg5USh`>M|MCCIspkngt*y7Rqzh5m`rZj`r{!@W`YjXD8y6T^$ zlWZNg*=%;LiPoU3bt6x!A>+-)4b*?_qUfmtp+ec1;R)7a-f>@Iu+}KQ@_U+W3T`@b z{E`6n{y%E7_udAJpK{pN`a)jj?%!!;@|N;8SQLDHukob34Mp6bpU zoUHqX`A&ZQ^S>4UXo1gouo{1ko|FIDDL4pZXc;`P-;@p(9tdpT^ct5su6Ca7{zJI% z6?W(^^cGpBcf>jR_}gsF)Q(@!*LPaJ{+X^nc<26@CB-GELIz82>*q+{GVc~&r&X`L zu#k7yhNqt?UzVY3RiGr$KpB`2K+t$X@IP9?DNG3Xzn5|T@3H(>kobSX zVY5A)gXo;J!O9)uKMoL#c(A64Pq4!;`u4vew1b}E0Rs_WI%LqsK-Kq8O$)Rf%_jZp zjNU2LE5`rA{~L;#B7F|RU7&A+b)#ATqg6~vzwK#6*ZT0k?|cD^#s7Pm`u`rwf9I`lpXcc-z8C+_<*4|aDAiQgwrd(TAD z0QU?}VN-%0E1%q9a#r9C%y;N(@&40Afsh_#cXyieJr3LSmQo(Y7uPS?F|*ETF%#B2 zR&0w8xHN&~>z*dN-jn$M7sUc|U$CNl{>xgS1=_$^7}Y-B!m$70x3FOD3kAXbf5{sh zgxOc;D$G{#&3^`AYJB%~mH+d=CzzCh9#_4VH`!vi;~uSQ^E$Ag_6U5L@#vSG#EZ^zzh&JcJHN8_Eo7{(uHQocFUyinSep1 zTZOIL*njMnRgY)xlosWt4t==quQr2_)#J|7WQ>E)&ROTPPKN)>eKcR^MNITNgDnh9 zP^H(nE&G2EnRQr=Gi#;qsjWx35lnRPFxa?hY+|c)PAX$P@whHC?r5X9@Y>H@Kt3df zVJ~$wLWw;$dwgB@+q)e8_Xtz+WPz{hM`o|7d*M675-oAazo&h%u8IKj`roh653Jky zMbyCSHh#jfgJ*ePmIvqmun2)CzaFpJJhO>m_;}ra>v}Hm{C!>7Bh-J*;P-Et z`@ZPuJ6Ktq_DlG%47+ne-W)Kgd-hiBVLA?DkGK;WiYa=7_itFuueRdW-0CeX1rF(6 zzx;zu`MK-icl7jA54IoYT|c8JSMz}khn{C7Zs0!b-EN%MmL}XA%|QMym)XQp6|BM@ zu#ZkKCcw4wJFumfuu|Oud$MQJX}&JY%@Kyzn0LeNaC|?xpY-?Z*@ht?>u^S#P8qN# zNtFRRktg%n!ZZf@{QZ&58nz^IheZ_y^6kRVi>@g=xj9|=EKJyqE4YqvPTSsc+i~vu z_~<`wYvckQ;P7+uAAwVUZB#z`FEwS;{}u1?e|CRyjMiT@gThRLR!*X^3E1^Ef*!i+ z+{I0=N|($sw8qKQIOv1#U@Qf)ZL?OGCf7c!W)zj`1sdMO^G&A4>Ai_K6bg7^;v9*i z&S{q>$wRZk(D)-!gKMqR`zFgTpI}Sv{yrwhK`tn|vp4DjN1^)<3M|Su+xJBrB3Z7| z4YFKk6cF1ZOgv}P*XyMT$bVA7s*8hPk)2>zNR2*HP~cMNzRWjuemYxX_lF{9^*B5X z>TD*sWbBY5asvj#MNUi$+itu5J);g%c&u*1f<$K8CC@($uG6urkK#-n5Hv)b-TMNI zee*3T$o}iDcoTuRSsY!w5!3G>-+^3Tqx}HPx_$@YW9OC+ld|Hfe|>OD3vt4Khk_`C z{&Pw7K)h!OW;q__As+O+$`plwMntt4e-L-LRa(8Kx%X?ddol;~Mj)Nyr8G-lJaN*S zK979vCW=vDaK;lCH(JsFW)HrfUc~ml>+2=^6P-Y4;uvt9N!=p_3ss@$S*M0F z!-^rw4o0)!i%wI{-h{xkZp8IJk3t*ws`oF{uqx-x5PVgp>tBdsiKYwFDf(%feU$Mk z6Q`E!E@^lJqMPv8Ol#l!$kx?gin}&F*N%-mpqr>-%}_7^T+XQbN4hWmP41<#6ah>!!@j%hVhX^EUU#l1uD|2xc>vf(Kq{PPrSRCIEUiSMY&Ngen{;L?%# zyW)|O@q^~!ZL#Qe30}+TdWW}TKdu~ssqgw_*5^v}cyvaT_EEz#O{BDV9-@#W?*53C zKs3_*=-@CQrYzj~CT;Jpb1)D)g`2?6Q5B7m5sAI2^SUBBSnBOKI#)Xdtwl}UaqT*0jMM*yI?I8p)ic`nvQBp-wUS7 z;3rKzgOO*txCYsUzdYMhLlJ32V5^xyVSRf3&f_F(Mwa=NgzlX%{E8bT9+{>3aE$0! zC|dqr)cEia4Mg<`+d!kPN-^C9hx9m7WU#}gB$5#V-sSy6jKV?8GV{9>2XY`55j^NF-1HCP$EV zC{=iju#>fEF%`^WQ$Z2(IAfi_SSoBIQuvcR>yy5+T4aH8m9)M|$3`>C7qzAt!^V*f zhpPv<(r#+~lx9Wf6v5&;r#y879q^ESWylI3WxQYPF)T9Aj^6lNKxr&G6Hs)dbGPWu*IYn|l?HQ%Mv;C|J`Fxi9W`bEw&&xkB^-4*px|{sYAlKsWwhZGcIG)KM6?Tq zU4JT*Zp;w5ej8ggdAd9 z{kHl$Fq}^3e|f`pwhtUN@`aUaFq>PROwr8Olw*i}k3K_R$2U#1oaI*Y8qvxt!xYl@kB}fRG zoJ~!_Ghvdp0@TW@t%=jZwRgyPOE1?eCt{@d1*g}yO=_k=b62@~>9(g;`^vnt!7Sf^ zw5ovIn1fyeH1l4Ubrxxp7@@2_?+536vbA3Yzc*fiy>_x{FPIW!m_ZfQa~JWo5Ql`t z`7L3`rwA9&J~YnV!CPJe<8sbwK1z`_a}p3; zZ@E}}9|8mNEm`?8K>{ZSB7a?A26L6q4cbSxw7;gVP@Hue`Xw>j_Xol|R-&o-orh0y zT~ls%Si_~mMOR$)BfT6&o=_ZfT`A3{pbzFIQIVHcqfwb0r!}b({p_i2EMnJQ6WeBvGW6(QjxTQn#51CFPu2x4nHEt6ot5fa9Ta99Tl1vwDG!m+WXR%g+Q33 zr?5=(?HuM=DLur_%1y(1_^4+$*l0yc@IW}hqBs0$G9N0WA<|YOTjlqxyoO4e;a~=O zg&StkJ7z1b;l*tdNbeHMXXXpNZMvwvpmPvnC;sj`IgIR{U({i;MI%}$wdQ&Ht?J2E z_``w}?Sle2mjX-=>xq#x=hRjc4>8yRERZ1T@N?GhPdik`2vV?ueQz3DOX_!B#1fdi zjR4j?d_zrla5h0S7#1^trjghHjqeq7+=%21`J4^mTYD7_wNu|wKxTntTR0`=Sx`+| zru`T0D`Cf3x+G;~TfxZLB7nOyu z%4LuS`|`)(OE$jhpKhH95H;wOHmKEAhU51^YG|4~2N8s0jWC(RGhh?HwnfiUG9KNJ zhCf~kE)AMFjs>7Y!s(GBTtCyP0|DHh4MeW0Y+Jm-U!+iciY6_@G|RTC>zN)6+uRAQ z(B1EJ?jcQ~;kGMc=WgUez82O3_w(Z2HK8DQO8lfK6B5Pdna4X6u~}o#9jh7D=HyhE zaQv1G>zvkYFQ_8y=K$XqPS^bYTO>4g%}s=)lIB@bcwTdXmK&b!6lyujKNq{uzM$a@`AlUxAIBC&xd-AQ5q~L`BD%Mbu-$+dR>g5uKG68wLK&GVXq@OAFmlUxac86oj@!OiH&NYAEEW| zoXGvRwifr*kq)ycco>}vOZ%OE83h$<>2*;pDw<9!Vl{yXe86%w=8p%k z`(TZsNX|4c4?zD^7fH6qBW`7aVnzmrIAH zWPPPRjTkRs=C=%|nKBBVOI-h2(zdGykci~xM@0%MUKNzH^seP3${?8JFtfH)P-!5= z#1Jn9!~$cu)hh)-;|w^I`BzX(xd4+*5tRHSw1OArKC9mIy3W4t=KA!DOW${Cnr5CLbU8G! zM0~f(^z9|z(^>Xt-C?I=2Eihsp%jxzolS||9wjkjSgMG)t>>O{%@*ERl_m}oWzTcz zj#iY$nMq)sMivEyLyBO)`bxogq)i{oK|P5KgTN8% z+N9eJm&35DVSMw5XAhm)#wO)GE~TZ6!XYDht3|`#_nOHUIS2KV{O_Xkw;z)Q z#%!*yp2xpRouZ!`lZiO6vDoSo6!}3&x=^rX>Anb)-z{^MDhqJ^7;21b1P)j&6PcfU z^C8)G(`5QSBAssG1C32VtH)b~+6}QWrU&wV(Dck$CE7+4dp=a-*ooKx@nq$z$IKq^ z*MmDEY|UAbQG(vIOZ-z9U6_JRkYmoeCPfZ;LhWIELk_|><{4xDO?YdA*8Lv|ykZ}U zF6?YYd|{WtfHTZ@SbpSU-oleKw z*+PD4%OB=z#Wer<+OV4|m1rmvMD_gng!3LWgIrkT1fYh{G`HhWQUq|;ph3>t8;EGC z(X4?gS5mofGq@U%1M&JfuE~aK44F^`PAuVuCihCAquXYbNlfk3&n-h%J9#JUYi#Uwa=ZeqDHWto;=iOcdQGSuzh^>VTBZ04a7;sRle;G5X3XMNxj~`)y4A`2m`y zK!A7g*-J9DviB#749Gtv5M3|a5x%j=_l-UVDn1owd)j|YSvGT=e{$nr)_l5)vF9YZ zqg2zs=)n5Rq&37S+T(AL_QLJU8Qm+tERW)J1VZhMM~A)-%FG$!%4d$YDF1TUX5UfG z6Wq>efX_v_tiZ1zQ0mxkO8L1c-@?$+&Kh^SlkS}7Q6XaCMJ~Yom)@XML4|hL)`Xm z>ahfwp^WawJsC%7GDws8Xs29!poGYD#JaI2&tRqYOfParKxVIGPAl~hP&mrB3Z`t@!X}AkkGG@~ zt)BDokulif@R9uh{FM1>7frPYLi{(mMysV}CN@ZFF@KX$a0r1qU2>^nWg5c0oJ8Wc zx{O{-ja$7#g2a?4RWfv}hU(^TNo*89TJ+k^i9*)QaO|`@dyEUWXT>DNtLLgzLMBY~ zDD;$a7eUB-cyGw?H!f3+VOc}Mu$wl)t#_e?S)_#{TQxt^#Jfj@IR;Fqz6N3QSh-b3 z)o13;!klQ}XB1GcKZGYs<2M0@a0uQ9PX#e%w`fOx+;;s1dHO9O-@^X6(Bdx%#B(lK z4RPFr@JqFGo=l^uJ@&Yh(DAQIPxj=)#Sf;xIF@BgB6`{6Gi26FEy#xwM7zHYaw-KB zZ|!=7q4_(aToek*02{tbkPWq8SY`|f8|KGA`w%U{Cv*u(luoDRd|e_cuha9guSrF` z(`P+AQT>MYef!{OVbvLT%EXSzhnyj|dP6^ncg7-y8JHG4WduBZeoM<9>Yw7o3-tA_ zb`E&e4Viz*!1K*XFNhu=mJO553F8j}t7BhV%Wc zOTGT36 zW+%0kVi5I({^^L=BEDwoMWd-awX|#b*)MZFed22}QFEp(S~hki33SDAjU%L*FyVEi zXwGHN$;Z#kQenMjZ+7~DTZB40Vqwx2pQVlh>YO)=P9Yhq@}GFfAxvN!m9*$)6nD=+ za<0nde1GWdpl%2;c#Co|o@^R|&X}RDJ;Po4=S}uB@>MV|up+u@i0y@jjFaZ^17%NK z=V$+D7r`>)I=?{z z3|jOq(E^b>%zs{x8J z_pac{AdGDN;q-u^a;{!)5PK(&Jv5(DuViTvvU$NIqX3j*WHvBD`tk>UE^K+vl5M)N z>VyujLRt_#Kvb)i*CHY69@hwL9d~Py1JvD>m*VV(i*Z#^Y4NSPh&2ihy`mP@z0=S{ zN!29vMc%4^;Qyd`j3gG3@b+8v4~)VLNr}?3FB9qbZ-e0&%~>rElr_juC!%UIZ1=YE z?0hFpH<@)YQhTScFpNjo0D3C-!ZrvP#KL5cYSAXA<19gZ1Mos|W;)e76)ey{Ci8gf zMXVP@Y12mS`)ML!K{M3-Wi*S290JKRbCe~woH@KM)12L?7TL-Q_cYH}crHZe5ep~vos@SP~7l@_CvVDtgMd++rXgAw1SoVBBK z+PZNFQLqWYn5+hlc2?-nNH-oruad?BUM~49%~f+Y6gI_UU=K;Hvyq81g(v2gd#x;k z0=f8TkNpEkb1Z)d&b>QDlDj_s5%@;x<~2c$W}&1n{je6k0qe_zde%h|{F6gVG`Ek5 z7c;$n7^qZb#;Fly9pR*vY?W;)=Sb3NiEkBB&8-PWfzN5?M|v=a*&aW?Mo_zUdG)J* z(bOWBDFX|TydD^!kQcmdKf6Em)aLHYb`48+R|xzY<_qx#aac9PO{tca?LBTf3IAey zm~@){Y}dN7cBZYRtlR#J>JI}EO4`0;mOp_;#F1PKwdj@3$2S9yG6H;%Puek3GE|#F zi;20PaCJ?d4h6NuTq!yV-o%oIyWDan7M`!leHqfgDW3585I(Rt)c{dC63dWS5QUvn zl4+wSoqJv&`keuUeLL&oQ zf2pq}x=yc=%rMPvkg>3Q0^+v4{f+a2t0D|L>Y?y%sg)Ui47*Io=ipUWTOc9V?}jSv zkm0iCOSqd-5}9{jxx>+T5CSilihm~M?kpEmk)yg00uwjQNH;F$ zGi-^~lKOS(^h$tcrwwJt}RH^#_JKMld_0 zOc}6=a%B-kj^`AGBJh!vI^t>Lnz&wY zx^KPZs+>=%CcaAyZbaiAu+F8+FFTLr?7r({@HSVJ7Gkp~kcxTZN6Rxov#0&_Ln8qt zB=0?w-sU0TTn9-!GF2*isHs7sX1ZC17${L{H_53PIq?_5%m^t7E0;}{Yz&Y{2kHdb z_Fxv;NoK<9CH2H7)4yL1;%DdhJ{>(0rT4FogUP)+>Ywd|qa-jCk-ASD9Y_l}C0`h0 znLM&aFa@DA{zXH1;$+LcCJQtoyqIUE7XC7JB}W&)NaF8%?LTfWnr}yx#wiLY@shXv zMGK~^A}^v@pKckNu6=TdO`et4RdjRl`zA@lJ+10;X))w;RywpQ`jW4FB^RQ))H9nJ zc5%8w$?SBsUH!inz({H<*M6zL#eD8Jvg(M%FA0a(wLM<7!_kk**w%G74{ze)cpmCT zvi3cmVyO%%rWr2$R|V0iOgW(MW$Yt8N-ieEgvfE6xHxLhW9>xfb%JCqbAtZ3zd zrC#c39#Z07gJ+0>p(Azu-J03pnEd$_dt}emYhkS@$$~d>*MqW44@1Ez+&eKb_ytau zv3_#=ed#-n>Y5=*+xx)N)fShl>7J$~Nx= z(+(L*M^U+qQ7{LT+-iV-#>vs*t$_E;5Y&!-hkB&1kDSM4?kYq%k(K5Iy3J2|3&cQG zg&?RBA)&LI*t83vKtjyxzv4-6dEE^|hty{{UhfZ#Eb56(r3@7wq-wnPwZ0%2O#PwH zV~2bF9W+iOrb>t!Dk@QH?aGpA_#-Oz@3v3!-IOx~2Ski`a6uS+;GczTy4?|STewB3 zR6>7ij?-I0zKds8mJPokNn>uKKa!YYr>gq^?v8>mA=p`Y+U|+#9c8(*4fgwhy|gAH z@Kl4|UC-MQ2P=6pqAxWI3U^P?&Rea<9O8vWdy$SEmStGGBBzfy$M$Rgz3;tBqg zq9gIgcn)qEzYBpiI*L_AcO5h3VbuMfJH-Zq=~4=lHzYgr?w~fxDlQN=yr)dMbUcky zSOs?1CXcMPcJyj)vInNeib6OBU98B>B3^vjI{sC)cLqVMu}bv<+w8tk0^9LK`c8s6 zFoYL?g8e2QoOuPuQ6aNs%84)_1uuF&@%K~|5|10PKf(lb@dCagK&1bO#4C>^8z5uR5H{bTsUj3U%^@Yh@0mmWw0!J+3bHcJ z@BEY@ph6CZo9iBOLFnefgcef6XE`M~0|8VF(2)!KQ2!=-(y+Dut#I)*-Dyu;m$v(! zYhqc+af|eFitRMxRkQjCf3z$USP!LL6f@t5(vudTh5QhHs z{Bx0ixpPKxn>knFg)R9O;YSd61d84W7mWi7qD$3Jpl-8(=g6`IE>Em5%ezVea-`43 zUzy!|%*YE@q^&C~keLyy?7-FGJEw{=`~_A55`bpw1qfmpg9esFp1L$?9>QXza3NU0 z3qUrQKVX7Gck47#P8ZfOzyeUiESW7eQpBoKFpq5AV*dMM-7Mg_kv;KLyk@f5TJll2 zuQaB{Nk-|BHGa+^4esgP%G8l^|K&vENWD0Ye~-%sCn3kkE}HrrV5N1ay{TrWU`TUI z=yZTD1L+~G*Pi+|@zdg#NF2O#vp)HsUvWRi9G#*>wq+I~-jZMm{=}cfgOh2A792gA zvLh!_4TvE7QmeQwVoNIZs4uUl7a!=5Ng}P=ryUf>G+zo`Yx5xXmc^b5US6_FhgeHF zm@9FGhD$El&;^%CFqDv(Mr)&yAHbfh(PUTmhuITZ!HZ4(+l-%b|*Z|P`Q%7B-_~xgB#}7oY_QZlE#f3&w%{qu^vcb zwSEmDR>=O`AA;Zlf0j#?@w^+_+3YVOc4f*OX-qK0dKPvW>4;%_>)8jYtj9tg|4|rH zm>@%*C1>$o#ts^T)VqzANo%BFfznW)wJKLA#%O^Q+9t+ z5FO5NvNHZG>K+q&fc^;`frdI|8s(E^mwveJSw}(wC~uzlb}YY;h=@X?P?TB93IXK^v^KYwVA~w+D)`Z0WRZ1Bbsd_Y!d}>iE|(1k9N@@qdr(O%EUa z4Bz8!WZ8qaMLXs|NJ`E-K|?uT5+=ot@sP3MB1d__@@SU25HDbQR^$2`C8MNWL=E^B zixQz(!tl(6M-5^sFyMcZ(qNK18pcqENOrUn0QNaiw}lW{TTR5l4XSxyAZPF>nK_Vk zg}5b>-Rl-jbQ!>LNeX_O7vlLsl+=PcKr1DzKM8O4#S>o-7(+Y8kmo|g+nn;(MZ{r+ z-$WD=bHSP2Zl5>CuS`zxoTA9xSo?Oy3X)P2jJY#!*qncwf%7D(E(Py)503>X`qj5h zcxg}rXIp=M7n7rR_hrn)f}EcYXVic%#(sCV6s^h3D+v6}}TOR47 z)rgjkW+=VUfQ!wc4ZF@a7sM#w@T;aFKMR+-O2GT0!qx8=UVQL*IZKkKiJA}#J8ZfE z5PQrdFpX|X#MT|I;Y1bAlo}T-g(JWLCfhBe0FHS=kI;ghETQN@H?CCYXvz$kDUq2c zk@r4!MapO#X3|?x8&LGs0y+|NNoibe6oO1!nQq5irVD%@DDLV-Rg3ank9gF?cO+f# zTiDHIY~n6_on|kTSx=^LDLAoP=kl*MX?He=p_Lt;3WlJ7_tit%D|VjL7+af8S7S|E zD!#oOG>p%t)~iZiM2OqWf%HlP3UZIiert@6;tT>5cUY6X3Rh|#NZE4r6@ZN$g^6aT zUxk+Da)aG5W}k_5gD8~weT(?YMS846F)^6z0@3o(c60)x!wbdPN-tU4URcy}dJ^iW z(K16n%k;aZaZ3k#+Mjdsj#6`tOC=ApTft4h?p6LiYU}n`y4%9n8CL937rMY$r_l-$ z5HynI`JiC-arnItvRP$9Qm@ioRIn^DkoaAV<^E7!Kpeo?K$z5GB+<_?^Ba2S%@Dy# zkI___UpUV*`adGlfwQqb4tF_t47d73Cb>DJw^6B*wCy4N;*S6{1SygzdC%4m#ny|_kVGwsF(g?K@>?fOA~Ax2@4H(Yljn}n zTK}qZP7Mm8G;{dv4M+<5{F|4xp>;M?cI=`Bo|KqwfXT(^_!c)dCo&F!IW<V+Kw6}Rvz_QPGW2)yyWT_aCU|r16pu_&Mn{8=swT$fWD_k@fodQM9nTBWE zLub2UNU$gIM<54@3d+X2%;wM346jN}~C%zn#Ua~FAP&e8sx18B9x7Fy8UuIhq?7{vBNj%G*h ztKc`zjwfch_!Mu2`T_&7%`31@12P+{CA?XRwq$E42JER5Dil4@g%Jw!k)rr=T>_}% z0TrqU#O4PeRa}z|T=@-C;jZXb&p_&OB!Zo0l*_k(NUpVG%7C(z_`hdBCd4B9u4rXI zsf2y528U%rLWMhyo@A)TrfK)}o8*TbA)uK!{{aU8V2#EMaTF0IADOa3IN-yW+WLOY zZ*tsy0=vi+z`@{(tx08BP9fYy#5nLg3Q?tS-^}#{RlESbPm3~e%K6{Wyl+OS>K@Jg z2X&^PZlIa-sc6KvcmlH~<2_Ck@_h%Xq$rkzL^@6Gm?O6mrAnc#7{B*zsJ#Tgt>gN4k}$Hyp#XpakRxOb<9lcNmjE{C_;n zX9H@Lv_HrlfX8Ju&K2G!5yr#tMs~xp$P;DVYKBEX0jlMy>}55`)f@XOEQ4oCEDpcm zcUh(pw{J25r-h7L@IuWG05u&U=%)h}iCFKXH%j~@h&!l!x}lxv6CkrDPIIzgS``Hy zv`mRXf>fm)W-<_=WH^bd{C+0$2(%iVatde^fFP&a;|au~MYe`>3z0-L`aF%G{;_W~ z^1j8|W!#IPS%z%I8Zo~|;%$8@s>>m5Ij16%=K|_w&&MtqGAL%C2b;to_~G2&JZN=? zZyM1GE$hgcBg61q^jVuDtVmt&!y*&mn}6jPLTx-6s}G^XSA@pMVWNG*Bt)V@KJyOQ z7ny#SKV|4b2&wL|HXcA~B5gx3&v7KUCDSJk=|;&fFa% zu3phv==z%wKZS8z%TXDkzT@u=Py8s$B(TsuzqGi?JfiO9=-#yfmNWi^X#DW4wSU!{ zN{`-sCY_v!zk8zj7~g1G>8`4=jmLOe@kk2 z3O?f7qhVMvM+Kgk-72p^1k-WJ#zUbPbWV&v1ki_9)lXuSrw2=A&<2TJWO$pzJW<`Y zB%fZ0oj?m)l~XoVYzg;rHBN}^zwO&(c)R`F#|wkwPsK(w?p)e@g@f^-98#Xdlo;(UI!3rP+E($4-(H^Bq@^+ zck~d4Zs@yk`;Dnwf{F%FIb)2nyE>c2L!Nei_CJK!i4q(4G4S0#KypBv+R?2Z7eMpI zFf;3Ly$#K*lj~ld%`Ef>+veDCs;}-{PS?L0z1|7pPRi6CryJ$8{H%Z9q!8BFs78cGcP$kl zCp;l=_<5P+xKc&KRiE%WV&Y4KaXr~mu$K{fU z@7w-;spYm6e2iS49v{yli_h2mL`&SxI{2ti$CV^KzOU8;Jv1Dbb1MmYyNx4@2qQEJ zi$u0U@K!<`7E-~Mcu&Hh*zJy#(Q*eu%asmfHt#LWlW)y|UpFW}v9CkLC~YLzglMi0 z@t({sz0&2sq1HYU|8)+s#5*b1mTSygWw&_Lu0IiQyVFgLOeUEEV`yJ7HjXr;$zuM0 z?44Ct98uS;2^OTWV2uZNm*6D0YjC#!!M*X|*0=1P$))Zl`(A_nsec zuD=@wgHcpfSFgSHuD#}ZrY6ZE1JCst_~oG$%5ZEr>(zIf-uJ$xE^i}FOtejJf8G_6 zgM@Kzu%Sg2=Z@IhyEXu9FOO?MImpklr0ObNnRt7R1|})V`k!_Q zWb=nj$}MlYf37-I%`ExZ&%3iXKhBZ%9GkFC+u0rA+PZ&HJ(zKI zUJ)G2IYQU-_)KusGap85_^8*A8|^aVek@APbSh z@YSQG5P#&g33Qb zdDP=Y@+iEDbucsIzIC6d_}rkhJyF!gQoE$Kv)fWElS@_~_#oI{?>EJ;-1_b*&Eu#b zAoKIi?ncD23xutv_lPHI=Y;iHk5{Q{tc29C=ITUHcE*`ls)g>#eBsYlLq4Z4Z|vG2 zC#CHaC*)jdmN_6zP{h6QjsJz;#=>=kjBr6ymZ*K0((0zLL8@Bpv1fUgk;$su{KMy&Qq0ieA7h1$y)P1l-uq6!w@Pa21^v4{LvsZGot6C< z3)H@8^|?9L2zS)_%4EfC{$aQ^>%MvRPvwtx!&YfAtd&&PeU6l+&&yiSxGW6gf!XO5 zwc+)bwS{zz@TqVmOIG-nn8iwGl>SNUlT-Z9u*Q=^%{JP@*gU0$O3nqyaBY*f28!P< zIF@X<)qj-v@qV0$Ow4s?DcKV}%*yT1#8T-aOT2C8Xx&iH7&@t4O5?yL63}lsl?SuM z$Oa~U0sML?%9U>;ui`WR;Mi1#S0pe7qV)4b@0$p-);E?A(wnJy&JE378L8{(%J5n= zRZH`;NjVUXd|aL#S7vgZSeZ51$(Y%?pIY#mR+GU$OcpACZVU6!dy0Ov*Lxt;9c!#9 z5kbu}^usu6Y)(B}60FYrOJRRtYi*Sxa&ls7{Q+O>Xy4Yl&$M>@h3=w(%XzfNX?Vp~j3x9?b3hfP6@jvqgHaJ2?&P?fvLw{+@ zbiUc>U?Pyo@;x80%vC#y`d4Q=Yn_60Vw&MQWKxRd18wzu=P^U*1Qq6XptWcfLGmX> zo$DN|m6&bK-xhk^q21=<(h8GQ-h z`0+Zx(fTyeQlWQa1Y^SpXNwpsOQkS_PqC%_VUcT!amjn#RcVo^>v-SfrYr00lm$pV zBtT^N%|yGzMi*{tditc9SdZ7^z9eo+_KT$(FE4%XhLjO-ECJ`JC5&n}F=ea}y{5VS zp*7{K+{ULB#|E+zecN90yx^@h;uCG>V^1OTTi=32D`tgcp*ZEKUGb2B zc-{ji|56I4-aAWjgU|B@Idj6wt8YncWIRez(x(>u)adeIOURxuP+6as|EqN!SuIEs z${ATgq$eH1IX^hZ30a2UO7Tjvo*r)=^)ZlH(c?aTwh5cTi`0zKCla&IEq3eQE7;Q= z^PX8f?Z#TUo?|6$U>L(&`t+6zQha7^ZFOdJ>6u`a`3HpTm+sQSV~!rd0U@B1V-?c) zR)FkilZVI1_Odvs@Kf144#xvD6u0xzoN&VOZI)BDc47MFh6CaOteLotq|a%53EeEv z0`2{lapnhJOnP*&0geLSlItvEz&eoq-HbqAmfN#W(TiOVtNT*_j4`?-h_=}#^rh!L zod+F7EFCYkL{HtkwkPj$ja~W(jd9g;{ENMvw~2ecX`F=c($)#{?KNwfHheZG$}Av-0=Rgpi%JY>=HazPqib_5dIKv=&;QU9xdZ=dVO-39Xbi zqI<9FK^2ce10VU3s!9__*1SbihHWwXfBs;J&96i}?<+nDLi}3wqv?z9-r~a|vBB5M z`DF&BV?zu+-dV*;(}!pEV1*IhMZ)|&k@C)x?To!TyD?)KXMvdNE4zH^9~AJB#$x~e zrOaLRv7IR#ZcCW7wP<)8oDT80kSTj<{`d0ZB!N8jfAWV&a0CBmP8UR+oSRuo)~0>E zyVsli1G~XRlIB*<|4jL?qsk=S$JqbxN&fel{C~s=w}?9jf8EWJm-&AqFdk)C@;&up zI`$UQ{{&oQhc8Oj-Zuoy{{H&6VKTlaK3kRMnEZKtOIC;a?^^DlVrK_&#%8k=LY{Q~ zPiI5@^dX&ui2lAXA z2Vu6l6*~Vq+3e@$p5x0jh;PzuU7q`btxUC0Otq!;%a!rV6~uEh-~lJi(hj%%Nj3Xe z!pu`pHlt1UF=JJ5q&ITOX4U$c{>(Pa?ghi}kSnH@BK7fq=8$+4mbb7pKGeypp!DC6 zzJ`UghZx=+<$trb4km0Ed=Iuw&G^6bOgze=%=?%le};33{|=ohQdsV1dppa*``>?> zi-QfOC)LgH{|+V-0hFw5fyJ%Q3B|DC)ZrnqN=4YzzX~H_jIB;y&F(T#c+8(fwA6BVLwiaW5wwEr zpBVY$1?>0LSEp!|i$$WN+;UiJ%zt1O#fz|GUbt@qUQS*xMqN^C@yH?hFkifFM@;{d z8~@*r#{oXlk28)>Gpqk#4fk*}ulR&nG+pAwx~|-m-w1)Pq?X`U?nd#~uG`w&rwWGV zmAmW}M&!+>lYp1!FNWJ(-x=W*8d3SWYaCbFI#*tvR!-Wt!RLYNufP&6epo-b=q(KM zA$VIFa9?W1^Zd~M(qaNSi#GN(nI#1YnkZ0m;epRyTjD!Uo{vwCSBj4vU#=a;u*VIb z&%d)jO05O#DHt=|a@K$mtdMe^trR^E=hQgPNOFQVUKdB5O|Vw@H_stL;I$tW-0)Am z#*e+LubhX3dG72z#bDSCy|C(Z(1Fm{+FoGG#+LKUF{kd#Tkt=l`^oQYvoC!Ck20J+ zFX!wpHR`uBU+hqqdf7axJ3V2&zw7SUgT@ba#>{|Q7^Yy|?Y#kv;Q@SHqj+9}Q~l=p zLi9JOZQ*aFR_oH~aZoh}`6rs`x1>%V)m%d6ZcrSYJVYwI0$(4VO8Aw>%*3h3Ehc=h<|EmH-1pt_FT!Gw50R|2EXv7N6PoFkO^ zXHmmrm+#C`Y!+BzPq3Kq=WGR`#I~Q2v{$d>g=mOR+>uLz;?(k28RXms6pU(CTMc8_ zx+6;^&D)~b;ujkJHuoXJcJe1YfrCMvr=I%n<~#m z$uBS6p|*Kz_0{TS}~ok zteFCYJ*n9wW1a5lE7)@RgBJXvd<^T@x{TPp+FshIx?LJND7k%{BKT=9_t^$Vc6H$x z?Ly53kBSa4V@%j)wF#N}`E^vwf7I8eeI@;%i{7(+9e0FRi0n+7G#57Qmo=g3ibDDE zu!>}BmBVR@MO|Cz&sw`2ZFE^syt4AR{ULfB_FonL7) zRgSj zSXQ}duzT*?#vN-0gc9(*=C^PKmY*Gi?5ClwxK3=t&Y)T7eB)V+qi{T?2<&Yz`W+Z= z_agV@v7n#9A2R}F6DA1XS%r;TEmK*rY!x+9nef~h#PHxjYO1-4Is`E~!3ld+yLBBO z=4FWCe}7pjW|*A2o1AnLLN9FU1Vb`eIl~Tf+RbAa(QKo9H6V z4SEFpDJ+Zc+@DHoDM4ttelHIz>@I&iPnIW*KM_3pE-o(f-7d_w@qs3yjd(b2Mi?nG zU$aoO`E7Eku;uBimi`~QhUI|MnnW`@e5ceJ46~6Qmh<#OtuavV(j>Cg4SWVL@07Sm z|8Ne|qgy+{z*o*rFc4EM!%ub?zhz4=XMo}Cu_%o*^Bkz%5%9{b=rENHi!g=1r$R;G z4~hj6v$zd&aG~k(_`mW!5+s02o_KkA~AsEL%5g`{_3oRB0TbG0B zlroF3c{~&u2KgdEmoQh{GC!7LZq+oG;lEn>G$DW~db?UsHoQmbf4gSMB4GL2;2y0` z)34n$s2LSLq;pHY1cOqL=}f!Kwk+476t}6ugUgW!@nFN_ra7qP>{RR-g7QTTg89hc z0u4Nj!UT%T58T{7z9y(O!Ww2?aDympj>#z*vcQLyX1U0BM!R;eagyI2vcppP+vM_o z;Fkj6xvjs08szIC!;w=P!y-%{@6kI?YfM_7R$@ZB+I!pew~p%HYm7^MPcS6<{#w+cbSQw z&RW_g&(w$4R5v761`1FZ_`_Xk z44&eWjaiJYE9Tg6@*<|9t_hPKVC(N3Td(|#0v0c-R&i#^6IdYNR~d{IdStu22`6ZZ zu!L>(ljtvV7EE(u6!*zd>Ld(?yrC=VxYT3{k)TSRilP3czXFr5NebgZGhee|1y#@ZexB!%u*U#MLICbBvlacc+VYuRwnO4A7_bC*?pBNzQINA(Fnl-MnsS_tVT= zqxx!MZORo3Gx82ki3oM}hEcY7u!}n|#at23_NlB>=G3-vl-5LSoNHuDBrocE&Q>{y z-^TJak&mPb@5!k!B~;iFnE|*zdKJ#BCDi_Ts{TR-ydi$?DK^bbQ+pHE*# z%r^vXk}Q#dbd?Dn+i+-1(|xh=j#jf=t+&FLebe&H{-nJQj8LtGN#EengRrm+V}2kMtp|8)o^Cnp4;mbcXn z52=EHp2TOQQlzj{w)3_IEt$e9LZ-1y0HSGXHGya;^AVL~y@M0tm-?h|^B2^d5bE`} z+(>gjd359QY#Ii%nf-pUeOJr$$d3Z95a2?_`U3hE%z|N{P!a}4AcwYqoZiKfp7n`d zSJN^}SnV=fC9V~t>=bL7_VMpCOJT9!$Jli`&N?v_gdV%*J^)}|=~#Gw2CS#PSMi9} z1l|hlrjPl4Nv8<^{e!A!p1QkwU9|GZ)d=4oOe3KHBd^h+&b%V_hVA$sKF&6&tnA6_ zihA_v#LI+D&+~GM*)qi@*%=vx9D2Vs7mhTx;wy3OWbi;=nHIm4vc?V#hRs(8DgBzw z8g7eb)=Odo`g#h=2_qf46{EWDKSP48-x`77P(fL>m*yTE)s*s6Aofns{^qNsEXiWOt9jp&FBww+_%}K9zJrk zF4HAZQ1G~MLtYT%M((U-%)o170S)i^Kwf43epp2w|J^?|Z`eZG0C9eUWg+l|hzWDM zBf9Q<=^GqxK0lib$dcN_1bhIP{mP-^;3ORyL|ro|=#Qhw0;_Nl7IXAv-~en{`9 zPp7OcpbMM%Jd5Gr6kPHp$?s8oS+RIc%&!4u5+<&NYSj1S$G(3PekXJFuuLS7d9!5k z&X>q>L)qgDyYvpmQ7ik(*9Sf}vp%zze6Cu*?MWu_PrRcV5(-03Yx@YOG>Nb5sfEI= z^y+Bw7MvHrw(|&x-e3smU(#Tyq&Fl&0KHbr0Jv>BxDPSPqIa9?F&AHlCE$gSyPwqc z{ZOg-g9!c*>l!oCiXU*CA`TBWYr(p!iKCLp1xRy#G6@mddXWA;cJ^ zO16QWl|%>`dkyyqG9KxqCeMmU5d;hhw_+IU2s#@l+$bUsTB5Z9LA3kkEN^zAp{8IS-8;d8vtAIdlyvjw5j(%R#o@l zzYbmK*VKP1wi`9og%_*R4e_<08Z*62>44w_k9G4_YFVd_c*-*oyEEE%OZUGXz`}iV zpUH-Q4WTUUv<}qR+6@pH#ZO)h*MUEO7f$SZLm6Eav4?q6jkRVHFIV0u01X0wh_Gh6 zCLYT=XSq|Cp%IoZ1qfSLyB204Hnh{%jEaTL)BKLPe`7O<=+(I zc$=uJcN7T2RI)HDEEF98H3kBYRd9cN3=?$1d-h38nxg|VC&epV6x|Mm1OZhHATyzM zy-g!Y1bjE8_mMXir3wbIVdzB>J6bbU7;vB>(iaYvkt}{)TV+zq^W$KuAui(wI^&&T zeu_b2CZ$A1a*SF099qiKa?$Ztw2DFANHB+XGdeBUfakeD?n0lGTVA?d3WDdssup6A z41e*Dp{X|*4_^vJ8;YVrB|px&f0-UsgMtyaF0dg-UZgal??5c~DI@H)rwWMF9Vo&*|!#jbw)%IS~HKs}3 zTbfRNMZmNAxbw*^9Zc)rg+5wB)}N;cM+TKk!sw`_(r!nsGEkuJfcwJvo8%g<(y)MJ z0PZB2`Nvj& z&@4capCL_kvn5h;O?5j2KaA@QKp#DFFqt~Ew=7DF;lpEiGM3C%G=n4s$mN|EUHnx4 z_&e_#4TenFhp_UPEA*9keBUWS`#=>FdiYLTC_Gjd8YjW!o34Q859}XeD_W}fBM!S_ z%nOCXKvVsADfN`npD6kSK9hcI>_Rzlll!bN!%q&P^)EeT^qJ%0fFhSz;Lw5G47RuV z8k&@JtyYbY=ZWmi1am4UU?7=UCkG!$OqTyBN=_G6R{Z!LDIQTp+KDC20NWCstcgUw zL2}#)e-a4I18SSh!pDugKS4LU@mFd>9Q+H@9229c2t-W$Pn@7Y6@;m{HLL@N-GK)W zE!r%So)(CKJ0d@Vud07z6jEW!ANMFJdK_m$53Bz57bMyuus-M!c?8P|K)XWf=+ZsR;?DY^?d*=4};dqqkQCFAOTwPfuO^CE? z-jKiVb-3fT{EM$1+%tX-DoMx|PkzgS_AZzT&?48ABTty%7C9QEpY8dpXTzL*q*K$9zBEh9;{q;DU40=q zC#zPC&bOyjz1Ts38#z27-=^<&*5(ZDayJ$CJ}xEpcnzYR;*be(ka&jr3O~zj$W%Wz zgZ5n|Ww59ac%DWg-{G7!5ksm%@y2n|jACvLhl?)B%oR-q0G^CpBZeztCnZ+q@D-o$ z#vD^ShQh^yVn%~;{(S4FYzwj6)z^tFd<9hYa->J0HHEHNZ}J~6Yx)stpxl?X^PS{9 z1n<%#s~ZnwwQ;3dyfY3BMv7;i8lDL=+cGpK|m|T`zIIU|!5xkP&QZUSiQp&!14OI$5y%3?_LrJ+f;(C39JU z2-w9%FOc@RS@QGMmar8bO^w1Hrg+I2rYlz30M|1?0VFxt`3)5>97ob}8$w!H7os2~ z&&LAnF8&yhLe?9EA_IHy*wnH9mgA|52^*t>xEYcmx~X_tj}E`9!6l)`J(vT8Qa3gg z(Y?_mvRutME{&E%xqyeZ6UdcRvLX3OgSG!kZi&d;HLw_#@{+Q5N_0ooiA7LVd|Q%$ zS4)O8^hJ?qYYyefDhW0&V}-3i?wV1rZQK$-v2ZCHZQ@k^D^Qgzy5s? zB>H@hn|{!|1dQSUYCny(p1-{n-7g?reWQ;Ir<5^75J@zahC8D?8in__Inu14>=Y@q zf}J()Uh<)sMZg?14D3MGvH(=J6<%I0!LE>9*E~0>Ke<5V;LGH#7KZ=xfNoFuTpmaN z76#A?5sc+`0x3qNzdK3v_mYQG0is*ERODLVVNH6veV4_|fihS1Mo&e6JM>8EH0Lwp zPci0E!};#TpLhLyitd?bt zXQ9Q@kuji;Lnse0m;N^QRsUb07%cb391~3etpj6X_6=r!d55p8va~oQdRe) zBO+ODHz#>+&98s_HT}WxCOi<_)WLXOoev3&enq}lxi06ag<3&x1ZW!a-=F301|P1A zxOZxcaGW+hMD!I2N(niocER8r7Yi^67&NEn*2UE^{L}MqbUN-FYIL#B{Bk1qGTP#?r%bpjY(9A87_p* z7)YTInSB@(H{k(0kdHhhS1p9>O}8DUqVyh8(miWVaTX-tcVC?FO_{-sx&H>v(ec!% z)RM&f9<>>Ok;QyLemQVJXO-0oO>RD!y0_;Cb?d&FFpxoqgDz`CS2A#2j8Q~dum-L6 zSpWJ2iu0xV?Qcu!dP4~C>+4nqAF9l+GFRR%-fpkA&P{0naT4z;xF;L#)+-ti7=SgT}7Pjyf5i#S8REACH_v6Uq9>rYLq;zTyGUK{3D|2zu9mFhWz z6^M1`&X8mb+aS)={HY|Fmh&$&jx&holq-fFsM2E4y|; zxMBOfK41X-k5Dr@jt zgE%E;6glEsmTwqn@xEHQ(<>D`A0cb7y+v&=JUOCmiY0{s6Faz!u^1HgW8L2Lcas$0 zJjaku&*eW1QI53B+>cW9Fd&{}J12GA=$r{~qA$lZqbLmMpw`ew!mz1|cHs7TIB<_5 zxXf`)cy&Our?ws#R3(oe`Rp|~SbECvkzZbyh#TIhC58@Ro4i#Y63NC(~jl)Lw>1Qdt~LOrQVymnS*(2>_(oRzxGX2~IvF*+x_>!cXv{sP@Oy4*@Epr&WG) zn_d2v!I9bHjPn{^g%#yoCV1~LY>{XFT*i&zU@V%|D^y<9fKCeQ`BQ_}h34@dMOlZ& zS^KOqr>bx-gD@0NDP?GlAl%+h6)!$A^~gE1#hl4+-<+m9T~Xq2mYCU@J8FJJAT;@Q zF7(9}65po-U{m=l5F(+EA-K_k*>#Jk?F0NIULJ74Vv=_#Ngx!Kbl)o8xK}C|zfyc4 z!j;!XtRCyZB^r{trkYc&JBv(7`t~S-<=gdbK-TKaP(ALYeKw8t^8T*j^s z)j=6nyn8L}&bN;i_>2{eSs=V55Sn*QWY$%ERo87hvA1(akx-RQiy;iXBdsMD{c!t< zQ^n#qs9>Wr?BgCyr+R%Xe6HtIb4N%OLX3;4HAdqY@?e*qO(+)30D4;E_Gkf^+~+ zc&AuHS)f=E$@z29>Y>jNr4`Had1?cIf0|V?E@BvrAky8$J?fMN@zGYe^Q+|bxJ+_~ zcbhbXVbssR)QVchw1i9SR3!q9HIB&#YEa5)nWAg{WPKDm%e2csGx|O{Mb{iG3X|ps zRcp~NkXW@|)O`O_af&U|eXEc?=51I4NPL#Nq4v4(K_+&rPegJkFxw(>?V?8>Zd2)6rxQ3sQt2AUIa+O?XO z6BD`S5m{{ET8xp(<5nbc#I*@XULZy%W=L(@RuI49^c!B(^}9M{(@lLrK~Py^RFW`D z(mu``h~amT=P7r%Syr+oAX&lmcQ82f*`_zDyH-obScf2d#eG{ zZ1)UFBvhvVV>vG8ucggQ7T1W~?ipDRh@G@T=0NlzUhv3jW%Rn5xN;hgBclGsLN}4+ z=_xMh*P0T$gfmkbCHs2O`3ZX&7QJF_sXvI>BD)kvx2Pbt$q{X89hRthejDJ###9lS; zHZI?sr3;7HbF8MlkpHypY_sF5%7KDJK@3%k+ByTbB$!2ps{lN4@b&roFH`G*=wLS0 zdTU=Y8uVg^G#f(t-sU)|gu9QzWX+H<(Y>Ymc%N9*=U|fO17x8kTkW%S%$oY3qjB;R zpuN<0J@w8 zi!HL@Qw(y>FoxS7bxM5XGRqrLrxb5#NvU3N`MOAZ_&K#A;A`LX({#-aauJv^fZI=I zJ~>TND5EXEHzw#nieJxhOQ3Uv|`3ZNLCWam) zodM}L?oqgZm?M*Ubej8}C3#yx_)FFx6$%blpG=S%{JMXLlt0yt96MgTyG!EbVgolF zE*4Te?KVZFK>0A8T>H3;exwB09$SeTFFDjmoxP9M<$MH zgY1M_3yU!#i#)N6ur#Bp4c0_}2}8#IBnRr0yr9p1l%wu6~1d_*g z*zBhgFG)cytR&qZ^Ueucwu`Ig7r?YN$6F%mmmA94{*s7m6MNcPm%Sjb?e%+zMk7Pfy*0;@JmVca)G?6Jl{S5=y&c;p-;#}8;~Xdi5z(?lt<3vBF3 z(qBvCL*iUh0#u6`kc$d$7U|yZ8bT_|xvTj}p8Y+0J5)75RxdW_D~$LIl%Gw_!OeeFyI5Pic8W2oY9Lvz2Z3e|mVRvLjCmVc~YF#S^P z;fYB3Ps0TqcGI+mQ71+IUcRC<+V8wqUi)w-Uc`Y8VH?6KCYLbi&s!wPbX#opZ>MIh zX+FR9#&>xO)xw+fFJeLn;zKYu@(jB}Me?0whW4IS1fuLP*y5t{fTTyB(@c8~>CyL! zUc0%WG|A*+;E&Vs-&w$kcQRcKR{U5)P2=qyzYfw!J^wjx&FDH>Q{5I&NF!Vmz)G#= zf0Xl!odir5x^Py1`4H54+|X9qNFokJh6@@NiiGN(A#5s6)27r##Bm*-tQJ})TCRf#knJqPJl!VhDAnO zy&?&9e65RF{>YGG$&aMRTEDbwcrPe zEAq2@<0UW|aYFH!>53|5rS7|dUD4|oL|$%R z$+^f|b;?cbeHeS=F56QoT!$vpoR}zD;g#q=T&gaac(QedK2Qu2R_?h@0*f{)c zg_4%Kz_@;n>E!APTL?X%QYPTl7-d=0D;4N$CqNI65StDd77jVt#k0ppbbe2r`9Y;A zx{>g=S4K!aZ|H;{Ri5J=v>Tlb@v|HJlOUEe#4?{hA8NU*L|X|9dZt6$#IglQMf2tNtT}&5M+}KJvhSp9wkio6Ai3xzpaouw1D=woj_t9OsM~%j_6ka&Wr2vuZk3PsH=tf zvSM6E5Kh6|PGoXn!0oIzUh}ug)ch#My2dYtR=?9P)5yr}24rJwf4>j1o6yebSOu@8 zJI5|JKJ@v?ob)aaSp>J0V;nOQmN0A4q*Eg zIX9yMo?rEmUpUFJ(#Oq?y@V%4pAMEK5^&YS#HS^61lWw4IpS^{SUAE3Xf0!Xo7&Lvj-mUZa1g<$?gaF}uziF%vcx62mo;A>i!F&)>R{GJvTMj1nM8Pgx)0Yxau z;-=q17xO>skwgS~i6l2^=1;a=0Lc|u^dRGdt?xFd3nVW}kn|q-j=iOWI_nw{{TIS? z?;Q|LLhE-Clm5LLgIQk1Afo)~7tbux;73C2c}ch@o-Nh%qnA&vu8IQ2oyMPdG_+uN zVAT@+lGG6}Q_limjiuF6eI?(im`+xi_gYS$pu|eRuQH#fi${uDW9dFq_H5SJ<3^g3 zpV8`p0=K)RRC79ygxKx#@ddCs6#|J#FfCR-2-RJeZhOO=oxq)2?}x%JDZK~Wko*uO zTz>_jH%|-OQY5N%He8lf^Ttff+8k;GjELM1-6~8?a>K`nZu+~nT^dx}QF@Yo7qz$# zS~3Z@5Et+%M2CM!7W!VTN%`e{RWfQIww(H~-_9rp*(v$`cz9}fq8FG7EXw!>DlM29 ze;&oCOm0*$9`ixw@{NPq4Ts(-uB8SPTye=)yzM>Ds1BZUj zImD7l6p!q+`DMwraW8=-0+Ccr*09jJ2g))U5mD0!t)5Xu|Gn@3#o60eBQnFSBS}4& zX(bV8X|gkc-@0=~d@;@CqE*xIZXU~084A>uBoy8Kg!PrRvcj3N){Rrfh#)%F<}dvS z{)grFE!|qEgG;W%2(iJ)vD{OZOTqEVq7lRUtoy;6c~>O z1J{Nld7BedFC3Gqy1cI!?HzCbCWUdyq%GgQCbN3gE8_q^QjYU*sigsEIDF(ap+qSk zHBPK!Wy2Ws?>sG}Elr|EU41Y{P12d|<@2-YC1)j11CM`EZcu{MSf=>(MR6YJ7+fHO z3LMt?qc^3j3+K0yrR&Th-$_ly{lf$3u_7j1uDBJcB?+DU)@m^k+BYKpW0c8Uvt8d# zwn?GoY`yrx;wQtt9@nhGvH5;PLMUybe8YKDC{SNW&#Ne&+tFY^DtAX$fB(ppRYc06 zxW(L0Vh9-Sd`2v8u|`aOITttlE*m&I4N>`w{2`8jtE#~Mehlc@;Ps2q7JpXf$gtR7bnF`XUHBtIt|Qtg|i+&W12L$fzJVH z-Gq5dwMt6ymSahE5s3A|V*n1w(j#iP+dm7fnB?>ev&Kz*Bv!pqFLOCl56k4Rnj!nB zNNGr^$$Xz*c2($+k0^cC_$_5|a+^^IHEjdEe-*~P!V48w73oS`or{YHoov+jgt#(s5!WAL_v2eH(_lD_z zc%%Z_TtF)ISmK>H;iMH^8rL3^^J*K9mVYh-6G|3@4xIdF{J|hUJqgD zGkgh$&h0QCj`hzI8fPdl+aKbAN=`_Yu3*kD6Pf{-{23qg_;P)WV31nD^Z>%jOLHZi z!gtjIm-Uk&FmZiR{qnI7M^!Fp6#S-J6Axb+C-4)t^XHxj9PU9)H5}JbkYbu^tnU-E z?#%&X^VpBt^5z!hv6h_Du{~9rmz$QZWlh6hw;ZQ}16ksx>!s-owTxdr+RWO`_f;miVW>{ZGkpF$cS0IF6N2T0BBx6dg1G zOAK1;wr_piz-QMqqATW9jt}~uIwY+iA9~rl?G^$K9!Q6H3OCAgy||k-I}BK-r8Bf`KIH%pcJza6msJQHN*_VCYUg=>5PL``=I(p2NtDz$c|Nxt z5kIE0xTafccd@Q`2uw7w60|%0mK2 zTRga5QtOm^q5eWWs@!UiQ)jot35|Il38JqK43zSrV!JWdU!}2dKge*_By+^2B1u$F zNgLe$(ZKNi=i?8Q7)}lu89mdTb-BF`(jcBO<_#?X<~I^J+AbL8-~^Y?=^B<^-B}Kq zxZ0cumcn}uAqylUOn*GxXEIyFo8!;@q5QY1qX(5Y>OFr-N8cL1(~_^arCrf`Ir+K7 zYNmg|-%$Q>jcUm6mz*dLU{|@uGSQ@zsujAsf%l&v&~)KJ^7@LBIrG#$1HRN;kDn%W z#---@1=_k^N0?%bE~;S7z@LJVAMx!LvVvVcPi>bV#hlVO6|6lThpiW22F7g|8PJ(V z{tYg(50AiSNQA7~_=L!xvabAHLJ}&3r_P^Dc=l{!4}%4;&Y0KnW^M}=ej*jmDFzvCH{H+Cy+KifawMnm|)r*F8I3nF8Mh8I}t zU{pAUC(c^W>|vI&c9?&Gr+D z=s+_8`!)OP?(>Bh&fM;K7vFfJyV?Y1SLN?Br`i@d`j`O2q9{+pcxEH8faQ#p=i(L# zVe=pM7wa;a@;5z9{OBAdv;u`iR!nk*{CQ|v-Jk73Hs3`2_y|u$Y{uR7Uiw5|I}zr8 zAo@Mc_gCL#(jHLz{Kq-VZ)&*jc8KtwCi{!FqNK_8)jUcqPff-Q;W6mqOt?mj$vC*w#Q2pU^&_O>{*(eH}J2lj=b<2;UvPEafIRPa19D;pO zFO%QL&TuJ2@ZP&Ike@4sj)Yov@eFBm^Q@C(bLw?X1_(P}r;9I0c}9^6b|)Ke(2Ihr z4bQmYxTtpoDTvpY-AW@?lNJX0Shd@Ru=b>c{Ju0BxFpMB%s8Eshb303RqdH(UBaBF!ibZIt_g|dVnTQ*>ShV^E|CsAx$CW0F2sB5tQL^p$)cH;QIXWLQO8Y z#5XKvBC7y{5VaQo_eU@1*jg=jmA+pWTK`8IDgH=TWS7b@Xw%TxE2iYdMcTtwi@IL4bIAx@qxEOpcB=6kkfGS6kfJ*}vtOK{xI7a4UQH-< zltDqkjo~Oiuc+BemBHh~n6oCQZKkU1b^W{!7=1k~0Jc&O{tyh*)gG)PYJky}Z zxEDzPp@FgT*KTd5@Vv*M?lb2s+qVNy0lX~r8&l#vKX^nWNll))D^ayOuv14JOXuAQ zH+;Ee1+@wMzL=VemfV8>?9=Wi&-Vx~m!0;^^OfYW7bx)U*SH}bu9fQ>0&G2>19Q9Y z{`mkLEB-)->Jho54RlPuk}Zxa2jMf&cy#7j?l&%WMn4}0XB!GpP{*5>W<&C_fuN&C zeioVT$wElj8xgbEd`sucg@8|RK7cyBZRg@CqAr{tI;2{Zl`kHZ+~u8l*iPwmU%l!3T?tSBsCsKXK$Pb1KuHPM2w?| zRq&asx0UCq9eT&rTaOB+O%Sd8dh^!E_wTinMXCmNq?hjuM94m_&hOmy5IBQmCc}FK1SRJ z=n*_We)27`{K%+e=l*Ic@jK`D)%JBjof17639FfxgV)beX;bMM&0!P^c)ggfds^@~ z*n7W+_Yx&IwHGS6OTPiNO5*RBkK_`~(hDR2MFOS5c*2$HB|>M)E~Zz1wvT%QpLP4< z17i^1i+87opC4nxLLQBs%-Wl;mhTx*dH+Xc1m(3ta zbXH`Y&5YU@KG;lnRk-ie@Y%R8d1$S;ir&mPpaJ6COG$1kXuM@3-4p}98|}ZyEpja^ z?ATkX2(}ppRPI_g^}EmZ&9AJ?Bpo$NE{a9`on@2Owc1__*HIz@=w4%gmn*P8`P-(Y zpXB&}V=;n_5-36Ilqq4G#u!p-{dBUC-OG1)kd|FKA9j^=!gtLXZl5t4Q-|ZkX;qQk zk-TDVFBY{_;pH^o@nNoHWoRxszC^5`wpMDV)cgoBOAK}-|Hu*C;Po~|X|d#PJ46V*Mk3Oux4g|=^|#7>!2ZcR8g`qIw#W11U2pFe>;GZz ztiPfP+kOuS(mkXgDBUe7?MR1oNtblzfS^c&AYDU;Gz>#`iAYNgJ%9t!(nFo$d7tys zS?51^*V@0Z_pHs{_kHaNkC^rhJj+lHJnny-Z865=AHD@6IAqNO`1D<1BO^zQ6*T1=X+`uSLIB zg~Afd=r8|DPXrd4xr|C*9ee;UEod&p7tw|s+!`RbAqmIfj+v!9V(;dGu|J_=y?!%8@unSI}=ejw($QV(7%tM$vZ$qu34EdV<0!fOJx8WETCE8BaUSJmxT{k8heZH>Pj6PJXm z7+iNu?zl}KK(+L>47w;Sule=_>*hncj?>f-aYvO?atDy)p}hR?EvmAtru(Oc`OTuL zFI~6KCG&;CscWS~>NQJ&1X$E2dzk*{>v@@BDIRx1_Wa@D_6@w`1G_JP zy;?+-22Dun^+?CYHIHawIMK5l#%yQo$s_k!TR-Wtz{LBrPwOj=7flmAYK9|>P$w8R za}uk`4*qlEO^}FS)~Uew^#bSA_&If%bj{Sv4@HBgd0>gGBE8}9lZC$-belO{-+Z@I z4SXYg^%p!6#1|iaWj{8+4Wnf@9> zBV=xN%6Wu~mTXu$9_77P%$#qBO4h1H#x}-Zg*@?6>8}~@)@)q?Iae;UI{v63=(d+W z&1{FQ=wIsG?zm9-Muh|oQW)%Gm^CLVZ26%IFf7?_>rR(`FF_rP&c77p{;lME_9`^C znM-LIJ|=VzM+suVG>qM&_VwLp8(g9yf7FJgNbYNBt}mk8;JXGNOgBlIE^iSs-AO~c z`b!k;)d|j;^IP2X7%xa3k4R<4kqiDCk!rj!)bL1>K^kVF#x&0|AtceYNcWTEl|ovk z`X^t1MuipvBfH2*sY)|KOCg&~Bashpv4uX5ezo=WZfRT^`_B)}`hDGHLA=dMP~Nr? zV&&#b`Kt&s$uJKmV9>#BUrlbVNWU9(w;B`iW=e@XBj)3gpDCN{BGgtz{olvw$6;P1 z`rpg{+bsWMo&S$H^w=i8=YGG?;j2&ZAA3catXPsP5X$!Q=YK8e1%E=1ZMu0#01!$@ zz;F>x_FyjMrOq`zN1ZXz1ZeiNV-<%!ne90 z0p_wmrdy4OJxct@6(08-9F(cVI1J`@Mt=DFKPQOOgbsVvB8v1Yw+csOZJt=iV zmd5@EyKsvl9qhu_?hn=|`7S;Any((~ga;pPCmy)p-_4qXPJY(j{)~MrNRAD?9S${p z)Q(!ID=|SVHFqAkP#s+*94!b0l^6t;3_kuRK3A{oCGMR=@WVBj3iVB2!%e!jO98RxHyAITSHwQ$fBNmN}W5Mwz|jUe(Uusyz27Du(9?UhOenY&4PeA_elSWBI-!f-dm!1Ml8#JsWHV{+|oWzFa4WDNCQ zp+?7+v>p2mqiyi*$67+l+7sH^scX@d6PMBT+b?ccUt*7L$B(4cEV!y4)z#*%sXziD z9QW;1pRc|QYu;~Z@*W%6LpU@iD{OZT115r2F_u6J5b3b|=aCQ+7c=HyUl znwp>MnKyaKCvb`1{&BmvLlhfws9`EiRQDTIKTw69P??dPn38-IBbr)8!C6{oM)~fh z`F!>rcH&oe;@fD@nGB=TiPjDeR%@(Jb!5(U=qp7-Hbvjx?oZr1mkH29Rv&xOFF^y0 zC*O#d7IZKla=;tFKr0h1FK{9xb1GzJ@eSvS_JJIY!nb9e5uF{rifX$~d}o>4ewk%Q z6#<2G|IX{|?f}uve<=FK(u!ALaHOAq5L}}q9ijSOWrQ6?(fytv63y&L|!AGEuuS+rM;0T3*>D0+a zyW!nB@%?&9Ci*>_<1`EXG>y8EesE=Bg57o9gn%#_DKWD(!R|kj{nx9TuiG+8;{BsS ztr*O`KB!eC%K#XKBLs+^I-Tdyc|z16|F9DvBatp|rKhmdwj19+%ir&VW;tU8$78Cq zpd0FS`L&LkQ9gcSomW?h4_B@!SPjgT60Lh?M{QS+gW_N=iZ#S5;QkK5#xnCrH#(9H z8TJc)Yd}iISZ_QLrC~)SJJE*gK&OtBPnL&4T%Zk;=Oy}E9aw{1NN4{$(r zg(;Lpw(gOyjkPprTNr%R&#}tziKN3qo41|75rOueZ8%%$juS8GPij8ULQ?Dq1M&)#s*OnXMtytVV)IGKlkK z^(LPfnLqyEpev{F?e?9O*49*#Rpi7Tb_gm~F717?#U|4lbU(IsJ4WwU6(7!GCZX#O z)+-W!V@f!FRpo1WqP}*fZdO06`TC01{CCJms@pVcw?5r85AXATM4;KKFlxv4WMNbU zg5{6PM1m{NB3TZzoEk0W)^PBzVeekmWD)}L>ZJ0II5}Rg>2wP3j!|eJUV*h;4L{>$ z_kKe93=}WQ?cj3&YP-rSeL^l%->%djL5o&t5j7_5qB&dDCl$*&^?{sp11|HNQ%K{M zl;MOl_HkT2EPW$ZcJVzQm)M%1>%yrUy7UyCW?LDJ)57Y{RScC7VQTS-4hxK-)Lvu* zPgg|m@L|@#d<9DoSK;KJi212VE|cdkdzAFI**fAEo`Mv_yZ|nzfKha=JDW4@g$Qz7 zP`V20z6@&DjyJqU4cP|+5w&=@#1T0(B!Pkw=UVeE1b4pBFeY#kc`pmdRCQO33m)ePe zx>UzGLN9H=szhXoq_hY~+(G${7&H>(5b21qr)~+`_`d-h38lwme-u)zjZ5PA1=>si z#&ZGGr)8;obo&WPM(c}*k3r6^=R-%tC6`!4UZ-f$&gn|bWHe%=S3Oz(dejIgxN)Yl zP_y8nG0ao9#O4Yl`zj>)ek8N6N(nPzEv5Wrge$-qeA5bEqOkPdw%j@& z?Y3<(l}p>bZUx7PTGqGG^9G{k$<+b$3W^Cn9YjU)IOme z$-+1xLBsOb*eM9FkgdhgMh_y%8b{O2-`b+n>A9UoP2z{&x3FcddRGJoetq0-Nxlcn zVK-OXsEWbL11Z)YRc3v;DcBQ(mN(lzCO#?9^@&Ve|Iv!YSA=af_*DqL-g}amMv;sE zE{ag0cXCj!R5?0f9YBc3g4l`jt3n0dHiwmt;SQJWYj>2W5gEMN)L#*a2lOt@-~8(R zcexN#m5(>WDu&?p!`AxiBBKam>ExOUb~!E2f&d{xGQK>rNZFo|&gV|;>ycrF3X@6u zaongyOjpgRHmof`{DA9gy5@(OVbJohPgv|4-u=SN%LAqFmHLATi)cc+K++a7uQ8Do z3Ge9a`y>azPH@QMBgqp!s~_Fv7a%6am9?yL0alB&A?zW@B!=rGGg50%7uSYy;ynOn zM*;}3vo>8H4rQSin0a;8?E{EU{-XG~z{V1ELydYOHejs1RSMiZn*#rqKq2rfvt{66 zN4}u68jl(*sR2WM6qbk=0;kr?amj?!e<8$wAnMI&8xwd69=*_EWAIAx$lM@_L~g&s z*VFgm@f@kM`Ak1PDdyxk)ycAskVKu|Q3=!Y3t+ILVOR^RStyq1Jips{>xY10YTO9? zwT2q#ZTwz`COL~&Fn^5Ip0f}6WAA%F+EZinlqHqEhEr~4sQW6md%;5hLnzDVz54Xm zIxMLJM8<%FuPi!q1}swcL#f=!sU^dOWiESeEi-UDp*a$i*wnQH?bXO`(rf1m^URNw z+Im6%Y$UuQVfNf4&n=r?AGvtKDY4VTfulSbrDiIGk@~svxTzx(W7Lq? z3t7aMHK-51T6V+(r*o`-_*}NGL!jE>{lWL={drhd-9bInCFBUTR-a`NjmU#n$8ejw zyz8MZr-_bn5sNw!R*Xy&@p_wnrs@Y#QZSrmtP%T34vFJ=*g{;KJc88B3d^jq3S5++ zOBSMz4cj>c0NhE3%_8Z)MZD+DNtACTo2%HPq8l;bBK{cPNU0d1w%%xzW!tyU)2MEP z$2o9S;oFes$(0=Rx%Otqy6T*T0#KJJWq(*N&X@kS^-(}l@lQ)!LQ%PBlK5jYfA~UO zU#=E}o@wbMb8AdleRSQ{jE)O8!^6Gxby&#$aL9hiQ6VlK-ixEedY49_ZKtiC5lms1 z0hLr0CSVCLzce)-S?^tt=WAJ<8=iu#pOZ|!lyL5m>c2~D-%F^u7qG(+mN=*0$?42( z4Jx9!6B&Yz5jS$OtI2(6?@>q;{vjIQhslE#Bbz|_(2zGDvp!ua`^IEE{aGii89)@N zyMyzUOnaA9=w{L&1OLlK*e0rz+a*F=-qB^h*%$>DC4V+zBB<+2as`0SB5Cdf-em3C z85h})a=-@^ii}yIi{Oyn6(^wpWK7yvxS1*C$BQDqy18^~=cQX`@O#Lq^ku7Nx{{-8 zT(S&g9$`qG?+EUY^SYgKls};teL^H4`>U3eYb=Hkx$Yp|@9vuEw4>4|B4p7c7j#z2 z=b+a;X*am3AA*W*vzVl&K4IYuGl}@~5yf#T^BoRc@tOCb!v2Ux_HhoKL~Pt4-~pW# zP#cEvR4Y}0@iWgNUKXchFM$QCKxGz9OB$j>LJ1pc%&`2sNa*DT$$wRNML49n&@?}_WJ~8r@@9q_qNFVcK2&PgfwU zzR5*G1>Zb(rRMY|kYY9%HGKQB%(8<}cL!hRq&MP&hB^!!QrWA-g$ielB=gwMp5zS6 zd3|jwH2g~D&isyuS-E_lnjM4Yg@@r%9RW4ahiC!HVp10$f+d%L8})Y}kh5Pf_k3Yk z8cN=jui}r=27K(ml##Rme)?HAl@UAeZ#K zopHhItcDI6-g}qdY#gmWYSqj$>IJL^%Xr=%#du=6l)@j51V$;5uUhDWZ}tbShC|>0iNs{N8NA5ML!N;q_~(s zFE;!SX8sK@_tem$OD^)F8Jd@UPyXZZohLUTO#8Dn0wQ7?`D9poii}P=Cr!vpZSR`T z-$T%9AhVzIT}*3_ql_U=NKX1@ZPtMjC0WEa|HXQb7i2o7R#&&sI|o<CSzUuS^_wa$!!^OUSh(lBf0!0~JlK1d9rS6a(>!H-9-MGND90eP_@)!XskshLr1N4#_NjBP2^4bT{j2x9 z))u$BZ|_eMLvP`aOvz@AyNx}o$g9e)_4Gw{H@XhfEC*v#J7Et2ljuZtasdCcAGPk} zo9?G|1VCw_B|i^TrKDGIeCgkC_AYK^cn{l{^ptm|KYPVr$>l*DAuBuOv2`&bT$7Nj zX;x(@Cl~!#rfCOLs~{DyLK~K{U5rijIWOyCW}+kI8Wxq8a0mv* z=9c0PXhNXZuzROSk6hPf{T8N26q6@WiiuG>Y1yVJKZz&iq?MP-GiK2dO(2mVXwitl4te-cB_|o`? z2+y5$M1IJhLDL%0X3*;s*K(n4sU zxjXYKZ~%|?RU$=FU`^*-eGaze?vtuJ#1{0e7V*fgw{&qy2n%PS7yDlFe>}XFxyxRX+ zBlt_~{9x=5fE|{Y3Psi?#xa@_at18CZF(yUFvL z1Ay^2|fEq zWZcXXdzz7HFA{Dx4mZIY!M-};VT+&c8l|scy^bEgUp-(^yV&QXF&@K(Q^l}=z1508 zu15=^$B`|TuJkt>I~f*g#|yM~9!ld!rr&HcDk?eA&Q_-W(M_AGS!`+n>v{iq@WzhE z_0;vre??6Yo5Gy8({aTG$J4wN(4@#M#%sgpPrw`YW?|#@WUZX0B;LFxlf^nSkrzA# zIB6K+*rf}wIS+{y5d&#C25&3a{-5pEKslB6WAe`q@xZ$E(X?$D4Dl8JL{=74XZ~tZ zo;$0dqq-9M1C-B+2;v~KFlS%$htj{g-?eSG)D^ktd!R~^6PsB$E8X=Id*wBieQ&2L$-YQ=MGA@lYZ8?X0J zdsy-p}RkNoN^$~$aKf>lzwgQfTJ4x`7LSC9DnMKj@Y8LYus z+YgJI_impUUR&72%tMMlkAmyi*Unloxud2uPQ0aH`$Dwen2(Eea5JIQ-B5LBesTuD z7i5&CzQ36}8k#_lvZ9=B_BA{a>U0xcKw48gh^adWHsX?)r7CN3sq>!N_fvOF6R2sv3kPw_YeJZG#sJnb!s(=?T@%m z0q}ZjezC$KN6ePzJ|5)xjO6%rIWt~zWbWu|uX>x*_mFYaqGpPg+3S@ToJqU+;u*Ux z!| zflldN3<0vp%T(<}J5WvrH!g>vQqN0zH>e8{)K*-|*9>Yrodq#m<}koty0;rt`8r~U zPPt~Cm}h$oesaCaxvVb{HTF7O7KE6@?R?ee<~#9cFqhDEZz0hVtyD9ic@XslZ|NiM*50hA=rkl#m`?`m5N1A}((4Gx;`KlBat zdtOadwJ1-d70G$@2c;DR-IZxxN1#WXcAhz`K}4x$?6~RLAMl6*HzE_(ApAufrgejp zp$CXc*C_eMv%$;r2pTk(blGi&9G8iUMUl~GPez`kott-0)rK@wbrl}Oj-qEFf}b_3 zpVTkyaNNhKKso)et(o`eVs9n|<+ltaXcXfO)csS6j5R2Fxv{H!ddLAR_(fYPahw3X z=lsy&fIIA=%TZJ2x)D<|r%qJ%zbDa>1qaIu+ory zH`EfBE&zS>-(CDeYdGN+@pzq~uBftzzf!oxZoK#Wxr6BYe!QgzuwR+SQ_UC@h-$`2 z@D$Zs_-DO*cV@cS=^-g33L9r0%gGtTO0I0Gag+6 zZ_~$ik!u;a71yrO;j7oS^Y$a#UvZz6JS4xm2jBPBj77y7!6ZJh~ zhMt-Q7Ge?qX&Q(tkk?<9Fiw~p3#O*v`VEOc+B}rverU`?b^5x}Ba7Y6S*zABo&XfHc!*Z}%0xnV+I1<*$~qdf z=A}pXk@j!!%O7+ppG<)Hjl4py-IG1=?0)_V$?(#@dBu&>Cm{Z|M=Szrsrs4PUxP7K z7wdWWaSy2ikuyZThb~URlh?%;i@mq)=QkXex3aH|@#ZhYp%r5)S0G;CFtRr!qw?jY zW6TpGRW4XBC%biI1S1RMhB8=eDuGjP`fS7ip6;p@l->oW1KrO|vsaL0PwGb* zdoR7ms$#tGh_S#EgFH(dl&&Pq*RU??4>!po)icj8JX7wc?BV4M&Qor@$IqOKl6gGJ zN$4P63AWq95_yK+VwN9@w?#+@YBL{bm7-|vg7Pt5UKtHTF&mJ-0z*#hqpk^+5C(L$ zyY$LS%BP^LEzTe0Ng6fl^0Kf)8CFB(6tc*d{Xza8o`mV=bAQ3e&5qFxf8k06ZowAJ zd++646}=D`9-iM@a8o20x1YGP58iAxrI2888vl~$Xo|E7CrYDh9`DrkB=6{`eb~ho zm8c_h+5DQ5Gj3{ImAe2iksF7Ccr&J75+IO^RVfn6OY?&0_X-!@ix$=48k(P)6VG|&Ws zQlE6Uu(OGcuke}4vm;b>6AM_Na+%`0xJ?@Z4JD*SBqi0HGt&-h8F`g-*4wKj8NUq$9=gn|HK&xn79Hf?zhf}1BYR81-?`7&U>$Iwadn=%I`_A>zjya z`v}eV_7p}9=Mt?K(&led=W>VG$7T?QP8!g|0u@<3LMQjkkDDNkpP9Y0UsY(+D7>Y9 zYJ==(dhxvx_@G4XCJab>V7ZFeOEL4S2y?^sXJ=~yJ0yB}pzvmg2!oW8pE=czVU49L+?otm^Mw*<>IRy&TYtDMR<8Vwlx$OwHN*BL<+Gw=Y~ zA^*nYns?QE0Gw$gdDr&<5WQe}KO%<*T!OfCuxR5hLmF!@#a>&QId5a%|COtC72OBz z#Wy{)hm3z~Ukqk3b`no@B9?;(A!2MDayl(v{A^hd zR(~{Rbr4*#3NJXvoesTW`rAblEq9tk6RI%6$-}Bos zN8v8MYtHu$)3sh3KPC<$@1?f5jScp9HY26a3RbvNK$CwAof5J{Fxj|uURTZ}a@ty< zD=5&j_h2eu(#rF%KB)yeh^S1SiX*l&vg7jAJ8|fSGmos=EYQ4j?b~mJ!#?2#`l!A4 zqArC0z9MBHC&BIWuvV=iD4JE=d#%Aqjq|Q@i1g&8)ytHsgGvmm=s+L(3B3*T3tRI! z@y@&XuA9+=zdqv3uIHVu=ovM~{K@M%dH6fR4$QKZB^=A0@6{m*3=9cT0-e;ouo_#v zMI^dgMABv5dOn`2+!Vl%La0)TnO*LUECtFA!ZSCkwJY)R4w((nV|l69068B93hsm} zR=gSW9V=(>#5gqS$RL=4%RH5xKo4p|^R)%+1Ur+2w86-bX|NUMJ$$s)7X2qc9F7vu z4g~)ZJ9|N|m$dE=QGa$;f03>qJXCu{^T&G-;GP_tNlM^M9E93oADl?ukaNZP3k;$u zAit%sSTo704VvB5@!|IQ0)E743@(G7sdFfvF|C}~-n~a`Rb~_rtJU=vTfG3Wb3?Sz zH#JP&o2*vg8<$uwiMUU)oxMF>*pocUd<8XQG8`_R*q;bBt<3iTgFu#x^>ZCq8iN~R z;b={?5aDrqqId3OzkE9I2+)YCPSH;rb@!^sB1jLfPZ9Gx)9PWQq6;~&Q+42PG%uUs zQX#eY!%-X!Y)>ML%5eFnx7=#O)>|34;Yv6d1}?{$-<#Z|n+bcrK1mlJR)Uo3q1+lr zPR2kty3}>7UtJY1_2MYFk5|h!B0e!5l>MRx(#?d9$5O@X3!dc=(YO0JLTX=|m-IAY zV031Q95-=~C{b`{P8Wqg6>U2e!AH!fom(EZ7lKZGC_`QvYHXm=AHjb_SbgYf8h+ae zVXadA#uAVly9s|aX7STux=ng>7%6X&OoAEA8a>nel1`Mh{x5@^wx>X+kxs!X6(-0x zy?wdlhV!e<;9DaW%G$wipsdXSJmUM}19-v%tp8{ymIy0EdQ-^7OFI3FdtVAzrOmZ* zr$+O=5b{_nf8jZ(l|;9XG3lG))B3p_XTm1>jPdQ_&-z2+9jx4SQTPDtF>Tzhqze+{ zE#4~X>11kaIE(5pe%;`^ucvxlq@UC3BF5+%E&hsq|7qHM3tj6^WTNSn`6H0H%ef3I zgOZ?aY-llIV!-+R|K2`xZ7I-iJzGl!e=amv(>ee2?I;+gq3*QtVhYcb6X8>e=R;Av z*&By;>A0}ocddW3>@khSHlSujLAU#a_+W^xKg+1xcM_9r4k%%JxS(Svv1$(-ORl?{ zF0mQ}IEzb|dE9n+1P;sHB-nyWWqotb3Ovi$q&&#CjC_Gb6e}2<5A)_{F}blZ%+|Mni?4zmL6G2GUn zRypT9DD)5)Lu)|5*cZbpa{*Lk%{_fAsW>G})$bpU{&QheDKyI67K?J%@Xi6|<6sn& z-r=Ba+UsGpGWg*BM@b)0zi6;Rnf(&^DZmTi!J*GV%pvmmP=X=5y z8b<85zc+%jofw~c7Cszbz6o*0q8i)q?k!P_$dP z(z=;FMs-C9oJD2-!ZByk1K%C^%{Dx7le|TZ*u$`Q@nj}v{@$eY0iV08-#5Y`MSNIv=!uk=bjD}ql9+t=@}V&T zT{|uH&2;K`$H6mzuF74O_##_=FDBw>EbHh3VON>tSPY$>&31^h`8bcn^Sxb$o70@@ zn5YA5mrhU?hHBv!SdU~9Fvi~o=mrQP(wI1_=!JMJt&O7JnedeLOuk1R=lVXuIojX` zUd6edMc7s)ehN9E8B+zWrvJG9WHsFI9H~Rr5XWrQ77AtsP9=Q)F;CZhIlw9Kbxpsw zFt_EO2<%jROx#7gUMFaGGbu6H=91~jImkF9DigZ7B`*t-y@aaz`D{05#H2oB+OU;@ zL>GljuX!#$t|#fs4wT6lnZ0|!cMs<~#8~}Xf2EP}3NIL@gqi%b{&&F7 z*=++bzH0`}NUhL~4^bL9d3%hZXK!Gx-p6n3Q7KWEj=<=Iek@`iCW>K&SPW`Jv3S;` z{&;aM1s~a&#B04E(^T$-R>oh#C*PG{0uAYMLw1yseYkIXrLmfPhLY$b89&^CvaB+o zb-fD5WX_P`PqlxY0yj5(-j7NMThZ(pmEt95m5>pfM{8GY$02$4EIB8BJ$a3)+b;NQ z^K+&_Si|IY^^~*W&XXz^`AhoJ(Y2GKRQ$Q0!@rzy$TPO#@}3!u2}gxrQ%5b+_@IB< zGm}>vM|*+1s{nj}&wFb(dI9Y!p$61!)HD9dWlf;Py~+-JT;MajlffPNdhBrND&_DnNQ5L z2v1rQ1J#ANnX(^JBTkQmW(Aqo44S(iI(F)!UDUv$qURA1q`+fT`y?)c?*4(1W*FTr zcNeq!cYoEBUyrJaH7`w?J8nY5?aaqTB+}IXC`v@mk6Z|0Z-^7=&1}z{LMd>tgoj^{o?z?f@BPvYq9Mhv zD(!Xl1AmDR87Kzc1JQt)!u^^6EHS6_3#-xLs?jRV?n>4jRXnKnNly?WO__p?)rdbV zRTCDu`BkfmO}6I#_+yt>98!@C)~t+{oEb~-dRbz!9)AvI$@+0zjfu<3K_P$seYBC_ z_QdLNP9}N}H50n|iB;*ilCd1GrP2;r3P@$$4(FH6qW+-OQgfH>d8&)jdX32OV%OL? zu?C+*8CTTxOFLo4E_Nb!67cRXuMrKwH1DP{r+tS(jwA^`4THH$aj%%Srah`sT5(G? z;mdwU6g}RDhWpQSm<(IrRt?54=J^a6pZ=IjFjF5Yz$7*o*?oos)Z$(88&_@efV`M8 zHu#4*7zi}ObSU1Cnvh`X$WCW+u#)1PGH(7(nOio~vDz$-EoTFKmkryY#(hWj8g-?n zR9C%(nnFy|5!5c!Ox@c6*=r+yY|Np7bCAW(|tg&_ljo1A2>g};Au$2N>iCcyq>=S@{`!{F$waH*mN0$a=aHj@Pe_dp(UO>EGvv zMcTW}jrS@%p-?6H>oKPLfesFyXK)ov*4)r2B$tEH$>xLZi`^aUu+#_ToCUaLcJhvd zXpi#@i_8rD)%nu=r1cAW5dd3Q1t^Akrppd6@bu>E*Iig>M7(y@y%32&Kl~ZCUdBQq z=r7yJ_(?08o`4P(oZ7c2xjL4SE>4Yl z6G~WmSS{JLo#_$f!xzAcIn@Q?m7*mIF$wDY!mx;!1$+bvh5P0yy>NIcC%fd`wbaII zQ)K<7Y%}*$<}T@P-BUcu!927QYLO!59dUi>*oX;c={MgkG)%~>n%=HA#_5R1kjiPx z;N<&!AMip49|gFcu|*%F6W@(o4w8a;|I)QtH1A?`nVsrh!Aq;{FgPo$UfM-RFDLG;S=nYhpGDEa0hE4PCEVKUqGj zJGlN8vTxq4r%_jxiMb5obyOX<5aLi7R>6#O7toj zVeus$ox;m!eQ`dNN(84WMo0`{YRU_z_EppisSD1Db;W3VFcwS1~HxFZc*ZZYj6i~2_3OxLOI|u zIfS1ypS$ue6hFT^uYQd}WCA#00gVut3jkT?rAQXEfIB;lti z4ts_~X)CkIu)cxy&3)GtoAd&|+>%l(G2V`J5lhwadRf=I(lI*%fLn}wSyao)8TZtt^&dmtI8E*C2;IIQ#+P@3Xb} ze`rzX=$6k5&|QXlH=M8V((mVs=inz9k3k5SYzTd7l3S#3nrDN3WRv;*+}eQl#+3g;hy z+qHM(I?_cw5b(aYDWdfZ`g_4gi0lJEC~+U|Sg_=fT2i%Ef^@}ljX z^{nk9QFv*hah%X^y^YdavGCI#FF_)&6ZqiZV|uu&;##2dIeEP6KX=Q3q!j$DjL*XQ zd^zte^J}qU#c4u)o+JNkr?fwFQz9xIc6>K2lFW}hHWnmJVWvSeFw?N|;~s~s{J@Go zJU>V`#8j8-R(mP1;%XM%ua@B$WH6t7ab(`Yy2H`I!f_`h>g767m14sVUEdJ9j#uPz ze#-YosJ2ebrK=enlwa_m?~>mfn}WrjdSrkleC)fQ z+tK7K<$j|HkPLZ~al!d7PKn|y2D?ot@ccRbRBpJM>1pN`_p2%L+q^>g;LA9D5 zXB>xOoU2FJ$JiyHYhri_eb*r_A~6)0nMaIXQsY0=W~%Q|E8;&rG6rTo zvwi&n-zO=)dI=#e)r)Y~OBZuu?e6gnLj*=!?Ub?pqeqy_s=uU-zB-#7o_o3rED~no zr!_lMuhaX8lbr0hR?~ji#(R>@Lk`%xwGM3sb){V~qmLxGDdqU9JipZ=*AowqZ_V(pa;5X^LOyhMfNl`Ip7Ki1&lhgP%zm!JuA} zGo*&ATcXC@vxlQoS&FUOQbxZ*b|f-7mFuGSrU(z5ef>SbDx5^us;kU!#!Vq{Rt6TQ5{kv8+RstaGAi23GyA>x69Cd{g;=pfiM104b4~Cm`~PvR}~lYD<6jt-c~=q z-2;Y`p%xW)fx zZni{`UT{N-;3qTBN&D*Eq}om>d;2#beAK%YDu&JD(PlCCPvd$rf7ky6SLpr-G;>zN z<=!=~TQ_l4fL>s;m&NEjX!b+`Df;b$zUscv&zc-z$m?MqzeT}}_YyQJ{Lgtx!+mOi zb)vNV#iA^Jr=Ed-naP>e3($hkXAS%ij{5WH$@$`ElWTQ8hlX#g0x(3)20cu=*UF0? zS!X#9_K5*gI6qDWZmW)NBkRU^LqoWDL- zH`lCx5bQ;B8!FQi>R<~*TU8{^Bhf4U}F-V%IX(Vo0Z$wNP8eZrnW{4XS zgK~?dSY^9fS!Asu>nMi2?VF85j4ik6tL!gnV8%QisIi(MjbyTB_65Evly%4OmP#ZeQEU#M^w za1avun1oqgrzL#lW+!VYU->>8?(>|IL8vgTcGtJwJgH#vTe;(;C!B+DI>X;FG=>~^ zdH(wr-pTJSwNBNGYE)*9QG<_cX(qvCZyghE%9SoJU6~tM<=^y74RkdNCaGCGArY){ zFEXg=?-~-J>V^?hYP1@~qUk4zS89IGSegwPmR}`Te?-*}w1!Kuoh{>x21LxtZddBl zrIKJtDeKo4F7&GS#I=47%RF#5)Dg(;n&Dz>V;}q#-c!j5;eprI-v3I?oyzR;t)e3! z#{DgvwX5=f+Pm{_D7^m<;MPb{mI-C47_t-DnckEoTe3CD_7*dY(J+YY*|IN{VvthE zG-MkwF+;{w_I#{kr?JjVwjl=J`Ml5f^ACJ}{@inay64<`?zz9*A71DAc->6+n^RgD z+S{NY?~oXDwa;AMY%?!u7J}MmH(gui{QkawAVPzNM;YC1}!jc!I!g!T|%L`daqRo2d5WqHRNS>`Zp+1^a3>o zP5%y?&Y{tQvLi#vG!5MxZ@y$s?E4;B1Fb}SPjvDyNvwd4xYzlq7Qv)J`Pdgs5p|}s zJ0aGRpggw1la=1STM*ob6U!ep9vAkns~UlYN7#e=Q<^U zu%A1bR!*yRSQG<>&*+_u7jcEpzTy)!RG0hqZ_*Fti_N%fHlP^_1(WC4LUoi#;rGY@ z13;_7n_&IaVd&^{->IxS?3Z$b@7NL}YSDxgC7w<}oyQ{Ie#k=UE20zSZc7RU50os& zRH*=19}5{H+FkN*Da!U*#B1+m169N^=R-XcIn6@k?5%!8{cOPbaK)r@dmP;&ZKu~# zf1*BwwcEwcTBFRnxx7$9!($iX*3*ht+^BV+`1|cCnT+4|rvZXd-H{X3y`Mdmzyo=? z7_h?Q#ijf*dGcFW(wk_@Wn)dCV*8bQvgb4v^F@&WRiS^0kpUnQH2FFiYSlJiT;|ks zT536gB6c{N`sQx30tTEs9bg_acdV6y!4BjfZQN6yMeTRRy`O*I-*sBGh4cQ=Nq8LXtU`P^!lL6&@7at$VR23x zi67Xl@Ay!DVa_PC-x4sp*q2+`g|^`!hzUm-{h)2XWn)f?N@nlEJQ}ULkA+@xm?Tx% zm=$m|E4l>FCMtTb^IFbAibfuDee-jZklUN17zOOG+q?E3RCygB+&hmDLR#pvLO0y5 z>9O9~wlr5(7hU?UkSMHU3$(v-!Y{=au~?~9M*p}Vp<**wln8FwYPMJREy}G{dZmv~ zE{I#1EH9N8<9)SV9e&;$HxJpSQq=Bl7_quV@KM6A(4YcpOXrJu(6i>Q(=QD(@6=*S z%_FxR%k;RVM)FeZd0soeTh^)l8na{7D^kQAHt}_|Q-btRI|($HL8!s#dYVZKC57Hf z-zM_7ZF`&jPzGp+D3*X<<`XUG8xG{#&ry0>d<&$!tZ+}y`o}ZBos)4tOBTu$%D@o` zM`F@f*>YuxI$!oQ_~)#>8+>k59nP2S0NpJCN*cNS`6r0RNix!5S(CAxXAC#c%wb8w zQxGc+ksTn3+5#kgWw#k;e|M==uOK$2AWD1*C^f+Q6L!5wddnwh2w!@(Fp={Md|dVE zNMrQcpPtI(v372g}5>l1{LphO{k9RjTAl+B{U?Jc_kJo+__oO z|NFPzA@AJ=5|;(tQp)(HC(xz>_=U1=rYe*>%2CGG(ohjAdumjfx5OJh%8X(anE?Y_ z;Vq@Y5=AIL51@U|D_+Gz3l|b7&IH;pGp;TR#I9MGVb>Zt5^aGZYpy(|#L}&<9RngH zvluL}bQGka2^8?UryO;6NMg zSL%S1!;BvB!Pl(`RqhAt*t`H(imf_M!gbi^mF?-odFJ`t$}wxACGQhS-SVubPsgrb zGI@RKXoOwh{xR&v?8Qr63D)FROuR}bf>RXU{d=WSBx$2siaCm zJ`c9@mzQ3YI^c>1ap197P99{9gd~VhMW~+TOVhHzjlB8Gwr_5wH_XrOi7!@ue8zCLgYYI`x1BzD)vqx59iZLf z_MPjInW+q=^&*3J=GKRz+guhkLGP95UKEgV9`Et{YmXn8T@k7QbC8RFFxvY{J2C{L ze;br(87jURfx5h%Mdv{eD}Wgy!LO`1=4C;|B2}Xb(=!=xSHZ)jK|J{6DoGX!ZG zen6hVrxg&yo<6~u13CLorj4;%QKD<0~WxGc0j@d#)tx0C{(MJ&uI!5jlQ?LMEUB(uVj^*k}tn?k$#B zbUsz31?ACz$SKk}9JA_X)b$0PT-O?}h86PlZdaNs|36V8kV}9I)Y|(E9Sb5#G{PQp zlou4Nw2bL;s4A!P%ims-gYj#|_^8rcA-1qiik)ZO1G0XjR_qO&o=KB8YGQSD;zN@` z6V)dA!i^=5f;IL)er&IUTH7VWH|@rmeP2SAo{l?qB_G`vPx@!KYm+!C_SsTIBJT6u z2PG=fv5pn3+1qR8wioC+HyhvKX~wl4T5sO1EUBMSud8_@Gntxy!jYRsoC_Dgy<0~Sj@@^E?b5C)?0 zIZ;whFegZt#Xp znyIyGCuLaY2A|b7fUu0^C>pLDtv$>y;oQ``@&|0!(B{zW?@jl>wP2o=NSnN+dJN<_ zsLSu{A0JP;6*%{*ITDkF)oeaPy0RG6#WSqh@7h3&W6v_Oo5_@M-I<+8SjlR zP1d+>teK!G?$c;FRcsyX7B-9~x7L&7P*JN8llm5q|0h{o^J05uW>F0D!ZP;2+kNzT zXSw(NCio1hc++g0F_$tl3an|t_#W$02(YEDMp?nY9AXo; zheh)hZuyZp!daAG`u73qIRnsPxbsJ5m;lL@S+e=OqGt|qLeg}@wN<*k6d>`z)78f=JhaDnhjsb~yXe*Fz2>}K<$4?|sK47~J98jK1yd^c z4>sLI2NH{=p!KY}`<(R_vZ6KG&#q^xoPo^`u=GLkv{|MdtXA5PG%1H}TS{SvN)e<6 zFOM}^VR6_w{Js>mZNius!@3A^RD^68c!3y5^WfL3=HC%#;e-318H2|jOsSnp^Bs^r zvStJMvegY-OJ)SjJ3pgVdtzu1>A%84k0E~|#xmDhO&69*{)MYE_1-O7GK9D+w;W2G z$Fsnthc4>^s^c`rxp6RW;`M*e(-(6d7_i+r_a7HZgDY?Y4Qj$4Qb_@8rK6G^zTd9$ z@cWrABqPM@dXjsknPk(k(_qT%Ul_mHv#O@~;QAF;qU%3v&g|&XZ^kcOWnEqD8L_$V znqu6gOfNFC;*lNZUXM6Rg^dO9!fcXTL1U7f5Q6!f4%^S*-2b6||HBObYs8Uo%=xvJ W_hBWs+#(xmSl+a~QElS+Yh%lyxa6sH!O_ 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%0Af5|#KWos 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�6_W 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 NG#~1!);@qm{U1j#jrRZm literal 0 HcmV?d00001 diff --git a/tests/sequentialRenderingEngine.spec.ts b/tests/sequentialRenderingEngine.spec.ts new file mode 100644 index 0000000000..ad0617cb6c --- /dev/null +++ b/tests/sequentialRenderingEngine.spec.ts @@ -0,0 +1,24 @@ +import { test } from 'playwright-test-coverage'; +import { + visitExample, + checkForScreenshot, + screenShotPaths, +} from './utils/index'; + +test.beforeEach(async ({ page, context }) => { + await context.addInitScript(() => (window.IS_PLAYWRIGHT = true)); + await visitExample(page, 'sequentialRenderingEngine'); +}); + +test.describe('Sequential Rendering Engine', async () => { + test('should display sequential rendering engine example', async ({ + page, + }) => { + const locator = page.locator('#viewportContainer'); + await checkForScreenshot( + page, + locator, + screenShotPaths.sequentialRenderingEngine.viewport + ); + }); +}); diff --git a/tests/utils/screenShotPaths.ts b/tests/utils/screenShotPaths.ts index c572e2833e..f588a7a327 100644 --- a/tests/utils/screenShotPaths.ts +++ b/tests/utils/screenShotPaths.ts @@ -194,6 +194,9 @@ const screenShotPaths = { afterReformat: 'mpr-reformat-after.png', afterInteraction: 'mpr-reformat-after-interaction.png', }, + sequentialRenderingEngine: { + viewport: 'viewport.png', + }, }; export { screenShotPaths }; diff --git a/utils/ExampleRunner/example-info.json b/utils/ExampleRunner/example-info.json index c1351f6bd0..de7013e3cf 100644 --- a/utils/ExampleRunner/example-info.json +++ b/utils/ExampleRunner/example-info.json @@ -152,6 +152,14 @@ "webWorker": { "name": "Custom Web Worker Function", "description": "Demonstrates how to use the web worker manager to register and execute custom web worker functions off the main thread" + }, + "sequentialrenderingengine": { + "name": "6x6 Grid with SequentialRenderingEngine", + "description": "Displays a 6x6 grid of viewports using SequentialRenderingEngine for better performance with large viewport counts" + }, + "ptctmultimonitor": { + "name": "PET-CT Multi-Monitor Layout", + "description": "Demonstrates how to create a multi-monitor layout with PET-CT fusion using the Sequential RenderingEngine" } }, "tools-basic": { From 52e636a839b380ea24b40145aa0185088375282c Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 12:54:34 +0000 Subject: [PATCH 030/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 683c19c1c7..55dad573e0 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -a6f3970f92f886407cbd3938be0ae8c346eaa519 \ No newline at end of file +6ee565be36e22a98070ce2a0536f3d821979cac4 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 521260a1c5..1b58d1879a 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.1", - "@cornerstonejs/tools": "^3.29.1" + "@cornerstonejs/core": "^3.29.2", + "@cornerstonejs/tools": "^3.29.2" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 2585edabf9..81f2eddd71 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.1", - "@cornerstonejs/tools": "^3.29.1" + "@cornerstonejs/core": "^3.29.2", + "@cornerstonejs/tools": "^3.29.2" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index b945cbb6a2..e08e2eb29e 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.1", + "@cornerstonejs/core": "^3.29.2", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index f0b792cafc..710ca7003b 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.29.1", - "@cornerstonejs/core": "^3.29.1", - "@cornerstonejs/dicom-image-loader": "^3.29.1", - "@cornerstonejs/nifti-volume-loader": "^3.29.1", - "@cornerstonejs/tools": "^3.29.1", + "@cornerstonejs/adapters": "^3.29.2", + "@cornerstonejs/core": "^3.29.2", + "@cornerstonejs/dicom-image-loader": "^3.29.2", + "@cornerstonejs/nifti-volume-loader": "^3.29.2", + "@cornerstonejs/tools": "^3.29.2", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index e55db072ac..00c9fbcbd2 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.1", - "@cornerstonejs/tools": "^3.29.1", + "@cornerstonejs/core": "^3.29.2", + "@cornerstonejs/tools": "^3.29.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index ecdcff82a2..7651ec3138 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.1" + "@cornerstonejs/core": "^3.29.2" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index a5e40c72f1..c7ee77fe01 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.1", - "@cornerstonejs/tools": "^3.29.1", + "@cornerstonejs/core": "^3.29.2", + "@cornerstonejs/tools": "^3.29.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 4ec219274d..9eaeb9c249 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.1", + "@cornerstonejs/core": "^3.29.2", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 8885b81229..c7321681b0 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.29.1", - "commit": "a6f3970f92f886407cbd3938be0ae8c346eaa519" + "version": "3.29.2", + "commit": "6ee565be36e22a98070ce2a0536f3d821979cac4" } \ No newline at end of file diff --git a/version.txt b/version.txt index ffa7ee838d..b658d1f6f5 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.29.1 \ No newline at end of file +3.29.2 \ No newline at end of file From 6de1e0163eae3aba5369fa410052dfe442c4d28c Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 12:54:51 +0000 Subject: [PATCH 031/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 6 ++++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 53 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e54c4d765..bc636a90fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) + +### Bug Fixes + +- **rendering:** Introduce SequentialRenderingEngine to resolve canvas size limitation, performance degradation on high res monitors and enhance multi-monitor support ([#2181](https://github.com/cornerstonejs/cornerstone3D/issues/2181)) ([6ee565b](https://github.com/cornerstonejs/cornerstone3D/commit/6ee565be36e22a98070ce2a0536f3d821979cac4)) + ## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 26e089c1bd..a6421030fa 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.29.1", + "version": "3.29.2", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 085bc1de4a..38f3f4c5c8 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) + +### Bug Fixes + +- **rendering:** Introduce SequentialRenderingEngine to resolve canvas size limitation, performance degradation on high res monitors and enhance multi-monitor support ([#2181](https://github.com/cornerstonejs/cornerstone3D/issues/2181)) ([6ee565b](https://github.com/cornerstonejs/cornerstone3D/commit/6ee565be36e22a98070ce2a0536f3d821979cac4)) + ## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 1b58d1879a..c45e7b8adf 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.29.1", + "version": "3.29.2", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index ea9ca19d19..d930bd9ec9 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 81f2eddd71..57bf142830 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.29.1", + "version": "3.29.2", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 9271bbe72b..d4d50381f6 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) + +### Bug Fixes + +- **rendering:** Introduce SequentialRenderingEngine to resolve canvas size limitation, performance degradation on high res monitors and enhance multi-monitor support ([#2181](https://github.com/cornerstonejs/cornerstone3D/issues/2181)) ([6ee565b](https://github.com/cornerstonejs/cornerstone3D/commit/6ee565be36e22a98070ce2a0536f3d821979cac4)) + ## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index ab45dfc084..538aa0f131 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.29.1", + "version": "3.29.2", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 06d7f461db..7bcef45518 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index e08e2eb29e..5fa41f6f78 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.29.1", + "version": "3.29.2", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 50a244744c..b165c7af1c 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 00c9fbcbd2..84a4032b2f 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.29.1", + "version": "3.29.2", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index b6bfcd97e2..d5ab62bfd9 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 7651ec3138..c75f636c2f 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.29.1", + "version": "3.29.2", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index c9ec6b47b4..75fb75bf19 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index c7ee77fe01..e37062cab9 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.29.1", + "version": "3.29.2", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index ab257a8fa8..8d9fb90006 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) + +### Bug Fixes + +- **rendering:** Introduce SequentialRenderingEngine to resolve canvas size limitation, performance degradation on high res monitors and enhance multi-monitor support ([#2181](https://github.com/cornerstonejs/cornerstone3D/issues/2181)) ([6ee565b](https://github.com/cornerstonejs/cornerstone3D/commit/6ee565be36e22a98070ce2a0536f3d821979cac4)) + ## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 9eaeb9c249..84b818627f 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.29.1", + "version": "3.29.2", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From abd76e99173a61adce1d02379fbb545bb349b9b8 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 12:55:02 +0000 Subject: [PATCH 032/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 17ea25b13d..cd6ced146c 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.29.1"; +export const version = "3.29.2"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 930e8df49e..8c947da21c 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.1'; +export const version = '3.29.2'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 930e8df49e..8c947da21c 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.1'; +export const version = '3.29.2'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 930e8df49e..8c947da21c 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.1'; +export const version = '3.29.2'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 930e8df49e..8c947da21c 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.1'; +export const version = '3.29.2'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 930e8df49e..8c947da21c 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.1'; +export const version = '3.29.2'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 930e8df49e..8c947da21c 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.1'; +export const version = '3.29.2'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 930e8df49e..8c947da21c 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.1'; +export const version = '3.29.2'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 930e8df49e..8c947da21c 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.1'; +export const version = '3.29.2'; From 5c7273f0da8cf1a06d53d97041517f28f3af5a7e Mon Sep 17 00:00:00 2001 From: Adnane Belmadiaf Date: Thu, 10 Jul 2025 15:35:23 +0200 Subject: [PATCH 033/212] feat(CrosshairsTool): add support for center gap ratio in reference lines (#2180) --- packages/tools/src/tools/CrosshairsTool.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/tools/src/tools/CrosshairsTool.ts b/packages/tools/src/tools/CrosshairsTool.ts index 34662960d4..dc78a1b92b 100644 --- a/packages/tools/src/tools/CrosshairsTool.ts +++ b/packages/tools/src/tools/CrosshairsTool.ts @@ -144,6 +144,14 @@ class CrosshairsTool extends AnnotationTool { // the reference lines will not be rendered. This is only used when // having 3 viewports in the toolGroup. referenceLinesCenterGapRadius: 20, + // The ratio is a fraction of the minimum canvas dimension (width or height). + // For example, if referenceLinesCenterGapRatio is set to 0.05, the gap will be 5% of the smallest side of the canvas. + // If set to 1, the gap will be equal to the minimum canvas dimension (which would likely hide the crosshairs). + // referenceLinesCenterGapRatio: null|undefined → gap is referenceLinesCenterGapRadius (default: 20 pixels) + // referenceLinesCenterGapRatio: 0.05 → gap is 5% of the canvas min dimension + // referenceLinesCenterGapRatio: 0.1 → gap is 10% of the canvas min dimension + // referenceLinesCenterGapRatio: 1 → gap is 100% (not recommended) + referenceLinesCenterGapRatio: null, // actorUIDs for slabThickness application, if not defined, the slab thickness // will be applied to all actors of the viewport filterActorUIDsToSetSlabThickness: [], @@ -153,6 +161,7 @@ class CrosshairsTool extends AnnotationTool { enabled: false, opacity: 0.8, handleRadius: 9, + referenceLinesCenterGapRatio: 0.05, }, }, } @@ -956,7 +965,17 @@ class CrosshairsTool extends AnnotationTool { canvasMinDimensionLength * 0.2 ); const canvasVectorFromCenterStart = vec2.create(); - const centerGap = this.configuration.referenceLinesCenterGapRadius; + // Calculate center gap using ratio if provided, else fallback to pixel value + const mobileConfig = this.configuration.mobile; + const { referenceLinesCenterGapRatio } = mobileConfig?.enabled + ? mobileConfig + : this.configuration; + + const centerGap = + referenceLinesCenterGapRatio > 0 + ? canvasMinDimensionLength * referenceLinesCenterGapRatio + : this.configuration.referenceLinesCenterGapRadius; + vec2.scale( canvasVectorFromCenterStart, canvasUnitVectorFromCenter, From 5442e731ad6b6165bc150407f27523728fb1c7b9 Mon Sep 17 00:00:00 2001 From: Ivy Fang Date: Thu, 10 Jul 2025 21:35:33 +0800 Subject: [PATCH 034/212] fix: typo in cursor crosshair example description (#2184) --- packages/tools/examples/referenceCursors/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tools/examples/referenceCursors/index.ts b/packages/tools/examples/referenceCursors/index.ts index d3c8bb17cf..3caade170f 100644 --- a/packages/tools/examples/referenceCursors/index.ts +++ b/packages/tools/examples/referenceCursors/index.ts @@ -34,8 +34,8 @@ const initialDisableCursor = false; // ======== Set up page ======== // setTitleAndDescription( - 'Cursor corsshair syncing example', - 'This example shows how to sync the crosshair cursors between 3 viewports (2 Stack viewports and 1 Volume viewport with a slightly different orientation). To disable orther cursors, set disableCursor to on and then disable and reactivate the tool.' + 'Cursor crosshair syncing example', + 'This example shows how to sync the crosshair cursors between 3 viewports (2 Stack viewports and 1 Volume viewport with a slightly different orientation). To disable other cursors, set disableCursor to on and then disable and reactivate the tool.' ); const size = '500px'; From e910aa991859bebffa33000e675d6b946f61499a Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 13:38:45 +0000 Subject: [PATCH 035/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 55dad573e0..6e4c59a22c 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -6ee565be36e22a98070ce2a0536f3d821979cac4 \ No newline at end of file +5442e731ad6b6165bc150407f27523728fb1c7b9 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index c45e7b8adf..c8aadc893c 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.2", - "@cornerstonejs/tools": "^3.29.2" + "@cornerstonejs/core": "^3.29.3", + "@cornerstonejs/tools": "^3.29.3" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 57bf142830..460729113a 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.2", - "@cornerstonejs/tools": "^3.29.2" + "@cornerstonejs/core": "^3.29.3", + "@cornerstonejs/tools": "^3.29.3" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 5fa41f6f78..bbb1d13af4 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.2", + "@cornerstonejs/core": "^3.29.3", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 710ca7003b..9e045a018e 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.29.2", - "@cornerstonejs/core": "^3.29.2", - "@cornerstonejs/dicom-image-loader": "^3.29.2", - "@cornerstonejs/nifti-volume-loader": "^3.29.2", - "@cornerstonejs/tools": "^3.29.2", + "@cornerstonejs/adapters": "^3.29.3", + "@cornerstonejs/core": "^3.29.3", + "@cornerstonejs/dicom-image-loader": "^3.29.3", + "@cornerstonejs/nifti-volume-loader": "^3.29.3", + "@cornerstonejs/tools": "^3.29.3", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 84a4032b2f..566e4d3c62 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.2", - "@cornerstonejs/tools": "^3.29.2", + "@cornerstonejs/core": "^3.29.3", + "@cornerstonejs/tools": "^3.29.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index c75f636c2f..fe1c3af15f 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.2" + "@cornerstonejs/core": "^3.29.3" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index e37062cab9..f365eb6a20 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.2", - "@cornerstonejs/tools": "^3.29.2", + "@cornerstonejs/core": "^3.29.3", + "@cornerstonejs/tools": "^3.29.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 84b818627f..3b95be1ae9 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.2", + "@cornerstonejs/core": "^3.29.3", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index c7321681b0..17c7948a72 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.29.2", - "commit": "6ee565be36e22a98070ce2a0536f3d821979cac4" + "version": "3.29.3", + "commit": "5442e731ad6b6165bc150407f27523728fb1c7b9" } \ No newline at end of file diff --git a/version.txt b/version.txt index b658d1f6f5..de2819ed97 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.29.2 \ No newline at end of file +3.29.3 \ No newline at end of file From 6df9859e99d0e2b2136e382db20b05d64452d706 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 13:39:02 +0000 Subject: [PATCH 036/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 10 ++++++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 10 ++++++++++ packages/tools/package.json | 2 +- 18 files changed, 57 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc636a90fb..cf6366f846 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) + +### Bug Fixes + +- typo in cursor crosshair example description ([#2184](https://github.com/cornerstonejs/cornerstone3D/issues/2184)) ([5442e73](https://github.com/cornerstonejs/cornerstone3D/commit/5442e731ad6b6165bc150407f27523728fb1c7b9)) + +### Features + +- **CrosshairsTool:** add support for center gap ratio in reference lines ([#2180](https://github.com/cornerstonejs/cornerstone3D/issues/2180)) ([5c7273f](https://github.com/cornerstonejs/cornerstone3D/commit/5c7273f0da8cf1a06d53d97041517f28f3af5a7e)) + ## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) ### Bug Fixes diff --git a/lerna.json b/lerna.json index a6421030fa..8ee4b59f1a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.29.2", + "version": "3.29.3", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 38f3f4c5c8..4277cf7f1a 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) ### Bug Fixes diff --git a/packages/adapters/package.json b/packages/adapters/package.json index c8aadc893c..d9d1995890 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.29.2", + "version": "3.29.3", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index d930bd9ec9..0f457e8c69 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 460729113a..42898c6c20 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.29.2", + "version": "3.29.3", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index d4d50381f6..2620abd8ef 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 538aa0f131..adf253c678 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.29.2", + "version": "3.29.3", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 7bcef45518..50a7f2ef62 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index bbb1d13af4..aead5e41f0 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.29.2", + "version": "3.29.3", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index b165c7af1c..074205c1e6 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 566e4d3c62..6740aa1a2c 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.29.2", + "version": "3.29.3", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index d5ab62bfd9..9af2fcd419 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index fe1c3af15f..404ef0afe7 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.29.2", + "version": "3.29.3", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 75fb75bf19..ab71eb9316 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index f365eb6a20..48bd8f9418 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.29.2", + "version": "3.29.3", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 8d9fb90006..a83e241059 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) + +### Bug Fixes + +- typo in cursor crosshair example description ([#2184](https://github.com/cornerstonejs/cornerstone3D/issues/2184)) ([5442e73](https://github.com/cornerstonejs/cornerstone3D/commit/5442e731ad6b6165bc150407f27523728fb1c7b9)) + +### Features + +- **CrosshairsTool:** add support for center gap ratio in reference lines ([#2180](https://github.com/cornerstonejs/cornerstone3D/issues/2180)) ([5c7273f](https://github.com/cornerstonejs/cornerstone3D/commit/5c7273f0da8cf1a06d53d97041517f28f3af5a7e)) + ## [3.29.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.1...v3.29.2) (2025-07-10) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 3b95be1ae9..3f862330fd 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.29.2", + "version": "3.29.3", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From b3073ebc138e6bf613b6e4b2b66d6d8d7d7cfb89 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 13:39:13 +0000 Subject: [PATCH 037/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index cd6ced146c..c4f7777dac 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.29.2"; +export const version = "3.29.3"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 8c947da21c..55288c4267 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.2'; +export const version = '3.29.3'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 8c947da21c..55288c4267 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.2'; +export const version = '3.29.3'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 8c947da21c..55288c4267 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.2'; +export const version = '3.29.3'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 8c947da21c..55288c4267 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.2'; +export const version = '3.29.3'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 8c947da21c..55288c4267 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.2'; +export const version = '3.29.3'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 8c947da21c..55288c4267 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.2'; +export const version = '3.29.3'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 8c947da21c..55288c4267 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.2'; +export const version = '3.29.3'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 8c947da21c..55288c4267 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.2'; +export const version = '3.29.3'; From ffd7354f8905c6dafd15e47005632b98946ace19 Mon Sep 17 00:00:00 2001 From: rodrigobasilio2022 <114958722+rodrigobasilio2022@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:21:25 -0300 Subject: [PATCH 038/212] fix: segmentation outline issue in stack viewports (#2187) --- .../segmentation/imageChangeEventListener.ts | 8 +++++- .../SegmentationRenderingEngine.ts | 15 +++++++++- .../displayTools/Labelmap/labelmapDisplay.ts | 7 +++-- ...segmentationSegmentIndexController_test.js | 5 ++++ packages/tools/test/stackSegmentation_test.js | 28 ++++++++++++++++--- 5 files changed, 54 insertions(+), 9 deletions(-) diff --git a/packages/tools/src/eventListeners/segmentation/imageChangeEventListener.ts b/packages/tools/src/eventListeners/segmentation/imageChangeEventListener.ts index 0ad67bf645..e68a32d321 100644 --- a/packages/tools/src/eventListeners/segmentation/imageChangeEventListener.ts +++ b/packages/tools/src/eventListeners/segmentation/imageChangeEventListener.ts @@ -139,6 +139,7 @@ function _imageChangeEventListener(evt) { return; } + let shouldTriggerSegmentationRender = false; const updateSegmentationActor = (derivedImageId) => { const derivedImage = cache.getImage(derivedImageId); @@ -210,7 +211,7 @@ function _imageChangeEventListener(evt) { }, ]); - triggerSegmentationRender(viewportId); + shouldTriggerSegmentationRender = true; return; } else { // if actor found @@ -234,6 +235,11 @@ function _imageChangeEventListener(evt) { }; derivedImageIds.forEach(updateSegmentationActor); + // if one or more actors were added to the viewport + // we need to trigger a segmentation render + if (shouldTriggerSegmentationRender) { + triggerSegmentationRender(viewportId); + } viewport.render(); diff --git a/packages/tools/src/stateManagement/segmentation/SegmentationRenderingEngine.ts b/packages/tools/src/stateManagement/segmentation/SegmentationRenderingEngine.ts index 01fa81bb23..54a2ac4865 100644 --- a/packages/tools/src/stateManagement/segmentation/SegmentationRenderingEngine.ts +++ b/packages/tools/src/stateManagement/segmentation/SegmentationRenderingEngine.ts @@ -40,6 +40,7 @@ const planarContourToolName = PlanarFreehandContourSegmentationTool.toolName; */ class SegmentationRenderingEngine { private _needsRender: Set = new Set(); + private _pendingRenderQueue: string[][] = []; private _animationFrameSet = false; private _animationFrameHandle: number | null = null; public hasBeenDestroyed: boolean; @@ -116,11 +117,15 @@ class SegmentationRenderingEngine { } private _setViewportsToBeRenderedNextFrame(viewportIds: string[]) { + if (this._animationFrameSet) { + // If a render is already scheduled, queue this set for after the current one + this._pendingRenderQueue.push(viewportIds); + return; + } // Add the viewports to the set of flagged viewports viewportIds.forEach((viewportId) => { this._needsRender.add(viewportId); }); - // Render any flagged viewports this._render(); } @@ -156,6 +161,14 @@ class SegmentationRenderingEngine { // Allow RAF to be called again this._animationFrameSet = false; this._animationFrameHandle = null; + + // If there are pending viewportId sets, schedule the next one + if (this._pendingRenderQueue.length > 0) { + const nextViewportIds = this._pendingRenderQueue.shift(); + if (nextViewportIds && nextViewportIds.length > 0) { + this._setViewportsToBeRenderedNextFrame(nextViewportIds); + } + } }; _triggerRender(viewportId?: string) { diff --git a/packages/tools/src/tools/displayTools/Labelmap/labelmapDisplay.ts b/packages/tools/src/tools/displayTools/Labelmap/labelmapDisplay.ts index afaadf4e9c..0b796731ef 100644 --- a/packages/tools/src/tools/displayTools/Labelmap/labelmapDisplay.ts +++ b/packages/tools/src/tools/displayTools/Labelmap/labelmapDisplay.ts @@ -32,6 +32,7 @@ import { getPolySeg } from '../../../config'; import { computeAndAddRepresentation } from '../../../utilities/segmentation/computeAndAddRepresentation'; import { triggerSegmentationDataModified } from '../../../stateManagement/segmentation/triggerSegmentationEvents'; import { defaultSegmentationStateManager } from '../../../stateManagement/segmentation/SegmentationStateManager'; +import type vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice'; // 255 itself is used as preview color, so basically // we have 254 colors to use for the segments if we are using the preview. @@ -200,6 +201,7 @@ async function render( } for (const labelmapActorEntry of labelmapActorEntries) { + // call the function to set the color and opacity _setLabelmapColorAndOpacity( viewport.id, labelmapActorEntry, @@ -312,7 +314,7 @@ function _setLabelmapColorAndOpacity( } ofun.setClamping(false); - const labelmapActor = labelmapActorEntry.actor as vtkVolume; + const labelmapActor = labelmapActorEntry.actor as vtkVolume | vtkImageSlice; // @ts-ignore - fix type in vtk const { preLoad } = labelmapActor.get?.('preLoad') || { preLoad: null }; @@ -328,7 +330,6 @@ function _setLabelmapColorAndOpacity( if (renderOutline) { // @ts-ignore - fix type in vtk labelmapActor.getProperty().setUseLabelOutline(renderOutline); - // @ts-ignore - fix type in vtk labelmapActor.getProperty().setLabelOutlineOpacity(outlineOpacity); @@ -358,7 +359,7 @@ function _setLabelmapColorAndOpacity( } labelmapActor.getProperty().setLabelOutlineThickness(outlineWidths); - + // Mark the actor as modified to ensure the changes are applied labelmapActor.modified(); labelmapActor.getProperty().modified(); labelmapActor.getMapper().modified(); diff --git a/packages/tools/test/segmentationSegmentIndexController_test.js b/packages/tools/test/segmentationSegmentIndexController_test.js index a1da4cc886..4e89fa8ea3 100644 --- a/packages/tools/test/segmentationSegmentIndexController_test.js +++ b/packages/tools/test/segmentationSegmentIndexController_test.js @@ -134,6 +134,11 @@ describe('Segmentation Index Controller:', () => { }; const compareImageCallback = () => { + // Remove the event listener to prevent multiple done() calls + eventTarget.removeEventListener( + Events.SEGMENTATION_RENDERED, + compareImageCallback + ); const canvas1 = vp1.getCanvas(); const image1 = canvas1.toDataURL('image/png'); diff --git a/packages/tools/test/stackSegmentation_test.js b/packages/tools/test/stackSegmentation_test.js index 0237a5e2f5..23024aca46 100644 --- a/packages/tools/test/stackSegmentation_test.js +++ b/packages/tools/test/stackSegmentation_test.js @@ -82,7 +82,11 @@ describe('Stack Segmentation Rendering:', () => { const imageId1 = encodeImageIdInfo(imageInfo1); const vp = renderingEngine.getViewport(viewportId1); - eventTarget.addEventListener(Events.SEGMENTATION_RENDERED, (evt) => { + const segmentationRenderedCallback = (evt) => { + eventTarget.removeEventListener( + Events.SEGMENTATION_RENDERED, + segmentationRenderedCallback + ); const canvas = vp.getCanvas(); const image = canvas.toDataURL('image/png'); @@ -91,7 +95,11 @@ describe('Stack Segmentation Rendering:', () => { imageURI_64_64_10_5_1_1_0_SEG_Mocked, 'imageURI_64_64_10_5_1_1_0_SEG_Mocked' ).then(done, done.fail); - }); + }; + eventTarget.addEventListener( + Events.SEGMENTATION_RENDERED, + segmentationRenderedCallback + ); try { vp.setStack([imageId1], 0).then(() => { @@ -153,10 +161,14 @@ describe('Stack Segmentation Rendering:', () => { let renderCount = 0; const expectedRenderCount = 2; // We expect two segmentations to be rendered - eventTarget.addEventListener(Events.SEGMENTATION_RENDERED, (evt) => { + const segmentationRenderedCallback = (evt) => { renderCount++; if (renderCount === expectedRenderCount) { + eventTarget.removeEventListener( + Events.SEGMENTATION_RENDERED, + segmentationRenderedCallback + ); const canvas = vp.getCanvas(); const image = canvas.toDataURL('image/png'); @@ -166,7 +178,11 @@ describe('Stack Segmentation Rendering:', () => { 'imageURI_64_64_10_5_1_1_0_SEG_Double_Mocked' ).then(done, done.fail); } - }); + }; + eventTarget.addEventListener( + Events.SEGMENTATION_RENDERED, + segmentationRenderedCallback + ); try { vp.setStack([imageId1], 0).then(() => { @@ -254,6 +270,10 @@ describe('Stack Segmentation Rendering:', () => { const vp = renderingEngine.getViewport(viewportId1); const compareImageCallback = (evt) => { + eventTarget.removeEventListener( + Events.SEGMENTATION_RENDERED, + compareImageCallback + ); const canvas = vp.getCanvas(); const image = canvas.toDataURL('image/png'); From 58754623fc91a88e5490c375380ef4d28782a1eb Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 14:24:48 +0000 Subject: [PATCH 039/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 6e4c59a22c..cee1b71c34 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -5442e731ad6b6165bc150407f27523728fb1c7b9 \ No newline at end of file +ffd7354f8905c6dafd15e47005632b98946ace19 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index d9d1995890..63e94a6cf5 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.3", - "@cornerstonejs/tools": "^3.29.3" + "@cornerstonejs/core": "^3.29.4", + "@cornerstonejs/tools": "^3.29.4" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 42898c6c20..421f52eb14 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.3", - "@cornerstonejs/tools": "^3.29.3" + "@cornerstonejs/core": "^3.29.4", + "@cornerstonejs/tools": "^3.29.4" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index aead5e41f0..776e597c2f 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.3", + "@cornerstonejs/core": "^3.29.4", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 9e045a018e..1991568167 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.29.3", - "@cornerstonejs/core": "^3.29.3", - "@cornerstonejs/dicom-image-loader": "^3.29.3", - "@cornerstonejs/nifti-volume-loader": "^3.29.3", - "@cornerstonejs/tools": "^3.29.3", + "@cornerstonejs/adapters": "^3.29.4", + "@cornerstonejs/core": "^3.29.4", + "@cornerstonejs/dicom-image-loader": "^3.29.4", + "@cornerstonejs/nifti-volume-loader": "^3.29.4", + "@cornerstonejs/tools": "^3.29.4", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 6740aa1a2c..c744a82155 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.3", - "@cornerstonejs/tools": "^3.29.3", + "@cornerstonejs/core": "^3.29.4", + "@cornerstonejs/tools": "^3.29.4", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 404ef0afe7..a07c6ec69a 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.3" + "@cornerstonejs/core": "^3.29.4" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 48bd8f9418..25c72ff413 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.3", - "@cornerstonejs/tools": "^3.29.3", + "@cornerstonejs/core": "^3.29.4", + "@cornerstonejs/tools": "^3.29.4", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 3f862330fd..06b886dbe7 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.3", + "@cornerstonejs/core": "^3.29.4", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 17c7948a72..b4d04480d3 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.29.3", - "commit": "5442e731ad6b6165bc150407f27523728fb1c7b9" + "version": "3.29.4", + "commit": "ffd7354f8905c6dafd15e47005632b98946ace19" } \ No newline at end of file diff --git a/version.txt b/version.txt index de2819ed97..01fc15a713 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.29.3 \ No newline at end of file +3.29.4 \ No newline at end of file From cfa876a8214fa674bc2d2e52b39605184c0d4406 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 14:25:04 +0000 Subject: [PATCH 040/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf6366f846..bd067e95a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) + +### Bug Fixes + +- segmentation outline issue in stack viewports ([#2187](https://github.com/cornerstonejs/cornerstone3D/issues/2187)) ([ffd7354](https://github.com/cornerstonejs/cornerstone3D/commit/ffd7354f8905c6dafd15e47005632b98946ace19)) + ## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 8ee4b59f1a..6ad535a3d6 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.29.3", + "version": "3.29.4", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 4277cf7f1a..3af191e8cd 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 63e94a6cf5..0160f2644c 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.29.3", + "version": "3.29.4", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 0f457e8c69..786e96ced7 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 421f52eb14..45d2314cb4 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.29.3", + "version": "3.29.4", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 2620abd8ef..55a5113126 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index adf253c678..13c1c1fc17 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.29.3", + "version": "3.29.4", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 50a7f2ef62..5fbe6bb796 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 776e597c2f..1827ebacca 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.29.3", + "version": "3.29.4", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 074205c1e6..a71c1d1f21 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index c744a82155..8cced4a711 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.29.3", + "version": "3.29.4", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 9af2fcd419..7fc1eb24cd 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index a07c6ec69a..b3b3ecd783 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.29.3", + "version": "3.29.4", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index ab71eb9316..1783c338d7 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 25c72ff413..35790b8d94 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.29.3", + "version": "3.29.4", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index a83e241059..4a6fead283 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) + +### Bug Fixes + +- segmentation outline issue in stack viewports ([#2187](https://github.com/cornerstonejs/cornerstone3D/issues/2187)) ([ffd7354](https://github.com/cornerstonejs/cornerstone3D/commit/ffd7354f8905c6dafd15e47005632b98946ace19)) + ## [3.29.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.2...v3.29.3) (2025-07-10) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 06b886dbe7..5d18fd3a9f 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.29.3", + "version": "3.29.4", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 64e6d79c48a562bef369da783441c5152730f8b4 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 14:25:15 +0000 Subject: [PATCH 041/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index c4f7777dac..d19f202310 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.29.3"; +export const version = "3.29.4"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 55288c4267..21e5a2eafd 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.3'; +export const version = '3.29.4'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 55288c4267..21e5a2eafd 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.3'; +export const version = '3.29.4'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 55288c4267..21e5a2eafd 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.3'; +export const version = '3.29.4'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 55288c4267..21e5a2eafd 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.3'; +export const version = '3.29.4'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 55288c4267..21e5a2eafd 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.3'; +export const version = '3.29.4'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 55288c4267..21e5a2eafd 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.3'; +export const version = '3.29.4'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 55288c4267..21e5a2eafd 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.3'; +export const version = '3.29.4'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 55288c4267..21e5a2eafd 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.3'; +export const version = '3.29.4'; From 09d1ee059ece80088affe1a4953dc67b71c07aa9 Mon Sep 17 00:00:00 2001 From: rodrigobasilio2022 <114958722+rodrigobasilio2022@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:01:33 -0300 Subject: [PATCH 042/212] fix: missing normalizeContourSegments (#2192) --- .../helpers/normalizeSegmentationInput.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/tools/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts b/packages/tools/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts index ca416c3c57..cfae91f50e 100644 --- a/packages/tools/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts +++ b/packages/tools/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts @@ -84,6 +84,11 @@ function normalizeSegments( } as Segment; normalizedSegments[segmentIndex] = normalizedSegment; }); + } else if (type === SegmentationRepresentations.Contour) { + normalizeContourSegments( + normalizedSegments, + data as ContourSegmentationData + ); } else if (type === SegmentationRepresentations.Surface) { normalizeSurfaceSegments( normalizedSegments, @@ -96,6 +101,25 @@ function normalizeSegments( return normalizedSegments; } +/** + * Normalize surface segmentation segments using geometry data from cache. + * @param normalizedSegments - The object to store normalized segments. + * @param surfaceData - SurfaceSegmentationData to extract geometry information. + */ +function normalizeContourSegments( + normalizedSegments: { [key: number]: Segment }, + contourData: ContourSegmentationData +): void { + const { geometryIds } = contourData; + geometryIds?.forEach((geometryId) => { + const geometry = cache.getGeometry(geometryId) as Types.IGeometry; + if (geometry?.data) { + const { segmentIndex } = geometry.data as Types.IContourSet; + normalizedSegments[segmentIndex] = { segmentIndex } as Segment; + } + }); +} + /** * Normalize surface segmentation segments using geometry data from cache. * @param normalizedSegments - The object to store normalized segments. From fcc458673acaaaa50c8361b3f89ff333852447f6 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 18:05:08 +0000 Subject: [PATCH 043/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index cee1b71c34..6b835fc5f1 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -ffd7354f8905c6dafd15e47005632b98946ace19 \ No newline at end of file +09d1ee059ece80088affe1a4953dc67b71c07aa9 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 0160f2644c..3618122a06 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.4", - "@cornerstonejs/tools": "^3.29.4" + "@cornerstonejs/core": "^3.29.5", + "@cornerstonejs/tools": "^3.29.5" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 45d2314cb4..e4f6448811 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.4", - "@cornerstonejs/tools": "^3.29.4" + "@cornerstonejs/core": "^3.29.5", + "@cornerstonejs/tools": "^3.29.5" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 1827ebacca..6b024b62fe 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.4", + "@cornerstonejs/core": "^3.29.5", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 1991568167..f124121d67 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.29.4", - "@cornerstonejs/core": "^3.29.4", - "@cornerstonejs/dicom-image-loader": "^3.29.4", - "@cornerstonejs/nifti-volume-loader": "^3.29.4", - "@cornerstonejs/tools": "^3.29.4", + "@cornerstonejs/adapters": "^3.29.5", + "@cornerstonejs/core": "^3.29.5", + "@cornerstonejs/dicom-image-loader": "^3.29.5", + "@cornerstonejs/nifti-volume-loader": "^3.29.5", + "@cornerstonejs/tools": "^3.29.5", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 8cced4a711..e0db228f52 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.4", - "@cornerstonejs/tools": "^3.29.4", + "@cornerstonejs/core": "^3.29.5", + "@cornerstonejs/tools": "^3.29.5", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index b3b3ecd783..c29fda0cb5 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.4" + "@cornerstonejs/core": "^3.29.5" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 35790b8d94..d72e80b505 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.4", - "@cornerstonejs/tools": "^3.29.4", + "@cornerstonejs/core": "^3.29.5", + "@cornerstonejs/tools": "^3.29.5", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 5d18fd3a9f..e0e9bacf5c 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.4", + "@cornerstonejs/core": "^3.29.5", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index b4d04480d3..a64549f96e 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.29.4", - "commit": "ffd7354f8905c6dafd15e47005632b98946ace19" + "version": "3.29.5", + "commit": "09d1ee059ece80088affe1a4953dc67b71c07aa9" } \ No newline at end of file diff --git a/version.txt b/version.txt index 01fc15a713..659f7c47d7 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.29.4 \ No newline at end of file +3.29.5 \ No newline at end of file From bfa38c4f5e3a51cb87f64ea3b782be48b6d6e3cd Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 18:05:24 +0000 Subject: [PATCH 044/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd067e95a5..d3c893895c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) + +### Bug Fixes + +- missing normalizeContourSegments ([#2192](https://github.com/cornerstonejs/cornerstone3D/issues/2192)) ([09d1ee0](https://github.com/cornerstonejs/cornerstone3D/commit/09d1ee059ece80088affe1a4953dc67b71c07aa9)) + ## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 6ad535a3d6..3bb1f96e7d 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.29.4", + "version": "3.29.5", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 3af191e8cd..c8ed09d84a 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 3618122a06..c79d46c7f9 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.29.4", + "version": "3.29.5", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 786e96ced7..daa667a841 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index e4f6448811..ff9c67debb 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.29.4", + "version": "3.29.5", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 55a5113126..6fb08330ca 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 13c1c1fc17..3c19d11f36 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.29.4", + "version": "3.29.5", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 5fbe6bb796..13abf9c5bb 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 6b024b62fe..13e515f3f3 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.29.4", + "version": "3.29.5", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index a71c1d1f21..8caf569a16 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index e0db228f52..cf4e87bf6b 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.29.4", + "version": "3.29.5", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 7fc1eb24cd..b0dbd0efde 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index c29fda0cb5..80203d84c0 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.29.4", + "version": "3.29.5", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 1783c338d7..2f2bafa29c 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index d72e80b505..0d5081c4cb 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.29.4", + "version": "3.29.5", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 4a6fead283..c12e586754 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) + +### Bug Fixes + +- missing normalizeContourSegments ([#2192](https://github.com/cornerstonejs/cornerstone3D/issues/2192)) ([09d1ee0](https://github.com/cornerstonejs/cornerstone3D/commit/09d1ee059ece80088affe1a4953dc67b71c07aa9)) + ## [3.29.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.3...v3.29.4) (2025-07-10) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index e0e9bacf5c..853f3da41c 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.29.4", + "version": "3.29.5", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 1396a52e3ace22acf8f5f0d21f4d4dd03612a802 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 10 Jul 2025 18:05:34 +0000 Subject: [PATCH 045/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index d19f202310..21a092ce0e 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.29.4"; +export const version = "3.29.5"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 21e5a2eafd..884757ed7b 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.4'; +export const version = '3.29.5'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 21e5a2eafd..884757ed7b 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.4'; +export const version = '3.29.5'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 21e5a2eafd..884757ed7b 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.4'; +export const version = '3.29.5'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 21e5a2eafd..884757ed7b 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.4'; +export const version = '3.29.5'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 21e5a2eafd..884757ed7b 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.4'; +export const version = '3.29.5'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 21e5a2eafd..884757ed7b 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.4'; +export const version = '3.29.5'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 21e5a2eafd..884757ed7b 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.4'; +export const version = '3.29.5'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 21e5a2eafd..884757ed7b 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.4'; +export const version = '3.29.5'; From dc8fb42c833bbe30dbbc6c1ab3011ece9d5c7f42 Mon Sep 17 00:00:00 2001 From: Ibrahim <93064150+IbrahimCSAE@users.noreply.github.com> Date: Thu, 10 Jul 2025 22:15:25 -0400 Subject: [PATCH 046/212] feat(rendering): Introduce WebGLContextPool for parallel rendering in ContextPoolRenderingEngine (#2190) --- .../index.ts | 12 +- packages/core/examples/stackBasic/index.ts | 5 +- packages/core/examples/volumeBasic/index.ts | 5 +- .../examples/webGLContextPooling/index.ts | 301 ++++++++++++++++ .../RenderingEngine/BaseRenderingEngine.ts | 62 ++-- .../src/RenderingEngine/BaseVolumeViewport.ts | 61 +++- ...ngine.ts => ContextPoolRenderingEngine.ts} | 339 ++++++++++++------ .../src/RenderingEngine/RenderingEngine.ts | 28 +- .../core/src/RenderingEngine/StackViewport.ts | 66 ++-- ...eringEngine.ts => TiledRenderingEngine.ts} | 23 +- .../src/RenderingEngine/WebGLContextPool.ts | 95 +++++ ...ine.ts => isContextPoolRenderingEngine.ts} | 5 +- packages/core/src/RenderingEngine/index.ts | 8 +- .../core/src/enums/RenderingEngineModeEnum.ts | 4 +- packages/core/src/index.ts | 8 +- packages/core/src/init.ts | 17 +- .../core/src/types/Cornerstone3DConfig.ts | 10 +- .../core/src/types/RenderingEngineMode.ts | 2 +- .../types/VtkOffscreenMultiRenderWindow.ts | 45 +++ packages/core/src/types/index.ts | 2 + .../core/src/utilities/renderToCanvasGPU.ts | 5 +- .../cornerstone-core/renderingEngine.md | 77 ++++ .../tools/examples/contourRendering/index.ts | 5 +- .../tools/examples/labelmapRendering/index.ts | 5 +- .../examples/stackAnnotationTools/index.ts | 5 +- .../examples/volumeAnnotationTools/index.ts | 5 +- .../tools/src/tools/OrientationMarkerTool.ts | 6 +- ....ts => contextPoolRenderingEngine.spec.ts} | 10 +- tests/contourRenderingTiled.spec.ts | 25 ++ tests/labelmapRenderingTiled.spec.ts | 43 +++ .../viewport.png | Bin .../viewport.png | Bin 0 -> 62074 bytes .../labelmapRenderingTiled.spec.ts/axial.png | Bin 0 -> 3765 bytes .../coronal.png | Bin 0 -> 3909 bytes .../sagittal.png | Bin 0 -> 5186 bytes .../stackAnnotation.spec.ts/lengthTool.png | Bin 0 -> 50596 bytes .../lengthTool.png | Bin 0 -> 50596 bytes .../stackBasicTiled.spec.ts/viewport.png | Bin 0 -> 68780 bytes .../volumeAnnotation.spec.ts/lengthTool.png | Bin 0 -> 14660 bytes .../lengthTool.png | Bin 0 -> 14660 bytes .../volumeBasicTiled.spec.ts/viewport.png | Bin 0 -> 101717 bytes .../viewport.png | Bin .../viewport.png | Bin 0 -> 71169 bytes .../labelmapRenderingTiled.spec.ts/axial.png | Bin 0 -> 5723 bytes .../coronal.png | Bin 0 -> 5812 bytes .../sagittal.png | Bin 0 -> 7094 bytes .../stackAnnotation.spec.ts/lengthTool.png | Bin 0 -> 55313 bytes .../lengthTool.png | Bin 0 -> 55313 bytes .../stackBasicTiled.spec.ts/viewport.png | Bin 0 -> 77686 bytes .../volumeAnnotation.spec.ts/lengthTool.png | Bin 0 -> 15318 bytes .../lengthTool.png | Bin 0 -> 15318 bytes .../volumeBasicTiled.spec.ts/viewport.png | Bin 0 -> 114100 bytes .../viewport.png | Bin .../viewport.png | Bin 0 -> 65797 bytes .../labelmapRenderingTiled.spec.ts/axial.png | Bin 0 -> 16162 bytes .../coronal.png | Bin 0 -> 22025 bytes .../sagittal.png | Bin 0 -> 25365 bytes .../stackAnnotation.spec.ts/lengthTool.png | Bin 0 -> 50596 bytes .../lengthTool.png | Bin 0 -> 50596 bytes .../stackBasicTiled.spec.ts/viewport.png | Bin 0 -> 68780 bytes .../volumeAnnotation.spec.ts/lengthTool.png | Bin 0 -> 57028 bytes .../lengthTool.png | Bin 0 -> 57028 bytes .../volumeBasicTiled.spec.ts/viewport.png | Bin 0 -> 101717 bytes .../viewport.png | Bin .../viewport.png | Bin 0 -> 74597 bytes .../labelmapRenderingTiled.spec.ts/axial.png | Bin 0 -> 19831 bytes .../coronal.png | Bin 0 -> 26466 bytes .../sagittal.png | Bin 0 -> 29006 bytes .../stackAnnotation.spec.ts/lengthTool.png | Bin 0 -> 55313 bytes .../lengthTool.png | Bin 0 -> 55313 bytes .../stackBasicTiled.spec.ts/viewport.png | Bin 0 -> 77686 bytes .../volumeAnnotation.spec.ts/lengthTool.png | Bin 0 -> 60828 bytes .../lengthTool.png | Bin 0 -> 60828 bytes .../volumeBasicTiled.spec.ts/viewport.png | Bin 0 -> 114100 bytes tests/stackAnnotation.spec.ts | 23 ++ tests/stackAnnotationTiled.spec.ts | 24 ++ tests/stackBasicTiled.spec.ts | 24 ++ tests/utils/screenShotPaths.ts | 28 +- tests/volumeAnnotation.spec.ts | 23 ++ tests/volumeAnnotationTiled.spec.ts | 24 ++ tests/volumeBasicTiled.spec.ts | 25 ++ utils/ExampleRunner/example-info.json | 12 +- utils/demo/helpers/index.js | 4 + 83 files changed, 1244 insertions(+), 227 deletions(-) rename packages/core/examples/{sequentialrenderingengine => contextpoolrenderingengine}/index.ts (92%) create mode 100644 packages/core/examples/webGLContextPooling/index.ts rename packages/core/src/RenderingEngine/{SequentialRenderingEngine.ts => ContextPoolRenderingEngine.ts} (52%) rename packages/core/src/RenderingEngine/{StandardRenderingEngine.ts => TiledRenderingEngine.ts} (97%) create mode 100644 packages/core/src/RenderingEngine/WebGLContextPool.ts rename packages/core/src/RenderingEngine/helpers/{isSequentialRenderingEngine.ts => isContextPoolRenderingEngine.ts} (51%) create mode 100644 packages/core/src/types/VtkOffscreenMultiRenderWindow.ts rename tests/{sequentialRenderingEngine.spec.ts => contextPoolRenderingEngine.spec.ts} (59%) create mode 100644 tests/contourRenderingTiled.spec.ts create mode 100644 tests/labelmapRenderingTiled.spec.ts rename tests/screenshots/Mobile-Android/{sequentialRenderingEngine.spec.ts => contextPoolRenderingEngine.spec.ts}/viewport.png (100%) create mode 100644 tests/screenshots/Mobile-Android/contourRenderingTiled.spec.ts/viewport.png create mode 100644 tests/screenshots/Mobile-Android/labelmapRenderingTiled.spec.ts/axial.png create mode 100644 tests/screenshots/Mobile-Android/labelmapRenderingTiled.spec.ts/coronal.png create mode 100644 tests/screenshots/Mobile-Android/labelmapRenderingTiled.spec.ts/sagittal.png create mode 100644 tests/screenshots/Mobile-Android/stackAnnotation.spec.ts/lengthTool.png create mode 100644 tests/screenshots/Mobile-Android/stackAnnotationTiled.spec.ts/lengthTool.png create mode 100644 tests/screenshots/Mobile-Android/stackBasicTiled.spec.ts/viewport.png create mode 100644 tests/screenshots/Mobile-Android/volumeAnnotation.spec.ts/lengthTool.png create mode 100644 tests/screenshots/Mobile-Android/volumeAnnotationTiled.spec.ts/lengthTool.png create mode 100644 tests/screenshots/Mobile-Android/volumeBasicTiled.spec.ts/viewport.png rename tests/screenshots/Mobile-Safari/{sequentialRenderingEngine.spec.ts => contextPoolRenderingEngine.spec.ts}/viewport.png (100%) create mode 100644 tests/screenshots/Mobile-Safari/contourRenderingTiled.spec.ts/viewport.png create mode 100644 tests/screenshots/Mobile-Safari/labelmapRenderingTiled.spec.ts/axial.png create mode 100644 tests/screenshots/Mobile-Safari/labelmapRenderingTiled.spec.ts/coronal.png create mode 100644 tests/screenshots/Mobile-Safari/labelmapRenderingTiled.spec.ts/sagittal.png create mode 100644 tests/screenshots/Mobile-Safari/stackAnnotation.spec.ts/lengthTool.png create mode 100644 tests/screenshots/Mobile-Safari/stackAnnotationTiled.spec.ts/lengthTool.png create mode 100644 tests/screenshots/Mobile-Safari/stackBasicTiled.spec.ts/viewport.png create mode 100644 tests/screenshots/Mobile-Safari/volumeAnnotation.spec.ts/lengthTool.png create mode 100644 tests/screenshots/Mobile-Safari/volumeAnnotationTiled.spec.ts/lengthTool.png create mode 100644 tests/screenshots/Mobile-Safari/volumeBasicTiled.spec.ts/viewport.png rename tests/screenshots/chromium/{sequentialRenderingEngine.spec.ts => contextPoolRenderingEngine.spec.ts}/viewport.png (100%) create mode 100644 tests/screenshots/chromium/contourRenderingTiled.spec.ts/viewport.png create mode 100644 tests/screenshots/chromium/labelmapRenderingTiled.spec.ts/axial.png create mode 100644 tests/screenshots/chromium/labelmapRenderingTiled.spec.ts/coronal.png create mode 100644 tests/screenshots/chromium/labelmapRenderingTiled.spec.ts/sagittal.png create mode 100644 tests/screenshots/chromium/stackAnnotation.spec.ts/lengthTool.png create mode 100644 tests/screenshots/chromium/stackAnnotationTiled.spec.ts/lengthTool.png create mode 100644 tests/screenshots/chromium/stackBasicTiled.spec.ts/viewport.png create mode 100644 tests/screenshots/chromium/volumeAnnotation.spec.ts/lengthTool.png create mode 100644 tests/screenshots/chromium/volumeAnnotationTiled.spec.ts/lengthTool.png create mode 100644 tests/screenshots/chromium/volumeBasicTiled.spec.ts/viewport.png rename tests/screenshots/webkit/{sequentialRenderingEngine.spec.ts => contextPoolRenderingEngine.spec.ts}/viewport.png (100%) create mode 100644 tests/screenshots/webkit/contourRenderingTiled.spec.ts/viewport.png create mode 100644 tests/screenshots/webkit/labelmapRenderingTiled.spec.ts/axial.png create mode 100644 tests/screenshots/webkit/labelmapRenderingTiled.spec.ts/coronal.png create mode 100644 tests/screenshots/webkit/labelmapRenderingTiled.spec.ts/sagittal.png create mode 100644 tests/screenshots/webkit/stackAnnotation.spec.ts/lengthTool.png create mode 100644 tests/screenshots/webkit/stackAnnotationTiled.spec.ts/lengthTool.png create mode 100644 tests/screenshots/webkit/stackBasicTiled.spec.ts/viewport.png create mode 100644 tests/screenshots/webkit/volumeAnnotation.spec.ts/lengthTool.png create mode 100644 tests/screenshots/webkit/volumeAnnotationTiled.spec.ts/lengthTool.png create mode 100644 tests/screenshots/webkit/volumeBasicTiled.spec.ts/viewport.png create mode 100644 tests/stackAnnotation.spec.ts create mode 100644 tests/stackAnnotationTiled.spec.ts create mode 100644 tests/stackBasicTiled.spec.ts create mode 100644 tests/volumeAnnotation.spec.ts create mode 100644 tests/volumeAnnotationTiled.spec.ts create mode 100644 tests/volumeBasicTiled.spec.ts diff --git a/packages/core/examples/sequentialrenderingengine/index.ts b/packages/core/examples/contextpoolrenderingengine/index.ts similarity index 92% rename from packages/core/examples/sequentialrenderingengine/index.ts rename to packages/core/examples/contextpoolrenderingengine/index.ts index 1e8a3e1d95..cf041782be 100644 --- a/packages/core/examples/sequentialrenderingengine/index.ts +++ b/packages/core/examples/contextpoolrenderingengine/index.ts @@ -21,11 +21,11 @@ const columns = parseInt(params.get('columns')) || 6; const count = rows * columns; setTitleAndDescription( - `${columns}x${rows} Grid with SequentialRenderingEngine`, - `Displays a ${columns}x${rows} grid of viewports using SequentialRenderingEngine with resize observer` + `${columns}x${rows} Grid with ContextPoolRenderingEngine`, + `Displays a ${columns}x${rows} grid of viewports using ContextPoolRenderingEngine with resize observer` ); -const renderingEngineId = 'mySequentialRenderingEngine'; +const renderingEngineId = 'myContextPoolRenderingEngine'; let renderingEngine: RenderingEngine; let resizeTimeout: number; @@ -113,7 +113,7 @@ async function run() { wadoRsRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', }); - // Instantiate a SequentialRenderingEngine + // Instantiate a ContextPoolRenderingEngine renderingEngine = new RenderingEngine(renderingEngineId); // Create viewport input array for all 36 viewports @@ -169,9 +169,9 @@ async function run() { info.style.padding = '10px'; info.style.borderRadius = '5px'; info.innerHTML = ` -

SequentialRenderingEngine Example

+

ContextPoolRenderingEngine Example

${count} viewports (${columns}x${rows} grid)

-

Using SequentialRenderingEngine for better performance with large viewport counts

+

Using ContextPoolRenderingEngine for better performance with large viewport counts

Resize the window to test resize observer

Avoids WebGL, browser and OS limits

`; diff --git a/packages/core/examples/stackBasic/index.ts b/packages/core/examples/stackBasic/index.ts index c34595a60d..52a09de1ee 100644 --- a/packages/core/examples/stackBasic/index.ts +++ b/packages/core/examples/stackBasic/index.ts @@ -36,7 +36,10 @@ content.appendChild(element); */ async function run() { // Init Cornerstone and related libraries - await initDemo(); + const config = (window as any).IS_TILED + ? { core: { renderingEngineMode: 'tiled' } } + : {}; + await initDemo(config); // Get Cornerstone imageIds and fetch metadata into RAM const imageIds = await createImageIdsAndCacheMetaData({ diff --git a/packages/core/examples/volumeBasic/index.ts b/packages/core/examples/volumeBasic/index.ts index 57c1b66519..6bca1b5637 100644 --- a/packages/core/examples/volumeBasic/index.ts +++ b/packages/core/examples/volumeBasic/index.ts @@ -39,7 +39,10 @@ content.appendChild(element); */ async function run() { // Init Cornerstone and related libraries - await initDemo(); + const config = (window as any).IS_TILED + ? { core: { renderingEngineMode: 'tiled' } } + : {}; + await initDemo(config); // Get Cornerstone imageIds and fetch metadata into RAM const imageIds = await createImageIdsAndCacheMetaData({ diff --git a/packages/core/examples/webGLContextPooling/index.ts b/packages/core/examples/webGLContextPooling/index.ts new file mode 100644 index 0000000000..4053567202 --- /dev/null +++ b/packages/core/examples/webGLContextPooling/index.ts @@ -0,0 +1,301 @@ +import type { Types } from '@cornerstonejs/core'; +import { + RenderingEngine, + Enums, + init as csRenderInit, + getRenderingEngine, +} from '@cornerstonejs/core'; +import { + createImageIdsAndCacheMetaData, + setTitleAndDescription, + initProviders, + initVolumeLoader, +} from '../../../../utils/demo/helpers'; +import * as cornerstoneTools from '@cornerstonejs/tools'; +import { init as csToolsInit } from '@cornerstonejs/tools'; +import cornerstoneDICOMImageLoader from '@cornerstonejs/dicom-image-loader'; + +const { + PanTool, + WindowLevelTool, + ZoomTool, + ToolGroupManager, + StackScrollTool, + Enums: csToolsEnums, + synchronizers, +} = cornerstoneTools; + +const { ViewportType } = Enums; +const { MouseBindings } = csToolsEnums; +const { createImageSliceSynchronizer } = synchronizers; + +// Define unique ids +const renderingEngineId = 'myRenderingEngine'; +const toolGroupId = 'STACK_TOOL_GROUP'; +const imageSliceSyncronizerId = 'IMAGE_SLICE_SYNCHRONIZER'; + +// Create viewport IDs for 8x8 grid +const viewportIds: string[] = []; +for (let row = 0; row < 8; row++) { + for (let col = 0; col < 8; col++) { + viewportIds.push(`STACK_VIEWPORT_${row}_${col}`); + } +} + +// ResizeObserver setup +let resizeTimeout: number; + +// Debounced resize handler +const handleResize = () => { + clearTimeout(resizeTimeout); + resizeTimeout = window.setTimeout(() => { + const renderingEngine = getRenderingEngine(renderingEngineId); + if (renderingEngine) { + renderingEngine.resize(true, false); + } + }, 50); // 50ms debounce +}; + +// Create ResizeObserver for dynamic resizing +const resizeObserver = new ResizeObserver(handleResize); + +// ======== Set up page ======== // +setTitleAndDescription( + 'WebGL Context Pooling - 8x8 Grid', + `Demonstrates an 8x8 grid of synchronized stack viewports with configurable WebGL context pooling, use left click to scroll through the stack in all viewports. The current number of WebGL contexts is set to ${ + localStorage.getItem('webglContextCount') || 1 + }.` +); + +const content = document.getElementById('content'); + +// Ensure no scroll overflow +document.body.style.overflow = 'hidden'; +content.style.overflow = 'hidden'; + +// Create WebGL context count control +const controlsDiv = document.createElement('div'); +controlsDiv.style.marginBottom = '10px'; + +const contextCountLabel = document.createElement('label'); +contextCountLabel.innerText = 'WebGL Context Count: '; +contextCountLabel.style.marginRight = '10px'; + +const contextCountDropdown = document.createElement('select'); +const contextOptions = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]; + +// Get stored value or default to 1 +const storedContextCount = localStorage.getItem('webglContextCount'); +const currentContextCount = storedContextCount + ? parseInt(storedContextCount) + : 1; + +contextOptions.forEach((value) => { + const option = document.createElement('option'); + option.value = value.toString(); + option.text = value.toString(); + if (value === currentContextCount) { + option.selected = true; + } + contextCountDropdown.appendChild(option); +}); + +contextCountDropdown.addEventListener('change', (e) => { + const newValue = (e.target as HTMLSelectElement).value; + localStorage.setItem('webglContextCount', newValue); + location.reload(); +}); + +controlsDiv.appendChild(contextCountLabel); +controlsDiv.appendChild(contextCountDropdown); +content.appendChild(controlsDiv); + +// Create viewport grid container +const viewportGrid = document.createElement('div'); +viewportGrid.style.display = 'grid'; +viewportGrid.style.gridTemplateColumns = 'repeat(8, 1fr)'; +viewportGrid.style.gridTemplateRows = 'repeat(8, 1fr)'; +viewportGrid.style.gap = '2px'; +viewportGrid.style.width = '100%'; +viewportGrid.style.height = 'calc(100vh - 200px)'; // Account for controls and text +viewportGrid.style.backgroundColor = '#000'; + +content.appendChild(viewportGrid); + +// Observe the viewport grid for resize events +resizeObserver.observe(viewportGrid); + +// Create viewport elements +const viewportElements: HTMLDivElement[] = []; +const sliceCountElements: HTMLDivElement[] = []; + +for (let i = 0; i < 64; i++) { + const viewportContainer = document.createElement('div'); + viewportContainer.style.position = 'relative'; + viewportContainer.style.width = '100%'; + viewportContainer.style.height = '100%'; + + const element = document.createElement('div'); + element.style.width = '100%'; + element.style.height = '100%'; + element.oncontextmenu = (e) => e.preventDefault(); + + // Create slice count display + const sliceCountDiv = document.createElement('div'); + sliceCountDiv.style.position = 'absolute'; + sliceCountDiv.style.top = '5px'; + sliceCountDiv.style.left = '5px'; + sliceCountDiv.style.color = 'white'; + sliceCountDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'; + sliceCountDiv.style.padding = '2px 5px'; + sliceCountDiv.style.fontSize = '12px'; + sliceCountDiv.style.zIndex = '1000'; + sliceCountDiv.style.pointerEvents = 'none'; + sliceCountDiv.innerText = 'Slice: 0/0'; + + viewportContainer.appendChild(element); + viewportContainer.appendChild(sliceCountDiv); + viewportGrid.appendChild(viewportContainer); + + viewportElements.push(element); + sliceCountElements.push(sliceCountDiv); +} + +/** + * Update slice count display for a viewport + */ +function updateSliceCount( + viewportId: string, + currentIndex: number, + totalImages: number +) { + const viewportIndex = viewportIds.indexOf(viewportId); + if (viewportIndex !== -1) { + sliceCountElements[viewportIndex].innerText = `Slice: ${ + currentIndex + 1 + }/${totalImages}`; + } +} + +/** + * Runs the demo + */ +async function run() { + // Initialize providers and loaders + initProviders(); + cornerstoneDICOMImageLoader.init(); + initVolumeLoader(); + + // Initialize Cornerstone with custom WebGL context count + await csRenderInit({ + rendering: { + webGlContextCount: currentContextCount, + }, + }); + + // Initialize cornerstone tools + await csToolsInit(); + + // Add tools to Cornerstone3D + cornerstoneTools.addTool(PanTool); + cornerstoneTools.addTool(WindowLevelTool); + cornerstoneTools.addTool(StackScrollTool); + cornerstoneTools.addTool(ZoomTool); + + // Create a tool group for all viewports + const toolGroup = ToolGroupManager.createToolGroup(toolGroupId); + + // Add tools to the tool group + toolGroup.addTool(StackScrollTool.toolName); + + // Set the initial state of the tools + toolGroup.setToolActive(StackScrollTool.toolName, { + bindings: [ + { + mouseButton: MouseBindings.Primary, // Left Click + }, + ], + }); + + // Get Cornerstone imageIds and fetch metadata into RAM + const imageIds = await createImageIdsAndCacheMetaData({ + StudyInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.334240657131972136850343327463', + SeriesInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.226151125820845824875394858561', + wadoRsRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', + }); + + // Instantiate a rendering engine + const renderingEngine = new RenderingEngine(renderingEngineId); + + // Create the viewports + const viewportInputArray: Types.PublicViewportInput[] = viewportIds.map( + (viewportId, index) => ({ + viewportId, + type: ViewportType.STACK, + element: viewportElements[index], + defaultOptions: { + background: [0.1, 0.1, 0.1], + }, + }) + ); + + renderingEngine.setViewports(viewportInputArray); + + // Set the tool group on all viewports + viewportIds.forEach((viewportId) => { + toolGroup.addViewport(viewportId, renderingEngineId); + }); + + // Get all stack viewports + const stackViewports = renderingEngine.getStackViewports(); + + // Set the stack on each viewport + await Promise.all( + stackViewports.map(async (viewport) => { + await viewport.setStack(imageIds); + + // Update initial slice count + updateSliceCount( + viewport.id, + viewport.getCurrentImageIdIndex(), + imageIds.length + ); + + // Add event listener for stack scroll + viewport.element.addEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, (( + evt: Types.EventTypes.StackViewportScrollEvent + ) => { + updateSliceCount( + viewport.id, + evt.detail.newImageIdIndex, + imageIds.length + ); + }) as EventListener); + }) + ); + + // Create and configure the image slice synchronizer + const imageSliceSynchronizer = createImageSliceSynchronizer( + imageSliceSyncronizerId + ); + + // Add all viewports to the synchronizer + viewportIds.forEach((viewportId) => { + imageSliceSynchronizer.add({ + renderingEngineId, + viewportId, + }); + }); + + // Enable stack prefetch for all viewports + stackViewports.forEach((viewport) => { + cornerstoneTools.utilities.stackPrefetch.enable(viewport.element); + }); + + // Render all viewports + renderingEngine.renderViewports(viewportIds); +} + +run(); diff --git a/packages/core/src/RenderingEngine/BaseRenderingEngine.ts b/packages/core/src/RenderingEngine/BaseRenderingEngine.ts index 9778c4c768..7a78cfb338 100644 --- a/packages/core/src/RenderingEngine/BaseRenderingEngine.ts +++ b/packages/core/src/RenderingEngine/BaseRenderingEngine.ts @@ -3,7 +3,6 @@ import renderingEngineCache from './renderingEngineCache'; import eventTarget from '../eventTarget'; import uuidv4 from '../utilities/uuidv4'; import triggerEvent from '../utilities/triggerEvent'; -import { vtkOffscreenMultiRenderWindow } from './vtkClasses'; import ViewportType from '../enums/ViewportType'; import BaseVolumeViewport from './BaseVolumeViewport'; import StackViewport from './StackViewport'; @@ -22,6 +21,7 @@ import type { IViewport, } from '../types/IViewport'; import { OrientationAxis } from '../enums'; +import type { VtkOffscreenMultiRenderWindow } from '../types'; // Rendering engines seem to not like rendering things less than 2 pixels per side export const VIEWPORT_MIN_SIZE = 2; @@ -39,8 +39,8 @@ abstract class BaseRenderingEngine { /** A flag which tells if the renderingEngine has been destroyed or not */ public hasBeenDestroyed: boolean; // eslint-disable-next-line @typescript-eslint/no-explicit-any - public offscreenMultiRenderWindow: any; - readonly offScreenCanvasContainer: HTMLDivElement; + public offscreenMultiRenderWindow: VtkOffscreenMultiRenderWindow; + public offScreenCanvasContainer: HTMLDivElement; protected _viewports: Map; protected _needsRender = new Set(); protected _animationFrameSet = false; @@ -62,15 +62,6 @@ abstract class BaseRenderingEngine { ); } - if (!this.useCPURendering) { - this.offscreenMultiRenderWindow = - vtkOffscreenMultiRenderWindow.newInstance(); - this.offScreenCanvasContainer = document.createElement('div'); - this.offscreenMultiRenderWindow.setContainer( - this.offScreenCanvasContainer - ); - } - this._viewports = new Map(); this.hasBeenDestroyed = false; } @@ -177,7 +168,10 @@ abstract class BaseRenderingEngine { !viewportTypeUsesCustomRenderingPipeline(viewport.type) && !this.useCPURendering ) { - this.offscreenMultiRenderWindow.removeRenderer(viewportId); + // Only remove renderer if offscreenMultiRenderWindow exists (not in ContextPoolRenderingEngine) + if (this.offscreenMultiRenderWindow) { + this.offscreenMultiRenderWindow.removeRenderer(viewportId); + } } // 5. Remove the requested viewport from the rendering engine @@ -445,11 +439,15 @@ abstract class BaseRenderingEngine { if (!this.useCPURendering) { const viewports = this._getViewportsAsArray(); viewports.forEach((vp) => { - this.offscreenMultiRenderWindow.removeRenderer(vp.id); + if (this.offscreenMultiRenderWindow) { + this.offscreenMultiRenderWindow.removeRenderer(vp.id); + } }); // Free up WebGL resources - this.offscreenMultiRenderWindow.delete(); + if (this.offscreenMultiRenderWindow) { + this.offscreenMultiRenderWindow.delete(); + } // Make sure all references go stale and are garbage collected. delete this.offscreenMultiRenderWindow; @@ -634,6 +632,29 @@ abstract class BaseRenderingEngine { triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail); } + /** + * Returns the renderer for a given viewportId. + * @param viewportId - The Id of the viewport. + * @returns The renderer for the viewport. + */ + public getRenderer(viewportId) { + return this.offscreenMultiRenderWindow.getRenderer(viewportId); + } + + /** + * Returns the offscreen multi-render window used for rendering. + */ + public getOffscreenMultiRenderWindow( + viewportId?: string + ): VtkOffscreenMultiRenderWindow { + if (this.useCPURendering) { + throw new Error( + 'Offscreen multi render window is not available when using CPU rendering.' + ); + } + return this.offscreenMultiRenderWindow; + } + /** * Sets multiple viewports using custom rendering * pipelines to the `RenderingEngine`. @@ -804,17 +825,6 @@ abstract class BaseRenderingEngine { viewportInputEntries: NormalizedViewportInput[] ): void; - /** - * Renders the given viewport using its preferred method. - * This method must be implemented by subclasses to define their specific - * rendering approach. - * - * @param viewport - The viewport to render - */ - protected abstract renderViewportUsingCustomOrVtkPipeline( - viewport: IViewport - ): EventTypes.ImageRenderedEventDetail; - /** * Renders a particular `Viewport`'s on screen canvas. * This method must be implemented by subclasses to define how to copy diff --git a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts index 6b55b5dca9..2d3a3edb0d 100644 --- a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts +++ b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts @@ -74,7 +74,8 @@ import imageIdToURI from '../utilities/imageIdToURI'; import uuidv4 from '../utilities/uuidv4'; import * as metaData from '../metaData'; import { getCameraVectors } from './helpers/getCameraVectors'; -import { isSequentialRenderingEngine } from './helpers/isSequentialRenderingEngine'; +import { isContextPoolRenderingEngine } from './helpers/isContextPoolRenderingEngine'; +import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; /** * Abstract base class for volume viewports. VolumeViewports are used to render * 3D volumes from which various orientations can be viewed. Since VolumeViewports @@ -1603,7 +1604,7 @@ abstract class BaseVolumeViewport extends Viewport { * @public */ - public canvasToWorld = (canvasPos: Point2): Point3 => { + public canvasToWorldTiled = (canvasPos: Point2): Point3 => { const vtkCamera = this.getVtkActiveCamera() as vtkSlabCameraType; /** @@ -1631,7 +1632,7 @@ abstract class BaseVolumeViewport extends Viewport { vtkCamera.setIsPerformingCoordinateTransformation?.(true); const renderer = this.getRenderer(); - const displayCoords = this.getVtkDisplayCoords(canvasPos); + const displayCoords = this.getVtkDisplayCoordsTiled(canvasPos); const offscreenMultiRenderWindow = this.getRenderingEngine().offscreenMultiRenderWindow; const openGLRenderWindow = @@ -1648,7 +1649,7 @@ abstract class BaseVolumeViewport extends Viewport { return [worldCoord[0], worldCoord[1], worldCoord[2]]; }; - public canvasToWorldSequential = (canvasPos: Point2): Point3 => { + public canvasToWorldContextPool = (canvasPos: Point2): Point3 => { const vtkCamera = this.getVtkActiveCamera() as vtkSlabCameraType; /** @@ -1723,7 +1724,7 @@ abstract class BaseVolumeViewport extends Viewport { * @returns The corresponding display coordinates. * */ - public getVtkDisplayCoords = (canvasPos: Point2): Point3 => { + public getVtkDisplayCoordsTiled = (canvasPos: Point2): Point3 => { const devicePixelRatio = window.devicePixelRatio || 1; const canvasPosWithDPR = [ canvasPos[0] * devicePixelRatio, @@ -1744,7 +1745,7 @@ abstract class BaseVolumeViewport extends Viewport { return [displayCoord[0], displayCoord[1], 0]; }; - public getVtkDisplayCoordsSequential = (canvasPos: Point2): Point3 => { + public getVtkDisplayCoordsContextPool = (canvasPos: Point2): Point3 => { const devicePixelRatio = window.devicePixelRatio || 1; const canvasPosWithDPR = [ canvasPos[0] * devicePixelRatio, @@ -1768,7 +1769,7 @@ abstract class BaseVolumeViewport extends Viewport { * @returns The corresponding canvas coordinates. * @public */ - public worldToCanvas = (worldPos: Point3): Point2 => { + public worldToCanvasTiled = (worldPos: Point3): Point2 => { const vtkCamera = this.getVtkActiveCamera() as vtkSlabCameraType; /** @@ -1825,7 +1826,7 @@ abstract class BaseVolumeViewport extends Viewport { return canvasCoordWithDPR; }; - public worldToCanvasSequential = (worldPos: Point3): Point2 => { + public worldToCanvasContextPool = (worldPos: Point3): Point2 => { const vtkCamera = this.getVtkActiveCamera() as vtkSlabCameraType; /** @@ -1893,6 +1894,29 @@ abstract class BaseVolumeViewport extends Viewport { return canvasCoordWithDPR; }; + /** + * Get the renderer for this viewport - handles ContextPoolRenderingEngine + */ + public getRendererContextPool(): vtkRenderer { + const renderingEngine = this.getRenderingEngine(); + return renderingEngine.getRenderer(this.id); + } + + /** + * Returns the `vtkRenderer` responsible for rendering the `Viewport`. + * + * @returns The `vtkRenderer` for the `Viewport`. + */ + public getRendererTiled(): vtkRenderer { + const renderingEngine = this.getRenderingEngine(); + + if (!renderingEngine || renderingEngine.hasBeenDestroyed) { + throw new Error('Rendering engine has been destroyed'); + } + + return renderingEngine.offscreenMultiRenderWindow?.getRenderer(this.id); + } + /* * Checking if the imageURI is in the volumes that are being * rendered by the viewport. imageURI is the imageId without the schema @@ -2137,8 +2161,7 @@ abstract class BaseVolumeViewport extends Viewport { } private _configureRenderingPipeline() { - const renderingEngine = this.getRenderingEngine(); - const isSequential = isSequentialRenderingEngine(renderingEngine); + const isContextPool = isContextPoolRenderingEngine(); for (const key in this.renderingPipelineFunctions) { if ( @@ -2149,23 +2172,27 @@ abstract class BaseVolumeViewport extends Viewport { ) { const functions = this.renderingPipelineFunctions[key]; - this[key] = isSequential ? functions.sequential : functions.default; + this[key] = isContextPool ? functions.contextPool : functions.tiled; } } } protected renderingPipelineFunctions = { worldToCanvas: { - default: this.worldToCanvas, - sequential: this.worldToCanvasSequential, + tiled: this.worldToCanvasTiled, + contextPool: this.worldToCanvasContextPool, }, canvasToWorld: { - default: this.canvasToWorld, - sequential: this.canvasToWorldSequential, + tiled: this.canvasToWorldTiled, + contextPool: this.canvasToWorldContextPool, }, getVtkDisplayCoords: { - default: this.getVtkDisplayCoords, - sequential: this.getVtkDisplayCoordsSequential, + tiled: this.getVtkDisplayCoordsTiled, + contextPool: this.getVtkDisplayCoordsContextPool, + }, + getRenderer: { + tiled: this.getRendererTiled, + contextPool: this.getRendererContextPool, }, }; } diff --git a/packages/core/src/RenderingEngine/SequentialRenderingEngine.ts b/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts similarity index 52% rename from packages/core/src/RenderingEngine/SequentialRenderingEngine.ts rename to packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts index 097fa15906..2e43b6f9da 100644 --- a/packages/core/src/RenderingEngine/SequentialRenderingEngine.ts +++ b/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts @@ -1,16 +1,17 @@ import BaseRenderingEngine, { VIEWPORT_MIN_SIZE } from './BaseRenderingEngine'; +import WebGLContextPool from './WebGLContextPool'; +import { getConfiguration } from '../init'; import Events from '../enums/Events'; import eventTarget from '../eventTarget'; import triggerEvent from '../utilities/triggerEvent'; import ViewportType from '../enums/ViewportType'; import VolumeViewport from './VolumeViewport'; import StackViewport from './StackViewport'; +import VolumeViewport3D from './VolumeViewport3D'; import viewportTypeUsesCustomRenderingPipeline from './helpers/viewportTypeUsesCustomRenderingPipeline'; import getOrCreateCanvas from './helpers/getOrCreateCanvas'; import type IStackViewport from '../types/IStackViewport'; import type IVolumeViewport from '../types/IVolumeViewport'; -import VolumeViewport3D from './VolumeViewport3D'; -import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; import type * as EventTypes from '../types/EventTypes'; import type { @@ -19,16 +20,28 @@ import type { NormalizedViewportInput, IViewport, } from '../types/IViewport'; +import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; +import type { VtkOffscreenMultiRenderWindow } from '../types'; /** - * SequentialRenderingEngine extends BaseRenderingEngine to provide a different - * rendering strategy where viewports are rendered sequentially one at a time on the offscreen, - * rather than all at once. - * + * ContextPoolRenderingEngine extends BaseRenderingEngine to provide parallel rendering + * capabilities using multiple WebGL contexts for improved performance. * * @public */ -class SequentialRenderingEngine extends BaseRenderingEngine { +class ContextPoolRenderingEngine extends BaseRenderingEngine { + private contextPool: WebGLContextPool; + + constructor(id?: string) { + super(id); + const { rendering } = getConfiguration(); + const { webGlContextCount } = rendering; + + if (!this.useCPURendering) { + this.contextPool = new WebGLContextPool(webGlContextCount); + } + } + /** * Enables a viewport to be driven by the offscreen vtk.js rendering engine. * @@ -66,7 +79,20 @@ class SequentialRenderingEngine extends BaseRenderingEngine { element.tabIndex = -1; - this.offscreenMultiRenderWindow.addRenderer({ + // Assign viewport to a context + // Stack viewports get distributed across contexts, all others use context 0 + let contextIndex = 0; + if (type === ViewportType.STACK) { + const contexts = this.contextPool.getAllContexts(); + contextIndex = this._viewports.size % contexts.length; + } + this.contextPool.assignViewportToContext(viewportId, contextIndex); + + // Get the context and add the renderer + const contextData = this.contextPool.getContextByIndex(contextIndex); + + const { context: offscreenMultiRenderWindow } = contextData; + offscreenMultiRenderWindow.addRenderer({ viewport: [0, 0, 1, 1], id: viewportId, background: defaultOptions.background @@ -204,50 +230,80 @@ class SequentialRenderingEngine extends BaseRenderingEngine { /** * Renders all viewports. */ - protected _renderFlaggedViewports = () => { + protected _renderFlaggedViewports = (): void => { this._throwIfDestroyed(); const viewports = this._getViewportsAsArray(); - const eventDetailArray = []; - - for (let i = 0; i < viewports.length; i++) { - const viewport = viewports[i]; - if (this._needsRender.has(viewport.id)) { - const eventDetail = - this.renderViewportUsingCustomOrVtkPipeline(viewport); - eventDetailArray.push(eventDetail); - viewport.setRendered(); - - this._needsRender.delete(viewport.id); + const viewportsToRender = viewports.filter((vp) => + this._needsRender.has(vp.id) + ); - if (this._needsRender.size === 0) { - break; - } - } + if (viewportsToRender.length === 0) { + this._animationFrameSet = false; + this._animationFrameHandle = null; + return; } + // Render all viewports synchronously + const eventDetails = viewportsToRender.map((viewport) => { + const eventDetail = this.renderViewportUsingCustomOrVtkPipeline(viewport); + viewport.setRendered(); + this._needsRender.delete(viewport.id); + return eventDetail; + }); + this._animationFrameSet = false; this._animationFrameHandle = null; - eventDetailArray.forEach((eventDetail) => { - if (!eventDetail?.element) { - return; + // Trigger all events after rendering is complete + eventDetails.forEach((eventDetail) => { + if (eventDetail?.element) { + triggerEvent(eventDetail.element, Events.IMAGE_RENDERED, eventDetail); } - triggerEvent(eventDetail.element, Events.IMAGE_RENDERED, eventDetail); }); }; - /** - * Renders the given viewport - * using its proffered method. - * - * @param viewport - The viewport to render - */ - protected renderViewportUsingCustomOrVtkPipeline( + private renderViewportUsingCustomOrVtkPipeline( viewport: IViewport ): EventTypes.ImageRenderedEventDetail { - let eventDetail: EventTypes.ImageRenderedEventDetail; + // Handle custom rendering pipeline viewports + if (viewportTypeUsesCustomRenderingPipeline(viewport.type)) { + const eventDetail = + viewport.customRenderViewportToCanvas() as EventTypes.ImageRenderedEventDetail; + return eventDetail; + } + + // If using CPU rendering, throw error + if (this.useCPURendering) { + throw new Error( + 'GPU not available, and using a viewport with no custom render pipeline.' + ); + } + + // Get the context assigned to this viewport + const assignedContextIndex = this.contextPool.getContextIndexForViewport( + viewport.id + ); + + const contextData = + this.contextPool.getContextByIndex(assignedContextIndex); + + const { context, container } = contextData; + + const eventDetail = this._renderViewportWithContext( + viewport, + context, + container + ); + return eventDetail; + } + private _renderViewportWithContext( + viewport: IViewport, + offscreenMultiRenderWindow: VtkOffscreenMultiRenderWindow, + offScreenCanvasContainer: HTMLDivElement + ): EventTypes.ImageRenderedEventDetail { + // Check viewport size if ( viewport.sWidth < VIEWPORT_MIN_SIZE || viewport.sHeight < VIEWPORT_MIN_SIZE @@ -255,51 +311,59 @@ class SequentialRenderingEngine extends BaseRenderingEngine { console.warn('Viewport is too small', viewport.sWidth, viewport.sHeight); return; } - if (viewportTypeUsesCustomRenderingPipeline(viewport.type) === true) { - eventDetail = - viewport.customRenderViewportToCanvas() as EventTypes.ImageRenderedEventDetail; - } else { - if (this.useCPURendering) { - throw new Error( - 'GPU not available, and using a viewport with no custom render pipeline.' - ); - } - const { offscreenMultiRenderWindow } = this; - const renderWindow = offscreenMultiRenderWindow.getRenderWindow(); + if (viewportTypeUsesCustomRenderingPipeline(viewport.type)) { + return viewport.customRenderViewportToCanvas() as EventTypes.ImageRenderedEventDetail; + } - this._resizeOffScreenCanvasForSingleViewport(viewport.canvas); + if (this.useCPURendering) { + throw new Error( + 'GPU not available, and using a viewport with no custom render pipeline.' + ); + } - const renderer = offscreenMultiRenderWindow.getRenderer(viewport.id); + // Add renderer if not already present + if (!offscreenMultiRenderWindow.getRenderer(viewport.id)) { + offscreenMultiRenderWindow.addRenderer({ + viewport: [0, 0, 1, 1], + id: viewport.id, + background: viewport.defaultOptions?.background || [0, 0, 0], + }); + } - renderer.setViewport([0, 0, 1, 1]); + const renderWindow = offscreenMultiRenderWindow.getRenderWindow(); - const allRenderers = offscreenMultiRenderWindow.getRenderers(); + this._resizeOffScreenCanvasForViewport( + viewport.canvas, + offScreenCanvasContainer, + offscreenMultiRenderWindow + ); - allRenderers.forEach(({ renderer: r, id }) => { - r.setDraw(id === viewport.id); - }); + const renderer = offscreenMultiRenderWindow.getRenderer(viewport.id); + renderer.setViewport(0, 0, 1, 1); - const widgetRenderers = this.getWidgetRenderers(); + // Set only this renderer to draw + const allRenderers = offscreenMultiRenderWindow.getRenderers(); + allRenderers.forEach(({ renderer: r, id }) => { + r.setDraw(id === viewport.id); + }); - widgetRenderers.forEach((viewportId, renderer) => { - renderer.setDraw(viewportId === viewport.id); - }); + // Handle widget renderers + const widgetRenderers = this.getWidgetRenderers(); + widgetRenderers.forEach((viewportId, renderer) => { + renderer.setDraw(viewportId === viewport.id); + }); - renderWindow.render(); + renderWindow.render(); - allRenderers.forEach(({ renderer: r }) => r.setDraw(false)); + allRenderers.forEach(({ renderer: r }) => r.setDraw(false)); - const openGLRenderWindow = - offscreenMultiRenderWindow.getOpenGLRenderWindow(); - const context = openGLRenderWindow.get3DContext(); - const offScreenCanvas = context.canvas; + const openGLRenderWindow = + offscreenMultiRenderWindow.getOpenGLRenderWindow(); + const context = openGLRenderWindow.get3DContext(); + const offScreenCanvas = context.canvas; - eventDetail = this._renderViewportFromVtkCanvasToOnscreenCanvas( - viewport, - offScreenCanvas - ); - } + const eventDetail = this._copyToOnscreenCanvas(viewport, offScreenCanvas); return eventDetail; } @@ -312,6 +376,29 @@ class SequentialRenderingEngine extends BaseRenderingEngine { protected _renderViewportFromVtkCanvasToOnscreenCanvas( viewport: IViewport, offScreenCanvas: HTMLCanvasElement + ): EventTypes.ImageRenderedEventDetail { + return this._copyToOnscreenCanvas(viewport, offScreenCanvas); + } + + private _resizeOffScreenCanvasForViewport( + viewportCanvas: HTMLCanvasElement, + offScreenCanvasContainer: HTMLDivElement, + offscreenMultiRenderWindow: VtkOffscreenMultiRenderWindow + ): void { + const offScreenCanvasWidth = viewportCanvas.width; + const offScreenCanvasHeight = viewportCanvas.height; + + // @ts-expect-error + offScreenCanvasContainer.width = offScreenCanvasWidth; + // @ts-expect-error + offScreenCanvasContainer.height = offScreenCanvasHeight; + + offscreenMultiRenderWindow.resize(); + } + + private _copyToOnscreenCanvas( + viewport: IViewport, + offScreenCanvas: HTMLCanvasElement ): EventTypes.ImageRenderedEventDetail { const { element, @@ -320,11 +407,9 @@ class SequentialRenderingEngine extends BaseRenderingEngine { renderingEngineId, suppressEvents, } = viewport; - const { width: dWidth, height: dHeight } = canvas; const onScreenContext = canvas.getContext('2d'); - onScreenContext.drawImage( offScreenCanvas, 0, @@ -346,27 +431,6 @@ class SequentialRenderingEngine extends BaseRenderingEngine { }; } - private _resizeOffScreenCanvasForSingleViewport( - currentViewport: HTMLCanvasElement - ): { - offScreenCanvasWidth: number; - offScreenCanvasHeight: number; - } { - const { offScreenCanvasContainer, offscreenMultiRenderWindow } = this; - - const offScreenCanvasWidth = currentViewport.width; - const offScreenCanvasHeight = currentViewport.height; - - // @ts-expect-error - offScreenCanvasContainer.width = offScreenCanvasWidth; - // @ts-expect-error - offScreenCanvasContainer.height = offScreenCanvasHeight; - - offscreenMultiRenderWindow.resize(); - - return { offScreenCanvasWidth, offScreenCanvasHeight }; - } - private _resize( viewportsDrivenByVtkJs: (IStackViewport | IVolumeViewport)[] ): void { @@ -376,20 +440,21 @@ class SequentialRenderingEngine extends BaseRenderingEngine { viewport.sWidth = viewport.canvas.width; viewport.sHeight = viewport.canvas.height; - const renderer = this.offscreenMultiRenderWindow.getRenderer(viewport.id); - renderer.setViewport([0, 0, 1, 1]); + // Get the context assigned to this viewport + const contextIndex = this.contextPool.getContextIndexForViewport( + viewport.id + ); + + const contextData = this.contextPool.getContextByIndex(contextIndex); + const { context: offscreenMultiRenderWindow } = contextData; + const renderer = offscreenMultiRenderWindow.getRenderer(viewport.id); + + renderer.setViewport(0, 0, 1, 1); } } - /** - * - * @returns A map of widget renderers and their associated viewport IDs. - * This method iterates through all viewports, retrieves their widgets, - * and maps each widget's renderer to the viewport ID. - */ private getWidgetRenderers(): Map { const allViewports = this._getViewportsAsArray(); - const widgetRenderers = new Map(); allViewports.forEach((vp) => { @@ -404,6 +469,76 @@ class SequentialRenderingEngine extends BaseRenderingEngine { return widgetRenderers; } + + /** + * Get the renderer for a specific viewport + * @param viewportId - The ID of the viewport + * @returns The vtkRenderer instance or undefined + */ + public getRenderer(viewportId: string): vtkRenderer | undefined { + const contextIndex = + this.contextPool?.getContextIndexForViewport(viewportId); + + const contextData = this.contextPool.getContextByIndex(contextIndex); + + const { context: offscreenMultiRenderWindow } = contextData; + return offscreenMultiRenderWindow.getRenderer(viewportId); + } + + /** + * Disables the requested viewportId from the rendering engine. + * Calls the base implementation and then handles context-specific cleanup. + * + * @param viewportId - viewport Id + */ + public disableElement(viewportId: string): void { + const viewport = this.getViewport(viewportId); + if (!viewport) { + return; + } + super.disableElement(viewportId); + + if ( + !viewportTypeUsesCustomRenderingPipeline(viewport.type) && + !this.useCPURendering + ) { + const contextIndex = + this.contextPool.getContextIndexForViewport(viewportId); + + if (contextIndex !== undefined) { + const contextData = this.contextPool.getContextByIndex(contextIndex); + + if (contextData) { + const { context: offscreenMultiRenderWindow } = contextData; + offscreenMultiRenderWindow.removeRenderer(viewportId); + } + } + } + } + + public destroy(): void { + if (this.contextPool) { + this.contextPool.destroy(); + } + super.destroy(); + } + + public getOffscreenMultiRenderWindow( + viewportId: string + ): VtkOffscreenMultiRenderWindow { + if (this.useCPURendering) { + throw new Error( + 'Offscreen multi render window is not available when using CPU rendering.' + ); + } + + const contextIndex = + this.contextPool.getContextIndexForViewport(viewportId); + + const contextData = this.contextPool.getContextByIndex(contextIndex); + + return contextData.context; + } } -export default SequentialRenderingEngine; +export default ContextPoolRenderingEngine; diff --git a/packages/core/src/RenderingEngine/RenderingEngine.ts b/packages/core/src/RenderingEngine/RenderingEngine.ts index d0a245d66b..c8b7bdab66 100644 --- a/packages/core/src/RenderingEngine/RenderingEngine.ts +++ b/packages/core/src/RenderingEngine/RenderingEngine.ts @@ -1,19 +1,20 @@ import { getConfiguration } from '../init'; -import StandardRenderingEngine from './StandardRenderingEngine'; -import SequentialRenderingEngine from './SequentialRenderingEngine'; +import TiledRenderingEngine from './TiledRenderingEngine'; +import ContextPoolRenderingEngine from './ContextPoolRenderingEngine'; import type BaseRenderingEngine from './BaseRenderingEngine'; import type { IStackViewport, IVolumeViewport, IViewport, PublicViewportInput, + VtkOffscreenMultiRenderWindow, } from '../types'; import { RenderingEngineModeEnum } from '../enums'; class RenderingEngine { public hasBeenDestroyed: boolean; // eslint-disable-next-line @typescript-eslint/no-explicit-any - public offscreenMultiRenderWindow: any; + public offscreenMultiRenderWindow: VtkOffscreenMultiRenderWindow; private _implementation?: BaseRenderingEngine; constructor(id?: string) { @@ -21,17 +22,17 @@ class RenderingEngine { const renderingEngineMode = config?.rendering?.renderingEngineMode; switch (renderingEngineMode) { - case RenderingEngineModeEnum.Standard: - this._implementation = new StandardRenderingEngine(id); + case RenderingEngineModeEnum.Tiled: + this._implementation = new TiledRenderingEngine(id); break; - case RenderingEngineModeEnum.Next: - this._implementation = new SequentialRenderingEngine(id); + case RenderingEngineModeEnum.ContextPool: + this._implementation = new ContextPoolRenderingEngine(id); break; default: console.warn( `RenderingEngine: Unknown rendering engine mode "${renderingEngineMode}". Defaulting to Next rendering engine.` ); - this._implementation = new SequentialRenderingEngine(id); + this._implementation = new ContextPoolRenderingEngine(id); break; } } @@ -75,6 +76,11 @@ class RenderingEngine { public getVolumeViewports(): IVolumeViewport[] { return this._implementation.getVolumeViewports(); } + + public getRenderer(viewportId: string) { + return this._implementation.getRenderer(viewportId); + } + public fillCanvasWithBackgroundColor( canvas: HTMLCanvasElement, backgroundColor: [number, number, number] @@ -100,6 +106,12 @@ class RenderingEngine { public destroy(): void { return this._implementation.destroy(); } + + public getOffscreenMultiRenderWindow( + viewportId?: string + ): VtkOffscreenMultiRenderWindow { + return this._implementation.getOffscreenMultiRenderWindow(viewportId); + } } export default RenderingEngine; diff --git a/packages/core/src/RenderingEngine/StackViewport.ts b/packages/core/src/RenderingEngine/StackViewport.ts index 06903e20c0..2467782f0f 100644 --- a/packages/core/src/RenderingEngine/StackViewport.ts +++ b/packages/core/src/RenderingEngine/StackViewport.ts @@ -97,7 +97,7 @@ import uuidv4 from '../utilities/uuidv4'; import getSpacingInNormalDirection from '../utilities/getSpacingInNormalDirection'; import getClosestImageId from '../utilities/getClosestImageId'; import { adjustInitialViewUp } from '../utilities/adjustInitialViewUp'; -import { isSequentialRenderingEngine } from './helpers/isSequentialRenderingEngine'; +import { isContextPoolRenderingEngine } from './helpers/isContextPoolRenderingEngine'; const EPSILON = 1; // Slice Thickness @@ -235,8 +235,7 @@ class StackViewport extends Viewport { }; private _configureRenderingPipeline(value?: boolean) { - const renderingEngine = this.getRenderingEngine(); - const isSequential = isSequentialRenderingEngine(renderingEngine); + const isContextPool = isContextPoolRenderingEngine(); this.useCPURendering = value ?? getShouldUseCPURendering(); @@ -253,12 +252,12 @@ class StackViewport extends Viewport { } else { if ( typeof functions.gpu === 'object' && - functions.gpu.sequential && - functions.gpu.default + functions.gpu.tiled && + functions.gpu.contextPool ) { - this[key] = isSequential - ? functions.gpu.sequential - : functions.gpu.default; + this[key] = isContextPool + ? functions.gpu.contextPool + : functions.gpu.tiled; } else { this[key] = functions.gpu; } @@ -369,13 +368,6 @@ class StackViewport extends Viewport { */ public worldToCanvas: (worldPos: Point3) => Point2; - /** - * If the renderer is CPU based, throw an error. Otherwise, returns the `vtkRenderer` responsible for rendering the `Viewport`. - * - * @returns The `vtkRenderer` for the `Viewport`. - */ - public getRenderer: () => vtkRenderer; - /** * If the renderer is CPU based, throw an error. Otherwise, return the default * actor which is the first actor in the renderer. @@ -2844,7 +2836,7 @@ class StackViewport extends Viewport { return canvasPoint; }; - private canvasToWorldGPUSequential = (canvasPos: Point2): Point3 => { + private canvasToWorldGPUContextPool = (canvasPos: Point2): Point3 => { const renderer = this.getRenderer(); // Temporary setting the clipping range to the distance and distance + 0.1 @@ -2898,7 +2890,7 @@ class StackViewport extends Viewport { return [worldCoord[0], worldCoord[1], worldCoord[2]]; }; - private canvasToWorldGPU = (canvasPos: Point2): Point3 => { + private canvasToWorldGPUTiled = (canvasPos: Point2): Point3 => { const renderer = this.getRenderer(); // Temporary setting the clipping range to the distance and distance + 0.1 @@ -2944,7 +2936,7 @@ class StackViewport extends Viewport { return [worldCoord[0], worldCoord[1], worldCoord[2]]; }; - private worldToCanvasGPUSequential = (worldPos: Point3): Point2 => { + private worldToCanvasGPUContextPool = (worldPos: Point3): Point2 => { const renderer = this.getRenderer(); // Temporary setting the clipping range to the distance and distance + 0.1 @@ -2996,7 +2988,7 @@ class StackViewport extends Viewport { return canvasCoordWithDPR; }; - private worldToCanvasGPU = (worldPos: Point3): Point2 => { + private worldToCanvasGPUTiled = (worldPos: Point3): Point2 => { const renderer = this.getRenderer(); // Temporary setting the clipping range to the distance and distance + 0.1 @@ -3039,6 +3031,29 @@ class StackViewport extends Viewport { return canvasCoordWithDPR; }; + /** + * Get the renderer for this viewport - handles ContextPoolRenderingEngine + */ + public getRendererContextPool(): vtkRenderer { + const renderingEngine = this.getRenderingEngine(); + return renderingEngine.getRenderer(this.id); + } + + /** + * Returns the `vtkRenderer` responsible for rendering the `Viewport`. + * + * @returns The `vtkRenderer` for the `Viewport`. + */ + public getRendererTiled(): vtkRenderer { + const renderingEngine = this.getRenderingEngine(); + + if (!renderingEngine || renderingEngine.hasBeenDestroyed) { + throw new Error('Rendering engine has been destroyed'); + } + + return renderingEngine.offscreenMultiRenderWindow?.getRenderer(this.id); + } + private _getVOIRangeForCurrentImage() { const { windowCenter, windowWidth, voiLUTFunction } = this.csImage; @@ -3508,20 +3523,23 @@ class StackViewport extends Viewport { canvasToWorld: { cpu: this.canvasToWorldCPU, gpu: { - sequential: this.canvasToWorldGPUSequential, - default: this.canvasToWorldGPU, + tiled: this.canvasToWorldGPUTiled, + contextPool: this.canvasToWorldGPUContextPool, }, }, worldToCanvas: { cpu: this.worldToCanvasCPU, gpu: { - sequential: this.worldToCanvasGPUSequential, - default: this.worldToCanvasGPU, + tiled: this.worldToCanvasGPUTiled, + contextPool: this.worldToCanvasGPUContextPool, }, }, getRenderer: { cpu: () => this.getCPUFallbackError('getRenderer'), - gpu: super.getRenderer, + gpu: { + tiled: this.getRendererTiled, + contextPool: this.getRendererContextPool, + }, }, getDefaultActor: { cpu: () => this.getCPUFallbackError('getDefaultActor'), diff --git a/packages/core/src/RenderingEngine/StandardRenderingEngine.ts b/packages/core/src/RenderingEngine/TiledRenderingEngine.ts similarity index 97% rename from packages/core/src/RenderingEngine/StandardRenderingEngine.ts rename to packages/core/src/RenderingEngine/TiledRenderingEngine.ts index d3bc9ee756..9a2405573b 100644 --- a/packages/core/src/RenderingEngine/StandardRenderingEngine.ts +++ b/packages/core/src/RenderingEngine/TiledRenderingEngine.ts @@ -10,6 +10,7 @@ import getOrCreateCanvas from './helpers/getOrCreateCanvas'; import type IStackViewport from '../types/IStackViewport'; import type IVolumeViewport from '../types/IVolumeViewport'; import VolumeViewport3D from './VolumeViewport3D'; +import { vtkOffscreenMultiRenderWindow } from './vtkClasses'; import type * as EventTypes from '../types/EventTypes'; import type { @@ -59,7 +60,19 @@ interface ViewportDisplayCoords { * * @public */ -class StandardRenderingEngine extends BaseRenderingEngine { +class TiledRenderingEngine extends BaseRenderingEngine { + constructor(id?: string) { + super(id); + + if (!this.useCPURendering) { + this.offscreenMultiRenderWindow = + vtkOffscreenMultiRenderWindow.newInstance(); + this.offScreenCanvasContainer = document.createElement('div'); + this.offscreenMultiRenderWindow.setContainer( + this.offScreenCanvasContainer + ); + } + } /** * Enables a viewport to be driven by the offscreen vtk.js rendering engine. * @@ -577,12 +590,12 @@ class StandardRenderingEngine extends BaseRenderingEngine { // Updating the renderer for the viewport const renderer = this.offscreenMultiRenderWindow.getRenderer(viewport.id); - renderer.setViewport([ + renderer.setViewport( sxStartDisplayCoords, syStartDisplayCoords, sxEndDisplayCoords, - syEndDisplayCoords, - ]); + syEndDisplayCoords + ); } // Returns the final xOffset @@ -632,4 +645,4 @@ class StandardRenderingEngine extends BaseRenderingEngine { } } -export default StandardRenderingEngine; +export default TiledRenderingEngine; diff --git a/packages/core/src/RenderingEngine/WebGLContextPool.ts b/packages/core/src/RenderingEngine/WebGLContextPool.ts new file mode 100644 index 0000000000..def39ddeb2 --- /dev/null +++ b/packages/core/src/RenderingEngine/WebGLContextPool.ts @@ -0,0 +1,95 @@ +import { vtkOffscreenMultiRenderWindow } from './vtkClasses'; +import type { VtkOffscreenMultiRenderWindow } from '../types'; + +/** + * Manages a pool of WebGL contexts for parallel rendering. + * Enables us distribute viewports across multiple contexts + * for improved performance. + */ +class WebGLContextPool { + private contexts: VtkOffscreenMultiRenderWindow[] = []; + private offScreenCanvasContainers: HTMLDivElement[] = []; + private viewportToContext: Map = new Map(); + + /** + * Creates a pool with the specified number of WebGL contexts + * @param count - Number of contexts to create + */ + constructor(count: number) { + for (let i = 0; i < count; i++) { + const offscreenMultiRenderWindow = + vtkOffscreenMultiRenderWindow.newInstance(); + const container = document.createElement('div'); + offscreenMultiRenderWindow.setContainer(container); + + this.contexts.push(offscreenMultiRenderWindow); + this.offScreenCanvasContainers.push(container); + } + } + + /** + * Gets the context and container at the specified index + * @param index - Context index + * @returns Context and container, or null if index is invalid + */ + getContextByIndex(index: number): { + context: VtkOffscreenMultiRenderWindow; + container: HTMLDivElement; + } | null { + if (index >= 0 && index < this.contexts.length) { + return { + context: this.contexts[index], + container: this.offScreenCanvasContainers[index], + }; + } + return null; + } + + /** + * Associates a viewport with a specific context index + * @param viewportId - ID of the viewport + * @param contextIndex - Index of the context to assign + */ + assignViewportToContext(viewportId: string, contextIndex: number): void { + this.viewportToContext.set(viewportId, contextIndex); + } + + /** + * Gets the context index assigned to a viewport + * @param viewportId - ID of the viewport + * @returns Context index, or undefined if not assigned + */ + getContextIndexForViewport(viewportId: string): number | undefined { + return this.viewportToContext.get(viewportId); + } + + /** + * Gets all contexts in the pool + * @returns Array of all contexts + */ + getAllContexts(): VtkOffscreenMultiRenderWindow[] { + return this.contexts; + } + + /** + * Gets the number of contexts in the pool + * @returns Number of contexts + */ + getContextCount(): number { + return this.contexts.length; + } + + /** + * Cleans up all contexts and releases resources + */ + destroy(): void { + this.contexts.forEach((context: VtkOffscreenMultiRenderWindow) => { + context.delete(); + }); + this.contexts = []; + this.offScreenCanvasContainers = []; + this.viewportToContext.clear(); + } +} + +export default WebGLContextPool; diff --git a/packages/core/src/RenderingEngine/helpers/isSequentialRenderingEngine.ts b/packages/core/src/RenderingEngine/helpers/isContextPoolRenderingEngine.ts similarity index 51% rename from packages/core/src/RenderingEngine/helpers/isSequentialRenderingEngine.ts rename to packages/core/src/RenderingEngine/helpers/isContextPoolRenderingEngine.ts index 04e37fc415..60b5f6946b 100644 --- a/packages/core/src/RenderingEngine/helpers/isSequentialRenderingEngine.ts +++ b/packages/core/src/RenderingEngine/helpers/isContextPoolRenderingEngine.ts @@ -1,9 +1,10 @@ import { getConfiguration } from '../../init'; import { RenderingEngineModeEnum } from '../../enums'; -export function isSequentialRenderingEngine(renderingEngine): boolean { +export function isContextPoolRenderingEngine(): boolean { const config = getConfiguration(); return ( - config?.rendering?.renderingEngineMode === RenderingEngineModeEnum.Next + config?.rendering?.renderingEngineMode === + RenderingEngineModeEnum.ContextPool ); } diff --git a/packages/core/src/RenderingEngine/index.ts b/packages/core/src/RenderingEngine/index.ts index 0b57a53e99..0f8465684e 100644 --- a/packages/core/src/RenderingEngine/index.ts +++ b/packages/core/src/RenderingEngine/index.ts @@ -1,7 +1,7 @@ import RenderingEngine from './RenderingEngine'; import BaseRenderingEngine from './BaseRenderingEngine'; -import StandardRenderingEngine from './StandardRenderingEngine'; -import SequentialRenderingEngine from './SequentialRenderingEngine'; +import TiledRenderingEngine from './TiledRenderingEngine'; +import ContextPoolRenderingEngine from './ContextPoolRenderingEngine'; import getRenderingEngine from './getRenderingEngine'; import VolumeViewport from './VolumeViewport'; import StackViewport from './StackViewport'; @@ -12,8 +12,8 @@ export { getRenderingEngine, RenderingEngine, BaseRenderingEngine, - StandardRenderingEngine, - SequentialRenderingEngine, + TiledRenderingEngine, + ContextPoolRenderingEngine, VolumeViewport, VolumeViewport3D, StackViewport, diff --git a/packages/core/src/enums/RenderingEngineModeEnum.ts b/packages/core/src/enums/RenderingEngineModeEnum.ts index c9673c99f1..b289da1c1d 100644 --- a/packages/core/src/enums/RenderingEngineModeEnum.ts +++ b/packages/core/src/enums/RenderingEngineModeEnum.ts @@ -1,6 +1,6 @@ enum RenderingEngineModeEnum { - Standard = 'standard', - Next = 'next', + Tiled = 'tiled', + ContextPool = 'contextPool', } export default RenderingEngineModeEnum; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index acebb0ca13..140a992875 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -3,8 +3,8 @@ import * as CONSTANTS from './constants'; import { Events } from './enums'; import RenderingEngine, { BaseRenderingEngine, - StandardRenderingEngine, - SequentialRenderingEngine, + TiledRenderingEngine, + ContextPoolRenderingEngine, } from './RenderingEngine'; import createVolumeActor from './RenderingEngine/helpers/createVolumeActor'; import createVolumeMapper, { @@ -125,8 +125,8 @@ export { WSIViewport, RenderingEngine, BaseRenderingEngine, - StandardRenderingEngine, - SequentialRenderingEngine, + TiledRenderingEngine, + ContextPoolRenderingEngine, ImageVolume, Surface, // Helpers diff --git a/packages/core/src/init.ts b/packages/core/src/init.ts index f91422d033..7cfa41dc91 100644 --- a/packages/core/src/init.ts +++ b/packages/core/src/init.ts @@ -17,10 +17,16 @@ const defaultConfig: Cornerstone3DConfig = { strictZSpacingForVolumeViewport: true, /** * The rendering engine mode to use. - * 'next' is the new rendering engine that uses sequential rendering and has enhanced support/performance for multi-monitor and high resolution displays. - * 'standard' is the old rendering engine implementation, which we will eventually move away from. + * 'contextPool' is the a rendering engine that uses sequential rendering, pararllization and has enhanced support/performance for multi-monitor and high resolution displays. + * 'tiled' is a rendering engine that uses tiled rendering. */ - renderingEngineMode: RenderingEngineModeEnum.Next, + renderingEngineMode: RenderingEngineModeEnum.ContextPool, + + /** + * The number of WebGL contexts to create. This is used for parallel rendering. + * The default value is 7, which is suitable for mobile/desktop. + */ + webGlContextCount: 7, }, /** @@ -105,6 +111,11 @@ function init(configuration = config): boolean { // merge configs config = deepMerge(defaultConfig, configuration); + // mobile safe + if (config.isMobile) { + config.rendering.webGlContextCount = 1; + } + if (isIOS()) { if (configuration.rendering?.preferSizeOverAccuracy) { config.rendering.preferSizeOverAccuracy = true; diff --git a/packages/core/src/types/Cornerstone3DConfig.ts b/packages/core/src/types/Cornerstone3DConfig.ts index 977d88a1c5..24be843557 100644 --- a/packages/core/src/types/Cornerstone3DConfig.ts +++ b/packages/core/src/types/Cornerstone3DConfig.ts @@ -35,10 +35,16 @@ interface Cornerstone3DConfig { /** * The rendering engine mode to use. - * 'next' is the new rendering engine that uses sequential rendering and has enhanced support/performance for multi-monitor and high resolution displays. - * 'standard' is the old rendering engine implementation, which we will eventually move away from. + * 'contextPool' is the a rendering engine that uses sequential rendering, pararllization and has enhanced support/performance for multi-monitor and high resolution displays. + * 'tiled' is a rendering engine that uses tiled rendering. */ renderingEngineMode?: RenderingEngineModeType; + + /** + * The number of WebGL contexts to create. This is used for parallel rendering. + * The default value is 7, which is suitable for mobile/desktop. + */ + webGlContextCount?: number; }; /** diff --git a/packages/core/src/types/RenderingEngineMode.ts b/packages/core/src/types/RenderingEngineMode.ts index fa878e7700..0239161d01 100644 --- a/packages/core/src/types/RenderingEngineMode.ts +++ b/packages/core/src/types/RenderingEngineMode.ts @@ -1,3 +1,3 @@ -type RenderingEngineModeType = 'standard' | 'next'; +type RenderingEngineModeType = 'tiled' | 'contextPool'; export type { RenderingEngineModeType }; diff --git a/packages/core/src/types/VtkOffscreenMultiRenderWindow.ts b/packages/core/src/types/VtkOffscreenMultiRenderWindow.ts new file mode 100644 index 0000000000..10bdabdae9 --- /dev/null +++ b/packages/core/src/types/VtkOffscreenMultiRenderWindow.ts @@ -0,0 +1,45 @@ +import type { vtkObject } from '@kitware/vtk.js/interfaces'; +import type vtkStreamingOpenGLRenderWindow from '../RenderingEngine/vtkClasses/vtkStreamingOpenGLRenderWindow'; +import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; +import type vtkRenderWindow from '@kitware/vtk.js/Rendering/Core/RenderWindow'; +import type vtkRenderWindowInteractor from '@kitware/vtk.js/Rendering/Core/RenderWindowInteractor'; + +import '@kitware/vtk.js/Common/Core/Points'; +import '@kitware/vtk.js/Common/Core/DataArray'; +import '@kitware/vtk.js/Common/DataModel/PolyData'; +import '@kitware/vtk.js/Rendering/Core/Actor'; +import '@kitware/vtk.js/Rendering/Core/Mapper'; + +type Viewport = [number, number, number, number]; + +interface RendererConfig { + id: string; + viewport: Viewport; + background?: [number, number, number]; +} + +export interface VtkOffscreenMultiRenderWindow extends vtkObject { + renderWindow: vtkRenderWindow; + getRenderWindow: () => vtkRenderWindow; + + openGLRenderWindow: ReturnType< + typeof vtkStreamingOpenGLRenderWindow.newInstance + >; + getOpenGLRenderWindow: () => ReturnType< + typeof vtkStreamingOpenGLRenderWindow.newInstance + >; + + interactor: vtkRenderWindowInteractor; + getInteractor: () => vtkRenderWindowInteractor; + + container: HTMLDivElement | null; + getContainer: () => HTMLDivElement | null; + + addRenderer: (config: RendererConfig) => void; + removeRenderer: (id: string) => void; + getRenderer: (id: string) => vtkRenderer; + getRenderers: () => Array<{ id: string; renderer: vtkRenderer }>; + resize: () => void; + setContainer: (el: HTMLDivElement) => void; + destroy: () => void; +} diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index 9fe2f445ed..4cef5b476b 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -162,6 +162,7 @@ import type JumpToSliceOptions from './JumpToSliceOptions'; import type GeometryLoaderFn from './GeometryLoaderFn'; import type { RenderingEngineModeType } from './RenderingEngineMode'; +import type { VtkOffscreenMultiRenderWindow } from './VtkOffscreenMultiRenderWindow'; export type { // config @@ -316,4 +317,5 @@ export type { VoxelManager, RLEVoxelMap, RenderingEngineModeType, + VtkOffscreenMultiRenderWindow, }; diff --git a/packages/core/src/utilities/renderToCanvasGPU.ts b/packages/core/src/utilities/renderToCanvasGPU.ts index 654a5eb6d0..89190fd1de 100644 --- a/packages/core/src/utilities/renderToCanvasGPU.ts +++ b/packages/core/src/utilities/renderToCanvasGPU.ts @@ -14,7 +14,8 @@ import type { Point3, } from '../types'; import { getRenderingEngine } from '../RenderingEngine/getRenderingEngine'; -import RenderingEngine from '../RenderingEngine'; +import type RenderingEngine from '../RenderingEngine'; +import TiledRenderingEngine from '../RenderingEngine/TiledRenderingEngine'; import isPTPrescaledWithSUV from './isPTPrescaledWithSUV'; import type { CanvasLoadPosition } from './loadImageToCanvas'; @@ -88,7 +89,7 @@ export default function renderToCanvasGPU( const temporaryCanvas = getOrCreateCanvas(element); const renderingEngine = (getRenderingEngine(renderingEngineId) as RenderingEngine) || - new RenderingEngine(renderingEngineId); + new TiledRenderingEngine(renderingEngineId); let viewport = renderingEngine.getViewport(viewportId); diff --git a/packages/docs/docs/concepts/cornerstone-core/renderingEngine.md b/packages/docs/docs/concepts/cornerstone-core/renderingEngine.md index 6fb38f46ed..3dfb346e66 100644 --- a/packages/docs/docs/concepts/cornerstone-core/renderingEngine.md +++ b/packages/docs/docs/concepts/cornerstone-core/renderingEngine.md @@ -30,6 +30,83 @@ canvas get updated, and at render time, we copy from offscreen to onscreen for e For instance for PET-CT fusion which has 3x3 layout which includes CT (Axial, Sagittal, Coronal), PET (Axial, Sagittal, Coronal) and Fusion (Axial, Sagittal, Coronal), we create two volume mappers for CT and PET individually, and for the Fusion viewports we re-use both created textures instead of re-creating a new one. +## Rendering Engine Implementations + +Cornerstone3D provides two rendering engine implementations to handle different use cases and overcome technical limitations: + +### TiledRenderingEngine + +The `TiledRenderingEngine` is the original implementation that uses a single, large offscreen canvas for all viewports. This approach: + +- Creates one massive offscreen canvas that grows horizontally as viewports are added +- Renders all viewports to specific coordinates on this single offscreen canvas +- Copies pixel data from the offscreen canvas to individual onscreen viewports + +**Limitations of TiledRenderingEngine:** + +- **Canvas Size Limits**: Browsers impose maximum canvas dimensions (e.g., 16,384px in Chrome). When the combined width of all viewports exceeds this limit, the offscreen canvas is silently cropped, causing severe visual artifacts, misaligned viewports, and blank viewports +- **Performance Degradation**: As the offscreen canvas approaches size limits, performance degrades significantly, especially on high-resolution displays or layouts with many viewports +- **Multi-Monitor Issues**: Practically impossible to use across multiple high-resolution monitors due to canvas size limitations +- **Memory Consumption**: Allocates a huge, memory-intensive offscreen canvas regardless of actual viewport usage + +**Advantages of TiledRenderingEngine:** + +- **Simplicity**: Straightforward implementation that works well for small numbers of viewports +- **Track Record**: Proven reliability for 5 years, and for most basic use cases, it performs adequately + +### ContextPoolRenderingEngine (SequentialRenderingEngine) + +The `ContextPoolRenderingEngine` (internally called `SequentialRenderingEngine`) fundamentally solves the limitations of the tiled approach by using a different rendering strategy: + +- Renders each viewport individually to a viewport-sized offscreen canvas +- Copies the result to the corresponding onscreen canvas +- Proceeds sequentially to the next viewport, reusing the same offscreen canvas +- Utilizes WebGL context pooling to render in batches (e.g., batches of 8 for 8 WebGL contexts) + +**Advantages of ContextPoolRenderingEngine:** + +- **No Canvas Size Limits**: The browser's maximum canvas size now applies to individual viewports, not the combined width +- **Improved Performance**: Consistent performance regardless of the number of viewports or display resolution +- **Better Memory Usage**: Avoids allocating massive offscreen canvases +- **Multi-Monitor Support**: Enables smooth performance across multiple high-resolution monitors +- **Enhanced Stability**: Reduces WebGL context loss associated with huge canvas surfaces + +### Configuring the Rendering Engine + +The `ContextPoolRenderingEngine` is now the default in Cornerstone3D. If you need to use the legacy `TiledRenderingEngine`, you can configure it during initialization: + +```js +import { init } from '@cornerstonejs/core'; + +// To use the legacy TiledRenderingEngine +init({ + rendering: { + renderingEngineMode: 'standard', + }, +}); + +// The ContextPoolRenderingEngine is used by default, or you can explicitly set it +init({ + rendering: { + renderingEngineMode: 'next', + }, +}); +``` + +For `ContextPoolRenderingEngine` you can also configure the number of WebGL contexts to use for batch rendering: + +```js +import { init } from '@cornerstonejs/core'; + +// To use the ContextPoolRenderingEngine with a specific number of WebGL contexts +init({ + rendering: { + renderingEngineMode: 'next', + webGLContextCount: 7, // Default is 7, can be adjusted based on your needs + }, +}); +``` + ## General usage After creating a renderingEngine, we can assign viewports to it for rendering. There are two main approach for creating `Stack` or `Volume` viewports which we will discuss now. diff --git a/packages/tools/examples/contourRendering/index.ts b/packages/tools/examples/contourRendering/index.ts index e3605dedef..44495d706e 100644 --- a/packages/tools/examples/contourRendering/index.ts +++ b/packages/tools/examples/contourRendering/index.ts @@ -70,7 +70,10 @@ content.append(instructions); */ async function run() { // Init Cornerstone and related libraries - await initDemo(); + const config = (window as any).IS_TILED + ? { core: { renderingEngineMode: 'tiled' } } + : {}; + await initDemo(config); // Add tools to Cornerstone3D cornerstoneTools.addTool(PanTool); diff --git a/packages/tools/examples/labelmapRendering/index.ts b/packages/tools/examples/labelmapRendering/index.ts index 584f45b16b..8e87bc70bf 100644 --- a/packages/tools/examples/labelmapRendering/index.ts +++ b/packages/tools/examples/labelmapRendering/index.ts @@ -71,7 +71,10 @@ content.appendChild(viewportGrid); */ async function run() { // Init Cornerstone and related libraries - await initDemo(); + const config = (window as any).IS_TILED + ? { core: { renderingEngineMode: 'tiled' } } + : {}; + await initDemo(config); // Define tool groups to add the segmentation display tool to const toolGroup = ToolGroupManager.createToolGroup(toolGroupId); diff --git a/packages/tools/examples/stackAnnotationTools/index.ts b/packages/tools/examples/stackAnnotationTools/index.ts index 977f1e75d5..37b90b4b09 100644 --- a/packages/tools/examples/stackAnnotationTools/index.ts +++ b/packages/tools/examples/stackAnnotationTools/index.ts @@ -211,7 +211,10 @@ addButtonToToolbar({ */ async function run() { // Init Cornerstone and related libraries - await initDemo(); + const config = (window as any).IS_TILED + ? { core: { renderingEngineMode: 'tiled' } } + : {}; + await initDemo(config); // Add tools to Cornerstone3D cornerstoneTools.addTool(LengthTool); diff --git a/packages/tools/examples/volumeAnnotationTools/index.ts b/packages/tools/examples/volumeAnnotationTools/index.ts index ecac301618..cbbeb3ee64 100644 --- a/packages/tools/examples/volumeAnnotationTools/index.ts +++ b/packages/tools/examples/volumeAnnotationTools/index.ts @@ -79,7 +79,10 @@ content.append(instructions); */ async function run() { // Init Cornerstone and related libraries - await initDemo(); + const config = (window as any).IS_TILED + ? { core: { renderingEngineMode: 'tiled' } } + : {}; + await initDemo(config); const toolGroupId = 'STACK_TOOL_GROUP_ID'; diff --git a/packages/tools/src/tools/OrientationMarkerTool.ts b/packages/tools/src/tools/OrientationMarkerTool.ts index af8a5c902f..a270cd4b04 100644 --- a/packages/tools/src/tools/OrientationMarkerTool.ts +++ b/packages/tools/src/tools/OrientationMarkerTool.ts @@ -257,7 +257,8 @@ class OrientationMarkerTool extends BaseTool { const renderWindow = viewport .getRenderingEngine() - .offscreenMultiRenderWindow.getRenderWindow(); + .getOffscreenMultiRenderWindow(viewport.id) + .getRenderWindow(); renderWindow.render(); viewport.getRenderingEngine().render(); @@ -314,7 +315,8 @@ class OrientationMarkerTool extends BaseTool { const renderer = viewport.getRenderer(); const renderWindow = viewport .getRenderingEngine() - .offscreenMultiRenderWindow.getRenderWindow(); + .getOffscreenMultiRenderWindow(viewportId) + .getRenderWindow(); const { enabled, diff --git a/tests/sequentialRenderingEngine.spec.ts b/tests/contextPoolRenderingEngine.spec.ts similarity index 59% rename from tests/sequentialRenderingEngine.spec.ts rename to tests/contextPoolRenderingEngine.spec.ts index ad0617cb6c..39dee3e4ef 100644 --- a/tests/sequentialRenderingEngine.spec.ts +++ b/tests/contextPoolRenderingEngine.spec.ts @@ -7,18 +7,16 @@ import { test.beforeEach(async ({ page, context }) => { await context.addInitScript(() => (window.IS_PLAYWRIGHT = true)); - await visitExample(page, 'sequentialRenderingEngine'); + await visitExample(page, 'contextPoolRenderingEngine'); }); -test.describe('Sequential Rendering Engine', async () => { - test('should display sequential rendering engine example', async ({ - page, - }) => { +test.describe('Context Pool Rendering Engine', async () => { + test('should display context pool rendering engine example', async ({ page }) => { const locator = page.locator('#viewportContainer'); await checkForScreenshot( page, locator, - screenShotPaths.sequentialRenderingEngine.viewport + screenShotPaths.contextPoolRenderingEngine.viewport ); }); }); diff --git a/tests/contourRenderingTiled.spec.ts b/tests/contourRenderingTiled.spec.ts new file mode 100644 index 0000000000..48e137c489 --- /dev/null +++ b/tests/contourRenderingTiled.spec.ts @@ -0,0 +1,25 @@ +import { test } from 'playwright-test-coverage'; +import { + checkForScreenshot, + visitExample, + screenShotPaths, +} from './utils/index'; + +test.beforeEach(async ({ page, context }) => { + await visitExample(page, 'contourRendering'); + await context.addInitScript(() => (window.IS_TILED = true)); +}); + +test.describe('Contour Rendering', async () => { + test('should add a contour as a segmentation to a volume viewport', async ({ + page, + }) => { + const canvas = await page.locator('canvas'); + + await checkForScreenshot( + page, + canvas, + screenShotPaths.contourRenderingTiled.viewport + ); + }); +}); diff --git a/tests/labelmapRenderingTiled.spec.ts b/tests/labelmapRenderingTiled.spec.ts new file mode 100644 index 0000000000..76a3ad4d04 --- /dev/null +++ b/tests/labelmapRenderingTiled.spec.ts @@ -0,0 +1,43 @@ +import { test } from 'playwright-test-coverage'; +import { + checkForScreenshot, + visitExample, + screenShotPaths, + reduceViewportsSize, + attemptAction, +} from './utils/index'; + +test.beforeEach(async ({ page, context }) => { + await visitExample(page, 'labelmapRendering', 0, false, false); + await context.addInitScript(() => (window.IS_TILED = true)); +}); + +test.describe('Labelmap Rendering', async () => { + test('should render the labelmap in axial/coronal/sagittal orientations', async ({ + page, + }) => { + await attemptAction(() => reduceViewportsSize(page), 1000, 10); + + const axial = await page.locator('canvas').nth(0); + const coronal = await page.locator('canvas').nth(1); + const sagittal = await page.locator('canvas').nth(2); + + await checkForScreenshot( + page, + axial, + screenShotPaths.labelmapRenderingTiled.axial + ); + + await checkForScreenshot( + page, + coronal, + screenShotPaths.labelmapRenderingTiled.coronal + ); + + await checkForScreenshot( + page, + sagittal, + screenShotPaths.labelmapRenderingTiled.sagittal + ); + }); +}); diff --git a/tests/screenshots/Mobile-Android/sequentialRenderingEngine.spec.ts/viewport.png b/tests/screenshots/Mobile-Android/contextPoolRenderingEngine.spec.ts/viewport.png similarity index 100% rename from tests/screenshots/Mobile-Android/sequentialRenderingEngine.spec.ts/viewport.png rename to tests/screenshots/Mobile-Android/contextPoolRenderingEngine.spec.ts/viewport.png diff --git a/tests/screenshots/Mobile-Android/contourRenderingTiled.spec.ts/viewport.png b/tests/screenshots/Mobile-Android/contourRenderingTiled.spec.ts/viewport.png new file mode 100644 index 0000000000000000000000000000000000000000..8a8777c82e107e5a1cdc755a5daadc963d22a8bf GIT binary patch literal 62074 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 D)ph`S literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Android/labelmapRenderingTiled.spec.ts/axial.png b/tests/screenshots/Mobile-Android/labelmapRenderingTiled.spec.ts/axial.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd77bc24399b4f26ef98b1e35ea5b30f86536c4 GIT binary patch literal 3765 zcmeHK`8V6?7gk-TmYP!2QQLH})KX)OEvl-dN~9B-^ zgbc*-;&oswk&xK4en=9SeM8oefniVNb%zTQmHo;K5)!hZkc+mz#l7H9BqQ^qB|8NK z^f*Dq8#Z2{!`4dELq%Y@Mn*=ra80LnLG*?FEf?tz!p+y!QfxN&-u8W{iJRK}b#~WW z@?>Dwt=~YJ-9eJ%qW2w*Z7N+K6}$-VmOj`z;lcdkx!tl+&p-GF>h9vv;HuSwbzFi7 z953Vxmx3(QN`oXBF&WVJ#6)IFME~=Z9|o@Y_#f(%PQm?RV6@La<6WQJ^PeS+?7lC4 z2jss6!}B%klscC~nrqhSo<2V2D za&ofWyS~1jNX(#3m6V)xRX78QuqZ+#i=run7do{Dks%=!T3Iizbs9oa9XSdO43?e1)ijEwl#HdR#cCz>Kt)s-!x0w-JIWn^TkTGo1QW2|EqhW>;h z(9xrn-uT2d2uN99TRXg&<4%eW4AkN#1PAL4S8`Qs+Ga;a@Ts9ErV`jj&gZ+!8EVy_1&z0lS2b@_OOJlcLOIOX>PTPxSZJ; t=VR7guLgOYm;h8u z_#&<_bf=e1y=(>+42hO%nfjg$NFN_{ffC%?8!eco>+;(k4$TC^t9{e8vQ#mI#>S64 z!P0oWj&SqIBcqAp(~#@V&W!o_veS@M_4!!aMZ?JHV+lxPUob$pg7~mmEN+DZxTve^ z0h>=r620yAyX*x-xyM|-zL6%pQcuyzSm{wGk4P*{pi`Qr$Kr*h%K2}mhOx!Ps`qKt ze%(h2te-KRdWzYlK>+_e#xb~8)IKo&DipB0!T*?sh6Z?Nl@^5BR>K5bfQr50V1}Tg zq9Utgcy!c8*k^ zSGbl58+dQ;mv={vq1G_y(_4N+tgAM9y){IlNF)NtOC%mhYZC|r<;w$C1`z&GD8P)< zkR&R#rlzK>Y<_1;*qx9NqYP;pNeEybPL<21-%Ch1X75@uC@<^Klbf$L^>shC|D)7&oVKq(M zBC~-Vo!+&9fyZ=T!B(O>Y26)PDK~$vmNxaEllS!L(@ZxMByYBFOT7PchBHH(d@o4g zYb!U-{>Pl0oT%H&%{|8Wt%99H3UsC>-C`A$g5HiHuy7HdWMDS%n=Lo6GxDvi3=+)dak$^mxAjGxvuBI%eb%;j)m3y- zmwSB2JbT;l_LpZKa{KbThdCTTr`B?EawW_EckaOk@g)i;yUvhBh?C9|G*ad{h1rIK2JdV4b zAvKCyF*z=cM{kTpGOf)F418+Gz`L8gYg%9aPCGIw_#!-Cu5eapeSbLVXi`sDsFnhd zES{Z1R1%5bfCDY?sv#d2v&~Oc9364-bit)r@tzg&6tk$PXpV`ehD}{SAh-a{mn$rcN;CSYb*zA;Gd>xj zqoX6g&(>9;kfE4OSJb;1^?CR&WFNY8A=*SLHEgyIS5ss7tk(nt+8nSuvL)J0`MNz@ zMWPA`?zHVDhhk^<9+Yk80iiA!92^V-O>j6O z-Yg|5%`UmwE1cqoriadL;AW!;=t)6{AT}z=8M$hGCLM z+)|_nOZ5~*F!Sd}g1^bi zWUD3DZPOkKeac;-Zk=dIzhXu*zqP%=&!m2uW*g%;=&zhis`QZ~i==9OW}Up+)N{eY z&NPtK*VnZx35uJzhJN?RX;GW>*9J0~yX9tVV!}z}l{y#hvvnM6TwMq?(R7aVVDmT3 zCgW&GQ#Gr&)m1Ur?HUxi-Y$Q2Gm!$gWSP?(+j9`N)^s@0WDz9nyU`rOC*YGTX5L6L z%Yi>jN5t0kuf(5MTv+*-SnKt~aVIN#Y%mU6KKmM}NAakAknazjWutDJ78bb>1_N87 z7KV^F+aa}Qg(2B=Us$DA_gCGBKvU(ypv&podyn1u@n0*b?=|}O{^Y;*X77{tocXm` VF)_7uOI&%pnLt5Laus;i{H4L};pt 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 V>taf<(*j>CWPbOa2^r${@IP5*JV5{e literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Android/labelmapRenderingTiled.spec.ts/sagittal.png b/tests/screenshots/Mobile-Android/labelmapRenderingTiled.spec.ts/sagittal.png new file mode 100644 index 0000000000000000000000000000000000000000..5cbbaf4bb3dc1fed3b4afdbde292908987cb1ce9 GIT binary patch literal 5186 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�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 bqi14wtsMjE{SehC@KS!Drcfbg7WjVv!~XfM literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Android/stackAnnotationTiled.spec.ts/lengthTool.png b/tests/screenshots/Mobile-Android/stackAnnotationTiled.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..c38551a81352a224b0d0bac13e2423432aff4c6a GIT binary patch literal 50596 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�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 bqi14wtsMjE{SehC@KS!Drcfbg7WjVv!~XfM literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Android/stackBasicTiled.spec.ts/viewport.png b/tests/screenshots/Mobile-Android/stackBasicTiled.spec.ts/viewport.png new file mode 100644 index 0000000000000000000000000000000000000000..a4272ac6b1af549cf7f8b65eb86dce18aabe54d4 GIT binary patch literal 68780 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Android/volumeAnnotation.spec.ts/lengthTool.png b/tests/screenshots/Mobile-Android/volumeAnnotation.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..7495db8dcb8be714edebbad12e45744e1b4aa567 GIT binary patch literal 14660 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Android/volumeAnnotationTiled.spec.ts/lengthTool.png b/tests/screenshots/Mobile-Android/volumeAnnotationTiled.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..7495db8dcb8be714edebbad12e45744e1b4aa567 GIT binary patch literal 14660 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Android/volumeBasicTiled.spec.ts/viewport.png b/tests/screenshots/Mobile-Android/volumeBasicTiled.spec.ts/viewport.png new file mode 100644 index 0000000000000000000000000000000000000000..c150d675ee2901dd61a0041df9293cdb73360a5d GIT binary patch literal 101717 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Safari/volumeAnnotation.spec.ts/lengthTool.png b/tests/screenshots/Mobile-Safari/volumeAnnotation.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..79a90bd44fbda27394fef39400e58f9c78f8b225 GIT binary patch literal 15318 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 Vwg5d5mim`dtMkYJT%~Rk{68-ys3!mb literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Safari/volumeAnnotationTiled.spec.ts/lengthTool.png b/tests/screenshots/Mobile-Safari/volumeAnnotationTiled.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..79a90bd44fbda27394fef39400e58f9c78f8b225 GIT binary patch literal 15318 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 Vwg5d5mim`dtMkYJT%~Rk{68-ys3!mb literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Safari/volumeBasicTiled.spec.ts/viewport.png b/tests/screenshots/Mobile-Safari/volumeBasicTiled.spec.ts/viewport.png new file mode 100644 index 0000000000000000000000000000000000000000..ca77e01f763444d49b628d3baa5952c44d12d176 GIT binary patch literal 114100 zcmeFZ_g|7<{QrLeA}XbprI{k;$c9Q;IT0~6DoryhEeDjEnKSo7(T0`f$d$P$Q!C58 zQN)(3+~!tH3>-KR7p|{;-rv{z`!9Td_}rei3oZ`VI9%5`=Q`){xF4QgHpT50Iw%AH z!0rp@4X*$Ih`X~a3GnZv0MB-zc3wf=S8!*6{8s77oezeNRu}GEx&$2CSr-66kbcRoy95us5EE4U zD64kn(kb=Du4fU8=$Ms~iS@#DE}}IsBRJD3Gx(mO@5;!vyz8HD=H1);xIE%Cy1p@Y z=rjLr_^$trnNsMich^)7h^52+@@Auu_Fvpv()ud!75x7N#UmWVqRf5mcyKHHzbG<5 z+7qn)3%Z;YVWu4wA%R0ahW<}1kANZVE1?3rApf1xh7Z0ATPI*AO*|m}KhYPwlQOz~ z=)|rQ%KsCddz4QAn{om7xwrm1_?*fKfH)UPJMq66G%BP4+$j3@j>!LVQ(Lip}S&^B{I<#_3d7h!97r6AQ0explD|1mR zZ+(b~$wO`ZL1jea7ti2JcvA&iQ$0-L2=nvS0&@HQy|K~l%~4DIS|YwGXbg_81~bcUB_=P;lrvBK^tw`8*Nj1+lzWi zx|q#LGqWY?vP+%c$91!9u2~*xn}fn{{@Z#@D;k%!{FMcpJ$CWlVGtKem>S7lOO z#&F}%zDwiBseg_iPHAS0t$!@weQe^-4_kH$E9bFCx7a;(8!dH&6jnBhI5~B} zET~f){2puBMxyT#W%nOl>YroMfv$gMGC4z(n5F>H$&W=Gt4*_x7~j!7L( z?Kr-^If37rc&DVBHr)b2uF{%h@XL<)@@5#%Ea~K13?)9e0pV{#{H^5X(zOSfxe#9T zxKDV@$iW3Z`4zwM9dE)MZws}eueI$Q6BafPvqXh1L`igwS=RA-@-kPSW?BsgGSiuF zyDsIWwi>Cvv5yRO&#}!RkmPCNm%BJ&+bdy~*-JGMo@=Qx@ITWV9H!&qqVGul_@vbq z&m4J~I2n{a_ufVQR;t$I`UN%9PN!NKJK0F!t#@E{^Ix_{kg44}TjC9mI?j?kkyU9o zvUGo9QjZzspKlPjpp}!i7>KkHsa_R-6%&)qO)|y3=*edJzm&;*0am*Iq8M%;?q9b) zoM%bpB<4|Ot6c{4!2vpFbX0VVDU%VOhUfp?hk}vykrg}hZHNk1kytMgQty-C;iR%t z>iqn%Jqz%Vz$%|=7Uh5Utqj%s&vLasaRpzgS2+pGLKhB4K_cXWNke<>jso&EN6 z%qaKL=;{7Ph%#d*9JL$s7F8?scI^hD{Aw%8M_p#sNw;vqxM6DW!!$&4tjIKC)INNns(w8D%;PCwhY6-if zM^~sTpD}AqX70lu$p}E;FPO@Z#!3w7h|fa9%@ttENF_X25J z6Pz{Q26=|#o91I||Eqv%0dYnJKFePT(LEdC z;aH?B5EDT`$5$6?ku62^GO+b==)g%h8qoFxy1B4(3$e$ctmt&uO`LD%V#pFW2dJew z!?gb7*)nIWtC&sG4wh4ETM(If($d?{`MN82M3y^ecPj6wDemmOFku$2^X!q-V@^&R z;sG1s#lMEO7S$+{)Zd{bQ}K`Nsq1ZLZim@FZ>zCbsA1}Qygajiwh4(DwEVN3-I2My zmKlTKb*8CtwT8iVQ_ltxK}&v>5%=|PlERoeqmt|A8a&pLJW~8@K_9b7NKYjN@>M%B zOpOLj;RZ0Ys@<6qCluqUQ(6}}2>9#pS5z$}+$hj|pF3T*HQi+oqkpQ^Iv+3A=aPp3 zpJv(#$19&0;>YL0bXodcQC?;tf5dvD%Bj@R%~_2li@NIF7?@SH@ubam|Kr(w$kOVO zL-?~i#!%5a)zk`-MY2gRsJ5E3=%_Yv!S(J?QG7CF<>|rH^=>Bb@n4#>F2)G^;rrE<_IbqoXv33mRNR{p1wV^7 zuMxJWVX?-`ED>V4kGaIFx`#t7g4&~Y_f=tXOR|;~9s5z3>g#QRRG*)C#-a=SsBa>S zHIOeecoY?vzI!;xDK`?see-%i>UJtoanZ|}6uP}Wy3Mf}Ia4e4m-;GJX#&Z>>x z$T?UnaT_%5;7p>npq#e0lWresMclKohQBfadxZ}M)|X*XW}-<6-zgt*YKd;0_X^Y@ z5e{JJQ5ql`elBp}x(Btz5^om-B}@TI1fkQ7U&ql^K;xP88ou#IpJKu`#&LeT`-Vc- z*u@~pt=qSx{zs;~Mp(ZNW^JPAxQy@S z9pnwxd*r12y*=YM@g;9~;*Wf8iG?)JAB{&HVlyfNDAvV!D8);NL5>Jz=J**{a(5W2 z-mcom`NA=`Pc40KJX}9UHT1y@z&`;jY0ndAP<^i!7WKr#MG#bL6i)k`4rtKtCv-xA z1_?r^QHCrK0zMY#b15hJC&`&|WodrgU{wKKCW4h&c!K*hRE~+RF#za|a@OmlW1HM~ z6P&tF==ckb{EW>Rr%at!T{rZ~*qXgj8NA$rBgk)aLGJQuU>^d4o@cD8#Zl;;YVLY0 zu`S)xtD1WJYvlaz48OlY2jzj`bWt_Gz}(Zmej8dn;J+_V7AYJgQ58IP*{YXgN%;{M z_Md?M1($E+r^AG#G`t#*cq$p3=rs+ulk_qv=Kw&ai(9UIp@e{RkGV!HP)g$~q<>JU zATy)*+^VlzO3|2)rQEG_SE|};5 zzlZa>#IM^Y@jfqjaLo3FzQiDSs!gfqpX-e&JR zMP{QpHYuOs<{JJQy>!V=Kh4BVX>`wdS@NF7Zg<)zs`mw=*Mh&LKB@4sd9)>w={JI@ z<#oh_`taU;s2=zVDNP$Bx>#}qyR#b2`Z_P^vLR}?3z8`S_m)U-UvsWs+q2cCw%wCk zjW`U)?)Ky@%i~KHIy?q$f8SGG)-%?##;boDA2;VI;WIE$+LS_;{Eg-~zj*z_UWfuT z`n`N@sbl2q-MA$>OfP`b|4nntMic(Z`^VDDMg-M1duOyZRduReikt=10=xL2cR=D$ zRz&sOYY$_vZodP#bs!Gq>?A`^lwibweb|<;SMUwSM~DxgZ98#P>8qK!P4M)F*%rer z$8X7con}A)DGVer%LmQ(k&iEiWQ6E+4s<-``G8qY7eLyV^@Q5X_LEn1e2862%ZWCN zN;mpbR3?9h2K1SRft`F4s_q!08v`47DyYCFS<1<)#K0+8+{9Ez%ev6O35+g(M{-su zN8_4InBM?+w($Vo_|SrVGKh#az&D?-{t*;V4quIxy@?gS3bnluYt#zKFIcZGNad8T zL3WW~Skd?J5s(2}fHNR+xAaZ4f*ywXlE(#Oo4aB8cHba$D)lc^okq_+Vi&Zyc8$mK z#`X+u0>k-Il}H?NYd$h})HuFF7!i=Gl+Myu@^HyioGeifA2i38btUQSSvu9uuqLMC zyYy@q4S>`F?o->mX|#?D9Qh@(F>~>NM*sIcb!c43KsK(r@~=e2(E10YRM0Lp*6o{Q z%5CGx^rEAWXO6u<@bZIZk1Z`bo>X`Oe}7jvf%6x116a1X*8aWXsNhdGaYJjQcU-CxTm7v@s0tl4wNl7=0Y-D3y3w%jlKzesO`0vBO30*3a^BlPCRHxEqcl9H1I|tnVTyPkwI*e4ccLz^^d4 z6>MB*i)xf8EVHH+*ao&j&i8t^U$?9xq3{>&X7?Tt7S=~`e%cIzl0$rXZkn_cfr>mn zR>P)`O4XL)r$<7eYi@()J#%58s|Jbj`-x8mb)I^D_djhIfMho7TVwY*=`50LhV zj1nC}<0X84X?UTM&us8G|E_p%D{qXSe*d(>A+NOW`}sk|>jX6DV=VAfeK<%(I=jLIKve_e+w$5H{?s*v6n zaJ6ouwItymv3|O0fxk;K&LrZ$>4g->e5){?rUbN)H`*>X0bJX~KFLXV$Y1^LswPD% z<8&RNpV8n?nWk8b_f~z@t`ElUI4^}j5arQ3v~O9xQ}aA|;|+ot z(!!LN zG^hkoy&W@~T|M4dXT22cT#*l|Mx>BE-rj8}Qdl)EGd?WS! z=`)v8)2I!zczG~CARZ?Hn!F@H1HyugXXHDSu-o61FhyR$BWxXZ)g2M-8+QZ7@|@OF zO9K_rBc)*tIwL3hV-S58!qy&ApKNixU2G&b7Z&Qa8ZDyr^cF4_3(CuJ>^Dj?VS%qC{*% zbpNa|;T*^Uq(eSk3B3lf0kd`nmSHD|{5`E2G_JQQ1z)$g)z^SgZ(2N8C9CWSlLJ%K zZE*w2B-lQViC;K6R2yQh#=`kUL2>l^`-F zB>a`FV({JM-L~sUZvLiaX#-}tsB4g=F&eTsMW6q@8n~DI8>g+EV^3}UJ+p_@6}dU? zSQ3(Jf}hZO`E>r{+|A6qRFgG8H?z82Cz+#X%j!RgKbqX;w`DLKJhGV4lkPvFRi?8w zlMj7oW3(~j@&gW5UJEcv_VgD?DK2Yj&g zS<1N>83ypv&xAuDZm-b}vX1!>QJkYscg}FSix&&h4TO zg6#(sJS>XGSBjIEZd1S3&*F+FrXM_t2%UUj^fbAawfDzwZZ^874{dnd zqEU?@54ebiU&@6t^6GiMRGS~e>M`PNmZ|J_9x}D%@j8_f?jX=eYP+8Ys9IK8Fb6tG z>Rt-TRjCAfPn?hS+l@{H*~DMdN_lS|m=AT>;LPht%s_)cIx3p(aFSqJi z^!Dlts*QF?l3RsqM>sddhO=a>i`~~~W+Jt5e^7!Rn2Ko!_c^#&W;pnd=c-KN8+ zLAu3{bE|7zT2;-g$eXU+8EP0OgYqtQ>^mkF?!BUlXpL=PX8Y`PgXa!+pj_+|J2Ep3-? zBR?N!Qnt;!iX@_}umph%a)AGF+2ZwwBLcA_f!*sYf?lZ;SU!z4rMg-@zPM8%;^ z#mM}no;^)n8D2qmAnIMcylM4~KybBDOz46|eLUv;_F8x}&rF0AZH7VgTiP<-BYEc^ zyQtY1|2S7J@N?lviww_9eW#a)k@OyB<%Je6ECyprpG8qk{CfR`->Q5rra0SJOQx>iSlf&lJL|qYsnO6WHD=K@tN5kp*Pug+|Ux zsQ|BO3tB>}0q{PWB5?U!dC*IGzU`WyTmBwGjZdXi*kbA^8X8QwNH9Gd8iGBGG^gl# zDZFb{&-1QmokSdQ{#vzFETL1FrOrMUF56xj%PF{q++J-k!8PHfR3`JsKD(o~EHY88 zCywE4J^Dh*Uxc5%Qww+76OKBBNLo`aLfZX%yq(@xkc3wGx*}?6h(^JW;6ksO#;Wib z7-8%KHAKu_m^B4&jPR_lBD^q*jjnsdhfwe`XAbNWP*9*N8B1cYF5wX{GVEqEa15c$ z&yZhg)Z8tt^tT`B4*)@wo7MLWkfOtBE?uT67?AdfmC?TZ1oQ}j+2!-sn)XY01FN@* z0|jZvD!r+4V@#$7VH1>z@u-+h>4`%`Kb4{wufV1^uvEdnS1=~xTOn^vs7B!RF{Vya z^vAGsr_P|aX40U~jv8McT9w`@jApwK`2*k#L5NM8O}Hsmh{Z>!zZ&ar$o{mDBEW9u zyZulihV%)8iMR9=ADS?RI&Zv0bF}~DLS(%Ro9`*bp4R|nn&2-&{Cuzj6~}jZhM&ZE zHF|c>xivC+^Lakg?{_n~-Ts8x2`#{|AP?%T-HA^fDb;&6(^z}_)_n*GBwO1Dbi}x^ zVmkF|CtH^rwbrZd$jc5#n5I-Wr)6!Z)YUkAcd2QA(&z@3}S8UQyNuW$v_R`#^@EA@lkDHoF7DduB~9 z?>^D9@XJld9uOCJr2r-3!Uy7{9Z6sN`{*8>c%Y|wQVez5xNg$ZuuP2OP@JA`ALOfy6l~?nASqfXc<@@lIPz< zKU?La2Y({tXIMuvsWWmNm+Xj2a8xiWhEdJ9nerW6cNdReLYiR|EoG`!KPKBsPkb;# z5)g#=EUK4pc7EcA@w*#Z4H|d-RS0RykA6bE{Vbiel7_Cq?L2FtzxEO&Y@lv|;S)oA zeh)JYB+{VP_0|N51g7r{r?J@LD;{XbjV7z~CXD#T}?Q5kLkrUGz`WXP9Zz#H1f{k+;j%s=*uE0;M8!KCt92(p3J8~=MQ5Ln(z^gQdktHrP#fb-=md0oHJyk|;81maO z*}V8j%PV@rjd>`>0gup#$w!U)6ekeXR!GwF@5ie4KHF#RsjQujqS*1>8O}Jkg8G}7 z5Qe;kr}{~uZ-<}JrD)nh^CZ3)!pJxAN=5XP7VOKBd4-mD5ZTrFy9GKz?4fR$00R;n zGLRrbAD%U80tvg1gYj8%dxhO42ILMFT0R|e0FZeHy$NA~?r7Sy#nP--oHfI9Es|iJ-8b?dM1WV zqJp;&{zE5+gI2Dg$eks3>MMtnvt*HkO7#@dn;PGj672w}qOiwOB!JH|U(qm0O@Fk+ zg$(Luj8}B+y4(2fc&MPJ5zV+t+u?>uyVB+R!r$g&ci(MnM@I3{!#q7>D^F=-b|khVK!TC&dg5YoT`f@23ff-q0Oq?xtn^4PD;Id?a++4{d(38 zBIPtGq?QWMcS#E|uhZ&3&FNMg4IIZ(c)8TDpQnILlgGc$?Eg|=Eaz=+=?v@)x!hsg za&K;`XZ>|RoD6l-mxKl!E|vXkl7S7|H@1hi0LYMy++}Y|2;Bwm;xv8{dHA_{@Y+2w z&8{LH5iVahXs=ddoXv!TbDMeCJMc@i8~7*|nYkhe@RsEKRb~i^*vYP1su!*oNXvhT zDUQUz%3HHT8bv_WizLaIX>kh`fj(R_a&^g;x;K zC6WlC=mFnNz)nW8$-Gxf7Wjmf)+70UrWQMB6av}?9|x@nb$f|_ zER&@}8a3Oa)s;Vz^tSaDo|>ikq`vx*c`N*QA?bT%Y1CQJQ02xxRW8mRb+1WJ>JNj8aSuxS~V&_3}8_}d(L1QGv%Qqb&fF4Mn zI}ZuL8sd3*mYLnV-=|GW$>FwMvVy71;OiA5LDSqt!)1GU!6VDd)h^|iTZLVJmr*C> zr5d~Rm}_tkN=V3)U+<>=Tr<;>e4@fGZTgZb+*%B!Qx+PsJ>VIXISMRP5}F8(6NX>oqHhdc~u&m7v4B@8aPb4F8sVH zsnLkjgQAbau9Iwtf*=9xOLw0_E6;D^(g-L^MS&}L8EWWbrAF>TVcX8}1Rkmc{UtP` zfY&O0eA_j3Gtcp(>Em%g-o^&vh@}QLKVz9d2LQE?x3dAKz~SXby4gV7vO-R$g+aha9M$AAmxTym58X}e ze(8;+A34-}#8Y%W-G5q_pkz!nyuQSM96*_jL4QtmEc&;7n*i1vzS_%y(7iy+11v2E=9wUv_; z%5Uq0-glMO{Aj#oBO@7LZK!!qZ_OuO>Cle5XY94Q@$ptWM}-ir{ODW4PU91AZ0_Wu z%TM-jD>fgys6t2<=7W5}8WO~xE7tdyVO43c=7Foi0>44JbXgIQ@KG(!rK=S~!z#el zy|N&dU5=MBYLgUO>^HZ%z{koji*M!bc3|n_*&v_ou&sMfhDvfCd>!nx+pD01=VS3c z6*Tvmjw)cAl-3@pkWR$@ifo-=N)#)E>`jU87YXz8`4mcuuJh7vRMI<TQknj{+>9$=gLlph6gRMvmj&w*MPn)`M9d>GTa{Y{J?%ld8dqo4mAg2}H+ z84GrTlZ%0|s9|WiPfh`bWeHE6VZI+asi#?N)O2S3{6={4W}l7>o3DA5Nov)YI;^Bu zZ5mT0U0kfSJ`X}dd^R~fbtPNmw!qa}ct_53V(Zhz;*^DwywjnP)Vz#A^V-qHj1`ki zVxBtnqkBYb=;PP&Vf=3NozuE4;6 znfY+>%}xVd_#^DO)G4qJojEYq*94kvt|9w%T8Pv7&bJKoHpx1* zeGoF`cfm&eW8Mo(JCckUM!;rT10Nfe5cgH)ye)I@;Kv6XBhu_Evu<;YN1Zz51^lPt zro)_VC`Mb70p7YXkle2h<^H?lU2l6=4SwXGbRV&rzlaK3Ybp59z)!|oc*p!Gre%Mf zQ&M=5SVc?DCh~J=Fm-pxent0g8 zZ{+10qH7hO96StSh%@%NxI@iro zs1-O#KYxy)t#?&vZBifaMJaiixtZ{5F3PrKojhShaNc>4rk%s&&D>9{n%>qq5ccCO zv~cB02)sTSK5+(V8XqV=0cmgh^334JZ}It<)4M`5?axT=;;rR>qT7-Et_q(|6r7FF zCdC#=TU`tQ!s({&V$FN%tXpV9*6mHuJDi1A?NffnGMewC3T2T^kQ0Yh?1IMF>Y*VH z9TLd5seTEAx-TcoSMu5>8f*z&J^ro^^0_vR%{*N0dTXoPc5 zEybJHv0v*WP6AhYp)lh>L#E3e5PU|llQd~{LS_!qrp%sgPojNUBte(!sp`tQAQcRKz%uWW~F>mB%$Rofzd;w0%2UHO1S!pVI#&^yfY zf#}tiVhvpg2){mWKYGT9KE_h1NxYVeoiuyo((DLYQTJ-QXY&2=Z2~836d+UTX z6;2l=hG!KNPijy=_z9kZmJ@O_e~vK*Eo`z(`nmDTw6z~eYbe<|Tm zem`VyMYsb(rs;z}%i6SSNb+q*ls#1tT#m!45XM1jeqE#@zDkIQ@4TX!t{adw@Eap^ zw+yDB7{XR)dS_j&>GwjUF;*lEBDW?`P&^RJ98w8x8wN`KbW`o4vYwa_aQN!?<0*B? z>_%YL@+>ginvp+{RBAw#uVppc4Y2#`s3qCd3;j1Xc^560vEtyhfjAqtk1c-v?ZPhdwrs)$@J~s}JT>jVlDgNaIfLHB8deB zao*HJ2FQ6QkEMh%PujGNSFTZN;+RESTrEP8bI(j_QElQ$en5hJ6tuqAZS@~bw1HY` zI<~&qu;C)iv-`1_xxLZTwmH;>aNdU^j|7ar=!zIPJ4iW^EF4xZZ!2<;6sr3PGf)!= z9r^*b+wnlZ=Fn^j;tZ&Jx49kp5CI~MBV7R`3T<@;d@nY4i?ugh;ZNWTLivM~DsDl1 zLCDHKB7B{YN|1vuDA}G}^*hNhr~IXU?*Poy0muV{3$WmtjdycL2)|)#49di%jN$N# z@y&#DTRrXdW3zmPfkm*sNf%Utv++8&M}m0W)Pw0a-8`Y?G>%O*<(Y_6bSxulW93sE z77doTFb}He>9U6M^VXAw=a!jbj!$->n;ZSF=IrK_M%DBkk?jg@-?~YAtA*9beV#tf z3a(oT&izha3AbCR?)@A(w-P$1`P=1Xm~YAU>-U-m`(bbZs2_2+Ani8f^8g*#9}B_i zS0O6t(gFgV?!J_BKrLN{EHp5H-3rP`LJdhDa#>?0sg zoHlTjWH4GJh=< zY4eVLh%w7lA+VHV+4kwx1| zzwF0KJP6%^-oo}ERd#N8LhiW{-y+%$bF$@}>mDIc4E;Nvu;)EQBz%Y1vL$!yD$B5==_IIcgLBaX)vp}YlD*)a#vkM3aVdf2XJGQpYAf0sAywXPqYa( zmStHYQIg^k8FiWat1SK?n@cO-q=ud!=li;Wkft1l+kVa(6Z@7vqoGADWlG&D#2Il{}I9U^E}bhie=jwE?@m{vM{6r&?B?5CFTbmiDmEqI-e{g#zDv}B zKnC6a9R&Z|iA^6%et+LU9a((`^$>-OjhtWDk=&QEkejR?cEu$=9!S*Cp?MWG6DoN-I9)CCV{8~}oca7m>iw~ReSveZ4yGe2xZhm47wrM?&Szk`DULEzp}5dLWk>!nv0VmEWma?na{Jr9U3wL)`|tJ0zi+JLE+ZL`IFiC z_QgGKT<9bbUxbx2idX{b50626HFhCAs$Ck~CEMFAs?a>3oO@~H27>(zEm1n%?jCf{ zi~>g30tKNR$)Ef9iuT-wECckZ_hxpzt^E&oOD_OEPd#4d+DHaA+vr%DhGKp#_g|%! zcV?P0?n+F^yG=*(euNvnu$4gW(#FH3rDr49-$s}6{fEDfP;=>~iQkYr>}vcDYSrp} zy&!CJ+VUSd8|HoykUd#^g5luq5)Y_FGo;Q{sg>OXXz* zW!A+A4*G;d4b(o~lza~A4P;>mz?0UVIFsx8!@`$kl_Z`({A7(DZvgV5@&?qPz5N^o z_94!sg|$P+N!pijY3PxFNiu@z(9w_6Kp*!XERgu}a$3BIfSX&CtM6d+_={UQ{nTpq1Ar*ROf^ zXMV-Pb0@St&-Y;nGVrF*4&-nJeUe+53?*rk=DYUb>U$jwzy%}>j89)1OB=T#tDpQ# zuANcz1mHCeU{~66wBFKvaq{@*U^MnjN^9-r=SygDzGjmk$7tQiUe&eL%RC*A#@E9F)w0h%h z8>id%bA~o!GR6xNbu2kIO(k3z%iQ6<+{(R8mE2;jC8h3Vp}l&P%rI}`z1Dc|3kEo5 zUR$h~ts{v)7NnJFF+e(g_~y!6$#n{};3wi(Z}Ts6c*yt_n-l6a(+k#hOV&=ytq-g> z&!_%iXp<@Ix$oxPxi530pc|4TDxkD$ziBzi=_;vjb{An^;owoBp*TR61d|5WC|n-A z1?E=>fd9$AWD`EjP-nY6VW%|WdH>-eI7nErFnIw@+Z^u>0j8Br8+0&us zu5cT;a0nK+ot~)?sQ)wK$!F3TA%&$#GgiGS=~`Idxz0A%9VOGTVk-7fQ?DgaDYC|u z>`qoT3v?TUwB|3oM>QpD=T=M)DCU;;OxG0sDW_T<9&!g~TCYsS<0L3eeZi*}2e1{+7?n{@!Pcx!P2_5Z-2f>3=`%i8!o>L;I(QX6!#-Fx_{`QC zYb1GDAOsM{91p4EkmSz({MbajKOWN2>FZ03e|MhorS#2 zIVDBeIDUxY9Cw7Mk0F;6Q2{PyVTqFu zynLG!B8l@yonnrxzcdJ|VSG#_#=pr3@#X3xnoNf&e17&n+Q=m(q=xf<2k$d}tJ6WDY^LB)^mweNleF)_X3BS?4KjhLKu>#s>F>twp-jxQv(j&1Vu06>j z4nP4~9|3@1y^Q7^ESUxs5L$NN12g_8mXt4m_5>mpd{p&_(|^k1DV*iy*KbjWgt^2tF` z5`2G*?x|1Mx_R|LWMfM(W@T!v_I}0b9hmlX%r2s7DGBQ$Cs=qmMbO6c%-Ubz7#-dY z){yc2RKCYk4z8yKilgCUFC)kF^UHFHA#v&qLD?gohj6xRKv7?gI1hraP0GgPa}S{k zm6DY~KO^{FQ8oo^_>?J+<5|j?1tsBxqlF-!AW$#OJd@-M&jw!a?)yG0N+rP5zvUIo zs>yCRj2SULJV0SB^Dl+#tgV)Xw`s|A_X)I5FqHtZ-b?{9pvjw^X1CPVS0qaCUM{y^ z9QjVpDFD^(?>wdAJyDKH%Xrv}nRodHk7 z<}~>E^R>;5{HpFL@FVVLgtQsfuPPCtDi?y?^>wC7Lgyi|J!aL-ZNkly%`lJ$IWLCO zZ>77I9r8u6A{7dzGfS3MP(Men$+pAw=Y zKoMW-eI2rV#nTbSo6HNHiosZ|w#V;Y6vNXcl$WYP$L*1R=J+tKh}LgC^x8<^+`jkn zj`AG7Ae@^*gWLmj(7d_**P`;C`-r#;{G+T)_2H3h*eFtZBnja&A$~VB{V>QX*zT9a z#*?A!do_}l8y(=qBY|xpe@`i0)^InIYn!1&*}H0NeH@EB zirvHacY_|$h0yRRLA5;-WBZ>E3X0QrsH(V6v_3=Ob_h`|JYj#Z4j0gk)tH2e;q))g z!*-E!_g!v>k_@?qAZ-K?g*gw#5wi0c1E298%XT7Q*2u%lg?$sP~`v>@WIb81mc5*K{m~rdp z*h&7HYwSzY`j&S<_VyOl)A^KWKA*)$C{3X3?vpy@6Mj60) zERYeGrP4c@EnLN*3qE0ydcQzC56QYG8<(r+D+MOa{Id5KLJNcLaqabjR$4(}tklrr z^s8b0D5(~UimjLRGE`Zh@x^Un+9R5(_oVSZ+EuIVK%b?BEh9 zQksfNhf?Q;72sWKqTkv)E0T&p3SH___`UiLYhq&ZTVS zY6E|bYqr=&)qaO^abZ4Sm+cm56z4#bKmTh93O~y}5>s`5J5nxC8~bp{bcy~hCE?yDy3qAcx2*Uql*9bovX6%N3P! zIuf7nv3DYlgDoIl#`m2cpZqk`KS`d8R-1!gHa@!`Av|JvBO@yCxzE z1!KSmIgS21M37%}1tG@riX}!Sx_Y|hzyAVIOOz)>upBsD`w736-bvWb>}BK`WT-Pi z209CWzRJJX{3t)B#JmWJvW*-qrIa0^O?oV+X%|l*GmRX-h8EQ;Tq$`C&ZM93v3k?x*r_oldL54C!jXR6ZXsNQwX;&( zx45-*rkK~l`irf;Y_mH9ERo<6b`E#BqK?QTu4&h4by)q;BeaJ<%NzI89 z?OadWvA5Q7sMVi3)n%(D*NfgyDNU1e0Oni%$AwExu*VVLY}wkiYIMtq{ZxWMLGsqo%2&9j_UMZ69Uq%GB+`s-s%E;K1b-K8Uo`1DebcS83qmnDVr zACa)JH>t}Bi3}Y}WPzb&NN8qjK2_`l%LjgdvbN?k+rwr1*gL1MrjD+C4_SU3Omffn zS>d}Z<+O-D4ET&*jh$N;ni~E$oebR-y`kmo^5L|56{_cyK|zbS=#fj;88&;b>WC9A z-3iwsCl=T(*%}8(Pr&;?)gkppWL1Kt5-smn0E=PsB~MrI1R&-0m)&A8a8aaK(RaS< z>2n{S=wn$0-sH-yAD?Y2MyG{r8uqLW@aMlDzrT^nSce@9y(!?c6la2Ep6|V~EFUkt z)ASC)Gd7eal_=+CWM5sJf$ownYq-w%5ZP?e@a2nKPI`)(Z=$oME?d*`oTXzxTCP*| zv9EaDpub{sibGy4Dj(3%xmKhXObq4`@gS1@s^`Vfo1){%&vnKdTVBgR|IIh?ZkC(= zXSsK7{MON;GU>fSfNe^kLx}^^!tRb0FTH7Krwz#bQfs{6Pl`{IW5OAD4IP+K&$GzDu6TT`G(Sckc)bIo_6(ZW_cic}$;G zCti_OJxu)tT5_{P8_x1B#QAjrD^y$8&-~p?u>bSVta#?Yel>iEejt`ZRB)Ojnzuwj z=@{y3?+NvjA?694VH3ByI49(%s9~bBvMlS+8^up#d0#Oc*m|xVY;BB8kF|6XOFDws z00kPHI1b|1S>RW}&e=Gj>XT)ax=ESQOJt0{a4LWZaHC*L`SEpRlv)LfyFAD0N}Nu^6&f0hVDsY~q^1NodLdd|jLPYyDJ zB7V=rFO;ql`jkm1be+JACtRa4!8QaJe@<^YQg0fjvq&#`MW5-(-6iMRjdLW$KTa0} zm63bzQ!#Z1h#JGnJDkq>|6eO4Zn*KyCOct13b?m@?GP0Yx)dQF`e(2#+`I3r#(b2S z7x#yv_37mD`|na=eA5uqHeYktT=a|0Xp`DnMd*1=SjVLlUOuL}RDUXnxj;ebx+<&S z%yAFaPYDCNgUM|3B5hI9!+mtN4p!s`pcePkGTS6w<*OjR`V!&{_Pb1wJdvP(9#%*4 zG{}#iSjzWF0UV}`^aTBYudhQMBR(gV-bL*t4_irxEm&Qt<~o_1oi-n-*NjrsWsD!E z5ZR#v21N=%;7TGfELY5T?w|%*-HCrvDYzvk~>OYd`^Gi zszp3dv5r3xH%rNikIUzH!}7x)GA>z@Hm`|J$csGz-;p1Ne89EV_|Ju!J`&{|&DOav z3E?JK5*Oz;{u3;D`Lw27R70>mC%PWD&;fH4*X_Ma^yEL2&JfF$lac}+vd>CI3Hm0f zRtJtJD}_^D;zHmp0Zu5=sR*)!D~JSF3*0H znS(Bj-?J}^W3wF&1}r}mFWrfJ3A-)B{8=HFLv2D4-z)cz_PLk@EYt>kHYr*kmdUTo@S<^tb<$lQ42=T&Ci(Q|h+$;Kj%k;ICy&ZRdLmeM(R{xN^Ag%N$ z+m?yyI(N?JOe>IKvi^fYy9VK-M(4|llMa1QEOPNTi9S2A!yUZ*m=-+ftvZ^~9$=<; z{vu+)Px&;runU*1KQP{DdhAMz2~;+wEk515OW}%xYZ18@>XqNP2q@Qkl&I8n{c-5L z3GY7%c%d?{U%E8(NIW+@?u51x=Wo;dl0|%MWdGHL)7@~FAlrxs)!+5^eX8M@>>?ER zQju=ueUzR7HSo`s#+|Ere}|)bOeRO7bkk^VygKM8nA6L|vl`}Un^1Ag+r8Z;d|SoQ zM$FJcX+gkNa)gIvj@(|qv-775Y8Mjq|CHjSD*cj*SAP0l;W;>2IV0pu3Z0VKj8Srq z@%eR-+Gd|8bFeOxJ4+GTqX?OOvA{0eF0l9!e#hmH_ZQ;A-QrrMmWr#Nb}IgF+O%>% zigb^3c!?VwrHQ=w$?O5}#BuItidoP`dDW1xO{=ve)8M8bCaz`?L(vy@r~wY&RIFaN zb%Bq}1qwSc2syalSrL4>0YRT*6NwuY$@@6D^Bm!f+>h5v@np|)z2nW`d#+h!7-(L( zU(m-S4Wq-~}O*+y%nrzBK8P24wjpYZXb%SB}Tz5hUOH??6?4l)1Bf$q^gT)0@ zbf;}%l#(_1I{gHUz6OrW=x$k8WX@_dhOs?tyZf;2Ew(EfW4_Htg=W1{Q2QeDIYR%v z`Z!JTC{~swz4;dH+VskR`%db0BL87cE}&DCCE-#}Hl%!G?wn`p_{yGvP&kDNJfwer zz0)lH|ePZy~GbKI3v zT#k*6chi-IkPf-_T!A49%ygv}AekFv;Ql5US6`SP)0|EpR?nm)nA!CWT)r+` zNgLFd3G5$Qpd>4A=t>9oRe5)}8amGHn(O@*EgiU-{-u2*(f>Kaac z`r5&y<-reELH6J}_Ivx?jU(sXQg=XYCSJs>8JIroCYEVCq4yx>U`ib)Xj&0#Av0_; z$^XG-yI|8oGNev)$e^Z+jp} zicqGE{8N%`0JFvIRlRNbsI^PQ%%x+RRa^QhaXIMKtY1K^o=~}`xiSZyquO)MuwbC+ z{u(bn`aQ{J&E-VXZ4qXj*qYg_VzriHL7wcQ`0HcZ1c(bBBCl8|t8%(O*z1vn9ySSX z?^)=CgOY`iYe4C(_ef>yqQyl2y`(IfpZO%GQgHmh;}%(uQzQUo>*<6p+w*|XN{^5) zS<*`$K)_+(7pecc?}y)Hh~~0>xb#^E{L#GY*dQizEd23sdfnJDzgE)k=ZR%;5xpk5 z!9u_0pP>A^1ljo(Dcg)g$obBYWVQN*DTSCwmcrzZ!iljErr%dVMAv53=7uDB(41C$ z^@X1fBb1|JluW|Y68k-V9fx9?V`qy!X|2N(Y4O@2l}Q24?dIc}_ApnI_ucqig-05J zR9gri2NvM`JlZ3wnjb9!Ikdp{Ua{1ePg1@x5H*7{Dg6zfZ`fIOtwHer0t<-RQe-V8 z7EYsz=4D@Z2-(pKRs3Fxuu7AnpD7T{ls?Aj&3CGf7@hbtL0(sTM_Po}z=gxu2>EkcX?T!-kt874WZ-*+NdD;nO#xU>{71AU#)M{hL#u~vvkxrt!<@C z%+|hzK)imsvXftH`sfW>m*AW3H=~&Q#1e$e`XU_Xtz^UOBOg~7W!XjsmiCV$Bm|L@ z59I|WJRblHe@A}-oU!7hXe^?v&cB><|7{Fva5{99dnm})_p6=*K?Tqz%AMkK%QMmL zyMOS$z<7EEgK}#6edWt_IYfY#=2*#uFY8@TezV5-R<`+g zSHJWDhinx6Nw3Ue1}(R)AkGBm?9P6)SdiUzhViRn<%y(1fw^nM@Qu<2_D$ymNeoK@ zM(^W7Xb^{u4={p%zWQK2AGG*A1UA;6FRDCA1L#fxgyQ2-XmAx$CsCvZdg`OkwhLCKh1YEs)>sEjT!i*6&n2mDky z{}#Ko%UqQAe>@gz&waWMy*y+AG|?YPPGHE@RGtI2ps%TVf!|S`Rb2~iZd=W59u#12 zk476FoT>zkaq93hjWZTuOcw}->N{@LG-O3~2u)jz0Y~quEgl!6hnF|0nNebLNWl zh0afPMq)or@;KGjW*cQrjZaJy?Be7Cl1nv5!b@U-)y z=P11pKKrs4{>!Dh+7HiFevpv%AHJfia|<{GF?XrHS0o)qy=9@jp^OG(4vBNNkyZ=qo*R$Sxv0uVTXlqi5fA|EY3yJ>WR4LY%3;aQ4tp_*lV}C@Ua_($9z!P`5z|0 zvQOmWQ?2XjVpCj|W6w4O^tQvFmYM1GgPYsRQ3#xA?S)cRqqE6v}d z;*s%6uED9u#FfCC#e`WrpD#ML)c9}fItyV5Om$!%28>uv9vNpv%Z!-zhU|2WSjlYI z(hRYs8!{3m)Si$CSgK>&kfOsz+r4x$hjD91bVC%s0{fpe#kOR_OcD}~&$oKul#p}XA^88jTT zzjH?_*z%dG%*SF2F}2XG+^;VSo88!}lByX?lgZ|MGVgMA>Y4Y_6K6UCOkq159q6$w z$%-1hMCWowVF8|FYa9cd*kAj}x&d0in}C%EQYfmr*iMiKNA&TK9&yH+ngi|5Uo4Ra z4!K+k)2iYU{Q|yOM~-QBE8XX<^6ySC3pKb4N@0=3NM9GEAPWoJ->EMT{h|s>uJt`V zT$?niBI5foX6>xuMt<~v!GQlfH$IEvD49ipJu8@@cV-+>=&ctfQ>4bbgiCgr{~kcV zw}68~0)BWhSqBC|kweme?T01XWR6;+T_AP%ab#-4W|gS$(!UnvCO5XdgxFf-D8a#ZL+zh zyVRd@$((c@7bQ_zeB4#LmdUi+>OAKBu7uROle1TKl6bilsFlkpX2XAv8|{Z}3L^D= zAVND5)+CdApfI2??#=t?_fGRv7tn9O+?2ZP%HJt(F51=hH4twY=!>jbrE$@(3i9cx zLm*Ho$=;UQC#Dw`c&j)&Dqu^Btjb88ll&y=TiqhTkVg^OAYsZaOQ~?kEmoQvFCj-| zD?Q$fA>b3*T>g4p{bbO*h;Qjj!0b#3&h#(GNa@(7@6G>O30dzxr|d)z)BHC1j00~$ zecfLZI`Dl|7x7630C}^6^LoE@GS}hOHeGbzUwQp)p4LoiH;e1HQ0p8M~cP(=x z8DorPYZb&^cv3!DeIus}zjJBg(|4BoNTN{XTTGsy<2U8H&D0+)m}cG`@7p^GK>^O$ zyIO`{E(kH4CX^C5l_lr2d=>&+ICC?q&m~Y0XKK?VMi?E@<>X; zqHskIHSMatqhn?+UVKEVT=UI0ydM7RXVTYrja;Vk%Yqpu8eR}Jktxo728zL`JxV0b z7i8)9lY4j^bXWu9X_!K)@@DWzVEOBBwpELODXQFLO$0{-b{8C;f2T68w~?IqMQ?vS zu~?c#;`RRA#T?Kq1)e*VsuYzXD0X;h==UL^y)}lm?ZW_gelaHaYS&0n-H8TKf>g*O zrR&28?b6uo;lX#&f-VZGJ3E$tF<)}F=kw!<$|5f-tSDlS1=wG}!zR>c@#N=;HzIz= z>~gSHCt#ULJGj9}&xj7?sxLVlva5L_FZxs)JmQrR7bSf*S+~E{Cm*cWM7?rGvqOCZ zd@I#okP#db!48zn80NddKjm^t+f*&{8_1`s7Q9WmeB&OfZi68ks#$CrW)Op(vdO?K z+uUHJ%eqY8IA~L_031Pc@39%DS)L{mBDP7&pA0Pli-RmUVFjk?t^W8<6ypPN+h&*& zH?dI;5tbU!_cvel)}?-G+?`Q%91maodi%fCa=A$6mz;*-lem!gnIZD5cn2yS5@O53 z?=R(#`3ZIvDPR(SGhNCjxLuYdaS}(Yo1}Df zr9dYzTV{jTF?ptKMQSHgAO04A-E+&>-&+ldmXOo+*_Rjq0iQzJI! zEBB}4jNgjxvlQ#DrV)NBvLVNh5I#iS$zA(p9I1RbZ82SM-lvK_R}ahnAJ9Nfr>(G6 zR#Njy@0cRH3%|j1{5uk(OfPvFK{>NF0B>O4z8u=$WFbAeATw&h&c`~xuv=c!mtKC? z5*sk{@#)Lb7Q^t3KYo+rxo21BWr*YtnQxrBCOOdG0#D-HIijJIMsoKbcPuA5?5djS z@bRKs%3g~G(N8paD9vq&Qv9g~<-90%-hg{yhg=tTXbT&~&x@C3#@TsLbIO9~ zk)<`6R_`1=8v^|N*QAkYlC82`ovi>JO?W%3VuK`HiduU81_N>jj$V1`^Sv9`Km-{D zfh`S=68@essWXi_?#n+B9XS=N57<1Mj@|-3Bd=b2HdQQmK2KD-DcT`G7cA<^?Ehfj zh>U^xiphckwJY*S^%0$kq+42=82%)5t=t?nkM>fyjv*m6V%0cbzb|?!xb&MJ$2P?p zDUgZ?_6!M7V6!G_suq+(S%#0PpSqRHl?H`n01n~DxdQVFH~}V6tj+Up$8eTiLSk|o ztgDR)F{Gw!+2z_)1C_~#d2AoaatgmG!$4+NL`sTmwtB9l^J-D^(1=f8#D>5|A!Pe1 zK7o_?{INqiKAcwD9C(!AbCwpqA%JYm8Jyg#To&dCij2P3c zbLa{0ZwMHxVW~~Kf4(?#V4=UM)VzP+`hrS6p?x#*zO zb`~8E*e~?Qi|Gu3ApH#fDI7$1gtFp4+I@rb8ZHMWcy`}$$B+B9aMGbX0=_=gh<8;yy8y{tJMw~d!q57#IYOT!4A`{*J;{k3Ab2T*otg3c#mN-Jt}9r?=h zNBY7Ex#0Ds__jluX`Y5sw5R4Slnc6^vDlZKdiz&svHsG_<<+~Prbc?xyw1qq68PE?}>O6SCE1 zv;X~5BXIdwjgA|^j{p;1oSD3m-gfkfSwxdflE!p0U{wc65JfCgz77tYTRTdEDB($x zxs`zTxRqp*eaLvwfRjV(mW2!xd`)u*ii=R-rYi~S{N-T;_!rQs>-f?6*x=dBQSUmh zh0Xf?fh>K7fzX>4BV3m%y0{aN-8r9bk#-fMkkpNRq*QU5=CjKo-3{N--Wcxx4ki@J z={u1MB|qJkVDg)`2~tKvi)^*3mw=WJ8Ruk#MH4nrRw6=Ac5ZqG=ZKD5$dNiwi{0ZEg&{VGNc~0Y?l;6MmZV^p$jYlrDvS-?+_iIR zMXWkNx5n;oce~{KCtaFOB|5IBb`L#A`vV%m`9DuM!V1>qee}fIPKg3DNk2M*V(^s! zN3?cCSxL>$)g9tatNzkzZNUEcllVk?PO7zTsX=P6fnQPfRMX&_dT&PIR5WK;i5RX816hAVJDR2;{>=Av5l1PN$&Z@_G)%QhzvcqHue154hKH&EU2zV~cTh8# z&p;}hEY!mNctdxRpCN+e%?YH*%%p^~6m|oU-4DUo<+U1H)&dzi*3f96l3Pf-2Hi+f z)1y4oD%yD_T{L5h6a3d_|A@4_Eatj|cGwU&D6QFP4cQD>MqgGoCsVI-ih($X(VN-J z?0P2!2LFF%Cq%oSq;aD}0|go04Mx!_Na#f}f0~rNoTv>>m2&8NiWF38sUGa*M39~e zPGejVlzf{E=!EfH~=?-A#iVQ=&*SBW*{g`>~5OSipJ9R&SKA7q9&5H&ZUxvQys{ z9jh`vd)`(a0IEWog=?EZAWjO;`(WAJyrp)1CfdzMSoH4veR)+i|yTaH$=N z_Ex$iJq%bEuQOSSS)2C3Bq_Mhbs)1cP1wh7G@jTma7B+93tVtj&mTV zR4TnpeKTv1gDI^=>xzmdja<^UEC$4pYhG}WdJR&m;y%EUp4CQR5z=!&(9RSy6n(h~ zpxTf|PG8e%7u8uCEI4ppbqGgm7lH79=A8PaWl#Q)8#e#_qr^{S>DmkWO?mkz$Io9j zO;Y>Cec?U{pl}K#`Q&*h|98WwD<}DdRbCiMS2~Np6uIek53gbP*;UI2%eAdo^VM-I zJ2?08pOnvq!2_S~F5axTH!$&c3I4Ea0@~d+x=LT=D=CQ1Z49fEJf6-a^1A!4h`3a9 z$XRHANW%b;d=|_1**$($9sRqr#>i7JbnN>*(5dmV5~7O}7l{W{kJHxUxo@%gK5VAe zEKyR~OHxxCN=ZE;`1t#gU9SiJ8w;6b{s1A1S+4!}v)4lu6n|`W+n;b6%10Ih>ng=M zp9XeGQ-@tvFou2O`m4T5^P;L6Cmp%iX5YSJf5nh!fxqs9;_zi1HJ@om5tp4#9-|ce zr*YuBkX484nxEB#e0CRO^eiri!e)+S%~E>0jmIl4C`VizpqXW7Ip1jY@YQQM{j|^w z>8HHaz$`q(m|(yh3yf+24a$U3yU=xkYKiHZn$aP1Mu5Q$n&dpq0p#F_S^xRM2mTP+ zbX+w{V;sUj7fF9i9e&~MzdWJBm|!ocoD7`Oi(^*mu*(i}RiA9GoE0qI`?me}v|ir2?%{>UWL0mP?Yi=9?}yvK|BXF4FBerVdp`hA43GHrkqU8x$w1;VOZvEOJCnZl{?=qyp1VjjijIs z(SvS5v*ODH#!eMjmi9;E*YW;5rV)kpptTSAGwNU-bU z(!NvRAR{a6?rf-~K3STPg<0x~7!m7?)~CY32?O=7B!uh&AjDR`YE;?WAiMc$Ox{&P?~{41ZdlAls)~WG@UMnDGut6uHomQKCF{`^U3$Ev zrlXYUySaHrqtz{k%V#KFNQ!V^w>EGn(nE#d_sqX`bOv{b5!zC4MGu(Wg~BFc`0N6I z@U#$O126m@kK6d?eAO7-SU##K>G|+YR~1? zXNlee84~DgLY)?y7HUScb9uT8EUm2|Rdi|Mg<9M4C-;EkAF?OrGgb^LU8>OXxsb2Z z_KO}WUl&Q*Ti1pzu(f8fpMWsB*k_!F!Lh)X%5Nmkp**6rc0!B(GV&59wkG?vvTZ+_ z+uX|JinG?|4Af8%Y+QzO@S-in|MG1AmZ$n#)!46zTFkt~6OB~va3&xpKZ{S&wPs%y zu|A)+GIxKU+)9j!ST_n;FY!7YWp-T<5uqCZ#mQsv$V5f~msd-@$~Ob1;?zvK zqaJ%Dq){6??~T!az>jrIe7rSaSs;3GPfTaT6od$AN|#E#YYXoalGdiae;pY(WzWl^ zfR%}wzmcQ+N6cNbIe1+1KE7Ob#N%1tOHE?~JEY7(Zg5q5Pl}QnP{NEx zn5)dh72%y(s|Wk5X9x#tvHDrjXIq7A7-Ds@cvz6TFE^udtzsHt7L-+{6MI1`OcTfT zNy>*&V>sm!cFgH84oX`AHCYRP_cX`rfzPvV_|T?1Fu3}^hZ##7|9C4XPA2(4ySpmVO^1=L&I!KWMC(!V}W34dL`GozG2h9%6iQ85j6?oCo)i zn8egk+DUv*1(zORv~Ho=0#8RU*hsgFaj$fWC0f%#i=laSK53s zrC>oY_omkFUGH4Rd3$tTjdddLM!`@?wm?se+>PJBm8>M|;lFcmY%NLzUj*X^6#mF-K;*lp7U7e3pFoU)!zA& zN&6ZMjN7c5Qocb3%{BvQxA+4fQ$lHIXOqO~koxu{$N)jD9Ve4AWJ# z(#Nb!weFj~Eh!r^3-%q>ykf=0{&&3Bf8A%#-!33Y%J8}+NBPf4%EBITJ_iu{IN#W< zphx9S;8StLr#?U^WxSUeKjsz8ig51oJ0avKR_jM;yD+yzOYNJGRji9T^r?*eP2Tk zu6EY(*WrjhCXLmj-vS3%abuX&k|>$ z;)p;48>!Kn53#c%4WCkfovRLgnu@2hxm=fv$nE>>3lN5Ts=d822kcWZH2Zv;G;Ng# z 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

_{`?Fw=yzJ0fce<=h(O z`=JksgN9Bt#De&PNqnqW!mbB!I5Y_p<2S;G&(Jy;E<28X@asSP74zTHWB3YTWE&M} zS+}zNVwW)X&^*$H=DcI-HdA61+HH2<1NPHW);Qw-s^M;)$0`ikjUmNtQb;qEqw%LO;c}-hNn#kmY|uG1VGvVa_4w zw1u4jhg5t_)FhE-r&FBbr-`GUoxSH)QFIvcxJWjNJe#Y0c zQA^~OXb@F8Qpn{hZua9;%VGrV5{;VuU`r?O&dKn2f4|$|yrf6?M|Z>G?6Oofni~W> z(Tig@4X3W>c`ART+Bin<7RIDzjd@F`H)9n5=0hq<%Z-8o8OpBA6G%qYTJDWIl}Rgt zG7@m)5NaNB$4h5I9k@^;ZU+3!{x%FIc&Q%`32V!Z7$p13#SQ?L+?UD-NiAL2WF?Hj zwY;`N+KLDpMYyO__I+<~7&2n1tIVCLxKFG?tjU#@txAMicj}V3fS&C{XyBk#D6WPJ zww>qLWdMX;mvRareUWU&e*1HBb-BkXieuUn)>1ljFqI942!e^^^w850MrubTV}*Wz zoHZN%SE}8+T`n4Y)O3wKf7^lR@H)WHLT;sl8nvEDwX38{f?=zExysj3G1{AQI}*&6rRd0r9XrK+W)?a1 zWZAr^V|Ykvm-p;wWV;47cNh@s2x+vDqJMvL8?SlvlzbRNo25U+iE0vIq#NzLTzwp=DK`r_>KnDAK1{=xl1Y3Vdr@!9kt+HJPiw6 z_fB~~A|V!PnEn*=03Cq~X80+sPqBn)jkx!l%{DyKX|?JGoOmyMo#k0yIb+0eV`Kv1E|2s#g7<9%XfP&9I=7ZIEdKV zquIUL^jA0Xm}x>;{!IEUUeMIjRL~u9oGlWeOM4&xJSbM!_Zp^$Odx#u!}0UJsQfc= zv6@&F%&o4qt-cc&wc(bF;S@0#0Q*;mOL^7(z)WzkcG>F8P__18>hrZe(*;>D(RFmg z4CE{X=1=ELIY0d#r~Uta9PgL*O_CUc9`(Sn{8u%7 z*ac}!HJx2u?d>2XH#x153_rO=3m1`rop7>q&(6BJB9a1m)hu15;W&eT?1q=kM0Od= zRS7s>_X1qAt#-MXLm6`fGEbNvvbkqQ8UHd8r9Pg%SQ57T&gr*CoFlerT#e=L!#|g+ zX$V{BVw+0(_!k1-M3*usBz>xo9o>|b*3kzv1!`PUxTAA?EO;2U9t@aqE|1t5B% zda&QMshrpJUc0Z4QXj;hw>p`{;y%^@+4UV~{}NER6;96)X+exT3KZnM2xF=SZ=W`GU4_(E zE4xj$7G9{<%ZehM))toCV-3Yy7#{q6VUhZ17*KDgGD z8CF}pxw>2zA8X{{K_xl4)LaTXg~9bDk=n33Vq@kpL&$W-J4q`9129d7|jJotoi`5&XI*45H z%0D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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/labelmapRenderingTiled.spec.ts/axial.png b/tests/screenshots/chromium/labelmapRenderingTiled.spec.ts/axial.png new file mode 100644 index 0000000000000000000000000000000000000000..c955ca6785d551e129a22876db34a348cb030023 GIT binary patch literal 16162 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 M#&vaq+MTff1K`>IkpKVy literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/labelmapRenderingTiled.spec.ts/coronal.png b/tests/screenshots/chromium/labelmapRenderingTiled.spec.ts/coronal.png new file mode 100644 index 0000000000000000000000000000000000000000..b15c1709809e13466bb7a6e12cea3943d8da85a9 GIT binary patch literal 22025 zcmeFZ`8$+v_&46Wlqr>|lu^V)W#47&HI>X{$&h7iF(G^Q?4?0v3uE6BLt@Cj@0pRc zY(rxy(!|*J-E;Xo-{*h${_wev!=WQn?z!&kI?va3&f7B)*wg0-$^Ie$^Rx;HlUo$mTW!HeHSYbKUoJ54n`){9Lw(tM1GUA`+=K3SRN zGK(m(ysphZEE|mqmKMPL)jY~qv>*lRblX_<9z1a2-f#RO(RU{B>&p{=ca>Q`-BV%VjBmKW4N0i}zxVORgUopp`n2)qU-zXlr9en%Ge@7&l zuCX3@4~Kdkd3pL(+p!~0A@{Bx;knDReB=nn(f@tv|E|FQuE764S6~*L=SD2$dy&>J zQM26%_E6%)*ROas7Y~nho%HSg88fB5&c4E~G;tMn%@xF3kq#t;XfuO|h(-%e%R9nO z#5pu9x96dAd;Hdy#80z}nfxrae3+C?D4wI0i&AZcgu0lozBmG34VV!N_{Te?C58Xq z8X9`%dmmN@8LJmDDLoU8KouP1&25oQ{)TV|FvL{0#jHq}s(xb||JjNK)f%T=j>Z## zZ8cMFkLVXFI|2^A1so8~wy*zw^W(>llJJs-A`^<7Qh30EWU`LleTvEw$XHDi8;OK^?~p1?IRd!he|ln- zSEKs(AaLpZ-9O9Amx?Fn21 z*NE*0T(XHXXSzy&zq7LhB#_P*zd+TkT8!=TM_@klke{AkDY z?oYcyA~GR6(Lv#1yl5gdGR$nVEpn}Lp|XHc4ZA>ci{`tgp)$t4YrU}h5dWT0&Al*p z0=_ujmVJ~|J8Kbk{LZ67YG~_(+1`Me()Pd1*9E^vn&YI?m;yV6bBNh0YnChL9-6` zjm4?`Lg%f1#SC3EG0L$FTQC`{UFkf&?|uBv;Z`c_o%_NZ;V}m zq6m`6FBlBu$F$o=gazRm{;$VuLV9{3m0=?o7Z;~rNJ+To4Blzdjj@owqm3P#7p`|# zrLV*eVsiCLsvH=DkxMeM816}vCnbRq4j$K0=kIIRnJ&1=hpSGGRJo#aSsI{)rr&L4 zCizabJVFi6t#MM8lzOCDBe@jFFn8kz)2v5{W1k`;A_nIxKkrm2FIY8fb;*wVUVxVt z7fbrAi4Rx!uhi{db^M(dL*f>NB1?NwN!XO0?(Q^YzwPaYNfjTu**^XC!F=YfUgHhs zsCbj{gZ+)0H*TE0syJj@hM=>HnPw3#eUBJmxg=_O+FOYzgA+zYJ66!#Q|M_vj!&QR zz59qJUdzfSbg;9tcdc1#rWfc6QtPK@WgBdI2h};a6H`WfmL_BhHk1knY~kTq?=#*T zRdoAiwH~aud(vrzX!3{v41z&EPSBR3&)oZBH!4S zVRH$4#+rgM3bL|ta^DbQ7a#g;%=>Nr4q@d)JQ?;lxS4;laM;P;wG?|F60Vo0rMUF< zf|g>Dbx#_91P3nU^MGA#ly17i=5F6f(5d45EO~wI2q+zWVsE+o)yK=l|S(M z?e#T{+E<=cI|Vfp2rI(==;FM{mT^;&1F7u&c^f_=I+`!NV-zoT=9bDEMR9|iK6Aof z7df(MA+u&LALM8l^ah{id786vPcn=Cr+ty_ z0>&b&tQV5WhswfSh>6J#dXZ-yrlF}h|Few2y?v+g33&Tou%tLKHYhpFH8(5zyba-N zQ7=~LdeCes%_dsaSy4_Rqtvv1@@~26J?+(YP!{&dSL{p!W{W6LG6b&t>`cjTU+1sx zT%?O+nE6+^$jKMB9c<(muj}W@i;7wh=cS3(NlN6wT@@DC>1(XMjk7Ig12z@+lWsVN zor^{jZGKL>VM%&P*)~aTK1#HrOnw)op8D#hfpL*Nv(yeEv+4eD4>-1i^q>9xY?=Me zoMB5PSk_&r)W?vM=3#~-(HOKq3}50;$;SfmD!uX5xq6;CU0q#%7P7~=Pu{x#xTDbT}3nW(V5~`|}HF z^6oQMD(5#}@GLi$rO5f{3Ek)D!(KoV-=jEXFP}lHLGf`83K2Nk`tV%YKt;YyD%h)Y zn)IQiNld#%hWMgrq~fv~+kF_0>~+A{;~uEfrO6wIFirt zjYrKM$;l7=W=4S0Y~ap(P2rDcJox>8k^BE>_y2X9d>YAFSxXHa?E``pI4URc6D|-&K@-sEd^FH%YXaVBb<@$h317S&Y zm$F%)gsOo6ia&gEGh%P2aOtAsd%71mvIoCac0=Z96$ee+yG@OD_O!8v02SoFyBp~* z0}P;Ezgkk2JViD7(8NG-JxsO@*2pv)Z;A*|KHcJ7r#u^eiLT9AffXSS_4n(NJgOuT zPDQ=TL!WUPFL$7fq&OIkE$(Nk^;zUTRXCeTz+{(Mg=r&u`KI0Eb&MPb3&MCHf9Z5? z-^C`Coe~v0>B|ds8)LH6t~(Ux+JJ+73U|Qn;_nvOX^F<*mu<(W_faSa9A-z7!;PAX zoqkQ6nrdxr-Jen4Gx-rz=R+izLz(Kvh!5jUy|<dE};{gZ%{yh_eZ0qM4 zm)(xU^sESXOvDkRA}09bJEm5=ke>*>#iVa<-<~;`Fe()G0bA97y{yo04m<%5Sa8F3 zUW51U=90qv=7*!r5nKxO8+8lek&)c;ZqHiM|Fh?LqxjsUbZ`xu>Z}Pt1woO*A|i=1 zFBT$Bi(XFQdrRmocTiW0&d$+F-Tv;?sldwlX42qYleNa1kU7=NCjRUA1n<=wcO{yb zCap@Q5%b-tR3p6wd7_`?zm56PQ0TH>fQ^j}y*qWGerMjq(?l8j%-ehW>)Q+CJ7XLC z#49^Tp5X5MdDT%+lz_{^pn6NG3;|;0a8S0J7=(b?ojDoe&on81+N5VP%!X)B+4^ps z0OJxXk%-HB z3%z!#<(16)bI1_Y2gH;2NM(a)M)Qa1pWu-MbP1X5FUND>T5d>4Bg0i&R%(Czkmx8z z&{0VkRiZ8gp5}!DEZp}E>3F|n)Z$FDV8~0!F84k3*ZO6ZER427b(tl zrYg=8_h7-GR)NbVDI2LK;QHG3(<;?$`rvubMkfEeF2^(IASgyHOU9D$g!4YUSN?6x z8h533G+z^JL#)w%dpajzO+R3*@zt@vDdWkWcF!k4RSf|rA#xJNs}5Q6Z5VZYpzZd1 zH;9Ga6X3K|$XwqlT@1s8xf0zuDXE$_QPHun7xCZi3LE^ZL~kdhDY^cgXa?Y6)O2Ag zeb0XFLNov6bww*W2iUsPh_mpogR4kboIKMotq`K-@=sdz>bAY#zn2`2+J zb9f6m3qEC~q#s^prr7G|zXPEb9dRNAOdm~V#BN=kCCCC6JZefUp8H{2W-Oo(aiO(H zt}M>=DpQkcSBigi;dMK_`7=Ykik&+>HF|k_n-rD(X{`WTtndHaN29^jP4UZe1(QCe zmQVjg`0WJp%pO-lw%KN6$!OY-zRP?gF*xl(gr<5J3B-0xJsp2Jdc~>U=GLvR+R{o& zO7imZ0l%Be9caz`=!r@L;iQg3*bJWQ{I*eL0nXM)Kp@B3DvRLEX_hDj$G;bc{Hb1Q zinL}_e_W|DE*NzT`OUocpPBbG(K_Al*1M1U+uFYdnMjJyMPkvd#Ud2vcf{V;tjY*w z2?+&R1qFo~03fS|hX*>gDL;GpzR_0z0wm6apP-Ly)B;e@@N8?d2uA^!-tFHbPKuC_ zPys!*eM-q^y)>!II?d1HSIp{opsT51eC(i5S2m${Wmj6`B$#iqrCZEHtD)nMG*!%c@nlP4|BNdM|HaA}kgSkPX9&dXWRR zlNQg1${YSnwavug2v7m0ri3TLL8Zc>XU%S}M0Iv{=6eN6SXIyE724Cv=jJNLRUv!J zVh78?BZpkA{n*{N(lP@~9`i%m!k5HEO%?sN`-526$D8)+W<;vs4y3 zZDq(q+eLMB{X*9jK**j{rs4B2I$ zoWflCv%~Zv(|@@9gM3!R^u#ToEuOe?g-ZvE3j?)*ncKT9ELDVRo9b~Bb)M>)`Mfb} z#wZqT`IPSzHSM+Y{74l7HOPIk)SXsdRL|+ARM^m+%XkB0T~w}`K^F_akW^N{UXfY zpM0dwky6!sz*gF?HwIO|E-PrY>Y}-pKwacA(UfDuL6kY1dTb^ zFJMjyNWgnk4t8g*Q1e?AJm*JbuDTG1PiI2RXLtO+GlK5CgbK2SA|d2TOncSeX+^42 z*I3z)AKGvxdToRF%=~B#e8G_&KtDnD{apy0?Sj4G;9z2+mdfU@-d+rpDPj_A#r`A-TL**v1{qIU~kV@OzP!Xo(%z8aP`1zzN*h!nP0M6UUhxB zLrk_%vqy%Z+ZpyCSJwjc5;gH}Tgn*(DCd3cD&w*D?MJ(;N)969EYBhF&^_X9ddTWj zlL+J*tMPrCE|?`jQ&ZD_y2C7DaM7XMX(Jmj3B3kff^G{oA$ z@oW~Ef-Ia$-lYeTsOUc~Rhl_{4LcKuyx>DpjbEV7uypi5j7t3!m((vhE1e#8^Hs`!#@5S8W72R zJRLjf&q(kidy0C4X~Kql)*JLsK{5p<&p$GzPPTBTT$Ro*udMufsV!hd(O zx3`$^QCF0?&a`G!le>7Z!PCOxT6&Ki@gu+Y>=K1)_RH%k@?V0Y~bL`w!}~%R{CYA`xgIWUj!}J&wNY`io5jN%*}0zR@=xW<|#ir8rcyICYr z$RQU6v@ix|QrT=`eImTz@n2ND`+#lPLBrT^RTVO0 z@n>G)dSK(k?klZ;?KP@dWM+bEL0P$Qo`LY$WR6Fe?X-}SOMc@iJ7vMGTcBa$0jj%B zBrL0s8$0CmW#AK@8k@wVWZTsJfW4^UizpjRfFjk--^AJ>-!iJR(T~~gvzi$0dGc-> zxmx{Xg7e}3nZ@?nmYuk2#pHMg>Sb5~w&T8v^6p|w$XTu=GlOT+m#vmphpp4jH1kAE zA|m{Hq$W4=s2gIOO|T1Sk?uZeuFCU6&YTqYs6kLgb9HBe*v*XhXuir$%l+=713EH* zzi+c{)o**?T}6YWMHIp$nktP2&BGjM=W^TVvOK|u(B=RkB^8sM>$CQ;0VvNO4rU)b z7kb^+QF@H|tn}q@nVj_$1)m7*nVo&Eopq(1PN{I!%)aT>z}u%X2=6{V8xm0Y>zi(@ z-0;CJ`n|ZZjQ__ht6|9?XvF(cVN(@#4n<;XojrKOQQ?-OtTZYmiG#G_r?$WU?&JgA>96( zn@f|04f`i{d^h3YZu3{;jKhYYCLtKjeLS z`58lHadsqy<4-Tzuq9d1scucLq7OBJc#Cs&`M%oUANLKlQW0l495*mt>B^a7AbjKsFrs8o~bIJaRAt63($SN zy}j4m+lSU2Xx4NqGvD7q2$X!PCM*bzDk*|Td|VrqziT5B)QB&|ie#gWEir9s4q0-HKtb9F6U_y|EPD) z!%5Y;PgvEk(`H>`*O93B`<|oj`ka(7iSDgGfBw)_4z>mw0JI8N%wRrX zq#taJ*DVHm-M35SJDG9MM9#wE31yJYl(pq~mEOa?(qVh$etp>I^f?3`iiAw2obR2X zef>G__EB6tCW|)BWDaXB8uYg9xFpH{)Y{4_>wSbng+eONX(cL9-l!05v>ZKEGv`Y| zH9g$bMBi=?RP(ilO7O&F%04%Wuv`;!^;j6=VtTc((`w<&7$li(wdhwAufJwqtah8_E0b3b;y-Q-I_T|_rW5*|{(R(`^?C*|K*RWmLI2syd*_#L@5~?wA zwgVL4RP^Z9NXoG2)d8`{Zcz8N(WQH)<O`p6RUm3uT23|Z z)+Ta@i`3{sbYvP={JMu^Zm9du)BQEoGD_Ed$N91a{E4y1%V%g1U*67kdR0}GOkvO2 z;akj(GElGKVyAIsS9>6x)Gr+D_8jacvFwirtQ8K{T6BB;3iB$kquo;FuMKEyxCL6I z;C+tCu;BY!z3IHag&oUoB*?IB_3KZ`Mg_0aY{X%gXRBa z0el;bMaR8`Gy03*UK4l_Ot(2Z8|i3 zW{x-P(HiQuOBQxA2ef*S$X{a8#k3Vo6oHc@}{ zAGkx8Dr3=f@D#wWG#0HXU{n=Y8oDZYsB371heyV@Pd(uFvG=mE=?d>oQ5K0U7S8+e zOnPR`CAZYyld}2sYh!Xj+(WN_86ljMAL!$CX@giHOQXTAe?!#;4+TujvZwme_g90* zSw>Djx+Z=1=iDt~f2W+|aPe{YDkvN*@DuxXjU1CH4+Sv9&SF;eFN4(wogw~djHI{c zatW<+6~YvEkq)e}aY|a+)m%N$@-ja)Xxo6jfQG>Fl7GF^bl(+*)|y*y*pF5Z?20Q% z@n-q%%vF>PjuhkH$61bsO^4c+d9Tk7uSvD-St|w_ag;6>PpqUL_;ONgk_3qey4iMb z{Qe^A!E;MXO9PXtDBD<9RsJ#&7G6b}vetfOjwD`~ndpOj0_NS5{46(4Yd8B&`+F_0 z5_pH+M}92UbX}=uqZa520+uBM;6{xN4bNdrtKFtY1}>(Y_*w6_GxQHe2GFECu~&Zh zL$uf4eC>*+>qt)$m6cn$_W#@6dQfB*A^X&ug&i&Btv`TcF6`|0_xCq4Cizb_KN4t# z>7)NHd#S%k+%^bUT1w=&PP9o)bbU@3#GrLd3Px?OJ97s8{<2oR=Di1qOC8TYkD5Bi zioWUm{CqytHKM)rM-h~fF!oqeahL8mjd${Kx$cQJfX=u`0cxVX-^x3BU74~e!E zT1~)`aE-JT%P|ydRWfX^>g?;=cCKR7G!i4&OMqUBJ=OAF>Te}L$EP9Ka?%Md(IycF zFt%*%x}8%)u6hGCv|U=ziELn+`9u8mF+04#!#4aGRRCSIaiE^0%eVMU?gV5i~W zHTUk5F2*rgw%10`d!{#hXLQmfRT4DHfS%(8#3&Q$UaQ$|>&>(m7JF-H3)*C1pnT?p z$w%B3zl4M$nIkARq!w}MiwyOP0*;1%kGzvc@#9cQNkL-AxO*viRZ5+2bxWwJh`Zn({_fkJ4Jd4$wCZ{D=m^AKkBX-}^SWVyW<9!fON}B_>G66*89_5|cZH7RG6<>tJ4dSZOc(DT#V(IoIB7w_( z89n-+4pQ*lBm#9gTs4XBFMqK)opwGfCnv|XzQLU_n46o6$<-B(EmzmP#B!YK41xQL zQchgdu`!XO?Erf4;_tAvJ}sfjIN}jHL|t_JwB1bWVgDNY3*^_X2rRM<@XAS0p=ASB zWR1%06O)r^Wp>oY3TU7P_bm;btSC#PI7^g(&**&P#~W4#kI+@c#pi>~IVt8aRdd*V zZSN`HR?Qr#FDLqw+Lr;QF0aep=?qShc*Z4{nRGV|< z4$UMM6NGFk&eyD|D=lSP_0Bk{AP`E#h{l(2<%~KS-My5%%3jU@el|M%y#U1`DZFJS z8nCa@Lh04C-QIZh<2Zq*g|q=QEA5J>RM?rMM<*(H-qd!9oxbaeFsw4(KlITXHYY+0 z81rLwH36Ou4N+0&vd-PWKbajmOHXkn%SFcEp_0$J%qnODkmKghPF>;&VjFMd?ho$0A73h<>X0V1 z0L595_u}{pKM^v?e_9T=^kJwO#(d}dwA=EQZUEUHF-KGZ`Q4e*-!@4b)*yf zm*4g=z#+0Cz8Um(aaqn$*~@jH0jsUeT6rb$6}2WpDC<#DCE%-R3tmVF%{hwz5JN}5 zZr<>{XAUz{D_eZ1Q(KBSVKaU;p!dXCCStzDSsKR0W=}Vo7y|E)+QmBRC<_U+$o&fI z)0d~F(QSyA!^w>i4w`riGr%f4-UD4Uuj6^6eQ2FzAh0 z{jC-y4|QIxET{q2mAo+f=;4( z-F~eyB2pE!QWf7q1>=-IZKZY4E4n*JvhEAEG&-vsKDn-0&?IH|?nu4gSSt+JYYt)o zO3?1SXM@6`H>LdKjW|nfa@Kobqd`F21k|>Yf$b5xa>z+%F6+H3nf#L0K1OlG()tv) z6e%)4oCz0Jl->~@9!`>*bq2mvo{Cdq($8uKnp&B>gxoYjGvkrkL;`r_#TMDQp1Gl= z2^O*1#by?BXhD5tadGr1iTtC@UC+aRs6K!ADq_yc>g+`Olna(oR3y>&&u6iTIbcfP z-}2X5m@Cy)q+7&NfW%J(Tg!ctf7w+IWC>Q-Po&XO`QBpCz>MXET_AVviwh9-1TQw1 z{!komSm{=fKmu|!xQ%-aA=fVex_-9EM1;kbw*KWOGuis8-|G0mPQdsl>c;GF3665s z(a^dlwFT0r^#xZ`S-JUklw|}0)~u7${@GdW5m0mh9)2q5d^WH3k5^jm{?qgAZiC|F zQ9jW4WOfdGnqKCjO8#jX4`Wngdm(FpzP^&s>?L46XN5HbGboW{)O9Cf4NE$>8!c@a zHo$PtDw{)Ct+%*o5(&qc{{pZt%`B(<{NPxQW~%Q>m#k0SuX?Rf_6Jb}q<^4Dp}F;y zS4L;t>}5$0xc&NP3$&u~uKNRp{%ZjT3kOP)lFK8mJ!gDETS?-OUcR|CZ?u5xpZiJK zuu0RxjlaoG9zLV5ocQohko<6)Xb4k4@zxJ644>qKaG>DZ^8E>W6 zl*H&e;4CyVfs9G);0+JvxQlN-ZuTB}M@=DDJK0Ym+oh~EdGXRnq?*J(5$?NX*uC#| zPa@~$j$U)>1DOu2T}fgCCKsGTUVw?2&vL#14KAea_=S9Rng0YNkben|a6AKOo(sJb z78Nuu1n(2oF5wPICyBc+thSrgEuVySMM#jnpn#?Yn}0gzy_BPJAJQcz3_OzM{#+gF z?i2~T4evWog3onv_uVO@oX)8P>-E0Ip5MY{p)J`z2?;$4?EtP#bBf-zaKiM{*iSV*0A3*>n- zSy^6NE3Ps==OLD&lFo-p;ycDFm!~T@h1qJ}TCvLLTx+`Z1>T*;n=L=>X?no z%HO&ieyQI63=>a(d4eh*TZRxnr%BUNFEgXA=+r)@tryK19uqNO+F{$-9A0!G?j1>VXse zfBs})+W)YT5$QcU^*tgT?wmy3=xj`TD!r$$!3n5cY%D$-b5a4m|9*$~ju%Gg5(!9< z{K-}cW(XV%J66d4G5uxrx{a3dbFMsbihuzEEC8A@4n{_dX;fEo8+RO8EY;9WaU(Plxwn8cSk+P_rABVoT#+H*Fu)j4HJL##P83HZV zF8Q=9pMA%eI{Mz{Rq~l@P9*~I9jNGpDCusmA_Krl($dpq2g18k6+C}82MvT)IF9~Q z5qXrW`Gh>KL=S&naB(&-Oz>L(|l+(18YsaJx7h!t3gbhaTn4DkDS8@gZv$%P^><>WB-J zB17l{$Xfu%2ZdtM&TL@mh?tUL;W%`B-Y=6Mjul38>qPO+DHjZyRt|IwYZD{WdJlGY zM!5sMJI!xvDqe$i^(zS1KuBeM`Y|)A#yw$kYo$z0q$60bWDSy@4mxof+xMlNzJiCA z*fr0-kkQu!QJ|#jc?%BXB0*48(jzpn^0bWx2QJJot`%{`K+NePobPlX52Sk35obv> zEyRW8l-r~F`Zx9v@4%)k8P>&ouFn)F3|@x2iiRX!1$mXcK4FrF&#$=1foP4x=t7r& zg-(tp9Iu&zfa4qS33_8W`{@*?MSX9j2V0HTVrj=qmv6-$s*JtFhuUn3ACrOFAuynl zSP8DnURM53_AX^7ck);m4S%{ragHd}qs z1}hjJ8g$e$f509?wx>wQf!TVE(kJja|r>qLZ+T!GywN^-jpij)0R zkZoBz|C!8B27>3p1mISEtwCE}eUbk3R8Nq1gx!zQ{Y+(?LmQFwpiHnyW6}5yx)L>f z^2IMM5TYfvw(@DJQdAGaKm4aVV%up8wWEx+QVjZA_^FJa16L+b1V(^{BVV5Uj-$E6 zK>-!b|E|;H4G1j9e0iS4iC|d^XBQ6MNbu28U-Q+0FD)0q8BR|n{C5M zvGPj&*0)vx2o}1^@*G+R4!q>euS}T)S51L6r5;^D2Tysxu_7F5`Xq9IP-=e(ej$uV z$c5%Y*HkB0b9Jn4lE1`CL@YM?eIwvt!-{P|>tIzYxhvc7sD+`PX#AmoQ8UWw(Vczm zG3I>9N@u6Z6X95(VKEs?&3zF>ozE(Z?k$>gsj@F`2l(-nx%YRhofOYABfVT*;3%ar zG}YBp6g;~X@8*q?VKoIE{2~`aFVV9TN}^qU{jRzh!CfJ2XK!B{ko%nNK`xXD*S)2B z(Jd)Cc?WcHld;1tzB1Gh&|sKsabo8rJdJJ`CnF_=8|(wF+EzV~)1XLNxkC&P;Rt-F zl0xMgwrgS6@I@SG9rU>{xyclXKne2SfD^lRyg`q!A=FC=-BelH3sQbU5QYqNh6V%J0yQWnmHkZt4iHj+OWJQ~#;%Y{ z*|%~OAO~z$Tw?p1W~j|q#7+JB=I|>Xmn<91TWuOiC&t9lRJB*Wnw=-;Mt4D zL`?30EodHDra65@4#}7qFVlmGr=Y$5cRox)a!zeBH4zBF|@hmGwPVa2g~?C%_K;6n}oIS{0f^( zOg9UlfRufM&*mb4r}f(dg<02HnRxMm;$N9)<)aakujse^Pg4s9t&Mw-m!1o~)EoP& zoi_mP)j?L^I!^fX-JTV_gU~rQdHj1c(PFTW?bLBvIgzlZQ?1R`s?A1muAs?;Xfv6= zs4{Jg2GwUM)8cLR^1g;VBF3p{)bvVmhb#36HG8E{5I@b?sRx zcNjNqqgSYFVpC-G^nyu`yg+k@l7+frLFysyiG6iNJl%jGsbb$IHpnUH=I}@iY*$ik z7w_r2I*$zmEH%yCICH>>7_T1{HhOLiy+!T0*H&L$1m)G$ zo@Ot`68OZ5p_j(z%m(6*u6F<^*IS=oo$dozG_0s*p^6#4y3HtLuDeR-#O0S+__pki z)~6+!@n3ZZ>Jg0(fc}g};>V9i^Eq=`gBqBZIw)n`4Gy4q5~(PEDMpN#%2M z88ax-IohB+Jm^V^4apg4pKOj)H}@=ga-Y2PtF1)X(Qr;rD89!CcxoU@5FRAHXDszL zg%6d}C-?l<5#%QtgNV9zm}yKz`hyscRLEF$TF5y`meb5>xmJIbn#GMr#r5+BX3D&k z(`8Mtp+;9^;yjgfE~NjlvHhjmsFKt5E9$}3X^)zS$%MN%jj5?AhZnHT$2ZBcP$Zz( z0mHUsH*VZeRaNcGEL1ROb0wS7+xR{bzXyl4QjmhMPPp z`WXqRFtf*-LdELa__+*Nx7cqq%PhBf8_4 z-m$0(jw~D76AQu}7Ga0^=IPKwr7rzoC1C$%!17J8`b`VA`#`NH^oFvFB^mzYLk04* z(O33JFp3ABa7_b*<6^$r*BOwu->{dkHDxZ ztXuyXyz8BlovpljnP2Gn;SM|kzV|IiKTvg&gm1#001^C_3%**(Eap=;i$(B5%@hxb3n4r1lv zt^{XT8p3c<*%6a2WSuC%T*!4`@WEF3tSUH~U=neBZyjhL!w8-!N7sL0f1jC1jlMeh zw)y*pBE>n0q*q8aGBx!u*0=Nf+nH#0n!GosweOK7FInT~Q~&5T#6+~q!Vswzu3cnM zn*=XyI;~}j&f7-TG7u5G_%9+4QLV5(G%p@ujX6b5#3`7weH3C~x2d@a zq)KN_JJKZL7X5e9$0KQUaJGMggH8z!v%- z;;Kx?5&d*hKu~*PiFM!y_6JKtn+BPtW;W8GtIrJ`W_&@&aEqQk{@%jtONm9yE3kJu zZ=2@oCjHOlz53(9Yo5(K5Wzl_s$+6%`)$iQr3(zh?SW2qC?84%rr9Jy zdJprRUtVJq6CdR`ab8|k2Yuq?x)1cBTSO-KwV<$=p$SEl4jD!tNzqkUL>W_x5UiPM zLY99$Vh0Ntw#3e>h!RbryrhNTIVN*8$Q>-V*MVPH(c4)xae4cS(@;bUFxlBfL<<^z z?C~6FUWdTG@=XwY^EK7vFiVaVD^;N)Fkk)T7z3wbhXq)iub1%q6_T zoWBo8wy{ZfZ~4RS!{8mof4k{gUBV=<^CidFahx|#(nreYq~FQUc|>Rby*J8p8hBUs zHyrW?KFf*X+}!%@?@3wae?;7Bc{AG{STEymzMS{${9!H@lJQL>1_?pG6}WCzNPR#d z|76T0`OaE+Q8~QQ=zg<3%;|hUv->b$o0uZ+^5;!%M?YijBfliCXLj=Y#L2`H26xlXbZ*`Ngrrq` z)~#lwxO1ifQ#52?I9%fClryRd0ntXQIH`+AdH*0ZtBn7q6iO#UGVU(a@)D)*8<(fb z%gh>$gMtCc0O9f^`D`oAM2WvnZrk|_n}y5|qny|mdu*g$0E&xid3pdq|0wL%;QvDN%0fRul3M%?;$k{{}N(d{r2e3Nb z+%!_JlXRo`IvzfRWVjHo_4b!@QOb!>n`jt~ylX4zA}o$%2ghNG3o4%#HW<6kzGMV%*CDedx?Srqlpxw&j9B0m-NHsYUm_v$j; zK`2S>fmor_?1IOy^+=gpwmHm|!@$&e%fc>-h`^mKkg*Ha*y;hJbohU3-oO(8n;aF5 zi0E1>D`1EU3q#<-9fI*45R-Y&lPkFRJ_MvzJjd&?b*2Tnpjm1RuYRD$pwFSJ z%nebT>B@dT^K;;Yb*<>t!bfmI{@`VCce7rh9JX-d;h#mX3aq=hX6q|WZc{vB5I*bn zb*5U;Uk?>O4TtEhtt|jDLB`@WGwXR|=aKZ>vyl>_mqNj{va$kXI1-hS$K5K@Azb*d zPx{ndSN#3V9|ktJl0h{R0wW%{Dm?|@J2u`N_F4MKsKyA8t0t=<8GIU1g8-&nfa{9J z{v_$K1#81j!8vJXy_MiZh8J(_yE#O>s7bLf3ojpW#M`1#(-i+5Oc?0puyh)~V?&~U zBf7u5e&zV}P;tG`eV7+ben8T5HKFE@K1OfVM@oQMPHnb}p{(Mwx@93z}pw(gN&Hn=^2HHn8R46J7-wYaPTYW=ZLTb z(vv#V9$l>}ue^Zxe@e`3rMv>_5@s&3H3T53)Q@X$qmSN*vZvl z!W~XCVBP@1#JZ!O!0-Ysy3TDHQ!~&DvBC4hV_m%L-Q4H}CiV10KNEA9AQ(J|c@S}W z_c^WHwQ2;QrL;O93gu?$;I)gWXr3^q-ib1;FQ84MBMPpkNg-2Ngy6N!8a#q5L=eCRS?3hPXqrr=q z&C)kluW{tjncLaYxr0*@=hLR=KhG$!X|UQvT^r20Hhr)&BFri$eI`I@^zojUA)7fH zS25umf*zK*B05usEyLJEhRY;t0K7Ubwp`n`0#02kkqAn3NrF)!)voO46NGd}J+mKu zdRnT_y8AEz%~%uSHj$t<3_t(3<4=dsmv>cu8HakFjNUj~?K~Mg{qs3O`sS~ME=Mr! zQ2D%x(@O$&y0Z+RsGa%8(`I-ppXYIB%0zwY#=!Ad+S>+hX0`BZaW^ii%8Sp@(ULu` zQb(3gcw@gC7eKV8+#%j_3s6!}`3@snU}U?1 zQBYW@5Fw?cWRk19K3AmHchAn!pv&nA)gx2YLG?;bJAc~*%2CC&;8U3xIc09zXp^QdJp&Nv4k!^1&U2P zQM3cicBVuaa#xgz9gq!>I3zjQ3kwSy#JO+Go45|Xn0iL@K3JwU*peRRNk44a`P&q> zEg*F~0--qbg7UcO+nwbx%TY&994-@+`@B2!qqywmRTY0Q7Y{xs0E9HO*$%13Py1UN zX)k{ZkV0O+dK?$H0y-f}E+M-3NgOeYfJw663|PxE^Q)9t>Gc$Q*PK#qqBiZ5#z5>L z){Q+kIE;E$-YG74)Wq7BQ5Ome3zM%uIe3}Fb>r$R$~=l*Pmi_yR<)?OFn@BkP3rlR z$r`3_J{x`jVr*j+v9_RiII*kWSj&@8-pEn4Qewe`3dY^LtGipEJ z{;2BLcqpmP>LxB@xxR9*gLf+=!h{^d+lQRHmUjE3U4%RgxXul4h?{AQnu7DuySE1~ z_{vTuM$w|*77`uR1WkDw`Ln0b2LxD%&UTp^RVozU`tYyh!Rg>2=VXs#?1{N%V* zA3dGQA|lt_DD?aUV9`Lb?C3bFo03cw z*WEzbP}p)<#rw$U$tc!GxkJM2jZDpFy}8!RG#pUt5!b{lzXOYTw%zscA$h#ta3c+Z zTj!f)STDz*0O`E4QVSquKBF#fW|Vwit+u0;2IHM1gU}StA;GdN8_8r>m+(BU1(tf* zeMH{{<@CF-n(0OE2D${lEf`Nrb`NPWJLNvs$EE*;(Ohp6qM6=rYp1UnioqNxE~5F+ znAAr{1FlMLwc>J()~A*}9?Q1S-%D)YI|hU?XjE<+R9s*|5siTsb;?VD5myNroJ(1rtIs zPYiF13ZPFtljK7XxOJzPCvnJ_)l6K}{0yyn!E9EjSS*u4E?5`+u&}JMmkhzrS-ehq z!a0^If0(m5m2B>kWp0r%6VE8-aCLjoZ7}CPF0UG0M@(XT73Z~>lCIe6aR+5!0C?Fv z#&mt;=h`cK;@&m>h*<$?pXH5x1>3UIuG<&O^8cus!G}H%THE|}`!Mv2Q3efE@xOt% z09~J35EwvOQG9%Sobvm#JaPxG0Wk)Q2jjoua&?2rZ~pMOoer1W&9hh+KokEcQY7{v zYUP#Y%AWjVmX@7Ee}Ow#sEBoN7X!7@baS18=h(1juh&5zv7aT`|GT_Sx-vSVQoYl0~52$meLae z!Z=;7e0+cV_gW41&#A!BKwIaL8EtcF(w#kgpn*w-h(uaw)b*BB@^REvCe`}Ir4RL6 z2-yuPlV3Eff}3F2jEq;{W8uOYQc%vgTD;SCc~F(^(;U-)9jXU`&jDlA4AO03yR*SN zyA~I`6R~9x8m}03`F-psfJJEya;+s|_wR9fnBho5ih0w_b0-!(e49gw&0OuGs-wbqisAJURp@D&o(%$fscv5qe)0|}V3q$VR^M(^5I2+Rpg%8?DbsvZwmG!3 z-D3ilpLnv;w{$_7(8>k;M?Ilt$W2JaXm$|Cu_;X>Zlt|&o4+*d_cegWWg4~#1hm_a zs~f$L;gOMfoo$8jLsS9Yy{|DQ%$AP>(mz1y0SFavUWje}>TI&9`hNmw$o6UsE{L&w zY2HPVJhe-ygI_D{k%AU=`i2dFgzb*S0AmpB$8s-YFXsF;s}D>rOq%(L*xDRcVy(}p zkMrAw9|PPq^@ybWo4N+ih_wOL6_Y9s(I{LwrP~@6IF<F5zT(^eqkyOtOpJ6m=8Er3#VGy86h$nA{>gJ-xcbwI#()4qOPz*KXuiy!&+c z%cxqcj+1}A)r9P?YyO$=>)t*-oqHTnv~p?giV+j2+&jtsg{Gl2i_<+&jX@b#W_6EH z2y;ehhc3QGqYzV%&biajb?+gMumPabTnj@Jgv!Um~f2`#qB(NchA0k>@x3C3kwTCPEPa` zcWP-Ov4?JX(I_&gk&NuNWKHAT*^8L{yzR7s^*1Djjp3&k9QNUa8r&9Hi5+~88sKA% z%%6F7Y}lH8)gryX@XSlWO}R5Oz2J*KzYU1)7lqlL02ctfB@NwaH;9^#oBbLETA>saWW9Y;jnLQti*U7AUeLt%#qlHNUC2@UaZL_CH|$IBfAI-Q+t+5^#ImecIsP lH~;<#|DJ^Z8wIl@=Qk6vGrqs>1m3RSojK)tvK(2Dk12l)U1 literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/labelmapRenderingTiled.spec.ts/sagittal.png b/tests/screenshots/chromium/labelmapRenderingTiled.spec.ts/sagittal.png new file mode 100644 index 0000000000000000000000000000000000000000..091b25345bb8943e59b736b3ebd17e47bd1533aa GIT binary patch literal 25365 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 z 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 aujofy6T3`@gJUZrV`p>WY_-+Zg#Q7Jdx;kS literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/stackAnnotation.spec.ts/lengthTool.png b/tests/screenshots/chromium/stackAnnotation.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..c38551a81352a224b0d0bac13e2423432aff4c6a GIT binary patch literal 50596 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�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 bqi14wtsMjE{SehC@KS!Drcfbg7WjVv!~XfM literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/stackAnnotationTiled.spec.ts/lengthTool.png b/tests/screenshots/chromium/stackAnnotationTiled.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..c38551a81352a224b0d0bac13e2423432aff4c6a GIT binary patch literal 50596 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�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 bqi14wtsMjE{SehC@KS!Drcfbg7WjVv!~XfM literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/stackBasicTiled.spec.ts/viewport.png b/tests/screenshots/chromium/stackBasicTiled.spec.ts/viewport.png new file mode 100644 index 0000000000000000000000000000000000000000..a4272ac6b1af549cf7f8b65eb86dce18aabe54d4 GIT binary patch literal 68780 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/volumeAnnotation.spec.ts/lengthTool.png b/tests/screenshots/chromium/volumeAnnotation.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..ac2368ceeec3023fd51f6cd2cd2af56e18e675d7 GIT binary patch literal 57028 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/volumeAnnotationTiled.spec.ts/lengthTool.png b/tests/screenshots/chromium/volumeAnnotationTiled.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..ac2368ceeec3023fd51f6cd2cd2af56e18e675d7 GIT binary patch literal 57028 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/chromium/volumeBasicTiled.spec.ts/viewport.png b/tests/screenshots/chromium/volumeBasicTiled.spec.ts/viewport.png new file mode 100644 index 0000000000000000000000000000000000000000..c150d675ee2901dd61a0041df9293cdb73360a5d GIT binary patch literal 101717 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 LqjQC4?IZsOfaavw literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/labelmapRenderingTiled.spec.ts/axial.png b/tests/screenshots/webkit/labelmapRenderingTiled.spec.ts/axial.png new file mode 100644 index 0000000000000000000000000000000000000000..b146955322c31a1014ce407d43de2b7dc2c1f19e GIT binary patch literal 19831 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 T8)GV0o1SR{`m0jaN1^`<;Z$H% literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/labelmapRenderingTiled.spec.ts/coronal.png b/tests/screenshots/webkit/labelmapRenderingTiled.spec.ts/coronal.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e33ccb8ea3175ca2bbafa1a33ad128df8dede1 GIT binary patch literal 26466 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ξPq~c>aZo#6759mJX@e)dW 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/labelmapRenderingTiled.spec.ts/sagittal.png b/tests/screenshots/webkit/labelmapRenderingTiled.spec.ts/sagittal.png new file mode 100644 index 0000000000000000000000000000000000000000..20bd0cf8b28fbf26fa545e569349f3684179f5ab GIT binary patch literal 29006 zcmeGE_cvVM7e4?aA|!+%VMOmllp%T#Q4=DfMG!rDXGRTS5Tf@QB@sl8ZV+|!-hvt3 zXfwLeJ>&iTKF?a;|KR!Iv(~-q&b_l|&OY~^v-f`O{W>?|jiw6O{U`VF@bJjgRF&T1 z;o<+p?Z?DKxGT-}@89DN`0j62Uf`7t(Qo2Tl&lQYtY5#zdy4x^jE5g)i${1Xg4>_q zc09a0-|_M8;EwpW*S-_{f4{~5`TfrS@AL7k-~>lx03Mz^o|=-vJ1{;PK~lj1H%48& zEw@uE^{+fh{%u?Z6R5(U1B-#9&=s`VVM{XfAPS`cq7LcckIQM{VpPHa7_Bv{AO*OB z#RVvAB4~kMi#Im|j$6}>bS%aF$5e9T;S1dMu@-ldUV5!+|KHgWA?vIB8xq3*qz0&ih{qj{Ro+wG{!2a= zh1ruUEoQv``!l6f>k_%K^xM{fGC0AFKmz>#)7DE|TSixLQ@3sX-5^m)RlcDj{`{Ys zd<1}>|F&YPId2|IEn$Eaa`1_@7_@F*!G_g%jmDrFjIUm}JIz4VaCI_Ei)){>P`IAf_N17tN0aelnb z%LZTaIb90##v;5;y$5TiJ!p)<+St>TnCUC9lTURf+#<&Fd~+i|1|#Y)Gva?fo|Em| zaqTBwF6A6p#kH$Sj0<1KM(??$$9TnHrp*MvZ4VmfcAJ`;P)ojzg%54abGC-WSE4W@ zR1eY7QrGp-_?8nnK3heY>r$+DNsJ*P%XN!ZSFm=Wx!I`M!n5wArzR`V8{w&6XYCL8 zUiffRQ|hYP>56T;#8rCb_gfRtBH_0Y(3Fvw6MCxDU|ME>nc)yEz_I~mn27qR-plMWVGK?jM+nPH-$Nat82YO9i{X=w;vi!%QV_)cpp5_LStZuL+{U) z1Y~_$0OXE=zoaZWXmvY>WiNK#UaPt1`R$~i2Lu+WFx9*K9l3kQY~E!G+L%K@*{l1* zaa+H1SCqag*T{3V7&Bm#V~C|H@ZD{$^WE?z_l%J}`{dm-q}Z5&X(}@E94N-*hB2l) ztH_4@ZKDVmWFT#(Z=wrwACf5a;Vyi%YmT0+Ikr1j30PGrmKQvot8*@g#+vy~{mIrP z`_Aj4zYXKm-zb}))np|2())&rsTWJ7C0!X{T50}r5KiSbz~>z3P*?jaCrCH?gyN@e z7Zvyy5Sibndkt6vBKs}J03*C1xA6u!ui`n+z>9zSaDff$^|vJuiayR)vm}mKV%Fc8yu+OaRLwCiqGE=| z0UKU$5ojeYi4eu;uNj!LN<@!(hz!LFWgk3^+^(Hbba&h_mZMFz<< zgWVRcoc1l%B^?lE2*7qEK!8AjxK{Q==}J>RTH4LO?q~S?my`iA4bAD53*P{Aqm1ay z@QvRnU+~6{_*4i%T}CT##RJCY3A8 z!@0hZwKTe+-=v~w&ez5WtyBhHITPRp&AjWO9f3}BXZ$^Z$#Oqbso#iqLlYfO*G zTqTbubea-0C5xoiQ!N^I{ZLYfJLJ-Dy0#sieT}dYT7KqjheO>IGfX%@d6k<4yI}wO znUc0cku)V&G;fqJq>e4->HrjSqShkp7sYT#EbAK4df`3!hEjwmWyy+yRvqdg3F@Al z9M}RO}@3}>m3_mTb);6!P{nC1*H8MZi$0{@wR9Ap0)k>fz$mx%ahHK*bE$uWx~VXv-vBmrSuZ76*gLb2|vHUF%0AOm{i&nFGv4 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 OQ2UlXqDO1tdLfX zE_)3d4KNjKk)tW{^81X&Xp_Av!3(uJSS;3R;C=RqO5dubQ}mXvYq>HmFJ3i#h|>9a~1{%<+^-xuYsnV{(C^yv`B1~(((Be>z0Q{Q_2TI1UkqG2W49a}fErVtIsT2GG=4Tu-bwdA_;fj7qR{{S<_FeW6+(by zeQDBP79CHlKQ>NClvcB0;Rht+@9<1|)=NC<;ywptO)xCwj@O4~?I+R-|JI?>HXu(# z-L1<1*3G4UF#PwI7KWv~LpZl8tN+%Y=zn1T4}o*Q+$0(eXpe2tf9n?#9&^!}`nN?z zP=dLX1^TVF!2i^50?teRw_$r;z!UvkpkvsD|LMpp;B~$KbWvZr4g$Q8pa^Q-y7_OH zX>>r(QUB9HLpKD=O@ITh@3+_g9RRP{(f421=D(ewh$Re$ zVmHCC;}-F|4!jRn$p_=z7ydhrQxpAt`x@YNY~8WnPh8D^sLspKT5NfFzUMy!+PF;X z=&@hP|NHX)O~U^#oRG_t5OX*eF487Y^8xFT0b7!hSPLV?em9;679T0ZddKlG%bWb=AQI#-+Aw?vm!EA0si%B zcQ5X5^x;JJ*}Le)1m^c~r$1fiwzqx5f4*%&x}I*?wRfNH1pKn{jBy+J;sWvn+q`*0 z6Uvl~_`#cw0i9v%FOFz!l5)i%9N31lqtQ4dZ7N;EM|BUIlJ*-*POJYAE_aRd*M!TY zH%3FV29|DprAhi&2oOwuXc`LJZS{y=kdD*@9}Ssmyw>f-K_GnC`q;mJ7Ft$z+xK>@ z;HQ*b<+vk@9b-ZF1#_u%x+*g^nx0%>(fM7E-6{T6?ftH3un+vZ?zhj@*`K{V@khqX z)11Z)bz<2!V`*avhyOhqZLg&bYfh3jO}WOLnv3zV3Ns9w7ZNCV7N{X@seCm7xV~IR z|0%!bDX)vFX25wrGk);BdxvL6osja8rOt}UK}%&^F+Scx%blstDMk$ulnTkYtwtmA zDL3)Ta<+Z!LE%E^glk+(;-{6GK2DhLKl-f@35EZwX=4oVu*^!mU$2Xd-BPoQlAlW< zA}oJYyWj#xDr+Eol6zrhnh}wyGTF0{>qS=wLPm94l;8Ze%1r%jRnGhBKbn(KMvC6| z-8b8dq@Orz2Wa-I9AOm34xOz7;fFmLgrAWwmYH4hfe67wb~xL)uuTnBwa9d^kkplm;b=;t*hqvc{Y-rJ%{O zh;68}8CdW8&rXnN)4$9%^M@DPOvp(A-hgHQ)kOS%MD)2y2M}~;zceX&P`b{7bJw{l zN97rmF-?Xjn`Qt5BhMkhdQ8s(s^H`_YhReaf&dxxmLHZK^Lt9ZrRvxT`@G zB{jY%QNkDp-BWuzlgw z|LXPLLE)-*UpYPB-R`0&0hve>AGL@)wWz23p#}+Bi ziv}*?`}_y|jb!Rp#;liz2ID)$>i_8HmFQ$!o^X47nDQ93bb6TgadRp%2J-O?< zb9~`=dQ&{8pC?0a&pjn|_cN46@^gJvF-;TH@o;CIgRs*(>E~H)^KY|5_;%2pt7Y>_ zw2pDgDt|c0x4_{|d$S-;u&TkCT|jMzX%F9983Qx@sVBpkXT=W}J_TdDo4?s!NT}9G z&+AIY3dwC9^*LvH*GRu5B(Pa5TMEL6eSNZ36MMX} zGQD)$Fq;KaRvYDg*!3in@Q+@E=n738hzOT|l=p{b{pf4Z{FjH-WZmo*om1j>oRb&* zyxlLmtxLUPTi$|jAq?+uQ*^(7$TWh(*x)lY%A#q8t}#sr8>IMFLsfmdO5M;7%m+dhQlN+t#m{n%y}P&%YbA4wMJ%k-zuuj zr9Q3xa{bp+PR5@aNXIJ6~#7|69gC? zHy??KQ|^x-JaO6%g<$_RDbU=L@i!2;g`0;y+s!lnU;Ms7vXA*~)x%HiXx?CqA-=K@ z7?IZNug{$a`HJ8Lv}+KJaCNXOl_mry*d4*7cke|>G@`dc3DLhxe{p`Al=F-fUJI6N ziVR(w|A<@VjGz%~qRx-{J8c!89v>iO`(Ls~@z2#hkAT2U}?2p-DpuYh8o z0)t_6-md&#O|NIs0mJuTz+j@8Ocvc&gl5Ega_gW|M0q33po*g?Wcozhyo+HOGm=lm z@$KxiEX+GcEG2X7d?V>SM@lgi+C%-NRd!g+_~);&?Bf!h4bb&c%5@g(03=cfm-4_5 ztgf|JKM3}#Tq5Hj(nA(1=&s+C@t5=YTRBb;7QYdsx@Vm_`IRC}MrR*A@6Y_Uxp73h z3bsEa>sX=_TWHdL3s7KEm1~uZ*XJRXJB|I;MBuXcXDwuE1bSS!M?Dl1VAyhCh`}7^ zm9fLF{$0kmXEY`~&ui0_oM~0kq?OaNYj_6%_fFP1HWvh!OueAaK(D(Nd>CM$~MJLfF%oBw}6iSC%Bwf#{Z12+xwjHAqla5B0eGSH2}&`KtsW%+lkv z#L%VN??NvCnI7sR#Uj_GvLPfk(pJgows#Ai(nGfINIFOVw!0M{vCI~0C#LdqeuQW~a;F`c?l$Ja<5*>-$KM!WZAea2JlSU1<|I9Ff;@*rgiS+4PBYF+ zF9wM3na_&#+2b-86Z&z_J$#8DBY2;#zJPb(*b5KDh@MZ)p;`ADyf)RY0XcO@cz>Ed z=x<<9%6AjUhlK*qC&*WM?o0!(&|4QiFc>hOGPR5&B}z6K%TTL-11u7p7N0;Cq3(FL zmm~L5TcTqi^ac(^`a80CTn0p1I-;eFlcVsJ9V9HSMi5K+mTT;_E>p0GbzR-xmvBup zDl)z^vFy??UJ^5YF5>=SX8)m)3;B^iUqQ23f&pK!v6PD45!jwDrD_wNu%N`yjP6+8 zK27ZYDP7lRh7)Yv0aX9?_VNyLAo}!n9Mb$^Wnp83g`4iUdZJ%Gk`Q-tda5){S^NmT$~IGixsnYpuXcT zb9O+M%tO#6v@PyosVtsF3V@T*EalT_Y9kC@xGgbV9m^=b66wEpx5}FH?aREKI)qAc zx{O&g#giFuL$do_0~Z0TP?pUNDcNSBBv%chBYMT+Kp>7kQ}t$(5umNtLbK!VM{Ce; z#};1~bBw=IHxU#>#bZXMGRzHkcaUS*1#bi1Z@%1}eozbDTC{*>^%U0e+xr8H|IDr< zVS61Rg%orGom~7m2cldg%Q^H79Og;&w-@*XjUMAM9t{7b>E0Wq2B{`veB3eVQ?BiW zzX1%XZkBOG4H#Bum#_8hZ+BUiK65%#HVcGt95PT@6>qceF0VWWWo~C8_GyBCA205( zhiE)1nj9CN-bor-nYRf3?QywdOvJS_T*1-r-L08~QfT378N8&<=xF}1Yr;9Ohw+B{ zw7Jv`cf$2MZQKz=3zyFbDRizrM4!bFkkaTT?{E%~9-Uwu$eV;?0rFpw3gMS30dfwdDd)mxLr{o^yfEBQ3#$2rHzh zr&~bO(n@{q1H^#l7n=(SmWcuusdo+V@)f{v`j4xlTJ+|1+1&g+mTvXa{1D*z9-~qo zv+KaRJ=8jE$L@Bg{jZz_K$_I~2st{0lsWp9l*hZ%4|ZJ*uoaAYum777Bm+edBY~qk zS-cpDCvy!z(J?(9nRErLBSCpIm+C)eE@jl>M(kE(nT(`9taoM}2?cHBd4D3f|k>I6F671~}UrfE~n#CQ2R+?QO&QlIp@hf8fV^32?u zNFng}j{8icN}%HU08$=Ps#zK08~g?f?|=!)?YA{wSp&>*2FjbImz5--MnuBMxpt*c zBc;O3**|d_HxuCD6@E(_u1^fz9|8!{bvW&(!k$@`G z=+GCk!|prdPx{MQ-kT$#NClP0H=#UN@OJXj2qw@7LXWrWK?f!$o-^b`9LX|0>3ByK z9F=uDJ?YoR#f*W#S>O=)14aCjBM*KXZz8ip$-ZwQvil$_zd)8hUw?jCbT~cHg>(pg@^GF?xUAt)ay0Bc zUBQ)*#qNo~8|gEF)|~gE?81*XD_gwDA7%PkRnlBS`A^)h1`HHjgz#vx5YQ^33A!L- zm1dl2t+P#v^$2eoutF&YN*@MxT-s9%q6V1|2bHocS=(WdVp5h4#?%Yc`-l4kVzBQ^ zLq4v)?D(rv(_iZhZ&-5oO*82&NVyKnx>t8+lLlAnH1A_(`vvtIwl0ww84m$i4H)yD ztlTveVtiKy>oO#3ug!J`^cXy_T1Wy+a$De1fEV1@#?WmCdVjXR9DROiYDAh)viDA< zRYW4 zj_|1ItFJuxu6!O_Q{`fZ6hUq@XZyTe_E2_};?HuIF;n2h$fRjP7^xx)Xek7dSriy~ zY3raB!;a+RO(sL+^~$<~hK!N>B#DLx^763+Tm&tUOXoQx^mvGV_`4%fX^``|jN4uc z0QgSBRu%w{^>K7>^%Pu*M)6TJYz0nU<*CQgFdRV)P|72kU)BaxWBWnx9W;>j_Ez=x z)SJNYeKrDG4fB@D=+@4eaEoVnQ+Z-&VL*|b#WYT8F;AqK}#dK(CuQG zrdwrcke_85hij-OIh~Fd2T3UrIygZ)jUbh#JJyHfTV^dxaG4M^*St?o5=0;h2Z!a$ z4afhj3YTKga7pWm09r0rVD;WJN*D}#Hj8RZF|zc0SiRiidiZ|g?bHiJF9`kWo2r`o z3il?^S+0A(zU=)}Fcl9n4&QBCZx(3iqInfVroVyL8=|V^&K(1wm@&h9ObR)wZ2r8Y%GhPK}_y|PJH82`|*M}Y<&|#ZTl*7vucehl>= zvBK$0WmKA(eX-es9$&Jr54Gn81Vr?Si59sj&=rtqwtC4$g7|7Hok{GS9*+9prFLuFMV~qE_qkdWkOlYXaM zG<@HVv~!eD_UnDpfyhx0g9gwEXn$2DCAQ6K-yEIAPvv&BF!a3fY`lMB!>ck`C~|J5 ztlHRNByZ!1zHKl1pEVQH#jJ7VQdT+Jd~`zJ8+)E%OJ9(_)FjPGpAcDP+__<;^+H!W z_@d3CG@i`{of)nGiUp)-pNzAjasBTf?TJuBbA^8J;_#13^b6?Z&9WV3c!n^0U07&| zEiZ}D_b`z3T20bR3O)?a3T zVYyJ}E8XjlJ5VRz1Kf0J5M+Q_+135aHGQq9R1T>66~o>V3_(p}ioD8)6z63v;y+8_ zx;=qA=jxP3gBYMTwW`b+@o=WQy-)km7~(D&DAM)#{9wQ6Q0-pnAuq{A& zgSXaDtpAW4w?#80A=&ti3(w=t)y`D9pWvcJYuAVkHV;JNr>1u7?nofvhRUIu({+-N zG?(^9X_%ZpkqE$JC6<@wCy!@7y~;T^U3*+3 zGUka?QDi90muuI)WUKYetVo^twVEPOr^d~-`QWVwRu#z0S8z3l1*l^1(LBs=;L&)< z1A|YQhH(aCo#;F~w3H-yMWyMw#!KyBmd9t{q!JqkpQFh^z3)ea_pvxGS0w3b&(!@% zDnbr-Q}U4;;t)dD@YIzg2QS1YpM+)$PkuZ}f}-ZwCRM_*%$CsmC*&KI-N5n@-Kcg> zY^C6hOx@p;yU%m1?!&Snmx37L_EaH;!56^S$P5~vM*3Slk=762)D=gPbDqY(NH`n657p2%8x*>Ggmue_AIuwa7dJ2lEWzO?OI)z_f?qKg9yk?; zcdSV4gtzL^P~K{XyKFa+R|(|dIdg}(VV~50+6}wkT~Z1;BQSLgL(>wgd0RC?MxE4Z z-8^a-(N zMz;OXebjr+bOqkBD~ZnB1yqJe;?=m0Z$0j!AHH@O9~ML#$bu3*RMkwIqpk@*8PB<- zsgW9n44nS@qBiy!{>=vm(pXBfc{evVkRQ3sX4~OA;04wNIn7_8xqN%~a-w5CuO~O- zrGyt{ZO)%yYG3i`kDZ(TcA&ogwJZ-0L@g+m)UxRCX4hZe2wcrJZ7zMIyzr#8oU6n{ z_LYdy-zSQ7mCTVF(vi4uug8n1%S=|gjjs-Zb?pmotW}lzeyi=)1{uX8{gScr!%GU0 zV%VaX59YkL&B;Dn1hD{LjRtiAIL1Ol1DR{D$T@V^l38R@A02dcFR1;1xk0N#)*-Fo z*`EGOrG&{KNRVf6h!WukP)=aw?zcPWAh$H5w2DBhun}?meYr4OuH(WE@tFwQbGS!( z&$>Q*pm|FIz5(Uy9sYM2q`PiZLyqjwgu=o9okuMqRX&T1&Txp+?tp(hU^q{P_Kt4(i-F<@*6`KXT>LX((wM z^+Fr93etEzId+xDnDO?$`MG&E&rF=-m?;B1jovnts~GWtx9cbH0a8t9>56MaYAPg( z2LAYEZTT)`L&eEIOzZyXdTwa4FI))Eo|%%b^D=FRpF%X*7*D5gU7jx+oj1%M|FD$0 zaln#(K)uJzbjLpPL0HbMMB;-x>RsB0m{*cUAwUCt*I&geVtS@QF zZG(4@N2d;~4?>_82 ziuYVpWZ8%7@ySKgifdv;jMVv@)Kt!RH(Cl05qUdgfZQB@3Nz?M#IRCv44o^yCWcVAT%W?MtFU#OTb)l-r z_vfBcgq2rY5}5U8kiPR;&+puQj2OiSiJl7hiHmkV&@s%>UfKNUpjj84nZ$hCqw2=c z>wL{yxsvqM!mq^+Y`3=`7#^^72i#@Uap{mMDb(q>p}E&_Fb(5x_BJ(0&nRMKHvn2| zOcY!1m0II@s8oy|8WuM$BpE}!i+X~weJOde$PC-l{%+T?9Yafa%mL)jP7uBL(T;~D zZ?U70X~xL39EnK=PRbJq&|4uS*$=|!Z7(CS9{iG1 z?sEjSu0O{yCl*o*Jh#3DeHRv$5cLkD+TVpBHXb~~K(Ccv)8uwRfS-XoqpB_pJii_w zaD({VprPmQQE>jZT78*17Q?!`t|fImtApwKrK1sAe@_l(R@fF~-5h%gih#xxRGP%M z^IKy+>mFq0(O#&6UXPGrl`{C`)4SeoDr>>7gUR8FH@^hn?3>CG=2pl1=Ox7#57AUw zzPMgb@Z-Fmdeq=jw&W>4*0w($my zY@pLb<)+}9>VPT>UohhC{DE|^Nb0O-ur*=$f!`E|NO}N?ujv^3=ab>xO@+BqJ{Irg zbCH)8^>XG8Z22^*z$P9(1W#io!Qr<+VLR89@X{Zp$02SfS~j*uBh$Yu?gW`&yU*kv z85V0gh_hr!C31mRaW+G4Nb~6ncP3hsid|v>ccKa3L|DBj%Xoe^IAO+Ru6>- zesbX)#piG@OS;f0psY$1XuIX(F>L{9mbqH(WvL)(LX7)bM} z9rb6${Hy`n<&*EZ`u&W*8!PP13@kL5=U0O{ZmiswXX_{$k9ck}LB+R9KH>mrx9pfMq!W~zv&E#VVff%4xa~J^&&q5UHo#e!A4z`S$Yqu=KMn@C>60Kt! z$hRlrkV|^Ik7{x8sg<5Bs(cTz7Hq|+;*n69MB_rpGB`6<1DH|}ppqRr44cG@oUH*| zdPX`U?}Rfe2sgk^Cj_5$|C!rscIH8048RLKs#vI>{illr6K3le%oU~(U1Y|^&9Y2i zioPk=erZqo2-5yRPS7qjrd!e%kgX$}EUoo)c=X(}_%hAMh)-I=xWr%p)DM@|h50}Q z0H((RnXag)V zE)C@&Tta+P1sgfOE>_5^Yn7d}RrgFPApKn{pY52h; z9@kZ8QmMI;3a)Lt0_by%0|9NR(X*Z|Tk5U=9#~U__vJ1Fm&0sVi77>1Ugb$H-L4Jy z1R<^Q_uhOfTy5-X3Hf-rT+sc`7cfK8ny)}B!|@}Sji-&}?lzPy5mBy`uv)!C>Kk>C zR#7A9O(uiLAP;zpY|w|mY>H-d5lquF*>{PldCT)u&Yf|N68@3xQh31|9bx*(2t~k+ z$zI&W?{+$Nhs!z!*pfQFXXI-nci9|0)Oh3T=-Bg`+CVmXlV}u|G9u0S2pBs8GA8sZ zP$F(0$$?yuQ+Ibf+Vz&xH3mK+m7|V|O&x6az~0$LJerNiS4$8@rwvMT8TU}{&FDh; z-56uAts5YVyHbx?Nx15iL%ou^n--(!w%pHBOn&jizBajA`MEL^`; zn!8kTLU*1L*rGh@1tKwnUXSiQB*@~rnp>&D!Io|tdoDFGH^bqXmdSB>DCz+{hp@fohlmI!I62O`#C>- z>fg;LzwPPI&L3Z>=Zo%hvhh~_eb*Ezq=Ko0cV}zLB$ndb245a;j^@@(-HPifb$0cJ zc^RbW5eDqCPz!(NCypc7dnLt-x4P@hTT$^-UhZ=)6Al4{;G=cmeO&Ng;`=H7e4 z={YKZ6;*DdyE4IMCTg3Sbq`{Mvl@fIsSk1_mHBS8N1Y1n6i}NN9;s^a%YRUJQ40*T zy25EyUK`JAs>ZoK!PVIZ85{j4YGP|_`NamGys?KsvV0MVcUZ&3&8L?_g)6wG=_v%Y z)+@yEBz?CXI|4JhCY*Py6B8pbXe{wf^H2Dey4L(MP@pGqG@)I2ACbS2+31zMo2E$( z_w%?(o~|(xzF0c|e<7P?V@2sXhgYVl%-Wh`j#7PvmT2)94U>fAe&)*!+G4Qd19zD5 z`$G8ihMARKN#4|2Is7XlTSVdD)*`!X2V?jN38{>5Sgk*bP%VZi1Z8nZba_5$#bA{S z)&x;RCTl$zuo<_Hd+{8TZcaV~j+7RQ+OJn`&tD+)3C)dtEaiPjbiW>WDP_@K4%_R7 z8M0^hC|A=lO=B1g+-SPHU#5CqORjR!9iQ@TS-&K9m&j+z z5qF|#k4}DYT9Mjl$QhOW1=4%jWBI|4ch}+RW5Dg6IAzol+sp^ClemKa6xi0C>AaaA;qye<}(z;K;9tzbj%?ui7DnJeZe6~ zIF(~1Cjw--?dvq~PwX*Cgt17w%Ufx2pqtvE9@)VA-PE-SDShJmxx2d`4mF(olEL*Q zXOHj~YLkzDJnU&)nTeu&mW%}`J5ADYnXX-5<2v(Af$Oe!l@?1t9YYA3y!4o1M|uf@ zZ}K{-Ju;M#&}JV$NR?4*_9}Ga2!H>AbC*(KM3Ga_O?6>gg&m$o#y)>-2?ha9e6XHNZ|TCucJ=PY2O`BdXn zR<=MqRJvW2OvsT{AY?rAxoXb2F&#nZRW`U%SQ1o!)ivYFo%n2gRvMe5o|Jv$^A)WA z5hPQ40b0j;mx10?Dgi!wB!pqSuXDs6=Vq$ep3)iAq_v!QyiuF!JVn&i0|=i@PiF5p zRaunYTvxHB4$h-KX@(MEV7-^l(n2MO($K5&Y9fPMlX+12BK;wNod<0D+@eJ$gel}J ziqf(I_17N5p1QGL-tQC9>zUVT?y)A>j`fb&AM6lz%$FWrRwR8(<;t%L{HOVW4zW;1 zRg6y;ysClRP8^wx*eHCiAHMQXa=TXYC}VH>nfJ#s{_%fy4y#C!mUJON zU?RaZmo_5UONTh9Mcl3)ZIx|D=KD}mNAF+2G5eNZZht>2n@EkPTe_Q==QR!;?3ji zv(vXJW4T(7!`Y6t+<WkH>Uo%xonuMpm*mhpUY&kE?$v>@ zwhHs?v*zXT9s0r2JyfO~#hDJTykfog&1P}24#%(JzBF%qm$~OQDR>l268Z`W%4dEs zS(X;pGuyHa+i6w}#HDb}PQiLPyh z(j^O5dJ$bX5BFx$_mG%`og%>;7xON*q8YhFkUPU+Ae?*AsZeqE^I zW%1Ixl>x-^r1&+lD37)Y4RC}ezqdM%x(0J_$yr3OTujDmF8MXe?mIEKM}^U7PX%9b zc0xs&v>kOzp{>VI(qK$|<(rMm*?wLNLXi${tnbbSnwPJgG^m#qc&sxY&sE(7azU#U z;>Y__oVPi`e|yS$?`(U07PBVdKeqaomL$^`AHVWeMqz#o7jyPFOYZC*m3AH96_4dE z`s&TTlRcM@V?8BFOG;3}td&6~h(h?Cuzyo*?-3{7C~WqTRtW@lx?!zk-^;OEqkHFi zZL54`Te-63aOCMYKHg@SKA zO0SY0k~IN?Zf=a72qN{F7E`fA=ffKmyMR9zZG!wyCB*y6lw%2lY|dzYX5&60L0-^Q zwjx&CG59)==`d5XsH;YR;`yAbv&hZ}kj+nJn4S6t;d)8(7W#E!tV(2*pjLT@GkV#g z`&G3;j&pSxrBT=Id-E9?4MM`6Zlv@BU$A5y*e}4Mw`R2cy8F3-?anHn<(-uv*B9ya zMJpx8ZEMz^@&N!acy)M^^4-e&65*q)va;{^N=Bt?2a?QsgRZ(5bABucZi3O*cL z&d6mD4WA_f!4$%k3duI2q20b zA4u@H*8xu5XEdPaupBQ~L~+LXZJ*ETk#M%n2R!Y4xpBl?xUy4x@z*$9kLTzJRLJ^X z(3}kFdX{9=1r!U;P9Dvg5dfp|M##OTFi z(bQRjX_chjnsoGgIj$q;iqw{%Nv4?XVpSq8;-CMpo=id@cMkr!n|S7+Fs9!?*suuk z(Z@$q)<|8mFNBxr`{>jgpdWzQh!s%q5S@fXWmM$TO%uxkGc5rglTc0C1d0#58Siho zBTWlao&sx#<*jm;i&sWo&abY_Quz5P@`b9FtOg(R4`Pz)RZGhMdYRDo$|eK-HS0i% zZus33y6+<@jcVa$zkM;el0K;|e=H+(C_e(W7x4@nGosj{Ubx=5thyJ-P}a7|N7#LN zwRSm%IGe#P&ui95@6$;U_{y=d9qQsqhQZm?_y^}WW=TOaVmh4}S^jMEN?vFRiL% z0whx>(UMLQ2aKVi+x@v4bAw1vyj{`R+Iww^4>_?VaZWv)*e5u$F&X^uE;lGiRXAlF z!k7c)%SrHzQLtvZ-h|+mJKqI>3Hu^UVi!Bs5z2`mqvA72?Ik|%OYG6OHR z=JePDjEl7@1{2jq5^2#`RnTT%5at1Dq>{_@lEc{f%aMyqL@#gWz__^CKX>{QVQi4#)e(Yen^B(tx zfypn59Z8ybZpiBj*2<>j=29cC5G=dUW!sSJclqU~Ks!HA+$6*@s)3>X0wB&eKJzMR zKmq&vD~Pc>5 z5v_KpMYmVhoJ`sJsHqfsOW_oa$YqQ;QCD7VN;sK37Og~d+Z_+G&CE&rz@u5(I~Ebb zWW~F({1$F{$?MstcTr8pfi|h((r9{ZwLp7L4{^RZEo`S|ZZt|Q!RconPF2mFqRQ#8 zR93p)^u>jmu)xX7F3{ThR07J{bBzv-m3m$5+!z%Wu)GgKUgKq1d@Wf_Wn1*EC{~8F zlFt7ExkO~qOTg-6VG8KXE`rVE$H~=2^+#lBCR?W2O}HGk-$sdlg~Q_GYg}>Ms{A=9MUj?kN-R%cctJ{~pqpJS0?d!Nw82 zcTBIqFOdym#J3H+LdkE*L8-yI4}rb)nx+8xl@OU^zSrKyIo!^2?jv%!dg2L{w^^-H8FN| z!vAxSv6Z)?2P}t8xd||ENeJ%Y4=60HhtF=5EI#<*cinspt-Rm{pX_Cc^&NC|`pFg& z38e$%RMWV7cD3bo>gE5UN?OAR{AQDUx<_Bh9%m`FbQQ*Omq67Z!`0si{rB~qdYmg>K{=+^*W&9}F^yIT-jf!FF=xn)_ zWXz7aySt)CT@}saS(*DdyUc|t8*tTekEX0z7-BdSZ#NyBUlDeMH`Rq(%dh36neUiGB&vR5? zwy_KgvdF1zyR(D{H#{jSmVzeq$Cj;#)tT19tKGImOWZQ83@X9jBk+2sUmKa>9+x$w z63e^wXbHf2N)JQPgV^V_jnU2h>TFCgo5ozAoZ51ATQGKPux#<7nOJ%U>T!qXrI&4e z6HqZ7vUH_@p4LeuFpdz88!&YYpSqj3*1l@q+f-U1)<)Hd+@NQ8pDz@v%x0pO01`U= zM88va%`KBzaZRvG_S$q=V|LKk=1MiE*9LVwf-E06MHH8y~^3A!|$45<<8m&J<2p(x+M+&G%t-k)55`HXFiPP@>wn ztdgL~t&S{)L3%=u*Eg7_WJn%Uzf!{5Z!t_{Eg8KDqiu zh-)Ap_qaT>VySF|^=to9KSiD`R$IBd_-HuW3yd&Trqn^|QEhw(rT?soV^p zci8cM9*|xm9(uc(_y@RydUQ$(+j$7z7z6_v$xbWjLIs#U4MOhMuVlvrBVFxF5nHAj zIvFoA{%YqSB+v8(_0T3Z1F5s)1&Y+oK0ERR7KM6fukAbyrIG^++~OS~*XWM&ARM)l{#9``yH9t!M!`y!+lnD2OpFEmh42v)#}ZP0dtkup1>7o#e!Byt_eUcTJ{87!j-ICoD@ zj(vST9R}|nKiVT~M)J}O1He{PUKy834&DU%`LT=kEq@wg_kWl2y%ThQ=7HtNFnzC3 zfPzBPv8hswrEo9{Hy{Tepm<322@zx&gRS^k=12q_Bb4NlV=4U;3AT#{>rqeH<}ON2 zviXN1-wtEIesz^nAZ9jZKAj#jyov)O>+kVgqqrVm=7~kz;bsmZGxJklVJF#iG-X== zZb&;gwc?QWe$-GO&c?t0suJ6EQm{j2iwpA+4_zztF{&sIcmaohP91H{H5)5mstg>~ zBthU>#Kn$Ly+4+U3HW5oP}$3v47PySPjZw%Id##UwSl7W`KjX`yb}G(P_^|j{MU|3 ztn=0^fQx?m5bZYPvW*bbXgG#%y{edoHIlowN98<|3)Q2#Oa&P;$i$zb0nN$(IAbi7 zwY@TbrbGq#!N}oI3$V2ug#1U@R3bow$ zUeLI@wzr2{ikIf;T)XWvEt$$-`*%x;V80Q$f?Ir*qTw=XBG%3kFoi8GoM&nNS9DtR zevsmR$eN{BPJ;OK_*$uC)XL_{;^Rkj=g3zb$%mgd1JL!CEhkNFNEsdqrun7rzuKAg z{`bECgpeV4z7*e|fgG;L!Bpq#V+TCQHD=N`d1PvR5Ly2t=k64Yf=<RLf45 z^zuFVn%$!XW4y$P5(pOM+tXQI6)Wpuej7BNl|Ec^Q~+_mCg4KdG*SvxS*-;B*;H3I zCxE9c-()3Q66zl$@i;4vQEN*rB%`vjT~>`fc<#FNUDnh0Iy|9QX1j8{)3#pBb)CNJ z#Aw)NtWV(Ld_dHfLhV?MmS?m>i5H~@Qq{PohEM)!)@Zn0x||mw9VDD+NqCX>XJ}NJ zGH@edFyr#Prd?9n99HM;f41a)kU~n)wofOIYsIm@DXu6O#`J1F>jw%%;7%C?2fwaW zYkFU)fS(ogPis|!M7qTD_y*2vW;iE+^f?d3hmED=2ZJ-h(a93LZR4T~z_DG+=8gVM zjIvf%g5HJ%;JUc28@W2-DJy1kXkAWQw+T z{PvX86_{exW8{tnHj{3S#iFk8mOpit!6vK0i66Qs<;*a=OuAlh zz3N~2%X6m}EHX+L3G*hifTmenXbO zAsoMav6;^}kLzBS2ORgmM5#1mTpK3FK1lJhRH!pmu)bkmvl(3ibP&@Bo?hZjs%q)si6MM@9ngERRK3cUJnZ4JZSbAm}>v0OY9A~>qr}D}}jpSNl z2?j>7-aE%IrwY}wmpfeM1+#Jz+na-DlwSxTEYN*5JE@#wcUy^y7qLAq|FZDUFcjEK zyzgRjm6vsXW3rE0uhnril=-i!Twz_zNushA<+7f(o{!>*Q;zp+m(MTL6;X~Zl%gNt zoCJTvN=9Y?nd|tr+br$Wi=SoKG*sIIlzUvUR7<_!S;;&{A(uyg2KBe*IRzu4BLgfW za7J0-SM7e=49mZ7U_*)5HMk}6I4}0^ZW~XuFx(UC-C^65!|< zX?WL~0=;W_a(RbwhM0>_DTdK1LPG&j5mqsh4y~+sS)L#O_Uas%)v^~ib69d-sv?;+ zLPsY%x2vBwk01N3?Ot?~u`TvdY>v8nXfXcuM=~@K_Qqvb@2-JzWpXceRy9;h(PwXy7RqV-V4LeoOfD2tV1h z@b1`Yf+9&Si_di=cWY#V&f-aw;K}8dkf{DHhGm{&OnzHO=N{Yq{Vz38nFpc_rz8B< z*urDBuBx3~WBl)~7d#6w&+~Tsuu<;~8n7>a_>;nMIvKB6Q(1-lBtus4TiJUC+2QQF z{@pdL1&Ek54-r)RsMu~M?n!zSdc^dNSfEPRe*d~F8m0O%c?miE`}*$TNV)I8^Mli1 z|Kln~kUun+!WYy(2$chO`bWpKsxGbs@pq;q0pIr=0y9pizT*l=Tp#X}7!Y=wC6oR6 z5$_fo0>FgG9TwyLbag}QQEP{$G!(WXsQ@rpdg*Oi^t_#Wp9{^xo*FHNh!kU15YiC3 zDbcVZSAi#O%zLmGMh4QhTzs_ZV#I{_)@-FG^SlAWFQh?=Q{PMb<2F(`j_faaJjk?3 zN!fu8ndgMOy!IREQ*-`s*L0_kbffN-q5aZIB}e(SN4u%#PyG~1CO@$OfAjsM?nYp+ z=c{b5Z|nwmh_xGwQ$lX#_(9Lz(0jk8KA3<+@P9vs9}Ly0?Vsv4`Q_n;?v+&kP!g9lE2Ns zou=>9r6qFDu3uG%D;jE70H~Sq402v@rvUMA2wK3Nyuzi?#KwKesSJ zw70ka><|C@pw>1JLXx+?`w*Trhh|APqv;|?m;W$5R~EXm+CdY?A?wX{9X!N`7yzLkxls+cZLdC zW&TSnRy#>kn>$Kj+7PmDmO@jM=lq1mrbT_rr9aWCiw^}Qz~i9U zuOO#hit&)vW422X+|rujFby_V&Gf-q`zLP&JhjCrH9wHY@=P@p#PQ1(y_xLhk0A)> ze4HMUXt2A&R*`y8v+$pX;=|!wBe7_d=cAqahYoh*_kuJOQ_pCjRr-DBZ!}x;9W{u&*bw-ajIw)Qj(h~y^`$#6zl>CJ@+NGXjxuIZhT7NS5rXsUi{UC|DbT8ZFyiBibL zJgva3-QOM!9ND@d_I^pCQmcCXQH!g_|DB{Oi#wCA5xHC^`|ay!4FI;(l_f2923-ES zB4bc|D>9Z8*PohrjcYX%)Q2#C*`$gG)nVA6mjlsdlW|0Yln~ zJ`M&I-&;daYco3adJD|2-@p%q;S}2+j@l&cr!DF(Y+WHOc6~BtnaW7?Mu!w(_S-6* z26%SHgnGG=51xK|R6&R}3$@ti8&r$D@U;QLrcx3WIH51P3ZJP|$_v@DeP;va zz5zjFf*WojCKcA*T7SQkj3xQ~+~b{H=K&ob#oa}5nELAfL?3WkVIDWl&a9-h_&WJi zt1W{zNcxFnU|_^Fhba=41bYvqv=Y{r%a3!6S1DOXjj4rP?my{Qui!LoPHd!r8^1jMRclmg$Nxp8MShqde>$mf zTxIDYPwc=X5@jN5{6w>K;`bze+bM~9A#PyD`%od`a0BJ z76|JtkZM{0ey{oHi_$w3R*{csyf!M~W1f6=3=!5_;XwPP`rcI;VDn`;!OuxiYMf<&>11vkpkww?jO6fF-PSmL#($;PagS_-9qV9C;N{jDJe!PK=e< zGFRK*Q;o8VK&QG1I-X>CqDS&}lx*XIsZjp-DW|{xb(#bKp(v)(BBshIP4C<*ZvUv4cZjx96_7k!$p~P<-Ws+Oba8VN z?p&jN{BzIg4F073mpaw`?(jWV%j6aQfB^04vB(y*diCuIemO(K>yXw4ZQ~`sX3Rw0 zBgaLh*@Za2oV<7>o1VddWO!)Y>x|z~qNH7qXp$_{ke?zkH867Y0g`noKEL{dwv!w$ z#D>GQW@v0Yjm@Z~KC7$gU?iTtvK5VAMS8W(hfd|e$W-XPln z-8GE@!IB)&H7!4O?~KvDN&nA(o)&ag`s@_#F}|I{=f>L={}1X>yQCf0A6a9u*}v@8Ji{laTlZP$m7k zpq4$mXM+6sGZrBo!Ll6@M%WG7YNsgrr_2RezEhZ|nhgc)w@aML0b=Gz-u}^i{GnWj z8vh#Ig!=fTdj_-gAZRk8uFI^7XQF4wLQ`@$vQx9#_eb&v$j{c>tLmp61sR@OFqbU- zIof?2%eDWziyhhH01C_zW;U#e*}`jCt%As@+~<~2oP@W*u!!8TZh(%0&PeRfu^W>Y zT|k5aCr{OBs!8dcw3r{yT$)RH71~?zVjr@DmP;lPoj;3J?BS4LMNznce!}SRdJxq1 zQEprTxXsQTWsMT_GSD`0uI1s2&-(g6hK6&xj=yAv_H%(umcA8av@mz4^x0z(qgKx0 zH$U5**YRpsX4J4g@Iguy@e_oNeuGVrdekd|aCb0uxK31#b!JiJz|L08C*++nd6@ zK{=^cr8S>C)8mL_lH6s0Lof}=RIt5t(M{iFPE7-7=90l>*&zQ&79$4(AzRSz?6(Bt zwdIJ&l9!}gnBO0mCe{+Tp{U2arIQt3-(|{cl*-X;6eoiz`G^)kkCQCk^q^eQB7Ci${RbQ(J_~swkg(aosC(Il^BA10U-!+xv5{+ir zMlVAF@|qaqvEhqRkStr83@dV-*$J`orC1g3;M`WDIrA$LW9~y4oR_l+ae4As(t5U1dZXL%!RA`vohw9czX_nSLON+tB2TeU~O}k`7}S33T9bWAv-{@kYLQD5Bip ztvV^u4!1$eN+R7E42>0LDt_O0G#(!IT?l1ZeM$S_RL&SngM|(0GGR->tZ?d`rLolB zrH8w)kl);=do~j@*+0nINT}~B1r>wzXHaXYP?r@^1iL2;TlAA5J}BkQr7O61Dsq^t z=7pT%Z527(H9VC|zLy43m6HRWOWF#JhxW*lt2W1W8nbVf zSRba4)HwKI?^hYMKpk3o(HM9DZF_rd)GQEo;1E@qle7MB1{vc$CwW0^<5#WF5zU-c zG&Zd~_Qb1^0!7?+2>(qVc9~T0J>ckuUj^@CSS8Zw`NJf_7PE)zf$4sMij))6^ELh5%4|}=1z3^OFBL}6Zku*!J%+k6>Dd}^Pl9$NdWj+8j_w5F_RkUq{ zkuRB7`?)CkuMt#HKSN$$3f!p)Ry&na_^79&AkLv6G%Hn@o!I${C8hd7@l~*1DH|w( zh{0Q>@^9e{wYeiS1W0<$DT-3~;Hbb$tvvQ5y*yd}B-)%`jUy;FrqYaC0-{9oW3XNq zjV3)_2HJN7ko6;?IMa8H)?XBrh1a-UD=Uv|E%zGl=*bx- z{DQe8&}|BpKVmFRK*M!@w44eehBGj`>)d$L)bdTl-D z@EeN*YokL7aK0olw4&)te$Z;emM!QIZ!`n~1^wKOak}rLLObsjr`Zz5leYT-_t8A%yV@`bCu8s9%jh3L8x_PKybt%^?o1`xy&HXT%y%h8 zgO{So4dZ;2yoShb*0`W}UGd`3Il=SoL{)DtVlep5SI5L`Q(6a2l6ySEAfz0pC zKPxIXIF1x1WE8jdGal|vAL+`L7EEED&_#FEcV7d{Qi#evB!koM{a4H}z|j2XHyUZ55(0Vqx&GsDcsm3y{Y9P9_~1S*n%q z!0qo$w(CWGCeJ~U*{tdv0n&LU1H?GwE}fDWo*1!CEi%mFLYpXT!T#M!DJIM1U%|!l zhr~;i_d9PR2^(%7f(`?&T3GG)>g&~4%MK_TIz^jT>bY{&4Wu?}obQlA`kxqz+qL#A zlr8kM`b$K$F#=Y_gjJ4GU%~}MMDE*@o0S2msOY_Po$uV^Y{-c~@f2HWr!P0=AXS4vJHfJiz`P^E-v4jvm0j~*e z7FnOaB<-2->#Kt!p~x&)rEj<6iI(}=!;>EkD)5%QrN^`y{n=5n0J4Lqn+B9D?~imx z;H(=G0-suSP;#7D_<)FO=vsA#SBb=~n80Y>3Njk(k~u%TBSWJ~U3a^d`ek(40ZQE)yi_?d4bzXX~wOgzv&xdmOM3s$`uQSNQj|Bh$Y z*8{q*C$MPFI+!r=2=em9okOhZ@ct{1JtlUnAt;`EcTg_4j_3sH`x3%<2X=s?;gm?; zT&zsR*U0WYf0b_mI&+omA!EXAaR|qUS;0e;F%Yg=V*7d}N|lP8{cVc0x*c&CEi?Or z9aP=+Z~Y~T-1Up8eE2J9^5$cs4eA}}zlw5BZBuEETfz&YTR`=h0R87oJeGO4mx{bJ z%a^6TEkiGWR$Q;`iDjrm4x+U%seqMOD`*s&71CStlH-90q}w^~dDG+w$luOrbV8B( z24qqwy)eJY8gxqBm!fZ!vkiC$lT4z-zSZXDjIu(F7O-|nB}xVQ2N`3>8lE3;!Rwz4L$lgmrHUalbr^*6KQV-gjpV9Bv zZk9G{VB;;C_VbMADkQ9AX!m(xi>tQo%?$cbD@FmJ-VJ`C8CuTH~7L8bB!&hi8 z!3julrNjHH4J!lRE+!>Z9O=w?$HhlL@loRJ&zzP#}zsv5+zZ(*_K?iL5!T*|i2(!x)WQ_(~GlKDGmGk(H-OUayjb z^BV3$CiD56680j=1(Dg-;cav0H?V58<_%%NFMo5f)$rmXnW_pi&%@rYA$XtU9+aLa zJijf;_$0Ug^43$V>O43X1%gFg#jWbhs!@hZ@mk(nI&bUtKAUPq=pnO%>c}Iu_B!e| zYYGB+ohQB^APzG^Kb~?jmKudB#{VyaU&=sL9ClBZe zb#o#667#+>Wr@eMTZ!geEhPsT=D5UmtBw3DfR{s_j_wLME~zdwFnoPKP_$F0MFg=s z^o;{Ah>1%4x0);E>h0QrOO>r zvl`Bh4bq+CtIhm*Q}SdAQFiH*ph!9V=OJ zxs)-g`UaDyHa9wGQ&8}8X%vbdyP)vaMDW&$g{dB<9C%!#PxRVk<ZV4E9Qbzk}x2x%xz}nw{PsS>fOCrX*8vTh#CUu4ffv9lqs{66sU_e&r zdXst?KAGb^BWu75p@?|WqK*G6M1uyH@hka4C6_U|^%{WG+L)4mj!TjW+!UobF)y-6 z#IBz`;gvdN`BOIwcfVv>>TA)lg!7}}z?X3aPY5!vBRk&$w3og{0?o&}9KgLIU*lNL zUv9dvHwkQb#qpp?f%4StPC?3Bs-LAJ?;`41^f9=uYTo$H>b!kex zY^J|j4UPRUoe0aF>n&(wH#slJA64zf@ZLYJhx1+mh~Jx^67$x-+;R#%B|V43rT2#P zG~}~1g|5p_&PaJ8ZGlUJjvE3%mru8e+m`EV^_j2$k7<;Ln;GA^st|er;SI6 zZG`KF+iT?)7$J3GQzP_4IskD z>v`!$IK}FC%0`9{`o0Yah#nL*zDT^crnn@Luuwld<2I<*9MA4J_mnO!^>p`3Zf>Hb z@&_mB?2-HmE<9H-Z{us2K+rj>mIxN13{4ouKq|2mxxpq(sOMK)q7s7b{{dumW#)Wb zqfmxLnVYWKd;2&q*DN)FO7}h&Qz9j2qFK>3L8w6grTP{!tS-vY9Kat{E*5D)8Rl9t z7cJ7vRjDP~Rkk(_%H6TGE%#-DMTyUVNy|U0JS!ymyT_g-Nfr%zKeT_xU{l_5UBD?A zx(S<)bc4y)oH8=Gk{}rQsLi5FcmwLSAe}Ao`Q4Z0ntK<=4P!r>RfkBQu zdX@?9OCCYvYI3o_soIxgZa21o#HSXC%++H!Er98zypXmD0zvQF)vDDOdwvs1UhPt| zzTv#5R9lmn!cSvk_T@hCdy<`Fw^&F9lh{EH3D0&#cP&h21zImDd!%|)$;5!-x2TLD zdmLkLUXm-0T)!4}>R(Rx$JP7LM!wbNaL>^H)Jcq^LaOAM@!~AE!h!>4D)`0!V(HBrVe%CueKaA5K z#!s3LPMOAYJwiJ!b5=rzyXo9l`$r=2G8rAmFHhDUn#8Kawp@@tNoz)+VbaBNS8fbc z%p(HzIegODy_T^2bd}QC)ScQ}E$Z*<>SY&xW!%=dV;Fx7$oE>e5PTeoAFXC{r86*> zfYtjOl{xi5)$jg1w3T|7V5%>$yMafFu5onq1`>tMJl(UZ2LPY6S_Fj!sEstw`Hg>E zPcDA(vc!@umKPQ=2nr0CQAglxHZ_1}$K)jq(Rst&tELp9#D`QQamL7*#G6<9Y*A4l zS4pG9RZ>0O-}iU+vv|khbpx&pUxW032*(%dioQr(tW68wM+5OH$&A)ppt4!wy?{C!E>@Z4(uCiHV&liqs5k%XUx;b!-Jb?a zHE17Hd_OYo|2Q%__OS6unD`k=ZNVTxgqH^SGmF1)Y&hZW+Wo4!J|}o_i zPO2~9I+7mvRD#n>c#8h~6fXUVxTzdnm}^p&GlZ+5&-FF=@s!gu`)SY7w09}zB#=>I zmS6l-a^DVoGRhXwrNi&me{3+Z9@B4NWH!nLkRmr)m(;wr+O+Qv;EwY9;ZZs^riXjX z@tPFQ5n*r-CX5nrF(Rto`XehEvRrt_ z1t*jG`kVs$HtnD)N4mtCEG&-5{(kRb;{^qS^=rJOA|c8qD`oYd#H~UNmgmh|qBXeL^eVMx_O=iRo3fs3crF03_ZuYa&km0D za5DKLJJDlN#}vA)AJ^LnsA7PNdc3Z!8KG5A@pcwV; z!6Ty0afbTa0EQNI+uJWV=Tg|BSNw_I>)#qPRR;LoTkEu#gJjdHfXNKClTUyats^F> z_}KkYn{d5Vh18v4UZCD(DLpEp^YT1*l|h%q_*sE`k zKE5}NW_F5Rd1Bf@o3YFa*GoXqoKDo~ z3glQI&?^E;;*#>x^Iw%Zf(1*3J4YE|IB}h9s~15^g9*3!PEka+HT=#(Nvt-^7*6D{ z)MXBLU{rlaoaA2HIpaQ(pD~=Y9`hz7YFMO{jyPh-jN-AZ>Y6L=(W+It2P@048~}&{ z-|+C*mEcSU=S~^Otx0mn9k@R!AqyiS0VAB(28PX93ZlWfh}H3zyK;ERCQ)e=?}zs? z<{8sF{r{f3bp7u4yOfk*P0zO*$p=Nff}s%yzFC8{Zk8_AH#DZq+r;hsFV^!I z6~@sNs#UsM7tVWciDDuK?LK21^{d})J-44O-~d7Syn{!Jy0We?O>5J-$ETQY_JV^_Qo(|EtqY(L*--6!7VhZ%yD zpZmVN_PD_T*Er)R9^Zc(ZX7sYMsrJP*-FPE#yh;^lWH51Ul!d~7v>*abgS>eTW-BlFBd4^WApQ!^_FGsdXd~04 z-G01JGijhmrRDi#fwdw62Yr`H%U+KV;p?C9UXm%Q{>Y zsOP_?_e5Aa?jk=>=*QOv)Q@so4UB$Tnvn!^(r2DT#EK9p)2_q=`#qR?O|SBE_7v;$ z>C2M-g_4@-Caq6C@;&>o>KDGa*-2lBNrb5zpX6MGxLexze~*vyD$0s={a(Of*V~qv zsMNdll4o%h5%(mTPho#XD0DyhggO!=?t{^ZIf1LHkVa-!eW~*X)w|kn z+clRgp>b|O0MPy{tP)VYqLCPo-W9p9`U!`R%3jQE9kr=5!cCJW)u^LM zA4p~f0_3}rya+On@Qf`l3{`r-W?eYete!v4<9&d-eRG|~)-3XWkviKK*ckDHVD|I?ibm{u zo|8R+@BLo~iw8-#$5ID4)no6`r?joHkj=f0=Q-QnmZrhj=bm;5+aaJB=5h5X0bGqC z8Z5xu5KBoC>Az0!ft`1!|EvnVPq^At+F1omY5C*6wP z(}izJ$bTE2epOb2YJH~%h#$yE&=@rB!JdN*Ft7T@IjsG9781X)I-A3hv1s`w;YJWG4ewHf^=^vPY#MjmfE%U9=EM{ zT@qEJi`(NwxN;Q3Xj@cU>YbT9P6=`B z8M_&&y6|?c7Y4fnZyKuRaMxx``kiY!=5M>Rf{>SdB7grIjehWN{KBU9Okxp#E_MA4 zF=v}5Z3)GOZ>_cn-#|=@S6_B=T>i>$v=8cme;rop-?gX~t7}o`;B8MK!O4oN2#KCw zw11@cbha-8)@_3L&Q{tiQ_{N>nhSk!D{`hq@|~#6$W0MH*jDM~!$I6FKB=J&8xyeq zVBD?@w7xNLe(nqFX44e4dd?hZ==<*oc%tz&9cOTIGy+zkHr2jVo<(B}U5PHy0Y2Z| z)%67OW|fj9xliQYMmq`#uoMb`8I?XdJIqlt2W#*N+#7~<;cvneJz|-c$}zK>^vEM* zto`Rs(reR9oOTP+74<%ULkJC|@gvajr3JnYo zsF%~IoV;lW{D>e!q98G_au(< zRw3HKC0!{2QhzEbKN|ifoVCB{d}U-#e;_8I=S|0!^+yD@Gta&}+k zwDot?Zdqz6*FMMZMXXEGxSx@0>fT=(`hNXY`P__gVPz7PTk-xB?T18kFUw$}Ywwh0 zxNK$I)Tg$uUt4y2HFT zV;{}W2^OWRTP}S@@&@T4!?`N3yD!}mixi_=(clanCX10AbXdj}OZ zD70@+x*CL1H6`AP3E8NGu8Bs)%7Qfx>ab#Hb!q=w0v*mx;llR;yjfpt@Q$GCu7gYk zyt-%gf6oQ;hT;RTD9OD7M@gJ)#Ok5Lo_dPXb#+sBm1p|4?pGg?BPu1YB8B%gT?}6G9qXBKf&YU}f57+o ziVij@;L1}ama41S1=yq$Egslqe2HIle{nHyH?-t`4V7 z#E@Y*Mw6q50h;zg9Md?b>HJja6NvZ$!d&?fzpALSJY1ocM;BRyERb;3aG3VTZrn)x zS%hOVUs3ol&}~{AJ7Z8f%DPWA*GH_sF$=13eNsL(jVl z)mt+?!9T8c#t@oP4UK2d+lOXX)%=-`Z%tu!G2AvRvuT{uG%d zFP?Z(os<9P5pbDb(sN&h_u~(qV6xP9t1h=3k+voLwjvw;J$KyB$EV`Y;ZcE20TK5_ zC6--|-BSa9{QFFmzfFV`j-*KZ9A^T0b1ALXhn=kK)K7d_{MCG4mm&Ie{1Yv{wRWqV z_4^*Hp&!P?b?+roW9QfFoEs_aTyEtoHm^c9g>Uu21F$+Jnb9Vq#r~zHbf!+4v`^UQ zaZQOwIg>H87pa;CQ)%HbMx`r-Qu9=ZxMKoDg$Vn1iJfsG(ywm07s5ythi+h zMywss#1^TB7P*(X++5uh=UR>lXV0OUmJ23Xo%1|+wn$HNK-7!6_g^=AYrDUn_6|2& zPriqnq&q+VZYQsIVt#pif$Fii|NQXVovrGP7MspT?ev}h?CyW#rV%Q_Ds2m|F*BPt z(lWz`cWw?z3h1e6I&b-qtrT9@3B!bJLUcJH`*~9M zAFze6SD7>)jl9#Hr4Eaji2Jn4Cw5eUj2GUgywC@qjG7#T!H0N(8eEAHwaOCf^67&! z$3vO0Fv%ueD8DKqZnBsUhac32xH59!t1FGs{p1z|f-t^5!22BW6Sg^iZuuQxjq9}m z^DYV{E6M&p6h0Ft$u2lzTQRSCRXlSzlgi#l7BXP5#&rL2#1s@KW2gGw-`1k$8%oW1 zXN+}Z!mnIKp3Z#dI-gH_DJm7C$LR@WPyWE&XA_>8ojcBLEV1WTthq@g0DH?aluSx9 zL`={r@BG=-*8<9>nr>f5eS5Vf9$V!t{%w6z{E%iFd4ncmJ+oDx_uest&TCU>tT&+0 zA6Ol;wWQB(EO8ZqJUghao>GN;&fI4FNiV(mcc$uA#VeTPAL0=o@ATgJk8R(;A7;a| zDV~IkbM4@{0=CM|Y?5B!V+e&yzJ{Hin{;cnM&8XIP1#h>T9cX`aY%2F1!U`*z z3DUxMt&@LL0E43ew~q13MtjmzasIP&WJmRrV^Vy3O2k{xms@g7>gMbzKxkAlo3KEn zE2=;itZshScm%gs=v3#SOhpWz|H$@U`dU=}oe$~GcD~&G|80xR`S?#)&v=N&z}7p_ z#FcjSN-3Niw+ezw%#alHp{BuS>y^;FP6;|KA%N{xG+j*Ash#l7D!Qv7?uEhNpr>Gu zm&T{R^R-uE3k$pir==7YMnBKmsQYX>_~|Izg-Mj(?4S!9!z&aE_5cdl*FQ%mL786TiNjt*dG~ld_ID(0Mvhzbh)cE5~{P;-(j^e@Cy6{FFr{ozcuu1^TP$YvR1J zA`x-QX!@h)k~wF@6fgLrk8xJ~;UP;gH)cd1mmPFm zb%`(9+p5Kgv$dqUR>ebcTMP6> z(@d@Z+3-UyTeOxN?XQ3GHmT#7H4#l_g;S*#M0n0(D=%g0OTgK}#E_4-zeQs^TaZ7L zf4;gyxppI6xe{q>anha61Hvp6G{bKMv@P+;PT_3-?gq&6dbX!}CT3)S6YGitv3~mH zejK;<{hlvBb_9~G)eR=T47Dq`OfHWHMp|+p#|wtToPhqNxrhr+xEyfXuw><4^w5aG z7{0z7R}G2R@*7iA?K|>N$z+vV6`tBb~e>3}=^qzy-XA!B>l{_D>sgdb&KDO=(X2gBd+(-Zek7Y|Yd}m;6?dV%CR6>Zc zEiwc#!(e6;J;6k>lDS;gYDqYXQz4#{8_8Be9{JQwNfY%ZovCv96wm+DUTfP+O>v>O z+eUF(z-ZFdRk;D>LYVDjuPNh{kQ}SJM%`Rni_9lLC(2gN!hlm$eM*j|j#~>U?|)6+ zA9_`h0ZPeFnBG%a`R@-f?0nW{g5~vpYP_d6SLLs$2#X?wgoMgZq#sTyd`G9s8dI$} zG+9hxC#m}4iOCl$NSB;NUNg3I#OMF)n2B4-Ok4DqG&S*6KU*=J88(twM_q`G-@@hP zPRqqoc`RFg!ryA^M%pTz9DK2GjzfRz5or$Y)?es-xdsFAdY)OjYgQE;77(AN z{UqGKb(H^RTXAAQHzkA56qAR%pB#YA$|HpUr55O)&V!7Oo@~P(37L4Gk13DTY6v;I zR14aD)Zot-Z8SQVhfL#f-lgcfp8K|4tqy!T(6vR?t8P%5qX!4nENM$H_oIDfOBwxd zhLcZ6!svt1v$%V!E}h4pnLJ3@zcu)BHD&~10iRNJbPz9~%LK6sI*T5aA{2`$BH-xL zuKpg8owa!7`0~yDcW;IkclG!mMpaNoZBBHdvDhrheXn-gF5LM=LX4|h5O0goof<6E zawKTwqLcR%L#<_@zKZtYqCg*y7CnKT>O9jkx*ikQESdYVBjukNl&z3~U|PM18A0$1 zRj%RzL093mZZzFikHW&_L_zU@%wgVI-Fj8qqjE;$cCMRy1#D;AT|>W9BXi;1zotFD zfyCupqM!1vP-GYal=t{Zg7+G=5RQ;h=8}D&qeX4xf+M!}ZaXzn66yX+FfCF{hPGp7Dcc4Ir!cHf3=_Z3I3{I2SImHBf>$nKLz~0z6EJD z;v-%@%dXx#X=`-xey-!9oaxcH!F*G#VFhvEF&q}Gv$kSbn5wsTjX$1}+Cr~ur@zwo zu8nMJS1+OP2N^X@jS*S5cWtXC&38Wc1~w?#QxZb4*5fR#gvx(VmXi@^GWqgaudjeg z#m|ap10QmkL0EhZ_+2`6@|w0ABD^(XqYH zRMn-U&*3)@m4iM{hW)Q6-KFa|Q}?qw`tb&Xx3P8u2QwP_zc>bc-?VFL4sis? zC$_yQ(_e)o7P+jnn(yH<`u)`s13$*VXMC@j_ImK}K+st6j=cnZKsGT47*Sw1jW_J^ zuK>o~tsN+m9iK$QT_;(LGDO*2*z81`m3Z#Ywis$ zf;<XpGP+ni`x?tL(D(rMjPq!81H7&vV{xc2&KjEWKVRb*uvO+5X53b#;nZ!sR zPC{EJh5tDmlyu76cGKX!5Cx_}HTL%wG!{G=;5AQvphwD&|k(IZRu+h-Yd&}RZIDz6)L?X1A z?9?nP)dpZ_(%m=3tEtaVZ0+56TBt!yft9-cBPB6gZ3M97kIuNM(J3-K$0mrj&u%J4 zoGD81`Sv-XJYk}=Y5#|z#rWxu??|1Um4$I7HkOnFIs5H118cLW!Uxtaf^$}E%~p|P zJ!abBABGBrw^!L-ni0X?XihZ*qz8p9fdxykbAeHdj7&byns)M zWo5{joz=-)Eych5fsvnC(Ao;rbaOXQ;=wc)|1KK&R(?jDf{4kj4rwvVt__ksO*oV3 z(fcK{h2C5GRp$TPDnl0h;CI!G1@|kL>qxwF$yM)?ySYznxW!fWV@Q31Fw4Y1f7jE= z|I+PEJEPK~;UuDU!5UB8#}#??yGb)&q<2~pe>MJ``14raDZ<1wN|77Z9|+YO8M@}( zo^Rc(7CVavn0!7u&*xKL%MV04y2S5Qzgr!uh}^{EaT>4NLm+OcKzz=+aEye4CW2l05A;~ySZmDo1HlzNPtAI`R>`N(KENhPm z6{s|C8382fA9A-|HJN?ppK=zkAgk%Ihhj2&IT`lxL9d%rdaI6}Tt1N#vAI5=b^xE+ z?WpR9qXFts)Hkjirlw@7xPxF`F1hnia4lM8gA5GsK z&-VAlU3*i+sJ&C0mLPWR-Tt(-w=XKOV{eMut7dFPhdpcWRWr0f?H#4WXa&KOKF{m< zH~HMpz4zSnIrpA(&w0P4ScO<1P)69k@D%uZFv$(M60n^tN_ETd*r?6=#hZYDtv>+a zrSs&ExS+&ktV~yF`|sA}pT$(APbuvPj9DjjfQ5j$WG#(7pW++K#CB8CwRk(Y4wiO( zYjnLRKdL)9^R^bz9~+9LyKgM!97ov25Nn>{fkt3d?yECzK|-r?kxS}<`7hECgPD}4 zj`~V(uCO!4U!?7Y+JBiVWO(QwHy9NR7Ifz?ZUM1~#>mhV7iq0S_RUx$Y@f#kt^CE1 zyia`Ih7QmNx%hTWMa|>T7MCP^k)8nDAKioI=l;Y?_N>CcBvop z$raAag5%Q&x0(q%>JUPABZO4@=DZlf+=v${vblpqHGDpz?-25ra+HC{Qry;^3yqA_ zv`<&fR`C)op~EJ`v;?wn7b_T?l?*-&anl|d|A9u*jKxwQtlCx9Z^yI5PE#X-kZI>5pbkPq=Xz&&loYPxeC0i+_meomuN|TL@wGUJn_0jvI02Lq42I|*)V{MUr zN^r3b_j3Y|rImw<%tRAdoO0oq08&7&Yk*H#iId>Xdo8K=;(?Wr<&@h?FpDm7uimUmsz|DYM+Wz#JW-^yNj-kpd#D6 zU|}0yXKHd--*Nq&K=H-Coh8gDnN6l(9Iqy$!yB<<8y`o>W~dSI0k`?J>1D}GRhhu5 zZ%OWUOcQgqgg3?!-Q^=RHVgRlG^}Y0Dll#>Ac+ATZ#=I~QYmc+i;`f`-clKvHnR(P zl3WOpzvHY`qp8DMivwyYlEVP)Whm3NR6S^*_XMozCoeg14|sLv28Bg4h}f|xE>;ej zY!S-4dlfJB+XH@21>P$)zbtCTQBWi=di;8l&fcjP1Zp-+> z0CXnDH9DF~$xKTN-1k2tk$xQ+k0i>o#&Jz1uPtKwup|Gcxyf{5=|ltybafIuOkwV? zuh)XwBOh30-1Li)Jtp-{*;2sk^I{W!NSN#eAyg*u4#7|MAzQPeM72rb!^E^Q+lq2O-hGpOWMN&Y9uD)4SJZ;0+Xvc_> zY+oOk^ZJI}ZeAMGAI0X^mv@IG4wkZ?*as`k+cyE3{18NcFSr)Ww_%q;60KVvhHPk} z0$Vj3?=4oT^tyMrGs7zMulF;V+EdA}C1!MVr)+vJCbmtkHH}0bJOp%H>|5Lx82RcO z&@|lT_@h+3?Ta{!Sm6Cw{^ybshT^Sr#nk3#S8<$a;fpC; z?-N2`aM-ZxI_B4l`T%}b9qf2j!y_eh3z;Ck_08;$u4m~$GO1ItyMVsD!o3h`e2co{ z>K8k&Yb}@T6_VQRzYB{6saI9=jw9_mYY-Bg5#5aL==!^5md)22xx==r# z*+A^X>##_6yU`6+GR6Zv&y;N z&zT?3d3nQq(63nsm62Moam?a$;Wgb0O+Px?b5@X2Qe#p)ePy{gOdK@PHQbo+ztU~Syg)am%kQ&-1ohEBFavDz$p}5I zs`+?#r0d8~jlo;DkWA)*#PCh~lmZ;!tWR%gz?2m0JLLk<3lKB>Q%ikAp5Rx{X!;&# zbbDYfJg&m>8E?^Ky0h_j%X9YiK0fgLM1cK+@IxzkBeBjsEm?FgbEM4eERJC-MIwsA zOkxvmdtfe>nObEi6EsN0Uc|y8J4BLhXQ^;TF9)+%E*u(?ZC(paZlmbv1gFsEvVGjp zeKO7T5_wpwO|f*$PEvrn~|L$@rUCda8)k3Q+;2j1v)IEO)@gr&d^DrFmIWi zrbk$5EFa~{iXwO`nz08LMsPbSEtcdIm~Ism=rI>I8?US~p|4%yS3TG)U}q^_@2kegq1EGFv&|#g!gs@UN?@zV*x~sD?^jt zu~W2lwYECcA*TY-#h4WRh7wHUpuvlfw@QV_do}*w(WU-d!d}A2nx{D&*y{d7PP>n0 zMobW>`__`NQXw(?YtWxBHmg4!Gj;XT)MQ#`XAmv1G=b#eav`+6vw23oL688AaJe5X z^X;Y#^k;=u$Oerzvwjc`5K=5eL|{@rLwtH%*Uc7QMPQT%mB{IuNf$5N)+>UvB62Jj zcG{gF5}xx>cTL5&P{=m&+QaN=N8Rb)AcD<^kl!!n1S#>O>E)i+d-KHU{%?Bcf)5@@ zmF#t%ufnM9)zjj_m({XIn8fFqqh2ZPvLZ@B*I`Kyl>rqE~SU=c4 zv3!`XHUqkVac7Ew<@ujl6+mEvG~zZd7>3B)&!g+6Z%E&7^oXKF#)o6&I9W=AUImJhsU)uMWFsD{nEuh1W>#5P+ zQh%L&JUfV|`RMsrQs+oCC6UP_e|AzSFI+4oghU*~_xE($|18w(K`ki#Q@+7SP?vP$ zkgWCe_`-oEhg^bGf!#>mUdy6;jTg)XCgTpi@uAP1BCxrD4pM;ZqpWv+?QJA7hQm@= zaDdX06c&pq)@*5oESsU2+b6$mk5o(BDztgRUKJZT=W<80A=ABWjXlWk_=4kccKJn38Kt zNkthj`3VZtZd3e4%PS#EBt1k}{f`{s_S4&fedeqCR>oUp4sQ$tUI z=6UszkD!2+{=GP&bAOK6K6A+r6gCwa&JG=c4ZonxNLG6mILJ@;$k`$a#(o>?qHK z4D*2n!F0SasVNpe(WlY=7nSgJ^$BrUe@@5(H2MoKXPI;KK%U8qBQF`$Sn;VpHm4=P z+^BT~=)x{-s_3)y6#ieE{#M|ig@;QK1{O$%4HN_z!7pf_p*ia_aeZye00AsUwVY=4 zDqFvi;YG5@Uj!{DK{^=VInF;@WVvmwZi`(be_(|W$m{B%&F$dRPy?PV zGFsGRY9j^nJ$2|BM{_+`1j&(e@nJZ8oUU))OxohPk0UTT)Z?xM6^GeMk&o4jc$QRg zM6~0EG=-FPiDNImW8R9v?CZ+;{C1d>TB*Aw*#(Y9kv~|vV-Jf;5 z3a9crEB8{ETO8pC+FuQ|ClrOVpYq40kQeyK5N}0TnlhV=8Gl85C=sfRo&vAG{UDD6 zNcXoEEQ{m4nbJz#VN|vtAkk_V^;>1`T#W1Wxi*6&C8IX+Z^rE7R%FDjYaD2{YrjRJCoRq(;9sYWA^24jzW)xWsRG-jsbPYG&7bhmaqOTlEGA!3 z+znIPfAVDZ3wl5-XHn6e5;|Hv4lqXw z>skgpzovAt3v|k&FZ53$W^6G-pdWiD%$miC<%Jj4J0#jyNi^hHVXK$N773q%M)u84 z%*(5MVZM{#YZhL;vP8J8qt#B%iGuXZ^^d0fmdk3l*L9YwBDXKD9z{3CL(hkHXzGL{ zR(orXe`FOuYM_N+=3}ad7|a@IkEhQa2V`K;$`%`<)TopcWj43>7b6zwmoYS50Cji_ zkoW5~Ht`-!@8CE;$XpcidHBA*ITGDa#d?m+HB#HII(9pno?skgwE`s(ux~^ntSuGbdUHH2xUHXF;xAApQo1 z$E|`3YLjz>5W2X~sYF?-$dQvbBjw4}@qW38=Fu6=kv_h_JgQ)1)R-I+IgQQ~7Q zH=7gE|I3nVTSv@#>3OwArb^BOy8P9hZNYblQb|ML`0jBQ6)e8S@y*4v83D++W1QDn zGXU7T>Zb>viqvOrOyzLYg`K%IC-CdD+l`57q!_}S6MYWn&^nv_aZ}Ko6|_G`5@O&L z#R#%bb3N?f@6=uIO7GQF$GX&d@b+cC)?NG1SpM0!--vOK)2rDUXJps%%czVNFzrnv z^FfWXaNtwcoImz-Jt6N$43#%$#B%4zY%UsjyOxAwlgfW&XzidgF$tAc>uTsK6EG~f!o4<6b)Dwj#JeGD2F zUYYE7)YB#6t#0{6=2Bl_@!c_+3rW90@f%}29L|LbRjg>5NE(m&- zkg+G9Y8dRJ^KgO1I_kv(iV(byyRXQu38-aD3|_;c@|2?JZN>}b-4syqaT`)~Kri$M z|Ad|)V->ziIUSyjgLuu2%>5j`Er%6JjU@#*gE@FJXJA7Cp3(WTSas?<;3@OKWL%x& zA{$?Y33u4_iomm;PW2#x7fZhtFdeaxJ41190j$y7R)~EzrFz^}KVCudh~);=|61XH z8+K&DRE!}#JC}O-4)+I(+3Rj6-8D;_C*Nl1R+|kDm4~&xkX__FaUA55Yb<$!(|f4T zT=H{+%tRV%t>>QGQyPzHxY_bHORwXXHav9FX#IUcwxrkvH$K1!3fy$rnC==XC0g z!qcmK^{=-`1#~L=GDOE3*J2|^aw8aFQ9UEqz&NjJnwB|DG@I7jWp{2a(#s z$n$KS+jeyDGRBm&&_APl=mc5c`ex+lYb{{Xag;Bx4zv9)@#Len=RpKUvJG);U3@$u z-K|koolvQZrtv&I#0JIigupNpR-NV?nm*(i8_i>vvbLk`XlhF00h%8@l*mnYW)H-a zv}7w`z6#8+VC2eHHyhaV=fi@`n|>XB$v^43m7glT!!pu2 zYB$q54gEu~`1I%XZ#kFk5>usNvEm}A_%&v0klCT-HXebj@H>?8$K)pd#w`ctv^R<& zV`>n^P6irJ;jZTKXxa@kD%EQVJmz)#JIYIXYu6V8DnRX zTp7@$tE7sP^PG%*sM3(+@Zc?DVUg^1BH($$AV?|2CfN+`M6G!=INJ3G&AZGbf^wzr zrx2juWi@v$3Uu-r=g(>G!TfFOU3H&4`hl)5s$~ftE0I}mh&G6iw2h!v!p!1u#ZDa* z@3*LgAuFb6rXX;BlRyx-12p5LVC$CrhoulDq&22$q`ZLbC#nCzyFA6TX3s5|QYC31 z($Rl*Aqh9>6m25HuA7FwQ=**C$a5end&{_i|B5zKWrQ%lQ@fw5#PSgTB`$Stya1vx zQ`j}Y{qPhmmt!EHWxPf-S);*Phabx|;^HCB)t*~a z>HV*j8A!lhIEMRYK^%kgQh4;Z3Jo&!@fr~AH;y@Fh}(+bQOoOx>An z8kwol%99zTDYJl)J#HKnn;N=~-%DRto?G!eqnc{Dd*d=9N@lWV?+W(e|u?bdar0GyGd?oSpES(Ft}iJTlDP>)k*ImAnq+QyW% zpfEV2QdtSTsTYEwd#zM*Nj?>{4nBufeLSy{Y=)JVx181lyiMk9m++eInJkqaZJV}x z?2Ps~w-@QyVz=BJb!yy9XJkbWnv7BuW3s!CKEMM*Pz2)GgDS(4DvBfoF3-((#|SiN zR~iz)!Imxk$HKJVz9|*|evCI28a*;n3dzv%%5tH5X-jU}pS__1TqI0VQROvFCPQ`2 zHE52~h!b(e1GyOZn(3aWQ9KFSHc({OYcOpmB$ zx1aztJ}~`(4-t(M%%K3mlb+BiBs&Ag@n>v4^;F#G-B&tFzWf$6?4>%}!DHH{bZr%E zv>Z#aQvIvuGWyU$RtMICq)n~f4PHB|%zl~lNXFzpAZ5^&YNgNN|M(E;9+Y7cQ*4xW zMq))++`(~KY82|Pe~yl(kumAUes&ryK3P2SUAO+-)`W>uDC|8T%Ijiff)|sg+16a5vm_69@Hoq8infNB!%$;8 zJ||Z-n|l6xJwLxZ%*PQxV6p4$kpM^DG24yyqyMwdg5Hr8@Q4iYxN; z{#{_WW4g`aF-2R6In9CdpAKnuBv6<_F8T;WttN3i9ju88UKe1iWAP85Z&Z%eHg*QP zQmSIigqfYPkz5!CTU9Pw!dyZ|N;=J1QWZR*kNgFEX=yG*)wWVaVv&U0MW||e7dn#- zvnmSPCqy`AvhIP5P7c4>$dFYQs$!J*I8jqeeo2cpx5}s!SaY9`N**;Fi=L_+4U^TT z{5#uUnF(Z%LELy2OQ*Lv4U&8eI7BT`b;3XcF_s-VrsJB*i?g(1jz2}vr#os)5C$*M z?5imAxDkcw&Av52{bF*J*WZn8mQeK5I3T5+Dw7Y43%Fn(&q3QxU6#ccTmhBR5&H>jeA=-^k;$H)eoL3*klPg{s%pWXu7K@7<< zVh*p!J44YvOTV>@o+hB&e~2Jl^l)}-ccHJ(wO~1e2_#;i?!)+cZT>wC)kJTPRE$xC zXJh&3F@UsR^b=vJm~1jXX(5En@O+x+t4bzw#*n!~hH9D)$AXTj{~tP|Su*|M_Z%ob zdZo=|ajRsxEe~psI-Qk2OCqy6d@(VG2N>2-i#Ee2bBT&0mh%RBUL~y6EAiC|jzeG0<^aYiphG?^HS@ zMI`lQ4F>tzZ!o?lAXp2ppyy&#kE&RW-l$u>z1{T+++ zMaWGx8Y-KPcs;KK4jP3TyH4Kq$BkQr$-sH+UG+Z{^xrch0mHj3{O#z}8q|1cu@`tq z8Ow>omV4{5Xyk-S{%^Zf-25C(C2F-xa*Jrf!)3!HpRkYrCl0P_sIg(mj8_j$<|@_U6*J#XIM4UUJf7Q&=u6$kbrvVmBAO%! zoVPGl%5<@2(4_OEw4AjkLv@ZXoiD=Yq>VvSr##T!XPWpgIF3va`w-ZZ04Ul!AT%0{ zrcwI33N0ASH*AmAP~(J?!R-u`l8lE=KgcgZqdq0aC42hS%okbPRWJG)``E~sj6jIU+DSU!rIH$zkozo?5ibHUJq*_8-yF& zsRdXR5A?-CpTr@VMHV*;4DA!b=f|E+`0dBzHQST@mR_)&539|SPT9Gxd{k_qWg>?o zKQ$V)cPVY_h)h~kb1w9K&6-AMII9cLcojh=5HB#6u`@zMZyw3#Lg<#j48{}tD(xdk zjnPI~Qh4jUMdo&fo+Gz&a2bP!BZ|JHD^M_g-gF8odETNw>mh77lLLkJPRS|v73>+Q z_A&XrkoXveF{_H0L$F{OqNR6Rvf2T!;sr~i$*kL1UrID@L`|E=3vZr+G^tq@XXARv zAG2Vm9xV)}QaPHH#|dCgABmu1iXn$~32WD=T?J5C{{nb_rz!e3a?@e;beDqAdI_WX zbKWn^+-GfjUwS=ksSWNRuFx8I+^f)bwc4F&Q(`MzxERgEwmIPx_QbGv%)5vgX2>`> zRCEe>BK!F7#ipL@RvmxQVoW83!W`0}#2d#U_};y`np-@mp+A;0#O^KAEnDx+>WO;@ zU1_wk>TjK4nGTd1jiL-`NUGLRq%wFax81fs#nyR6uKg%NoNYYnlY5~YYkW&|G8HmY zkfY}xv4Bi;G;G^j5w~q1LMb4hxgMeu5><@Z_!3L#JV)pYP#KSP1mdge^X3uc0jf26 zbVT^dkPL+Y3*f8|(;oGRLzBHe4g77yYmt!SjURCXS)KX{M2dxcT@bRAHuWc?*(fz8 zup|BRceA=;PpVC%6g~xXM~R1?2ay@IV%P+2+6^Qp3UlAK5Zl1HmuD9X4tU$A8WNRo zSqtv$=DEVtIPS7`C+b3=BB7*`-mLJ^$r5ZBD7u!BU3{wH|k;f9@Bdy_F%sE~~Xuwet6yhnx1%9FFxwe_58% zTj5{fPc{8p_n&e-8K?I^4~+%})YB_Ix_wseG9arw^qO~t9iV-q3m{B`mRka zV95A(Fa-7Siog?d)0H%{G^7cqzuU2(ftcoMr7CkQIi8jkPff7(&f+dTL!|?E4_0JK zLJB#>y)>1jBq;nON}EjFa;$^id{LWl)W2uljYB2gF}$`{x1|6RiQ)0r8$ZuL;afZ? zlN1;ysuIX$FpGDvrr(KLZ+W2Q&|R*sJ*&rchNjy=zM(T7s0?T~9LTKOkQdsZdvfyS zw9zmljRCw*_d`Lh_VfdZIV@v6lZ0g(1bhMrc*5oe0MQN`K27E1K%LfuH2S|n{%+DH zoj!3_WNFDPig%Rl$$-v z;sTp58rNP}mb9HFa0k@}ds_MYwp#$TbzNug?MxWCE7M=yhGueJ3nc_-iDQST)?i!| zsbeqEw$w)0!g;vp-dHRv2Z&}WP-4Kwfr(>_kQn2VPWALJvww;>d>i-#O>T3YPgA?~ z{SbKWQimfo@SBIkKrtuH^M;T>KE|OMK|K`|Q$8F&p zWn2=n@37KAK{0xEs6IKcq4|YUu^J|0XABQGi2vMkkBt;~7rlsa9+2bS|3$O+jGkfp&n)QFt! zBWk0Ce25f+Gkoz4>gqw|^pYz_%5lgNf%vsq2g;$4iS!xJl zM9Yw5w$N0&xhw3A?Cmkg$W&Q+>H1tKYRS;t{q6rd%_@FZ5=`DKX;3=Ed%7`ZJ-QK- zVq{OkZV8dF?R77r#M(M5t|lQ~C9Xm%qNV#+6~ax6&qeM3lXI^;Ujv)R-)3sgENts+du6yn?2?;9Pt?!Oj31l#gzm!mf4+e#o`k@LaT;N(SEQI31G^8X3hnh?7K0*> zQ}+b&U)A&*M}c$n$+J6w#m1(>2wd<(x*I*^L>olrrl4VX)@~u~RO9HwH<7E!3EI%( zlmgMm#1{3~C-zeD`@!|>g$V;HOm#eABN;2051#32VF|`CiCBT*gl-q0xBhXQ%?y=@C3f>=fmVOx_^xZD7cOA&26)bF}R2SVR?O3n&G?hsZTjQ3YXn zGLKz`$nv04+03@Qor^}|XAG_j(>3L+NmGN!bjrJF;lbgly2 zbwnQVMcDr~kGOHl+Idfz@oZz8{}Dg6IV7XtWoF-AlHSWMzVtr`jWa|{hyt2V?L{ib z#W0CzJ5pDLNY$=^(c^4PwLId3%SO3v+9Am(AiQ;6Pqneg@(^I>4WLVQ2TdiF`x_Re z)D37WueN)LyqP}5fuBfW(bLj}8?2V70cyy>sIuVm1arqG(fv~2WTS+~Yv}mjdy5~r z_Rrz3Kb_eiGyYR7toHcUR&L|DPhs9w8+7|>s??w3=h5Bm>N1cPv=M`Ik#095;=Ee> z`s6yVsBAFv@~{-NRHX)IKodi^sT6w+-Nu!KK{&zKazwVh%70zo7Pjt90E3Ui<)b=1clak1;Q7v8QI zy(2#9pans(jOYF75stY&Zfh+5fhmrUGSfhhnn(Ccy#BVQSnVt;pww&(BAue;{OVbi z{Xe)Q3BCpwjYu~FI>&S(UlO8a+$UrE{S;1ZSqo?Ta-dVPNzz?*Bup{5Exi`%#ME72 z!O4MqGzf=6q~HzhN$1=}0rT@Ll6@T8m_f>Jxfu82<;yn>7PoglrmPSDx@KFN*>Cu# zHe*V)5}CTIE9BW1T@{OEe~qw9Kd~Djz8;_uKM#q@_Mq3YkEF!bsOrT^`s7RgHD_H; zl3##6Og9oxn8WlND?nr2Am8ZAYvXaj^#$UZdEx81JZpDC)R=qC7vc6R7B6|Td-zkr zU(Q@j5lEW5E8%zK@DHzKp<;B8@oKn8FZd$V4JBXkN$I#+^XTeg0RiU;(mes%?uQ7$ zg8Z^F?KBTIj~IQ`jHAs@W7=l`8Ztwf7~YEnGHX~H2%ZE?A8XUB0(PS-5^FzhXfYW` zY9(@lAt()C{EX9+rmF#}(1cIE;Gn|;WMMgPkzggJv`TnMDYHIy3YnK^9Z-qrXA9f0 zm?7Rj@-iS+WUv!GtZ88E_5qjds)5T#IoCv;^f=v-U10`3C(FlfexV*$PRO=z>j?q& zbN3Q_^Wd(rWRW1p73N1vE>r0aijR=_GSgbvV=ybJh}2@5b9sxvsrIGqe;h_qBhWj~ zcP9rbVygiEeS1cax=%>xBEUS-0?oN zTm4yigdj5=6FWAOHzU?yT*~};aiX8eRy*JhvkAY4z!v_eA zyfm^Ug9aCq<7ViFS3my55w0z)F{?9nZfs^%6)S#nn!N&SKf zK%|~g@!!+uq$|=_8)i>*=lIHoGP|s^v|kgc@&uE6x>36w-xXA;n3YGA<&0r6%2hVX zpX)jK6y>8|22|&~3z%P(4(dATI-mAq?{Vy)9~uQi3YxTd#T5Y5t=ko22-T`o$f7Bn zCz$3Lilv1&&snf3GFQzvi_m9h+UK=LT5`jqW0j!Lv8PlgPlx+N*@JF zd6_*n#lVyierN)>*F3kso7jP1+?F!^c_gdA#6V@nI)NXXCiii{NueSDWT>S;s0dP#oSDT+!PC@4#dDy`Rjc}{0BAXK}@K)anlYE2&PG+D4! zs^ba4#l7vz9}Cg#F)$4q;t9-u!7~zfnVip~BoY8u_07s1j+bg-^7Y!R2XTZh57-%= zI3N*{8kwsj)p4A+bBI}jR*-4e_=wiRtSf8+(twI#bgzFFM{MNhI(;hXk&-fEYeyiX zS?Lub)v*=hUqq-jPxtoWpxn%hmEhp>7(`QoOmf@7!u zQj{dhQ+>dV2x&PiyMB_~zJm-=NZMk8qT@#CBcJm~PB3ea!82&zyaGGMOY&C5n!=Fg z{tK&iYJmXacF#&#cDL3jXM@f(Qioe7a=hSK={vy$7sL`2ojJAy08se|l46+EfDH^} zJ_(ULiM>%fY=vL_hQI-O&Xfo$5o6@Xb?Tgg$f3M|{g(;H%N-atfle7MppKg)I$V#=`UBi)2r0?zo9*CsmvU5y9qYc5vXbr|!i z2f{_<8IorVs{WM;)a~S=VK`H#j~Go9IfQMefVeLLFiuIG|6@hGOol$Oi>!+JZHQz) zhCzt00{%l?`Y(OhENRG7f;x6ajfXibK^t{){S9d@rdt4SS|86z$i$L#+Nl~AQC9y* zDqT1o;><=+(JWvzj~lIWq%W~cic{B3NST={_`Xye7M-?tUPD@uCR3}j9{D}6y}DKGR66agR-5I#C~WS}1= zFN`W<7NmAb7ToBtuYFi9X&6gm#K3vTz&s^T_HlEw72k;O&`4O!doL@Zl10eLx(enDRi9ei2*sm*4*xLLl@@ib1d+7{o$uZboF?fILO zH}?$&g(WgRo7|+R0$c)M+hFUC%dq^N%HrYN=We@#+l^;8gB(RW^G`nBzan&sS6NkY zBD1y0?wr4bsD)fw8^2TF-U0SAJR1haSeF_%1GKgivO2wpq~Hn9Dra$Do^H7N_mLgL zRTkD9`PG%-Wfy=+3>}S@_d&hukI#N?Ht3`xT;Xp`A;_h*kI<>U>BUcNXsz|_<6nDr zXzTT@dPY3&zAEKO85T!-YmTv_q*r3@C3UVKjm={;BgRccAZyo zzdi?4o)-tU;KmyFZ>(`PC$Deb_$$kAO)m)Z$E;<>M^$hMo=yAgAFeo+qdNzuRy~hH z+}Q56@@ZaHL6E|pcNttgJsF>vf0_c!G`!jJ7uvbT zO_R=5UEKES$LZq(aaC!oE#j|aFS8aV#Cy96gTICQ(g%|B`PxeTTV^TQzp;rt{yXVf ztr~`s--t^++bv!%y75?l`Kku0Q(2Oo?DVT03;g-@xa07rL8;7x$?`G~UGMH9!dSg% z5z061Hc<3>q?J%F&NvObnEQ(Ji{1cS3&F;{kQGX@UVD=HYLZc8VSH$6w3an4t#4 zxNOBX?#1`gMm!)uK(Kk!0gfrR&!R1!*@xaXv-tFrgAl=?z!L@`Unt|hSut)TPyCN) z{L9Dwy=hasCa*o%L*oB!|4wtxxjV@qG#M*u#8%HEhEkeuR%< zH!LfljJO|{M7|1nY1j($q!~EsAU2;?^tN1FGpyI3(u6wPxul7O@I#;V33%TT#~cdG z0cVmcYJCYF>9xHsA7P2?h)-$>zHzi%Rk_}&`3%wEBK>Z_r~Q5VwK~p}TF_#JI(Q_6 z34aMZ5yt%5TH?hSoFxZSxtD~k9QeNUOF@e!;|8lLt`A=lUgJcpetq1(_RB^lZLOnL z$eI?#^;{;Mn)wf`=ONA^3*olfeMz|Yuggj4fvo!nxRF14@WJ{uVNf!zY0&SU9zk5w zp1|r~7PO0if3F8T^9@t~Cs%cq*C2*Sq8QwBjPK<~UghD!#b2DiSTW#U_MJJ`fe?4# z9(`c)mm#ty0ryO+5O!Ov%bjccc+=HJqr{y@ns|>ivLkYmwm!>E!&a4hc2ynw;&WDo zjakrbc^1*zpREAg-%vqsUn`9g4^l_^(@XWU94ef+WW>cDhaM6)maM$U`b0V@i4RIY z2aVyR&latCcXUYnbGMMevZS5-z<`hRpK^f7Yd1}7Tj)*$+sb&Xu@u`Qt31&l9I2j5o;&2MVBr{)EU#uA%av=+ zH>S-sChUNZtuyKP(&rg}WdfgfM2f&@Ufl}eQ&8bnRzxZlDjkXw=Z})QC}DiXe{xdv zTSL9X%^y`?T_A*?Nb&D6v2Y_hH(ajTg9_?bghKdgxNR|=JCeny5vL_pHeX&bL|&=k znx4n~!OwgtlSZ_c_SsOQBnLN*4>|7enmOEOB^u=$s!_rtfivdnj8=R&l|!_5u~^dP zs{NaP+=iF}5;vm&rB5uc2(SOC>-F#6so602R7uSThR6gJ4O>~l#`pr0vD=|*oeB^6 zl{q4fKUx}anfE;&2dl2_&6b?6u8Xtp%I2z?reyQOO**6M%M}itY zX2VE$?|&dJt_UCE%sIEvy>~yb5xT9Ms}sJ>tDtGU{~z&ef!TFRbmnbuZC(BK$)KyM zhV3Tqvws^KdcA7KDRkZQ;bQx-^-t@HeH;wqE*3r4YuRD2^LEbW^>w(|tyRT+EA02H zirzX!NWS94=|P3F`=IAK%^$K4Cmhw+CWMu$wmDXQZ~SoV*iOrCZEiO>h_v}59Q*pz zwEW4+QP0isZ!a95qsM->s09+*w(2(pTAozZ854Lid|1t|m)-20BW|;1-Y`flukSFW zK%@L+Z28lL4dvJ$fVcj^y*W5o>3y$R}uU1-aU?LHWn%0|2o>Q?DGd2 z{865`600b-xn8O;S~!A}xS`szwvBX^%V2fg$D+3+6~RBRj4JAc*k`6ndpl;8t*_Zy zvsvP(AHtt*B0}t`r6TJnf$a0%=X5Dmb zY1Ir{>op-x?c5Xo&>OwW_}3dL9(*iLW-<7MT&>9M=ee5;txtEAs2gS7`!7`8Y(M{M zU)`tbU3QGe9o>I{8PN_lhvSlpL1EU{9dny7hXZTp&|cV-6Wrp??qL7xz>MS#^5}Y9 zid4j^qd5?JI=-)G#Ote;NBj}20Kiu|3BYW|S^U)E4E3h|E9Up$0h5W2y6Q^}rGLy@ zl1^b&g?_G+!4=Y+bxD4!z6&GHBA08y9_O=aGzN^LfotlT`8Gu&VaC_RS;u5UPNySt zq1typ=ln%(H|BaxuY0p=?|XA`C+|{mJA-5i zd{7J?C+&N_$hIT&`z5IYIwIkz@6Bmyw|`!5HVryd+at5lOz|M=w}Ntfl2osfiRVfk ztS%?a>Kd;iyaZ-MVfz=hk(JFvS;R6MMEBw%G*q;ph~cX>dUKc3|J>ty0lRF<Xb9%Jy?B zvtdOgM7Dd`z0(bg_sQn|df|6m>=oCEVCtL&<@zMWjQmO0-t9^F{iM2YE6;PYXZkn(dKEyTT%zhWjL$9ZK+2j{?|k=vij*ku~!CpOF(Fygmbe zfedE$9w7_O0Q*<3Ps=3ydXlk-)G(=ao-bVqD!sI00%vW*Nr}43pJ4u1K1vern+;FP%C~JNGnP{4aV*<~9BCI&Y=gaGgikr%LJ-vJLgD<-G zsTDV#*VA)GB8Amh%VC;t?K4uYtmL@E0VRRAlh~BAfJPijggd1stjj81#m%W?c}%rMSI?a!bAlU2n)p%!bsCNEwiKXC< zrGNc@hn&OLp|!Z%vC`zaxBq`;TMS5>oICM~;Eei63PdT zu?DAAA4w-^@WTjB<=0MA_6$6NjL*+b&<%=8Jb6RFHeAh`@ zEjGm6??B(t{id+2+i_s=%H6?QI;ok8{)jt)9I7Pxr?RC_KM|AE7n7UgHAi{eE(8CE z799HQ3P)z}elw{0|EgY-rtSUhrN`RsvA;|lXIQ{?s()bN@%f_fAyOK*g)W)8bEvR( z7OUT*w3L5>>pBA^E{>XJ-0yab?mh&LJS{@}W44ZU{eODgq`C2rljHm!L5JMtTl$|i zTS5DU{veqZPcWGx)g-gT`OsjNG`u+&Jiy zk#GOA8_HjNjC6E$yeMIDBUO7RefFIvFRnE3-SfNWfuMnGzZ{9Y_j851yZe7OuYa2y zSDjocE!-+D_;wq0-h}lo4DJ`4gBN^5YiF(s&gI&TxiHGiKP_yYrI%P<|2f>hOTSK; z_oID?N9#f!nJC_~*jc?dndbm34rwgJVGM%;(6-zD3$<4Nr>H9pg!=pXnMT<&*6f2R zy9Pzs8k+1f#$MU?kfpI^8`+nPr3ghemKbYgPa%7R>_RjuWZ#$g-}yZ+o_RIPozFe@ z+$J1w-E=wkkzjZ!Ipr5ix;E<9%0zDHuF7I8%b{d-38N)As%evwgd|%5b zn?Y_X-RPG05*d`gy0_@6cngZovw?ag3IzPX%ZD8Y=Za&jx4&LL34XZV#_4ZK-_-Qz zj@Lsi>Qp6>pg|@*Ny!VP=9Mjb!b#_4T6Si_!m^e8%Z7)B(uFiS;=^gkgi~qh3p-As zBi6K>_> z2G=WJxbGNg(Ia;0$l&O_|CxNfX}mOa!nJUGHb&sSK=2wqe-;NvFb0@VA5ARqK&D*IWcOR>;=QUPf32U0haHJ=+>{7@S)8BB;18 z|G^EiFc(0O(mW-yo2T~ZFR1*qCRo?o^{lLf(<eBcII zwy*4vt)(Excf>-~J4Nf04geSztQfU=xKFsFa|HVAKHPi#>uKoX&>MO0xzE4iwYP)C z2(s(1&{~O;p}(Fvcc)`_T^Yvhhp4G|1p>*i+^E~TDS)8}VZ~%VU^HMb^waXQfo?#uje_u0lKXA-8Ch({TucZfkFWNaoFE9^AQ=_jiZ;M?rCxCCDPBUW3n%d@jrhZqWp)tMEO}AqEw4Cz zIsXu-&S<&(GuLR1r}gR`N4>rFq=rig9C@-Vf)Jq!dMYap&^yQ7ZM5vUlx6+UblAy1 z%bl3L=3oMsoKt`cf=!bn{p|Kr2<^bZNvBOIvxX}y0=^t6d=fz~jdbdkd*BNyle#*K z?F(VfLlRRFHjAN$%fD3_kGNg)K|l7dnZaK~OP|R(J1trPkYJNMRP0DX)Y@lO1L#w$ znyX*#sSA>BzwaI?x3=C@qo}GMPDOgi*72B6sqs$Mp;#~a9i95ynULKneo>j;#=%r6 z>QoksX>*!3JyiSCTa?{i{;)f}(|QgR+)*AL9v+m+JE~GY71a#AuAv6p-D}2ZR$2=Y zQ>A}k|2(?W#RS``Ye@t;M9oXRZdZ0`9n(vn2joKzwm9Buh)T@nrVZuma$3h0=x58f zx0vUK>{#3%Wz||F8NiAXPK8pp#PSA`Q`-NbY6Vx$s^`}jD*`X5QZM~@W4Oeu#<==f zr^v3{K#xZhV0~X>=BgMR^S^;=EM)rOil?-ptZck8f$3ALnQ;J>-|Aa%yY8Z zgZ<4S$>QzbNzael+mYhfa5h;+SG*SfazE;4NAm7=Vn-5>b7r{=Vs67mj8cZ@{_{1B zot1{w#a_|qc0(?mi=S93_Sg@$7VP!@3Qx1WE*QjxE94WtuybAWArE23uz%<|-h)uzorF7x3^ zA~=oXr;9E=P_h#7tWr<1EFdYfweMzb@cb`2x`KV5IlA0}@3BnbT&}(=1`7qzB~L0@O;!@ZBQ0G4R+hJaXtD_Fc$wL>a)I{#e$HH5Bsga16v*n`-8btVWVb0+}9Q=Mxe<`sR?@ej{Gu#71=|3LTk&lmcO>s+26&;BOh=b zdCWE!J-}XItOp?_<7XnY=osdH9GExwm0BN~lP&mQu_sX&82rM?0Iv}7QxsiZA|F9lOldPYsaE__I-D=H#D(=PB;vFsrordTboaN4*|RW8K_;7tNPdZnnR^q=T+p10&>xD3za zi;og)Z)~2cEz~6y6tv$^%X1lgY{533KVa8}SBj@9fz5}9MfiOhy*XDOsj?Y^;V|dC zsntbO;#U4)3F?zKkKP zL8Qf%m6U4Rc9suEcpfkpcZ?CfOTT&QYQ{BrT$F9wnsz3gUBo{?7`cOv&SC1=8vIvR z7z}B&6<943^gg*w)xS>;0)H2ov2+#b&hq_`u=25GajYrip;JrgYUsJPqdRf~MlO8Q z2etS>6ib%c8(Ro2X1!hSqf)N2q>}%NyJdslHZupb_w`|-?MrhdT+NTqHw}NLX*a$0 zst6b%S+IH_brv;3iX?o|R5tH7_}ap$@$WzRmkB)1?^A|`{o6J>XEr!N#%Z0*v}+|3D7^;a6q;#=h{o5 zENPx*uaN$Ru`BsrI<;?x(q8FO%Y1g}2vkmMn zc}vP_@%H$uRu*eDZvXr}OJxxH_Xd?0|I9wQ`Rg$`_;ClU*V)6PG=tjBZPm}BjOhGo{zTn7NyI8cF;GzkNewneI?>9YfHgBS zvj$nU*$RO+bu*fH#JacbdLHwhaj`NUVF!I(a)y!Hcpq}p9AW{7$?JsN1V#VLkEC3t z8v~Dj*nS=X_XL~I%uY;4Kr0}7t-G(%Lm;9dESDgA!|8(}m?xne-Bb{gT|4v4S^fYN zp2=4`7KMT^ywnUt+Js9>h$V-6@xby8&67^i)ny|E@BYBK4zRZ{SUXio#D&wOYr-oP z&8Ka~s~qQP2P_;}3Dj8m`V9lbWl{|Zu%3P-l?5N;rmMTBmPoxMq1~mhF*gMTSV--x`zU56 z-BvfafL8Ch;&3UGq`w89_vL&^!qtgp5#EceKQe=39bW;AH3j_V#XsY33(F@3rROOk zsW!NLb!<12S&!Q5=3Clg{E#ZtoNL0#lSt-8Qma}K z-K#?JI24Q)VcPLBhX0;qR0&%&*eN9M>n9t4ave-^$mP|=wI>S*cvzSqVKn+S-)p@? zr-V66ZgdM@p7q)wqtA87)*_-0t#AW3SMGitlzrK(re$MGv(|z}EHytm+pr<3*Cuz{ zP>j&Yvoh|SyUnu@ewt~mrb<`34za;f5+H<8#JhegShn+R+#1x)ryt;wx`m=6wxwib z*p^#;_zRkY?#9K?b4ZFB#P+e^X=rVHD}H?IOc8eUMUSa6vTM^31r<}4K}+gaGdAGD z%R9|oKBNuG;exR@I&T5WQu1haX;0CqFK2u!&DVhqN<_VKi5{eDRy_aUci$Ct(;jZI zr00(xKSJ60-UT++RHnJVBs)hucs50&*5p9hV&(I=Y zG0&%%^O+0kjDw-6Q`MW=CZx|bxCN}WW-th~TxCh|FZ>~*OfB2ry;>Qo6nzHAu<&ax zoxm}Dy#-cLl)N;ds@my1+l1Sd%1JnmND6^V$u-EM`he5t4qs+%#DofMRL5$&VCrwBE6EwE1-sP|H`6g>+BOL7a2EqowZF_Dcx2 zr6kLHkT|MP+`{SW|NN(XGY&P(<+3pAIzogq`2Ee_4I8zfv4evzk?Jb;85W)*uh(h! z4{WU8XPD+#>IGf*pY2Kf@#r1BZLpr=-@*KZ-b|TR z5rLhh(XUM>$A_QlwC+yRlJ3?Gg1@#p@+smf0NeEXl2T_8bd|TJ<+Er}-833oAVdRTW3U%sufm>+vdQu|4%EUk6Ez3>RpP@Ht zCT3=bGk~0u0FkM7?BU4G>Fl>L)g~*%g)EJh@6NXH_JmIB1b%ww`mKG}bE5eG;&Xq$7FTjv#}1pjo(V! z`Jo`7-~#m;9e6zZCu=-+m(yda)*C>Cu~Kb%5Gs^hFQ_mcjqI+tKc!ewTDmQ}0vOec zvsG#JhVlW1{5!&rf)Mlb3V{!pwjBg!_R-RgCB_jv64ZXH(^LCq#k}1L(vaJ%DrGwu z*KT-t)hxc}M$W1zivL)dpdGA9i-=E&x!fV5!x+_4sXP{F{y=hO;l=EE79Yb?adu>U zx3}`pKDiMcxIPZT<4Lb7IZa_^|Ax2k%J*@0v8t{F*%X2OJTFm!Dnnk;;@)h9!@8Up z_r-WgvJcb#+oZ;;e#;Z@rLVtHnp`)+g!UbVsgiHn350bX%x75NJ+ooxCt*rjyKitE zbK;nV>bx@Gh<7-^VrB&iAaeCR3TTaHJnrzk0At2)(R7|o<-eoNK?PpiWhFqmd^d}I zK;kAu;0G4AHKtQV6ASXzEMOXC*=A2zDdVlNr{Dsd{V{r~;98nWR zhft|bm4pC@x{JWJ7q77GCI+;>da|4#%WN_{Y0k}|0%GXQ{GsV)X7 z92_DDln_Z2v!G0hfdc^Qd+sJC6l`@C0)$rEs0utq=b?ZO=!V9Miz(QV2sky%|1ao> Yv$WhP&`*YC{1kX--@Jt`Q@4ruAF>6mZ2$lO literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/stackAnnotationTiled.spec.ts/lengthTool.png b/tests/screenshots/webkit/stackAnnotationTiled.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..72e16b4413548f9e36680001c0da1958ef3589f3 GIT binary patch literal 55313 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 Yv$WhP&`*YC{1kX--@Jt`Q@4ruAF>6mZ2$lO literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/stackBasicTiled.spec.ts/viewport.png b/tests/screenshots/webkit/stackBasicTiled.spec.ts/viewport.png new file mode 100644 index 0000000000000000000000000000000000000000..15c15c84e64b04757d994445a3ddb60ab74b7214 GIT binary patch literal 77686 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/volumeAnnotation.spec.ts/lengthTool.png b/tests/screenshots/webkit/volumeAnnotation.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..e6fa107912d4858deae4a79920f61f4bdbf1966c GIT binary patch literal 60828 zcmeFZS6CBW*ft6=Kq4&=={1BR(n0CH7?3KwQlvK#K|p$k1f)oB0@Ay@ARVMb0O`_^ zB2uIVsgWAm&inuW-Y5HbpX}>9m}_Runwe|OGwW&hbFYck(?O8mXS`29KtQgcuBuN! zKv;_3PC>-@GaXJZU*dO!9{LDnf~qlQ48EaiZ>;f3Tbtk!{uo3+80km={O=O{#)#ht z2=3(*65PY@3I98n5BR@(2}|?u{XfU2|6Mr46%$NAph%#hs`QU9;odKk340?G`J>)^ z$!}l;GnOiG2o%l<0id5k9#Cl(8P@Pe``GZlprHHx-u+L`iwAGg% z!}~bx*de_TfHo-lZ}{K7yKBQ+UH2)>LGjhz;h&qFn|AZI^JORBxtHTtRomuHc|l|6 z8RJ#GCcosV18Hee{{qhBI)GyW7qLdh`}=-ErUW6^Z%_~HBSKKTBa(-ME^(GxbV&Y z>HQyR{AXMLXKws|rwa*r`X*j9$S~zqu&!^B4xh_i0PsRm(an?H&H1ow)Rn%XB1q z<>uGQ7v?k$VFZvdW9xO=nIn76*RNmwr&4koaM$B^*R$I}%iCWPt3u(;*FU>%eu88H z@%bltcb9o^HbR-(%e*_k)8+v=mqant?Qr$=Fpa2@rJe!F^SgD0+x6WsnM1RixsaPV z{^t_6JPMaX6+H6C(YE}67%Sfw4&?wPZulUUBLw<$n`qnQ`1as zMeEf;8{$&zcts+xS0a|(j;Giarv|h|@;IQsb#(K)@i|?4tM}V49f|62m@}Y_^$a2; zf4-YcsvAcCU1z(y*tKQ5ntwQV_n|xb|7CC!7zsHqv{z2FZF$1N@7CCEts#7cjieB_ z)MMYVwPitY(lbOhNW6`MP$PF0Rg;rc+p2EF+5s|UDHfmvN6ugx#V$WoUwo)-6Q-9D zlA#`$;Q$3;(t|M|GH*c~CuD&}YD)KJ$~E#GAD=FJ-OtGozp?%t6$aa-J~bBON9!*` z>+g-gb#R#QOhk#Zs{CoW?iZJ?o3nD*=S~hcGhnN&v>?Cs5+yJfn_5=b zGd#*l$WJVl4gX-A^hl{4%sD)$QU!#KsQf#X_JR@#_uc0$>WB(-T=Zt?F*GD7W^!yR zLompY7LuQ)da!%9W}gb!XV20->44>2wAfw4P4FAPC)lKE+9%qgR#vW$krSM3j;m z2D&WB`Howck7b&yf!PMSN6!tJ&`6i{;_-|k#7ZOY9h~iQaJQH3_K4o$jt}rlWR`@2 z1+a1vx6&+qwO2n7d7}PA2EGv`Ol4_!8wJ(i=+j0S5hIhe^l2hgZaL;31KOfwamq_4BV{DzGC%iW&ifZjPd_=eP8qc}I9+?Teyq+rz<9Zm zjiI}nS-{j_R)(_n)C7vR6^9c>m&21^Tq!V%X=Os#Yz$rM)Cy35ej@4kr-s}OMwhMa zv#Co9m)n^ckXr>Gg%0Ic7P243I>_3dZd%@M!mYxMp^Awx4po%Y5)YdaHD{C=5rH(2 z(!RKjM?HfA14?JzIDEpzHy}jc@8vy#Ms7^7HNY1N`(An_jdJ# z@u990SpjNMQQ~O36i5k7dNZp2abFaqzBf72E;5&dIrx=NZ;m08 zo1Xn5Rr^!$L(MXIPLO($!I7T$&0xIx-HDh?A~1F5MLI>{A($E4m=@sRIM75_ncV4D z-3bp$=6Ov;sP)s^zt0!SZ>^S{R-|Hn;WR)cs7N=+#EctflB^AKJ-kbf4ZU}BVteNU1iegIT73hZ-Xv`#^eSs#No$6mKO!Yj= zKB+xaF)}Cdg^Z{dEhtJn%|N2<;fC`!U7xYxT~`#1+(D3dniVQENywbyW{Pd|#M~5{ zRy5Gq$*Z|UaxZ8i7*Hl+d*Z0_Nu?9p*XW(bwKzI&HNsuaga0@f zkGJjEQ&T?@^Mkao=vw+V_AhewJGgEVd0}~#deddokocXqoj1PLc4U=z`?B~DOvd&1 z4a4f!z>%+H09;nrWfqCyp!y?Jdm@ATFHUPa1`ajUt|Sy=vQXCfm@|r<$^m5I21&)z z=J-xf_4g-U=?(eLP4qV%~1AikB1fHr#nLz zv9R<0+}bIXJY3Z&S~88NCY3EVR+E)E%4we~)cMRP;N(q$g}n{kIR%FT=A`Z8$1nIU6M)6e#{wj0uce%{%h;7anCo;<1?I|w}K5MislJY zZtcw5nB9Z$-C$40w{;K+tSp3vE3)zM;o);bmK79Q_78YsP9rs&&;&x6o84I~iG^XQey1e5ILQ4Lyb;JWfe*M(~7)P1)^jCYsL}3kO zIyDoWXR+gJ>8z>Hj8rO5B0t$wlAo}j zvrS*!B;FLK+&m$%{x{|tlU`bl0$@uK1X_BEdsP~&>64l}o^j0>x2IDuxAQ6@^54=j z!lw;~7oVyxKZ(c(p}u0hqxy^D<*9M2oHac3pnNcDx4hc2zdY7^)u9aYS5fJ{yt7h6 zQgFq#Fm2DPMIYTfSzpx?HNBMaS4RaSXkF2d4sw4?iW1mvb`S=Q+Z;#2_z;GbSOc0k z|BcR4HVWDTXW?LHR{%z4q$tyLcySCQ4KW4!xovU6$|r9}XS|7@r8I%D=&>Qmw8{9x-xu1=BSKw) zsoz5Y%cY=y4g*%M3=wyCG1Q(^Xu>3?aR%D{)y4S+7`YPMdp$h*I3RHQFP+lGC#Na~ zH00H;rTY+9#UZZhP}*f;R?wWniwG)?ObG5K51t~*ZaZjo%08W4m&tfkUD*Vbqvz$* z>+8hn@&xrKN;?nn`)3^KC(QxrcP6t ze{k^`3z9=e74;954oHm=#WBd^P!YtLo*&`4qbIRR^&n{2{xl&~u1O^n^vuLRr?H%0 zU*!{)h>P$ag~Tss%-GagO%TR@({&&;mWZP@b=I;CwEjY;i&Y~KF+ers8y>qrr9_SUkj;PvMJN8U0Q6cq~~toNBE!~SbHpEIs_vOHm!U9(t2Lb*gYZ?<5X9>Vpzk#9nmaO?@d zXJUP#2@B@HZGU3l<*RD8*_kBS=ll%f$63d2l3S6}-0-?yj}0?b9Gg6xm%B96mY;0$-z${s zF|3-F@WY3Q)<)j%4quv_ar6TZPu6-!g_wgFGjCic@l#k}<~mp&q+uclC$mG5QIPtFx;gtCfkfhdqQ7_X$-sP)}T~f zpP$mnAsI9)VPB#t#_AYlCWGUk1pg@#?GKeLf!iPtcl-zP1#>v(JpZJ;=p1(hYTAaE zh)g0HcrGS2%zh4GV(L!7?gx!YLi~9F2Q5W;i?u4K^iEzjnU;^$x!vPB{oE{u@%#kT z`KN!Nc^7>XRL;Pcr(qqQ#*$aL8NVv!kEo0t4gB7=NCZ2qrT1&Ctb)bL=pw%6BTMJW$P z^*{No;uggm{U}A+Ga{pqvH&-#1R-saMwH#Q{-6s|vs>g)*Jr}iBP^msisSMd<2cPp zDNv~cFQQERWPq)hNr|^oW{92e%#%dHLa*xm6SVDfwBlVOxO(qVF)x$z38^>$30In$ zKS^pSeAEzDT{9n;qyG5{R-XcPNoVhs#JuS?Q#*7LI>Z8>=3!QrZ^a$ zwr`(I&);0WNPTCx@`Sk|>D^~dk|aTT%-pj7+>VDLVQrlj-U-p#`4r<&bnR9Uswq`t z&^-qBh(s_4*xJsXDPtxn@+1|J0iwV(dq0gG{8j~cC*7d3^Mi8J{jda>=gMxNq-B9B zJ%iMWvtY!O$&;qO}AvPGuiGgI@4lJXA@)rLVY-mD%r6 zQ`nTLU;>n;b6T<{9fTT0nT7t)@qXM7khom*{L;RfbldWS2dQL^HVjgt#yCinwZE%1 zWldnjXOesxmJJm`!(iwBZ4cP`Y`nWCgV1Dz=jl!|t4ui)(@xo0gOlt@v$%ZIxb1TA zieq3Ikls->xqfHWq;j9 zXd{bjY{}A-K(gCI1evMlfls^|5M}HILPsT8%U1bpQmd=vD!%9+&0%fwJ*qz!^#>XW zsAMz}$TuP{PDxx?+3xEN@5CI-Xc`#h6>8?44s>`oe9_&@491UI>AntY0JWrathrPn zdGlno<>CkO)FDZ0Zu1*{j-~0hUw@=?5NF3+RU;hY>+aV zopi%$Grm1J!FUPIa_atBWd_l{oI2v5F&S+IVd;QG5)9lTrLiBUnd)q#OiKpN$QcjZoIi)qBVH$O^M6lPMkUn;~J$oW2l zhR$eS;W!8&t!8|D^Cs*Q6}qZ-JEgiSOTE48Pi>#Ctn1p||ADKB6=!i?(=!Z-<)Svl zWJxc2v52s?Ikp9^C{^&2;L9W|O;3_T)<`WSK_fa~LKuh><;)y~VEnE0Xdx$5twnoE z(Po%krLbx|Nw%*3!&602#KY|gl1)gfKUPHt2mNheL@-6U@uBY|hQezTDqRfkusy`Q z(6LyY%EfxZEn5o>7~N-l(0%i94z4%!$%6i7aGy5fzVa@RL8p1H|01;=I6Dq4chjF- zpZ*AFrZnpC&~pK~6PB;25F3Xaih~;hJ7IP8Y`Hcz4*OiF<(Ly^Wf9WL=eaQ zg@D;59XMw>GgjGoP&LRuXBIY?Ji&9p&b`l9q%d`oCg^ZE+{&%~0K>~iJ~a7-Rc;EB z9pHz9Yj?$cqsMrEEX|vIU(=Cjb-pdhQow{};t{1e0mV|c>y#P=-Tb%%`m7^$g@tu+ zNi8Cq+R8{FBv_~ap*n9-kWz%8m-Xj3pcwtXe0py**>)hQYsG?cxZ>UDpvxyQTIe|k zEQPHcMogl_2viDphA4T9fVk{78Koeq+t1_EX&^*BBhQ!%nkid2^rRtF*mo?2g_@sk z*~M;Dbov%xRwLHvo7ZwfLT_)a!>rf#QW8X>&*{W7EY%!yG<8;II|rB zB3B3ovlDPWNLJbyBxMA3X;?q3`g#g*B^hnujPs%C9;lUU|)w1}e9fb11tVY0? zr%Xkp=L`)q(ftiN%1d}e z4Ds~mR2*EP_N3`+$JJ1_H~T1!lk-8Qkbyn#vz3tH^8 z9^N^vVBeET=&zF=txt8==!DrUEf2X@WoAMIl;I zLwQ5-sZ_-JNfDk&0Cz?1VU7d{Jm|!CG%Pf++#fWQ_pPQ^kJh>(Qgx?P?5z}>Q8}-> z$h@y8`*A{8Woyt!H-78*4+%$kED0(yQLMBM%CXx!xO%E}B;8)DrB(Qs!)FZQh=^SuuU55VCR{6g4J?R@4YkME6*H(*EKW`@}ZzkAniX-`zAE@{C zJ%vO8MC{TbcmqG1 z)z3DrWO;y64Zw9W21Tfs90G!S4*c4O51Fsk88$B=A*&8pe*YN_d4*k%pnEq`WK%`=p zB3BfMkrt17Cc)XD*@5vNyZ1&1_@h$SDUa1iY5nUGlMiz#HKr}D4NUfrCy7gYcV8q_ ztt13Y?P|FCd#dSLyt$de?27#fNefe3B?(?7c?vmt4R3=&7yHDcsX|wkfiOob5gB4o zjgcxANMpx72!rOq{Oouh`i*V`aIro&`TnY;Iv4KW_&%|+Qf>-+IfySERL3HOPYzly zvioDG+St9hoe#N)>>$DZ@{iOE>v*3o0Ysnn_~pse1pLAM0{&r+FzI&3t}&ReWvV z6sRzD?eHp&i}1NtP`#gGPTlq{c>T%{MHC=&kwX;C(x?{u6$lLl3I*F1^s=RHn_hoN zcvwcU0_|Qc&9+k8le~m#NUwN&X}<-146JqE!c!QeJ?8Pe2N_zWo}WIfap7cIF3=wv zjlVsG#_h%#cqLO+m?_S=WqvCX5B6_^m))UmiP2w=A=8oaCk0CCRcUI1@>y74H6~U< zKeO{Ki7r2{0T!Q8inf~r2$}cu_O%@k)i(HTUl)*aeUpv#ba7$+30NG<68Iqj%NyM9 z@Vh85p?V6o^Le|HV#Vtroc`Z!2wBdil&P%Ow&#{?6%sRQtpJ%Xtq}L%HMFjxg84tllqBJj-}E~7@G|$f-+;9& zvzr2%A=$QK*7B*3Tb5e5oMkv;Zw!QP?B+Ve;DO-_=Ap*%3=3>>daP0N{>L4fY}uyg zx(pjf@jmUgr@!#^u%HG}&Fai118-f6Kj+C|-RojcNTKJ;!}WSpo);ejW!}j5_yC#E zLpnb*?<8e_><$UammGQDQJQj>!+&Mu-##yu?K;a$3FZpbmihfgh6+DM9_3d`7&vr$ft2*GVCd!ib?1Gd}JB? zhGd-0obX7gd)Qrj(DwSh?lC0o8Dh&PgVY;CG1wYF!oG#DQk)&2K_wIT-p{c56>yy$WkQz(K zyVDod{m!X z&%C6*PL0R+5F!}vqNdf`XzRU{(pSWYCrB^t24STDFz6a+xbw~`CTgQY_7+PJYOC86 zk_vNwLBKON0Qj-}sv6=PdnD>r&sc)!K4w79^`y-%<8iY7$e$s%+adCXpG`7xKXv3? z{nwdRnsHxNa00V@q=?mjE2lN~&0-gQjMUy0pDb{Sy*NitH2&R^PMd+MV6gdX|!r(cA~8 zhQ4Iy;Qm*Gf8|YbaXgs+p~>u1Ho&oZ|L{zB=f&@s0S6*bf8;O2!l`>;eNK;7QqQ}d7b;|7TGpQzNw10 z{H5;$(nc|RKchI+!pce?qZ{)%kLH8?1eP3#Is-Oh+6*g}o3O8z*{;!Sl@?cvbMf9+ zmQ<3oNPO*9!Qy6V{ATHhP5$Ecyes5_W2JU|J5N6AL^)1OVWa3e)AhcrhR66eQ5F!^ zsdM4Gd!&2&rDNvZM?vA^{o%F$7+9G=K|ZTAijQ4qppWt;2lCmhYWjcwT*Gggv8VV`H<0fpV&+qS`1efvXA~z zWV+1udiW3 zx6rxeUM+3Q6GR~*ymi#SWf^)uTOR)Fmwfe%N|FY+d^zS5|5c&`?f3V)L;~Vlr$u+( ze)jK33m5goq>rm;#QOOdYP|IBzRMIdDn-;J(61q<)z4-X6Pj@l|5XO>s3>&!FHs#sJA|? zlB(74K~#ci6j-*ZWMteXCIO1CJ9!{i91x8yiS>hj9bP{Ai^xYhMu=m5zyCW0mqkBJ zG0+>bC56sd_i#VN<72D(Pg$S~jVG0ll8^}R#iNI6=1LQ~%qA_J+j55tcE>p@mpK)A z*F$+`m%;%U6e#HFZ#we8wRyoh><-mM{NY9XT1;o?9}i7=-2Te#{(5vM9lO<^^K<^> z3!c133XA@-AWh=$znNm#+1h}qs$RbRG(R~0^NC$$WP3}Yl85Z- zlJ;WFcy=;s0J_}O8je_QNtS?*JoJ~-H1d$rl@Bi<9AIUIi!g;|+s@IRV4npUa<={be*Uq1}zZQk{2&L!N^)Op&HlP&S>%}Q`! z|BPku{38D}@6m7Mc$(HTC}_yOr$u~0>rsl9-m}Ev1M$&U3Z046ki2Tu}sH0+ep|pzV4BNKY>D!Fy)OM=Q=4ZW5+77 z=VHgQ6sax%4prCHOPvQv2O`6M+c^@T*%ckE99Mz_kPGVTh=S~=u4bu)THUj}SUBz@ zK2i#-;XbkxyPOgrv*A0P*N|swNsvzfHl~eJrH8hxZn%10zQ4|LX?2usIy)<8d0_cI z?-yC@-}^1nTY$aQ`##1!G(S)o{%)LAEW$?1=#RBL0h2;2@VC=LUI%)~p=qE$+HF&>2n)EV^8P533UDey@E^mBxZBbKbM1Yl|J`UnS55oKA zx^7STx?;XQuGRlKjpPbk%?wRae7_XMLL=jxTp;VXD|yBLE$Mxj=Nur}6Bw)r@)g=I4ePFu7JOL)^72SuMwt+Mry|Z!|`g!TWQ;Z;ORC6=Z0ud3(i*X{n*k ziH4~AOOWCLHLTSiE0X!T1kZElA@1Eimnfm8V(39_t(97&(aDWuRl9k*<;8nT`WP<4 z;XDK6ldf=Hg~<0TooX~>YZy0{$}k?bgq#hkdFiFU0p4D31xs?h`GxrxAN?;fGQ)f? zyd6jneOMuz^4(4}scz9D;kuHTic9$gg29H`{{*?j3>v2+)eb}sF8pbm3Ud5WM267} zAX>DQ3Fm%DWQ!y+K~t9kV&U@~+UGFc(;1~uu#qTq z#Uz~p!Qs<6%Pw4rC9Y%^&y|p1-So@eOGgK74GGpXs-RLlC7XRB1S)OIR-vP-x~cCn zG|`jH&jpo+1CK8z1S{QlL3;!7rH?!H;b~EBakYkcf;MaFw<(t!xi;@P|M6K(HQVaqb%MWxoX#l;jv0R z-5KsMPgXpOkZ51y?D+YGfBk$5ZWBfs`#0*l+)@(Fbz*8eFbBwFZzYuTJ+%yRWCaJ7 z2k-R|S1ll<1Nw6P!pjsW_9uq~PyV%ybb4}__SgLSAWlLhZaUqf12&Kza)Jo)oR2;~ z_Obo?CsO6;BZclctqHBSTbMQQBifvCNdu6cUmWi#e!5X8O8Fl#tJnMJ{?`{@HD1+a zz6MKkmk+@y-wlntG5tyf>v?<$56of z&y507B{4MpxVM*3!eJgRN=Ons$mbWO*#Ugy{XAE)K8~PAXSn4&Be4_6fw6GY>rXWsL_&A)UIxA}FL#@g{un8%toWEas@G0L z2~y;w>iD~bLZsD){fU>B^!e~3TYC%@D+>Vn{71ONP)R`L`F|Y3lmy54`$36<57`AS zK-WiP@lzXMNR6rmb_RyED$NcHqVC>{n19}B#p&A|`PCi#^yI!iSamOPyg9Kzda7a5 z!q0Kcv#c5`8ZTuNBpvj-h;{9fD8ThSqerLfwuhdr1JebF@yPAF4yq~OY%tLJ-h9Qt zkE-v``QG@4e-Z_?gXTXa+!V|i)c?j?pJ4RajI*$#qe9_s5~E0q)`Q=%sm$CTHEf?W zn{X>>eRAUH&J5&k)X3~wax8>9KoeLoo$tGVL$;6U?Fk9QHZ~!zK})L-_HsPFSQsvP zOS5iIlIVt)lh08|Z%Xai?Z0ePiVWD?2PBpR6h}D|2|GF;>>Z~{@2MA>TA(Vg&8fO( zL9RlI7wah2l}p(f_>NO`#~ISfZtidsq)RwIvJ_g~T7!g+7R%H}*2@}?qz{nj|9HYr zB=xs<-R12+W6bzu)B$wW?q;Q&Da;)S4xhkg49JNPmhh$1w4EfTJ@)hTqfNMOC*~tZ zga2W*rGk##Kixgmh3vQbK7M5cV9SuS+9l&dHG=|)cs3rG5wUO1a~E%GMOty1v%eD{ zUz=RBU>d$Je}W+iTAUV|+wHG%*4l8KKDcjk-^Mw^JXajkz;~8Rz;yWG;(dV9&dy}f zIt|vSWB0{6xxV}#8J)iP2)Q+YgYUu(&*$!YPmjJUv&Xy-{K(WkKY~(`H*GE>IV0Cn z!i;7gI&_LnpB0*({#gd`K<_C@CDJR8*nWWU)ZN#3Hd4?Y{h<%fo)az+48@2d(~QPq zC|yIY@Bm8ya(-AMVTx>iooyo}l+C$vjEH#SL3R@3DD~&nJw0Lu>1hE1t{jTih3Bof zMN*Tg@8WpkV<>LpC8OMKZ8||@cpRFPX;HN~ob}Xu-yT#QcXj&C(jhb}RHgIos_TyM zXDtbTU2iy3_9_vZOfEmc{2a%4W=#xsxGwKxL#j6qwri) zL8D{etJ(q47+#66t!C@ zKx}j2UJDp>QWLGX!Fn)k3@j$w!%R|KFQ`k+4No8<-Nz`-+=MLsBHb4UJLF;NXN~nE z6nsG?4s#nm!P`FlKKuOKcuouYRxy9|T*&+8Ci|N z6o8hU^IPI(**fXYafu87MvXR%t`v%EeTzsRjzI*%}ssYfPShprWrV zZ71W~%~M7M+nmXU%#OLt);X7#NDYs|Va!0Dgm2d5aQZAdlLw#q;siE(Uj~twjub@( zjVe%^`fgZA`Qocq6p+7x+==Xcm)g|OUQV$jGffEwiRb}1DTX_7$dS5*XYhNUr|S#e zBi@A3#EhZWjq0gC?UA+Y0E8r*ah_2DprQ&Qi;s%l@c8`Q-LqSt9ZI&;E9ZSI83%gi zIX&>v(bV+hPnc(GS{hrMMwx--f}WrMj;7m8M1VbJitgq-r4p z&sKz8t0SFmNS4?V2Uc`c&OBM?RxD1~h_*CKS=YIjVz@?SbCt^Xvpq%UjauVQOG|em z*d{qcn48f3{_{`52O9WsN6cukrcBz!JUp!7C?0VcGP$he{IxBkUH&!3p$%r-Oex5V%#F6iCRrR-3+Bm>b4QlB2Ho$;nG4TV2@O@P}MheYF#A zcA9Ooxb2k#2BwLdH;`F`BqlaVW4*P5FVjQ($c8jQ@^o>BtWxfFv3YT^zszdt8z5m7 zerOAzccuX#RfWN^<^|i2fhF_id`Z*~~r5gbt#;_m8p{eiR(w zWq;kLOV&2eg`)x4%x$oCx`p4%>Ylv5e}HO|B2<{yNUzR*Y+RAoq9XAVbUWOeR+H39 zE0h+dg2w|xYtGa(m3oVX89+AcCsTJlB90>}t$!<;sXv=QlFL$2Gn@C`?;Ny9bbtENaLqdlMQ;}Liqo7SqxF@7 zKl5T-&J^W7*LSJnfio11%&z8OGKF*rCLk(BKDe;Uv#)e`P^{lP^*^B9*0^(}kM{D^ zRRMRO36L_Mrp>&!Nyg?&5 zH*r5oQj~J6#gL8AB&mXJ50cf*ZroBTbm{3oV>h|RA6omw+6fsa!2e)gCFl~X9O|i& zzNN)ux|?@9Od0*gv{mIU^_TtS_m%7KBC<^<2%>0nXaMoO=1fXA`+$U%`Qax&d&mrj zdujUJyv7;>{83*$e`}=|wUrVMA+LSz>edxMy>x*G{FzIagG;>AN|lsBJ+>~EDb^H| zg8bUTO2ZBW3l^W)fhhD8%06^^LPE#5)qca{;7NNUxsp-K*16+ zvjxH=zrCV%f7JIaUDEgMsgYgz)`(qaiQWjDl0*k?voaSOZr)H5Z}qQ$*KCU5_e_D= zN!o(Qi7#Y1xYi16>s*J+DO>>yU*C>izFIz~XkY!4E_7XLz6H5nYmep)TqQNd2-^nC zXNlFkcfeXXFAq9I&V!l&2Eh;fjB0bIn_F!c9h@$HBKkH~cetOTqNDBHGl1L>aLY5w zV;F17XkXz#V|`e&QNMNa04Ho<*^Lkms$*hhPM z{ibvNE-@n}ext*bwa%F4v!~F7a*ebb^;vp1K>zE%6*VHkO*ZvFuZ*5SLKWlQna0P` z{8+027f$s3cx-BcQRb+~8C4(dS1I8_=iOX)!#D&kqJ)~xqVH2(J<9$iwP6e3b)wE> zHavwrbVw0&@aQFophoEt>hq zG25jxvFk;@%P``rC>}hH+7560@pol(afr}#cJD%yUQ z`&amLLq*Z@4cNnQo(Wz!xiy{;owqdbd`#sD^-w%X>A@N?TR5uQswmcqIy?1v{z284 zDgmk_UpJu+yS7i2>?B?|QjK8O+W4$<@>cM{yrG|?vkH&3ZBP+HE`}Um`0P3+_ZwDE z2<|MhoSOGb|5mNg{>S`~(egt?&MN*RS+h&}*^QKD#gO}Uizk~?kFuaCg10`1?U|2w zyb_b%Xo={c6UNE-D|y|Gk!xK=?)#4RCQ*?L&?+jc0yHVig-xRBC{mR4I6!gX?PdW_ zza<5e)c{u zg7J&ELfU88A)Dkw_2cpZR<8tWLRh!aLxhwW^>5wY%Vepi9Lmo>>ZQQW*eW=XFg>I^ z)XqA1wCvz-*7j$}f!@S5ER$J&1zh0foD$0Z92hlU$M{rBT{Hy@<4}Q)aVkB{l+03n z#`Y_mViV)FLGv@IrT5N0l2E7_4VlC*3IIOnQF1*SP|Hr^TLxS@n+syfx(9b@(ABmQkjf64CT9ezJAv>he&s&|O=SO7qSCn>|S5c(i zG`l9T6-dXt(e8Irb>MC^OVn70XUaEKB^{VzN?#uwTb$)f0sRJa|5(MU&*do{6&Q(| z`iPyAghnMsImHlW^g=Dr^k+w^s;I;|EU*c0S$27%CXkiwiZ!d)O{M)I5UrPh=dz|w%WlsD5@@V@}Uva3#kiV_-z# zi9Xzzx)`EQA$iFR4z5~Dv&thPaChH-D|4ndCl@5FD|28zja=O^&wooi;j7tm-^_c_h242F*6C4-J>tXN z6AZ!eQI9w0<5)AGj?TsW0n|;f>jH%rkMrl#@l?Gt!XN4F8(g+tIpDB8$p)~p7J*Je zl%zbM4krqOr20>>3_tVm&M=#rJ>3DVRQ&)hGOKKGwO@MO}!IS#7e$3x{(t2maVdV$B)}gT0HW zXy8}g(Hko=cf9WRtFID0@_vnwXR0gn6HqrS{jVJ0uN4^v;{2UQevEnUhDnI>O~a2SGKD*Czd1J8tk=A=QvFCHu)WO5MsZ+a@|%?~6GSm~ zxV#}Unfk=KZZ|6`{tfBo3q$b8ctY==b4Hbn9r(C8CAHC3+l`6g z##Iy_@N$P?gVj0%9Z_zt;tykuC0nACJ?%JFfWqZVd_{sN_k@gW?T^|?Z2D;q?;TK( z6fGw1gy{AMN{`W=PzNM|1>R>Q&@|Qw>(d^9b$CZ8vT*Z|AI?24V^gWo0@<^35uz|r zaqsVAQqv{me#iH2Apc1GDW%+t37yWx^>0C3CQQ@;`i&C?n@h~rVE;bM?AN0E5|!t_STL{_6QxOo1jxgjWVlJdP0pw#D#)I> zOs^2(qjQ*mxAN24xH{(#WO7?W_zLW^GDLvXyocEQWL{I+bBo};gO{!1(;+fkxJ}17 z<7jh2YKvswY=>*aTy@O0fQE0YcMWt8SbCl5~GXkW@XI0m8c#fi;OnyAID4(;uHU zKxL%sb8c%0eyK4&1!@dE)C_!nRxCK!!W4q&yK&+xrN7LkQqL5c63T zj5F>AD;^`~6IiUC0ckfe_p8R7l`aS^t$8@){LN%`#8zZ`sNuM?k<| zt1tC#@4AN=mO(`QyWulLFk`sX95xj$?DLt;^m7>*6R*(tlW2;!CGnzrFx{4U^317y za`_--&*3FJ#V#y#;nxS*JUT3)t=7s#=DSjZ}G4&^b4U;MnNhxi2_yxA{x=ltr?H2cv6rBLZ)%WHvmuYh50l8;3- zYcxW^N|_*D2lsdGI<7X56wVX^-pRw|Mve3VjgtzMYNv{BE--Uaga-hsjFcD!QW@91 z@0DXBT7jfK7IzyLbOty%pw(Ej>X5Bf(O3ZS^}gH8B%Rm1ise*OFo&)mzyPWBzT@a z;s$bfsQZMkYC&vl*hN#2g1|@L8;1%4JK5GP79iCDrwv~lx`CF>-SlU|O5!z7nFlo( zHS!Z#!FX%lf{z1-#Ie6f4Z&}w8b`+VICSOg7e0Ppnug6k{4+s^9(nY0Y%o1v;Q~z= zZ&dJ$^qI+}%-=6_oo9``rP$c#rnon;dABEJVzFx33lgpmiAfUn=U?X2WoIw+>C*V^ z4H@pKTIF5#mu7}-kzIk_>^)_RZA`*eMf-1Mw)Q>gxT$pPu00L;??)HDU4W3h0lU?u zD3BjyPD&iHWq5QllkD zBk}I{exB#~XaC>#uKT*q>o||&dr}PcQo7PB*;jp;R*qt6wf5i%wFTto;@q=x{&0wPV4tqCzRa5sJ65m>S8N=(7W0Lhc z9`9{bEpUQq@i5%w?mt`Vb&z!S8}EWm@}f(M59-bqlyP@=0iIm&FfNMB6&^?xiFD-U z`)ba(?pGiwTM%c?`1gK9u(M6pcyXJ#kwr_6ktxpXbxYrRl{t)Sb*fjR?ODfwllBCS zCO^S3#}Q$4Zg8SL_4p(*c~`+~IBZ%%Buy*2Y*q22+D~?7&KO@i#ma0e1!GSwkR6Zj zjF*-y6U23GaA#dG;PL{#w8<}sSRo%sMV*7O%!i?1#rwZ`s4zs_K7&vRk3VdjXRfMZ z6YG;CcIVYGuIMrRgSrC{8E2erd=4leu0k4I?eNyQ19LG|Ec<*>2#uc>m*C_`*(u!Vc3*iUT$S;tejlkA~EgysTMbCrNoBKFNggDZA4}Vko9@Fd< z^2zKzHJ9)^WXL&tI*-#b>VW?F4OYv-6+UXM3? zPngT7DYRxavs$_>zxdj*X3L)MuzlN#D+c0{DMxEA5d(^9oAmQeO?-$yt7X?)(d~-u zDJt6;WvP8@FIxmR_~w#H=W5Mm_pjyMRqni{qfCo`w9kJ$i7O*>k6$w~M?qYbcig$R z0w%${Fk;V(elhG!@}I(94I$JYVt_x+vH0(YHMHk(l zNoY>CaHgzhe$gWtBn6GjTpTOwTHOd%`?D6Uj-v<**V|R@f!s`O0$wRQk7OhIug!+x z##CBJ*Zdi9y@CqtK zl;?^vw-buml>V9c@Q#wyu~C_9hXnR~CVkQRnEGm6KeJ`j|E$(X?z&e_`nqRi&`y2l z{a-Y1rJ3JFFBl|fXk(Us^Lt~0{TM2Al*Yuj^1+Ez4bk1+YqqNE!zQQzHMvz>6^Eaa z{xT~Fd0@bKW$oMW#_r6}!sKkl@}_M2M5ZQa`=pxbxr~@74}^PDTQ7lU2L6(clqHRb zlctBfnuXnG(8$kL=CcTX4b~HwkhJky0(n-R6**uTF?An7-$#Ue;Cgs0GT6nY(MOrD zeWdXmw!#oSLja1fK6c@Cb*1jpwW2cGE0i^_O5u``;vrJz`UBe)u8^%3Y}N46PMQqp zE6MWTEeAt2lmh!%%z-xB7m0G0iSc&Dg8@#>>z{uO$lV^17+%2j1*MwD#|Z9@C1^XX z*a#dNLa1P~*)k$`7f3EzM8qE%)-#i2glBZ-3i@~GpPBH3@q@AlwuQB=qEgkEqCclU zffPvNT*xh`JDQgoeRtRz*z8=5V@o6lEe; zpFKgUJZME_3JSB!_VY}jJe{=@h``4;!SBVBXyWoz6LJr?3=VXydKYC?DNP$>qIOSV z2x&qQ^IC? zGvY@(OvbuUjs>+;={!F=syjP4wL2uQ1Nn#b$;lmQ_B1dgJeXZKLGponMfj6EH@NRs z11?inb&yJWFC)Y43sFXDh!kCHtlnxLV4=PS9o9u1=en~lWDh{QxkCp9+0&>@v?=Hm z%mtN(RZgJbgCgdLl`v^X7L`*Xm8&fp#T zd8c2hzlYOsEa!}N-UX8i! zi+V=-2#g#Y9yHroP@sylYQ-0pc!?Kq_6qsOYS^jDW0Z1->!LQZX2)LX zrrpbvU1Kl*BJvcvscmZafu*)AFSU(KH1yWLb+HbXWi5 zEDc4?+OUM?=83YzX@QGBU33R^ytED~u8__KnqAY%>InpGvH+w2-OI*7kC?hRrFcsN zn(k9pagi!AM!yNonNfgG#EwQvzYY1itY}%~QC{KSmE{*7$E-+i+7}xfbB43i_s69* z#JvfQ`VJ-d{IQ=_>X`pyeL25f%L$A1XSw9A;Jd5gb)iV0D**%sFzM?aNG+(QqnOPE z58+?{stnWJuR*>&|AqcpOr&SZRVpu?JDwi!nfsh?Y#89EH}{GR;AOZUJcrs6qq>`F zkr5;W!r8;@;!gQAyVsfai)%!}q@>j9Ag8=qlE8FuqB`wrLimN4Wu~gUTFE zq8KY`s-bV^GcGLD5Y|*8pnb(&4G}{t+gZ>N=b2E_sQ)gZTz9mr&s=!De^-iy*ejB5 zG7zjhx@Na5=0AgR9UD%%l5Qd9w5{hF9J9^9{R1uTO`GC#Q-&a;Ldz=oSa)rX!AU{( z46j9>Qn`P%a_Jg-9e=Bj>rw-O>D}pF@m)H(t+K!saycZFrPAl8gQ4@s z$#jsRHgom7!efFs=2cnyT>_&Ze6e6@t@sCKK;_q-;_y(eGMd=iZ}f_Jbny=J`GR)# zXl7-68itx$gze=g*H8;<+J(Bm7T{BvPLC%d1zeb1-s~8Yl28P4g8y!kq{W|YRXrv2Xq zJ=2E(=bIYM^>`dCaywpF(uqtVOvzQ*ZUjw3bDw0R31H5Mbces7)Ql^rNh8|d9xBL9 zN##a|T`Wv0feBE|GT<|Gb}M^Mc1gA;!2i==AC#1`V0%18&f4!k*Wfo&j&3GTZ2QF< zE^<5kdpcDikMbh@3TC_6bI9>vD{&+NLE&S2j}YCsjNpu^#NI#y`o7ctcFf*(k!F@G zmdg5ts@%5wA*>iL4aZ&(fJ50J8bzS{W{8i90cDFZzb?ulF`_oB!W+j~=WW8{H?-ml%LlJ~yyxoKFPITQOz|ax z+}t673zNE56mBz`22@!rEK(w3W1pW%CjWw7Av{?urS^d*+?5oH!vgk`4Jw;;eaHA~Brdmrx2<7FDx{<2Pxw~;_l|<%MQI;!0$rqH8wM!C7b-z)f5tnge{9P?_ z%p$y6^#bD#h=uC~CqbSj#2;kk-k_eW_e#|8%3B1dZ*cX1H5~il`R?*IoL{f|x8{TH1#2N=)@#1|TS=(*b=~1u^MQA} zML^s5Oi^FRiMH>_PUS6&yvJ5}H&;JMR_b!w^86>N1Vwrm3)W*v6kE22|$yQZMSQ-F(&43J51l2BGNt5E7f z@*PIDsy?i?p$FnKx1$KzM5fU$PN(%>W5rO9LcfAfOoc(5!m~FIsq%!JY@Bz4%a3R; zAk-&`)19s?7p(74DppQ4rBrO>_-8YwazE@yl!=)n%M;!d{G^Vl*`X=GScy7bwm~~u zwv}K%IXw-~)pYH16aMZze+O6D8{8{_7z5N;C3wzLyVIesxN~=ZF}04X(^ZZD@m*(@ zKAE5KG7i{iMgC)k$-g-k%&u2O2M!jO>NWw*PukJnJ12tJ&cv~AjdcsG5KX&(5S1;W z+9hZ9dBJR2-~ei0FsWwg&l^W7mjLkFwV^QVZs$0Pe~^b>P-eL|npO>L}Tm+k{b=ZTIS)^l_l}h#Zc(C$)GKOJhd# z_$+Qf3`Xol!YAr=`Q#4k$2N`4*G;=%F&*^Eer9W4%P~JzDiA;NnFsUb=Elc+DWpsq zfU8fC*4PLh0F!+hUdGSoNM%02XC+C^M0%*0L_s{{DVL4}CG3|YZON#QQbyX7xz8!k zhwfxr?#}mkw~-3eVJTv5byfp52(H*dB6=PIByg*GNhxu;OKkE3$+Sw%XT~OQzS9*c%Py#$6P)Wh_h^lpY2HSE z<+VBTYzk_)y9`&lzGe7AI@iB!DO;qQkjLt6`^mn>o+=FG zvt_GK99N_KU>Q)T=dv6*sVpH?_D###liyVTK4t>mb;taiVa3_%gCAtfjy%tfjG2wI zIm(eX-+213JMm`90J%Stly#BpE~{8qSmtVRcr+iHjKl>y2K!}tRu0kM)rqBSAuSG<5n3jDgKV4;>bZX+ex?3O8S;L@A=OLY zzNLbB?m~A~(YpW93d>4iEI}$A!AxY(O>nQu1%-TjJ}+8bhiZaNgxCY?kbU~|n8 z?nF%4;;-MQW*-XE3$$$I9i1^!8 z3%k)O8o<1Bgnt>@epw;>5~Pef$`tr?K7N-d-;$snz`S?yek1|r+VH0A*)DYJiPHfj zDY?3CCP4>zcw-Etri9ha(uoFPqCz}>UAh;qj_B2?nZ%LHayO@PB%fQL5R&+}O6Qm!D;349(BpG9ByW#DlU@4AJ)Fl}8J-@$5> zphf#}=7BVy5Liu)DHX&qEa=@$-v2w@&BaV-z{gEh3=7G87P~3`Y=V?)ZJ9-IWRE7% zePl0-&CMIi8757KgxF0)hn@zU_|&bBK90kANIf&CCIfu`=IjVZN0PH)8m;TDJgD64 z`}ecD9(S{mT$0J|@X#shkyOB6KqY3rv6WQgr>k_WSM*1< zRB~fnd1cZcXN;sy$m@LE*Is{A&aM*_lC;Wmw4PYpCQ6N{T5}j9>2T9-7 zw)`OJ`p*uU=)pa5i-^cs88z#gvR1dI)PEu_tYh4x$CzQxYd6t5R=_n9%vcl5&{nU| z>2Nu*a&L4-qvh}J!rRfha{j%Vv|4O6uzi9y<3#ClONjHvL&pRIFE{J6vp|nKn9V9Y zMGEl_Km*Hvl8e#2pBctTeyr!gju@@nD8`{zr{Ub+$9$N;VA+`Abj)6S^Ga7z9 zBs0e5wErYap%*T5@H1PNY~-u`{|YvJ?_j~+FbeS~WDUAL59mWB>#9O>C*hy)?|G zPI0#`K>8^;?F@S9qFOxd_G2^yUKslMBxBg{G-dm4Hy(Fl8{;mLmUS-h(y1Htph6-1 zmUIglKpHX5ll!XIf!b=IUJX%Q^&JfZX!;eKrHtddj$&zXclH;qVm7N�>Nd7r3~j01NeK`L z(c0{$vhFh71=$7b!pfvgtIBK8Rn_jS4{i|}Rx4iUKF^9vq-f?9wJ%a|>Xj^l#ZscB z@awc3_mik{dLJr_vmIqpV-7Mc_K`jbbEFM~xyEgjOhRO(j75CpiT>wfauI+b1Fuvm zY}>`kXGcZ+W)8jdGt&AmdGpS<(uuxY$R_fm!gkzd z{hOxHliA_i3^#O-nUANzV-}O{o-~UYUf!y$D5cqjA8sYZmTLN0B0GOkV&%i}VA}lo z70Js%o|dU~CU+idfPaQqkOM{AoeTxOl#X$lF3pA0oF?^K^6lMT-Gx$ehbD51$IoGP zJmWER6OZR>8e0&(9vh`%07Qs@e}6w(B7L)Bwt30nBlY&ZB3x>CB{^q}=6><2+6aKr z$E7Kb3W{lBk)#|lN#1Nzaz!+kQOU^`9+QtInbui04Jaur%Yo$0A1hU!|p z+4stZ1KfTzolIyBzLcUJ{Z(@-M9P<$eHvXGB)J3iLThOLInieDd?lB6Gh+ty`?N%A2-{o8dDsW? zKg%!i2PE?o9nNU0dm=M06PLklvkKH$rsxXdhe7IbR#DfVH9bEXrgT@G!`AGUsJ}{Y%4Zfai6x-FeZz4^q z_t?Km9H|B)w|0{{vmz9GInuqc=vtqS6|b6+2X^FB&X4_7({s@#G3~$ICtG?OkRUdj z&RwZ3c|)L4h{A%#Ne~^O597$78}N)oy6~x*gkmj;JU%22I~wa6!7sF?`=AFz?%z`n4m4$`t+ynyX+MUII=puYgG2+2V2Fqs>oGNmOpQ$x&2OU zlr-k8IMI7)>=s=2LWv*)M*|c0E2wmJC8}XQ_KnQ&04iLzQ{H>p4=xY?tDS_asJfTdi*B1 zs89D*2C^0|89TV5Xfqgp%mTO^R0eTHVccLo`-$|$D#nAKFF?e!waF+@?6)#spZ)FS zwF({9l8Z$#r=M$meq6>8@elve<~y@l9F7R8LT?7TnXSi{ukci z4kICU#@CQ&8V^g_`m9SeF4hwPJBziZDEN3?$os^j&Hn=X1kPH3o zQ%Lj1Li!r3Ou_0fezH=5+IWFNOQ`HfY;=<78vq(vSLY})NX4Scb;EfNtBBqS9~2)D z9&kVbZ&FJ-n4s{NCQJGL%`Kl~Fm_ z;ew4#O7F&-O6M2{X#t}wgW7}zA1$C=AN)}MWd54~5VBJ;tXS8P94C?^lvkiYwBmz4WeATg`Z zeM(L7`;PNuv3pjSU{=znBmY#ex|Z*3ZEYW?srX;Er*mQ3>3_s9dBsFDBC3Bhv?s{4 z$xGd+K$BF!^~6^!zCjvyUrovXome)$WrQ9Q5)!`p%FR$Xq%V}01TarxV!W@`%p;;w z*p;L!yUB%@)~@e_{z?fg)E<#|u}3WEr)T`>ubKHx_qN&HLvsmekyg6}-g)1DF^&(r z!L@iqC`s`>DaLn`m*zA6kxWp>H?0semCdpXkPGpGAQ<7- z^M+T?)Ha@XAc?`{-TW2(+M4DXX*B-Niqm+PxJ;2}dDBfR(}Kn9qsCWxP0hHWj7YeV zZwr*(jMwWWNUFFLyY)ckZEHo))!Nd*Sb1vyIG&D(LQs#M*hs9Xi}qIlj|%`$_?9Rs zj%IK=oCb&d4W=rFMy{y;nR0u86xm~+4t%40xh~oTk=Iz{U0!)mYxazZF2CPeCvChx za+v}2bO78H*NcMW)EQA0GrP~(7e653xa>&x#OY4IrE4(mQ$Ju*5DDg*$;M<_nYg-m z`b`2Zi5AsHH}@QwZhfYc55>_I+t6mB!SPfH328l@vo4K!KiZ($5EZv&T$hJQpw3(q zgpXyX`>0&eRqxh7mjxZDkz}P8`E*Uh)fHa<6Rjlym@Bs2oJ;I%v0(%*bI}IY8B_o- zOaJ$QP4NNr#DotapBSOav)qr6>bYwJv&sq*PjrwkN-HUeZJ)e&r!x|C3o-TU{xPd> zF&(S#u2GhCc4`_|X=1kxpH{mEsO4z&EBL*gm9bG-{c7(7VYx!l0YM7}_} zx%MZ7wUvmj#&iGN&V*bzMP zTYbMhdi(Fd(kSrq)>LKTrW85na0nOZa^-MqK3bEU-6U=$)9p*);7k zu0ai5RqN(3drd+>oLA5>A- zQ6cZ@$b?qNLBgI0ZHYxB3ARVqdVubFRk>i$p3m@NY!BDkH~IbAq5PAsFO{6P_^=;` zyNP;z(DBj!D{t+0HszICk|!wHtJRFMJSzA$l2AnKB%eVR66l|=yAADdSq;JZo&Raf z@H?B8IUV^T%=e&a(Uu|%}j?!LPCPv6Y*0{0nRpxz0aYGJ-k;Jd3#9Dsd{tY+=>y3efXVkE?Z~h7oVu{djwV;t$5;If6VbdP zAk|OB602mOCv*c=*_JY@j>AKZd2pxeovIwn4;RVM{bBTLiP?nsK%05`tU4~ihCK^r zb5?^KGbX<+l+&1H(_l(x4s?ebDrojTypmiiIp$BN7zsB8iF_J2IY+*9l7P7S`j7mA zhy2T5-WsSuh-f`H_JE@QwEsYibng3m|Lik^R_FJ)WeoX=UcdTVS!qdcr?hXoN*2Mt!X}{xi>C}*8W&c$r@PH85l?j)Jg6e!Gh`Pq z7rHq&M!0O2P3z-8-#LRg@tpM~ZU%vASM+y3s#=ecU`71R zho2H&d{|~IQTmz}iiMOupEj%QNS8n2DVH=fOfqEBiFI`o@YhaE_?zvDHUe*vI4P*z zz4P7?5v%Ls_=B@g*ZT`zi&EB_#Qt`kn0ZQmH!N^Ol%0VATl9Hn4w#f+808>ru02YK zjiv#Dn(F&sNXH0ubeXPy3radZ>ZWNK+s*($cy3xZqU#84KJX<-t_hN<0t#NWASmO9 zhnPSjzdMw6_Q_fcZbhA>#WXM+>M?+~92w&J z62(#|Q@HV-TR7*U;#cxm0fj)*_)g1S^oL&1AVQ+r%92!dRw`;!XzVuRgC z1=ld59o+Ouhka5wEYYC$Gl+m|uQM;FWmqajDkS<|jVDSW8(tbB=DNasN;as`iIotl z+mQY2=7Sz?TPbk!j;rqF&lWWpg@mM7KN@zzKZ!#+@!?$$18ZA7k0~<^T`^w zeQD(d)y*Wi;~<^Rsg~>&LrYg3>9!l?!&jerHOF$?lek8@<9ohBySc0T)VNC#Bg()% zB8E@HG<^&%A9nP095YLKT_g{8z_Cee=1cEwmC?Vve(IkwX82!iug57-enml<*cL_K z1`1Y45McT`59zYkC05fvjsziie?R|ioZqp;3R$VI)X(E*w&XfU$LIu*6Q`yHJOyeDFku%F(zv46=qiG@%L43DtA*C|6alV4< zh+PQ4<10PMBH&PxDUKf}*}qC}mknZz1}*3P!<=}XX%a>;%}LR#>Pazg4W4~c6XszE zTW5!mdWeu?;vgy-y4wi{W~S)6E1$HKN*p}+TJ$O!oS514jFZU>xs~ja!Ce62BBSVb62D;;ZJQBkz4JBuUZiPgDZVpqjA&V*_-f60g7L~BjNz&h_oaLauKx0-4Ns%+z`bLm$C1|xl|dnqv|LFoH|3)g0c9ByoVw~Db|JQv*bmf;Ev>~ zXzzfV?y}!`>r$pGC54#yA4h0{U&Gri%B%9Xn24HhN`cZNacl(rO4DN>5H5x`&e1ze zmHE*58=-<@JZKXxT|6z){ef=`ytqo&F(%$p=IlP9gfc&8g>S%qcpuKrYy}H9_nWpT zcSfgxR@&K`SE>?r3JPi z5RTiAxP^+l@$fPpGV1JM5WhSsz_l$z<8vj*JBDe;#y^I1x3G@OjZ=RbJDOgPXoD^( z>(S@8@l09q^azWl)3-bBx9=X!rpD#aY1`16%Oepjc_79ZZR#i`4!fGQrfA|D0udQK z%bIUzq7;{To~FZqv`38$osNZ<$D2ks@27o!m0G+yona?iPWOj6Uu9lR2B1%a)q2eLHC=dEROpzw3qJBh{P7gO+yxP*-!dC8*itBO^Tb_} z@Vt&ZXS?gkA?Y$h$Esj!cR-DhlgD9T`%08+x01PML2ScX81#g~sjUWUxa0vd$!g)` zgx4rxrydKOuDE3~hk`cc8T|Ar0(kfQ!vuu*6|oJP+$0=Dd`X{r2%u;-u->~<3C;T@ z8MV1N`mP#K{Gac5Tr)V^0C67=yYQEzR+Q5i;w9%G{TE|-nXb=xkDtxiWJ5}Uqssvq z9pG#7%IL&eA%Ds*iCu)(tJDw<>~gBiu8?Dub;zvU+~OZd$^nH0$S;@N&t}zv)z4e~ z*uw`)=M53Q>XN|sC@&c&pGvW7>sRgXXXh?&Kb!k?>7zdLt>gjxKQFUwqPEyqzrVbl z{h#Cj+|q~LDA4BCir!IuibC8Q1K6N<3{9U!f?bXF5jcRugt(hzFwfF&nU`@ zE;S<{pj62ZO$+N*7$Pd=ma+}gWay2=8hCq5c@>mg*~(*S3#L-Iy^>5!-E$noMj9$Q zu6C}DXT2RfQS>$nV%~`iat!eM6`7c9$8!4+UZ!EYXWQ4DKr{3W)q>@^B62G*nTBiQ z%kbc!ugZJROm#H?ZL=n*tNLeg$C5eOZ?gLNMYTBbKFQ%iYeHG*u2|QIF_m^k*+q9t%RnQu0Ss%SCfb$8+bI$vC2U;R4 z@ds)}J2mz-6QF?lmw`++8or>o#7a<9w!(5+0n@}=*j#a>uYB!Ba z%7JYa{Shuaq$ip|o+8}!g_XvZIyVG1KA69J$eEVe{eb?v#{()`qin@ZdqwY`MZYq& ztt_*ZzNbT8N)uj$qP)AS-SE)T^$jH{u;OU($2P`(T0B1%+OmIS7?HZj8YSOL8g*vDCB@cwhtMM{xGU?k) zWcpn4!YY`30b7STClS0j@&4DIIx->pdv7|nO=D^0N2dZV0o ze)Jlh)&-f$N-P5<#_EXxh)Mdzo}f|MHd@3*`N82*yiS+OZ39L5@;k|AY&#ZJ=3f*= z5_8$#DY_gcMH9Tx`=qX*V7kKn4f~{BEa~+Nunz8Pp(D7`qXKOvC9USMcub1Fo*GBG zY3ygPn5?^mHdn5YHO}JouN_MTR|*e|9WjosNvtvr06P+ror|@lQWrpSQ$PNI+gi)~ zM|NzZEFJYhKJcw+&mk_?x-T4Z))90fAznJgM8c=@lK7%rMLG@hTXdOSbk>dh7b{c& zO&Q*+k!+xI5G?EQ$*Tu#tGWIwwI6m~El>tuEWh9bxFbT?x zhyNs#HcTa8G%1PlqV3{xth37=S2*1Qnysz8Hkl6}iuM0M4h{(1+?hZw8{O0GRBTKZ zk6o)>C^kz94>s`BAX?L(;FjfjbEd%~0lxRPU&$m{U!F|%6ZB1e@@5A?SeQYYzkKTf z#NrbEWu?0`7S|%MnwJE`(rYCD{M==uVpabp99gu5#X1a(z0UOXZdq#`Z}djteMs?}V#aOctY8ktsH(;m+#;AZEPk zF_|Fj-ge9WXV#2~mD-7OZdwVKd=tcVRfHF?T&Rg%=`xV~>sMnzB;7?P_H+fzMBMLC z=FK}aFiJ$!7U%p6Bb$k(@4WbKYh`7X3bj#m3T*#ISe$>GA%z9X!(DK$@DTQ z0tyJp)mGTA7aX39w-4G0WFAD=5uy>V!^dAd5#^U3$}qSBtn0t7ecc_IU?AT;)O>c> zCzQAFFeRbqk*(pV1fojV9;U-|Rl`_jAr&XpK8pIT0|Vp{%g(x=2Y=vN+= z?*)4LvgoZZZzWV|cp9ZYJ=r8A;leDcXP}n98=vF`Ts}0H;yKyk!Z!fUdpibhCT3sT zNR@7mh|gGsFv5tl*vi2^EPjJ(dSXTS;1ysL4G^p>&G0X2fj z3_YJcrOr7D_G^(VjB&t5SdO7QFF04Y(v}^sJRZ=?_JS9C$y3DOcU^WSOw&5WrQdXJ@KJn{iG3JpPU!1Z>0gdx2fim%o~zUYj9m>=lw3s#rS=G z-!_%M$LCrXhFx>A zp@M&4%Ci2QkMjS$oo`A0e9(3&Wt&!;!jrz(Xb%h_5uVZ&k}p*cb4d_I^lO~;_vAJ| zh9yn%Qk`aiwX!o6i&ucY_ z>xT?Fn>!+$O`=khBNSRP>(Rpr$?JrY3( zHu}$KfY$d!+pO4mSnbabhgG&uXE4047yhjxh?q*jye#MUwxW|Kf6FbjppU-YR6PBG z@Jp-N@BRDPHlPJ&&Oa+g7d^JWNKFFW-|~uHEK#x?Trxi0%s3W#McJ%H z5YXwpBVI2e4j%=jk;}HVqqXe@jb#B)lmSgM+=9W?3c~t`--z4$Q z%b(A=w^O7=$lhZ>Po9*d{1?%42vnppc1l}E$9nA>uZufp`>e-LrXv|XgRgGC2#+zv zs^35ab>eR0T3xMQroe&%3u0ZZf9u?6`2)7YmV1M)SX8s$DvD=zRc_^h{D>*g$Jqe{A>*H=r;t^kGz<)Fzy}#4Q{TcWLFV z2`i>T-(S85-xl;n}41a)3C| zXwj^zXvrX+oIW!BorU;i@VjC2Q^Dx1N02=MK{59`(`Nh~Goc){=*${n zC-l0RA9}zAlCqgGUeX(>_qtXn_GJgAm=gTIEP&a}mT1MB^5A=?E{^cCg8c-aIjmFAxrO)(}*7od1i%?>T4SV}ss<>mGbkJfg;FUsW;F1ZJpyCL=7~J+KXOxNmCyBC1|5sT?WMt@4dO}+W5fP_r z+fhFgukJcVoT0k;Y4$sgSnvviZ^P?^!S8?R37EiLw}(k)gKGb@_)fV{erO~Tw#roJ zQ7%}+V(F3b0|`~MlvAQlkHLmdnj#S!bjVRP@ zz^|{KtI6aV=fCRS!1GV64P?`k7zmJ_LXjm&!V}_M9fvqvRT9s<1>S$dHEW2A$ll|z zo&Cc9q}9xw#Acf}oTQf}pF_DG>tdkn!40%aTh42jY>51iGj2!{^iYEzm(3v9%<^^m zqey*t0{yyD(3a4#{LT#Do2RuUI>H66IAYhUwHr#OQxde`OhXL&1HhyqJY1yJty0F zss54!SH}jwh~^u`3#YYwcFt4W-%;P;_F@l+eHGxY0tb+9g*}>jAJ|Br3rr#+YdfhT zv6AB?_eOT6!9oKrLY;S~HFscRJDTRDLwgPL6%~Ac-1?2$3{xIRej8}$_44CQ#7za( zuv(>BrJE3x%%}~py`cW z<2Rq6bZc5r!1d<(fWu7_-@g;vzh#;J>izQJHv3<+GTnlM4Ni17-6Q?KRc6<{QXQx% zT>sb*?5n`(gWoVkS!EOGOq;Gno#0$glyQLL+pG_=p~|k_zH$ogu9)F#C68kRB={5g zhzOIx3s5$>F)etMt}jNQCHd{lA86GZY#vGJSl)Q=5=;^mIu)@$!9&}sKKx#6ML^C` zur?w=c7Nz=33Qtq%;BzWpN!*XvFNJ}`7kxieJI_5t-0vP`$9O-{Bq}HkfJA)b41)# zE8$GPF|cc{Emu|oy3NUZ;-$H<6Z?y@*L>2fsHvQuNkC%#Zw7c!oa_*Jw!Z1%e&HqhnM6n=R>}7eF5b@_NSQ{lS1WZiC_W5T9o7i~b{_ zQXCDS`Cgm(d6xG3%ak7cQ*Nt_`*w=W$0w<7=aJIXE2YZ-$A)Z}flKOK50xN7AMU;G zL(7+QhbQU#0G6rqxQ%Zom$-)EK^k@Rh_mH<&q`U1h*OG$*C@J|CnK3XBCa|AUrZ1gB;H%}u}*f4_1A zFtq&ar>ok+^UEi34~K2z`wbGQ1dM2Zgh*}9PP`Cf>h^mrFW@8HR(^gFM&Iz>vHaa> zuO|^lsp-1slWVgGocbf)djH_90X*I^n9-*x+yKv@qWqUZ!^sqjrbvGFm4|j#1)Ja{ z@Y&V8@S9b@dtTJ9#MuYyo63-&;b7RnP=3zC7qW%6)D1ZPuo-sm$aLJh%vcI_tdX&R z10Gw(P=tYSq~z?+;5v_9mlfLJ6DCca_cvn;t&lD{Lv zef7dfl1kR_o&Y1aAmlHx?QO^LkDr1~&C(~uxsA6H&vOL0xFOrU&DDu=Nbc;8ajNMx z{`hugUMshz+DDX-<-nEPORGJrW4&lHWzMksvk!0Mz)U^hP1tw?KL}G!cCR^(mtmFP zpKzLhY(9A=OXMbwq}@&XUh`%tr9_o}M~+{p!JnCuhP4?5+`=g&3=T7Sq>`6ItCFt= zcobHIz)C#AY1%j$mqMv)nePdSwbhfx1y{}QD;=RNbL-C(K=JT7ZkiVR` zMK+((i0@>w#U8y-q$0yl$)bD{YBvP==GW@h+V<5amx?x-dK$D2_e63FiU`T`$m~Hz zRnsIpq4PKw{I3!7;2JCV4%iUbW$!0MMeJ-f5xiD_irbg$oEbSJNML#}w zi{?mq<~0t)E4=8%Ke$ zBg{Taiu#b^mkn*|!#=>w(S@fXhm`r=9(&awj#=?MkovZZ;%|NCJsQOk+N{OWiV^A9 zeE`|mesr<^9J6t!SHD=d`4&(fHC+hm>{F8w8gBenUBvy^E8+!9j-gr}4%_rYRx380l4UvVHvC zvP?AG5tQkp&%S-;xa8;ViPMRxqq6fa56z;1&)NiRVtL}EBNzeYrUU> zxnv&*c4S|;MELadd^26=q0(S{PL!yS1Me8%i7!vTjZMF_>~(G>>E6L0X7&7xYqViB z@M|^|`4=@NXD6bX!cyqiCA{TYPsW+r7Ch1^yqeD5BWy{A7o!ROb@cQqP2b~(em|d` zEO`V;+d;U4vgLu?uvd&7&uqSoifN^d4^MSO2d^UNLHY`kJbS}s+FyHzpV$j!X`Eb( z*9T&P9DCybO+NZ>n>lG3-|hTW^EiDZ2i^-_o}2+L}bH%o6G5TB@;!-bSCl!xLC z8f3sygD@L?vk^yBG&ABNAIR*du2Cte@k&Bsg57PAX^G8tIB{RLV}5X98c--u(Fynx zQ4vTQ(EHT)bi{%tSiDZXU0p^*N=5nP`)#sYF}46}%!nKha%_lvF?KH%Jd)x(cVWC( zwQ>}AKkfeVqu*!iuL^sc{gna}gK@Qd`KfJ>+JAO#)biAwb72WVJ4|&wFaud1w?T67 zk$>v)KV?g|hr@=VJ3NYz26k>(SMKoO5AI2w(h1AmY{Hg&BCjuJXq%e9tO-5JZ6#~Nn z9O8_4ENb=VjhJ53Jvfx$p~mMDYV!)OrRIGPBWM_x+Hm{oBIw1q*3Wvwnkv0X+ZB{@ z(b2^HN$&0d#6{H$)sm(DeLj-**Gbu;3KrH9n|7FiI_6RBwktHTYwS zE`94t>HEyhpk@mDZ}IvC#9KhJslBor@VW@6ww1kkVJY zDlmOlecbWJjxtv&2OWbDqb;6Hm^6Y>n#5!=X8@JeTfaJys?Q*M7$1DxCB5xO`_0ex zH&rqEE=C$ocgJ5#j)jm|nV1X{A*0M}1;?MlbS%>?h9T^`C35?r;;;}+WZV=j=iiSE z8yJpd?+sEV1S^O#J-GG-+V7R+)>^$kthr97^$6SbD`mbQ?7Z3Xf-AL1h+XGdKyTIT z_kYOAp~$6=>M#Mk!q=h0vElFyUD1f_k~~st@=+RpzG0e+g(bBh80xznIrw9B*UvB;YBA z?@(GoVm;2*Ats=%bNk&T6yY1yAhW#s_g;U-^@IDwR76wbLNe3$rMMf#SPkO2)18;c>@*C@oSQ|{{TDw1zr0(@1ptBh z10QVOSxFt_6)ZeifkbX>^?y~6dngp;;JEd=V0552s=c;o_~zGG1}(1AQbBgclGM}% zU{79_5X;Etb|EI{FsE=$ZnWt#Z+VB_ z1^!k0tCSPaPzilr(!E>n6zX>>??)wgSL@wkicn|b&>^Uq?dwTny$ zEu_B+QFhgzzuj#}a`CD_&V|3mt$T}N+K!^1gu_Uzk*G>4Q)5v{uYVS{@}a8Qb(8v~ z=k*vFR9WVjpySBTX|(B+mR-*eJkg&n9|!YRzRc`I8z4NyFY<#%%}1s*e^l>%P>gNp z>3!MF2N3X}D2GhRP{?;ukiCg_O> zcC8gbDz~Hz;7&L=O-PoQKCl`gGy;l+JGDAKpYQCko@J;U zWzoBl;L|##-PeaZDOhZ+&|A;9+rE-=o(FVX-?EYwRe!Q!FOL*Q;8-m+w_XxYbhk}& zI324L8*Xtkaq|Xy4*6$K+@mAS(5+`uWvVN&bv5?C&ToN2{}h$RUA9)UOtB62&CmJB ztdMUD`2fW50O4s2YG$PYNwc@4SjGq>tzgTZf;K7`!TYDJ`ZIqqHZOqrcgSsl;_je# zOYc0jJSsBO-x(t$B+8xs3CWEERPu%|W|6bCN8-gAyYb~kz67z#jTka6%@sFFIcljqYybg^}9oifSi9ZY=GEJsGz>wCWVWV)@b^}6f# zit&60LF|QftB;u<2Rx07rg)VhO}gRLJ-7hcJgsB#JcSO|g7wUt zS|y9b+oze27wVZ=JG`X~9k+9|-lyNlYw&x|)4Hobb@wJ4eewGL7-OZ+t^HJUyw$zSbA?Q{innER9JW) z1{?iCG3Ma%=wMX=Utsj)NVjwVtZ7!1 zduLsC<7P+&SRpf~dNU)E)O~w%jnGV`6z$*lTY${escyLU(DgMy~koABO{Vb@{iNZ&u_54H##98A#D>01+R_M=PwIt9?sfT ziBkW)Coz{WP(wT?BAPPq!}gIark)u=8T|>iY&I1-&7fO!9mz@Thl8G2jBpSdMjosD z%|sTcsD{Uj3D%Yp#!L{j1oT(Dk%1=+e%1z&DXvyW;NX=pz z^yF54&nB5dTZ~1TPj7!V+S#tEtIcCqmpGmV1lvp@FX!o6wXk^jBJ7rOOJX-uBbPSm zK#}eVj};C~SUacKGpbgp3g1GVbVU+^AO6jTE0mrVRA%@hDZel`*kq*QO@dwiGXUy- zZlCxYWpQJVx$AFxFT{CHwKF(P|Vuoke5rFd1&a>vl}cFIcP+_Q#L1kweFT0 zWR>cDez<4qdaz;@cPvu%W0-!Wdy`Gu_nIs6)pC-7uzk}{CtX1c;o_UyWk07cYB@|H zIU#YAo1B*xB2V6q-+6nYkw8a16E0KYJy|WgvSGQY{EfGtE$xL@y#9@s&8+Kp2&OtL z<1(f;(eV>#%*Uak*?qFniO= zCmW0~kINhzT3J33Wk2;1`z7BX<3{B-S4sj}9Rq&2NGo2cQhdXF%7e7!Ahb=?SX%u9y0o8pL<^l&MGO`<@@45`d4q|Ikuj`vb&_I-Nhi z@%wBA?SoQc&oTbvox4w(($;X5)!FnC8<>pX(?N5U{Cr}!iUISRDi`oO1h3C)4B8;d zsny%!z)hH5%8g2x$qJr&2-l97DT!#QCvW^@pBkB{y7+gnPzZE{Xv8sEh>)1? zfH)OfBix6XtCd6H{G47I+!dSPTtCKg5M8{XmZjVmI<_=}1<<7*J|B0=Rd0iG8(40# z(OW{n#OrjO)3V{u(vGwU-2}xPW&r}{xj8bq5DEWG2u9- z1!+L-h~ao=QiC1BOAR*wNpizEa->fHFXVk&Ulq>xyh#Tckadw(MhE}f*}+*X8NQo{UGVXjv5V<- zU*`Bz>1b1mi{Q4fM`q(n7`spzmK((~RgKcUL(c0qDBN()s+N!3q>SdkN4(t3gHJ(2 zLJnmg*J$Dw`PXJ3I%wlZ6dyHTuJ-Bvj{anOCn1RZZ=XJHZ7%C!<7|y8-rMw7)|tV_ z_g=kJ=*R*3e7}?pgeMIJh^X$(GX5TUGH{h!N)WWeY>>b$-n6MxNe%gWwXLeddr)Jt z%RwlQ&ZA31=QAIr3O%^}+__%xOURN?@UUph^LZT)SyC-X>%p&cg@{~L7=Sx%0ozIb zQMgQRy0gjjC2z=kZUn^OLjE!GpV5X&g=%L>IuE!W8UTfE7XD;rx#)nv4uiQ6YWamP zY@_k+T3Nv*#Fn-+X?0Iq_DuSVnc2AG3sO4*IDJ*S!lA#gZNWEV?sx=$hAw!n=~}%C z2Zr~rhtCJKsDH%N8s02oh#45%L!Vh2D=Z6H8_X6p56}bYB^1d*a+1sdaX&+)Sq` z9by`-BHHZz5Q->RE^wH z7gNK?qh6sKm2B9@eL8$y7g5*>9J!sHCZv@sqxDj8yGiTd?a=)jzVxPh=Xi~toL}$P zJfKwC>4TDQ;|E=UxKi=D<3v#ovnBfRYVdt#lY9phc9z-5+iOn%Vo0-eZ-4_l!4e;w z;`N;|H6#W$@9L65SB6*zU#Knca$<31WDtgHejZZtOKmz{(N`7QIH>j}+r^Dmtk7!2 z=FsUfp7NI!UcJFKTp%~nH)FAc#(YA1t`i!~u8z=@Zsz}XNCPZ7c33ixClE-k*{P5& zdcolsNiAmDG{vh-;s?d2FSQv<)psfi=f3{n9JV+BFP7Vp@~}IcpDK?uPM3B%_ZwhJx$iyaw}Pcc0A+?jk8l=g123>az6t;Bn0r@zI4H5NEHh}e6*&ao*-xygW7xLe)|D|qj?pRY&hvh++uG>BaYSmMI+Any0^m~rq_m>PRc z{<2eJ%RRpdb&)7fS&EovtAV|w7}5y1oa&Wsf2+Zz(W5Z)AUVJ>;zQ3?io5~zB&bp2 z*`K_QU-lMx#Lx6U?#Kkmp%X(I|J;a>(PZG2iz{x8&Q!vgcN7Z)Wl&6JiyA&kU}2!7 zvLsYB5pAO^60`Yb+eAMxl{mWQOf;^D7ID*KJBp(Ny>Zj1V~8Ou%35l--COmC>c?Mt zG(@YHJh6+s7B_`VD`U2O?m*u)zF-pb0J#mfUp=F{#A0B!5bvf-kPx9p@UpM-1Y znF-HLMct-xr2l@iBfEaKEdg7L!j%W!KFqvqaeHR8nbA+=>xVsWgG;1ZoJ$Pex4t93 zp?}6->1V0~rN4sbb7o_UjTq(Ui&KRzC3?IpwXjpC&b!1D#~sb4EwCOvpQW{Rztri_ z+V%JXHrIFDLr96S5sCIZKG=X4UWd2O091_gx#n>l@!{q8cGM^qp781Yx5L^-sy=|7 z{mXmfgsg%KE|d3687zgfMy5Yk5sdz9b=PR(KD0cbz5Y{*`|6PPCCdlfxrOptF^yKO z*Lz5&#>gtGw22wO(epH>sQE$?!~>YOK?NHmr<$1Cl&ZW%z&fv{&O|1aK-n*(q$Lp4 zx8-#QZ{C2Y%kjx{$%Y+AK`FHWF(is>EuLLTsp={~5!Aw~eV#QFT-z5Tr8;-Lh9466 zk(zqP`%Z3CQ9no!Fl#Ejxe=Oegl>(61XsT=&m zw)F@t#}7=>qr;%Gc$Ei3ki~qJJuVD}E}%Mk_}24b7MHz)SC*qKoJNQ4!Am$2Y+C13 zDWdeoyX2CZ{HLm`r~Iji%StHUj_Nm^-!j+-HZB+Fk8 z)SVZJ_{pf-jAhqBZb2M@=J7f(@+-QBwxfnbAbb?;3K;FO}8 zcQDo=RT{qfxU)N!7!;dz(L7+tlNQ1IE1t(nF8E0WfGV{l@@*uyk%nYgjEXs4Ityd2 z^tnYMytdQlkw4CX#VnRcI3D>Dv`p*z#Xak_Pg-rv-_7qsPUlnKH!Fno?tZi$kM2Tj zL3DT1tl0F*-}w9~CbP0v7rFi&bpUZ6P!p)AI8XP-h$yYqmFKbIsUf-Uy1Qs{T>Ji`bdFhsH;-_4UGtzm3s%bpy0t8Sc=2%5Mzu zM<(QyEPMN6(Dc&kaN`lcKw6?F&7J_inEOTAVgx7rT}EHIv(_Y=@0ba{Ack$GB|7C@ zk9N~Fy*y3?DuIix<=wTW9TvFd!Rh{#)m*7=Cm%7{{!9L`2T$TWX|;#`91^)%?#W2) zw!${N_{ggWlT_&ov}DfOeYSQm)(YCGtm2s)KH6>prNMM#MLp?^|BE(Ub(mf)ROnfv(Zr{HL+C zE%4D|LX?@Lq$KN}E#9(){a?#mmhOm6F@?*ifn{IyQd3x)sLE&qs|C@B9TG6#UOt9^ zHt};+xF=l%Lsgo`pL+ThU$=|3%(hW( z9letO9m|uu|LZpo;$G3wI@Z?3=(Z3MH=xkQ@dXC)m}mZ|9@2fD)bBFM0$iB?a8%Ae zS>*T${=&$;F=8Kl=;LrEL66yJ zlsHti{<0ayef)NHV_h2{*Y1HuDc#AOnQ1{X{x0zV;1y7eS%iYNO==~>pVbuA$S9uA zZja77S#Xa)Oja;1?dHygZrJql6i3oTxR++p*_Xts!i)+k-rFm4;t9Ujw;AhkkPbCa*VGa2~n94}$Bj zab;`!ibyZI?px-ha*=ry(a#5P+<>vqAARG7HZTO-#!O#)ZUZ8z>==ByDGFS_UmE2w zlvBa8%*FrJoTyYIzB!cNpT~~@>79}}^TgIv9;9{k|K6X}s*7!L$1G1z;SUUBx9gLK`v%RdgD-C0=pkGdRAf}nb51FV&lR%u$@%)h%?kF*PQf|_j`h4PCVL%!re5=7W1Gb{F*UktVH zGOT2{aqxxHS1#{6<{GTIdw)S1#vcE4&YtZ(iL$rTUm2aLc8)T*D5TqJ4t#yFG>Ho0 zCeSMMv}sXF}H@ z{LiOS=Y+(a2D&)=`B8f1qZ9?eXw)szf)#a2aTE!t;+RYhV&=^+N_2-7|CLZuzHIr} z&g0Ftl8P}2Big~+#qU7NPG?GX*A5uCS?Jy`{{gVzx#F3nlag3Q0~B^f&xMHqn)!}q zU^&kpe(R`Bf`YpaGM`q8PXw z{H1zZA6EP3(A)Yn#}z`bdt&{P+KE@G5-Ev1HK>nJawm{>C7Tc$Um4>4C2p)Q3}5SOyHl@Y!i&uO?M)!zgD%l6 zmUFvMHDvI`EbYBvN-esk`@ggAN&meFlrmWO!@s4{U9oa3DzbBtD76BaqS&c+mP(} z?C(PA`^-D-r9g!|i>lI-Nr26R$=pU&UdHuj?nsFb;rt*^Yd70cxO2-~3Sh)Rk#UT9 z%udR{OqdNV`Xh0M|2*iVNhs2Tw~jPOBmn-W@+@4MH%<_uC#4+iq7tE8VMucRG6 zhMrIMwt)o27k%*T+oCOR9G$(HeWPoFx!dsjEZ8b6_e)oZ zb3NqmXhlW6yDLfK`Zqw#>Qb=lF@lRA19N&v8(*V5InwSguy`kZUxoLJ3e{$Z5OTnW zQVSMlftR}u?!L!ssh585mu*^a(C==V)U3i#E!9-|$MWs(_=t~FpCXWXQIWo_S5s4c zFY`qY{k8y2dkLEN`PWGv_!Xpk%es1&s1&UdNM9ApE~4o~vzrQ%D$>&EFtg^A8~%2$Ec$EHKDR{aLB&u4)A?G1AA8js#r6jC2vhry z%$9H26`wJf#eZh`JlOZLR+ze*HJNOq^E?{^229|BH1I(Yar{^|KRA0RoBy77_Fl95 zOERG8N3({Q1xLuND-4V&kHkO|Lwl1Of*yz%kG)kjQ%npVRgQ#0K|2{gMiQvj#j5b3 zWU;j_sDRpuM_iQI@nenLAeMKSVomUch}&K}jbjP}hU9KdgXR)k%{B8)~w&< zE>Sxzhj(G1Q9H-jnwzBonsIPi7T13FBajBaulF)d?^iTj5YBp;Z*TtFnL@j9;)!?b z5WQnrzjCciybOzF>FtX&WD8nJI{Ye*i#zq`>06+`e+KdDUw-z8k1l`=c|uySdN%0} z^?_YrHBKl_V>+4kp=EPMnWOv?|B!)-n$P_8z(^V-f0IN$TN9G;rA>>tz_AU`XbBz9Q2wQH_q&)0501l?VUxg5Sb+LH9}*a$vy zIc%7TAQRELlTw?@d^(b9C>V3s^BVDv)1h+-Iw!-5y`k+t3)FU2cGD&_WKt53 zmtH-_IQ>PXV5WFZ~XifovJ>Z&`(bw7rXZhHdK$jFUn2 z5s1Ebrg{l+txN6SlO}#1dKM_VpcdRy=gN2%!scCM-RO;~7*xH~1oC!Qm4~FPM6T+t z<A2m9; zW~;4hhSgW1_n+i8eU|!bitINCc?K!ce@G+0NPCl!-sOO)`8em6(~{gwP%h4t+&~#r zU3*<3setJ~o`&BoSu~Vv6;Pw|L)mp;4B4BDe$cG=>Tx3zX7+!2{q8WtT`#t?mR#o<`C$8fL1!wdKTvQ>AV9FE+7HK9cKVQ zmL^f{P_g!ahi|ITsu3^h|9p#@cT+hV_t91L7@HXVju#B9uHubpj<{@%9SA2w4Gin| zKzRaMt~8!OdL#EfL#rFnd7tPKj9X*K43<@wW!-QCw;AqdDuW94F9Vw%HZviS$$GT` zZ@1m_9LxJZFjw%&Z>}yhy{J&cGgXFA41}Ss+_Z>SL1Y}Tup&#hvleonD*u1hJNQqM z14A!hb?p*xX?JRYd}(DjE0bm;+&9{HKb!8`M>|CH@%`w`aQzk42LReK@xRCZuf(nW z(%C8femkCq$Cm1wA@s+*=QxG~c+Y6F1pC4ER8op%+2?388R)$V-BS&r_`4)vA0_*( z)lqi9x)O49avBMw>XL3=OY74hT@b1DLj$8h_Sg zLPpi}?7;9qspviE1-y^(O6=RGd7R=!^7LjT>nOJ3sA9j{3~aj z$@UA!eFoclD%|4DJnhX>Y|Az=+Eb~{U$Zz(0u1hX`ei#GC>9fa(mBt_L3`op3TMHX zP)QVJtCEj-N(Y&J;v`c>o~fzw6s|j)`yOt+e?9lFm7-Q)TgaSg*VPB{{5qQ)(HT=v z2KO-MwT!-JZpE*%M#+}~=WuQjeb5oZem-?Evaio&tXqH(gTyg|^5HIR9hn-k1=LBa z-nB2wiJ*kdW_ITk?$!%<&h{j}{SWndU0Ruk_x*vhC?XcQt6ZGqfT}P~K6W=_bL~S- zPQ%2Er>q&0$9dO-*w7rVPJxpG{$K&R&x(o2H`_tqGL=p6u{Z|4*%Q$oy27Cmf%=e8 z)Mf$=yu5p;r6m!#1HRljJEsAxIaB}QZ+F+{0KGh8Nb{d(SXwv>ZtxsuUAp_SN&f=`J98ju&)fXz4qxp^1^5 zFO1zSs$PJ+x2dfOIV{j>+iMCA3wYm_xJCT$(o^g5`Xm3Y7Z$elp6$%NRbpcta#z9d zTM3qHvON)f4XS*511vw_j#9p2{M{Lgz<`^v--iKODi)d7rtR>XhjfLl-mN`(K9YL> zvFG~JSV#p=_5pj@gC*>(RV4;C5aR?Y`0_8eh@s&#fkR$~yA@e+$|2|A9(^A)xLtRe zaEU!X>e?h7Bj!oN2WH%dG^YaW*KnxBPDYwtqE(E+w<0c!<+0#LPu3VVXDk!w*r7IO zBdRIGGM4oZJXys~i)?DR>x70zYdrHw$9=VmmSQzk(iH)tW$(>v)pavwSX&v%6bZ+B@WE_QxJA7EvXUr+Hy}F*W zlq7D*jzpCqyCAB)XE5%YI)9~Z29Ikf%?`Z?6({ko=Q`C@O%%oiwgwPv-8eWg+6V+D zXd1tD;tdAtVtICK!2*A=@tz;0F!oNH`yawY5DTAgg2<_2JZfmb{bpj5CP|ik3VOYf zZhLHgqjqUTu6o?bSOgBSsI(ske(BSfCMTmjs?waJuap z5FP}u&BQb}rdfzjzfkD$4gA2+ri^upI$n%_aICK@X-Lc3#bqsgJ`0EcG!+bAMCV6G z=T_5i3B+t6DE}ejTWdQnl}<7s8Z!b)10F_fPdFt^g6?2EN5lHs`Liopw^h|-x%%{5 zQmuMgb3-P}h{2&??#j2i+DoY8I8{&V_K$SCrpl?fuT8610w);CVkxfbpjo#swfP+ znfY&Ecirw!>^saq%Kq4u`5IgGp1`%ezB5C;uA%rJQ~Yz4s^wPtW@LQ&u$$X)6}a2i zR&rr2!>E>wGxx@G{(WQKno0502w!15!^J;c$cV%zyQ=lc&)6M_l4Y9)W^f0=*b{~? zTkF4*8ooShc>aL{N^6<6E3SN*kqIh0KMK_!2}4`K=z@_5w#kl2HY*)`k)!AKb{^;G z{A3RCjyp=^E*;+xBUBM2Kj|vejJiZIt#4Y|MV8el8rRCgCXleWX0qp#(OV66@bLw+JO(+pwF*Rw=kue=;KC5t%a(fzpty?Z?DB{vQ1 za7-gMh{P#$#T)h_6WI?8tOpgN4Hf^sV?EgIDkyVsJ^1H(GxoepPjMqKG}h6*ex@#} z%s%$P)YLs4D4F)Yr+(Y{!Or6c)HQLGUaTspy}*l>*zgcarq2j35<5+3Jlf{h)5)$Y z4cYOqnhDWn*Lz+OuPxr3Qyld;)IRDDNt1shetm5AUo)kjSGRHM*FBk_I2%+fI%n;1 z2$3H8m|m3eL(ZG2aQ^4ohqF0DOfbU;)ID||6h9Z8J%}(m;cNML?V<@(`V2kZdO>!*tzR0Z8q`L1toZV%ZG@!jrEt|Y%m?8>J*CJ=wZ7KUZipreLu zA!_)v(NslQjxdbWW@LYsoCRBTJ)Yu0e`gpO#8J$2h52^H7wvz)%iNC6cfW-lo*fGH zx_(R<_g7B&RZ0Lxq*3|7`Z3Q}Q87(P$C=#g2hX)D#!$ZLL-;zj45Z*9 zK>+p+NM=`@D@=u`cncCkkVfC_2k~`3$K1|?Kg^t!#DYR)UvF*fCPg8NT8p4(;})=xr4x_`JRl=wnMHTMkjRhrddlYkA87>p{X*u*INnkxA1q`bqub zK?00E06GB$h7Q}65+njm-Rl>ZRHAt4ms59}%g+zpyYNE*n1<`*O~|u;x{Ymu!RFMx ziDNRKZWvjxmr(ya$zdtzwLPlusU-Bza)@8qQt%V-yS^j`6gAfZE_@!;N6T^=?mcGH zqe+pp@=UQ3{JUxAcG<0cSAB2J*iDkFRbMB_m&<*u$eDp^sHGz=ZmRq4za%_bJ`?sz zesnh$@tc@B+S{}4Hg@HY#-Fa(-SNFm;Z$ArS3*KBw1~2csB?R*(6ROa`3eE6O}5w{ zf`KpEj^kp3`{-0|uH2I`VEcVQ2Pf4kKybji5a=B9Z}7+%a&+{<1huR2mP0jpB&w{RBKa7V6j!ba-4SXDY33O?E*P?I+34e! z@gxneaxlO_7ON&u27~ndxPg`m{ZaSe+NGsjdddbtpk0^BL-YG%isZ$!?uRgO1FXtB zaCPizm$F)YKT84W!81cPRi13e$-q(i(pflbCrk~xMxK5vJaT1#pPZJshK1T_XAKD6 z(ED~NB>cX)!XHz5?qi~%6-H(eYtXN8Jd?H(F1O{R6`IS}Ijd~Hrp7DFJnvh}7Fy+yY+Bl|RujFJKDk=8oAXv#HY*wpl%^ZqyE-#XXVkM1^`?yNkJ)G z&fd$JV0qVaq36D8mN5c}yKlcRI;9~cIQpx)U)~@kD*VA!BT0f%-!_5I?I9f_3T{Fm zm6%a6?%?UH-6AMW%xYy1S@i5v&al-#5@VJ!Q~st+CgWNPbwhXJ*%oGx6S=pHO!Q%< zgzqf#L%M$B8kc%&?0=m5-rwgx-yJJFeAF82NW3e1vjZznxmK6~T#4)1U9k~b$7k|} zYFRlo->XzuQuWqWhN$7z`Oo5|ytc1rkrj?JBCv}I%`Eocri6WKu0?QB-S=Cj2uiri z9f6|fe?@!z3zhqzf|>Dl?kIE`9T6!YS+NfGSY8rW_O=v@N87mA=frmJ(Cd1VLTLXh2ufT`R;zv2`i1Zw-UD2LrUA|UW9~YOckNU+MPdfo{A_o6T3SFQYj*5 zmsACEM3<$WhuX^jK9_d^X?qPc68i&J(HVA+aY3k27+a=wv3APD$nd;m=HoSFKH7oCW4Kn}jab|eOgj^$a{oXn9LnD) z<`ZWhHb)F!r6(HGQD)QVY=*-2U|6)Bz_Wrec%@%-PP2g>YRg<0Bi7ks?&kaP+i}Y+ zK82AE$|zkRP9kt%(g3MAD! zI~_3Q)&+)Q1r-9$Pn-1$omx9yot~8bbNzfizO*jf^M`$%y;tbjMXzyu#iMp&A76A{ zC0qBFu>7{^sEWGhoV{!4$A#&8Y+O-*?H4vKq1&vnDlK0FxV%q$iZ}00f$$sp`*^2_ zyZagi)cEPwxg~aw$I|n2Y1T{g#BVF<8h;3fBEG=AbJ(7W4xwOt#)2C|?kGz(rO6Zn z6%WSh@q2?g197Q_)(SA6VOtElGr0PEX7x@P+J$zh++q5Y@F}?*kO8*X?ym~;!ZVlo z?G)eudYAMu>Dq^LS9uR#&e~Y@_O**2!lc!b>uPstZqR@L*M*|hjV+;*%Q3}-!-N1l z5IE!w-ZZZ3OR#Ky!w2ici-oTb1T1eEqO4yBfK_5U?4RlqACGf8&(sMsKOYsEsQ|^| z(uDB}TTVj9LSNQ0K+x6V)@{L(eF87dbe+6wzSA>B<2y9C-RS&{Ev-CI zbGXA>Rx{$ak9rT{?{4i!+v-T_zvA@S;4}ZC_*Ug+$`E!{d)BAA^-J~ZaqyZ6e@*nd z{>gX|%;PT`uL6GDePqo@9IMy7nU{#zM3<@(`qo+XgE%nBewOs#puT4?;3$kq)#0q1 z>VpZlWe>>J_Oz9nN15*paI3u)l*+t+fEwPuE8F+F^oU|aSLwwiLQHNTrXtvcBXxEq zQH!pFJ`v&NV7J-%tPuEL8eO$bs}+2z`q^r-_My-&^8`)z-drAgDhl> z_AaRz`u8 zQqcNdt*>WqSlfVlsUL)4c}zzjLlwe^1d~~Fw@lyfeRe?k$%)dhE982>>0WcP7(jZG zxs)*LqaWkRuCtj3MB99I9!sQ?A8nq=(hUEgEEt9NG_L(eUM!RwZ-l9Vl&c&LcTHR( zD2YQh*3+rj)HbfjU88?H1Z-yK5^dNVV6P?q6F&nmnoV(LDyRxBjJDH>Sb~n)OA;jnJk%eBOCixO4VX81OvMeCE_SPF{nn+v42|$B#WZ)VV*AeQzC0AN z$fWyf|BZBf^@pEZ=*;!Gq8R$CStlyiR(F)I_2~=9t)cgc;{3YszGBpUw%aBAO4{g! zQ8S@=%pFwFGA7QCuw-!wlx7!i?nJE-QndQF?cg&<`q8^{N|>-iVcPw6U_N1hNFvHe zFttX`fLGUx!YYI*6M#``a?xTAsfGhm(K)}1wAU&6s&MZxdc9{{`Q)!8eI?cVVY|y$ zFR2{Veqz)X5YGu5Kq%-4kmHL zVF@B4ufm2KiRPN~K-&4Sq3DWil~s8t_a@Dkc4#$dSRD1mbkm##?D8>2Y$z#piZ_}{IK zXAf}M1%2RgxaqSxe+?#-nO{yF7&+qX2;xu>D2^CnJ^E@}?b%Ugt$@7e=afXIVV~om z?V#XHO2*n_Rnju_HEI%!;MApemg)24)tgi`vF?gdCEMMD%-i z+Zn@OJoo#vID5S;GCb*s$I7+g=%i%o?6vk<*)yr_+Ca!lYMP)Z$nyhVv$5i#pY|Rx zIMWrH0jSFmKvvJtg}#4iWE}p)JGf8QjkQ?sQS45o`mgf|eh}4RkALhj!rW0FF_JSA z(7E+GO#Qd^9}E5fHjDv2ezRt$3rdThuz4#C#5WAjXAZ3TyM$olxIaD}m9Qbp3jWuR2aIb+>%VzJCNJh%$a5s?ku1SC_TT; zJ!~oP419KKr>EHaZ)l~Er_QP2^e?U)PGGnk7n^q(ejIlc?jr}=h6}~5kg`RPQU)j$ z`>egF4ruc%F-PK{w zJ2b+n9G&?j4-hm?v71~BdJ^FC+HEo+aUSvudK*p!CScfJ{|K2WIRTKD{y)@*2CP$u zGJlCUdkn5hS3fKG;I(krdbv}~2IZRI(Er-|%C9KDuw4mh2?>dzyIW>xNof=X1ROy^ zK)O2wq(ORsp;S^}2)H2pZ4_jf z`8dYR{=!ZXm-Tk3qX<62T7J@K$r5z9FkRyIsL@gzdl7hR!MXa1h?XkI=Zy9&+Wrw8 z@-o*Smwx#*y_Dl!8z*HBC^t5ATPiJ%OF0-LD*oL3sIXagH1Wsg+LqunJ1a&8}BHB)N81 zf9QL-tT0ZwXOv!Pttc!fPmIgtb29vldEU)Xh#@w6w$RN>uVI;jAiS9k1S^|<(eX9D zLB+X&>V61*e@iS&I$s)1ZkvNm=!@oCfQUUW;xZlW)*mHA@~1tsNhF}BYyTI6gpT#T;qlP5^Uwh#4#SVSrTM%3)eHV_M9Y&|yb^6M zjfL#MJ{voL#A4A|z5jSe;I_vl@QQhy`4?5-WbEO;Kry9$2P&cbt|JFRxFX0EUhzXn z>B+=;0R(6BzNN`Iu)2ur;*v*}gfSG2>01CglR`6>tcVDy2`n+rI6@u-rG>hBa3+mK z(R5(re(9k0awRy5V9}Es|MOaHLOoFcgZ#1RD?0S%Kk>>O()%|<9W`@saP0`hd#`C@ z{yz4o9O^uDHncSV$?x;9C_R}UnKS^-psxsgQc57{3C`cfW|S1gY1hGV;y;2(kzJ8F zz}b1uO-S1zE5e3h9sBE`Ba>eXS{}pB>PFM*D5d(k6uHz>M}V)XG~IUE?3|SUBJ~Np zrmb?`^!y#Fck0p@V?t^n~?Jk||Cb!;}BG;RY8kBEs$g@h)C);5&!r}CUYxw6MnUBVNlw&o; zJs7}#^}eQhiordEXIHgIWYbg=;*yp>)MIbYwFH^pIQ8#siw?^TnZC1AD)L$5lzHG% zUrVpxx=d_*`8T;B8K*@#&PNDp?HawZCa?Y=gg ztsJt&ts9af*$zt6o6;*kjlT;hK$PL|4vLkW))i@P1;~cDVWP+ph1M0A4NjgZ^2sSf z%wdJe&g%~eeLrL_pFz2Hsoj*+u^oR7Cuk2uiday4F(gV8Ja9W7X)5L?AkY8_J@(lT z3Myv+xfxuQ;pS1$m5S^+@tZ(Knj~X+pOdijlTHu1?p8If!$c09OyG5z)KM)EM%Xby zW-N2N;M1?4Ot2l}En>ohuFC?wtE*@KZV;s%Boi2}U>V7@o_XhHeLiwrz$Y^)4+Ott zmjlgXOYDB(KPtaRw%kn$Zkj2Y$NSH+LbZ;(QuGYIZO5JjAekG}crGMaal3lvY- z`KeKj=}H$Jo*4X@+q8jB@T$1uq0I`5tz^(i8I$A)BjMOrDYB{HA5(Jrm^90>Mv{@f z`{o1A#%;G8J)J7`1tC+L?YB5bt3Jf-rZU5UI|58}`(4j>yC`BDUmDdI5V^rBD+H!n z5FdDmXlg?bjXFrm*2Ntw*6X{>3GoQK1HfeozX2AEo)Z0XrfJEKojC4W8}jnAS&|1T z$dzu2(t+=Mb^~AQKT%vsWN?h+L`q0Op79!xt^Aty*SSf+@}jNS3(vTz=1b3@ zIk<3CortG96`$UTgCY*S(vWA+ID3ySPDXFfTsgWp)An7bNRUolI9Ibk^5%G+bB^qf zM{61>a!J06Wt^0CN`XPzIH~d|m|R$U@}lm%GD?F{(L@FH68Q88K9)Lqt^YI&g1u7H zo{CPysF|tQ*5i7PJCa=EQ@R=zM&pgs0deLCu5#EVB^p^1A6cQ>MM-YH#72gPnx2=F zqF}z6A>z3Cu*(<;?C{+6flLu7e`s-n-v>;50iI2PXzOQ{elb z-D>Xs_#I`I&2tTldl@yfOWQT~n`ev&Fx&9KHhE9yxh~>Y)Bb7|Bc%I7?dT3O)bY#v zCcX==I=zvBvx|Q3J|4vVo@)TII~cK3yKUbe3LIi)dh204JQ+N`!~--z{1EZ&w!YWP zX$k9~2;pyuF9WvsET`l+02zVb{p*vEj2+vZ<)l4-PhJYp=sRd#w^#uRN@A@oa>h8` zw2w++Ys~VpeQD{iRi}}4GM5A;I`snX9dAk>kZ+0%bC0kNcL#4iUS>u>;_8uIa7t!j z1qLN_U5N_26`R8HnSYeyZ{DU4L0;*P9C|e(>+v#|`ck!bJV&`{Y5w99ZfPJE8lk&q z#)$OB;ft$M2GnL!Md+OyiueV$ zZz#N?nS>Q(VOPjvDr8He!N(`(G=~r8#+x?kHr9r&#d72^m*AOaS7myj?olYa$9vS7 z0V1+#_*AtdpUkrz`@7rk?wvU(>i3@=VW=nJ7t$IofW^;w1J}tyv$g16;i1~nKhZM~ zRB*xM;ZP_wiH5n$m#xh+NrY|F{y|cC%haqy|H10u)`GHaaq}T9?kBVMPhHW_I)7yi z$LJ^aN4lQeJ#W?t{;Vp>V!FvOY^0G6+1NI&fD2Fz>L1(x)im-Q_PfRuuK&piOd}l* zwpWmFQr~F3S!bAU5Vo?p%;D|=N zJ>(+FdQAFlZgud21wtrpfmj;Mzf|| zZF;?xwJ*v~%XA5y=-?(ybjJogp(Pgg*jqh&glPOwd{#fZlMan+!L2&%S!mkdaLv_A zyN?Kgx)~|g#;lr1PAozl9T46jPfWrto*<0mRdKZ_ciQRfxNci`Ed0Kia%Hs0MFili z12ltX=@$yAO z9T^tRk8ntCvHpOdxuWh7n+8L~fe`1WtSDSZnP@_F(EjrFy$+Vq!f&dLzXmz^k+S5t z0$HGO9F+=YS$jDP`~308&bSpzP2Lw}w#Pb^PMY9sG-wHhTjJ7Y`UnAHuZhWJy?O@~ ze8cGl0$uF*x#isqF+ne|4bKX`50(l863G?kvjL=I^Y31MeSL!G%Ga^1o%qlmm= z$V}+LX~esr#^IBzZ^+7~u|nfIBns-8EZQY?a3OQV)fXH9(qYplFT@Fx?ZQc1fp49; z73oNgwCY>9Nqg0=Aa7Bxe9taa89g<8OYNuSjef>!b?INc#87}@twezdklkA zIU@dZ|MkkV7Ruz>7>t%;GBgrmG?D@>hB|7}UtcxTMEaVp{{Gqr7*CulEryD+ENFod zg#p_EChHWlotpx6;<0T4*ox}>Zm%F%T6f1OErX5}y&?~_5C?ulSApc+-Cj4u&`Q*w z@69y;dSJ*VAeYK+q29G?d$ReVsxaAMT$XhhAT|c6@%eXr7+v`Gmu?%UU_abhWKZS6 zK*(YqYh^1wLz;ht49;&|o7o-S7xAV*y$aLC>@#=%17sq4Xb$uhbHs2=#f>Q^=jPq48+{` zjodF5+*3lcKLVSYIFJAr1SFH}1Jn?Ct2&R(=h8$6uAeF~Y&V;nm|iQEBd0?h)&B+8O6z-orc zD&n~Oo#=}OLB@R7xj#65xEf1o=h=;X#_xt`JXUqk9HdOBV0mX+L2x~{bhqJk_SZag ze^}zcWklw_@fu)y+owF}tYH^gT9m~@t71lHVnBb(AZx!OJPc<3ys$+Hz4dBjh*uep!y(Ri*M<8m?@hmRj!gM6V#u6O zQ5eraEmwACD)SASysEgN!WP%s;!hvuaTiA*?xf75qn&avS1koA)TNg(G&qD@%w~F7 z6O6*Fu^j!rOJJ!qSR^R=bTOIN&}}O!;>S#*XQg3;(36-1Y-dH3 zu|wzV8ir_n4%_yDE5MGQGF){XUKigq05|j+611f2UT>_eKva;hs6+Ow30_f%+pfNt z^M<;_!m`^SOfXIG`wQ{d zA&m)F?|_UNAxjKv;!h4A$PO(xynz(C1)!aG$G&(R58Zk~GVOnV+c7AT$bCv__tJ7` z1`xSvUvCs=1+D{Ib6~4U#ySIxGzmtgGIV3%Uor)K5cNP`-LFi!M#&zN0_TkpeIg=8 z`fBSB>hF5W2R_dAsj-Al`3iCs4(cizDsNQn0D!H<>3zM6BNFOu%h@JR>G$&7^m|E- z{Zezzbsk$NFI5hDgsjHX%YFA28mQ$#!-4e0au8ASV1Q6wa;`<%F;BuC@7ky`y{j^< zYhs4onA=3bD?4DbyPs^1@PkX)6n~}z=PaJFHQTS7S?cz5JciCqgCtLLXR+xz-)+%a zb$-2>J(5~y2uP^vf|FjK`lU+yiZ=|!w*_H`I%4BL<8wL1N(7Gc1R>hShS^svkg79# zR5NgEegVK_X+m_ELf2vamlFJLnhFD!e~};jn|QR0Ey5oNAadBc#%P}YXP7_^t!Sn0 z2a6^YU-L7)ig<8ufY;wo^BDWD-E&tuEl{xd%zrtQ(A!%eGPY~bQ9pXX;cVPX3$cOA z|6$i>2!GnCpmr5n@7;2ZXw?hgsI7%PYFbl@q9oav_d$g`llxTQ1ZEXCKdKm<_lW*S zk;E)wE}F}hejLSsfrOEb)|)wH&d}?d2}HhQxEvLfD67vjB(&s4|Ht0CHd3s6xZiN_ zbrP@NO0bF#YQ`C<{;`PHq|#bF+1Y${%;iDZFr<2({$?4QQCG>}1cOI!uWPRavn)VP(K|w?%YkR=&wpE72Lz& ziU|sN90yp#kW4`dJiTG(2Lgmkwk{)m&ot3mxYZjYrf=@(gBm@{db+e6$|pwh+vXrv zDK8BNO`SY-M`4S>GM!hpl?8%*f_uyCtwwJF6V7EsC1wY|2AG>(fu~}Cu25qVif?6q zBiDllFN*xSPkc6*WLXtJLq-SW|BO@Ksu}(Nbl~) z&y1E~w@9} zwZ1vg$?~VX{t1N?@ii(uM# zYNSwX6;b-qF!-1j#ya}>#Tv{hd0^rtrN^gsvodu&nxN^wsXXiIyx*XzJVxCYl^dFJ zRPtBmroaZRFvE8~_BQ(_;cuAq7lM344P<3xo93chJK%JvZ(%{zn0gY&=PitjtDMIN zFGBcz81s|&=ZiatWF!aCy180_Y;ZOGqZ9*%46cWz*}buNPadd5obCLmlKymeMtHvK zAQD%-5;Q%FbE1mpHThPrj{bH_Ii!qWC!6*AltK(=4`i4ns`AqapMLM}GeF5&9tEDF z%~Ss#Dc+O;)A=U$uKTsr$)K<`R+Oj?w~g3R@E@s*dEw%_n~ik)uZ14R$F>FK;Fs7{ z5IA@H%8#Y%#S3a04I$JzjHy?(KEL8Qe)|QDH*-|$X}rc7Q9NBZ*>jPGKLi~jd=ntg z)m-K5pXWFN4oT0b>OWWR;yb^p(5Dm4(a+GnH7b@VjXU^2(2OvTGmT)mC|uMT5;KYT zF=yYhK$tK;=A(j5oc77VNaS%dkWrU|%}kgULosN?7@q#fbfe(K_`Di#z3=t8$sn<) zm4%pb-&eqC=+5ZHD!xC-y5Gej1W}d>F@u{9S!M?LO6!h=Zp=qD(gg{68$C}zrhL|~ zIC?!Qf1dZIiwukkUuCpM+2c39{gM9Mwn$O3PEFXelZV;&>J+!i->av}a+HbZafd!5 zR;f^pQ3+0E)RN1%M#x$_K&}bp0wJ$rtkp^G(CzBhDcm3KMf1q)*RIarUMzh8m#)(` zzZ3LUL_nM57<*ydUif43#64YU`Yt4S#6KC98z_dMV=m~2xp_gW+jBLDo#}E@ZLg%G zkFC=T7Pa}~`2B;(Dz4&41&u6L0b;KbI>%0us)!$LE(3z1VQfp!3V6w4pA~iS4TmTy^P}h1hJbVD2Ji{GX*XLPM#pBpLNuKl=+IH^Nr7DxX9?AHYs*GfoHd$V_S2Kec-753YMt$3Cz|*??(WB_gK&s&vDxRISqrTI zXz;{G3D>`5UgTqNMbc+6k3w5LrH@bEcU9{HY$sH(%GSQ}*kw!-YgVvWOzO)-HkEUT zmVV5TpcCC@sFX++ilwmYa4#CXwH;R3dGxY^z14bZaO-3Hsj^`7FQEqRrX$*XWg!XH(N5l{)S%&Q%|YHm?cW&RdodSzo3t6Shin*CYS z-V(=tr;$+$CXh29`^pC}(GrZZH-NgT@bGCkGLl#fZ%L zw5hyVRJ3VXF|ej@Os(l!IQH{)goB*o0DnA0tRa%Go&#^r{3p&@QtQ^}kB+5y2&=V< zld9(s?

K)neH&zA!CJpf>h}--8p{{#(~3RK#)zW+)3Qt<3JkQGW{WBv|z z5i^vCKGS>7JR9dt{G%P#qZ$*<@YJ^TM6OhfbEuvT#g8V$3`3-BgRiB5&_!ZG z7t=cV(NZ+v$1dk-q*G7|g!5~l#Fl)VhlIi*C@1x}bvk^)W9%LuYn-M?5Bc9J?96I0 zgXDo0q?dhKeou7=a-VTK-Tm7PNA<>$!V?V*0O;pX?b*ki4+U6fs4MR*NT0fWjf4V8xvYL>&!vM=_|D~aaZdIm692eK0(&_vj^F9*iF)b2F{R|OKMV>EEne2Cp17H z{hTj6h7ioE;swaZ#wksPg^8F3%>dmp&0-2`ZBypH&RV71{3Ge^z%m0vKNgab7>;I=G`c6)+}uCmcwMir4#q&M~RY&&YrEt~>J~&!Di+ z>E=eZ#9$!oobQgN!Pm3`hU}zT6?Z0~o@=cx(HVc<_Yk|T52S>~ko-)9bnENNGodH3 z0pWD0z>?|Ffqlw*H%G%7yOQ6WUQklpg6;_ghk9FY^ohjT-&U)BfMjV1KF^Y7`dzK# zYBf;-GfD5aM?tNrRh{rLd;jY>ZMArveqt|{SHHT+RFurk*-YVEnsyZqsP?j-4YZ%R z(bw7j)YyMe)_H%_*#Sg0xEcfNe#t8XnE}@7Gs2~H>;jf?L;&FjBL+4hK~+8w*#6ki z=V+TDtp)Idg|S>Ue9dh@V*5#pjP=n|5&?8-PG$OYI-gW=AenaoP*I_D0sb+uA{=&(**2HHTn;Mp1w?~7 zl06KntjRb2F@xw^Al0$UJbOn#STrt}P~X)dh~$+{W9Id1C#4XTsMXXTc3jwBhu}PC z#6x=xg*=O7v)a#v^{%yD5)v)Q5;jImxZI(*#_9R5{ zK*#XC+sAelsf`Cta0e=<5FhBr)C|IYy+#-ILJHoJw_sQ+O}F9?0k=3ez7o<>tG@#x zdEj|ym^(P;%%#8(X|E0-rTvZi^v*|J&q7oCIT={3p0jHS z(xrXtrR3%?am`RL1GZijm3}I;&uqe#9E0jMXYVDZbRR&fiGMFz0J!4;@h}1g-2c|C zm-4@_Xb`qrtp5SBoD^kaIQ3>2P5*s1=$#t|IdwZ%;8mMykBTB%GKGU{GO;2Bc7%j~lK4Zp zuo$46%R9Cp0Kr#autj%Lx7tL!W`8I*3d}?V-+)=!L%TmUfXUmtdHeTaA{fMha--&{ z1QZVw{u{SfFgK$`HRJ#GFNU+8C!r0ffa%+FU}Art=oJDu3vu8UfXgbTm<#DYbasr5 zp(oMpj?49-95F3W?tcgMu%iFFQvXle@1AIy?djiZcjfy>z@Lhurb4Nl@t6MtwmIMZ literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/volumeAnnotationTiled.spec.ts/lengthTool.png b/tests/screenshots/webkit/volumeAnnotationTiled.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..e6fa107912d4858deae4a79920f61f4bdbf1966c GIT binary patch literal 60828 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�>Nd7r3~j01NeK`L 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 literal 0 HcmV?d00001 diff --git a/tests/screenshots/webkit/volumeBasicTiled.spec.ts/viewport.png b/tests/screenshots/webkit/volumeBasicTiled.spec.ts/viewport.png new file mode 100644 index 0000000000000000000000000000000000000000..ca77e01f763444d49b628d3baa5952c44d12d176 GIT binary patch literal 114100 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 z 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

_{`?Fw=yzJ0fce<=h(O z`=JksgN9Bt#De&PNqnqW!mbB!I5Y_p<2S;G&(Jy;E<28X@asSP74zTHWB3YTWE&M} zS+}zNVwW)X&^*$H=DcI-HdA61+HH2<1NPHW);Qw-s^M;)$0`ikjUmNtQb;qEqw%LO;c}-hNn#kmY|uG1VGvVa_4w zw1u4jhg5t_)FhE-r&FBbr-`GUoxSH)QFIvcxJWjNJe#Y0c zQA^~OXb@F8Qpn{hZua9;%VGrV5{;VuU`r?O&dKn2f4|$|yrf6?M|Z>G?6Oofni~W> z(Tig@4X3W>c`ART+Bin<7RIDzjd@F`H)9n5=0hq<%Z-8o8OpBA6G%qYTJDWIl}Rgt zG7@m)5NaNB$4h5I9k@^;ZU+3!{x%FIc&Q%`32V!Z7$p13#SQ?L+?UD-NiAL2WF?Hj zwY;`N+KLDpMYyO__I+<~7&2n1tIVCLxKFG?tjU#@txAMicj}V3fS&C{XyBk#D6WPJ zww>qLWdMX;mvRareUWU&e*1HBb-BkXieuUn)>1ljFqI942!e^^^w850MrubTV}*Wz zoHZN%SE}8+T`n4Y)O3wKf7^lR@H)WHLT;sl8nvEDwX38{f?=zExysj3G1{AQI}*&6rRd0r9XrK+W)?a1 zWZAr^V|Ykvm-p;wWV;47cNh@s2x+vDqJMvL8?SlvlzbRNo25U+iE0vIq#NzLTzwp=DK`r_>KnDAK1{=xl1Y3Vdr@!9kt+HJPiw6 z_fB~~A|V!PnEn*=03Cq~X80+sPqBn)jkx!l%{DyKX|?JGoOmyMo#k0yIb+0eV`Kv1E|2s#g7<9%XfP&9I=7ZIEdKV zquIUL^jA0Xm}x>;{!IEUUeMIjRL~u9oGlWeOM4&xJSbM!_Zp^$Odx#u!}0UJsQfc= zv6@&F%&o4qt-cc&wc(bF;S@0#0Q*;mOL^7(z)WzkcG>F8P__18>hrZe(*;>D(RFmg z4CE{X=1=ELIY0d#r~Uta9PgL*O_CUc9`(Sn{8u%7 z*ac}!HJx2u?d>2XH#x153_rO=3m1`rop7>q&(6BJB9a1m)hu15;W&eT?1q=kM0Od= zRS7s>_X1qAt#-MXLm6`fGEbNvvbkqQ8UHd8r9Pg%SQ57T&gr*CoFlerT#e=L!#|g+ zX$V{BVw+0(_!k1-M3*usBz>xo9o>|b*3kzv1!`PUxTAA?EO;2U9t@aqE|1t5B% zda&QMshrpJUc0Z4QXj;hw>p`{;y%^@+4UV~{}NER6;96)X+exT3KZnM2xF=SZ=W`GU4_(E zE4xj$7G9{<%ZehM))toCV-3Yy7#{q6VUhZ17*KDgGD z8CF}pxw>2zA8X{{K_xl4)LaTXg~9bDk=n33Vq@kpL&$W-J4q`9129d7|jJotoi`5&XI*45H z%0D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 { + await visitExample(page, 'stackAnnotationTools'); +}); + +test.describe('Stack Annotation Tools', async () => { + test('should draw a length measurement on the viewport', async ({ page }) => { + const locator = page.locator('.cornerstone-canvas').nth(0); + await simulateDrag(page, locator); + await checkForScreenshot( + page, + locator, + screenShotPaths.stackAnnotation.lengthTool + ); + }); +}); diff --git a/tests/stackAnnotationTiled.spec.ts b/tests/stackAnnotationTiled.spec.ts new file mode 100644 index 0000000000..e4534667bd --- /dev/null +++ b/tests/stackAnnotationTiled.spec.ts @@ -0,0 +1,24 @@ +import { test } from 'playwright-test-coverage'; +import { + visitExample, + checkForScreenshot, + screenShotPaths, + simulateDrag, +} from './utils/index'; + +test.beforeEach(async ({ page, context }) => { + await context.addInitScript(() => (window.IS_TILED = true)); + await visitExample(page, 'stackAnnotationTools'); +}); + +test.describe('Stack Annotation Tools - Tiled', async () => { + test('should draw a length measurement on the viewport', async ({ page }) => { + const locator = page.locator('.cornerstone-canvas').nth(0); + await simulateDrag(page, locator); + await checkForScreenshot( + page, + locator, + screenShotPaths.stackAnnotationTiled.lengthTool + ); + }); +}); diff --git a/tests/stackBasicTiled.spec.ts b/tests/stackBasicTiled.spec.ts new file mode 100644 index 0000000000..ae04aaed4f --- /dev/null +++ b/tests/stackBasicTiled.spec.ts @@ -0,0 +1,24 @@ +import { test } from 'playwright-test-coverage'; +import { + visitExample, + checkForScreenshot, + screenShotPaths, +} from './utils/index'; + +test.beforeEach(async ({ page, context }) => { + await visitExample(page, 'stackBasic'); + await context.addInitScript(() => (window.IS_TILED = true)); +}); + +test.describe('Basic Stack', async () => { + test('should display a single DICOM image in a Stack viewport', async ({ + page, + }) => { + const locator = page.locator('.cornerstone-canvas'); + await checkForScreenshot( + page, + locator, + screenShotPaths.stackBasicTiled.viewport + ); + }); +}); diff --git a/tests/utils/screenShotPaths.ts b/tests/utils/screenShotPaths.ts index f588a7a327..ae04c76e5c 100644 --- a/tests/utils/screenShotPaths.ts +++ b/tests/utils/screenShotPaths.ts @@ -14,6 +14,9 @@ const screenShotPaths = { stackBasic: { viewport: 'viewport.png', }, + stackBasicTiled: { + viewport: 'viewport.png', + }, stackToVolumeFusion: { viewport: 'viewport.png', }, @@ -50,6 +53,9 @@ const screenShotPaths = { volumeBasic: { viewport: 'viewport.png', }, + volumeBasicTiled: { + viewport: 'viewport.png', + }, ultrasoundColors: { slice1: 'slice1.png', slice2: 'slice2.png', @@ -116,9 +122,17 @@ const screenShotPaths = { coronal: 'coronal.png', sagittal: 'sagittal.png', }, + labelmapRenderingTiled: { + axial: 'axial.png', + coronal: 'coronal.png', + sagittal: 'sagittal.png', + }, contourRendering: { viewport: 'viewport.png', }, + contourRenderingTiled: { + viewport: 'viewport.png', + }, labelmapGlobalConfiguration: { defaultGlobalConfig: 'defaultGlobalConfig.png', toggleInactiveSegmentation: 'toggleInactiveSegmentation.png', @@ -194,9 +208,21 @@ const screenShotPaths = { afterReformat: 'mpr-reformat-after.png', afterInteraction: 'mpr-reformat-after-interaction.png', }, - sequentialRenderingEngine: { + contextPoolRenderingEngine: { viewport: 'viewport.png', }, + volumeAnnotation: { + lengthTool: 'lengthTool.png', + }, + volumeAnnotationTiled: { + lengthTool: 'lengthTool.png', + }, + stackAnnotation: { + lengthTool: 'lengthTool.png', + }, + stackAnnotationTiled: { + lengthTool: 'lengthTool.png', + }, }; export { screenShotPaths }; diff --git a/tests/volumeAnnotation.spec.ts b/tests/volumeAnnotation.spec.ts new file mode 100644 index 0000000000..fed7bf4504 --- /dev/null +++ b/tests/volumeAnnotation.spec.ts @@ -0,0 +1,23 @@ +import { test } from 'playwright-test-coverage'; +import { + visitExample, + checkForScreenshot, + screenShotPaths, + simulateDrag, +} from './utils/index'; + +test.beforeEach(async ({ page }) => { + await visitExample(page, 'volumeAnnotationTools'); +}); + +test.describe('Volume Annotation Tools', async () => { + test('should draw a length measurement on the viewport', async ({ page }) => { + const locator = page.locator('.cornerstone-canvas').nth(0); + await simulateDrag(page, locator); + await checkForScreenshot( + page, + locator, + screenShotPaths.volumeAnnotation.lengthTool + ); + }); +}); diff --git a/tests/volumeAnnotationTiled.spec.ts b/tests/volumeAnnotationTiled.spec.ts new file mode 100644 index 0000000000..c00cd95b33 --- /dev/null +++ b/tests/volumeAnnotationTiled.spec.ts @@ -0,0 +1,24 @@ +import { test } from 'playwright-test-coverage'; +import { + visitExample, + checkForScreenshot, + screenShotPaths, + simulateDrag, +} from './utils/index'; + +test.beforeEach(async ({ page, context }) => { + await context.addInitScript(() => (window.IS_TILED = true)); + await visitExample(page, 'volumeAnnotationTools'); +}); + +test.describe('Volume Annotation Tools - Tiled', async () => { + test('should draw a length measurement on the viewport', async ({ page }) => { + const locator = page.locator('.cornerstone-canvas').nth(0); + await simulateDrag(page, locator); + await checkForScreenshot( + page, + locator, + screenShotPaths.volumeAnnotationTiled.lengthTool + ); + }); +}); diff --git a/tests/volumeBasicTiled.spec.ts b/tests/volumeBasicTiled.spec.ts new file mode 100644 index 0000000000..f95eef83bb --- /dev/null +++ b/tests/volumeBasicTiled.spec.ts @@ -0,0 +1,25 @@ +import { test } from 'playwright-test-coverage'; +import { + visitExample, + checkForScreenshot, + screenShotPaths, +} from './utils/index'; + +test.beforeEach(async ({ page, context }) => { + await visitExample(page, 'volumeBasic'); + await context.addInitScript(() => (window.IS_TILED = true)); +}); + +test.describe('Basic Volume', async () => { + test('should display a single DICOM series in a Volume viewport.', async ({ + page, + }) => { + // Now take the screenshot + const locator = page.locator('.cornerstone-canvas'); + await checkForScreenshot( + page, + locator, + screenShotPaths.volumeBasicTiled.viewport + ); + }); +}); diff --git a/utils/ExampleRunner/example-info.json b/utils/ExampleRunner/example-info.json index de7013e3cf..e74bc869b1 100644 --- a/utils/ExampleRunner/example-info.json +++ b/utils/ExampleRunner/example-info.json @@ -153,13 +153,17 @@ "name": "Custom Web Worker Function", "description": "Demonstrates how to use the web worker manager to register and execute custom web worker functions off the main thread" }, - "sequentialrenderingengine": { - "name": "6x6 Grid with SequentialRenderingEngine", - "description": "Displays a 6x6 grid of viewports using SequentialRenderingEngine for better performance with large viewport counts" + "contextpoolrenderingengine": { + "name": "6x6 Grid with ContextPoolRenderingEngine", + "description": "Displays a 6x6 grid of viewports using ContextPoolRenderingEngine for better performance with large viewport counts" }, "ptctmultimonitor": { "name": "PET-CT Multi-Monitor Layout", - "description": "Demonstrates how to create a multi-monitor layout with PET-CT fusion using the Sequential RenderingEngine" + "description": "Demonstrates how to create a multi-monitor layout with PET-CT fusion using the ContextPoolRenderingEngine" + }, + "webGLContextPooling": { + "name": "WebGL Context Pooling", + "description": "Demonstrates how to use WebGL context pooling to render many viewports in sync using ContextPoolRenderingEngine" } }, "tools-basic": { diff --git a/utils/demo/helpers/index.js b/utils/demo/helpers/index.js index b399c7fcc5..220bf30626 100644 --- a/utils/demo/helpers/index.js +++ b/utils/demo/helpers/index.js @@ -20,6 +20,8 @@ import createInfoSection from './createInfoSection'; import downloadSurfacesData from './downloadSurfacesData'; import getLocalUrl from './getLocalUrl'; import initDemo from './initDemo'; +import initProviders from './initProviders'; +import initVolumeLoader from './initVolumeLoader'; import labelmapTools from './labelmapTools'; import setCtTransferFunctionForVolumeActor, { ctVoiRange, @@ -59,6 +61,8 @@ export { downloadSurfacesData, getLocalUrl, initDemo, + initProviders, + initVolumeLoader, labelmapTools, setCtTransferFunctionForVolumeActor, setPetColorMapTransferFunctionForVolumeActor, From c57d1b48422c94bd6818dec244cb8b508d817330 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 11 Jul 2025 02:18:54 +0000 Subject: [PATCH 047/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 6b835fc5f1..891cf439e3 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -09d1ee059ece80088affe1a4953dc67b71c07aa9 \ No newline at end of file +dc8fb42c833bbe30dbbc6c1ab3011ece9d5c7f42 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index c79d46c7f9..f211b3167b 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.5", - "@cornerstonejs/tools": "^3.29.5" + "@cornerstonejs/core": "^3.30.0", + "@cornerstonejs/tools": "^3.30.0" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index ff9c67debb..79e77c132c 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.5", - "@cornerstonejs/tools": "^3.29.5" + "@cornerstonejs/core": "^3.30.0", + "@cornerstonejs/tools": "^3.30.0" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 13e515f3f3..b258f45da4 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.5", + "@cornerstonejs/core": "^3.30.0", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index f124121d67..551ebc0a84 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.29.5", - "@cornerstonejs/core": "^3.29.5", - "@cornerstonejs/dicom-image-loader": "^3.29.5", - "@cornerstonejs/nifti-volume-loader": "^3.29.5", - "@cornerstonejs/tools": "^3.29.5", + "@cornerstonejs/adapters": "^3.30.0", + "@cornerstonejs/core": "^3.30.0", + "@cornerstonejs/dicom-image-loader": "^3.30.0", + "@cornerstonejs/nifti-volume-loader": "^3.30.0", + "@cornerstonejs/tools": "^3.30.0", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index cf4e87bf6b..eabf94b70e 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.5", - "@cornerstonejs/tools": "^3.29.5", + "@cornerstonejs/core": "^3.30.0", + "@cornerstonejs/tools": "^3.30.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 80203d84c0..f039681bcd 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.5" + "@cornerstonejs/core": "^3.30.0" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 0d5081c4cb..d14e498aed 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.5", - "@cornerstonejs/tools": "^3.29.5", + "@cornerstonejs/core": "^3.30.0", + "@cornerstonejs/tools": "^3.30.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 853f3da41c..7b8cbe3c71 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.29.5", + "@cornerstonejs/core": "^3.30.0", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index a64549f96e..171b1a6cc1 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.29.5", - "commit": "09d1ee059ece80088affe1a4953dc67b71c07aa9" + "version": "3.30.0", + "commit": "dc8fb42c833bbe30dbbc6c1ab3011ece9d5c7f42" } \ No newline at end of file diff --git a/version.txt b/version.txt index 659f7c47d7..fdcc4697cc 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.29.5 \ No newline at end of file +3.30.0 \ No newline at end of file From 3c38e8db4a5128f28da4281dcd4ed17d691895be Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 11 Jul 2025 02:19:12 +0000 Subject: [PATCH 048/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 51 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3c893895c..f1b3ce5174 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) + +### Features + +- **rendering:** Introduce WebGLContextPool for parallel rendering in ContextPoolRenderingEngine ([#2190](https://github.com/cornerstonejs/cornerstone3D/issues/2190)) ([dc8fb42](https://github.com/cornerstonejs/cornerstone3D/commit/dc8fb42c833bbe30dbbc6c1ab3011ece9d5c7f42)) + ## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 3bb1f96e7d..dafcf3fee1 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.29.5", + "version": "3.30.0", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index c8ed09d84a..8adcea2465 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index f211b3167b..11dd2b0f66 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.29.5", + "version": "3.30.0", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index daa667a841..8a7719b8d2 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 79e77c132c..4dda9dfb59 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.29.5", + "version": "3.30.0", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 6fb08330ca..80adb9832b 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) + +### Features + +- **rendering:** Introduce WebGLContextPool for parallel rendering in ContextPoolRenderingEngine ([#2190](https://github.com/cornerstonejs/cornerstone3D/issues/2190)) ([dc8fb42](https://github.com/cornerstonejs/cornerstone3D/commit/dc8fb42c833bbe30dbbc6c1ab3011ece9d5c7f42)) + ## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 3c19d11f36..86d42fa025 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.29.5", + "version": "3.30.0", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 13abf9c5bb..3c0f7db7d2 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index b258f45da4..48c4cc91dd 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.29.5", + "version": "3.30.0", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 8caf569a16..8f1b8c87ec 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index eabf94b70e..81d2c8ff05 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.29.5", + "version": "3.30.0", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index b0dbd0efde..3b56d89c3e 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index f039681bcd..ef49c91623 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.29.5", + "version": "3.30.0", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 2f2bafa29c..7ac9683945 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index d14e498aed..96523ce2e1 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.29.5", + "version": "3.30.0", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index c12e586754..00925f8c2c 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) + +### Features + +- **rendering:** Introduce WebGLContextPool for parallel rendering in ContextPoolRenderingEngine ([#2190](https://github.com/cornerstonejs/cornerstone3D/issues/2190)) ([dc8fb42](https://github.com/cornerstonejs/cornerstone3D/commit/dc8fb42c833bbe30dbbc6c1ab3011ece9d5c7f42)) + ## [3.29.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.4...v3.29.5) (2025-07-10) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 7b8cbe3c71..ba69970444 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.29.5", + "version": "3.30.0", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From f1bc10daabe26e00c716747b29365ed040e402cd Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 11 Jul 2025 02:19:23 +0000 Subject: [PATCH 049/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 21a092ce0e..7bde3e6fc8 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.29.5"; +export const version = "3.30.0"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 884757ed7b..d40c9a8883 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.5'; +export const version = '3.30.0'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 884757ed7b..d40c9a8883 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.5'; +export const version = '3.30.0'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 884757ed7b..d40c9a8883 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.5'; +export const version = '3.30.0'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 884757ed7b..d40c9a8883 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.5'; +export const version = '3.30.0'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 884757ed7b..d40c9a8883 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.5'; +export const version = '3.30.0'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 884757ed7b..d40c9a8883 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.5'; +export const version = '3.30.0'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 884757ed7b..d40c9a8883 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.5'; +export const version = '3.30.0'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 884757ed7b..d40c9a8883 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.29.5'; +export const version = '3.30.0'; From e5d102762506a2afd686f3dd3ffb8a84447992ec Mon Sep 17 00:00:00 2001 From: rodrigobasilio2022 <114958722+rodrigobasilio2022@users.noreply.github.com> Date: Fri, 11 Jul 2025 11:21:39 -0300 Subject: [PATCH 050/212] fix: US flipping bug (#2194) --- packages/core/src/utilities/getPixelSpacingInformation.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/core/src/utilities/getPixelSpacingInformation.ts b/packages/core/src/utilities/getPixelSpacingInformation.ts index c2545c2251..94e423ee61 100644 --- a/packages/core/src/utilities/getPixelSpacingInformation.ts +++ b/packages/core/src/utilities/getPixelSpacingInformation.ts @@ -110,7 +110,10 @@ function calculateUSPixelSpacing(instance) { const { PhysicalDeltaX, PhysicalDeltaY } = isArrayOfSequences ? SequenceOfUltrasoundRegions[0] : SequenceOfUltrasoundRegions; - const USPixelSpacing = [PhysicalDeltaX * 10, PhysicalDeltaY * 10]; + const USPixelSpacing = [ + Math.abs(PhysicalDeltaX) * 10, + Math.abs(PhysicalDeltaY) * 10, + ]; return { PixelSpacing: USPixelSpacing, From ce1c5427bba71602770afa9730dafd8da35ace55 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 11 Jul 2025 14:25:13 +0000 Subject: [PATCH 051/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 891cf439e3..88e14dc1e2 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -dc8fb42c833bbe30dbbc6c1ab3011ece9d5c7f42 \ No newline at end of file +e5d102762506a2afd686f3dd3ffb8a84447992ec \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 11dd2b0f66..44ce7045af 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.0", - "@cornerstonejs/tools": "^3.30.0" + "@cornerstonejs/core": "^3.30.1", + "@cornerstonejs/tools": "^3.30.1" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 4dda9dfb59..b9cb4b207d 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.0", - "@cornerstonejs/tools": "^3.30.0" + "@cornerstonejs/core": "^3.30.1", + "@cornerstonejs/tools": "^3.30.1" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 48c4cc91dd..2fc6849666 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.0", + "@cornerstonejs/core": "^3.30.1", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 551ebc0a84..b842c3d82c 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.30.0", - "@cornerstonejs/core": "^3.30.0", - "@cornerstonejs/dicom-image-loader": "^3.30.0", - "@cornerstonejs/nifti-volume-loader": "^3.30.0", - "@cornerstonejs/tools": "^3.30.0", + "@cornerstonejs/adapters": "^3.30.1", + "@cornerstonejs/core": "^3.30.1", + "@cornerstonejs/dicom-image-loader": "^3.30.1", + "@cornerstonejs/nifti-volume-loader": "^3.30.1", + "@cornerstonejs/tools": "^3.30.1", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 81d2c8ff05..f109eec49a 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.0", - "@cornerstonejs/tools": "^3.30.0", + "@cornerstonejs/core": "^3.30.1", + "@cornerstonejs/tools": "^3.30.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index ef49c91623..df121863e1 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.0" + "@cornerstonejs/core": "^3.30.1" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 96523ce2e1..525c12d18f 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.0", - "@cornerstonejs/tools": "^3.30.0", + "@cornerstonejs/core": "^3.30.1", + "@cornerstonejs/tools": "^3.30.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index ba69970444..f44e5edee5 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.0", + "@cornerstonejs/core": "^3.30.1", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 171b1a6cc1..92354d0e8a 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.30.0", - "commit": "dc8fb42c833bbe30dbbc6c1ab3011ece9d5c7f42" + "version": "3.30.1", + "commit": "e5d102762506a2afd686f3dd3ffb8a84447992ec" } \ No newline at end of file diff --git a/version.txt b/version.txt index fdcc4697cc..7f71317e6e 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.30.0 \ No newline at end of file +3.30.1 \ No newline at end of file From d8b3a2a321b48d6508eb570089870dd3173c97c0 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 11 Jul 2025 14:25:31 +0000 Subject: [PATCH 052/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1b3ce5174..73b56b7991 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) + +### Bug Fixes + +- US flipping bug ([#2194](https://github.com/cornerstonejs/cornerstone3D/issues/2194)) ([e5d1027](https://github.com/cornerstonejs/cornerstone3D/commit/e5d102762506a2afd686f3dd3ffb8a84447992ec)) + # [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) ### Features diff --git a/lerna.json b/lerna.json index dafcf3fee1..1f75cb661e 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.30.0", + "version": "3.30.1", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 8adcea2465..74bfd75f1c 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/adapters + # [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 44ce7045af..5ead663181 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.30.0", + "version": "3.30.1", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 8a7719b8d2..e0a06e3766 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/ai + # [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index b9cb4b207d..c93d2b660f 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.30.0", + "version": "3.30.1", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 80adb9832b..627b35f45e 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) + +### Bug Fixes + +- US flipping bug ([#2194](https://github.com/cornerstonejs/cornerstone3D/issues/2194)) ([e5d1027](https://github.com/cornerstonejs/cornerstone3D/commit/e5d102762506a2afd686f3dd3ffb8a84447992ec)) + # [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) ### Features diff --git a/packages/core/package.json b/packages/core/package.json index 86d42fa025..ff294fd18a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.30.0", + "version": "3.30.1", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 3c0f7db7d2..43d79e5df2 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + # [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 2fc6849666..1f041c519d 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.30.0", + "version": "3.30.1", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 8f1b8c87ec..51c9995893 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + # [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index f109eec49a..a37614bffe 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.30.0", + "version": "3.30.1", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 3b56d89c3e..c5215792cb 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + # [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index df121863e1..75225d570b 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.30.0", + "version": "3.30.1", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 7ac9683945..accced3148 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + # [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 525c12d18f..f56af05a8a 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.30.0", + "version": "3.30.1", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 00925f8c2c..6b1511afbb 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/tools + # [3.30.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.5...v3.30.0) (2025-07-11) ### Features diff --git a/packages/tools/package.json b/packages/tools/package.json index f44e5edee5..4e459d0955 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.30.0", + "version": "3.30.1", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 1ac2366db0ddd23ef7d269192eb6ce233d32bd2a Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 11 Jul 2025 14:25:42 +0000 Subject: [PATCH 053/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 7bde3e6fc8..758aca8ce1 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.30.0"; +export const version = "3.30.1"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index d40c9a8883..3b9e042988 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.0'; +export const version = '3.30.1'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index d40c9a8883..3b9e042988 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.0'; +export const version = '3.30.1'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index d40c9a8883..3b9e042988 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.0'; +export const version = '3.30.1'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index d40c9a8883..3b9e042988 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.0'; +export const version = '3.30.1'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index d40c9a8883..3b9e042988 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.0'; +export const version = '3.30.1'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index d40c9a8883..3b9e042988 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.0'; +export const version = '3.30.1'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index d40c9a8883..3b9e042988 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.0'; +export const version = '3.30.1'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index d40c9a8883..3b9e042988 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.0'; +export const version = '3.30.1'; From 98c4d0f96f84ce04f1288b96d179f2ac9592c2b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=AFd?= <36410230+trsaid@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:13:26 +0200 Subject: [PATCH 054/212] fix(cursor): skip reset when useCursors is disabled (#2158) * fix(cursor): skip reset when useCursor is disabled * Fixed formatting issues. Co-authored-by: Joe Boccanfuso --- .../src/store/ToolGroupManager/ToolGroup.ts | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/tools/src/store/ToolGroupManager/ToolGroup.ts b/packages/tools/src/store/ToolGroupManager/ToolGroup.ts index 9c561120bc..8537b8aba8 100644 --- a/packages/tools/src/store/ToolGroupManager/ToolGroup.ts +++ b/packages/tools/src/store/ToolGroupManager/ToolGroup.ts @@ -225,10 +225,7 @@ export default class ToolGroup { // Handle the newly added viewport's mouse cursor const toolName = this.getActivePrimaryMouseButtonTool(); - const runtimeSettings = Settings.getRuntimeSettings(); - if (runtimeSettings.get('useCursors')) { - this.setViewportsCursorByToolName(toolName); - } + this.setViewportsCursorByToolName(toolName); const eventDetail = { toolGroupId: this.id, @@ -400,19 +397,16 @@ export default class ToolGroup { this.toolOptions[toolName] = toolOptions; this._toolInstances[toolName].mode = Active; - // reset the mouse cursor if tool has left click binding - const runtimeSettings = Settings.getRuntimeSettings(); - const useCursor = runtimeSettings.get('useCursors'); - - if (this._hasMousePrimaryButtonBinding(toolBindingsOptions) && useCursor) { - this.setViewportsCursorByToolName(toolName); - } else { + if (!this._hasMousePrimaryButtonBinding(toolBindingsOptions)) { // reset to default cursor only if there is no other tool with primary binding const activeToolIdentifier = this.getActivePrimaryMouseButtonTool(); - if (!activeToolIdentifier && useCursor) { + if (!activeToolIdentifier) { const cursor = MouseCursor.getDefinedCursor('default'); this._setCursorForViewports(cursor); } + } else { + // reset the mouse cursor if tool has left click binding + this.setViewportsCursorByToolName(toolName); } // if it is a primary tool binding, we should store it as the previous primary tool @@ -663,6 +657,11 @@ export default class ToolGroup { } _setCursorForViewports(cursor: MouseCursor): void { + const runtimeSettings = Settings.getRuntimeSettings(); + if (!runtimeSettings.get('useCursors')) { + return; + } + this.viewportsInfo.forEach(({ renderingEngineId, viewportId }) => { const enabledElement = getEnabledElementByIds( viewportId, From ca8156ac7f45e75184e2cd3aefc342bb912bf4dc Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 11 Jul 2025 17:17:05 +0000 Subject: [PATCH 055/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 88e14dc1e2..e403646a6b 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -e5d102762506a2afd686f3dd3ffb8a84447992ec \ No newline at end of file +98c4d0f96f84ce04f1288b96d179f2ac9592c2b3 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 5ead663181..28bfd8a0b6 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.1", - "@cornerstonejs/tools": "^3.30.1" + "@cornerstonejs/core": "^3.30.2", + "@cornerstonejs/tools": "^3.30.2" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index c93d2b660f..74ed7b333c 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.1", - "@cornerstonejs/tools": "^3.30.1" + "@cornerstonejs/core": "^3.30.2", + "@cornerstonejs/tools": "^3.30.2" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 1f041c519d..62c61831ba 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.1", + "@cornerstonejs/core": "^3.30.2", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index b842c3d82c..d6134c92ef 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.30.1", - "@cornerstonejs/core": "^3.30.1", - "@cornerstonejs/dicom-image-loader": "^3.30.1", - "@cornerstonejs/nifti-volume-loader": "^3.30.1", - "@cornerstonejs/tools": "^3.30.1", + "@cornerstonejs/adapters": "^3.30.2", + "@cornerstonejs/core": "^3.30.2", + "@cornerstonejs/dicom-image-loader": "^3.30.2", + "@cornerstonejs/nifti-volume-loader": "^3.30.2", + "@cornerstonejs/tools": "^3.30.2", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index a37614bffe..8d9b22a57d 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.1", - "@cornerstonejs/tools": "^3.30.1", + "@cornerstonejs/core": "^3.30.2", + "@cornerstonejs/tools": "^3.30.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 75225d570b..5acd857143 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.1" + "@cornerstonejs/core": "^3.30.2" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index f56af05a8a..63c897c6f6 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.1", - "@cornerstonejs/tools": "^3.30.1", + "@cornerstonejs/core": "^3.30.2", + "@cornerstonejs/tools": "^3.30.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 4e459d0955..ebddff597a 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.1", + "@cornerstonejs/core": "^3.30.2", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 92354d0e8a..c904168d3c 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.30.1", - "commit": "e5d102762506a2afd686f3dd3ffb8a84447992ec" + "version": "3.30.2", + "commit": "98c4d0f96f84ce04f1288b96d179f2ac9592c2b3" } \ No newline at end of file diff --git a/version.txt b/version.txt index 7f71317e6e..59bc46bf0a 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.30.1 \ No newline at end of file +3.30.2 \ No newline at end of file From 1c10b9015878ba0b312e16616b37399d2ba8e9e1 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 11 Jul 2025 17:17:20 +0000 Subject: [PATCH 056/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73b56b7991..eeede3d242 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) + +### Bug Fixes + +- **cursor:** skip reset when useCursors is disabled ([#2158](https://github.com/cornerstonejs/cornerstone3D/issues/2158)) ([98c4d0f](https://github.com/cornerstonejs/cornerstone3D/commit/98c4d0f96f84ce04f1288b96d179f2ac9592c2b3)) + ## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 1f75cb661e..d81fc3d150 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.30.1", + "version": "3.30.2", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 74bfd75f1c..a89b26b873 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 28bfd8a0b6..0577df83ab 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.30.1", + "version": "3.30.2", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index e0a06e3766..8cb3c30bb1 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 74ed7b333c..9501ab18a1 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.30.1", + "version": "3.30.2", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 627b35f45e..9d7e8bf504 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index ff294fd18a..3b266e5d8b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.30.1", + "version": "3.30.2", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 43d79e5df2..2cb74e742e 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 62c61831ba..b205adc6ad 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.30.1", + "version": "3.30.2", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 51c9995893..7843d0e37b 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 8d9b22a57d..c6827581da 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.30.1", + "version": "3.30.2", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index c5215792cb..6f4bfad19b 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 5acd857143..555171a32d 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.30.1", + "version": "3.30.2", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index accced3148..3c1d0d25a8 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 63c897c6f6..81f8d41299 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.30.1", + "version": "3.30.2", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 6b1511afbb..2f01886bb9 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) + +### Bug Fixes + +- **cursor:** skip reset when useCursors is disabled ([#2158](https://github.com/cornerstonejs/cornerstone3D/issues/2158)) ([98c4d0f](https://github.com/cornerstonejs/cornerstone3D/commit/98c4d0f96f84ce04f1288b96d179f2ac9592c2b3)) + ## [3.30.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.0...v3.30.1) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index ebddff597a..1edc246a9e 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.30.1", + "version": "3.30.2", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 14dd69664398fc818b20df327125c8a73b6a1aca Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 11 Jul 2025 17:17:31 +0000 Subject: [PATCH 057/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 758aca8ce1..d84370ded6 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.30.1"; +export const version = "3.30.2"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 3b9e042988..5df564c88b 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.1'; +export const version = '3.30.2'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 3b9e042988..5df564c88b 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.1'; +export const version = '3.30.2'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 3b9e042988..5df564c88b 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.1'; +export const version = '3.30.2'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 3b9e042988..5df564c88b 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.1'; +export const version = '3.30.2'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 3b9e042988..5df564c88b 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.1'; +export const version = '3.30.2'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 3b9e042988..5df564c88b 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.1'; +export const version = '3.30.2'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 3b9e042988..5df564c88b 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.1'; +export const version = '3.30.2'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 3b9e042988..5df564c88b 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.1'; +export const version = '3.30.2'; From 5e00daf0c3a7c4e39287f810821d38ef0b9105c6 Mon Sep 17 00:00:00 2001 From: rodrigobasilio2022 <114958722+rodrigobasilio2022@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:36:07 -0300 Subject: [PATCH 058/212] fix: Add method to define if a tool can resolve preview requests (#2196) --- packages/ai/src/MarkerLabelmapTool.ts | 33 +++++++++++++++++-- .../tools/segmentation/LabelmapBaseTool.ts | 26 +++++++++++++++ .../segmentation/strategies/BrushStrategy.ts | 1 + .../strategies/compositions/preview.ts | 2 ++ 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/packages/ai/src/MarkerLabelmapTool.ts b/packages/ai/src/MarkerLabelmapTool.ts index af8fc073be..2925e4fa54 100644 --- a/packages/ai/src/MarkerLabelmapTool.ts +++ b/packages/ai/src/MarkerLabelmapTool.ts @@ -2,10 +2,8 @@ import { getEnabledElementByViewportId } from '@cornerstonejs/core'; import { LabelmapBaseTool, ToolGroupManager, - Enums, annotation, ProbeTool, - RectangleROITool, addTool, } from '@cornerstonejs/tools'; import ONNXSegmentationController from './ONNXSegmentationController'; @@ -53,6 +51,37 @@ class MarkerLabelmapTool extends LabelmapBaseTool { super(toolProps, defaultToolProps); } + /** + * Checks if the tool should resolve preview requests. + * This is used to determine if the tool is in a state where it can handle + * preview requests. + * @returns True if the tool should resolve preview requests, false otherwise. + */ + public shouldResolvePreviewRequests() { + const MARKER_TOOLS = [ + ONNXSegmentationController.MarkerInclude, + ONNXSegmentationController.MarkerExclude, + ONNXSegmentationController.BoxPrompt, + ]; + const toolGroup = this._getToolGroupId(); + if (!toolGroup) { + console.debug( + `Tool group not found for tool: ${MarkerLabelmapTool.toolName}` + ); + return false; + } + + return ( + this.hasPreviewData() && + MARKER_TOOLS.some((markerToolName) => { + if (toolGroup.hasTool(markerToolName)) { + const instance = toolGroup.getToolInstance(markerToolName); + return instance.mode === 'Active' || instance.mode === 'Enabled'; + } + }) + ); + } + _init = async () => { const { configuration } = this; diff --git a/packages/tools/src/tools/segmentation/LabelmapBaseTool.ts b/packages/tools/src/tools/segmentation/LabelmapBaseTool.ts index a2348c03db..3cea0eb307 100644 --- a/packages/tools/src/tools/segmentation/LabelmapBaseTool.ts +++ b/packages/tools/src/tools/segmentation/LabelmapBaseTool.ts @@ -187,6 +187,27 @@ export default class LabelmapBaseTool extends BaseTool { return LabelmapBaseTool.previewData; } + /** + * Checks if the tool has a preview data associated. + * @returns True if the tool has preview data, false otherwise. + */ + public hasPreviewData() { + return !!this._previewData.preview; + } + + /** + * Checks if the tool should resolve preview requests. + * This is used to determine if the tool is in a state where it can handle + * preview requests. + * @returns True if the tool should resolve preview requests, false otherwise. + */ + public shouldResolvePreviewRequests() { + return ( + (this.mode === 'Active' || this.mode === 'Enabled') && + this.hasPreviewData() + ); + } + /** * Creates a labelmap memo instance, which stores the changes made to the * labelmap rather than the initial state. @@ -455,6 +476,11 @@ export default class LabelmapBaseTool extends BaseTool { StrategyCallbacks.AddPreview ); _previewData.isDrag = true; + // If the results are modified, we store it as preview data + if (results?.modified) { + _previewData.preview = results; + _previewData.element = element; + } return results; } diff --git a/packages/tools/src/tools/segmentation/strategies/BrushStrategy.ts b/packages/tools/src/tools/segmentation/strategies/BrushStrategy.ts index bdc91d687a..3e893cf5a9 100644 --- a/packages/tools/src/tools/segmentation/strategies/BrushStrategy.ts +++ b/packages/tools/src/tools/segmentation/strategies/BrushStrategy.ts @@ -51,6 +51,7 @@ export type InitializedOperationData = LabelmapToolOperationDataAny & { }; }; memo?: LabelmapMemo; + modified?: boolean; }; export type StrategyFunction = ( diff --git a/packages/tools/src/tools/segmentation/strategies/compositions/preview.ts b/packages/tools/src/tools/segmentation/strategies/compositions/preview.ts index 1770ecf43d..66b9304e59 100644 --- a/packages/tools/src/tools/segmentation/strategies/compositions/preview.ts +++ b/packages/tools/src/tools/segmentation/strategies/compositions/preview.ts @@ -38,6 +38,7 @@ export default { [StrategyCallbacks.Initialize]: (operationData: InitializedOperationData) => { const { segmentIndex, previewColor, previewSegmentIndex } = operationData; + operationData.modified = false; if (previewSegmentIndex == null || segmentIndex == null) { return; } @@ -58,6 +59,7 @@ export default { previewColor as Types.Color ); }); + operationData.modified = true; }, [StrategyCallbacks.AcceptPreview]: ( From 362c9e6928b616f40949bc9b73afe9b84f0180ad Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 11 Jul 2025 19:39:43 +0000 Subject: [PATCH 059/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index e403646a6b..06b4ebeda9 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -98c4d0f96f84ce04f1288b96d179f2ac9592c2b3 \ No newline at end of file +5e00daf0c3a7c4e39287f810821d38ef0b9105c6 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 0577df83ab..578a6940bf 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.2", - "@cornerstonejs/tools": "^3.30.2" + "@cornerstonejs/core": "^3.30.3", + "@cornerstonejs/tools": "^3.30.3" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 9501ab18a1..e140501b14 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.2", - "@cornerstonejs/tools": "^3.30.2" + "@cornerstonejs/core": "^3.30.3", + "@cornerstonejs/tools": "^3.30.3" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index b205adc6ad..8b2f6abb52 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.2", + "@cornerstonejs/core": "^3.30.3", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index d6134c92ef..a8586d2e4d 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.30.2", - "@cornerstonejs/core": "^3.30.2", - "@cornerstonejs/dicom-image-loader": "^3.30.2", - "@cornerstonejs/nifti-volume-loader": "^3.30.2", - "@cornerstonejs/tools": "^3.30.2", + "@cornerstonejs/adapters": "^3.30.3", + "@cornerstonejs/core": "^3.30.3", + "@cornerstonejs/dicom-image-loader": "^3.30.3", + "@cornerstonejs/nifti-volume-loader": "^3.30.3", + "@cornerstonejs/tools": "^3.30.3", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index c6827581da..8203398a50 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.2", - "@cornerstonejs/tools": "^3.30.2", + "@cornerstonejs/core": "^3.30.3", + "@cornerstonejs/tools": "^3.30.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 555171a32d..6ac0071448 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.2" + "@cornerstonejs/core": "^3.30.3" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 81f8d41299..cc04e0b93f 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.2", - "@cornerstonejs/tools": "^3.30.2", + "@cornerstonejs/core": "^3.30.3", + "@cornerstonejs/tools": "^3.30.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 1edc246a9e..22d96e9839 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.2", + "@cornerstonejs/core": "^3.30.3", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index c904168d3c..8a68cc9c22 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.30.2", - "commit": "98c4d0f96f84ce04f1288b96d179f2ac9592c2b3" + "version": "3.30.3", + "commit": "5e00daf0c3a7c4e39287f810821d38ef0b9105c6" } \ No newline at end of file diff --git a/version.txt b/version.txt index 59bc46bf0a..f5dfc86030 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.30.2 \ No newline at end of file +3.30.3 \ No newline at end of file From f41a840da20ba14209ef7c831adce929aafb996f Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 11 Jul 2025 19:40:02 +0000 Subject: [PATCH 060/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 6 ++++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 51 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eeede3d242..983d3607d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) + +### Bug Fixes + +- Add method to define if a tool can resolve preview requests ([#2196](https://github.com/cornerstonejs/cornerstone3D/issues/2196)) ([5e00daf](https://github.com/cornerstonejs/cornerstone3D/commit/5e00daf0c3a7c4e39287f810821d38ef0b9105c6)) + ## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) ### Bug Fixes diff --git a/lerna.json b/lerna.json index d81fc3d150..c6c9886e0d 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.30.2", + "version": "3.30.3", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index a89b26b873..e3b5a01263 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 578a6940bf..b0e20e4738 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.30.2", + "version": "3.30.3", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 8cb3c30bb1..1209c46cca 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) + +### Bug Fixes + +- Add method to define if a tool can resolve preview requests ([#2196](https://github.com/cornerstonejs/cornerstone3D/issues/2196)) ([5e00daf](https://github.com/cornerstonejs/cornerstone3D/commit/5e00daf0c3a7c4e39287f810821d38ef0b9105c6)) + ## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index e140501b14..3b61d8f3bd 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.30.2", + "version": "3.30.3", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 9d7e8bf504..2d97987680 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 3b266e5d8b..5881711bed 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.30.2", + "version": "3.30.3", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 2cb74e742e..0a5c796c68 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 8b2f6abb52..acbbe1dc1e 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.30.2", + "version": "3.30.3", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 7843d0e37b..f794bdbe30 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 8203398a50..af0435fbc8 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.30.2", + "version": "3.30.3", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 6f4bfad19b..48f831d3f3 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 6ac0071448..c9323c4893 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.30.2", + "version": "3.30.3", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 3c1d0d25a8..e05174822c 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index cc04e0b93f..d347a65964 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.30.2", + "version": "3.30.3", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 2f01886bb9..9ad67701bf 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) + +### Bug Fixes + +- Add method to define if a tool can resolve preview requests ([#2196](https://github.com/cornerstonejs/cornerstone3D/issues/2196)) ([5e00daf](https://github.com/cornerstonejs/cornerstone3D/commit/5e00daf0c3a7c4e39287f810821d38ef0b9105c6)) + ## [3.30.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.1...v3.30.2) (2025-07-11) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 22d96e9839..d536c53693 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.30.2", + "version": "3.30.3", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From ff959f1bf57c60b727e2cd6563db13b194cbabb0 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 11 Jul 2025 19:40:15 +0000 Subject: [PATCH 061/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index d84370ded6..d6cbac4fd7 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.30.2"; +export const version = "3.30.3"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 5df564c88b..ea81c30fea 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.2'; +export const version = '3.30.3'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 5df564c88b..ea81c30fea 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.2'; +export const version = '3.30.3'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 5df564c88b..ea81c30fea 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.2'; +export const version = '3.30.3'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 5df564c88b..ea81c30fea 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.2'; +export const version = '3.30.3'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 5df564c88b..ea81c30fea 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.2'; +export const version = '3.30.3'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 5df564c88b..ea81c30fea 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.2'; +export const version = '3.30.3'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 5df564c88b..ea81c30fea 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.2'; +export const version = '3.30.3'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 5df564c88b..ea81c30fea 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.2'; +export const version = '3.30.3'; From a275580630643b1c91185c6ee4d7717b0a0266d5 Mon Sep 17 00:00:00 2001 From: Ibrahim <93064150+IbrahimCSAE@users.noreply.github.com> Date: Tue, 15 Jul 2025 09:58:27 -0400 Subject: [PATCH 062/212] feat(rendering): add render stats (#2198) --- bun.lock | 16 +- packages/core/examples/meshLoader/index.ts | 11 +- .../core/examples/polyDataActorAPI/index.ts | 18 +- packages/core/examples/wadouri/index.ts | 11 +- .../examples/webGLContextPooling/index.ts | 7 + .../RenderingEngine/BaseRenderingEngine.ts | 15 +- .../helpers/stats/StatsOverlay.ts | 239 ++++++++++++++++++ .../helpers/stats/StatsPanel.ts | 214 ++++++++++++++++ .../helpers/stats/constants.ts | 52 ++++ .../RenderingEngine/helpers/stats/enums.ts | 10 + .../RenderingEngine/helpers/stats/index.ts | 3 + .../RenderingEngine/helpers/stats/types.ts | 38 +++ packages/core/src/init.ts | 10 + .../core/src/types/Cornerstone3DConfig.ts | 10 + .../polyDataActorManipulationTools/index.ts | 18 +- tests/contourRendering.spec.ts | 2 +- tests/contourRenderingTiled.spec.ts | 2 +- tests/labelmapGlobalConfiguration.spec.ts | 18 +- tests/labelmapSwapping.spec.ts | 4 +- tests/splineContourSegmentationTools.spec.ts | 10 +- utils/demo/helpers/initDemo.ts | 19 +- 21 files changed, 690 insertions(+), 37 deletions(-) create mode 100644 packages/core/src/RenderingEngine/helpers/stats/StatsOverlay.ts create mode 100644 packages/core/src/RenderingEngine/helpers/stats/StatsPanel.ts create mode 100644 packages/core/src/RenderingEngine/helpers/stats/constants.ts create mode 100644 packages/core/src/RenderingEngine/helpers/stats/enums.ts create mode 100644 packages/core/src/RenderingEngine/helpers/stats/index.ts create mode 100644 packages/core/src/RenderingEngine/helpers/stats/types.ts diff --git a/bun.lock b/bun.lock index e7d9577d94..ac8cccba8e 100644 --- a/bun.lock +++ b/bun.lock @@ -136,7 +136,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "3.23.1", + "version": "3.30.3", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -151,7 +151,7 @@ }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "3.23.1", + "version": "3.30.3", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -169,7 +169,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "3.23.1", + "version": "3.30.3", "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", @@ -179,7 +179,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.23.1", + "version": "3.30.3", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -198,7 +198,7 @@ }, "packages/labelmap-interpolation": { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.23.1", + "version": "3.30.3", "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165", @@ -211,7 +211,7 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.23.1", + "version": "3.30.3", "dependencies": { "nifti-reader-js": "^0.6.8", }, @@ -221,7 +221,7 @@ }, "packages/polymorphic-segmentation": { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.23.1", + "version": "3.30.3", "dependencies": { "@icr/polyseg-wasm": "0.4.0", }, @@ -233,7 +233,7 @@ }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "3.23.1", + "version": "3.30.3", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", diff --git a/packages/core/examples/meshLoader/index.ts b/packages/core/examples/meshLoader/index.ts index 7b4126f6b3..5555847075 100644 --- a/packages/core/examples/meshLoader/index.ts +++ b/packages/core/examples/meshLoader/index.ts @@ -97,7 +97,16 @@ content.append(instructions); */ async function run() { // Init Cornerstone and related libraries - await csRenderInit(); + + const urlParams = new URLSearchParams(window.location.search); + const debugMode = urlParams.get('debug') === 'true'; + + await csRenderInit({ + debug: { + statsOverlay: debugMode, + }, + }); + await csToolsInit(); const toolGroupId = 'NAVIGATION_TOOL_GROUP_ID'; diff --git a/packages/core/examples/polyDataActorAPI/index.ts b/packages/core/examples/polyDataActorAPI/index.ts index ff602eb8f1..2ac14b6612 100644 --- a/packages/core/examples/polyDataActorAPI/index.ts +++ b/packages/core/examples/polyDataActorAPI/index.ts @@ -1,7 +1,10 @@ import type { Types } from '@cornerstonejs/core'; -import { RenderingEngine, Enums } from '@cornerstonejs/core'; +import { + RenderingEngine, + Enums, + init as csRenderInit, +} from '@cornerstonejs/core'; import { setTitleAndDescription } from '../../../../utils/demo/helpers'; -import { init as csRenderInit } from '@cornerstonejs/core'; import { init as csToolsInit } from '@cornerstonejs/tools'; import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; @@ -65,7 +68,16 @@ function getSphereActor({ */ async function run() { // Init Cornerstone and related libraries - await csRenderInit(); + + const urlParams = new URLSearchParams(window.location.search); + const debugMode = urlParams.get('debug') === 'true'; + + await csRenderInit({ + debug: { + statsOverlay: debugMode, + }, + }); + await csToolsInit(); // Instantiate a rendering engine diff --git a/packages/core/examples/wadouri/index.ts b/packages/core/examples/wadouri/index.ts index 7cb808a17f..4b9b3cbb37 100644 --- a/packages/core/examples/wadouri/index.ts +++ b/packages/core/examples/wadouri/index.ts @@ -74,7 +74,16 @@ addButtonToToolbar({ */ async function run() { // Init Cornerstone and related libraries - await csRenderInit(); + + const urlParams = new URLSearchParams(window.location.search); + const debugMode = urlParams.get('debug') === 'true'; + + await csRenderInit({ + debug: { + statsOverlay: debugMode, + }, + }); + await initLoader(); const renderingEngine = new RenderingEngine(renderingEngineId); diff --git a/packages/core/examples/webGLContextPooling/index.ts b/packages/core/examples/webGLContextPooling/index.ts index 4053567202..f95d0c4578 100644 --- a/packages/core/examples/webGLContextPooling/index.ts +++ b/packages/core/examples/webGLContextPooling/index.ts @@ -187,10 +187,17 @@ async function run() { initVolumeLoader(); // Initialize Cornerstone with custom WebGL context count + // check query params for ?debug=true + const urlParams = new URLSearchParams(window.location.search); + const debugMode = urlParams.get('debug') === 'true'; + await csRenderInit({ rendering: { webGlContextCount: currentContextCount, }, + debug: { + statsOverlay: debugMode, + }, }); // Initialize cornerstone tools diff --git a/packages/core/src/RenderingEngine/BaseRenderingEngine.ts b/packages/core/src/RenderingEngine/BaseRenderingEngine.ts index 7a78cfb338..2a3313e791 100644 --- a/packages/core/src/RenderingEngine/BaseRenderingEngine.ts +++ b/packages/core/src/RenderingEngine/BaseRenderingEngine.ts @@ -8,7 +8,11 @@ import BaseVolumeViewport from './BaseVolumeViewport'; import StackViewport from './StackViewport'; import viewportTypeUsesCustomRenderingPipeline from './helpers/viewportTypeUsesCustomRenderingPipeline'; import getOrCreateCanvas from './helpers/getOrCreateCanvas'; -import { getShouldUseCPURendering, isCornerstoneInitialized } from '../init'; +import { + getShouldUseCPURendering, + isCornerstoneInitialized, + getConfiguration, +} from '../init'; import type IStackViewport from '../types/IStackViewport'; import type IVolumeViewport from '../types/IVolumeViewport'; import viewportTypeToViewportClass from './helpers/viewportTypeToViewportClass'; @@ -22,6 +26,7 @@ import type { } from '../types/IViewport'; import { OrientationAxis } from '../enums'; import type { VtkOffscreenMultiRenderWindow } from '../types'; +import { StatsOverlay } from './helpers/stats'; // Rendering engines seem to not like rendering things less than 2 pixels per side export const VIEWPORT_MIN_SIZE = 2; @@ -64,6 +69,12 @@ abstract class BaseRenderingEngine { this._viewports = new Map(); this.hasBeenDestroyed = false; + + const config = getConfiguration(); + + if (config?.debug?.statsOverlay) { + StatsOverlay.setup(); + } } /** @@ -435,6 +446,8 @@ abstract class BaseRenderingEngine { return; } + StatsOverlay.cleanup(); + // remove vtk rendered first before resetting the viewport if (!this.useCPURendering) { const viewports = this._getViewportsAsArray(); diff --git a/packages/core/src/RenderingEngine/helpers/stats/StatsOverlay.ts b/packages/core/src/RenderingEngine/helpers/stats/StatsOverlay.ts new file mode 100644 index 0000000000..eab4d167c9 --- /dev/null +++ b/packages/core/src/RenderingEngine/helpers/stats/StatsOverlay.ts @@ -0,0 +1,239 @@ +import { StatsPanel } from './StatsPanel'; +import type { Panel, StatsInstance, PerformanceWithMemory } from './types'; +import { PanelType } from './enums'; +import { STATS_CONFIG, PANEL_CONFIGS, CONVERSION } from './constants'; + +/** + * Singleton class for managing the stats overlay. + * Provides FPS, MS, and memory usage monitoring. + * Credits: https://github.com/mrdoob/stats.js/blob/master/LICENSE + */ +export class StatsOverlay implements StatsInstance { + private static instance: StatsOverlay | null = null; + + public dom: HTMLDivElement | null = null; + private currentMode = 0; + private startTime: number = 0; + private lastUpdateTime: number = 0; + private frameCount = 0; + private panels: Map = new Map(); + private animationFrameId: number | null = null; + private isSetup = false; + + private constructor() {} + + /** + * Gets the singleton instance of StatsOverlay. + */ + public static getInstance(): StatsOverlay { + if (!StatsOverlay.instance) { + StatsOverlay.instance = new StatsOverlay(); + } + return StatsOverlay.instance; + } + + /** + * Sets up the stats overlay and starts the animation loop. + */ + public setup(): void { + if (this.isSetup) { + return; + } + + try { + // Initialize DOM and timing + this.dom = this.createOverlayElement(); + this.startTime = performance.now(); + this.lastUpdateTime = this.startTime; + + // Initialize panels and show default + this.initializePanels(); + this.showPanel(PanelType.FPS); + + // Apply styles and add to DOM + this.applyOverlayStyles(); + document.body.appendChild(this.dom); + this.startLoop(); + this.isSetup = true; + } catch (error) { + console.warn('Failed to setup stats overlay:', error); + } + } + + /** + * Cleans up the stats overlay by removing it from the DOM and stopping the animation loop. + */ + public cleanup(): void { + this.stopLoop(); + + if (this.dom && this.dom.parentNode) { + this.dom.parentNode.removeChild(this.dom); + } + + this.dom = null; + this.panels.clear(); + this.isSetup = false; + } + + /** + * Shows a specific panel by its type. + */ + public showPanel(panelType: number): void { + const children = Array.from(this.dom.children) as HTMLElement[]; + children.forEach((child, index) => { + child.style.display = index === panelType ? 'block' : 'none'; + }); + this.currentMode = panelType; + } + + /** + * Updates the stats display. + */ + public update(): void { + this.startTime = this.updateStats(); + } + + /** + * Creates the overlay DOM element. + */ + private createOverlayElement(): HTMLDivElement { + const element = document.createElement('div'); + element.addEventListener('click', this.handleClick.bind(this), false); + return element; + } + + /** + * Applies styles to the overlay element. + */ + private applyOverlayStyles(): void { + Object.assign(this.dom.style, STATS_CONFIG.OVERLAY_STYLES); + } + + /** + * Handles click events on the overlay. + */ + private handleClick(event: MouseEvent): void { + event.preventDefault(); + const panelCount = this.dom.children.length; + this.showPanel((this.currentMode + 1) % panelCount); + } + + /** + * Initializes all panels. + */ + private initializePanels(): void { + // Always create FPS and MS panels + const fpsPanel = new StatsPanel( + PANEL_CONFIGS[PanelType.FPS].name, + PANEL_CONFIGS[PanelType.FPS].foregroundColor, + PANEL_CONFIGS[PanelType.FPS].backgroundColor + ); + this.addPanel(PanelType.FPS, fpsPanel); + + const msPanel = new StatsPanel( + PANEL_CONFIGS[PanelType.MS].name, + PANEL_CONFIGS[PanelType.MS].foregroundColor, + PANEL_CONFIGS[PanelType.MS].backgroundColor + ); + this.addPanel(PanelType.MS, msPanel); + + // Only create memory panel if available + if (this.isMemoryAvailable()) { + const memPanel = new StatsPanel( + PANEL_CONFIGS[PanelType.MEMORY].name, + PANEL_CONFIGS[PanelType.MEMORY].foregroundColor, + PANEL_CONFIGS[PanelType.MEMORY].backgroundColor + ); + this.addPanel(PanelType.MEMORY, memPanel); + } + } + + /** + * Checks if memory monitoring is available. + */ + private isMemoryAvailable(): boolean { + const perf = performance as PerformanceWithMemory; + return perf.memory !== undefined; + } + + /** + * Adds a panel to the overlay. + */ + private addPanel(type: PanelType, panel: Panel): void { + this.dom.appendChild(panel.dom); + this.panels.set(type, panel); + } + + /** + * Starts the animation frame loop. + */ + private startLoop(): void { + const loop = () => { + this.update(); + this.animationFrameId = requestAnimationFrame(loop); + }; + this.animationFrameId = requestAnimationFrame(loop); + } + + /** + * Stops the animation frame loop. + */ + private stopLoop(): void { + if (this.animationFrameId !== null) { + cancelAnimationFrame(this.animationFrameId); + this.animationFrameId = null; + } + } + + /** + * Updates all stats panels. + */ + private updateStats(): number { + this.frameCount++; + const currentTime = performance.now(); + const deltaTime = currentTime - this.startTime; + + // Update MS panel + const msPanel = this.panels.get(PanelType.MS); + if (msPanel) { + msPanel.update(deltaTime, STATS_CONFIG.MAX_MS_VALUE); + } + + // Update FPS panel every second + if (currentTime >= this.lastUpdateTime + STATS_CONFIG.UPDATE_INTERVAL) { + const fps = + (this.frameCount * CONVERSION.MS_PER_SECOND) / + (currentTime - this.lastUpdateTime); + + const fpsPanel = this.panels.get(PanelType.FPS); + if (fpsPanel) { + fpsPanel.update(fps, STATS_CONFIG.MAX_FPS_VALUE); + } + + this.lastUpdateTime = currentTime; + this.frameCount = 0; + + // Update memory panel if available + this.updateMemoryPanel(); + } + + return currentTime; + } + + /** + * Updates the memory panel if available. + */ + private updateMemoryPanel(): void { + const memPanel = this.panels.get(PanelType.MEMORY); + if (!memPanel) { + return; + } + + const perf = performance as PerformanceWithMemory; + if (perf.memory) { + const memoryMB = perf.memory.usedJSHeapSize / CONVERSION.BYTES_TO_MB; + const maxMemoryMB = perf.memory.jsHeapSizeLimit / CONVERSION.BYTES_TO_MB; + memPanel.update(memoryMB, maxMemoryMB); + } + } +} diff --git a/packages/core/src/RenderingEngine/helpers/stats/StatsPanel.ts b/packages/core/src/RenderingEngine/helpers/stats/StatsPanel.ts new file mode 100644 index 0000000000..96cb443c00 --- /dev/null +++ b/packages/core/src/RenderingEngine/helpers/stats/StatsPanel.ts @@ -0,0 +1,214 @@ +import type { Panel } from './types'; +import { PANEL_CONFIG } from './constants'; + +/** + * Individual panel for displaying stats (FPS, MS, MB). + * Credits: https://github.com/mrdoob/stats.js/blob/master/LICENSE + */ +export class StatsPanel implements Panel { + public dom: HTMLCanvasElement; + private context: CanvasRenderingContext2D; + private minValue = Infinity; + private maxValue = 0; + + private readonly name: string; + private readonly foregroundColor: string; + private readonly backgroundColor: string; + private readonly devicePixelRatio: number; + + // Calculated dimensions + private readonly dimensions: { + width: number; + height: number; + textX: number; + textY: number; + graphX: number; + graphY: number; + graphWidth: number; + graphHeight: number; + }; + + constructor(name: string, foregroundColor: string, backgroundColor: string) { + this.name = name; + this.foregroundColor = foregroundColor; + this.backgroundColor = backgroundColor; + this.devicePixelRatio = Math.round(window.devicePixelRatio || 1); + + // Calculate dimensions based on device pixel ratio + this.dimensions = this.calculateDimensions(); + + // Initialize canvas + this.dom = this.createCanvas(); + this.context = this.initializeContext(); + + // Draw initial panel + this.drawInitialPanel(); + } + + /** + * Updates the panel with a new value. + */ + public update(value: number, maxValue: number): void { + this.updateMinMax(value); + this.clearTextArea(); + this.drawText(value); + this.scrollGraph(); + this.drawNewValue(value, maxValue); + } + + /** + * Calculates panel dimensions based on device pixel ratio. + */ + private calculateDimensions() { + const pr = this.devicePixelRatio; + return { + width: PANEL_CONFIG.WIDTH * pr, + height: PANEL_CONFIG.HEIGHT * pr, + textX: PANEL_CONFIG.TEXT_PADDING * pr, + textY: PANEL_CONFIG.TEXT_Y_OFFSET * pr, + graphX: PANEL_CONFIG.TEXT_PADDING * pr, + graphY: PANEL_CONFIG.GRAPH_Y_OFFSET * pr, + graphWidth: PANEL_CONFIG.GRAPH_WIDTH * pr, + graphHeight: PANEL_CONFIG.GRAPH_HEIGHT * pr, + }; + } + + /** + * Creates the canvas element. + */ + private createCanvas(): HTMLCanvasElement { + const canvas = document.createElement('canvas'); + canvas.width = this.dimensions.width; + canvas.height = this.dimensions.height; + canvas.style.cssText = `width:${PANEL_CONFIG.WIDTH}px;height:${PANEL_CONFIG.HEIGHT}px`; + return canvas; + } + + /** + * Initializes the canvas context. + */ + private initializeContext(): CanvasRenderingContext2D { + const ctx = this.dom.getContext('2d'); + if (!ctx) { + throw new Error('Failed to get 2D context'); + } + + ctx.font = `bold ${PANEL_CONFIG.FONT_SIZE * this.devicePixelRatio}px ${ + PANEL_CONFIG.FONT_FAMILY + }`; + ctx.textBaseline = 'top'; + + return ctx; + } + + /** + * Draws the initial panel background and text. + */ + private drawInitialPanel(): void { + const { + width, + height, + textX, + textY, + graphX, + graphY, + graphWidth, + graphHeight, + } = this.dimensions; + + // Draw background + this.context.fillStyle = this.backgroundColor; + this.context.fillRect(0, 0, width, height); + + // Draw name + this.context.fillStyle = this.foregroundColor; + this.context.fillText(this.name, textX, textY); + + // Draw graph outline + this.context.fillRect(graphX, graphY, graphWidth, graphHeight); + + // Draw graph background + this.context.fillStyle = this.backgroundColor; + this.context.globalAlpha = PANEL_CONFIG.GRAPH_ALPHA; + this.context.fillRect(graphX, graphY, graphWidth, graphHeight); + this.context.globalAlpha = 1; + } + + /** + * Updates min and max values. + */ + private updateMinMax(value: number): void { + this.minValue = Math.min(this.minValue, value); + this.maxValue = Math.max(this.maxValue, value); + } + + /** + * Clears the text area for redrawing. + */ + private clearTextArea(): void { + const { width, graphY } = this.dimensions; + this.context.fillStyle = this.backgroundColor; + this.context.fillRect(0, 0, width, graphY); + } + + /** + * Draws the current value text. + */ + private drawText(value: number): void { + const { textX, textY } = this.dimensions; + const text = this.formatText(value); + + this.context.fillStyle = this.foregroundColor; + this.context.fillText(text, textX, textY); + } + + /** + * Formats the display text. + */ + private formatText(value: number): string { + const roundedValue = Math.round(value); + const roundedMin = Math.round(this.minValue); + const roundedMax = Math.round(this.maxValue); + return `${roundedValue} ${this.name} (${roundedMin}-${roundedMax})`; + } + + /** + * Scrolls the graph to the left. + */ + private scrollGraph(): void { + const { graphX, graphY, graphWidth, graphHeight } = this.dimensions; + const pr = this.devicePixelRatio; + + this.context.drawImage( + this.dom, + graphX + pr, + graphY, + graphWidth - pr, + graphHeight, + graphX, + graphY, + graphWidth - pr, + graphHeight + ); + } + + /** + * Draws the new value on the graph. + */ + private drawNewValue(value: number, maxValue: number): void { + const { graphX, graphY, graphWidth, graphHeight } = this.dimensions; + const pr = this.devicePixelRatio; + const x = graphX + graphWidth - pr; + + // Draw full height bar in foreground color + this.context.fillStyle = this.foregroundColor; + this.context.fillRect(x, graphY, pr, graphHeight); + + // Draw partial height bar in background color + const normalizedHeight = Math.round((1 - value / maxValue) * graphHeight); + this.context.fillStyle = this.backgroundColor; + this.context.globalAlpha = PANEL_CONFIG.GRAPH_ALPHA; + this.context.fillRect(x, graphY, pr, normalizedHeight); + this.context.globalAlpha = 1; + } +} diff --git a/packages/core/src/RenderingEngine/helpers/stats/constants.ts b/packages/core/src/RenderingEngine/helpers/stats/constants.ts new file mode 100644 index 0000000000..a503a41ac1 --- /dev/null +++ b/packages/core/src/RenderingEngine/helpers/stats/constants.ts @@ -0,0 +1,52 @@ +/** + * Constants for panel rendering + */ +const PANEL_CONFIG = { + WIDTH: 160, + HEIGHT: 96, + TEXT_PADDING: 3, + TEXT_Y_OFFSET: 2, + GRAPH_Y_OFFSET: 15, + GRAPH_WIDTH: 150, + GRAPH_HEIGHT: 70, + FONT_SIZE: 9, + FONT_FAMILY: 'Helvetica,Arial,sans-serif', + GRAPH_ALPHA: 0.9, +} as const; + +/** + * Constants for stats overlay + */ +const STATS_CONFIG = { + UPDATE_INTERVAL: 1000, // ms + MAX_MS_VALUE: 200, + MAX_FPS_VALUE: 300, // don't use 60 since no one has a 60hz monitor anynmore + OVERLAY_STYLES: { + position: 'fixed', + top: '0px', + right: '0px', + left: 'auto', + zIndex: '9999', + cursor: 'pointer', + opacity: '0.9', + }, +} as const; + +/** + * Conversion constants + */ +const CONVERSION = { + BYTES_TO_MB: 1048576, + MS_PER_SECOND: 1000, +} as const; + +/** + * Panel configurations with colors + */ +const PANEL_CONFIGS = [ + { name: 'FPS', foregroundColor: '#0ff', backgroundColor: '#002' }, + { name: 'MS', foregroundColor: '#0f0', backgroundColor: '#020' }, + { name: 'MB', foregroundColor: '#f08', backgroundColor: '#201' }, +] as const; + +export { PANEL_CONFIG, STATS_CONFIG, CONVERSION, PANEL_CONFIGS }; diff --git a/packages/core/src/RenderingEngine/helpers/stats/enums.ts b/packages/core/src/RenderingEngine/helpers/stats/enums.ts new file mode 100644 index 0000000000..0b7869cf85 --- /dev/null +++ b/packages/core/src/RenderingEngine/helpers/stats/enums.ts @@ -0,0 +1,10 @@ +/** + * Panel types + */ +enum PanelType { + FPS = 0, + MS = 1, + MEMORY = 2, +} + +export { PanelType }; diff --git a/packages/core/src/RenderingEngine/helpers/stats/index.ts b/packages/core/src/RenderingEngine/helpers/stats/index.ts new file mode 100644 index 0000000000..efe7ca9194 --- /dev/null +++ b/packages/core/src/RenderingEngine/helpers/stats/index.ts @@ -0,0 +1,3 @@ +import { StatsOverlay as Class } from './StatsOverlay'; + +export const StatsOverlay = Class.getInstance(); diff --git a/packages/core/src/RenderingEngine/helpers/stats/types.ts b/packages/core/src/RenderingEngine/helpers/stats/types.ts new file mode 100644 index 0000000000..4734bce7ff --- /dev/null +++ b/packages/core/src/RenderingEngine/helpers/stats/types.ts @@ -0,0 +1,38 @@ +/** + * Interface for individual stats panels (FPS, MS, MB). + */ +interface Panel { + dom: HTMLCanvasElement; + update: (value: number, maxValue: number) => void; +} + +/** + * Interface for the main stats instance. + */ +interface StatsInstance { + dom: HTMLDivElement; + showPanel: (id: number) => void; + update: () => void; + destroy?: () => void; +} + +/** + * Extended Performance interface with memory property + */ +interface PerformanceWithMemory extends Performance { + memory?: { + usedJSHeapSize: number; + jsHeapSizeLimit: number; + }; +} + +/** + * Configuration for panel styling + */ +interface PanelConfig { + name: string; + foregroundColor: string; + backgroundColor: string; +} + +export type { Panel, StatsInstance, PerformanceWithMemory, PanelConfig }; diff --git a/packages/core/src/init.ts b/packages/core/src/init.ts index 7cfa41dc91..e1411aa600 100644 --- a/packages/core/src/init.ts +++ b/packages/core/src/init.ts @@ -29,6 +29,16 @@ const defaultConfig: Cornerstone3DConfig = { webGlContextCount: 7, }, + debug: { + /** + * Wether or not to show the stats overlay for debugging purposes, stats include: + * - FPS Frames rendered in the last second. The higher the number the better. + * - MS Milliseconds needed to render a frame. The lower the number the better. + * - MB MBytes of allocated memory. (Run Chrome with --enable-precise-memory-info) + */ + statsOverlay: false, + }, + /** * Imports peer modules. * This may just fallback to the default import, but many packaging diff --git a/packages/core/src/types/Cornerstone3DConfig.ts b/packages/core/src/types/Cornerstone3DConfig.ts index 24be843557..7080b9174a 100644 --- a/packages/core/src/types/Cornerstone3DConfig.ts +++ b/packages/core/src/types/Cornerstone3DConfig.ts @@ -47,6 +47,16 @@ interface Cornerstone3DConfig { webGlContextCount?: number; }; + debug: { + /** + * Wether or not to show the stats overlay for debugging purposes, stats include: + * - FPS Frames rendered in the last second. The higher the number the better. + * - MS Milliseconds needed to render a frame. The lower the number the better. + * - MB MBytes of allocated memory. (Run Chrome with --enable-precise-memory-info) + */ + statsOverlay?: boolean; + }; + /** * This function returns an imported module for the given module id. * It allows replacing broken packing system imports with external importers diff --git a/packages/tools/examples/polyDataActorManipulationTools/index.ts b/packages/tools/examples/polyDataActorManipulationTools/index.ts index 461c884dca..10bcf34bbb 100644 --- a/packages/tools/examples/polyDataActorManipulationTools/index.ts +++ b/packages/tools/examples/polyDataActorManipulationTools/index.ts @@ -1,7 +1,10 @@ import type { Types } from '@cornerstonejs/core'; -import { RenderingEngine, Enums } from '@cornerstonejs/core'; +import { + RenderingEngine, + Enums, + init as csRenderInit, +} from '@cornerstonejs/core'; import { setTitleAndDescription } from '../../../../utils/demo/helpers'; -import { init as csRenderInit } from '@cornerstonejs/core'; import { init as csToolsInit } from '@cornerstonejs/tools'; import * as cornerstoneTools from '@cornerstonejs/tools'; @@ -101,7 +104,16 @@ function getSphereActor({ */ async function run() { // Init Cornerstone and related libraries - await csRenderInit(); + + const urlParams = new URLSearchParams(window.location.search); + const debugMode = urlParams.get('debug') === 'true'; + + await csRenderInit({ + debug: { + statsOverlay: debugMode, + }, + }); + await csToolsInit(); const toolGroupId = 'NAVIGATION_TOOL_GROUP_ID'; diff --git a/tests/contourRendering.spec.ts b/tests/contourRendering.spec.ts index b626e12107..8615914915 100644 --- a/tests/contourRendering.spec.ts +++ b/tests/contourRendering.spec.ts @@ -13,7 +13,7 @@ test.describe('Contour Rendering', async () => { test('should add a contour as a segmentation to a volume viewport', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await checkForScreenshot( page, diff --git a/tests/contourRenderingTiled.spec.ts b/tests/contourRenderingTiled.spec.ts index 48e137c489..c6b2dd668a 100644 --- a/tests/contourRenderingTiled.spec.ts +++ b/tests/contourRenderingTiled.spec.ts @@ -14,7 +14,7 @@ test.describe('Contour Rendering', async () => { test('should add a contour as a segmentation to a volume viewport', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await checkForScreenshot( page, diff --git a/tests/labelmapGlobalConfiguration.spec.ts b/tests/labelmapGlobalConfiguration.spec.ts index 6b0f93362d..82f244e663 100644 --- a/tests/labelmapGlobalConfiguration.spec.ts +++ b/tests/labelmapGlobalConfiguration.spec.ts @@ -21,7 +21,7 @@ test.describe('Labelmap Global Configuration', async () => { test('should render the segmentations using the default global configuration', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await checkForScreenshot( page, @@ -33,7 +33,7 @@ test.describe('Labelmap Global Configuration', async () => { test.describe('when toggling inactive segmentations', async () => { test('should hide the inactive segmentation', async ({ page }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await page .getByRole('button', { name: 'toggle render inactive' }) @@ -49,7 +49,7 @@ test.describe('Labelmap Global Configuration', async () => { test.describe('when toggling outline rendering', async () => { test('should render segmentations with no outline', async ({ page }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await page .getByRole('button', { name: 'toggle outline rendering' }) @@ -65,7 +65,7 @@ test.describe('Labelmap Global Configuration', async () => { test.describe('when toggling fill rendering', async () => { test('should not fill the active segmentation', async ({ page }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await page.getByRole('button', { name: 'toggle fill rendering' }).click(); await checkForScreenshot( @@ -80,7 +80,7 @@ test.describe('Labelmap Global Configuration', async () => { test('should render the active segmentation with the new outline width', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await page.locator('#outlineWidthActive').fill('5'); await checkForScreenshot( @@ -95,7 +95,7 @@ test.describe('Labelmap Global Configuration', async () => { test('should render the active segmentation with the new outline alpha', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await page.locator('#outlineWidthActive').fill('5'); await page.locator('#outlineAlphaActive').fill('0'); @@ -111,7 +111,7 @@ test.describe('Labelmap Global Configuration', async () => { test('should render the inactive segmentation with the new outline width', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await page.locator('#outlineWidthInactive').fill('5'); await checkForScreenshot( @@ -126,7 +126,7 @@ test.describe('Labelmap Global Configuration', async () => { test('should render the active segmentation with the new fill alpha', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await page.locator('#fillAlphaActive').fill('25'); await checkForScreenshot( @@ -141,7 +141,7 @@ test.describe('Labelmap Global Configuration', async () => { test('should render the inactive segmentation with the new fill alpha', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await page.locator('#fillAlphaInactive').fill('20'); await checkForScreenshot( diff --git a/tests/labelmapSwapping.spec.ts b/tests/labelmapSwapping.spec.ts index 9f2f0dd51d..4bbb7cbee6 100644 --- a/tests/labelmapSwapping.spec.ts +++ b/tests/labelmapSwapping.spec.ts @@ -13,7 +13,7 @@ test.describe('Swapping labelmap segmentations on a viewport', async () => { test('should load the default segmentation with two segments (circles)', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await checkForScreenshot( page, @@ -25,7 +25,7 @@ test.describe('Swapping labelmap segmentations on a viewport', async () => { test('should swap the segmentation after clicking on "Swap Segmentation" button', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await page.getByRole('button', { name: 'Swap Segmentation' }).click(); await checkForScreenshot( diff --git a/tests/splineContourSegmentationTools.spec.ts b/tests/splineContourSegmentationTools.spec.ts index b7b5aadadd..1486b12508 100644 --- a/tests/splineContourSegmentationTools.spec.ts +++ b/tests/splineContourSegmentationTools.spec.ts @@ -14,7 +14,7 @@ test.describe('Spline Contour Segmentation Tools', async () => { test('should draw a CatmullRom Spline ROI when CatmullRom Spline ROI is selected', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await drawCatmullROMSplineOnViewportLeft({ page, @@ -31,7 +31,7 @@ test.describe('Spline Contour Segmentation Tools', async () => { test('should draw a Linear Spline ROI when Linear Spline ROI is selected', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await drawLinearSplineOnViewportCenter({ page, @@ -48,7 +48,7 @@ test.describe('Spline Contour Segmentation Tools', async () => { test('should draw a BSpline ROI when BSpline ROI is selected when BSpline ROI is selected', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await drawBSplineOnViewportRight({ page, @@ -65,7 +65,7 @@ test.describe('Spline Contour Segmentation Tools', async () => { test('should have different colors when splines are added to different segments', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); await drawCatmullROMSplineOnViewportLeft({ page, @@ -84,7 +84,7 @@ test.describe('Spline Contour Segmentation Tools', async () => { test.skip('should apply the styles to the splines appropriately when splines are drawn with different styles', async ({ page, }) => { - const canvas = await page.locator('canvas'); + const canvas = await page.locator('canvas.cornerstone-canvas'); const splineStyle = { outlineWidth: 1.7, outlineOpacity: 0.5, diff --git a/utils/demo/helpers/initDemo.ts b/utils/demo/helpers/initDemo.ts index 55ee47480c..7db49b519c 100644 --- a/utils/demo/helpers/initDemo.ts +++ b/utils/demo/helpers/initDemo.ts @@ -20,13 +20,28 @@ import * as polySeg from '@cornerstonejs/polymorphic-segmentation'; window.cornerstone = cornerstone; window.cornerstoneTools = cornerstoneTools; -export default async function initDemo(config = {}) { +export default async function initDemo(config: any = {}) { initProviders(); cornerstoneDICOMImageLoader.init(); initVolumeLoader(); + + const urlParams = new URLSearchParams(window.location.search); + const debugEnabled = urlParams.get('debug') === 'true'; + await csRenderInit({ peerImport, - ...(config?.core ? config.core : {}), + ...(config?.core + ? { + ...config.core, + debug: { + statsOverlay: debugEnabled, + }, + } + : { + debug: { + statsOverlay: debugEnabled, + }, + }), }); await csToolsInit({ addons: { From 2d018d5c5d875eab66b8dc61b7dad83500fa2301 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 15 Jul 2025 14:01:57 +0000 Subject: [PATCH 063/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 06b4ebeda9..9d32c16cdc 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -5e00daf0c3a7c4e39287f810821d38ef0b9105c6 \ No newline at end of file +a275580630643b1c91185c6ee4d7717b0a0266d5 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index b0e20e4738..9a8850c33e 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.3", - "@cornerstonejs/tools": "^3.30.3" + "@cornerstonejs/core": "^3.31.0", + "@cornerstonejs/tools": "^3.31.0" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 3b61d8f3bd..4e326c7098 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.3", - "@cornerstonejs/tools": "^3.30.3" + "@cornerstonejs/core": "^3.31.0", + "@cornerstonejs/tools": "^3.31.0" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index acbbe1dc1e..3e984c5eb3 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.3", + "@cornerstonejs/core": "^3.31.0", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index a8586d2e4d..bc9ceea354 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.30.3", - "@cornerstonejs/core": "^3.30.3", - "@cornerstonejs/dicom-image-loader": "^3.30.3", - "@cornerstonejs/nifti-volume-loader": "^3.30.3", - "@cornerstonejs/tools": "^3.30.3", + "@cornerstonejs/adapters": "^3.31.0", + "@cornerstonejs/core": "^3.31.0", + "@cornerstonejs/dicom-image-loader": "^3.31.0", + "@cornerstonejs/nifti-volume-loader": "^3.31.0", + "@cornerstonejs/tools": "^3.31.0", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index af0435fbc8..91f0e6830f 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.3", - "@cornerstonejs/tools": "^3.30.3", + "@cornerstonejs/core": "^3.31.0", + "@cornerstonejs/tools": "^3.31.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index c9323c4893..ad2160ae1d 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.3" + "@cornerstonejs/core": "^3.31.0" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index d347a65964..bd2f6a3325 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.3", - "@cornerstonejs/tools": "^3.30.3", + "@cornerstonejs/core": "^3.31.0", + "@cornerstonejs/tools": "^3.31.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index d536c53693..e78566cfcd 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.30.3", + "@cornerstonejs/core": "^3.31.0", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 8a68cc9c22..e946bd5155 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.30.3", - "commit": "5e00daf0c3a7c4e39287f810821d38ef0b9105c6" + "version": "3.31.0", + "commit": "a275580630643b1c91185c6ee4d7717b0a0266d5" } \ No newline at end of file diff --git a/version.txt b/version.txt index f5dfc86030..fdb94d0326 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.30.3 \ No newline at end of file +3.31.0 \ No newline at end of file From e118e7641f34f8ee390848f81a18a9ce1bd4a42f Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 15 Jul 2025 14:02:16 +0000 Subject: [PATCH 064/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 51 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 983d3607d9..89d6005082 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) + +### Features + +- **rendering:** add render stats ([#2198](https://github.com/cornerstonejs/cornerstone3D/issues/2198)) ([a275580](https://github.com/cornerstonejs/cornerstone3D/commit/a275580630643b1c91185c6ee4d7717b0a0266d5)) + ## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) ### Bug Fixes diff --git a/lerna.json b/lerna.json index c6c9886e0d..9cc746e344 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.30.3", + "version": "3.31.0", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index e3b5a01263..0b988a2cc2 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 9a8850c33e..193c98156c 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.30.3", + "version": "3.31.0", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 1209c46cca..4a957e945c 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) ### Bug Fixes diff --git a/packages/ai/package.json b/packages/ai/package.json index 4e326c7098..a72b5e89bf 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.30.3", + "version": "3.31.0", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 2d97987680..58f9983ec9 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) + +### Features + +- **rendering:** add render stats ([#2198](https://github.com/cornerstonejs/cornerstone3D/issues/2198)) ([a275580](https://github.com/cornerstonejs/cornerstone3D/commit/a275580630643b1c91185c6ee4d7717b0a0266d5)) + ## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 5881711bed..ba476a84bf 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.30.3", + "version": "3.31.0", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 0a5c796c68..fe7d806375 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 3e984c5eb3..dcc26885be 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.30.3", + "version": "3.31.0", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index f794bdbe30..20e58d1205 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 91f0e6830f..c6094e2198 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.30.3", + "version": "3.31.0", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 48f831d3f3..4e62b3e6d9 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index ad2160ae1d..4cfd2e7361 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.30.3", + "version": "3.31.0", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index e05174822c..94bea6ccde 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index bd2f6a3325..9b77a58e73 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.30.3", + "version": "3.31.0", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 9ad67701bf..0c3e86e562 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) + +### Features + +- **rendering:** add render stats ([#2198](https://github.com/cornerstonejs/cornerstone3D/issues/2198)) ([a275580](https://github.com/cornerstonejs/cornerstone3D/commit/a275580630643b1c91185c6ee4d7717b0a0266d5)) + ## [3.30.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.2...v3.30.3) (2025-07-11) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index e78566cfcd..6ad7d21c10 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.30.3", + "version": "3.31.0", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From ea3e44970a9e535db1f38c8186653ffb7376ecf9 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 15 Jul 2025 14:02:27 +0000 Subject: [PATCH 065/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index d6cbac4fd7..01fbb4d168 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.30.3"; +export const version = "3.31.0"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index ea81c30fea..8359862b6a 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.3'; +export const version = '3.31.0'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index ea81c30fea..8359862b6a 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.3'; +export const version = '3.31.0'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index ea81c30fea..8359862b6a 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.3'; +export const version = '3.31.0'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index ea81c30fea..8359862b6a 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.3'; +export const version = '3.31.0'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index ea81c30fea..8359862b6a 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.3'; +export const version = '3.31.0'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index ea81c30fea..8359862b6a 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.3'; +export const version = '3.31.0'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index ea81c30fea..8359862b6a 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.3'; +export const version = '3.31.0'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index ea81c30fea..8359862b6a 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.30.3'; +export const version = '3.31.0'; From 23c03d9d330750c5f3ab09336819c3cf1fe6cff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20K=C3=B6hler?= Date: Wed, 16 Jul 2025 14:22:08 -0300 Subject: [PATCH 066/212] fix: Distinguishing between scoord3d and scoord (3d/2d) measurements and parsing them (#2099) * fix: how to id 3d measurements * feat: update dcmjs * Fix typing on adapters * fix: Use method to convert to/from scoord values * fix: Add frame of reference * fix: Load of 2d annotations * fix: setViewReference/isReferenceViewable for planar view * fix: Return viewable if frame of reference is available * Merge issues * Dumb type errrors * fix: Apply options for isReferenceViewable * fix: Unit test type mismatch * fix some type errors * fix: Navigate to mpr measurements * fix: Video viewports throw exception when not fully initialized * PR Review comments * Remove passed in world to/from image coords * Update to dcmjs 0.43.1 * Added migration guide * Update docs to multi-line --------- Co-authored-by: Bill Wallace --- bun.lock | 32 +-- packages/adapters/jest.config.js | 1 + packages/adapters/package.json | 2 +- .../src/adapters/Cornerstone3D/Angle.ts | 167 +++--------- .../adapters/Cornerstone3D/ArrowAnnotate.ts | 194 ++------------ .../adapters/Cornerstone3D/BaseAdapter3D.ts | 49 +--- .../adapters/Cornerstone3D/Bidirectional.ts | 244 +++--------------- .../src/adapters/Cornerstone3D/CircleROI.ts | 155 ++--------- .../src/adapters/Cornerstone3D/CobbAngle.ts | 155 ++--------- .../adapters/Cornerstone3D/EllipticalROI.ts | 227 ++-------------- .../src/adapters/Cornerstone3D/KeyImage.ts | 7 +- .../src/adapters/Cornerstone3D/Length.ts | 166 +++--------- .../Cornerstone3D/MeasurementReport.ts | 168 ++++++++---- .../Cornerstone3D/PlanarFreehandROI.ts | 188 ++------------ .../src/adapters/Cornerstone3D/Probe.ts | 48 +--- .../adapters/Cornerstone3D/RectangleROI.ts | 6 +- .../Cornerstone3D/UltrasoundDirectional.ts | 6 +- .../adapters/src/adapters/helpers/index.ts | 4 + .../src/adapters/helpers/scoordToWorld.ts | 36 +++ .../adapters/src/adapters/helpers/toPoint3.ts | 28 ++ .../src/adapters/helpers/toScoordType.ts | 28 ++ packages/adapters/test/Length.jest.js | 79 ++++++ packages/adapters/tsconfig.json | 2 +- packages/ai/package.json | 2 +- .../src/RenderingEngine/BaseVolumeViewport.ts | 127 +++++++-- .../core/src/RenderingEngine/StackViewport.ts | 11 +- .../core/src/RenderingEngine/VideoViewport.ts | 2 +- packages/core/src/RenderingEngine/Viewport.ts | 57 +++- packages/core/src/types/IViewport.ts | 72 +++++- packages/core/src/utilities/index.ts | 1 + packages/core/src/utilities/isEqual.ts | 10 +- .../src/utilities/updatePlaneRestriction.ts | 74 ++++++ packages/docs/bun.lock | 96 +++++-- .../docs/migration-guides/3x/5-adapters.md | 61 ++++- packages/docs/package.json | 2 +- .../index.ts | 1 - packages/tools/src/tools/CrosshairsTool.ts | 35 +-- packages/tools/src/tools/OverlayGridTool.ts | 7 +- .../src/tools/SegmentationIntersectionTool.ts | 24 +- .../tools/annotation/VideoRedactionTool.ts | 6 +- .../tools/src/tools/base/ContourBaseTool.ts | 1 - .../tools/segmentation/CircleScissorsTool.ts | 1 - .../segmentation/RectangleScissorsTool.ts | 1 - .../tools/segmentation/SphereScissorsTool.ts | 1 - packages/tools/src/types/AnnotationTypes.ts | 95 ++++--- packages/tools/src/types/ContourAnnotation.ts | 2 + packages/tools/src/types/index.ts | 11 +- .../planar/filterAnnotationsWithinSlice.ts | 28 +- tsconfig.base.json | 1 - 49 files changed, 1168 insertions(+), 1553 deletions(-) create mode 100644 packages/adapters/src/adapters/helpers/scoordToWorld.ts create mode 100644 packages/adapters/src/adapters/helpers/toPoint3.ts create mode 100644 packages/adapters/src/adapters/helpers/toScoordType.ts create mode 100644 packages/adapters/test/Length.jest.js create mode 100644 packages/core/src/utilities/updatePlaneRestriction.ts diff --git a/bun.lock b/bun.lock index ac8cccba8e..dcbfe7535f 100644 --- a/bun.lock +++ b/bun.lock @@ -136,26 +136,26 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "3.30.3", + "version": "3.31.0", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", - "dcmjs": "^0.42.0", + "dcmjs": "^0.43.1", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^3.23.1", - "@cornerstonejs/tools": "^3.23.1", + "@cornerstonejs/core": "^3.31.0", + "@cornerstonejs/tools": "^3.31.0", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "3.30.3", + "version": "3.31.0", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", - "dcmjs": "^0.42.0", + "dcmjs": "^0.43.1", "gl-matrix": "^3.4.3", "lodash.clonedeep": "^4.5.0", "ndarray": "^1.0.19", @@ -163,13 +163,13 @@ "onnxruntime-web": "1.17.1", }, "peerDependencies": { - "@cornerstonejs/core": "^3.23.1", - "@cornerstonejs/tools": "^3.23.1", + "@cornerstonejs/core": "^3.31.0", + "@cornerstonejs/tools": "^3.31.0", }, }, "packages/core": { "name": "@cornerstonejs/core", - "version": "3.30.3", + "version": "3.31.0", "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", @@ -179,7 +179,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.30.3", + "version": "3.31.0", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -198,7 +198,7 @@ }, "packages/labelmap-interpolation": { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.30.3", + "version": "3.31.0", "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165", @@ -211,7 +211,7 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.30.3", + "version": "3.31.0", "dependencies": { "nifti-reader-js": "^0.6.8", }, @@ -221,7 +221,7 @@ }, "packages/polymorphic-segmentation": { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.30.3", + "version": "3.31.0", "dependencies": { "@icr/polyseg-wasm": "0.4.0", }, @@ -233,7 +233,7 @@ }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "3.30.3", + "version": "3.31.0", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -243,7 +243,7 @@ "canvas": "^3.1.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.23.1", + "@cornerstonejs/core": "^3.31.0", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", @@ -1997,7 +1997,7 @@ "dateformat": ["dateformat@3.0.3", "", {}, "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q=="], - "dcmjs": ["dcmjs@0.42.0", "", { "dependencies": { "@babel/runtime-corejs3": "^7.22.5", "adm-zip": "^0.5.10", "gl-matrix": "^3.1.0", "lodash.clonedeep": "^4.5.0", "loglevel": "^1.8.1", "ndarray": "^1.0.19", "pako": "^2.0.4" } }, "sha512-N/SXIzMvAjDRgb8vC8G7DP/2BI1QKpa3TwY47Ok34g5y6ZKIcpAR3sf+Y+OBWkQxvnCTncB6B4tkq/ih8xjmXA=="], + "dcmjs": ["dcmjs@0.43.1", "", { "dependencies": { "@babel/runtime-corejs3": "^7.22.5", "adm-zip": "^0.5.10", "gl-matrix": "^3.1.0", "lodash.clonedeep": "^4.5.0", "loglevel": "^1.8.1", "ndarray": "^1.0.19", "pako": "^2.0.4" } }, "sha512-7IAB2cs2F8QYINbfhA7PV+IDraqBuHn8N31xJc6HsyNxZXyGUPQRujcq732ACqjLhl7oJi1z8PJJgLdblQtD3Q=="], "debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], diff --git a/packages/adapters/jest.config.js b/packages/adapters/jest.config.js index bd1f3dad96..d4b4624e3e 100644 --- a/packages/adapters/jest.config.js +++ b/packages/adapters/jest.config.js @@ -5,6 +5,7 @@ const path = require("path"); module.exports = { ...base, displayName: "adapters", + testMatch: ["/test/**/*.jest.js"], moduleNameMapper: { "^@cornerstonejs/(.*)$": path.resolve(__dirname, "../$1/src") } diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 193c98156c..d0e92afb6a 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -85,7 +85,7 @@ "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", - "dcmjs": "^0.42.0", + "dcmjs": "^0.43.1", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19" }, diff --git a/packages/adapters/src/adapters/Cornerstone3D/Angle.ts b/packages/adapters/src/adapters/Cornerstone3D/Angle.ts index c5407d02dc..9d55dd12b5 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Angle.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Angle.ts @@ -1,6 +1,7 @@ import { utilities } from "dcmjs"; import MeasurementReport from "./MeasurementReport"; import BaseAdapter3D from "./BaseAdapter3D"; +import { toScoord } from "../helpers"; const { CobbAngle: TID300CobbAngle } = utilities.TID300; @@ -18,163 +19,67 @@ class Angle extends BaseAdapter3D { metadata ) { const { - defaultState, + state, NUMGroup, - SCOORDGroup, - SCOORD3DGroup, + scoord, + scoordArgs, + worldCoords, + referencedImageId, ReferencedFrameNumber } = MeasurementReport.getSetupMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, - Angle.toolType + this.toolType ); - if (SCOORDGroup) { - return this.getMeasurementDataFromScoord({ - defaultState, - SCOORDGroup, - imageToWorldCoords, - NUMGroup, - ReferencedFrameNumber - }); - } else if (SCOORD3DGroup) { - return this.getMeasurementDataFromScoord3D({ - defaultState, - SCOORD3DGroup - }); - } else { - throw new Error( - "Can't get measurement data with missing SCOORD and SCOORD3D groups." - ); - } - } - - static getMeasurementDataFromScoord({ - defaultState, - SCOORDGroup, - imageToWorldCoords, - NUMGroup, - ReferencedFrameNumber - }) { - const referencedImageId = - defaultState.annotation.metadata.referencedImageId; - - const { GraphicData } = SCOORDGroup; - const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 2) { - const point = imageToWorldCoords(referencedImageId, [ - GraphicData[i], - GraphicData[i + 1] - ]); - worldCoords.push(point); - } - - const state = defaultState; + const cachedStats = referencedImageId + ? { + [`imageId:${referencedImageId}`]: { + angle: NUMGroup + ? NUMGroup.MeasuredValueSequence.NumericValue + : null + } + } + : {}; state.annotation.data = { + ...state.annotation.data, handles: { - points: [worldCoords[0], worldCoords[1], worldCoords[3]], + points: worldCoords, activeHandleIndex: 0, textBox: { hasMoved: false } }, - cachedStats: { - [`imageId:${referencedImageId}`]: { - angle: NUMGroup - ? NUMGroup.MeasuredValueSequence.NumericValue - : null - } - }, + cachedStats, frameNumber: ReferencedFrameNumber }; return state; } - static getMeasurementDataFromScoord3D({ defaultState, SCOORD3DGroup }) { - const { GraphicData } = SCOORD3DGroup; - const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 3) { - const point = [ - GraphicData[i], - GraphicData[i + 1], - GraphicData[i + 2] - ]; - worldCoords.push(point); - } - - const state = defaultState; - - state.annotation.data = { - handles: { - points: [worldCoords[0], worldCoords[1], worldCoords[3]], - activeHandleIndex: 0, - textBox: { - hasMoved: false - } - }, - cachedStats: {} - }; - - return state; - } - - public static getTID300RepresentationArguments(tool, worldToImageCoords) { + public static getTID300RepresentationArguments( + tool, + is3DMeasurement = false + ) { const { data, finding, findingSites, metadata } = tool; const { cachedStats = {}, handles } = data; const { referencedImageId } = metadata; - - if (!referencedImageId) { - return this.getTID300RepresentationArgumentsSCOORD3D(tool); - } - - // Using image coordinates for 2D points - const start1 = worldToImageCoords(referencedImageId, handles.points[0]); - const middle = worldToImageCoords(referencedImageId, handles.points[1]); - const end = worldToImageCoords(referencedImageId, handles.points[2]); - - const point1 = { x: start1[0], y: start1[1] }; - const point2 = { x: middle[0], y: middle[1] }; - const point3 = point2; - const point4 = { x: end[0], y: end[1] }; - - const { angle } = cachedStats[`imageId:${referencedImageId}`] || {}; - - // Represented as a cobb angle - return { - point1, - point2, - point3, - point4, - rAngle: angle, - trackingIdentifierTextValue: this.trackingIdentifierTextValue, - finding, - findingSites: findingSites || [], - use3DSpatialCoordinates: false + const scoordProps = { + is3DMeasurement, + referencedImageId }; - } - public static getTID300RepresentationArgumentsSCOORD3D(tool) { - const { data, finding, findingSites, metadata } = tool; - const { cachedStats = {}, handles } = data; - - // Using world coordinates for 3D points - const start = handles.points[0]; - const middle = handles.points[1]; - const end = handles.points[2]; + // Do the conversion automatically for the right coord type + const point1 = toScoord(scoordProps, handles.points[0]); + const point2 = toScoord(scoordProps, handles.points[1]); + const point3 = toScoord(scoordProps, handles.points[1]); + const point4 = toScoord(scoordProps, handles.points[2]); - const point1 = { x: start[0], y: start[1], z: start[2] }; - const point2 = { x: middle[0], y: middle[1], z: middle[2] }; - const point3 = point2; - const point4 = { x: end[0], y: end[1], z: end[2] }; - - const cachedStatsKeys = Object.keys(cachedStats)[0]; - const { angle = undefined } = cachedStatsKeys - ? cachedStats[cachedStatsKeys] - : {}; + const angle = cachedStats[`imageId:${referencedImageId}`]?.angle; + // Represented as a cobb angle return { point1, point2, @@ -184,8 +89,10 @@ class Angle extends BaseAdapter3D { trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [], - ReferencedFrameOfReferenceUID: metadata.FrameOfReferenceUID, - use3DSpatialCoordinates: true + ReferencedFrameOfReferenceUID: is3DMeasurement + ? metadata.FrameOfReferenceUID + : null, + use3DSpatialCoordinates: is3DMeasurement }; } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts b/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts index 08b70b8f77..763238a340 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts @@ -2,6 +2,7 @@ import MeasurementReport from "./MeasurementReport"; import { utilities } from "dcmjs"; import BaseAdapter3D from "./BaseAdapter3D"; import CodingScheme from "./CodingScheme"; +import { toScoord } from "../helpers"; const { Point: TID300Point } = utilities.TID300; const { codeValues } = CodingScheme; @@ -20,102 +21,24 @@ class ArrowAnnotate extends BaseAdapter3D { _trackingIdentifier ) { const { - defaultState, + state, SCOORDGroup, - SCOORD3DGroup, + scoordArgs, + worldCoords, + referencedImageId, ReferencedFrameNumber } = MeasurementReport.getSetupMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, - ArrowAnnotate.toolType + this.toolType ); - const referencedImageId = - defaultState.annotation.metadata.referencedImageId; - - const text = defaultState.annotation.metadata.label; - - if (SCOORDGroup) { - return this.getMeasurementDataFromScoord({ - SCOORDGroup, - referencedImageId, - metadata, - imageToWorldCoords, - defaultState, - text, - ReferencedFrameNumber - }); - } else if (SCOORD3DGroup) { - return this.getMeasurementDataFromScoord3D({ - SCOORD3DGroup, - defaultState, - text - }); - } else { - throw new Error( - "Can't get measurement data with missing SCOORD and SCOORD3D groups." - ); - } - } - - static getMeasurementDataFromScoord3D({ - SCOORD3DGroup, - defaultState, - text - }) { - const { GraphicData } = SCOORD3DGroup; - - const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 3) { - const point = [ - GraphicData[i], - GraphicData[i + 1], - GraphicData[i + 2] - ]; - worldCoords.push(point); - } - - const state = defaultState; - - state.annotation.data = { - text, - handles: { - arrowFirst: true, - points: [worldCoords[0], worldCoords[1]], - activeHandleIndex: 0, - textBox: { - hasMoved: false - } - } - }; - - return state; - } - - static getMeasurementDataFromScoord({ - SCOORDGroup, - referencedImageId, - metadata, - imageToWorldCoords, - defaultState, - text, - ReferencedFrameNumber - }) { - const { GraphicData } = SCOORDGroup; - - const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 2) { - const point = imageToWorldCoords(referencedImageId, [ - GraphicData[i], - GraphicData[i + 1] - ]); - worldCoords.push(point); - } + const text = state.annotation.data.label; // Since the arrowAnnotate measurement is just a point, to generate the tool state // we derive the second point based on the image size relative to the first point. - if (worldCoords.length === 1) { + if (worldCoords.length === 1 && SCOORDGroup) { const imagePixelModule = metadata.get( "imagePixelModule", referencedImageId @@ -130,6 +53,7 @@ class ArrowAnnotate extends BaseAdapter3D { yOffset = rows / 10; } + const { GraphicData } = SCOORDGroup; const secondPoint = imageToWorldCoords(referencedImageId, [ GraphicData[0] + xOffset, GraphicData[1] + yOffset @@ -138,13 +62,12 @@ class ArrowAnnotate extends BaseAdapter3D { worldCoords.push(secondPoint); } - const state = defaultState; - state.annotation.data = { + ...state.annotation.data, text, handles: { arrowFirst: true, - points: [worldCoords[0], worldCoords[1]], + points: worldCoords, activeHandleIndex: 0, textBox: { hasMoved: false @@ -156,100 +79,33 @@ class ArrowAnnotate extends BaseAdapter3D { return state; } - static getTID300RepresentationArguments(tool, worldToImageCoords) { + static getTID300RepresentationArguments(tool, is3DMeasurement = false) { const { data, metadata, findingSites } = tool; let { finding } = tool; const { referencedImageId } = metadata; - - if (!referencedImageId) { - return this.getTID300RepresentationArgumentsSCOORD3D(tool); - } - - const { points, arrowFirst } = data.handles; - - let point; - let point2; - - if (arrowFirst) { - point = points[0]; - point2 = points[1]; - } else { - point = points[1]; - point2 = points[0]; - } - - // Using image coordinates for 2D points - const pointImage = worldToImageCoords(referencedImageId, point); - const pointImage2 = worldToImageCoords(referencedImageId, point2); - - const TID300RepresentationArguments = { - points: [ - { - x: pointImage[0], - y: pointImage[1] - }, - { - x: pointImage2[0], - y: pointImage2[1] - } - ], - trackingIdentifierTextValue: this.trackingIdentifierTextValue, - findingSites: findingSites || [], - finding, - use3DSpatialCoordinates: false + const scoordProps = { + is3DMeasurement, + referencedImageId }; - // If freetext finding isn't present, add it from the tool text. - if (!finding || finding.CodeValue !== codeValues.CORNERSTONEFREETEXT) { - finding = { - CodeValue: codeValues.CORNERSTONEFREETEXT, - CodingSchemeDesignator: CodingScheme.CodingSchemeDesignator, - CodeMeaning: data.text - }; - } - - return TID300RepresentationArguments; - } - - static getTID300RepresentationArgumentsSCOORD3D(tool) { - const { data, findingSites, metadata } = tool; - let { finding } = tool; - const { points, arrowFirst } = data.handles; - let point; - let point2; + const point = arrowFirst ? points[0] : points[1]; + const point2 = arrowFirst ? points[1] : points[0]; - if (arrowFirst) { - point = points[0]; - point2 = points[1]; - } else { - point = points[1]; - point2 = points[0]; - } - - // Using world coordinates for 3D points - const pointImage = point; - const pointImage2 = point2; + // Using image coordinates for 2D points + const pointImage = toScoord(scoordProps, point); + const pointImage2 = toScoord(scoordProps, point2); const TID300RepresentationArguments = { - points: [ - { - x: pointImage[0], - y: pointImage[1], - z: pointImage[2] - }, - { - x: pointImage2[0], - y: pointImage2[1], - z: pointImage2[2] - } - ], + points: [pointImage, pointImage2], trackingIdentifierTextValue: this.trackingIdentifierTextValue, findingSites: findingSites || [], finding, - ReferencedFrameOfReferenceUID: metadata.FrameOfReferenceUID, - use3DSpatialCoordinates: true + ReferencedFrameOfReferenceUID: is3DMeasurement + ? metadata.FrameOfReferenceUID + : null, + use3DSpatialCoordinates: is3DMeasurement }; // If freetext finding isn't present, add it from the tool text. diff --git a/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts b/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts index 2709142a1b..fd2515dcfe 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts @@ -3,6 +3,7 @@ import MeasurementReport, { type AdapterOptions, type MeasurementAdapter } from "./MeasurementReport"; +import { toScoords } from "../helpers"; export type Point = { x: number; @@ -142,55 +143,29 @@ export default class BaseAdapter3D { public static getTID300RepresentationArguments( tool, - worldToImageCoords + is3DMeasurement = false ): TID300Arguments { - const { data, metadata } = tool; + const { metadata } = tool; const { finding, findingSites } = tool; const { referencedImageId } = metadata; - - if (!referencedImageId) { - return this.getTID300RepresentationArgumentsSCOORD3D(tool); - } - - const { - handles: { points = [] } - } = data; + const scoordProps = { + is3DMeasurement, + referencedImageId + }; // Using image coordinates for 2D points - const pointsImage = points.map(point => { - const pointImage = worldToImageCoords(referencedImageId, point); - return { - x: pointImage[0], - y: pointImage[1] - }; - }); + const pointsImage = toScoords(scoordProps, tool.data.handles.points); const tidArguments = { points: pointsImage, trackingIdentifierTextValue: this.trackingIdentifierTextValue, findingSites: findingSites || [], - finding + finding, + ReferencedFrameOfReferenceUID: is3DMeasurement + ? metadata.FrameOfReferenceUID + : null }; return tidArguments; } - - static getTID300RepresentationArgumentsSCOORD3D(tool): TID300Arguments { - const { data, finding, findingSites } = tool; - const { - handles: { points = [] } - } = data; - - // Using world coordinates for 3D points - const point = points[0]; - - const pointXYZ = { x: point[0], y: point[1], z: point[2] }; - - return { - points: [pointXYZ], - trackingIdentifierTextValue: this.trackingIdentifierTextValue, - findingSites: findingSites || [], - finding - }; - } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts b/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts index c4de33296e..aef5bb8c00 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts @@ -1,7 +1,6 @@ import { utilities } from "dcmjs"; -import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; import MeasurementReport from "./MeasurementReport"; -import { toArray } from "../helpers"; +import { scoordToWorld, toScoord, toArray } from "../helpers"; import BaseAdapter3D from "./BaseAdapter3D"; const { Bidirectional: TID300Bidirectional } = utilities.TID300; @@ -18,10 +17,9 @@ class Bidirectional extends BaseAdapter3D { public static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata ) { - const { defaultState, ReferencedFrameNumber } = + const { state, scoordArgs, referencedImageId, ReferencedFrameNumber } = MeasurementReport.getSetupMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, @@ -29,8 +27,6 @@ class Bidirectional extends BaseAdapter3D { Bidirectional.toolType ); - const referencedImageId = - defaultState.annotation.metadata.referencedImageId; const { ContentSequence } = MeasurementGroup; const longAxisNUMGroup = toArray(ContentSequence).find( @@ -40,61 +36,31 @@ class Bidirectional extends BaseAdapter3D { const shortAxisNUMGroup = toArray(ContentSequence).find( group => group.ConceptNameCodeSequence.CodeMeaning === SHORT_AXIS ); - - const longAxisSCOORDGroup = toArray( + const longAxisScoordGroup = toArray( longAxisNUMGroup.ContentSequence - ).find(group => group.ValueType === "SCOORD"); + ).find( + group => + group.ValueType === "SCOORD3D" || group.ValueType === "SCOORD" + ); - const shortAxisSCOORDGroup = toArray( + const shortAxisScoordGroup = toArray( shortAxisNUMGroup.ContentSequence - ).find(group => group.ValueType === "SCOORD"); - - if (longAxisSCOORDGroup && shortAxisSCOORDGroup) { - return this.getMeasurementDataFromScoord({ - longAxisNUMGroup, - shortAxisNUMGroup, - longAxisSCOORDGroup, - shortAxisSCOORDGroup, - referencedImageId, - imageToWorldCoords, - ReferencedFrameNumber, - defaultState - }); - } else { - return this.getMeasurementDataFromScoord3d({ - longAxisNUMGroup, - shortAxisNUMGroup, - defaultState - }); - } - } + ).find( + group => + group.ValueType === "SCOORD3D" || group.ValueType === "SCOORD" + ); - static getMeasurementDataFromScoord({ - longAxisNUMGroup, - shortAxisNUMGroup, - longAxisSCOORDGroup, - shortAxisSCOORDGroup, - referencedImageId, - imageToWorldCoords, - ReferencedFrameNumber, - defaultState - }) { const worldCoords = []; - [longAxisSCOORDGroup, shortAxisSCOORDGroup].forEach(group => { - const { GraphicData } = group; - for (let i = 0; i < GraphicData.length; i += 2) { - const point = imageToWorldCoords(referencedImageId, [ - GraphicData[i], - GraphicData[i + 1] - ]); - worldCoords.push(point); - } - }); - - const state = defaultState; + worldCoords.push( + ...scoordToWorld(scoordArgs, longAxisScoordGroup.GraphicData) + ); + worldCoords.push( + ...scoordToWorld(scoordArgs, shortAxisScoordGroup.GraphicData) + ); state.annotation.data = { + ...state.annotation.data, handles: { points: [ worldCoords[0], @@ -107,71 +73,30 @@ class Bidirectional extends BaseAdapter3D { hasMoved: false } }, - cachedStats: { - [`imageId:${referencedImageId}`]: { - length: longAxisNUMGroup.MeasuredValueSequence.NumericValue, - width: shortAxisNUMGroup.MeasuredValueSequence.NumericValue - } - }, frameNumber: ReferencedFrameNumber }; - return state; - } - - static getMeasurementDataFromScoord3d({ - longAxisNUMGroup, - shortAxisNUMGroup, - defaultState - }) { - const worldCoords = []; - const longAxisSCOORD3DGroup = toArray( - longAxisNUMGroup.ContentSequence - ).find(group => group.ValueType === "SCOORD3D"); - - const shortAxisSCOORD3DGroup = toArray( - shortAxisNUMGroup.ContentSequence - ).find(group => group.ValueType === "SCOORD3D"); - - [longAxisSCOORD3DGroup, shortAxisSCOORD3DGroup].forEach(group => { - const { GraphicData } = group; - for (let i = 0; i < GraphicData.length; i += 3) { - const point = [ - GraphicData[i], - GraphicData[i + 1], - GraphicData[i + 2] - ]; - worldCoords.push(point); - } - }); - - const state = defaultState; - - state.annotation.data = { - handles: { - points: [ - worldCoords[0], - worldCoords[1], - worldCoords[2], - worldCoords[3] - ], - activeHandleIndex: 0, - textBox: { - hasMoved: false + if (referencedImageId) { + state.annotation.data.cachedStats = { + [`imageId:${referencedImageId}`]: { + length: longAxisNUMGroup.MeasuredValueSequence.NumericValue, + width: shortAxisNUMGroup.MeasuredValueSequence.NumericValue } - }, - cachedStats: {} - }; + }; + } return state; } - static getTID300RepresentationArguments(tool, worldToImageCoords) { + static getTID300RepresentationArguments(tool, is3DMeasurement = false) { const { data, finding, findingSites, metadata } = tool; const { cachedStats = {}, handles } = data; const { referencedImageId } = metadata; - + const scoordProps = { + is3DMeasurement, + referencedImageId + }; const { points } = handles; // Find the length and width point pairs by comparing the distances of the points at 0,1 to points at 2,3 @@ -200,116 +125,33 @@ class Bidirectional extends BaseAdapter3D { longAxisPoints = firstPointPairs; } - if (!referencedImageId) { - return this.getTID300RepresentationArgumentsSCOORD3D({ - tool, - shortAxisPoints, - longAxisPoints - }); - } - // Using image coordinates for 2D points - const longAxisStartImage = worldToImageCoords( - referencedImageId, - shortAxisPoints[0] - ); - const longAxisEndImage = worldToImageCoords( - referencedImageId, - shortAxisPoints[1] - ); - const shortAxisStartImage = worldToImageCoords( - referencedImageId, - longAxisPoints[0] - ); - const shortAxisEndImage = worldToImageCoords( - referencedImageId, - longAxisPoints[1] - ); + const longAxisStartImage = toScoord(scoordProps, shortAxisPoints[0]); + const longAxisEndImage = toScoord(scoordProps, shortAxisPoints[1]); + const shortAxisStartImage = toScoord(scoordProps, longAxisPoints[0]); + const shortAxisEndImage = toScoord(scoordProps, longAxisPoints[1]); const { length, width } = cachedStats[`imageId:${referencedImageId}`] || {}; return { longAxis: { - point1: { - x: longAxisStartImage[0], - y: longAxisStartImage[1] - }, - point2: { - x: longAxisEndImage[0], - y: longAxisEndImage[1] - } + point1: longAxisStartImage, + point2: longAxisEndImage }, shortAxis: { - point1: { - x: shortAxisStartImage[0], - y: shortAxisStartImage[1] - }, - point2: { - x: shortAxisEndImage[0], - y: shortAxisEndImage[1] - } - }, - longAxisLength: length, - shortAxisLength: width, - trackingIdentifierTextValue: this.trackingIdentifierTextValue, - finding: finding, - findingSites: findingSites || [], - use3DSpatialCoordinates: false - }; - } - - static getTID300RepresentationArgumentsSCOORD3D({ - tool, - shortAxisPoints, - longAxisPoints - }) { - const { data, finding, findingSites, metadata } = tool; - const { cachedStats = {} } = data; - - // Using world coordinates for 3D points - const longAxisStart = shortAxisPoints[0]; - const longAxisEnd = shortAxisPoints[1]; - const shortAxisStart = longAxisPoints[0]; - const shortAxisEnd = longAxisPoints[1]; - - const cachedStatsKeys = Object.keys(cachedStats)[0]; - const { length = undefined, width = undefined } = cachedStatsKeys - ? cachedStats[cachedStatsKeys] - : {}; - - return { - longAxis: { - point1: { - x: longAxisStart[0], - y: longAxisStart[1], - z: longAxisStart[2] - }, - point2: { - x: longAxisEnd[0], - y: longAxisEnd[1], - z: longAxisEnd[2] - } - }, - shortAxis: { - point1: { - x: shortAxisStart[0], - y: shortAxisStart[1], - z: shortAxisStart[2] - }, - point2: { - x: shortAxisEnd[0], - y: shortAxisEnd[1], - z: shortAxisEnd[2] - } + point1: shortAxisStartImage, + point2: shortAxisEndImage }, longAxisLength: length, shortAxisLength: width, trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding: finding, findingSites: findingSites || [], - ReferencedFrameOfReferenceUID: metadata.FrameOfReferenceUID, - use3DSpatialCoordinates: true + ReferencedFrameOfReferenceUID: is3DMeasurement + ? metadata.FrameOfReferenceUID + : null, + use3DSpatialCoordinates: is3DMeasurement }; } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts b/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts index f396dfe30a..543101b1da 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts @@ -1,6 +1,7 @@ import { utilities } from "dcmjs"; import MeasurementReport from "./MeasurementReport"; import BaseAdapter3D from "./BaseAdapter3D"; +import { toScoord } from "../helpers"; const { Circle: TID300Circle } = utilities.TID300; @@ -14,76 +15,36 @@ class CircleROI extends BaseAdapter3D { static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata ) { const { - defaultState, + state, NUMGroup, - SCOORDGroup, - SCOORD3DGroup, + scoord, + scoordArgs, + worldCoords, + referencedImageId, ReferencedFrameNumber } = MeasurementReport.getSetupMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, - CircleROI.toolType + this.toolType ); - if (SCOORDGroup) { - return this.getMeasurementDataFromScoord({ - defaultState, - SCOORDGroup, - imageToWorldCoords, - NUMGroup, - ReferencedFrameNumber - }); - } else if (SCOORD3DGroup) { - return this.getMeasurementDataFromScoord3D({ - defaultState, - SCOORD3DGroup - }); - } else { - throw new Error( - "Can't get measurement data with missing SCOORD and SCOORD3D groups." - ); - } - } - - static getMeasurementDataFromScoord({ - defaultState, - SCOORDGroup, - imageToWorldCoords, - NUMGroup, - ReferencedFrameNumber - }) { - const referencedImageId = - defaultState.annotation.metadata.referencedImageId; - - const { GraphicData } = SCOORDGroup; - - // GraphicData is ordered as [centerX, centerY, endX, endY] - const pointsWorld = []; - for (let i = 0; i < GraphicData.length; i += 2) { - const worldPos = imageToWorldCoords(referencedImageId, [ - GraphicData[i], - GraphicData[i + 1] - ]); - - pointsWorld.push(worldPos); - } - - const state = defaultState; - state.annotation.data = { + ...state.annotation.data, handles: { - points: [...pointsWorld], + points: worldCoords, activeHandleIndex: 0, textBox: { hasMoved: false } }, - cachedStats: { + frameNumber: ReferencedFrameNumber + }; + if (referencedImageId) { + state.annotation.data.cachedStats = { [`imageId:${referencedImageId}`]: { area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue @@ -92,41 +53,9 @@ class CircleROI extends BaseAdapter3D { radius: 0, perimeter: 0 } - }, - frameNumber: ReferencedFrameNumber - }; - - return state; - } - - static getMeasurementDataFromScoord3D({ defaultState, SCOORD3DGroup }) { - const { GraphicData } = SCOORD3DGroup; - - // GraphicData is ordered as [centerX, centerY, endX, endY] - const pointsWorld = []; - for (let i = 0; i < GraphicData.length; i += 3) { - const worldPos = [ - GraphicData[i], - GraphicData[i + 1], - GraphicData[i + 2] - ]; - - pointsWorld.push(worldPos); + }; } - const state = defaultState; - - state.annotation.data = { - handles: { - points: [...pointsWorld], - activeHandleIndex: 0, - textBox: { - hasMoved: false - } - }, - cachedStats: {} - }; - return state; } @@ -136,23 +65,19 @@ class CircleROI extends BaseAdapter3D { * @param {Object} tool * @returns */ - static getTID300RepresentationArguments(tool, worldToImageCoords) { + static getTID300RepresentationArguments(tool, is3DMeasurement = false) { const { data, finding, findingSites, metadata } = tool; const { cachedStats = {}, handles } = data; const { referencedImageId } = metadata; - - if (!referencedImageId) { - return this.getTID300RepresentationArgumentsSCOORD3D(tool); - } + const scoordProps = { + is3DMeasurement, + referencedImageId + }; // Using image coordinates for 2D points - const center = worldToImageCoords(referencedImageId, handles.points[0]); - const end = worldToImageCoords(referencedImageId, handles.points[1]); - - const points = []; - points.push({ x: center[0], y: center[1] }); - points.push({ x: end[0], y: end[1] }); + const center = toScoord(scoordProps, handles.points[0]); + const end = toScoord(scoordProps, handles.points[1]); const { area, radius } = cachedStats[`imageId:${referencedImageId}`] || {}; @@ -162,42 +87,14 @@ class CircleROI extends BaseAdapter3D { area, perimeter, radius, - points, - trackingIdentifierTextValue: this.trackingIdentifierTextValue, - finding, - findingSites: findingSites || [], - use3DSpatialCoordinates: false - }; - } - - static getTID300RepresentationArgumentsSCOORD3D(tool) { - const { data, finding, findingSites, metadata } = tool; - const { cachedStats = {}, handles } = data; - - // Using world coordinates for 3D points - const center = handles.points[0]; - const end = handles.points[1]; - - const points = []; - points.push({ x: center[0], y: center[1], z: center[2] }); - points.push({ x: end[0], y: end[1], z: center[2] }); - - const cachedStatsKeys = Object.keys(cachedStats)[0]; - const { area = undefined, radius = 0 } = cachedStatsKeys - ? cachedStats[cachedStatsKeys] - : {}; - const perimeter = 2 * Math.PI * radius; - - return { - area, - perimeter, - radius, - points, + points: [center, end], trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [], - ReferencedFrameOfReferenceUID: metadata.FrameOfReferenceUID, - use3DSpatialCoordinates: true + ReferencedFrameOfReferenceUID: is3DMeasurement + ? metadata.FrameOfReferenceUID + : null, + use3DSpatialCoordinates: is3DMeasurement }; } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts b/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts index 43115c4ddc..89398520a5 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts @@ -1,6 +1,7 @@ import { utilities } from "dcmjs"; import MeasurementReport from "./MeasurementReport"; import BaseAdapter3D from "./BaseAdapter3D"; +import { toScoords } from "../helpers"; const { CobbAngle: TID300CobbAngle } = utilities.TID300; @@ -15,14 +16,13 @@ class CobbAngle extends BaseAdapter3D { public static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata ) { const { - defaultState, + state, NUMGroup, - SCOORDGroup, - SCOORD3DGroup, + referencedImageId, + worldCoords, ReferencedFrameNumber } = MeasurementReport.getSetupMeasurementData( MeasurementGroup, @@ -31,49 +31,8 @@ class CobbAngle extends BaseAdapter3D { CobbAngle.toolType ); - if (SCOORDGroup) { - return this.getMeasurementDataFromScoord({ - defaultState, - SCOORDGroup, - imageToWorldCoords, - NUMGroup, - ReferencedFrameNumber - }); - } else if (SCOORD3DGroup) { - return this.getMeasurementDataFromScoord3D({ - defaultState, - SCOORD3DGroup - }); - } else { - throw new Error( - "Can't get measurement data with missing SCOORD and SCOORD3D groups." - ); - } - } - - static getMeasurementDataFromScoord({ - defaultState, - SCOORDGroup, - imageToWorldCoords, - NUMGroup, - ReferencedFrameNumber - }) { - const referencedImageId = - defaultState.annotation.metadata.referencedImageId; - - const { GraphicData } = SCOORDGroup; - const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 2) { - const point = imageToWorldCoords(referencedImageId, [ - GraphicData[i], - GraphicData[i + 1] - ]); - worldCoords.push(point); - } - - const state = defaultState; - state.annotation.data = { + ...state.annotation.data, handles: { points: [ worldCoords[0], @@ -86,72 +45,37 @@ class CobbAngle extends BaseAdapter3D { hasMoved: false } }, - cachedStats: { + frameNumber: ReferencedFrameNumber + }; + if (referencedImageId) { + state.annotation.data.cachedStats = { [`imageId:${referencedImageId}`]: { angle: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : null } - }, - frameNumber: ReferencedFrameNumber - }; - - return state; - } - - static getMeasurementDataFromScoord3D({ defaultState, SCOORD3DGroup }) { - const { GraphicData } = SCOORD3DGroup; - const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 3) { - const point = [ - GraphicData[i], - GraphicData[i + 1], - GraphicData[i + 2] - ]; - worldCoords.push(point); + }; } - const state = defaultState; - - state.annotation.data = { - handles: { - points: [ - worldCoords[0], - worldCoords[1], - worldCoords[2], - worldCoords[3] - ], - activeHandleIndex: 0, - textBox: { - hasMoved: false - } - }, - cachedStats: {} - }; - return state; } - public static getTID300RepresentationArguments(tool, worldToImageCoords) { + public static getTID300RepresentationArguments( + tool, + is3DMeasurement = false + ) { const { data, finding, findingSites, metadata } = tool; const { cachedStats = {}, handles } = data; const { referencedImageId } = metadata; - - if (!referencedImageId) { - return this.getTID300RepresentationArgumentsSCOORD3D(tool); - } + const scoordProps = { + is3DMeasurement, + referencedImageId + }; + const points = toScoords(scoordProps, handles.points); // Using image coordinates for 2D points - const start1 = worldToImageCoords(referencedImageId, handles.points[0]); - const end1 = worldToImageCoords(referencedImageId, handles.points[1]); - const start2 = worldToImageCoords(referencedImageId, handles.points[2]); - const end2 = worldToImageCoords(referencedImageId, handles.points[3]); - - const point1 = { x: start1[0], y: start1[1] }; - const point2 = { x: end1[0], y: end1[1] }; - const point3 = { x: start2[0], y: start2[1] }; - const point4 = { x: end2[0], y: end2[1] }; + const [point1, point2, point3, point4] = points; const { angle } = cachedStats[`imageId:${referencedImageId}`] || {}; @@ -164,41 +88,10 @@ class CobbAngle extends BaseAdapter3D { trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [], - use3DSpatialCoordinates: false - }; - } - - public static getTID300RepresentationArgumentsSCOORD3D(tool) { - const { data, finding, findingSites, metadata } = tool; - const { cachedStats = {}, handles } = data; - - // Using world coordinates for 3D points - const start1 = handles.points[0]; - const end1 = handles.points[1]; - const start2 = handles.points[2]; - const end2 = handles.points[3]; - - const point1 = { x: start1[0], y: start1[1], z: start1[2] }; - const point2 = { x: end1[0], y: end1[1], z: end1[2] }; - const point3 = { x: start2[0], y: start2[1], z: start2[2] }; - const point4 = { x: end2[0], y: end2[1], z: end2[2] }; - - const cachedStatsKeys = Object.keys(cachedStats)[0]; - const { angle = undefined } = cachedStatsKeys - ? cachedStats[cachedStatsKeys] - : {}; - - return { - point1, - point2, - point3, - point4, - rAngle: angle, - trackingIdentifierTextValue: this.trackingIdentifierTextValue, - finding, - findingSites: findingSites || [], - ReferencedFrameOfReferenceUID: metadata.FrameOfReferenceUID, - use3DSpatialCoordinates: true + ReferencedFrameOfReferenceUID: is3DMeasurement + ? metadata.FrameOfReferenceUID + : null, + use3DSpatialCoordinates: is3DMeasurement }; } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts b/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts index 6c213b4184..7d37cc449e 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts @@ -1,11 +1,13 @@ import { vec3 } from "gl-matrix"; import { utilities } from "dcmjs"; +import { utilities as csUtilities } from "@cornerstonejs/core"; import MeasurementReport from "./MeasurementReport"; import BaseAdapter3D from "./BaseAdapter3D"; type Point3 = [number, number, number]; const { Ellipse: TID300Ellipse } = utilities.TID300; +const { worldToImageCoords } = csUtilities; const EPSILON = 1e-4; @@ -21,10 +23,12 @@ class EllipticalROI extends BaseAdapter3D { metadata ) { const { - defaultState, + state, NUMGroup, - SCOORDGroup, - SCOORD3DGroup, + scoord, + scoordArgs, + worldCoords, + referencedImageId, ReferencedFrameNumber } = MeasurementReport.getSetupMeasurementData( MeasurementGroup, @@ -33,58 +37,8 @@ class EllipticalROI extends BaseAdapter3D { EllipticalROI.toolType ); - if (SCOORDGroup) { - return this.getMeasurementDataFromScoord({ - defaultState, - SCOORDGroup, - imageToWorldCoords, - metadata, - NUMGroup, - ReferencedFrameNumber - }); - } else if (SCOORD3DGroup) { - return this.getMeasurementDataFromScoord3D({ - defaultState, - SCOORD3DGroup - }); - } else { - throw new Error( - "Can't get measurement data with missing SCOORD and SCOORD3D groups." - ); - } - } - - static getMeasurementDataFromScoord({ - defaultState, - SCOORDGroup, - imageToWorldCoords, - metadata, - NUMGroup, - ReferencedFrameNumber - }) { - const referencedImageId = - defaultState.annotation.metadata.referencedImageId; - - const { GraphicData } = SCOORDGroup; - - // GraphicData is ordered as [majorAxisStartX, majorAxisStartY, majorAxisEndX, majorAxisEndY, minorAxisStartX, minorAxisStartY, minorAxisEndX, minorAxisEndY] - // But Cornerstone3D points are ordered as top, bottom, left, right for the - // ellipse so we need to identify if the majorAxis is horizontal or vertical - // in the image plane and then choose the correct points to use for the ellipse. - const pointsWorld: Point3[] = []; - for (let i = 0; i < GraphicData.length; i += 2) { - const worldPos = imageToWorldCoords(referencedImageId, [ - GraphicData[i], - GraphicData[i + 1] - ]); - - pointsWorld.push(worldPos); - } - - const majorAxisStart = vec3.fromValues(...pointsWorld[0]); - const majorAxisEnd = vec3.fromValues(...pointsWorld[1]); - const minorAxisStart = vec3.fromValues(...pointsWorld[2]); - const minorAxisEnd = vec3.fromValues(...pointsWorld[3]); + const [majorAxisStart, majorAxisEnd, minorAxisStart, minorAxisEnd] = + worldCoords; const majorAxisVec = vec3.create(); vec3.sub(majorAxisVec, majorAxisEnd, majorAxisStart); @@ -128,26 +82,21 @@ class EllipticalROI extends BaseAdapter3D { let ellipsePoints = []; if (Math.abs(absoluteOfMajorDotProduct - 1) < EPSILON) { - ellipsePoints = [ - pointsWorld[0], - pointsWorld[1], - pointsWorld[2], - pointsWorld[3] - ]; + ellipsePoints = worldCoords; } else if (Math.abs(absoluteOfMinorDotProduct - 1) < EPSILON) { ellipsePoints = [ - pointsWorld[2], - pointsWorld[3], - pointsWorld[0], - pointsWorld[1] + worldCoords[2], + worldCoords[3], + worldCoords[0], + worldCoords[1] ]; } else { console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED"); + return null; } - const state = defaultState; - state.annotation.data = { + ...state.annotation.data, handles: { points: [...ellipsePoints], activeHandleIndex: 0, @@ -155,82 +104,27 @@ class EllipticalROI extends BaseAdapter3D { hasMoved: false } }, - cachedStats: { + frameNumber: ReferencedFrameNumber + }; + if (referencedImageId) { + state.annotation.data.cachedStats = { [`imageId:${referencedImageId}`]: { area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0 } - }, - frameNumber: ReferencedFrameNumber - }; - - return state; - } - - static getMeasurementDataFromScoord3D({ defaultState, SCOORD3DGroup }) { - const { GraphicData } = SCOORD3DGroup; - - // GraphicData is ordered as [majorAxisStartX, majorAxisStartY, majorAxisEndX, majorAxisEndY, minorAxisStartX, minorAxisStartY, minorAxisEndX, minorAxisEndY] - // But Cornerstone3D points are ordered as top, bottom, left, right for the - // ellipse so we need to identify if the majorAxis is horizontal or vertical - // in the image plane and then choose the correct points to use for the ellipse. - const pointsWorld: Point3[] = []; - for (let i = 0; i < GraphicData.length; i += 3) { - const worldPos: Point3 = [ - GraphicData[i], - GraphicData[i + 1], - GraphicData[i + 2] - ]; - - pointsWorld.push(worldPos); + }; } - const majorAxisStart = vec3.fromValues(...pointsWorld[0]); - const majorAxisEnd = vec3.fromValues(...pointsWorld[1]); - const minorAxisStart = vec3.fromValues(...pointsWorld[2]); - const minorAxisEnd = vec3.fromValues(...pointsWorld[3]); - - const majorAxisVec = vec3.create(); - vec3.sub(majorAxisVec, majorAxisEnd, majorAxisStart); - - // normalize majorAxisVec to avoid scaling issues - vec3.normalize(majorAxisVec, majorAxisVec); - - const minorAxisVec = vec3.create(); - vec3.sub(minorAxisVec, minorAxisEnd, minorAxisStart); - vec3.normalize(minorAxisVec, minorAxisVec); - - const state = defaultState; - - state.annotation.data = { - handles: { - points: [ - majorAxisStart, - majorAxisEnd, - minorAxisStart, - minorAxisEnd - ], - activeHandleIndex: 0, - textBox: { - hasMoved: false - } - }, - cachedStats: {} - }; - return state; } - static getTID300RepresentationArguments(tool, worldToImageCoords) { + static getTID300RepresentationArguments(tool, is3DMeasurement = false) { const { data, finding, findingSites, metadata } = tool; const { cachedStats = {}, handles } = data; const rotation = data.initialRotation || 0; const { referencedImageId } = metadata; - if (!referencedImageId) { - return this.getTID300RepresentationArgumentsSCOORD3D(tool); - } let top, bottom, left, right; // Using image coordinates for 2D points @@ -248,8 +142,8 @@ class EllipticalROI extends BaseAdapter3D { } // find the major axis and minor axis - const topBottomLength = Math.abs(top[1] - bottom[1]); - const leftRightLength = Math.abs(left[0] - right[0]); + const topBottomLength = Math.abs(top.y - bottom.y); + const leftRightLength = Math.abs(left.x - right.x); const points = []; if (topBottomLength > leftRightLength) { @@ -278,75 +172,10 @@ class EllipticalROI extends BaseAdapter3D { trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [], - use3DSpatialCoordinates: false - }; - } - - static getTID300RepresentationArgumentsSCOORD3D(tool) { - const { data, finding, findingSites, metadata } = tool; - const { cachedStats, handles } = data; - const rotation = data.initialRotation || 0; - - let top, bottom, left, right; - - // Using world coordinates for 3D points - // this way when it's restored we can assume the initial rotation is 0. - if (rotation == 90 || rotation == 270) { - bottom = handles.points[2]; - top = handles.points[3]; - left = handles.points[0]; - right = handles.points[1]; - } else { - top = handles.points[0]; - bottom = handles.points[1]; - left = handles.points[2]; - right = handles.points[3]; - } - - // find the major axis and minor axis - const topBottomLength = Math.sqrt( - (top[0] - bottom[0]) ** 2 + - (top[1] - bottom[1]) ** 2 + - (top[2] - bottom[2]) ** 2 - ); - const leftRightLength = Math.sqrt( - (left[0] - right[0]) ** 2 + - (left[1] - right[1]) ** 2 + - (left[2] - right[2]) ** 2 - ); - - const points = []; - if (topBottomLength > leftRightLength) { - // major axis is bottom to top - points.push({ x: top[0], y: top[1], z: top[2] }); - points.push({ x: bottom[0], y: bottom[1], z: bottom[2] }); - - // minor axis is left to right - points.push({ x: left[0], y: left[1], z: left[2] }); - points.push({ x: right[0], y: right[1], z: right[2] }); - } else { - // major axis is left to right - points.push({ x: left[0], y: left[1], z: left[2] }); - points.push({ x: right[0], y: right[1], z: right[2] }); - - // minor axis is bottom to top - points.push({ x: top[0], y: top[1], z: top[2] }); - points.push({ x: bottom[0], y: bottom[1], z: bottom[2] }); - } - - const cachedStatsKeys = Object.keys(cachedStats)[0]; - const { area = undefined } = cachedStatsKeys - ? cachedStats[cachedStatsKeys] - : {}; - - return { - area, - points, - trackingIdentifierTextValue: this.trackingIdentifierTextValue, - finding, - findingSites: findingSites || [], - ReferencedFrameOfReferenceUID: metadata.FrameOfReferenceUID, - use3DSpatialCoordinates: true + ReferencedFrameOfReferenceUID: is3DMeasurement + ? metadata.FrameOfReferenceUID + : null, + use3DSpatialCoordinates: is3DMeasurement }; } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/KeyImage.ts b/packages/adapters/src/adapters/Cornerstone3D/KeyImage.ts index 57e59b20d4..cbcdf273c8 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/KeyImage.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/KeyImage.ts @@ -30,11 +30,8 @@ export default class KeyImage extends Probe { return baseData; } - public static getTID300RepresentationArguments(tool, worldToImageCoords) { - const tid300Arguments = super.getTID300RepresentationArguments( - tool, - worldToImageCoords - ); + public static getTID300RepresentationArguments(tool) { + const tid300Arguments = super.getTID300RepresentationArguments(tool); const { data } = tool; if (data.isPoint) { if (data.seriesLevel) { diff --git a/packages/adapters/src/adapters/Cornerstone3D/Length.ts b/packages/adapters/src/adapters/Cornerstone3D/Length.ts index c1129e51c0..51a2cf21aa 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Length.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Length.ts @@ -1,6 +1,7 @@ import { utilities } from "dcmjs"; import MeasurementReport from "./MeasurementReport"; import BaseAdapter3D from "./BaseAdapter3D"; +import { toScoord } from "../helpers"; const { Length: TID300Length } = utilities.TID300; @@ -13,81 +14,19 @@ export default class Length extends BaseAdapter3D { this.registerLegacy(); } - static getMeasurementDataFromScoord({ - defaultState, - NUMGroup, - SCOORDGroup, - ReferencedFrameNumber, - imageToWorldCoords - }) { - const referencedImageId = - defaultState.annotation.metadata.referencedImageId; - - const { GraphicData } = SCOORDGroup; - const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 2) { - const point = imageToWorldCoords(referencedImageId, [ - GraphicData[i], - GraphicData[i + 1] - ]); - worldCoords.push(point); - } - - const state = defaultState; - - state.annotation.data = { - handles: { - points: [worldCoords[0], worldCoords[1]], - activeHandleIndex: 0, - textBox: { - hasMoved: false - } - }, - cachedStats: { - [`imageId:${referencedImageId}`]: { - length: NUMGroup - ? NUMGroup.MeasuredValueSequence.NumericValue - : 0 - } - }, - frameNumber: ReferencedFrameNumber - }; - - return state; - } - - static getMeasurementDataFromScoord3d({ defaultState, SCOORD3DGroup }) { - const { GraphicData } = SCOORD3DGroup; - const worldCoords = GraphicData; - - const state = defaultState; - - state.annotation.data = { - handles: { - points: [worldCoords.slice(0, 3), worldCoords.slice(3, 6)], - activeHandleIndex: 0, - textBox: { - hasMoved: false - } - }, - cachedStats: {} - }; - - return state; - } - // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport. static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata ) { const { - defaultState, + state, NUMGroup, - SCOORDGroup, - SCOORD3DGroup, + scoord, + scoordArgs, + worldCoords, + referencedImageId, ReferencedFrameNumber } = MeasurementReport.getSetupMeasurementData( MeasurementGroup, @@ -96,42 +35,44 @@ export default class Length extends BaseAdapter3D { this.toolType ); - if (SCOORDGroup) { - return this.getMeasurementDataFromScoord({ - defaultState, - NUMGroup, - SCOORDGroup, - ReferencedFrameNumber, - imageToWorldCoords - }); - } else if (SCOORD3DGroup) { - return this.getMeasurementDataFromScoord3d({ - defaultState, - SCOORD3DGroup - }); - } else { - throw new Error( - "Can't get measurement data with missing SCOORD and SCOORD3D groups." - ); - } + const cachedStats = referencedImageId + ? { + [`imageId:${referencedImageId}`]: { + length: NUMGroup + ? NUMGroup.MeasuredValueSequence.NumericValue + : 0 + } + } + : {}; + state.annotation.data = { + ...state.annotation.data, + handles: { + points: [worldCoords[0], worldCoords[1]], + activeHandleIndex: 0, + textBox: { + hasMoved: false + } + }, + cachedStats, + frameNumber: ReferencedFrameNumber + }; + + return state; } - static getTID300RepresentationArguments(tool, worldToImageCoords) { + static getTID300RepresentationArguments(tool, is3DMeasurement = false) { const { data, finding, findingSites, metadata } = tool; const { cachedStats = {}, handles } = data; const { referencedImageId } = metadata; + const scoordProps = { + is3DMeasurement, + referencedImageId + }; - if (!referencedImageId) { - return this.getTID300RepresentationArgumentsSCOORD3D(tool); - } - - // Using image coordinates for 2D points - const start = worldToImageCoords(referencedImageId, handles.points[0]); - const end = worldToImageCoords(referencedImageId, handles.points[1]); - - const point1 = { x: start[0], y: start[1] }; - const point2 = { x: end[0], y: end[1] }; + // Do the conversion automatically for hte right coord type + const point1 = toScoord(scoordProps, handles.points[0]); + const point2 = toScoord(scoordProps, handles.points[1]); const { length: distance } = cachedStats[`imageId:${referencedImageId}`] || {}; @@ -143,35 +84,10 @@ export default class Length extends BaseAdapter3D { trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [], - use3DSpatialCoordinates: false - }; - } - - static getTID300RepresentationArgumentsSCOORD3D(tool) { - const { data, finding, findingSites, metadata } = tool; - const { cachedStats = {}, handles } = data; - - // Using world coordinates for 3D points - const start = handles.points[0]; - const end = handles.points[1]; - - const point1 = { x: start[0], y: start[1], z: start[2] }; - const point2 = { x: end[0], y: end[1], z: end[2] }; - - const cachedStatsKeys = Object.keys(cachedStats)[0]; - const { length: distance = undefined } = cachedStatsKeys - ? cachedStats[cachedStatsKeys] - : {}; - - return { - point1, - point2, - distance, - trackingIdentifierTextValue: this.trackingIdentifierTextValue, - finding, - findingSites: findingSites || [], - ReferencedFrameOfReferenceUID: metadata.FrameOfReferenceUID, - use3DSpatialCoordinates: true + ReferencedFrameOfReferenceUID: is3DMeasurement + ? metadata.FrameOfReferenceUID + : null, + use3DSpatialCoordinates: is3DMeasurement }; } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts index 2b6df7cf55..68f37166f4 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts @@ -1,13 +1,31 @@ -import { normalizers, data, utilities, derivations } from "dcmjs"; -import { cache } from "@cornerstonejs/core"; +import { + normalizers, + data, + utilities as dcmjsUtilities, + derivations +} from "dcmjs"; +import { + cache, + utilities as csUtilities, + type Types as CSTypes +} from "@cornerstonejs/core"; +import type { Types } from "@cornerstonejs/tools"; import CORNERSTONE_3D_TAG from "./cornerstone3DTag"; -import { toArray, codeMeaningEquals, copyStudyTags } from "../helpers"; +import { + toArray, + codeMeaningEquals, + copyStudyTags, + scoordToWorld +} from "../helpers"; import Cornerstone3DCodingScheme from "./CodingScheme"; import { copySeriesTags } from "../helpers/copySeriesTags"; +import { toPoint3 } from "../helpers/toPoint3"; import { NO_IMAGE_ID } from "./constants"; -const { TID1500, addAccessors } = utilities; +type Annotation = Types.Annotation; + +const { TID1500, addAccessors } = dcmjsUtilities; const { StructuredReport } = derivations; @@ -24,28 +42,36 @@ const FINDING_SITE_OLD = { CodingSchemeDesignator: "SRT", CodeValue: "G-C0E3" }; type SpatialCoordinatesState = { description?: string; sopInstanceUid?: string; - annotation: { - annotationUID: string; - metadata: { - toolName: string; - referencedImageId?: string; - FrameOfReferenceUID: string; - label: string; - }; - data?: unknown; - }; + annotation: Annotation; finding?: unknown; findingSites?: unknown; }; +type ScoordType = { + GraphicData: number[]; +}; + type SetupMeasurementData = { defaultState: SpatialCoordinatesState; - NUMGroup: Record; - SCOORDGroup?: Record; + state?: SpatialCoordinatesState; + is3DMeasurement?: boolean; + scoord?: ScoordType; + worldCoords?: CSTypes.Point3[]; + scoordArgs?: { + referencedImageId: string; + is3DMeasurement: boolean; + }; + NUMGroup: { + MeasuredValueSequence: { + NumericValue: number; + }; + }; + SCOORDGroup?: ScoordType; ReferencedSOPSequence?: Record; ReferencedSOPInstanceUID?: string; + referencedImageId?: string; ReferencedFrameNumber?: string; - SCOORD3DGroup?: Record; + SCOORD3DGroup?: ScoordType; FrameOfReferenceUID?: string; }; @@ -96,7 +122,6 @@ export interface MeasurementAdapter { getMeasurementData( measurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata, trackingIdentifier: string ); @@ -105,7 +130,7 @@ export interface MeasurementAdapter { getTID300RepresentationArguments( tool, - worldToImageCoords + is3DMeasurement ): Record; } @@ -128,11 +153,11 @@ export default class MeasurementReport { tool, ReferencedSOPSequence, toolClass, - worldToImageCoords + is3DMeasurement ) { const args = toolClass.getTID300RepresentationArguments( tool, - worldToImageCoords + is3DMeasurement ); args.ReferencedSOPSequence = ReferencedSOPSequence; @@ -159,7 +184,7 @@ export default class MeasurementReport { toolType, toolData, ReferencedSOPSequence, - worldToImageCoords + is3DMeasurement ) { const toolTypeData = toolData[toolType]; const toolClass = this.measurementAdapterByToolType.get(toolType); @@ -179,7 +204,7 @@ export default class MeasurementReport { tool, ReferencedSOPSequence, toolClass, - worldToImageCoords + is3DMeasurement ); }); @@ -248,7 +273,7 @@ export default class MeasurementReport { toolType, sopInstanceUIDToImageIdMap, metadata - }): SpatialCoordinatesData { + }) { const { ReferencedSOPSequence } = SCOORDGroup.ContentSequence; const { ReferencedSOPInstanceUID, ReferencedFrameNumber } = ReferencedSOPSequence; @@ -260,22 +285,26 @@ export default class MeasurementReport { referencedImageId ); + const annotationUID = DicomMetaDictionary.uid(); return { SCOORDGroup, ReferencedSOPSequence, ReferencedSOPInstanceUID, ReferencedFrameNumber, + referencedImageId, state: { description: undefined, sopInstanceUid: ReferencedSOPInstanceUID, annotation: { - annotationUID: DicomMetaDictionary.uid(), + data: { + annotationUID + }, + annotationUID, metadata: { toolName: toolType, referencedImageId, FrameOfReferenceUID: - imagePlaneModule.frameOfReferenceUID, - label: "" + imagePlaneModule.frameOfReferenceUID } } } @@ -286,22 +315,31 @@ export default class MeasurementReport { SCOORD3DGroup, toolType }): SpatialCoordinatesData { - return { + const annotationUID = DicomMetaDictionary.uid(); + const toolData = { SCOORD3DGroup, FrameOfReferenceUID: SCOORD3DGroup.ReferencedFrameOfReferenceUID, state: { description: undefined, annotation: { - annotationUID: DicomMetaDictionary.uid(), + annotationUID, + data: { + annotationUID + }, metadata: { toolName: toolType, FrameOfReferenceUID: - SCOORD3DGroup.ReferencedFrameOfReferenceUID, - label: "" + SCOORD3DGroup.ReferencedFrameOfReferenceUID } } } }; + csUtilities.updatePlaneRestriction( + toPoint3(SCOORD3DGroup.GraphicData), + toolData.state.annotation.metadata + ); + + return toolData; } public static getSpatialCoordinatesState({ @@ -346,7 +384,8 @@ export default class MeasurementReport { ReferencedSOPInstanceUID, ReferencedFrameNumber, SCOORD3DGroup, - FrameOfReferenceUID + FrameOfReferenceUID, + referencedImageId } = this.getSpatialCoordinatesState({ NUMGroup, sopInstanceUIDToImageIdMap, @@ -361,25 +400,27 @@ export default class MeasurementReport { return addAccessors(fsg.ConceptCodeSequence); }); - const defaultState = { - ...state, - finding, - findingSites - }; + state.finding = finding; + state.findingSites = findingSites; - if (defaultState.finding) { - defaultState.description = defaultState.finding.CodeMeaning; + if (finding) { + state.description = finding.CodeMeaning; } - defaultState.annotation.metadata.label = - MeasurementReport.getCornerstoneLabelFromDefaultState(defaultState); + state.annotation.data.label = + MeasurementReport.getCornerstoneLabelFromDefaultState(state); return { - defaultState, + // Deprecating the defaultState in favour of state, but there are lots + // of adapters still using defaultState + defaultState: state, + state, NUMGroup, + scoord: SCOORD3DGroup || SCOORDGroup, SCOORDGroup, ReferencedSOPSequence, ReferencedSOPInstanceUID, + referencedImageId, ReferencedFrameNumber, SCOORD3DGroup, FrameOfReferenceUID @@ -406,7 +447,7 @@ export default class MeasurementReport { group => group.ValueType === "NUM" ); - return this.processSpatialCoordinatesGroup({ + const spatialGroup = this.processSpatialCoordinatesGroup({ NUMGroup, sopInstanceUIDToImageIdMap, metadata, @@ -414,6 +455,23 @@ export default class MeasurementReport { findingSiteGroups, toolType }); + + const { referencedImageId } = spatialGroup.state.annotation.metadata; + const is3DMeasurement = !!spatialGroup.SCOORD3DGroup; + const scoordArgs = { + referencedImageId, + is3DMeasurement + }; + const scoord = spatialGroup.SCOORD3DGroup || spatialGroup.SCOORDGroup; + const worldCoords = scoordToWorld(scoordArgs, scoord); + + return { + ...spatialGroup, + is3DMeasurement, + scoordArgs, + scoord, + worldCoords + }; } static generateReferencedSOPSequence({ @@ -480,16 +538,14 @@ export default class MeasurementReport { const referenceToolData = toolData?.[toolTypes?.[0]]?.data?.[0]; const volumeId = referenceToolData?.metadata?.volumeId; const volume = cache.getVolume(volumeId); + if (!volume) { + throw new Error(`No volume found for ${volumeId}`); + } const imageId = volume.imageIds[0]; return imageId; } - static generateReport( - toolState, - metadataProvider, - worldToImageCoords, - options - ) { + static generateReport(toolState, metadataProvider, options) { // ToolState for array of imageIDs to a Report // Assume Cornerstone metadata provider has access to Study / Series / Sop Instance UID let allMeasurementGroups = []; @@ -511,6 +567,7 @@ export default class MeasurementReport { Object.keys(toolState).forEach(imageId => { const toolData = toolState[imageId]; const toolTypes = Object.keys(toolData); + const is3DMeasurement = imageId === NO_IMAGE_ID; const ReferencedSOPSequence = this.generateReferencedSOPSequence({ toolData, @@ -521,7 +578,7 @@ export default class MeasurementReport { derivationSourceDatasets }); - if (imageId === NO_IMAGE_ID) { + if (is3DMeasurement) { is3DSR = true; } @@ -533,7 +590,7 @@ export default class MeasurementReport { toolType, toolData, ReferencedSOPSequence, - worldToImageCoords + is3DMeasurement ); if (group) { measurementGroups.push(group); @@ -564,6 +621,13 @@ export default class MeasurementReport { if (is3DSR) { report.dataset.SOPClassUID = DicomMetaDictionary.sopClassUIDsByName.Comprehensive3DSR; + if (!report.dataset.SOPClassUID) { + throw new Error( + `NO sop class defined for Comprehensive3DSR in ${JSON.stringify( + DicomMetaDictionary.sopClassUIDsByName + )}` + ); + } } return report; @@ -575,7 +639,6 @@ export default class MeasurementReport { static generateToolState( dataset, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata, hooks ) { @@ -644,7 +707,6 @@ export default class MeasurementReport { const measurement = toolAdapter.getMeasurementData( measurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata, trackingIdentifierValue ); diff --git a/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts b/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts index 740f106bc0..4c70ec11e8 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts @@ -2,6 +2,7 @@ import MeasurementReport from "./MeasurementReport"; import { utilities } from "dcmjs"; import { vec3 } from "gl-matrix"; import BaseAdapter3D from "./BaseAdapter3D"; +import { toScoords } from "../helpers"; const { Polyline: TID300Polyline } = utilities.TID300; @@ -15,64 +16,23 @@ class PlanarFreehandROI extends BaseAdapter3D { static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata ) { const { - defaultState, + state, NUMGroup, - SCOORDGroup, - SCOORD3DGroup, + scoord, + scoordArgs, + worldCoords, + referencedImageId, ReferencedFrameNumber } = MeasurementReport.getSetupMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, - PlanarFreehandROI.toolType + this.toolType ); - if (SCOORDGroup) { - return this.getMeasurementDataFromScoord({ - defaultState, - SCOORDGroup, - imageToWorldCoords, - NUMGroup, - ReferencedFrameNumber - }); - } else if (SCOORD3DGroup) { - return this.getMeasurementDataFromScoord3D({ - defaultState, - SCOORD3DGroup - }); - } else { - throw new Error( - "Can't get measurement data with missing SCOORD and SCOORD3D groups." - ); - } - } - - static getMeasurementDataFromScoord({ - defaultState, - SCOORDGroup, - imageToWorldCoords, - NUMGroup, - ReferencedFrameNumber - }) { - const referencedImageId = - defaultState.annotation.metadata.referencedImageId; - const { GraphicData } = SCOORDGroup; - - const worldCoords = []; - - for (let i = 0; i < GraphicData.length; i += 2) { - const point = imageToWorldCoords(referencedImageId, [ - GraphicData[i], - GraphicData[i + 1] - ]); - - worldCoords.push(point); - } - const distanceBetweenFirstAndLastPoint = vec3.distance( worldCoords[worldCoords.length - 1], worldCoords[0] @@ -93,9 +53,8 @@ class PlanarFreehandROI extends BaseAdapter3D { points.push(worldCoords[0], worldCoords[worldCoords.length - 1]); } - const state = defaultState; - state.annotation.data = { + ...state.annotation.data, contour: { polyline: worldCoords, closed: !isOpenContour }, handles: { points, @@ -104,94 +63,39 @@ class PlanarFreehandROI extends BaseAdapter3D { hasMoved: false } }, - cachedStats: { + frameNumber: ReferencedFrameNumber + }; + + if (referencedImageId) { + state.annotation.data.cachedStats = { [`imageId:${referencedImageId}`]: { area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : null } - }, - frameNumber: ReferencedFrameNumber - }; - - return state; - } - - static getMeasurementDataFromScoord3D({ defaultState, SCOORD3DGroup }) { - const { GraphicData } = SCOORD3DGroup; - - const worldCoords = []; - - for (let i = 0; i < GraphicData.length; i += 3) { - const point = [ - GraphicData[i], - GraphicData[i + 1], - GraphicData[i + 2] - ]; - - worldCoords.push(point); - } - - const distanceBetweenFirstAndLastPoint = vec3.distance( - worldCoords[worldCoords.length - 1], - worldCoords[0] - ); - - let isOpenContour = true; - - // If the contour is closed, this should have been encoded as exactly the same point, so check for a very small difference. - if (distanceBetweenFirstAndLastPoint < this.closedContourThreshold) { - worldCoords.pop(); // Remove the last element which is duplicated. - - isOpenContour = false; + }; } - - const points = []; - - if (isOpenContour) { - points.push(worldCoords[0], worldCoords[worldCoords.length - 1]); - } - - const state = defaultState; - - state.annotation.data = { - contour: { polyline: worldCoords, closed: !isOpenContour }, - handles: { - points, - activeHandleIndex: null, - textBox: { - hasMoved: false - } - }, - cachedStats: {} - }; - return state; } - static getTID300RepresentationArguments(tool, worldToImageCoords) { + static getTID300RepresentationArguments(tool, is3DMeasurement = false) { const { data, finding, findingSites, metadata } = tool; const { polyline, closed } = data.contour; const isOpenContour = closed !== true; const { referencedImageId } = metadata; + const scoordProps = { + is3DMeasurement, + referencedImageId + }; - if (!referencedImageId) { - return this.getTID300RepresentationArgumentsSCOORD3D(tool); - } - - // Using image coordinates for 2D points - const points = polyline.map(worldPos => - worldToImageCoords(referencedImageId, worldPos) - ); + const points = toScoords(scoordProps, polyline); if (!isOpenContour) { // Need to repeat the first point at the end of to have an explicitly closed contour. const firstPoint = points[0]; - - // Explicitly expand to avoid circular references. - points.push([firstPoint[0], firstPoint[1]]); + points.push(firstPoint); } const { area, areaUnit, modalityUnit, perimeter, mean, max, stdDev } = @@ -211,56 +115,12 @@ class PlanarFreehandROI extends BaseAdapter3D { trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [], + ReferencedFrameOfReferenceUID: is3DMeasurement + ? metadata.FrameOfReferenceUID + : null, use3DSpatialCoordinates: false }; } - - static getTID300RepresentationArgumentsSCOORD3D(tool) { - const { data, finding, findingSites, metadata } = tool; - - const { polyline, closed } = data.contour; - const isOpenContour = closed !== true; - - // Using world coordinates for 3D points - const points = polyline; - - if (!isOpenContour) { - // Need to repeat the first point at the end of to have an explicitly closed contour. - const firstPoint = points[0]; - - // Explicitly expand to avoid circular references. - points.push([firstPoint[0], firstPoint[1], firstPoint[2]]); - } - - const cachedStatsKeys = Object.keys(data.cachedStats)[0]; - const { - area = undefined, - areaUnit = undefined, - modalityUnit = undefined, - perimeter = undefined, - mean = undefined, - max = undefined, - stdDev = undefined - } = cachedStatsKeys ? data.cachedStats[cachedStatsKeys] : {}; - - return { - /** From cachedStats */ - points, - area, - areaUnit, - perimeter, - modalityUnit, - mean, - max, - stdDev, - /** Other */ - trackingIdentifierTextValue: this.trackingIdentifierTextValue, - finding, - findingSites: findingSites || [], - ReferencedFrameOfReferenceUID: metadata.FrameOfReferenceUID, - use3DSpatialCoordinates: true - }; - } } export default PlanarFreehandROI; diff --git a/packages/adapters/src/adapters/Cornerstone3D/Probe.ts b/packages/adapters/src/adapters/Cornerstone3D/Probe.ts index 058d62a6c9..17d371ca27 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Probe.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Probe.ts @@ -1,6 +1,7 @@ import { utilities } from "dcmjs"; import MeasurementReport from "./MeasurementReport"; import BaseAdapter3D from "./BaseAdapter3D"; +import { toScoords } from "../helpers"; const { Point: TID300Point } = utilities.TID300; @@ -113,55 +114,34 @@ class Probe extends BaseAdapter3D { return state; } - public static getTID300RepresentationArguments(tool, worldToImageCoords) { + public static getTID300RepresentationArguments( + tool, + is3DMeasurement = false + ) { const { data, metadata } = tool; const { finding, findingSites } = tool; const { referencedImageId } = metadata; - - if (!referencedImageId) { - return this.getTID300RepresentationArgumentsSCOORD3D(tool); - } + const scoordProps = { + is3DMeasurement, + referencedImageId + }; const { handles: { points = [] } } = data; // Using image coordinates for 2D points - const pointsImage = points.map(point => { - const pointImage = worldToImageCoords(referencedImageId, point); - return { - x: pointImage[0], - y: pointImage[1] - }; - }); + const pointsImage = toScoords(scoordProps, points); return { points: pointsImage, trackingIdentifierTextValue: this.trackingIdentifierTextValue, findingSites: findingSites || [], finding, - use3DSpatialCoordinates: false - }; - } - - static getTID300RepresentationArgumentsSCOORD3D(tool) { - const { data, finding, findingSites, metadata } = tool; - const { - handles: { points = [] } - } = data; - - // Using world coordinates for 3D points - const point = points[0]; - - const pointXYZ = { x: point[0], y: point[1], z: point[2] }; - - return { - points: [pointXYZ], - trackingIdentifierTextValue: this.trackingIdentifierTextValue, - ReferencedFrameOfReferenceUID: metadata.FrameOfReferenceUID, - findingSites: findingSites || [], - finding, - use3DSpatialCoordinates: true + ReferencedFrameOfReferenceUID: is3DMeasurement + ? metadata.FrameOfReferenceUID + : null, + use3DSpatialCoordinates: is3DMeasurement }; } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts b/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts index 33f12bb7fc..994693369e 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts @@ -1,8 +1,10 @@ import { utilities } from "dcmjs"; +import { utilities as csUtilities } from "@cornerstonejs/core"; import MeasurementReport from "./MeasurementReport"; import BaseAdapter3D from "./BaseAdapter3D"; const { Polyline: TID300Polyline } = utilities.TID300; +const { worldToImageCoords } = csUtilities; class RectangleROI extends BaseAdapter3D { static { @@ -130,13 +132,13 @@ class RectangleROI extends BaseAdapter3D { return state; } - static getTID300RepresentationArguments(tool, worldToImageCoords) { + static getTID300RepresentationArguments(tool, is3DMeasurement = false) { const { data, finding, findingSites, metadata } = tool; const { cachedStats = {}, handles } = data; const { referencedImageId } = metadata; - if (!referencedImageId) { + if (is3DMeasurement) { return this.getTID300RepresentationArgumentsSCOORD3D(tool); } diff --git a/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts b/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts index f5fb6e7eab..be0fffef34 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts @@ -1,8 +1,10 @@ import { utilities } from "dcmjs"; +import { utilities as csUtilities } from "@cornerstonejs/core"; import MeasurementReport from "./MeasurementReport"; import BaseAdapter3D from "./BaseAdapter3D"; const { Length: TID300Length } = utilities.TID300; +const { worldToImageCoords } = csUtilities; class UltrasoundDirectional extends BaseAdapter3D { static { @@ -39,6 +41,7 @@ class UltrasoundDirectional extends BaseAdapter3D { const state = defaultState; state.annotation.data = { + ...state.annotation.data, handles: { points: [worldCoords[0], worldCoords[1]], activeHandleIndex: 0, @@ -46,14 +49,13 @@ class UltrasoundDirectional extends BaseAdapter3D { hasMoved: false } }, - cachedStats: {}, frameNumber: ReferencedFrameNumber }; return state; } - static getTID300RepresentationArguments(tool, worldToImageCoords) { + static getTID300RepresentationArguments(tool, is3DMeasurement) { const { data, finding, findingSites, metadata } = tool; const { handles } = data; diff --git a/packages/adapters/src/adapters/helpers/index.ts b/packages/adapters/src/adapters/helpers/index.ts index 737234f64c..fb065a7edf 100644 --- a/packages/adapters/src/adapters/helpers/index.ts +++ b/packages/adapters/src/adapters/helpers/index.ts @@ -5,4 +5,8 @@ import { downloadDICOMData } from "./downloadDICOMData"; export { copyStudyTags } from "./copyStudyTags"; export { copySeriesTags } from "./copySeriesTags"; +export * from "./toScoordType"; +export * from "./scoordToWorld"; +export * from "./toPoint3"; + export { toArray, codeMeaningEquals, graphicTypeEquals, downloadDICOMData }; diff --git a/packages/adapters/src/adapters/helpers/scoordToWorld.ts b/packages/adapters/src/adapters/helpers/scoordToWorld.ts new file mode 100644 index 0000000000..c9415e736f --- /dev/null +++ b/packages/adapters/src/adapters/helpers/scoordToWorld.ts @@ -0,0 +1,36 @@ +import { type Types, utilities } from "@cornerstonejs/core"; + +const { imageToWorldCoords } = utilities; + +/** + * Converts flat listed 2d or 3d coordinates into Point3 world coordinates. + * For 3d points, this will convert just the structure from flat, while for + * 2d points, it will convert image to to world coords. + */ +export function scoordToWorld( + { is3DMeasurement, referencedImageId }, + scoord +): Types.Point3[] { + const worldCoords = []; + if (is3DMeasurement) { + const { GraphicData } = scoord; + for (let i = 0; i < GraphicData.length; i += 3) { + const point = [ + GraphicData[i], + GraphicData[i + 1], + GraphicData[i + 2] + ]; + worldCoords.push(point); + } + } else { + const { GraphicData } = scoord; + for (let i = 0; i < GraphicData.length; i += 2) { + const point = imageToWorldCoords(referencedImageId, [ + GraphicData[i], + GraphicData[i + 1] + ]); + worldCoords.push(point); + } + } + return worldCoords; +} diff --git a/packages/adapters/src/adapters/helpers/toPoint3.ts b/packages/adapters/src/adapters/helpers/toPoint3.ts new file mode 100644 index 0000000000..e623cf8cca --- /dev/null +++ b/packages/adapters/src/adapters/helpers/toPoint3.ts @@ -0,0 +1,28 @@ +import type { Types } from "@cornerstonejs/core"; + +/** + * Converts a set of flat points, represented as just a flat list of + * `[x1,y1,z1,x2,y2,z2,....]` + * into the equivalent Point3 array + * `[[x1,y1,z1], [x2,y2,z2],...]` + */ +export function toPoint3(flatPoints: number[]): Types.Point3[] { + const points = []; + if (!flatPoints?.length) { + return points; + } + const { length: n } = flatPoints; + if (n % 3 !== 0) { + throw new Error( + `Points array should be divisible by 3 for SCOORD3D, but contents are: ${JSON.stringify( + flatPoints + )} of length ${n}` + ); + } + for (let i = 0; i < n; i += 3) { + points.push([flatPoints[i], flatPoints[i + 1], flatPoints[i + 2]]); + } + return points; +} + +export default toPoint3; diff --git a/packages/adapters/src/adapters/helpers/toScoordType.ts b/packages/adapters/src/adapters/helpers/toScoordType.ts new file mode 100644 index 0000000000..f85f3b3924 --- /dev/null +++ b/packages/adapters/src/adapters/helpers/toScoordType.ts @@ -0,0 +1,28 @@ +import { type Types, utilities } from "@cornerstonejs/core"; + +const { worldToImageCoords: globalWorldToImageCoords } = utilities; + +let useWorldToImageCoords = globalWorldToImageCoords; + +/** + * Converts a Point2 or a Point3 into a SCOORD { x,y, z? } point. + */ +export function toScoord({ is3DMeasurement, referencedImageId }, point) { + if (is3DMeasurement) { + return { x: point[0], y: point[1], z: point[2] }; + } + const point2 = useWorldToImageCoords(referencedImageId, point); + return { x: point2[0], y: point2[1] }; +} + +/** + * Converts an array of Scoord points to 3d + */ +export function toScoords(scoordArgs, points: Array) { + return points.map(point => toScoord(scoordArgs, point)); +} + +/** Over-ride function for testing */ +export function setWorldToImageCoords(worldToImage = globalWorldToImageCoords) { + useWorldToImageCoords = worldToImage; +} diff --git a/packages/adapters/test/Length.jest.js b/packages/adapters/test/Length.jest.js new file mode 100644 index 0000000000..4858f447c0 --- /dev/null +++ b/packages/adapters/test/Length.jest.js @@ -0,0 +1,79 @@ +import { describe, it, expect, beforeEach } from "@jest/globals"; +import { utilities } from "@cornerstonejs/core"; +import { Cornerstone3DSR } from "../src/adapters/Cornerstone3D"; +import { setWorldToImageCoords } from "../src/adapters/helpers"; + +const { worldToImageCoords: globalWorldToImageCoords } = utilities; + +const { Length } = Cornerstone3DSR; + +function worldToImageCoords(referencedImageId, point3) { + if (point3[2] !== parseInt(referencedImageId)) { + throw new Error( + `Trying to convert a point with the wrong index: ${point3[2]}!==${referencedImageId}` + ); + } + return [point3[0], point3[1]]; +} + +const tool2d = { + metadata: { + referencedImageId: "2" + }, + + data: { + handles: { + points: [ + [0, 1, 2], + [10, 5, 2] + ] + } + } +}; + +const tool3d = { + metadata: { + FrameOfReferenceUID: "1.2.3" + }, + + data: { + handles: { + points: [ + [0, 1, 2], + [10, 5, 11] + ] + } + } +}; + +describe("Length", () => { + beforeEach(() => { + setWorldToImageCoords(worldToImageCoords); + // Setup adapters + }); + + afterEach(() => { + setWorldToImageCoords(globalWorldToImageCoords); + }); + + it("Must define tool type", () => { + expect(Length.toolType).toBe("Length"); + }); + + it("Must use scoord for planar", () => { + const tidArgs = Length.getTID300RepresentationArguments(tool2d, false); + // Either x,y or [x,y] is allowed + expect(tidArgs.point1).toEqual({ x: 0, y: 1 }); + expect(tidArgs.point2).toEqual({ x: 10, y: 5 }); + }); + + it("Must use scoord3d for mpr points", () => { + const tidArgs = Length.getTID300RepresentationArguments(tool3d, true); + expect(tidArgs.point1).toEqual({ x: 0, y: 1, z: 2 }); + expect(tidArgs.point2).toEqual({ x: 10, y: 5, z: 11 }); + }); + + it("Must convert tid1501 to tool data scoord", () => {}); +}); + +// diff --git a/packages/adapters/tsconfig.json b/packages/adapters/tsconfig.json index 1004fd44f2..f45744c337 100644 --- a/packages/adapters/tsconfig.json +++ b/packages/adapters/tsconfig.json @@ -4,6 +4,6 @@ "outDir": "./dist/esm", "rootDir": "./src" }, - "include": ["./src/**/*"], + "include": ["./src/**/*", "./test/**/*", "./jest.config.js"], "exclude": ["node_modules", "dist"] } diff --git a/packages/ai/package.json b/packages/ai/package.json index a72b5e89bf..9a97d93857 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -54,7 +54,7 @@ "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", - "dcmjs": "^0.42.0", + "dcmjs": "^0.43.1", "gl-matrix": "^3.4.3", "lodash.clonedeep": "^4.5.0", "ndarray": "^1.0.19", diff --git a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts index 2d3a3edb0d..193e735029 100644 --- a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts +++ b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts @@ -40,7 +40,7 @@ import type { ICamera, } from '../types'; import type { VoiModifiedEventDetail } from '../types/EventTypes'; -import type { ViewportInput } from '../types/IViewport'; +import type { PlaneRestriction, ViewportInput } from '../types/IViewport'; import triggerEvent from '../utilities/triggerEvent'; import * as colormapUtils from '../utilities/colormap'; import invertRgbTransferFunction from '../utilities/invertRgbTransferFunction'; @@ -68,7 +68,7 @@ import getVolumeViewportScrollInfo from '../utilities/getVolumeViewportScrollInf import { actorIsA, isImageActor } from '../utilities/actorCheck'; import snapFocalPointToSlice from '../utilities/snapFocalPointToSlice'; import getVoiFromSigmoidRGBTransferFunction from '../utilities/getVoiFromSigmoidRGBTransferFunction'; -import isEqual, { isEqualNegative } from '../utilities/isEqual'; +import isEqual, { isEqualAbs, isEqualNegative } from '../utilities/isEqual'; import applyPreset from '../utilities/applyPreset'; import imageIdToURI from '../utilities/imageIdToURI'; import uuidv4 from '../utilities/uuidv4'; @@ -667,7 +667,8 @@ abstract class BaseVolumeViewport extends Viewport { return false; } if (options?.withNavigation) { - return true; + const { referencedImageId } = viewRef; + return !referencedImageId || this.hasImageURI(referencedImageId); } const currentSliceIndex = this.getSliceIndex(); const { sliceIndex } = viewRef; @@ -715,6 +716,58 @@ abstract class BaseVolumeViewport extends Viewport { abstract isInAcquisitionPlane(): boolean; + /** + * Sets the view reference given a referenced plane and the current + * view plane normal being applied. + * This will use the existing normal if compatible, otherwise will calculate + * a new view plane normal as the referenced plane normal, or else the + * cross product of the existing view plane normal and the inPlaneVector1 + */ + public setViewPlane(planeRestriction: PlaneRestriction, viewPlaneNormal) { + const { point, inPlaneVector1, inPlaneVector2, FrameOfReferenceUID } = + planeRestriction; + + if (!inPlaneVector1) { + return this.setViewReference({ + FrameOfReferenceUID, + cameraFocalPoint: point, + }); + } + + // const planeUp = vec3.normalize(vec3.create(), inPlaneVector1); + if (inPlaneVector2) { + const planeNormal = ( + vec3.cross(vec3.create(), inPlaneVector1, inPlaneVector2) + ); + vec3.normalize(planeNormal, planeNormal); + return this.setViewReference({ + FrameOfReferenceUID, + cameraFocalPoint: point, + viewPlaneNormal: planeNormal, + // viewUp: planeUp, + }); + } + const dotNormal = vec3.dot(viewPlaneNormal, inPlaneVector1); + if (isEqual(dotNormal, 0)) { + return this.setViewReference({ + FrameOfReferenceUID, + viewPlaneNormal, + cameraFocalPoint: point, + }); + } + + const planeNormal = ( + vec3.cross(vec3.create(), viewPlaneNormal, inPlaneVector1) + ); + vec3.normalize(planeNormal, planeNormal); + return this.setViewReference({ + FrameOfReferenceUID, + viewPlaneNormal: planeNormal, + cameraFocalPoint: point, + // viewUp: planeUp, + }); + } + /** * Navigates to the specified view reference. */ @@ -724,14 +777,21 @@ abstract class BaseVolumeViewport extends Viewport { } const volumeId = this.getVolumeId(); const { - viewPlaneNormal: refViewPlaneNormal, FrameOfReferenceUID: refFrameOfReference, cameraFocalPoint, referencedImageId, + planeRestriction, + viewPlaneNormal: refViewPlaneNormal, viewUp, } = viewRef; let { sliceIndex } = viewRef; + const { focalPoint, viewPlaneNormal, position } = this.getCamera(); + + if (planeRestriction?.inPlaneVector1 && !refViewPlaneNormal) { + return this.setViewPlane(planeRestriction, viewPlaneNormal); + } + const isNegativeNormal = isEqualNegative( viewPlaneNormal, refViewPlaneNormal @@ -1918,14 +1978,11 @@ abstract class BaseVolumeViewport extends Viewport { } /* - * Checking if the imageURI is in the volumes that are being - * rendered by the viewport. imageURI is the imageId without the schema - * for instance for the imageId of `wadors:http://...`, the `http://...` is the imageURI. - * Why we don't check the imageId is because the same image can be shown in - * another viewport (StackViewport) with a different schema + * Checking if the imageURI (as a URI or an ID) is in the volumes that are being + * rendered by the viewport. * - * @param imageURI - The imageURI to check - * @returns True if the imageURI is in the volumes that are being rendered by the viewport + * @param imageURI - The imageURI or imageID to check + * @returns True if the image is in the volumes that are being rendered by the viewport */ public hasImageURI = (imageURI: string): boolean => { const volumeActors = this.getActors().filter((actorEntry) => @@ -1935,25 +1992,59 @@ abstract class BaseVolumeViewport extends Viewport { return volumeActors.some(({ uid, referencedId }) => { const volume = cache.getVolume(referencedId || uid); - if (!volume?.imageIds) { + if (!volume?.getImageIdIndex) { return false; } - const volumeImageURIs = volume.imageIds.map(imageIdToURI); - - return volumeImageURIs.includes(imageURI); + return ( + volume.getImageIdIndex(imageURI) !== undefined || + volume.getImageURIIndex(imageURI) !== undefined + ); }); }; + /** + * Gets a view up given a view plane normal and the current orientation + * Chooses the current view up if orthogonal, otherwise the default view ups + * for axial, sagittal and coronal + * Otherwise runs the Gram-Schmidt algorithm with the current viewUp + */ + protected _getViewUp(viewPlaneNormal): Point3 { + const { viewUp } = this.getCamera(); + const dot = vec3.dot(viewUp, viewPlaneNormal); + if (isEqual(dot, 0)) { + // Don't change the view up if not needed + return viewUp; + } + if (isEqualAbs(viewPlaneNormal[0], 1)) { + return [0, 0, 1]; + } + if (isEqualAbs(viewPlaneNormal[1], 1)) { + return [0, 0, 1]; + } + if (isEqualAbs(viewPlaneNormal[2], 1)) { + return [0, -1, 0]; + } + const vupOrthogonal = ( + vec3.scaleAndAdd(vec3.create(), viewUp, viewPlaneNormal, -dot) + ); + vec3.normalize(vupOrthogonal, vupOrthogonal); + return vupOrthogonal; + } + protected _getOrientationVectors( orientation: OrientationAxis | OrientationVectors ): OrientationVectors { if (typeof orientation === 'object') { - if (orientation.viewPlaneNormal && orientation.viewUp) { - return orientation; + if (orientation.viewPlaneNormal) { + return { + ...orientation, + viewUp: + orientation.viewUp || this._getViewUp(orientation.viewPlaneNormal), + }; } else { throw new Error( - 'Invalid orientation object. It must contain viewPlaneNormal and viewUp' + 'Invalid orientation object. It must contain viewPlaneNormal' ); } } else if (typeof orientation === 'string') { diff --git a/packages/core/src/RenderingEngine/StackViewport.ts b/packages/core/src/RenderingEngine/StackViewport.ts index 2467782f0f..e91496afbb 100644 --- a/packages/core/src/RenderingEngine/StackViewport.ts +++ b/packages/core/src/RenderingEngine/StackViewport.ts @@ -3162,11 +3162,18 @@ class StackViewport extends Viewport { return testIndex <= rangeEndSliceIndex && testIndex >= foundSliceIndex; } - if (!super.isReferenceViewable(viewRef, options)) { + // Apply asVolume to withOrientation to indicate allowing changing orientation + // only if this gets converted to a volume. + if ( + !super.isReferenceViewable(viewRef, { + ...options, + withOrientation: options?.asVolume, + }) + ) { return false; } - if (viewRef.volumeId) { + if (viewRef.volumeId || viewRef.FrameOfReferenceUID) { return options.asVolume; } diff --git a/packages/core/src/RenderingEngine/VideoViewport.ts b/packages/core/src/RenderingEngine/VideoViewport.ts index 5c92d81551..385bb63a2e 100644 --- a/packages/core/src/RenderingEngine/VideoViewport.ts +++ b/packages/core/src/RenderingEngine/VideoViewport.ts @@ -765,7 +765,7 @@ class VideoViewport extends Viewport { * @returns an imageID for video */ public getCurrentImageId(index = this.getCurrentImageIdIndex()) { - const current = this.imageId.replace('/frames/1', `/frames/${index + 1}`); + const current = this.imageId?.replace('/frames/1', `/frames/${index + 1}`); return current; } diff --git a/packages/core/src/RenderingEngine/Viewport.ts b/packages/core/src/RenderingEngine/Viewport.ts index 99b72a3e25..460254c387 100644 --- a/packages/core/src/RenderingEngine/Viewport.ts +++ b/packages/core/src/RenderingEngine/Viewport.ts @@ -38,6 +38,7 @@ import type { ReferenceCompatibleOptions, ViewPresentationSelector, DataSetOptions, + PlaneRestriction, } from '../types/IViewport'; import type { vtkSlabCamera } from './vtkClasses/vtkSlabCamera'; import type IImageCalibration from '../types/IImageCalibration'; @@ -47,6 +48,7 @@ import type vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; import type vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData'; import type vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper'; import { deepClone } from '../utilities/deepClone'; +import { updatePlaneRestriction } from '../utilities/updatePlaneRestriction'; /** * An object representing a single viewport, which is a camera @@ -1823,16 +1825,66 @@ class Viewport { viewPlaneNormal, viewUp, } = this.getCamera(); + const FrameOfReferenceUID = this.getFrameOfReferenceUID(); const target: ViewReference = { - FrameOfReferenceUID: this.getFrameOfReferenceUID(), + FrameOfReferenceUID, cameraFocalPoint, viewPlaneNormal, viewUp, sliceIndex: viewRefSpecifier?.sliceIndex ?? this.getSliceIndex(), + /** The referenced plane is the canonical specifier for whether + * this view reference is visible or not. + */ + planeRestriction: { + FrameOfReferenceUID, + point: viewRefSpecifier?.points?.[0] || cameraFocalPoint, + inPlaneVector1: viewUp, + inPlaneVector2: ( + vec3.cross(vec3.create(), viewUp, viewPlaneNormal) + ), + }, }; + if (viewRefSpecifier?.points) { + updatePlaneRestriction(viewRefSpecifier.points, target.planeRestriction); + } return target; } + public isPlaneViewable( + planeRestriction: PlaneRestriction, + options?: ReferenceCompatibleOptions + ): boolean { + if ( + planeRestriction.FrameOfReferenceUID !== this.getFrameOfReferenceUID() + ) { + return false; + } + const { focalPoint, viewPlaneNormal } = this.getCamera(); + const { point, inPlaneVector1, inPlaneVector2 } = planeRestriction; + if (options?.withOrientation) { + // Don't need to check the normal or the navigation if asking as a volume + // since those can both be updated + return true; + } + if ( + inPlaneVector1 && + !isEqual(0, vec3.dot(viewPlaneNormal, inPlaneVector1)) + ) { + return false; + } + if ( + inPlaneVector2 && + !isEqual(0, vec3.dot(viewPlaneNormal, inPlaneVector2)) + ) { + return false; + } + if (options?.withNavigation) { + return true; + } + const pointVector = vec3.sub(vec3.create(), point, focalPoint); + return isEqual(0, vec3.dot(pointVector, viewPlaneNormal)); + } + /** * Find out if this viewport does or could show this view reference. * @param options - allows specifying whether the view COULD display this with @@ -1843,6 +1895,9 @@ class Viewport { viewRef: ViewReference, options?: ReferenceCompatibleOptions ): boolean { + if (viewRef.planeRestriction) { + return this.isPlaneViewable(viewRef.planeRestriction, options); + } if ( viewRef.FrameOfReferenceUID && viewRef.FrameOfReferenceUID !== this.getFrameOfReferenceUID() diff --git a/packages/core/src/types/IViewport.ts b/packages/core/src/types/IViewport.ts index ee5af20fe8..cf9a4069f3 100644 --- a/packages/core/src/types/IViewport.ts +++ b/packages/core/src/types/IViewport.ts @@ -32,7 +32,9 @@ export type ViewReferenceSpecifier = { */ rangeEndSliceIndex?: number; - /** The frame number for a multiframe */ + /** + * The frame number for a multiframe + */ frameNumber?: number; /** @@ -42,9 +44,13 @@ export type ViewReferenceSpecifier = { * reference UID. */ forFrameOfReference?: boolean; - /** Set of points to get a reference for, in world space */ + /** + * Set of points to get a reference for, in world space + */ points?: Point3[]; - /** The volumeId to reference */ + /** + * The volumeId to reference + */ volumeId?: string; }; @@ -110,17 +116,73 @@ export type ReferencedImageRange = ViewReference & { referencedImageId: string; }; +/** + * A plane restriction is an object that restricts which camera views are + * compatible with the restriction. Currently the restriction only + * allows being specified via the frame of reference and a point in the + * view and up to two in plane vectors. + * + * If only the FOR and a point is specified, any camera view containing that point + * is viewable. + * + * If a inPlaneVector(s) are specified, they must also be orthogonal to the view plane normal. + * + * Other types of plane restrictions may be defined at a later point. + */ +export type PlaneRestriction = { + FrameOfReferenceUID: string; + + /** + * A single point within the reference plane is required for all references + */ + point: Point3; + + /** + * An inPlaneVector1 is required for all colinear referenced planes. + * Shall not be undefined if inPlaneVector2 is defined. + */ + inPlaneVector1?: Point3; + + /** + * An inPlaneVector2 is required for all full planar definitions. + * Shall have a non-zero dot product with inPlaneVector1, that is, shall be + * non-colinear with inPlaneVector1. + */ + inPlaneVector2?: Point3; +}; + /** * A view reference references the image/location of an image. Typical use * cases include remembering the current position of a viewport to allow returning * to it later, as well as determining whether specific views should show annotations * or other overlay information. + * + * Note this is an interface as it is designed to allow extension/customization + * by additional Viewport modules. */ -export type ViewReference = { +export interface ViewReference { /** * The FrameOfReferenceUID */ FrameOfReferenceUID?: string; + + /** + * A referenced plane identifies one or more planes. + * Currently this has a point within the plane to identify the focal depth + * (but NOT the focal point), and up to two coplanar vectors. + * + * The referenced plane is visible depth wise if the point minus the focal point of hte + * current view is orthogonal to the view plane normal of the viewport. + * This is sufficient for a single-point identifier. + * For a line, the inPlaneVector must be orthogonal to the view plane normal of the viewport. + * For a planar annotation, both inPlaneVectors must be orthogonal to the view plane normal of the viewport. + * + * This extension from the least specific to the most specific types of views allows + * determining whether a view can be seen in a variety of conditions. It does not + * allow recovering the original view reference. + */ + planeRestriction?: PlaneRestriction; + /** * An optional property used to specify the particular image that this view includes. * For volumes, that will specify which image is closest to the requested @@ -206,7 +268,7 @@ export type ViewReference = { * particular bounds or not. This will be in world coordinates. */ bounds?: BoundsLPS; -}; +} /** * A view presentation stores information about how the view is presented to the diff --git a/packages/core/src/utilities/index.ts b/packages/core/src/utilities/index.ts index 122eb06a6d..82f5198eef 100644 --- a/packages/core/src/utilities/index.ts +++ b/packages/core/src/utilities/index.ts @@ -101,6 +101,7 @@ export * as logger from './logger'; import { calculateNeighborhoodStats } from './calculateNeighborhoodStats'; import getPixelSpacingInformation from './getPixelSpacingInformation'; import { asArray } from './asArray'; +export { updatePlaneRestriction } from './updatePlaneRestriction'; const getViewportModality = (viewport: IViewport, volumeId?: string) => _getViewportModality(viewport, volumeId, cache.getVolume); diff --git a/packages/core/src/utilities/isEqual.ts b/packages/core/src/utilities/isEqual.ts index 76e9475565..24d343ed1f 100644 --- a/packages/core/src/utilities/isEqual.ts +++ b/packages/core/src/utilities/isEqual.ts @@ -50,7 +50,7 @@ function isNumberArrayLike(value: unknown): value is ArrayLike { * * @returns True if the two values are within the tolerance levels. */ -export default function isEqual( +export function isEqual( v1: ValueType, v2: ValueType, tolerance = 1e-5 @@ -80,7 +80,7 @@ const abs = (v) => /** * Compare negative values of both single numbers and vectors */ -const isEqualNegative = ( +export const isEqualNegative = ( v1: ValueType, v2: ValueType, tolerance = undefined @@ -90,7 +90,7 @@ const isEqualNegative = ( * Compare absolute values for single numbers and vectors. * Not recommended for large vectors as this creates a copy */ -const isEqualAbs = ( +export const isEqualAbs = ( v1: ValueType, v2: ValueType, tolerance = undefined @@ -100,11 +100,11 @@ const isEqualAbs = ( * @param n - array of numbers or a simple number * @returns True if n or the first element of n is finite and not NaN */ -function isNumber(n: number[] | number): boolean { +export function isNumber(n: number[] | number): boolean { if (Array.isArray(n)) { return isNumber(n[0]); } return isFinite(n) && !isNaN(n); } -export { isEqualNegative, isEqual, isEqualAbs, isNumber }; +export default isEqual; diff --git a/packages/core/src/utilities/updatePlaneRestriction.ts b/packages/core/src/utilities/updatePlaneRestriction.ts new file mode 100644 index 0000000000..f7c6cb73ce --- /dev/null +++ b/packages/core/src/utilities/updatePlaneRestriction.ts @@ -0,0 +1,74 @@ +import type { Point3, ViewReference } from '../types'; +import { isEqual } from '../utilities/isEqual'; +import { vec3 } from 'gl-matrix'; + +/** + * A value to compare how orthogonal two vectors are. As long as the dot + * product of the previous in-plane vector and the new vector as unit vectors, + * this vector will be considered for using for testing for orthogonality with + * view plane normals. + */ +const ORTHOGONAL_TEST_VALUE = 0.95; + +/** + * Updates the planeRestriction(s) inside the view reference + * This will create a reference containing a point and up to two non-collinear + * in-plane vectors, selected from the set of points provided. + * + * This type of reference restricts the allowed camera views to those + * which contain the point, and whose view plane normal is orthogonal to the in + * plane vectors. + */ +export function updatePlaneRestriction( + points: Point3[], + reference: ViewReference +) { + if (!points?.length || !reference.FrameOfReferenceUID) { + return; + } + reference.planeRestriction ||= { + FrameOfReferenceUID: reference.FrameOfReferenceUID, + point: points[0], + inPlaneVector1: null, + inPlaneVector2: null, + }; + const { planeRestriction } = reference; + + if (points.length === 1) { + planeRestriction.inPlaneVector1 = null; + planeRestriction.inPlaneVector2 = null; + return planeRestriction; + } + + const v1 = vec3.sub( + vec3.create(), + points[0], + points[Math.floor(points.length / 2)] + ); + vec3.normalize(v1, v1); + planeRestriction.inPlaneVector1 = v1; + + planeRestriction.inPlaneVector2 = null; + const n = points.length; + if (n > 2) { + // Try to find a second vector that isn't colinear with the first one + // to form a plane specifier. + for (let i = Math.floor(n / 3); i < n; i++) { + const testVector = vec3.sub(vec3.create(), points[i], points[0]); + const length = vec3.length(testVector); + if (isEqual(length, 0)) { + continue; + } + if ( + vec3.dot(testVector, planeRestriction.inPlaneVector1) < + length * ORTHOGONAL_TEST_VALUE + ) { + vec3.normalize(testVector, testVector); + planeRestriction.inPlaneVector2 = testVector; + return planeRestriction; + } + } + } + + return planeRestriction; +} diff --git a/packages/docs/bun.lock b/packages/docs/bun.lock index 543602fd4a..d8fc65d301 100644 --- a/packages/docs/bun.lock +++ b/packages/docs/bun.lock @@ -4,11 +4,11 @@ "": { "name": "docs", "dependencies": { - "@cornerstonejs/adapters": "^3.10.10", - "@cornerstonejs/core": "^3.10.10", - "@cornerstonejs/dicom-image-loader": "^3.10.10", - "@cornerstonejs/nifti-volume-loader": "^3.10.10", - "@cornerstonejs/tools": "^3.10.10", + "@cornerstonejs/adapters": "^3.30.0", + "@cornerstonejs/core": "^3.30.0", + "@cornerstonejs/dicom-image-loader": "^3.30.0", + "@cornerstonejs/nifti-volume-loader": "^3.30.0", + "@cornerstonejs/tools": "^3.30.0", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -18,7 +18,8 @@ "@mdx-js/react": "^3.0.1", "@svgr/webpack": "^8.1.0", "clsx": "^1.1.1", - "dcmjs": "^0.33.0", + "cross-env": "^7.0.3", + "dcmjs": "^0.42.0", "dicom-parser": "^1.8.21", "dicomweb-client": "0.10.4", "docusaurus-plugin-copy": "0.1.1", @@ -38,6 +39,7 @@ "devDependencies": { "copyfiles": "2.4.1", "esbuild-loader": "^2.18.0", + "glob": "^10.3.10", "karma-chrome-launcher": "^3.1.0", "netlify-plugin-cache": "^1.0.3", "puppeteer": "^13.1.3", @@ -307,7 +309,7 @@ "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="], - "@cornerstonejs/adapters": ["@cornerstonejs/adapters@3.10.10", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.29.8", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "^3.10.10", "@cornerstonejs/tools": "^3.10.10" } }, "sha512-Z84aEjXR3R4rvBav52bt3VuSCgs14dNQEozGcWz1kKDmBdon+ozBw8j8kmIeIT82kZKiqd3sLBa69NF4usuk4g=="], + "@cornerstonejs/adapters": ["@cornerstonejs/adapters@3.30.0", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.42.0", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "^3.30.0", "@cornerstonejs/tools": "^3.30.0" } }, "sha512-QC9LTsHjjD/R1IPWWNFm+Gyz78PJvqZ2AKlq1CD0yD7t3KD3McKVYQJqZC2JlcC6gw6RcmACPCOuNhL7L0EifA=="], "@cornerstonejs/codec-charls": ["@cornerstonejs/codec-charls@1.2.3", "", {}, "sha512-qKUe6DN0dnGzhhfZLYhH9UZacMcudjxcaLXCrpxJImT/M/PQvZCT2rllu6VGJbWKJWG+dMVV2zmmleZcdJ7/cA=="], @@ -317,13 +319,13 @@ "@cornerstonejs/codec-openjph": ["@cornerstonejs/codec-openjph@2.4.7", "", {}, "sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w=="], - "@cornerstonejs/core": ["@cornerstonejs/core@3.10.10", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", "gl-matrix": "^3.4.3", "loglevel": "^1.9.2" } }, "sha512-M3Mh23xgkdJD5x9g33eGarKWrIek+Cv1ghIPVUGKRZjale1Z9PvGHXF6UXPskBQHw5D1RzNA5DurJQBEf26ZZw=="], + "@cornerstonejs/core": ["@cornerstonejs/core@3.30.0", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", "gl-matrix": "^3.4.3", "loglevel": "^1.9.2" } }, "sha512-oMVNyZYmYVNgynaUl3JKyYaN0dDzD4spY18dWJd0aLVLnVzxJydx6+8bWO78wYSb+/s5jfRQeTPaJCe4UGqVPA=="], - "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@3.10.10", "", { "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", "comlink": "^4.4.1", "dicom-parser": "^1.8.9", "jpeg-lossless-decoder-js": "^2.1.0", "pako": "^2.0.4", "uuid": "^9.0.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.10.10" } }, "sha512-Tqj+VuwupA3p5BPBSZDFcTXjb54fighnG2LKkIQzyGjHvFQSyoeQN56+XPrITKCRY71H/5z9bSqG7h3jeVX9wQ=="], + "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@3.30.0", "", { "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", "comlink": "^4.4.1", "dicom-parser": "^1.8.9", "jpeg-lossless-decoder-js": "^2.1.0", "pako": "^2.0.4", "uuid": "^9.0.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.30.0" } }, "sha512-DOM3rdTt9GnxcWfT2f7vE8l8pR6MByKKG23aWCJLjqCwTkG5YAK/Lh0ROgCSbl/B3PzB01JpjjjacgyPOM4VUQ=="], - "@cornerstonejs/nifti-volume-loader": ["@cornerstonejs/nifti-volume-loader@3.10.10", "", { "dependencies": { "nifti-reader-js": "^0.6.8" }, "peerDependencies": { "@cornerstonejs/core": "^3.10.10" } }, "sha512-9ZBC11kjFEia6EQk2xlXYiXM5l/rf+2VQqds+7S1zET+nbgnFSfIf9T558CuBZEu9xDcrZHWNP7I+73i7phX4A=="], + "@cornerstonejs/nifti-volume-loader": ["@cornerstonejs/nifti-volume-loader@3.30.0", "", { "dependencies": { "nifti-reader-js": "^0.6.8" }, "peerDependencies": { "@cornerstonejs/core": "^3.30.0" } }, "sha512-JDl5n0K4j7fqv1gLQuQzpclXfPJzG8C2tb99KwXBezPqkB53ppn3F9S/QNhrPFeFbbQFMUDGmEUaxdlisuzl/w=="], - "@cornerstonejs/tools": ["@cornerstonejs/tools@3.10.10", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "^3.10.10", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", "d3-array": "^3.2.3", "d3-interpolate": "^3.0.1", "gl-matrix": "^3.4.3" } }, "sha512-U8AhBhIaq0FpToQymN2mdO+2ei4cCnTclal5cCLFsd2x5/0A6YtLq7HfJiQ+XY/eJRgTOHpG4qnisOYiumj8YQ=="], + "@cornerstonejs/tools": ["@cornerstonejs/tools@3.30.0", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "^3.30.0", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", "d3-array": "^3.2.3", "d3-interpolate": "^3.0.1", "gl-matrix": "^3.4.3" } }, "sha512-tpuEySlLsOJ8M9i3d4W6diauSG1ayC3yb7CiYWeQQjoujsBM2dYtAmnUXWe/P4jAkDWj/RUAzRL/ib0t1WLlXw=="], "@csstools/cascade-layer-name-parser": ["@csstools/cascade-layer-name-parser@2.0.4", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA=="], @@ -513,6 +515,8 @@ "@hapi/topo": ["@hapi/topo@5.1.0", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="], + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], @@ -565,6 +569,8 @@ "@oozcitak/util": ["@oozcitak/util@8.3.8", "", {}, "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ=="], + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + "@pnpm/config.env-replace": ["@pnpm/config.env-replace@1.1.0", "", {}, "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w=="], "@pnpm/network.ca-file": ["@pnpm/network.ca-file@1.0.2", "", { "dependencies": { "graceful-fs": "4.2.10" } }, "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA=="], @@ -1085,6 +1091,8 @@ "cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], + "cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], + "cross-fetch": ["cross-fetch@3.1.5", "", { "dependencies": { "node-fetch": "2.6.7" } }, "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -1141,7 +1149,7 @@ "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], - "dcmjs": ["dcmjs@0.33.1", "", { "dependencies": { "@babel/runtime-corejs3": "^7.22.5", "adm-zip": "^0.5.10", "gl-matrix": "^3.1.0", "lodash.clonedeep": "^4.5.0", "loglevelnext": "^3.0.1", "ndarray": "^1.0.19", "pako": "^2.0.4" } }, "sha512-/vwOPAX5fOQSwqf8t7bV7sy1h2h+gTWw5t/be8OIY7IwUpuKuKRChZvxINAjNZ9DDWHMB/uSOS7NJceu1YChfQ=="], + "dcmjs": ["dcmjs@0.42.0", "", { "dependencies": { "@babel/runtime-corejs3": "^7.22.5", "adm-zip": "^0.5.10", "gl-matrix": "^3.1.0", "lodash.clonedeep": "^4.5.0", "loglevel": "^1.8.1", "ndarray": "^1.0.19", "pako": "^2.0.4" } }, "sha512-N/SXIzMvAjDRgb8vC8G7DP/2BI1QKpa3TwY47Ok34g5y6ZKIcpAR3sf+Y+OBWkQxvnCTncB6B4tkq/ih8xjmXA=="], "debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], @@ -1357,6 +1365,8 @@ "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + "fork-ts-checker-webpack-plugin": ["fork-ts-checker-webpack-plugin@6.5.3", "", { "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", "chalk": "^4.1.0", "chokidar": "^3.4.2", "cosmiconfig": "^6.0.0", "deepmerge": "^4.2.2", "fs-extra": "^9.0.0", "glob": "^7.1.6", "memfs": "^3.1.2", "minimatch": "^3.0.4", "schema-utils": "2.7.0", "semver": "^7.3.2", "tapable": "^1.0.0" }, "peerDependencies": { "eslint": ">= 6", "typescript": ">= 2.7", "vue-template-compiler": "*", "webpack": ">= 4" }, "optionalPeers": ["eslint", "vue-template-compiler"] }, "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ=="], "form-data-encoder": ["form-data-encoder@2.1.4", "", {}, "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw=="], @@ -1401,7 +1411,7 @@ "gl-matrix": ["gl-matrix@3.4.3", "", {}, "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="], - "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], @@ -1607,6 +1617,8 @@ "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="], + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + "jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], @@ -1703,8 +1715,6 @@ "loglevel": ["loglevel@1.9.2", "", {}, "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg=="], - "loglevelnext": ["loglevelnext@3.0.1", "", {}, "sha512-JpjaJhIN1reaSb26SIxDGtE0uc67gPl19OMVHrr+Ggt6b/Vy60jmCtKgQBrygAH0bhRA2nkxgDvM+8QvR8r0YA=="], - "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], @@ -1713,7 +1723,7 @@ "lowercase-keys": ["lowercase-keys@3.0.0", "", {}, "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="], - "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "lunr": ["lunr@2.3.9", "", {}, "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="], @@ -1873,6 +1883,8 @@ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + "mississippi": ["mississippi@3.0.0", "", { "dependencies": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", "end-of-stream": "^1.1.0", "flush-write-stream": "^1.0.0", "from2": "^2.1.0", "parallel-transform": "^1.1.0", "pump": "^3.0.0", "pumpify": "^1.3.3", "stream-each": "^1.1.0", "through2": "^2.0.0" } }, "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA=="], "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], @@ -1965,6 +1977,8 @@ "package-json": ["package-json@8.1.1", "", { "dependencies": { "got": "^12.1.0", "registry-auth-token": "^5.0.1", "registry-url": "^6.0.0", "semver": "^7.3.7" } }, "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA=="], + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + "pako": ["pako@2.1.0", "", {}, "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="], "parallel-transform": ["parallel-transform@1.2.0", "", { "dependencies": { "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } }, "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg=="], @@ -2001,6 +2015,8 @@ "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "path-to-regexp": ["path-to-regexp@1.9.0", "", { "dependencies": { "isarray": "0.0.1" } }, "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g=="], "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], @@ -2393,7 +2409,7 @@ "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], "sirv": ["sirv@2.0.4", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ=="], @@ -2445,6 +2461,8 @@ "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "string_decoder": ["string_decoder@0.10.31", "", {}, "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="], "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], @@ -2453,6 +2471,8 @@ "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="], "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], @@ -2641,6 +2661,8 @@ "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], "write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], @@ -2709,6 +2731,8 @@ "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -2725,8 +2749,6 @@ "@babel/traverse/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], - "@cornerstonejs/adapters/dcmjs": ["dcmjs@0.29.13", "", { "dependencies": { "@babel/runtime-corejs3": "^7.22.5", "adm-zip": "^0.5.10", "gl-matrix": "^3.1.0", "lodash.clonedeep": "^4.5.0", "loglevelnext": "^3.0.1", "ndarray": "^1.0.19", "pako": "^2.0.4" } }, "sha512-Bf9tKzJNWqk4kbV210N5TLEHDqaZvO3S+MH9vezFAU8WKcG4cR6z4/II3TQVqhLI185eNUL+lhfPCVH1Uu2yTA=="], - "@docsearch/react/algoliasearch": ["algoliasearch@5.23.4", "", { "dependencies": { "@algolia/client-abtesting": "5.23.4", "@algolia/client-analytics": "5.23.4", "@algolia/client-common": "5.23.4", "@algolia/client-insights": "5.23.4", "@algolia/client-personalization": "5.23.4", "@algolia/client-query-suggestions": "5.23.4", "@algolia/client-search": "5.23.4", "@algolia/ingestion": "1.23.4", "@algolia/monitoring": "1.23.4", "@algolia/recommend": "5.23.4", "@algolia/requester-browser-xhr": "5.23.4", "@algolia/requester-fetch": "5.23.4", "@algolia/requester-node-http": "5.23.4" } }, "sha512-QzAKFHl3fm53s44VHrTdEo0TkpL3XVUYQpnZy1r6/EHvMAyIg+O4hwprzlsNmcCHTNyVcF2S13DAUn7XhkC6qg=="], "@docusaurus/babel/@babel/runtime": ["@babel/runtime@7.27.0", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw=="], @@ -2745,6 +2767,10 @@ "@docusaurus/types/webpack-merge": ["webpack-merge@5.10.0", "", { "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", "wildcard": "^2.0.0" } }, "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA=="], + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + "@kitware/vtk.js/commander": ["commander@9.2.0", "", {}, "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w=="], "@mdx-js/mdx/source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], @@ -2775,6 +2801,10 @@ "boxen/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + "cacache/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "cacache/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "cacache/mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], "cacache/rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], @@ -2805,6 +2835,8 @@ "copy-webpack-plugin/schema-utils": ["schema-utils@1.0.0", "", { "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } }, "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g=="], + "copyfiles/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "crypto-random-string/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="], @@ -2835,6 +2867,8 @@ "execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + "execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "express/content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], @@ -2859,6 +2893,8 @@ "fork-ts-checker-webpack-plugin/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], + "fork-ts-checker-webpack-plugin/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "fork-ts-checker-webpack-plugin/schema-utils": ["schema-utils@2.7.0", "", { "dependencies": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", "ajv-keywords": "^3.4.1" } }, "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A=="], "fork-ts-checker-webpack-plugin/tapable": ["tapable@1.1.3", "", {}, "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="], @@ -2867,6 +2903,8 @@ "fs-write-stream-atomic/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "global-dirs/ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="], "globby/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], @@ -3089,6 +3127,8 @@ "renderkid/htmlparser2": ["htmlparser2@6.1.0", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", "domutils": "^2.5.2", "entities": "^2.0.0" } }, "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A=="], + "rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], @@ -3107,6 +3147,8 @@ "shader-loader/loader-utils": ["loader-utils@1.4.2", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" } }, "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg=="], + "shelljs/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "sitemap/@types/node": ["@types/node@17.0.45", "", {}, "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="], "sockjs/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], @@ -3175,6 +3217,8 @@ "wrap-ansi/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + "write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "xmlbuilder2/js-yaml": ["js-yaml@3.14.0", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A=="], "@babel/core/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -3209,6 +3253,10 @@ "@docusaurus/theme-classic/react-router-dom/@babel/runtime": ["@babel/runtime@7.27.0", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw=="], + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + "agent-base/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], @@ -3233,12 +3281,16 @@ "concat-stream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "copy-concurrently/rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "copy-webpack-plugin/glob-parent/is-glob": ["is-glob@3.1.0", "", { "dependencies": { "is-extglob": "^2.1.0" } }, "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw=="], "copy-webpack-plugin/globby/array-union": ["array-union@1.0.2", "", { "dependencies": { "array-uniq": "^1.0.1" } }, "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng=="], "copy-webpack-plugin/globby/dir-glob": ["dir-glob@2.2.2", "", { "dependencies": { "path-type": "^3.0.0" } }, "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw=="], + "copy-webpack-plugin/globby/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "copy-webpack-plugin/globby/ignore": ["ignore@3.3.10", "", {}, "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="], "copy-webpack-plugin/globby/slash": ["slash@1.0.0", "", {}, "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg=="], @@ -3283,6 +3335,8 @@ "fs-write-stream-atomic/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], "hpack.js/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], @@ -3301,10 +3355,14 @@ "mini-css-extract-plugin/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], + "move-concurrently/rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "parallel-transform/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], "parallel-transform/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "patch-package/rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "pkg-up/find-up/locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], "react-dev-utils/find-up/locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], diff --git a/packages/docs/docs/migration-guides/3x/5-adapters.md b/packages/docs/docs/migration-guides/3x/5-adapters.md index 4994fcc58e..373dd06598 100644 --- a/packages/docs/docs/migration-guides/3x/5-adapters.md +++ b/packages/docs/docs/migration-guides/3x/5-adapters.md @@ -7,35 +7,39 @@ summary: Guide for using the new adapters API in Cornerstone3D 3.x import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - ## Key Changes: -* MeasurementsReport has two maps instead of objects for setting the +- MeasurementsReport has two maps instead of objects for setting the adapter classes, mapping the tool type to adapter class and the tracking id to adapter class. -* A new register additional tracking id method exists to allow adding +- A new register additional tracking id method exists to allow adding custom adapter methods. -* Adapter implementations now have a base class to handle some of the - definition. This allows calling into the base class to handle some of the +- Adapter implementations now have a base class to handle some of the + definition. This allows calling into the base class to handle some of the definition such as the is tracking handling. -* The MeasurementsReport class is now extensible to create a new class with - completely different default handling. To do this, the two map attributes +- The MeasurementsReport class is now extensible to create a new class with + completely different default handling. To do this, the two map attributes need to be redeclared, and the new instance registered for the handlers. -* There is now an init method to create tracking identifiers and register a new +- There is now an init method to create tracking identifiers and register a new handler. -* The annotation changed event no longer requires the viewport id/rendering id - * This change is done so that measurements can be updated when not visible +- The annotation changed event no longer requires the viewport id/rendering id + - This change is done so that measurements can be updated when not visible +- The measurement report no longer takes the image to/from world coords as this + is provided as a method exported from `@cornerstonejs/core/utilities` +- The adapters can hydrate world coordinates, eg for MPR reconstruction ## Migration Steps: ### 1. Replace MeasurementsReports.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE **Before:** + ```diff - const toolClass = MeasurementReports.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[toolType]; ``` **After:** + ```diff - const toolClass = MeasurementReports.measurementAdapterByToolType.get(toolType); ``` @@ -43,11 +47,13 @@ import TabItem from '@theme/TabItem'; ### 2. Replace Tool instance adapter registration which is identical to existing registration **Before:** + ```diff - class MyNewToolAdapter { ... identical to eg Probe Adapter } ``` **After:** + ```diff - const MyNewToolAdapter = Probe.initCopy('MyNewTool'); ``` @@ -55,11 +61,46 @@ import TabItem from '@theme/TabItem'; ### 3. Replace old tool registration with registerTrackingIdentifier **Before:** + ```diff - class OldToolAdapter { ... identical to eg Length v1.0 except has :v1.0 at end of tracking identifier } ``` **After:** + ```diff - MeasurementReport.registerTrackingIdentifier(Length, `${Length.trackingIdentifierTextValue}:v1.0`); ``` + +### 4. Remove image to/from world coords in use of MeasurementReport + +**Before:** + +``` + // Use cs3d adapters to generate toolState. + let storedMeasurementByAnnotationType = MeasurementReport.generateToolState( + datasetToUse, + // NOTE: we need to pass in the imageIds to dcmjs since the we use them + // for the imageToWorld transformation. The following assumes that the order + // that measurements were added to the display set are the same order as + // the measurementGroups in the instance. + sopInstanceUIDToImageId, + metaData, + csUtilities.imageToWorldCoords + ); +``` + +**After:** + +``` + // Use cs3d adapters to generate toolState. + let storedMeasurementByAnnotationType = MeasurementReport.generateToolState( + datasetToUse, + // NOTE: we need to pass in the imageIds to dcmjs since the we use them + // for the imageToWorld transformation. The following assumes that the order + // that measurements were added to the display set are the same order as + // the measurementGroups in the instance. + sopInstanceUIDToImageId, + metaData + ); +``` diff --git a/packages/docs/package.json b/packages/docs/package.json index bc9ceea354..f282d30df1 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -52,7 +52,7 @@ "@svgr/webpack": "^8.1.0", "clsx": "^1.1.1", "cross-env": "^7.0.3", - "dcmjs": "^0.42.0", + "dcmjs": "^0.43.1", "dicom-parser": "^1.8.21", "dicomweb-client": "0.10.4", "docusaurus-plugin-copy": "0.1.1", diff --git a/packages/tools/examples/circleROIStartEndThresholdWithSegmentation/index.ts b/packages/tools/examples/circleROIStartEndThresholdWithSegmentation/index.ts index 74b2b0d413..2c9a2650d3 100644 --- a/packages/tools/examples/circleROIStartEndThresholdWithSegmentation/index.ts +++ b/packages/tools/examples/circleROIStartEndThresholdWithSegmentation/index.ts @@ -243,7 +243,6 @@ async function run() { throttleTimeout: 100, /* Simplified handles */ simplified: true, - }); toolGroup.setToolActive(CircleROIStartEndThresholdTool.toolName, { diff --git a/packages/tools/src/tools/CrosshairsTool.ts b/packages/tools/src/tools/CrosshairsTool.ts index dc78a1b92b..c122fb0ca5 100644 --- a/packages/tools/src/tools/CrosshairsTool.ts +++ b/packages/tools/src/tools/CrosshairsTool.ts @@ -43,6 +43,7 @@ import liangBarksyClip from '../utilities/math/vec2/liangBarksyClip'; import * as lineSegment from '../utilities/math/line'; import type { Annotation, + AnnotationData, Annotations, EventTypes, ToolHandle, @@ -56,18 +57,20 @@ import triggerAnnotationRenderForViewportIds from '../utilities/triggerAnnotatio const { RENDERING_DEFAULTS } = CONSTANTS; -interface CrosshairsAnnotation extends Annotation { - data: { - handles: { - rotationPoints: Types.Point3[]; // rotation handles, used for rotation interactions - slabThicknessPoints: Types.Point3[]; // slab thickness handles, used for setting the slab thickness - activeOperation: number | null; // 0 translation, 1 rotation handles, 2 slab thickness handles - toolCenter: Types.Point3; - }; - activeViewportIds: string[]; // a list of the viewport ids connected to the reference lines being translated - viewportId: string; +export type CrosshairsAnnotationData = AnnotationData & { + handles: { + rotationPoints: Types.Point3[]; // rotation handles, used for rotation interactions + slabThicknessPoints: Types.Point3[]; // slab thickness handles, used for setting the slab thickness + activeOperation: number | null; // 0 translation, 1 rotation handles, 2 slab thickness handles + toolCenter: Types.Point3; }; -} + activeViewportIds: string[]; // a list of the viewport ids connected to the reference lines being translated + viewportId: string; +}; + +export type CrosshairsAnnotation = Annotation & { + data: CrosshairsAnnotationData; +}; function defaultReferenceLineColor() { return 'rgb(0, 200, 0)'; @@ -91,8 +94,6 @@ const OPERATION = { SLAB: 3, }; -const EPSILON = 1e-3; - /** * CrosshairsTool is a tool that provides reference lines between different viewports * of a toolGroup. Using crosshairs, you can jump to a specific location in one @@ -2287,17 +2288,21 @@ class CrosshairsTool extends AnnotationTool { const viewportDraggableRotatable = this._getReferenceLineDraggableRotatable(otherViewport.id); if (!viewportDraggableRotatable) { - const { rotationPoints } = this.editData.annotation.data.handles; + const { rotationPoints } = (( + this.editData.annotation.data + )).handles; // Todo: what is a point uid? - // @ts-expect-error const otherViewportRotationPoints = rotationPoints.filter( + // @ts-expect-error (point) => point[1].uid === otherViewport.id ); if (otherViewportRotationPoints.length === 2) { const point1 = viewport.canvasToWorld( + // @ts-expect-error otherViewportRotationPoints[0][3] ); const point2 = viewport.canvasToWorld( + // @ts-expect-error otherViewportRotationPoints[1][3] ); vtkMath.add(point1, point2, currentCenter); diff --git a/packages/tools/src/tools/OverlayGridTool.ts b/packages/tools/src/tools/OverlayGridTool.ts index 612900296a..ce0d951910 100644 --- a/packages/tools/src/tools/OverlayGridTool.ts +++ b/packages/tools/src/tools/OverlayGridTool.ts @@ -28,12 +28,12 @@ import AnnotationDisplayTool from './base/AnnotationDisplayTool'; const { EPSILON } = CONSTANTS; -export interface OverlayGridAnnotation extends Annotation { +export type OverlayGridAnnotation = Annotation & { data: { viewportData: Map; pointSets: Array; }; -} +}; /** * @public @@ -228,13 +228,12 @@ class OverlayGridTool extends AnnotationDisplayTool { ); const pointSets = annotation.data.pointSets; - const viewportData = annotation.data.viewportData; + const viewportData = (annotation).data.viewportData; for (let i = 0; i < sourceImageIds.length; i++) { // check if pointSets for the imageId was calculated. If not calculate and store const { pointSet1, pointSet2 } = pointSets[i]; const targetData = - // @ts-expect-error viewportData.get(targetViewport.id) || this.initializeViewportData(viewportData, targetViewport.id); diff --git a/packages/tools/src/tools/SegmentationIntersectionTool.ts b/packages/tools/src/tools/SegmentationIntersectionTool.ts index c31ef983c5..21c8e7353f 100644 --- a/packages/tools/src/tools/SegmentationIntersectionTool.ts +++ b/packages/tools/src/tools/SegmentationIntersectionTool.ts @@ -8,18 +8,27 @@ import { import { drawPath } from '../drawingSvg'; import { getToolGroup } from '../store/ToolGroupManager'; import triggerAnnotationRenderForViewportIds from '../utilities/triggerAnnotationRenderForViewportIds'; -import type { PublicToolProps, ToolProps, SVGDrawingHelper } from '../types'; +import type { + PublicToolProps, + ToolProps, + SVGDrawingHelper, + Annotation, +} from '../types'; import AnnotationDisplayTool from './base/AnnotationDisplayTool'; -import type { Annotation } from '../types'; import { distanceToPoint } from '../utilities/math/point'; import { pointToString } from '../utilities/pointToString'; import { polyDataUtils } from '../utilities'; -export interface SegmentationIntersectionAnnotation extends Annotation { +export type WorldPointSet = { + worldPointsSet; + color; +}; + +export type SegmentationIntersectionAnnotation = Annotation & { data: { - actorsWorldPointsMap: Map>; + actorsWorldPointsMap: Map>; }; -} +}; class SegmentationIntersectionTool extends AnnotationDisplayTool { static toolName; @@ -112,7 +121,9 @@ class SegmentationIntersectionTool extends AnnotationDisplayTool { } const annotation = annotations[0]; const { annotationUID } = annotation; - const actorsWorldPointsMap = annotation.data.actorsWorldPointsMap; + const actorsWorldPointsMap = (( + annotation + )).data.actorsWorldPointsMap; calculateSurfaceSegmentationIntersectionsForViewport( actorsWorldPointsMap, @@ -126,7 +137,6 @@ class SegmentationIntersectionTool extends AnnotationDisplayTool { if (!actorEntry?.clippingFilter) { return; } - // @ts-expect-error const actorWorldPointMap = actorsWorldPointsMap.get(actorEntry.uid); if (!actorWorldPointMap) { return; diff --git a/packages/tools/src/tools/annotation/VideoRedactionTool.ts b/packages/tools/src/tools/annotation/VideoRedactionTool.ts index e838d9e065..3c9a473ab2 100644 --- a/packages/tools/src/tools/annotation/VideoRedactionTool.ts +++ b/packages/tools/src/tools/annotation/VideoRedactionTool.ts @@ -305,8 +305,7 @@ class VideoRedactionTool extends AnnotationTool { const { points } = data.handles; // Move this handle. - // @ts-expect-error - points[handleIndex] = [...worldPos]; + points[handleIndex] = [...worldPos]; let bottomLeftCanvas; let bottomRightCanvas; @@ -389,8 +388,7 @@ class VideoRedactionTool extends AnnotationTool { triggerAnnotationRenderForViewportIds(viewportUIDsToRender); this.editData = null; - // @ts-expect-error - return annotation.metadata.annotationUID; + return annotation.annotationUID; } /** * Add event handlers for the modify event loop, and prevent default event prapogation. diff --git a/packages/tools/src/tools/base/ContourBaseTool.ts b/packages/tools/src/tools/base/ContourBaseTool.ts index 8865be226c..bddfe41768 100644 --- a/packages/tools/src/tools/base/ContourBaseTool.ts +++ b/packages/tools/src/tools/base/ContourBaseTool.ts @@ -210,7 +210,6 @@ abstract class ContourBaseTool extends AnnotationTool { protected getPolylinePoints(annotation: ContourAnnotation): Types.Point3[] { // Attention: `contour.polyline` is the new way to store a polyline but it // may be undefined because it was `data.polyline` before (fallback) - // @ts-expect-error return annotation.data.contour?.polyline ?? annotation.data.polyline; } diff --git a/packages/tools/src/tools/segmentation/CircleScissorsTool.ts b/packages/tools/src/tools/segmentation/CircleScissorsTool.ts index 45c5cc85a6..5a9faf306e 100644 --- a/packages/tools/src/tools/segmentation/CircleScissorsTool.ts +++ b/packages/tools/src/tools/segmentation/CircleScissorsTool.ts @@ -380,7 +380,6 @@ class CircleScissorsTool extends LabelmapBaseTool { const radius = Math.abs(bottom[1] - Math.floor((bottom[1] + top[1]) / 2)); - // @ts-expect-error const color = `rgb(${toolMetadata.segmentColor.slice(0, 3)})`; // If rendering engine has been destroyed while rendering diff --git a/packages/tools/src/tools/segmentation/RectangleScissorsTool.ts b/packages/tools/src/tools/segmentation/RectangleScissorsTool.ts index 87f2ffc8cf..2146daf485 100644 --- a/packages/tools/src/tools/segmentation/RectangleScissorsTool.ts +++ b/packages/tools/src/tools/segmentation/RectangleScissorsTool.ts @@ -383,7 +383,6 @@ class RectangleScissorsTool extends LabelmapBaseTool { const data = annotation.data; const { points } = data.handles; const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p)); - // @ts-expect-error const color = `rgb(${toolMetadata.segmentColor.slice(0, 3)})`; // If rendering engine has been destroyed while rendering diff --git a/packages/tools/src/tools/segmentation/SphereScissorsTool.ts b/packages/tools/src/tools/segmentation/SphereScissorsTool.ts index d004d4eb62..d76e284451 100644 --- a/packages/tools/src/tools/segmentation/SphereScissorsTool.ts +++ b/packages/tools/src/tools/segmentation/SphereScissorsTool.ts @@ -363,7 +363,6 @@ class SphereScissorsTool extends LabelmapBaseTool { const radius = Math.abs(bottom[1] - Math.floor((bottom[1] + top[1]) / 2)); - // @ts-expect-error const color = `rgb(${toolMetadata.segmentColor.slice(0, 3)})`; // If rendering engine has been destroyed while rendering diff --git a/packages/tools/src/types/AnnotationTypes.ts b/packages/tools/src/types/AnnotationTypes.ts index 815de61b7f..5b1c5b79f7 100644 --- a/packages/tools/src/types/AnnotationTypes.ts +++ b/packages/tools/src/types/AnnotationTypes.ts @@ -1,6 +1,52 @@ import type { Types } from '@cornerstonejs/core'; -type Annotation = { +export type AnnotationMetadata = Types.ViewReference & { + /** + * The registered name of the tool + */ + toolName: string; + /** + * The position of the camera in world space. + */ + cameraPosition?: Types.Point3; + /** + * The viewUp for the view position + */ + viewUp?: Types.Point3; + + /** The color of the segmentation - really this is annotation data */ + segmentColor?; +}; + +export type AnnotationData = { + /** + * Annotation handles that are grabbable for manipulation + */ + handles?: Handles; + /** + * Cached Annotation statistics which is specific to the tool + */ + cachedStats?: Record; + /** + * Label of an annotation + */ + label?: string; + /** + * contour data + */ + contour?: Contour; + + /** + * Other data/keys + */ + [key: string]: unknown; +}; + +/** + * Defines the basic annotation type. This SHOULD be an interface, but + * typescript doesn't properly handle extending interfaces. + */ +export type Annotation = { /** A unique identifier for this annotation */ annotationUID?: string; /** @@ -33,38 +79,15 @@ type Annotation = { isSelected?: boolean; /** If the annotation is auto generated from other annotations*/ autoGenerated?: boolean; - /** Metadata for annotation */ - metadata: Types.ViewReference & { - /** - * The registered name of the tool - */ - toolName: string; - /** - * The position of the camera in world space. - */ - cameraPosition?: Types.Point3; - /** - * The viewUp for the view position - */ - viewUp?: Types.Point3; - }; + /** Metadata for annotation. Optional for any type, but required for measurements */ + metadata?: AnnotationMetadata; /** * Data for annotation, Derivatives need to define their own data types. */ - data: { - /** Annotation handles that are grabbable for manipulation */ - handles?: Handles; - [key: string]: unknown; - /** Cached Annotation statistics which is specific to the tool */ - cachedStats?: Record; - /** Label of an annotation */ - label?: string; - /** contour data */ - contour?: Contour; - }; + data: AnnotationData; }; -type Contour = { +export type Contour = { /** world location of the polyline in the space */ polyline?: Types.Point3[]; /** PointsManager */ @@ -74,9 +97,9 @@ type Contour = { }; /** Array of annotations */ -type Annotations = Array; +export type Annotations = Array; -type GroupSpecificAnnotations = { +export type GroupSpecificAnnotations = { /** Each tool annotations */ [toolName: string]: Annotations; }; @@ -84,7 +107,7 @@ type GroupSpecificAnnotations = { /** * All frame of reference specific annotations for all tools. */ -type AnnotationState = { +export type AnnotationState = { /** * A string representing the key that can be used * to retrieve the key-specific annotations. For instance, our default @@ -95,7 +118,7 @@ type AnnotationState = { [key: string]: GroupSpecificAnnotations; }; -type Handles = { +export type Handles = { /** world location of the handles in the space */ points?: Types.Point3[]; /** index of the active handle being manipulated */ @@ -120,11 +143,3 @@ type Handles = { }; [key: string]: unknown; }; - -export type { - Annotation, - Annotations, - GroupSpecificAnnotations, - AnnotationState, - Handles, -}; diff --git a/packages/tools/src/types/ContourAnnotation.ts b/packages/tools/src/types/ContourAnnotation.ts index 7623def6fd..cb54ab7c4c 100644 --- a/packages/tools/src/types/ContourAnnotation.ts +++ b/packages/tools/src/types/ContourAnnotation.ts @@ -16,6 +16,8 @@ export enum ContourWindingDirection { export type ContourAnnotationData = { data: { cachedStats?: Record; + /** @deprecated Use contour.polyline */ + polyline?: Types.Point3[]; contour: { polyline: Types.Point3[]; closed: boolean; diff --git a/packages/tools/src/types/index.ts b/packages/tools/src/types/index.ts index 2b19bf6ffd..7b45feb5d3 100644 --- a/packages/tools/src/types/index.ts +++ b/packages/tools/src/types/index.ts @@ -1,9 +1,4 @@ -import type { - Annotation, - Annotations, - AnnotationState, - GroupSpecificAnnotations, -} from './AnnotationTypes'; +export type * from './AnnotationTypes'; import type { ContourAnnotationData, ContourAnnotation, @@ -101,8 +96,6 @@ import type { export type { // AnnotationState - Annotation, - Annotations, ContourAnnotationData, ContourAnnotation, ContourSegmentationAnnotationData, @@ -112,8 +105,6 @@ export type { IAnnotationManager, InterpolationViewportData, ImageInterpolationData, - GroupSpecificAnnotations, - AnnotationState, AnnotationStyle, ToolSpecificAnnotationTypes, AnnotationGroupSelector, diff --git a/packages/tools/src/utilities/planar/filterAnnotationsWithinSlice.ts b/packages/tools/src/utilities/planar/filterAnnotationsWithinSlice.ts index 22bc57fc62..ee9c5a2f81 100644 --- a/packages/tools/src/utilities/planar/filterAnnotationsWithinSlice.ts +++ b/packages/tools/src/utilities/planar/filterAnnotationsWithinSlice.ts @@ -35,7 +35,25 @@ export default function filterAnnotationsWithinSlice( // logic down below. const annotationsWithParallelNormals = annotations.filter( (td: Annotation) => { - let annotationViewPlaneNormal = td.metadata.viewPlaneNormal; + const { planeRestriction, referencedImageId } = td.metadata; + let { viewPlaneNormal: annotationViewPlaneNormal } = td.metadata; + + if (planeRestriction) { + const { inPlaneVector1, inPlaneVector2 } = planeRestriction; + if ( + inPlaneVector1 && + !isEqual(0, vec3.dot(viewPlaneNormal, inPlaneVector1)) + ) { + return false; + } + if ( + inPlaneVector2 && + !isEqual(0, vec3.dot(viewPlaneNormal, inPlaneVector2)) + ) { + return false; + } + return true; + } if ( !td.metadata.referencedImageId && @@ -44,20 +62,19 @@ export default function filterAnnotationsWithinSlice( ) { for (const point of td.data.handles.points) { const vector = vec3.sub(vec3.create(), point, camera.focalPoint); - const dotProduct = vec3.dot(vector, camera.viewPlaneNormal); + const dotProduct = vec3.dot(vector, viewPlaneNormal); if (!isEqual(dotProduct, 0)) { return false; } } - td.metadata.viewPlaneNormal = camera.viewPlaneNormal; + td.metadata.viewPlaneNormal = viewPlaneNormal; td.metadata.cameraFocalPoint = camera.focalPoint; return true; } - if (!annotationViewPlaneNormal) { + if (!annotationViewPlaneNormal && referencedImageId) { // This code is run to set the annotation view plane normal // for historical data which was saved without the normal. - const { referencedImageId } = td.metadata; const { imageOrientationPatient } = metaData.get( 'imagePlaneModule', referencedImageId @@ -79,6 +96,7 @@ export default function filterAnnotationsWithinSlice( vec3.cross(annotationViewPlaneNormal, rowCosineVec, colCosineVec); td.metadata.viewPlaneNormal = annotationViewPlaneNormal; } + const isParallel = Math.abs(vec3.dot(viewPlaneNormal, annotationViewPlaneNormal)) > PARALLEL_THRESHOLD; diff --git a/tsconfig.base.json b/tsconfig.base.json index a0ae8957e7..f976a16fcd 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -36,7 +36,6 @@ "packages/**/dist", "packages/**/lib", "packages/**/lib-esm", - "packages/adapters/**/*.js", "packages/dicomImageLoader/codecs/**/*", "packages/docs", "packages/docs/**/*", From 6fde907c17c8dca427324ceea9741b07c327ef70 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 16 Jul 2025 17:25:51 +0000 Subject: [PATCH 067/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 9d32c16cdc..8f8e79bd40 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -a275580630643b1c91185c6ee4d7717b0a0266d5 \ No newline at end of file +23c03d9d330750c5f3ab09336819c3cf1fe6cff3 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index d0e92afb6a..b052ea4865 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.0", - "@cornerstonejs/tools": "^3.31.0" + "@cornerstonejs/core": "^3.31.1", + "@cornerstonejs/tools": "^3.31.1" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 9a97d93857..8b169d3676 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.0", - "@cornerstonejs/tools": "^3.31.0" + "@cornerstonejs/core": "^3.31.1", + "@cornerstonejs/tools": "^3.31.1" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index dcc26885be..c06b50c052 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.0", + "@cornerstonejs/core": "^3.31.1", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index f282d30df1..40aedea57b 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.0", - "@cornerstonejs/core": "^3.31.0", - "@cornerstonejs/dicom-image-loader": "^3.31.0", - "@cornerstonejs/nifti-volume-loader": "^3.31.0", - "@cornerstonejs/tools": "^3.31.0", + "@cornerstonejs/adapters": "^3.31.1", + "@cornerstonejs/core": "^3.31.1", + "@cornerstonejs/dicom-image-loader": "^3.31.1", + "@cornerstonejs/nifti-volume-loader": "^3.31.1", + "@cornerstonejs/tools": "^3.31.1", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index c6094e2198..123502144c 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.0", - "@cornerstonejs/tools": "^3.31.0", + "@cornerstonejs/core": "^3.31.1", + "@cornerstonejs/tools": "^3.31.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 4cfd2e7361..7a6a230b3a 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.0" + "@cornerstonejs/core": "^3.31.1" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 9b77a58e73..0e33f3d1f1 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.0", - "@cornerstonejs/tools": "^3.31.0", + "@cornerstonejs/core": "^3.31.1", + "@cornerstonejs/tools": "^3.31.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 6ad7d21c10..98f3a769d2 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.0", + "@cornerstonejs/core": "^3.31.1", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index e946bd5155..d3f47013b5 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.0", - "commit": "a275580630643b1c91185c6ee4d7717b0a0266d5" + "version": "3.31.1", + "commit": "23c03d9d330750c5f3ab09336819c3cf1fe6cff3" } \ No newline at end of file diff --git a/version.txt b/version.txt index fdb94d0326..648b48f047 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.0 \ No newline at end of file +3.31.1 \ No newline at end of file From b354c7833deb393c61d531e218d92ddc9a756834 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 16 Jul 2025 17:26:07 +0000 Subject: [PATCH 068/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 6 ++++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 6 ++++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 55 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89d6005082..eaaa64c625 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) + +### Bug Fixes + +- Distinguishing between scoord3d and scoord (3d/2d) measurements and parsing them ([#2099](https://github.com/cornerstonejs/cornerstone3D/issues/2099)) ([23c03d9](https://github.com/cornerstonejs/cornerstone3D/commit/23c03d9d330750c5f3ab09336819c3cf1fe6cff3)) + # [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) ### Features diff --git a/lerna.json b/lerna.json index 9cc746e344..f1b8827b2a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.0", + "version": "3.31.1", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 0b988a2cc2..ec3ec694e8 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) + +### Bug Fixes + +- Distinguishing between scoord3d and scoord (3d/2d) measurements and parsing them ([#2099](https://github.com/cornerstonejs/cornerstone3D/issues/2099)) ([23c03d9](https://github.com/cornerstonejs/cornerstone3D/commit/23c03d9d330750c5f3ab09336819c3cf1fe6cff3)) + # [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index b052ea4865..bbc1fe2096 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.0", + "version": "3.31.1", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 4a957e945c..9e35f263fa 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) + +### Bug Fixes + +- Distinguishing between scoord3d and scoord (3d/2d) measurements and parsing them ([#2099](https://github.com/cornerstonejs/cornerstone3D/issues/2099)) ([23c03d9](https://github.com/cornerstonejs/cornerstone3D/commit/23c03d9d330750c5f3ab09336819c3cf1fe6cff3)) + # [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 8b169d3676..e554c8953f 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.0", + "version": "3.31.1", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 58f9983ec9..81828b333d 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) + +### Bug Fixes + +- Distinguishing between scoord3d and scoord (3d/2d) measurements and parsing them ([#2099](https://github.com/cornerstonejs/cornerstone3D/issues/2099)) ([23c03d9](https://github.com/cornerstonejs/cornerstone3D/commit/23c03d9d330750c5f3ab09336819c3cf1fe6cff3)) + # [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) ### Features diff --git a/packages/core/package.json b/packages/core/package.json index ba476a84bf..9283998181 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.0", + "version": "3.31.1", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index fe7d806375..a4b116800c 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + # [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index c06b50c052..cc7cb0a0b8 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.0", + "version": "3.31.1", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 20e58d1205..a518163489 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + # [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 123502144c..656aa0b459 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.0", + "version": "3.31.1", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 4e62b3e6d9..89eadde18c 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + # [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 7a6a230b3a..fb831ebbf7 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.0", + "version": "3.31.1", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 94bea6ccde..b1792ab6fd 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + # [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 0e33f3d1f1..770f8ae456 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.0", + "version": "3.31.1", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 0c3e86e562..787aa30bf6 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) + +### Bug Fixes + +- Distinguishing between scoord3d and scoord (3d/2d) measurements and parsing them ([#2099](https://github.com/cornerstonejs/cornerstone3D/issues/2099)) ([23c03d9](https://github.com/cornerstonejs/cornerstone3D/commit/23c03d9d330750c5f3ab09336819c3cf1fe6cff3)) + # [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) ### Features diff --git a/packages/tools/package.json b/packages/tools/package.json index 98f3a769d2..39f8b4d67a 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.0", + "version": "3.31.1", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 0fc65e9cc1d86a9a8b97ee9e7eb5802ce5e1e635 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 16 Jul 2025 17:26:17 +0000 Subject: [PATCH 069/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 01fbb4d168..07f6ff4c8e 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.0"; +export const version = "3.31.1"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 8359862b6a..4901161c42 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.0'; +export const version = '3.31.1'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 8359862b6a..4901161c42 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.0'; +export const version = '3.31.1'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 8359862b6a..4901161c42 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.0'; +export const version = '3.31.1'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 8359862b6a..4901161c42 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.0'; +export const version = '3.31.1'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 8359862b6a..4901161c42 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.0'; +export const version = '3.31.1'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 8359862b6a..4901161c42 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.0'; +export const version = '3.31.1'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 8359862b6a..4901161c42 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.0'; +export const version = '3.31.1'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 8359862b6a..4901161c42 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.0'; +export const version = '3.31.1'; From 7f6490833f92d212f2aabac45cc914f2ddb8e744 Mon Sep 17 00:00:00 2001 From: Ibrahim <93064150+IbrahimCSAE@users.noreply.github.com> Date: Wed, 16 Jul 2025 15:35:44 -0400 Subject: [PATCH 070/212] fix(colormap): do not return empty opacity arrays (#2208) * fix * cleaner * update --- packages/core/examples/stacktovolume/index.ts | 189 ++++++++++++++++++ packages/core/src/utilities/colormap.ts | 7 +- utils/ExampleRunner/example-info.json | 4 + 3 files changed, 198 insertions(+), 2 deletions(-) create mode 100644 packages/core/examples/stacktovolume/index.ts diff --git a/packages/core/examples/stacktovolume/index.ts b/packages/core/examples/stacktovolume/index.ts new file mode 100644 index 0000000000..e5da28cd9d --- /dev/null +++ b/packages/core/examples/stacktovolume/index.ts @@ -0,0 +1,189 @@ +import type { Types } from '@cornerstonejs/core'; +import { + RenderingEngine, + Enums, + volumeLoader, + getRenderingEngine, +} from '@cornerstonejs/core'; +import { + initDemo, + createImageIdsAndCacheMetaData, + setTitleAndDescription, + addButtonToToolbar, + ctVoiRange, + setCtTransferFunctionForVolumeActor, +} from '../../../../utils/demo/helpers'; + +// This is for debugging purposes +console.warn( + 'Click on index.ts to open source code for this example --------->' +); + +const { ViewportType } = Enums; + +// ======== Constants ======= // +const renderingEngineId = 'myRenderingEngine'; +const viewportId = 'CT_VIEWPORT'; + +// Define a unique id for the volume +const volumeName = 'CT_VOLUME_ID'; // Id of the volume less loader prefix +const volumeLoaderScheme = 'cornerstoneStreamingImageVolume'; // Loader id which defines which volume loader to use +const volumeId = `${volumeLoaderScheme}:${volumeName}`; // VolumeId with loader id + volume id + +// State +let isVolumeViewport = false; + +// ======== Set up page ======== // +setTitleAndDescription( + 'Stack to Volume Conversion', + 'Demonstrates converting between Stack and Volume viewports with a reset button.' +); + +const content = document.getElementById('content'); +const element = document.createElement('div'); +element.id = 'cornerstone-element'; +element.style.width = '500px'; +element.style.height = '500px'; + +content.appendChild(element); + +const info = document.createElement('div'); +content.appendChild(info); + +const viewportTypeInfo = document.createElement('div'); +viewportTypeInfo.innerText = 'Viewport Type: Stack'; +info.appendChild(viewportTypeInfo); + +// Store imageIds globally +let imageIds: string[] = []; + +// Reset Viewport button +addButtonToToolbar({ + title: 'Reset Viewport', + onClick: () => { + // Get the rendering engine + const renderingEngine = getRenderingEngine(renderingEngineId); + + // Get the viewport + const viewport = renderingEngine.getViewport(viewportId); + + if (!viewport) { + return; + } + + viewport.resetProperties?.(); + + viewport.resetCamera(); + viewport.render(); + }, +}); + +// Convert to Volume button +const convertButton = addButtonToToolbar({ + title: 'Convert to Volume', + onClick: async () => { + if (isVolumeViewport) { + return; // Already a volume viewport + } + + // Get the rendering engine + const renderingEngine = getRenderingEngine(renderingEngineId); + + // Disable the current viewport + renderingEngine.disableElement(viewportId); + + // Create a volume viewport + const viewportInput = { + viewportId, + type: ViewportType.ORTHOGRAPHIC, + element, + defaultOptions: { + orientation: Enums.OrientationAxis.AXIAL, + background: [0.2, 0, 0.2] as Types.Point3, + }, + }; + + renderingEngine.enableElement(viewportInput); + + // Get the volume viewport that was created + const viewport = renderingEngine.getViewport( + viewportId + ) as Types.IVolumeViewport; + + // Create and load the volume + const volume = await volumeLoader.createAndCacheVolume(volumeId, { + imageIds, + }); + + // Set the volume to load + volume.load(); + + // Set the volume on the viewport + await viewport.setVolumes([ + { volumeId, callback: setCtTransferFunctionForVolumeActor }, + ]); + + // Set the VOI range + viewport.setProperties({ voiRange: ctVoiRange }); + + // Render the image + viewport.render(); + + // Update state and UI + isVolumeViewport = true; + viewportTypeInfo.innerText = 'Viewport Type: Volume'; + + // Gray out the convert button + convertButton.disabled = true; + convertButton.style.opacity = '0.5'; + convertButton.style.cursor = 'not-allowed'; + }, +}); + +/** + * Runs the demo + */ +async function run() { + // Init Cornerstone and related libraries + await initDemo(); + + // Get Cornerstone imageIds and fetch metadata into RAM + imageIds = await createImageIdsAndCacheMetaData({ + StudyInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.334240657131972136850343327463', + SeriesInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.226151125820845824875394858561', + wadoRsRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', + }); + + // Instantiate a rendering engine + const renderingEngine = new RenderingEngine(renderingEngineId); + + // Create a stack viewport initially + const viewportInput = { + viewportId, + type: ViewportType.STACK, + element, + defaultOptions: { + background: [0.2, 0, 0.2] as Types.Point3, + }, + }; + + renderingEngine.enableElement(viewportInput); + + // Get the stack viewport that was created + const viewport = renderingEngine.getViewport( + viewportId + ) as Types.IStackViewport; + + // Set the stack on the viewport + viewport.setStack(imageIds); + + // Set the VOI of the stack + viewport.setProperties({ voiRange: ctVoiRange }); + + // Render the image + viewport.render(); +} + +run(); diff --git a/packages/core/src/utilities/colormap.ts b/packages/core/src/utilities/colormap.ts index 7328acf6b6..016245fcae 100644 --- a/packages/core/src/utilities/colormap.ts +++ b/packages/core/src/utilities/colormap.ts @@ -100,10 +100,13 @@ function findMatchingColormap(rgbPoints, actor): ColormapPublic | null { } } - return { + const result = { name: matchedColormap.Name, - opacity, + ...(Array.isArray(opacity) && opacity.length > 0 && { opacity }), + ...(typeof opacity === 'number' && { opacity }), }; + + return result; } export function setColorMapTransferFunctionForVolumeActor(volumeInfo) { diff --git a/utils/ExampleRunner/example-info.json b/utils/ExampleRunner/example-info.json index e74bc869b1..23a484feb6 100644 --- a/utils/ExampleRunner/example-info.json +++ b/utils/ExampleRunner/example-info.json @@ -149,6 +149,10 @@ "name": "Apply view reference and/or presentation parameters", "description": "Demonstrates how to apply various view/reference presentation parameters." }, + "stackToVolume": { + "name": "Stack to Volume Viewport", + "description": "Demonstrates how to convert a Stack Viewport to a Volume Viewport" + }, "webWorker": { "name": "Custom Web Worker Function", "description": "Demonstrates how to use the web worker manager to register and execute custom web worker functions off the main thread" From d69c373310eca2cc89219892bf4ce1c7a2fab9ca Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 16 Jul 2025 19:39:21 +0000 Subject: [PATCH 071/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 8f8e79bd40..3b9fa9f3ce 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -23c03d9d330750c5f3ab09336819c3cf1fe6cff3 \ No newline at end of file +7f6490833f92d212f2aabac45cc914f2ddb8e744 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index bbc1fe2096..dfc13b8fbe 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.1", - "@cornerstonejs/tools": "^3.31.1" + "@cornerstonejs/core": "^3.31.2", + "@cornerstonejs/tools": "^3.31.2" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index e554c8953f..7f224845e8 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.1", - "@cornerstonejs/tools": "^3.31.1" + "@cornerstonejs/core": "^3.31.2", + "@cornerstonejs/tools": "^3.31.2" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index cc7cb0a0b8..2f75875ce7 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.1", + "@cornerstonejs/core": "^3.31.2", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 40aedea57b..936c71d591 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.1", - "@cornerstonejs/core": "^3.31.1", - "@cornerstonejs/dicom-image-loader": "^3.31.1", - "@cornerstonejs/nifti-volume-loader": "^3.31.1", - "@cornerstonejs/tools": "^3.31.1", + "@cornerstonejs/adapters": "^3.31.2", + "@cornerstonejs/core": "^3.31.2", + "@cornerstonejs/dicom-image-loader": "^3.31.2", + "@cornerstonejs/nifti-volume-loader": "^3.31.2", + "@cornerstonejs/tools": "^3.31.2", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 656aa0b459..931e8982f2 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.1", - "@cornerstonejs/tools": "^3.31.1", + "@cornerstonejs/core": "^3.31.2", + "@cornerstonejs/tools": "^3.31.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index fb831ebbf7..5ba678b705 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.1" + "@cornerstonejs/core": "^3.31.2" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 770f8ae456..642c16582d 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.1", - "@cornerstonejs/tools": "^3.31.1", + "@cornerstonejs/core": "^3.31.2", + "@cornerstonejs/tools": "^3.31.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 39f8b4d67a..44ca88d87d 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.1", + "@cornerstonejs/core": "^3.31.2", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index d3f47013b5..9b18763845 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.1", - "commit": "23c03d9d330750c5f3ab09336819c3cf1fe6cff3" + "version": "3.31.2", + "commit": "7f6490833f92d212f2aabac45cc914f2ddb8e744" } \ No newline at end of file diff --git a/version.txt b/version.txt index 648b48f047..ed3efa2000 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.1 \ No newline at end of file +3.31.2 \ No newline at end of file From 9f82cb229437799e1cf4d0486c84653c75083594 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 16 Jul 2025 19:39:39 +0000 Subject: [PATCH 072/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eaaa64c625..2eb6fff80c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) + +### Bug Fixes + +- **colormap:** do not return empty opacity arrays ([#2208](https://github.com/cornerstonejs/cornerstone3D/issues/2208)) ([7f64908](https://github.com/cornerstonejs/cornerstone3D/commit/7f6490833f92d212f2aabac45cc914f2ddb8e744)) + ## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) ### Bug Fixes diff --git a/lerna.json b/lerna.json index f1b8827b2a..4973bb4e0c 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.1", + "version": "3.31.2", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index ec3ec694e8..fe5999700e 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) ### Bug Fixes diff --git a/packages/adapters/package.json b/packages/adapters/package.json index dfc13b8fbe..3a477038fa 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.1", + "version": "3.31.2", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 9e35f263fa..eac177f0fd 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) ### Bug Fixes diff --git a/packages/ai/package.json b/packages/ai/package.json index 7f224845e8..f3b7b922ba 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.1", + "version": "3.31.2", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 81828b333d..82a0c8a7c7 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) + +### Bug Fixes + +- **colormap:** do not return empty opacity arrays ([#2208](https://github.com/cornerstonejs/cornerstone3D/issues/2208)) ([7f64908](https://github.com/cornerstonejs/cornerstone3D/commit/7f6490833f92d212f2aabac45cc914f2ddb8e744)) + ## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 9283998181..34ea384e95 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.1", + "version": "3.31.2", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index a4b116800c..1dded76bd9 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 2f75875ce7..24e9c20297 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.1", + "version": "3.31.2", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index a518163489..209cb5c359 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 931e8982f2..8059fe7be1 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.1", + "version": "3.31.2", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 89eadde18c..fa2fc018fa 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 5ba678b705..fd5583dfc7 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.1", + "version": "3.31.2", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index b1792ab6fd..fe00693c94 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 642c16582d..134915d147 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.1", + "version": "3.31.2", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 787aa30bf6..25e629488e 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.31.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.0...v3.31.1) (2025-07-16) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 44ca88d87d..e1259147c6 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.1", + "version": "3.31.2", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 43718ecc1e9a5ba7f970b9fd7213c41f152d22ee Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 16 Jul 2025 19:39:49 +0000 Subject: [PATCH 073/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 07f6ff4c8e..c1de7b23ef 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.1"; +export const version = "3.31.2"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 4901161c42..2997113f65 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.1'; +export const version = '3.31.2'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 4901161c42..2997113f65 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.1'; +export const version = '3.31.2'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 4901161c42..2997113f65 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.1'; +export const version = '3.31.2'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 4901161c42..2997113f65 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.1'; +export const version = '3.31.2'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 4901161c42..2997113f65 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.1'; +export const version = '3.31.2'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 4901161c42..2997113f65 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.1'; +export const version = '3.31.2'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 4901161c42..2997113f65 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.1'; +export const version = '3.31.2'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 4901161c42..2997113f65 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.1'; +export const version = '3.31.2'; From b7d0c47a402805594a4d21cceaa7a1be573b33c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20K=C3=B6hler?= Date: Wed, 16 Jul 2025 16:59:20 -0300 Subject: [PATCH 074/212] fix: improve tool styles (#2207) --- .../src/tools/segmentation/SegmentLabelTool.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/tools/src/tools/segmentation/SegmentLabelTool.ts b/packages/tools/src/tools/segmentation/SegmentLabelTool.ts index daa5c869c0..5e1902e2da 100644 --- a/packages/tools/src/tools/segmentation/SegmentLabelTool.ts +++ b/packages/tools/src/tools/segmentation/SegmentLabelTool.ts @@ -51,6 +51,8 @@ class SegmentLabelTool extends BaseTool { configuration: { hoverTimeout: 100, searchRadius: 6, // search for border in a 6px radius + color: null, + background: null, }, } ) { @@ -143,11 +145,13 @@ class SegmentLabelTool extends BaseTool { } ); const segment = activeSegmentation.segments[hoveredSegmentIndex]; - const color = segmentationConfig.color.getSegmentIndexColor( - viewport.id, - segmentationId, - hoveredSegmentIndex - ); + const color = + this.configuration.color ?? + segmentationConfig.color.getSegmentIndexColor( + viewport.id, + segmentationId, + hoveredSegmentIndex + ); const label = segment?.label; const canvasCoordinates = viewport.worldToCanvas(worldPoint); this._editData = { @@ -205,6 +209,7 @@ class SegmentLabelTool extends BaseTool { textBoxPosition, { color: `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`, + background: this.configuration.background ?? undefined, } ); From 19332d24345bd771d7cf84cc76fcd9354c7e4c6a Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 16 Jul 2025 20:02:48 +0000 Subject: [PATCH 075/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 3b9fa9f3ce..57387817a3 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -7f6490833f92d212f2aabac45cc914f2ddb8e744 \ No newline at end of file +b7d0c47a402805594a4d21cceaa7a1be573b33c8 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 3a477038fa..d82b28ccdf 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.2", - "@cornerstonejs/tools": "^3.31.2" + "@cornerstonejs/core": "^3.31.3", + "@cornerstonejs/tools": "^3.31.3" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index f3b7b922ba..38f853859b 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.2", - "@cornerstonejs/tools": "^3.31.2" + "@cornerstonejs/core": "^3.31.3", + "@cornerstonejs/tools": "^3.31.3" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 24e9c20297..fc521143cc 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.2", + "@cornerstonejs/core": "^3.31.3", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 936c71d591..eb8d24d7b9 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.2", - "@cornerstonejs/core": "^3.31.2", - "@cornerstonejs/dicom-image-loader": "^3.31.2", - "@cornerstonejs/nifti-volume-loader": "^3.31.2", - "@cornerstonejs/tools": "^3.31.2", + "@cornerstonejs/adapters": "^3.31.3", + "@cornerstonejs/core": "^3.31.3", + "@cornerstonejs/dicom-image-loader": "^3.31.3", + "@cornerstonejs/nifti-volume-loader": "^3.31.3", + "@cornerstonejs/tools": "^3.31.3", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 8059fe7be1..f0b301fa1e 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.2", - "@cornerstonejs/tools": "^3.31.2", + "@cornerstonejs/core": "^3.31.3", + "@cornerstonejs/tools": "^3.31.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index fd5583dfc7..627e4f11ee 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.2" + "@cornerstonejs/core": "^3.31.3" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 134915d147..6763f04ceb 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.2", - "@cornerstonejs/tools": "^3.31.2", + "@cornerstonejs/core": "^3.31.3", + "@cornerstonejs/tools": "^3.31.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index e1259147c6..15e9ca392a 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.2", + "@cornerstonejs/core": "^3.31.3", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 9b18763845..bd25dd5992 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.2", - "commit": "7f6490833f92d212f2aabac45cc914f2ddb8e744" + "version": "3.31.3", + "commit": "b7d0c47a402805594a4d21cceaa7a1be573b33c8" } \ No newline at end of file diff --git a/version.txt b/version.txt index ed3efa2000..fb27bef322 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.2 \ No newline at end of file +3.31.3 \ No newline at end of file From 4d9625ba57e43d12ec54be4e6ab8fefc39eb2c02 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 16 Jul 2025 20:03:06 +0000 Subject: [PATCH 076/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2eb6fff80c..dd8b8b30a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) + +### Bug Fixes + +- improve tool styles ([#2207](https://github.com/cornerstonejs/cornerstone3D/issues/2207)) ([b7d0c47](https://github.com/cornerstonejs/cornerstone3D/commit/b7d0c47a402805594a4d21cceaa7a1be573b33c8)) + ## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 4973bb4e0c..cffdfea3a6 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.2", + "version": "3.31.3", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index fe5999700e..7e8aa18e22 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index d82b28ccdf..c585b7998a 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.2", + "version": "3.31.3", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index eac177f0fd..a7a7078106 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 38f853859b..9122300cee 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.2", + "version": "3.31.3", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 82a0c8a7c7..4b5988d0fc 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 34ea384e95..e492a7480f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.2", + "version": "3.31.3", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 1dded76bd9..a1500742b1 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index fc521143cc..889fa9c5c9 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.2", + "version": "3.31.3", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 209cb5c359..e7a45af101 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index f0b301fa1e..71fc7505a8 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.2", + "version": "3.31.3", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index fa2fc018fa..21556c59af 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 627e4f11ee..b8116eea7f 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.2", + "version": "3.31.3", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index fe00693c94..e02c9fc5aa 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 6763f04ceb..f9b1fc79c1 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.2", + "version": "3.31.3", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 25e629488e..6114096cc3 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) + +### Bug Fixes + +- improve tool styles ([#2207](https://github.com/cornerstonejs/cornerstone3D/issues/2207)) ([b7d0c47](https://github.com/cornerstonejs/cornerstone3D/commit/b7d0c47a402805594a4d21cceaa7a1be573b33c8)) + ## [3.31.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.1...v3.31.2) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 15e9ca392a..6cfc8f450f 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.2", + "version": "3.31.3", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From f68f1d6e2f9c4e18f81c51d5d728d8560d6f56cb Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 16 Jul 2025 20:03:17 +0000 Subject: [PATCH 077/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index c1de7b23ef..ce472244e1 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.2"; +export const version = "3.31.3"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 2997113f65..2787185b2c 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.2'; +export const version = '3.31.3'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 2997113f65..2787185b2c 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.2'; +export const version = '3.31.3'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 2997113f65..2787185b2c 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.2'; +export const version = '3.31.3'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 2997113f65..2787185b2c 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.2'; +export const version = '3.31.3'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 2997113f65..2787185b2c 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.2'; +export const version = '3.31.3'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 2997113f65..2787185b2c 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.2'; +export const version = '3.31.3'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 2997113f65..2787185b2c 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.2'; +export const version = '3.31.3'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 2997113f65..2787185b2c 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.2'; +export const version = '3.31.3'; From eabaff6c9288c6122573e0f8347dd8391ebc04ee Mon Sep 17 00:00:00 2001 From: Ibrahim <93064150+IbrahimCSAE@users.noreply.github.com> Date: Thu, 17 Jul 2025 10:29:10 -0400 Subject: [PATCH 078/212] fix(rendering): do not do unnecessary resize operations (#2209) * updates * format * fix * Update ContextPoolRenderingEngine.ts --- .../ContextPoolRenderingEngine.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts b/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts index 2e43b6f9da..459fd3ea7a 100644 --- a/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts +++ b/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts @@ -388,6 +388,23 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine { const offScreenCanvasWidth = viewportCanvas.width; const offScreenCanvasHeight = viewportCanvas.height; + // Check if dimensions have changed before resizing (with 2px tolerance) + const tolerance = 2; + + const widthDiff = Math.abs( + // @ts-expect-error + offScreenCanvasContainer.width - offScreenCanvasWidth + ); + + const heightDiff = Math.abs( + // @ts-expect-error + offScreenCanvasContainer.height - offScreenCanvasHeight + ); + + if (widthDiff <= tolerance && heightDiff <= tolerance) { + return; + } + // @ts-expect-error offScreenCanvasContainer.width = offScreenCanvasWidth; // @ts-expect-error From b87c94355f56ca848463a7d238f316f7d11742cd Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 17 Jul 2025 14:33:11 +0000 Subject: [PATCH 079/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 57387817a3..34870fa2db 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -b7d0c47a402805594a4d21cceaa7a1be573b33c8 \ No newline at end of file +eabaff6c9288c6122573e0f8347dd8391ebc04ee \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index c585b7998a..ae0c46a912 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.3", - "@cornerstonejs/tools": "^3.31.3" + "@cornerstonejs/core": "^3.31.4", + "@cornerstonejs/tools": "^3.31.4" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 9122300cee..6b89b195be 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.3", - "@cornerstonejs/tools": "^3.31.3" + "@cornerstonejs/core": "^3.31.4", + "@cornerstonejs/tools": "^3.31.4" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 889fa9c5c9..7bd2466502 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.3", + "@cornerstonejs/core": "^3.31.4", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index eb8d24d7b9..195ab3046a 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.3", - "@cornerstonejs/core": "^3.31.3", - "@cornerstonejs/dicom-image-loader": "^3.31.3", - "@cornerstonejs/nifti-volume-loader": "^3.31.3", - "@cornerstonejs/tools": "^3.31.3", + "@cornerstonejs/adapters": "^3.31.4", + "@cornerstonejs/core": "^3.31.4", + "@cornerstonejs/dicom-image-loader": "^3.31.4", + "@cornerstonejs/nifti-volume-loader": "^3.31.4", + "@cornerstonejs/tools": "^3.31.4", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 71fc7505a8..ed577c097b 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.3", - "@cornerstonejs/tools": "^3.31.3", + "@cornerstonejs/core": "^3.31.4", + "@cornerstonejs/tools": "^3.31.4", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index b8116eea7f..e9b4b9c25d 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.3" + "@cornerstonejs/core": "^3.31.4" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index f9b1fc79c1..60c84f0517 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.3", - "@cornerstonejs/tools": "^3.31.3", + "@cornerstonejs/core": "^3.31.4", + "@cornerstonejs/tools": "^3.31.4", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 6cfc8f450f..2a9ae22d33 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.3", + "@cornerstonejs/core": "^3.31.4", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index bd25dd5992..8079c3d038 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.3", - "commit": "b7d0c47a402805594a4d21cceaa7a1be573b33c8" + "version": "3.31.4", + "commit": "eabaff6c9288c6122573e0f8347dd8391ebc04ee" } \ No newline at end of file diff --git a/version.txt b/version.txt index fb27bef322..5ab1f4a289 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.3 \ No newline at end of file +3.31.4 \ No newline at end of file From 2cb664411a5aeb75c246470c6cae78656b6720f4 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 17 Jul 2025 14:33:28 +0000 Subject: [PATCH 080/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd8b8b30a4..355f40333b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) + +### Bug Fixes + +- **rendering:** do not do unnecessary resize operations ([#2209](https://github.com/cornerstonejs/cornerstone3D/issues/2209)) ([eabaff6](https://github.com/cornerstonejs/cornerstone3D/commit/eabaff6c9288c6122573e0f8347dd8391ebc04ee)) + ## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) ### Bug Fixes diff --git a/lerna.json b/lerna.json index cffdfea3a6..063aa9be52 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.3", + "version": "3.31.4", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 7e8aa18e22..23a7591f31 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index ae0c46a912..4e57e15f57 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.3", + "version": "3.31.4", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index a7a7078106..414ab86d6a 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 6b89b195be..ee5f514ebf 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.3", + "version": "3.31.4", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 4b5988d0fc..5b5c799936 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) + +### Bug Fixes + +- **rendering:** do not do unnecessary resize operations ([#2209](https://github.com/cornerstonejs/cornerstone3D/issues/2209)) ([eabaff6](https://github.com/cornerstonejs/cornerstone3D/commit/eabaff6c9288c6122573e0f8347dd8391ebc04ee)) + ## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index e492a7480f..801a4389b6 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.3", + "version": "3.31.4", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index a1500742b1..9017c4e427 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 7bd2466502..1ff187ccf3 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.3", + "version": "3.31.4", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index e7a45af101..61865f1c24 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index ed577c097b..8260e2dd86 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.3", + "version": "3.31.4", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 21556c59af..bca430ea68 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index e9b4b9c25d..aafefebe36 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.3", + "version": "3.31.4", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index e02c9fc5aa..07f47dee47 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 60c84f0517..9650faffde 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.3", + "version": "3.31.4", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 6114096cc3..23fc96379c 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.31.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.2...v3.31.3) (2025-07-16) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 2a9ae22d33..d3f49ecf85 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.3", + "version": "3.31.4", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 1e7972641b5779d04ce1c0a16c5531066c549e59 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 17 Jul 2025 14:33:38 +0000 Subject: [PATCH 081/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index ce472244e1..baaa486b7d 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.3"; +export const version = "3.31.4"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 2787185b2c..9e4ebc51d4 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.3'; +export const version = '3.31.4'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 2787185b2c..9e4ebc51d4 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.3'; +export const version = '3.31.4'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 2787185b2c..9e4ebc51d4 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.3'; +export const version = '3.31.4'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 2787185b2c..9e4ebc51d4 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.3'; +export const version = '3.31.4'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 2787185b2c..9e4ebc51d4 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.3'; +export const version = '3.31.4'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 2787185b2c..9e4ebc51d4 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.3'; +export const version = '3.31.4'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 2787185b2c..9e4ebc51d4 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.3'; +export const version = '3.31.4'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 2787185b2c..9e4ebc51d4 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.3'; +export const version = '3.31.4'; From 9b3fd227c11d78e7cc3fbddcfb8926e8a22572fc Mon Sep 17 00:00:00 2001 From: Bill Wallace Date: Fri, 18 Jul 2025 08:06:11 -0400 Subject: [PATCH 082/212] fix: adapter should be able to convert all the types, including points (#2211) * fix: Apply MPR to other types * fix: Load other measurement types --- .../src/adapters/Cornerstone3D/Angle.ts | 3 - .../adapters/Cornerstone3D/ArrowAnnotate.ts | 6 +- .../adapters/Cornerstone3D/BaseAdapter3D.ts | 51 +++++- .../adapters/Cornerstone3D/Bidirectional.ts | 28 +-- .../adapters/Cornerstone3D/EllipticalROI.ts | 141 +++++---------- .../src/adapters/Cornerstone3D/KeyImage.ts | 2 - .../Cornerstone3D/MeasurementReport.ts | 87 ++++++++- .../src/adapters/Cornerstone3D/Probe.ts | 115 ++++-------- .../adapters/Cornerstone3D/RectangleROI.ts | 165 ++++-------------- .../Cornerstone3D/UltrasoundDirectional.ts | 26 +-- .../adapters/src/adapters/helpers/toArray.ts | 2 +- 11 files changed, 266 insertions(+), 360 deletions(-) diff --git a/packages/adapters/src/adapters/Cornerstone3D/Angle.ts b/packages/adapters/src/adapters/Cornerstone3D/Angle.ts index 9d55dd12b5..227447fd63 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Angle.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Angle.ts @@ -15,14 +15,11 @@ class Angle extends BaseAdapter3D { public static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata ) { const { state, NUMGroup, - scoord, - scoordArgs, worldCoords, referencedImageId, ReferencedFrameNumber diff --git a/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts b/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts index 763238a340..a4cf49ee49 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts @@ -1,10 +1,13 @@ -import MeasurementReport from "./MeasurementReport"; import { utilities } from "dcmjs"; +import { utilities as csUtilities } from "@cornerstonejs/core"; + +import MeasurementReport from "./MeasurementReport"; import BaseAdapter3D from "./BaseAdapter3D"; import CodingScheme from "./CodingScheme"; import { toScoord } from "../helpers"; const { Point: TID300Point } = utilities.TID300; +const { imageToWorldCoords } = csUtilities; const { codeValues } = CodingScheme; class ArrowAnnotate extends BaseAdapter3D { @@ -16,7 +19,6 @@ class ArrowAnnotate extends BaseAdapter3D { static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata, _trackingIdentifier ) { diff --git a/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts b/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts index fd2515dcfe..37371de70a 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/BaseAdapter3D.ts @@ -41,6 +41,56 @@ export default class BaseAdapter3D { */ public static parentType: string; + public static registerType(code = "", type = "", count = 0) { + let key = code; + if (type) { + key = `${key}${key.length ? "-" : ""}${type}`; + } + if (count) { + key = `${key}${key.length ? "-" : ""}${count}`; + } + MeasurementReport.registerAdapterTypes(this, key); + } + + public static getPointsCount(graphicItem) { + const is3DMeasurement = graphicItem.ValueType === "SCOORD3D"; + const pointSize = is3DMeasurement ? 3 : 2; + return graphicItem.GraphicData.length / pointSize; + } + + public static getGraphicItems(measurementGroup, filter) { + const items = measurementGroup.ContentSequence.filter( + group => + group.ValueType === "SCOORD" || group.ValueType === "SCOORD3D" + ); + return filter ? items.filter(filter) : items; + } + + public static getGraphicItem(measurementGroup, offset = 0, type = null) { + const items = this.getGraphicItems( + measurementGroup, + type && (group => group.ValueType === type) + ); + return items[offset]; + } + + public static getGraphicCode(graphicItem) { + const { ConceptNameCodeSequence: conceptNameItem } = graphicItem; + const { + CodeValue: graphicValue, + CodingSchemeDesignator: graphicDesignator + } = conceptNameItem; + return `${graphicDesignator}:${graphicValue}`; + } + + public static getGraphicType(graphicItem) { + return graphicItem.GraphicType; + } + + public static isValidMeasurement(_measurementGroup) { + return false; + } + public static init( toolType: string, representation, @@ -120,7 +170,6 @@ export default class BaseAdapter3D { public static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, - _imageToWorldCoords, metadata, trackingIdentifier?: string ) { diff --git a/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts b/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts index aef5bb8c00..95b88a52d1 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts @@ -19,13 +19,19 @@ class Bidirectional extends BaseAdapter3D { sopInstanceUIDToImageIdMap, metadata ) { - const { state, scoordArgs, referencedImageId, ReferencedFrameNumber } = - MeasurementReport.getSetupMeasurementData( - MeasurementGroup, - sopInstanceUIDToImageIdMap, - metadata, - Bidirectional.toolType - ); + const { + state, + NUMGroup, + scoord, + scoordArgs, + referencedImageId, + ReferencedFrameNumber + } = MeasurementReport.getSetupMeasurementData( + MeasurementGroup, + sopInstanceUIDToImageIdMap, + metadata, + this.toolType + ); const { ContentSequence } = MeasurementGroup; @@ -52,12 +58,8 @@ class Bidirectional extends BaseAdapter3D { const worldCoords = []; - worldCoords.push( - ...scoordToWorld(scoordArgs, longAxisScoordGroup.GraphicData) - ); - worldCoords.push( - ...scoordToWorld(scoordArgs, shortAxisScoordGroup.GraphicData) - ); + worldCoords.push(...scoordToWorld(scoordArgs, longAxisScoordGroup)); + worldCoords.push(...scoordToWorld(scoordArgs, shortAxisScoordGroup)); state.annotation.data = { ...state.annotation.data, diff --git a/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts b/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts index 7d37cc449e..2fc3faf3ce 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts @@ -1,13 +1,11 @@ import { vec3 } from "gl-matrix"; import { utilities } from "dcmjs"; -import { utilities as csUtilities } from "@cornerstonejs/core"; + import MeasurementReport from "./MeasurementReport"; import BaseAdapter3D from "./BaseAdapter3D"; - -type Point3 = [number, number, number]; +import { toScoord } from "../helpers"; const { Ellipse: TID300Ellipse } = utilities.TID300; -const { worldToImageCoords } = csUtilities; const EPSILON = 1e-4; @@ -19,14 +17,11 @@ class EllipticalROI extends BaseAdapter3D { static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata ) { const { state, NUMGroup, - scoord, - scoordArgs, worldCoords, referencedImageId, ReferencedFrameNumber @@ -37,68 +32,10 @@ class EllipticalROI extends BaseAdapter3D { EllipticalROI.toolType ); - const [majorAxisStart, majorAxisEnd, minorAxisStart, minorAxisEnd] = - worldCoords; - - const majorAxisVec = vec3.create(); - vec3.sub(majorAxisVec, majorAxisEnd, majorAxisStart); - - // normalize majorAxisVec to avoid scaling issues - vec3.normalize(majorAxisVec, majorAxisVec); - - const minorAxisVec = vec3.create(); - vec3.sub(minorAxisVec, minorAxisEnd, minorAxisStart); - vec3.normalize(minorAxisVec, minorAxisVec); - - const imagePlaneModule = metadata.get( - "imagePlaneModule", - referencedImageId - ); - - if (!imagePlaneModule) { - throw new Error("imageId does not have imagePlaneModule metadata"); - } - - const { columnCosines } = imagePlaneModule; - - // find which axis is parallel to the columnCosines - const columnCosinesVec = vec3.fromValues( - columnCosines[0], - columnCosines[1], - columnCosines[2] - ); - const projectedMajorAxisOnColVec = vec3.dot( - columnCosinesVec, - majorAxisVec - ); - - const projectedMinorAxisOnColVec = vec3.dot( - columnCosinesVec, - minorAxisVec - ); - - const absoluteOfMajorDotProduct = Math.abs(projectedMajorAxisOnColVec); - const absoluteOfMinorDotProduct = Math.abs(projectedMinorAxisOnColVec); - - let ellipsePoints = []; - if (Math.abs(absoluteOfMajorDotProduct - 1) < EPSILON) { - ellipsePoints = worldCoords; - } else if (Math.abs(absoluteOfMinorDotProduct - 1) < EPSILON) { - ellipsePoints = [ - worldCoords[2], - worldCoords[3], - worldCoords[0], - worldCoords[1] - ]; - } else { - console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED"); - return null; - } - state.annotation.data = { ...state.annotation.data, handles: { - points: [...ellipsePoints], + points: worldCoords, activeHandleIndex: 0, textBox: { hasMoved: false @@ -106,15 +43,15 @@ class EllipticalROI extends BaseAdapter3D { }, frameNumber: ReferencedFrameNumber }; - if (referencedImageId) { - state.annotation.data.cachedStats = { - [`imageId:${referencedImageId}`]: { - area: NUMGroup - ? NUMGroup.MeasuredValueSequence.NumericValue - : 0 - } - }; - } + state.annotation.data.cachedStats = referencedImageId + ? { + [`imageId:${referencedImageId}`]: { + area: NUMGroup + ? NUMGroup.MeasuredValueSequence.NumericValue + : 0 + } + } + : {}; return state; } @@ -124,51 +61,55 @@ class EllipticalROI extends BaseAdapter3D { const { cachedStats = {}, handles } = data; const rotation = data.initialRotation || 0; const { referencedImageId } = metadata; + const scoordProps = { + is3DMeasurement, + referencedImageId + }; let top, bottom, left, right; - // Using image coordinates for 2D points - // this way when it's restored we can assume the initial rotation is 0. if (rotation == 90 || rotation == 270) { - bottom = worldToImageCoords(referencedImageId, handles.points[2]); - top = worldToImageCoords(referencedImageId, handles.points[3]); - left = worldToImageCoords(referencedImageId, handles.points[0]); - right = worldToImageCoords(referencedImageId, handles.points[1]); + bottom = handles.points[2]; + top = handles.points[3]; + left = handles.points[0]; + right = handles.points[1]; } else { - top = worldToImageCoords(referencedImageId, handles.points[0]); - bottom = worldToImageCoords(referencedImageId, handles.points[1]); - left = worldToImageCoords(referencedImageId, handles.points[2]); - right = worldToImageCoords(referencedImageId, handles.points[3]); + top = handles.points[0]; + bottom = handles.points[1]; + left = handles.points[2]; + right = handles.points[3]; } // find the major axis and minor axis - const topBottomLength = Math.abs(top.y - bottom.y); - const leftRightLength = Math.abs(left.x - right.x); + const topBottomLength = Math.sqrt( + (top[0] - bottom[0]) ** 2 + + (top[1] - bottom[1]) ** 2 + + (top[2] - bottom[2]) ** 2 + ); + const leftRightLength = Math.sqrt( + (left[0] - right[0]) ** 2 + + (left[1] - right[1]) ** 2 + + (left[2] - right[2]) ** 2 + ); const points = []; if (topBottomLength > leftRightLength) { // major axis is bottom to top - points.push({ x: top[0], y: top[1] }); - points.push({ x: bottom[0], y: bottom[1] }); - - // minor axis is left to right - points.push({ x: left[0], y: left[1] }); - points.push({ x: right[0], y: right[1] }); + points.push(top, bottom, left, right); } else { // major axis is left to right - points.push({ x: left[0], y: left[1] }); - points.push({ x: right[0], y: right[1] }); - - // minor axis is bottom to top - points.push({ x: top[0], y: top[1] }); - points.push({ x: bottom[0], y: bottom[1] }); + points.push(left, right, top, bottom); } const { area } = cachedStats[`imageId:${referencedImageId}`] || {}; + const convertedPoints = points.map(point => + toScoord(scoordProps, point) + ); + return { area, - points, + points: convertedPoints, trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [], diff --git a/packages/adapters/src/adapters/Cornerstone3D/KeyImage.ts b/packages/adapters/src/adapters/Cornerstone3D/KeyImage.ts index cbcdf273c8..7e09e377d0 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/KeyImage.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/KeyImage.ts @@ -13,14 +13,12 @@ export default class KeyImage extends Probe { static getMeasurementData( measurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata, trackingIdentifier ) { const baseData = super.getMeasurementData( measurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata, trackingIdentifier ); diff --git a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts index 68f37166f4..5ad84eeedd 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts @@ -128,6 +128,8 @@ export interface MeasurementAdapter { isValidCornerstoneTrackingIdentifier(trackingIdentifier: string): boolean; + isValidMeasurement(measurementGroup): boolean; + getTID300RepresentationArguments( tool, is3DMeasurement @@ -143,6 +145,12 @@ export default class MeasurementReport { MeasurementAdapter >(); + /** Maps tool type to the adapter name used to serialize this item to SR */ + public static measurementAdaptersByType = new Map< + string, + MeasurementAdapter[] + >(); + /** Maps tracking identifier to tool class to deserialize from SR into a tool instance */ public static measurementAdapterByTrackingIdentifier = new Map< string, @@ -445,7 +453,13 @@ export default class MeasurementReport { ) || []; const NUMGroup = contentSequenceArr.find( group => group.ValueType === "NUM" - ); + ) || { + ContentSequence: contentSequenceArr.filter( + group => + group.ValueType === "SCOORD" || + group.ValueType === "SCOORD3D" + ) + }; const spatialGroup = this.processSpatialCoordinatesGroup({ NUMGroup, @@ -701,7 +715,8 @@ export default class MeasurementReport { ) || this.getAdapterForTrackingIdentifier( trackingIdentifierValue - ); + ) || + this.getAdapterForCodeType(measurementGroup); if (toolAdapter) { const measurement = toolAdapter.getMeasurementData( @@ -797,4 +812,72 @@ export default class MeasurementReport { } } } + + /** + * This will use the adapter types to figure out which adapters might be + * able to convert this object. + */ + public static getAdapterForCodeType(measurementGroup) { + for (const adapter of this.measurementAdapterByTrackingIdentifier.values()) { + if (adapter.isValidMeasurement(measurementGroup)) { + return adapter; + } + } + } + + /** + * Register an adapter by type + * This will be some combination of the graphic code, type and point count. + * Only the most specific variants should be registered, unless the more + * general variants can be handled. + */ + public static registerAdapterTypes(adapter, ...types) { + for (const type of types) { + if (!this.measurementAdaptersByType.has(type)) { + this.measurementAdaptersByType.set(type, []); + } + const adapters = this.measurementAdaptersByType.get(type); + if (adapters.indexOf(adapter) === -1) { + adapters.push(adapter); + } + } + } + + /** + * Finds possible adapters for the point types + * + * @param graphicCode - in the designator:value format + * @param graphicType - as one of the allowed graphic type values + * @param pointCount - a number indicating how many points were found + * @returns An array of adapters that might handle this type + */ + public static getAdaptersForTypes( + graphicCode: string, + graphicType: string, + pointCount: number + ) { + const adapters = []; + + appendList( + adapters, + this.measurementAdaptersByType.get( + `${graphicCode}-${graphicType}-${pointCount}` + ) + ); + appendList( + adapters, + this.measurementAdaptersByType.get(`${graphicCode}-${graphicType}`) + ); + appendList(adapters, this.measurementAdaptersByType.get(graphicCode)); + appendList(adapters, this.measurementAdaptersByType.get(graphicType)); + + return adapters; + } +} + +function appendList(list, appendList) { + if (!appendList?.length) { + return; + } + list.push(...appendList); } diff --git a/packages/adapters/src/adapters/Cornerstone3D/Probe.ts b/packages/adapters/src/adapters/Cornerstone3D/Probe.ts index 17d371ca27..993b6bbaa5 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Probe.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Probe.ts @@ -9,106 +9,59 @@ class Probe extends BaseAdapter3D { static { this.init("Probe", TID300Point); this.registerLegacy(); + this.registerType("DCM:111030", "POINT", 1); + this.registerType("DCM:111030", "POINT", 2); + } + + public static isValidMeasurement(measurement) { + const graphicItem = this.getGraphicItem(measurement); + return ( + this.getGraphicType(graphicItem) === "POINT" && + this.getPointsCount(graphicItem) <= 2 + ); } static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata, - trackingIdentifier + _trackingIdentifier ) { - const state = super.getMeasurementData( + const { + state, + NUMGroup, + scoord, + scoordArgs, + worldCoords, + referencedImageId, + ReferencedFrameNumber + } = MeasurementReport.getSetupMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata, - trackingIdentifier + this.toolType ); - const { defaultState, SCOORDGroup, SCOORD3DGroup } = - MeasurementReport.getSetupMeasurementData( - MeasurementGroup, - sopInstanceUIDToImageIdMap, - metadata, - Probe.toolType - ); - - if (SCOORDGroup) { - return this.getMeasurementDataFromScoord({ - state, - defaultState, - SCOORDGroup, - imageToWorldCoords - }); - } else if (SCOORD3DGroup) { - return this.getMeasurementDataFromScoord3D({ - state, - SCOORD3DGroup - }); - } else { - throw new Error( - "Can't get measurement data with missing SCOORD and SCOORD3D groups." - ); - } - } - - static getMeasurementDataFromScoord({ - state, - defaultState, - SCOORDGroup, - imageToWorldCoords - }) { - const referencedImageId = - defaultState.annotation.metadata.referencedImageId; - - const { GraphicData } = SCOORDGroup; - - const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 2) { - const point = imageToWorldCoords(referencedImageId, [ - GraphicData[i], - GraphicData[i + 1] - ]); - worldCoords.push(point); - } - - state.annotation.data = { - ...state.annotation.data, - handles: { - points: worldCoords, - activeHandleIndex: null, - textBox: { - hasMoved: false - } - } - }; - - return state; - } - - static getMeasurementDataFromScoord3D({ state, SCOORD3DGroup }) { - const { GraphicData } = SCOORD3DGroup; - - const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 3) { - const point = [ - GraphicData[i], - GraphicData[i + 1], - GraphicData[i + 2] - ]; - worldCoords.push(point); - } - + const cachedStats = referencedImageId + ? { + [`imageId:${referencedImageId}`]: { + length: NUMGroup + ? NUMGroup.MeasuredValueSequence.NumericValue + : 0 + } + } + : {}; state.annotation.data = { ...state.annotation.data, handles: { points: worldCoords, - activeHandleIndex: null, + activeHandleIndex: 0, textBox: { hasMoved: false } - } + }, + cachedStats, + frameNumber: ReferencedFrameNumber }; return state; diff --git a/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts b/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts index 994693369e..47835da902 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts @@ -1,12 +1,12 @@ import { utilities } from "dcmjs"; -import { utilities as csUtilities } from "@cornerstonejs/core"; + +import { toScoords } from "../helpers"; import MeasurementReport from "./MeasurementReport"; import BaseAdapter3D from "./BaseAdapter3D"; const { Polyline: TID300Polyline } = utilities.TID300; -const { worldToImageCoords } = csUtilities; -class RectangleROI extends BaseAdapter3D { +export class RectangleROI extends BaseAdapter3D { static { this.init("RectangleROI", TID300Polyline); // Register using the Cornerstone 1.x name so this tool is used to load it @@ -15,165 +15,63 @@ class RectangleROI extends BaseAdapter3D { public static getMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata ) { const { - defaultState, + state, NUMGroup, - SCOORDGroup, - SCOORD3DGroup, + scoord, + scoordArgs, + worldCoords, + referencedImageId, ReferencedFrameNumber } = MeasurementReport.getSetupMeasurementData( MeasurementGroup, sopInstanceUIDToImageIdMap, metadata, - RectangleROI.toolType + this.toolType ); - if (SCOORDGroup) { - return this.getMeasurementDataFromScoord({ - defaultState, - SCOORDGroup, - imageToWorldCoords, - NUMGroup, - ReferencedFrameNumber - }); - } else if (SCOORD3DGroup) { - return this.getMeasurementDataFromScoord3D({ - SCOORD3DGroup, - defaultState - }); - } else { - throw new Error( - "Can't get measurement data with missing SCOORD and SCOORD3D groups." - ); - } - } - - static getMeasurementDataFromScoord({ - defaultState, - SCOORDGroup, - imageToWorldCoords, - NUMGroup, - ReferencedFrameNumber - }) { - const referencedImageId = - defaultState.annotation.metadata.referencedImageId; - - const { GraphicData } = SCOORDGroup; - const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 2) { - const point = imageToWorldCoords(referencedImageId, [ - GraphicData[i], - GraphicData[i + 1] - ]); - worldCoords.push(point); - } - - const state = defaultState; - + const cachedStats = referencedImageId + ? { + [`imageId:${referencedImageId}`]: { + area: NUMGroup + ? NUMGroup.MeasuredValueSequence.NumericValue + : 0 + } + } + : {}; state.annotation.data = { + ...state.annotation.data, handles: { - points: [ - worldCoords[0], - worldCoords[1], - worldCoords[3], - worldCoords[2] - ], + points: worldCoords, activeHandleIndex: 0, textBox: { hasMoved: false } }, - cachedStats: { - [`imageId:${referencedImageId}`]: { - area: NUMGroup - ? NUMGroup.MeasuredValueSequence.NumericValue - : null - } - }, + cachedStats, frameNumber: ReferencedFrameNumber }; - - return state; - } - - static getMeasurementDataFromScoord3D({ SCOORD3DGroup, defaultState }) { - const { GraphicData } = SCOORD3DGroup; - const worldCoords = []; - for (let i = 0; i < GraphicData.length; i += 3) { - const point = [ - GraphicData[i], - GraphicData[i + 1], - GraphicData[i + 2] - ]; - worldCoords.push(point); - } - - const state = defaultState; - - state.annotation.data = { - handles: { - points: [ - worldCoords[0], - worldCoords[1], - worldCoords[3], - worldCoords[2] - ], - activeHandleIndex: 0, - textBox: { - hasMoved: false - } - }, - cachedStats: {} - }; - return state; } static getTID300RepresentationArguments(tool, is3DMeasurement = false) { const { data, finding, findingSites, metadata } = tool; - const { cachedStats = {}, handles } = data; - const { referencedImageId } = metadata; + const { polyline, closed } = data.contour; + const isOpenContour = closed !== true; - if (is3DMeasurement) { - return this.getTID300RepresentationArgumentsSCOORD3D(tool); - } - - //Using image coordinates for 2D points - const corners = handles.points.map(point => - worldToImageCoords(referencedImageId, point) - ); - - const { area, perimeter } = cachedStats; - - return { - points: [ - corners[0], - corners[1], - corners[3], - corners[2], - corners[0] - ], - area, - perimeter, - trackingIdentifierTextValue: this.trackingIdentifierTextValue, - finding, - findingSites: findingSites || [], - use3DSpatialCoordinates: false + const { referencedImageId } = metadata; + const scoordProps = { + is3DMeasurement, + referencedImageId }; - } - static getTID300RepresentationArgumentsSCOORD3D(tool) { - const { data, finding, findingSites, metadata } = tool; - const { cachedStats = {}, handles } = data; + const corners = toScoords(scoordProps, polyline); - //Using world coordinates for 3D points - const corners = handles.points; - - const { area, perimeter } = cachedStats; + const { area, perimeter } = + data.cachedStats[`imageId:${referencedImageId}`] || {}; return { points: [ @@ -188,8 +86,7 @@ class RectangleROI extends BaseAdapter3D { trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [], - ReferencedFrameOfReferenceUID: metadata.FrameOfReferenceUID, - use3DSpatialCoordinates: true + use3DSpatialCoordinates: false }; } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts b/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts index be0fffef34..46ef4f520a 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts @@ -12,38 +12,22 @@ class UltrasoundDirectional extends BaseAdapter3D { } // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport. static getMeasurementData( - MeasurementGroup, + measurementGroup, sopInstanceUIDToImageIdMap, - imageToWorldCoords, metadata ) { - const { defaultState, SCOORDGroup, ReferencedFrameNumber } = + const { state, worldCoords, ReferencedFrameNumber } = MeasurementReport.getSetupMeasurementData( - MeasurementGroup, + measurementGroup, sopInstanceUIDToImageIdMap, metadata, - UltrasoundDirectional.toolType + this.toolType ); - const referencedImageId = - defaultState.annotation.metadata.referencedImageId; - - const { GraphicData } = SCOORDGroup; - const worldCoords = []; - for (let i = 0; i < (GraphicData as number[]).length; i += 2) { - const point = imageToWorldCoords(referencedImageId, [ - GraphicData[i], - GraphicData[i + 1] - ]); - worldCoords.push(point); - } - - const state = defaultState; - state.annotation.data = { ...state.annotation.data, handles: { - points: [worldCoords[0], worldCoords[1]], + points: worldCoords, activeHandleIndex: 0, textBox: { hasMoved: false diff --git a/packages/adapters/src/adapters/helpers/toArray.ts b/packages/adapters/src/adapters/helpers/toArray.ts index e91a900928..7a45047cba 100644 --- a/packages/adapters/src/adapters/helpers/toArray.ts +++ b/packages/adapters/src/adapters/helpers/toArray.ts @@ -1,3 +1,3 @@ -const toArray = x => (Array.isArray(x) ? x : [x]); +const toArray = x => (Array.isArray(x) ? x : x !== undefined ? [x] : []); export { toArray }; From e59b216aec73e7b61c016250de23f5cb6adf5f6d Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 18 Jul 2025 12:10:00 +0000 Subject: [PATCH 083/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 34870fa2db..7bbef6aa03 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -eabaff6c9288c6122573e0f8347dd8391ebc04ee \ No newline at end of file +9b3fd227c11d78e7cc3fbddcfb8926e8a22572fc \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 4e57e15f57..452cbb6d1e 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.4", - "@cornerstonejs/tools": "^3.31.4" + "@cornerstonejs/core": "^3.31.5", + "@cornerstonejs/tools": "^3.31.5" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index ee5f514ebf..b3a8b305f6 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.4", - "@cornerstonejs/tools": "^3.31.4" + "@cornerstonejs/core": "^3.31.5", + "@cornerstonejs/tools": "^3.31.5" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 1ff187ccf3..d3f9504e3e 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.4", + "@cornerstonejs/core": "^3.31.5", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 195ab3046a..18f5772a01 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.4", - "@cornerstonejs/core": "^3.31.4", - "@cornerstonejs/dicom-image-loader": "^3.31.4", - "@cornerstonejs/nifti-volume-loader": "^3.31.4", - "@cornerstonejs/tools": "^3.31.4", + "@cornerstonejs/adapters": "^3.31.5", + "@cornerstonejs/core": "^3.31.5", + "@cornerstonejs/dicom-image-loader": "^3.31.5", + "@cornerstonejs/nifti-volume-loader": "^3.31.5", + "@cornerstonejs/tools": "^3.31.5", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 8260e2dd86..882a346192 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.4", - "@cornerstonejs/tools": "^3.31.4", + "@cornerstonejs/core": "^3.31.5", + "@cornerstonejs/tools": "^3.31.5", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index aafefebe36..ad3cb7ffe3 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.4" + "@cornerstonejs/core": "^3.31.5" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 9650faffde..2fa78f08a8 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.4", - "@cornerstonejs/tools": "^3.31.4", + "@cornerstonejs/core": "^3.31.5", + "@cornerstonejs/tools": "^3.31.5", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index d3f49ecf85..c62fa2d67b 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.4", + "@cornerstonejs/core": "^3.31.5", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 8079c3d038..1ec03cd638 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.4", - "commit": "eabaff6c9288c6122573e0f8347dd8391ebc04ee" + "version": "3.31.5", + "commit": "9b3fd227c11d78e7cc3fbddcfb8926e8a22572fc" } \ No newline at end of file diff --git a/version.txt b/version.txt index 5ab1f4a289..4a3a2c19e0 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.4 \ No newline at end of file +3.31.5 \ No newline at end of file From 4c3d0704da4e4a88f9c913422193db6c19c7b4c9 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 18 Jul 2025 12:10:19 +0000 Subject: [PATCH 084/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 6 ++++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 355f40333b..21cf742c3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) + +### Bug Fixes + +- adapter should be able to convert all the types, including points ([#2211](https://github.com/cornerstonejs/cornerstone3D/issues/2211)) ([9b3fd22](https://github.com/cornerstonejs/cornerstone3D/commit/9b3fd227c11d78e7cc3fbddcfb8926e8a22572fc)) + ## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 063aa9be52..8606b2b923 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.4", + "version": "3.31.5", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 23a7591f31..062ac74ac7 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) + +### Bug Fixes + +- adapter should be able to convert all the types, including points ([#2211](https://github.com/cornerstonejs/cornerstone3D/issues/2211)) ([9b3fd22](https://github.com/cornerstonejs/cornerstone3D/commit/9b3fd227c11d78e7cc3fbddcfb8926e8a22572fc)) + ## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 452cbb6d1e..43a699e4ff 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.4", + "version": "3.31.5", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 414ab86d6a..e06e802e53 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index b3a8b305f6..a6b7289b95 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.4", + "version": "3.31.5", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 5b5c799936..75aa137650 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 801a4389b6..5f1d5bb226 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.4", + "version": "3.31.5", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 9017c4e427..db5d3dfb54 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index d3f9504e3e..8395da6dee 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.4", + "version": "3.31.5", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 61865f1c24..ad7221acbc 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 882a346192..9e56c63116 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.4", + "version": "3.31.5", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index bca430ea68..65adb4dc9c 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index ad3cb7ffe3..0087199330 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.4", + "version": "3.31.5", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 07f47dee47..a5ff5fd642 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 2fa78f08a8..fa102858cb 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.4", + "version": "3.31.5", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 23fc96379c..e61ba7b6f6 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index c62fa2d67b..47d878dd00 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.4", + "version": "3.31.5", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 014f4c4cc2b973b200ec9af2e16783464b9a2a0d Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 18 Jul 2025 12:10:30 +0000 Subject: [PATCH 085/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index baaa486b7d..124cdc8b9b 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.4"; +export const version = "3.31.5"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 9e4ebc51d4..9a57f3404a 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.4'; +export const version = '3.31.5'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 9e4ebc51d4..9a57f3404a 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.4'; +export const version = '3.31.5'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 9e4ebc51d4..9a57f3404a 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.4'; +export const version = '3.31.5'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 9e4ebc51d4..9a57f3404a 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.4'; +export const version = '3.31.5'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 9e4ebc51d4..9a57f3404a 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.4'; +export const version = '3.31.5'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 9e4ebc51d4..9a57f3404a 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.4'; +export const version = '3.31.5'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 9e4ebc51d4..9a57f3404a 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.4'; +export const version = '3.31.5'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 9e4ebc51d4..9a57f3404a 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.4'; +export const version = '3.31.5'; From 4ac725e94729f12ed21f471a6bffe30fea0b5296 Mon Sep 17 00:00:00 2001 From: Bill Wallace Date: Fri, 18 Jul 2025 10:14:47 -0400 Subject: [PATCH 086/212] fix(probe): rehydrate (#2214) * fix: Apply MPR to other types * fix: Load other measurement types * fix: Probe rehydration was failing on some samples --- packages/adapters/src/adapters/Cornerstone3D/Probe.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/adapters/src/adapters/Cornerstone3D/Probe.ts b/packages/adapters/src/adapters/Cornerstone3D/Probe.ts index 993b6bbaa5..7bb60f9348 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Probe.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Probe.ts @@ -45,9 +45,7 @@ class Probe extends BaseAdapter3D { const cachedStats = referencedImageId ? { [`imageId:${referencedImageId}`]: { - length: NUMGroup - ? NUMGroup.MeasuredValueSequence.NumericValue - : 0 + length: NUMGroup?.MeasuredValueSequence?.NumericValue || 0 } } : {}; From 68e807d24f5f5080c1fcc5b7de736b5d404152f9 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 18 Jul 2025 14:19:50 +0000 Subject: [PATCH 087/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 7bbef6aa03..945d5b7f73 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -9b3fd227c11d78e7cc3fbddcfb8926e8a22572fc \ No newline at end of file +4ac725e94729f12ed21f471a6bffe30fea0b5296 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 43a699e4ff..cf8117eabc 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.5", - "@cornerstonejs/tools": "^3.31.5" + "@cornerstonejs/core": "^3.31.6", + "@cornerstonejs/tools": "^3.31.6" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index a6b7289b95..79c6629a3e 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.5", - "@cornerstonejs/tools": "^3.31.5" + "@cornerstonejs/core": "^3.31.6", + "@cornerstonejs/tools": "^3.31.6" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 8395da6dee..7b5c174760 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.5", + "@cornerstonejs/core": "^3.31.6", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 18f5772a01..1da242666b 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.5", - "@cornerstonejs/core": "^3.31.5", - "@cornerstonejs/dicom-image-loader": "^3.31.5", - "@cornerstonejs/nifti-volume-loader": "^3.31.5", - "@cornerstonejs/tools": "^3.31.5", + "@cornerstonejs/adapters": "^3.31.6", + "@cornerstonejs/core": "^3.31.6", + "@cornerstonejs/dicom-image-loader": "^3.31.6", + "@cornerstonejs/nifti-volume-loader": "^3.31.6", + "@cornerstonejs/tools": "^3.31.6", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 9e56c63116..638f525087 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.5", - "@cornerstonejs/tools": "^3.31.5", + "@cornerstonejs/core": "^3.31.6", + "@cornerstonejs/tools": "^3.31.6", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 0087199330..69646f53aa 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.5" + "@cornerstonejs/core": "^3.31.6" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index fa102858cb..46d62a994c 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.5", - "@cornerstonejs/tools": "^3.31.5", + "@cornerstonejs/core": "^3.31.6", + "@cornerstonejs/tools": "^3.31.6", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 47d878dd00..b7fcf4f001 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.5", + "@cornerstonejs/core": "^3.31.6", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 1ec03cd638..a4cab5d482 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.5", - "commit": "9b3fd227c11d78e7cc3fbddcfb8926e8a22572fc" + "version": "3.31.6", + "commit": "4ac725e94729f12ed21f471a6bffe30fea0b5296" } \ No newline at end of file diff --git a/version.txt b/version.txt index 4a3a2c19e0..02938c1b81 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.5 \ No newline at end of file +3.31.6 \ No newline at end of file From 2c081170a65529fab8433e44e41984cb6fe568b2 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 18 Jul 2025 14:20:07 +0000 Subject: [PATCH 088/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 6 ++++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21cf742c3c..22f4f20c7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) + +### Bug Fixes + +- **probe:** rehydrate ([#2214](https://github.com/cornerstonejs/cornerstone3D/issues/2214)) ([4ac725e](https://github.com/cornerstonejs/cornerstone3D/commit/4ac725e94729f12ed21f471a6bffe30fea0b5296)) + ## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 8606b2b923..adf278fa78 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.5", + "version": "3.31.6", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 062ac74ac7..776817370b 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) + +### Bug Fixes + +- **probe:** rehydrate ([#2214](https://github.com/cornerstonejs/cornerstone3D/issues/2214)) ([4ac725e](https://github.com/cornerstonejs/cornerstone3D/commit/4ac725e94729f12ed21f471a6bffe30fea0b5296)) + ## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) ### Bug Fixes diff --git a/packages/adapters/package.json b/packages/adapters/package.json index cf8117eabc..d88430b5d0 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.5", + "version": "3.31.6", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index e06e802e53..4a88e28cc8 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 79c6629a3e..fb45cdf90e 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.5", + "version": "3.31.6", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 75aa137650..1ab94da320 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 5f1d5bb226..665ef7fc82 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.5", + "version": "3.31.6", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index db5d3dfb54..876c4bc017 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 7b5c174760..16baec19eb 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.5", + "version": "3.31.6", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index ad7221acbc..047c672379 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 638f525087..0183feea3a 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.5", + "version": "3.31.6", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 65adb4dc9c..50cb19218c 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 69646f53aa..119b307e31 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.5", + "version": "3.31.6", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index a5ff5fd642..e4580d8a2f 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 46d62a994c..f85918c504 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.5", + "version": "3.31.6", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index e61ba7b6f6..75be5167c6 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index b7fcf4f001..7d8124e095 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.5", + "version": "3.31.6", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From c9928e10622d93ec72e80243a9242da07b41e7e1 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 18 Jul 2025 14:20:17 +0000 Subject: [PATCH 089/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 124cdc8b9b..9e95133b04 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.5"; +export const version = "3.31.6"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 9a57f3404a..52b2c975d9 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.5'; +export const version = '3.31.6'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 9a57f3404a..52b2c975d9 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.5'; +export const version = '3.31.6'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 9a57f3404a..52b2c975d9 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.5'; +export const version = '3.31.6'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 9a57f3404a..52b2c975d9 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.5'; +export const version = '3.31.6'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 9a57f3404a..52b2c975d9 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.5'; +export const version = '3.31.6'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 9a57f3404a..52b2c975d9 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.5'; +export const version = '3.31.6'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 9a57f3404a..52b2c975d9 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.5'; +export const version = '3.31.6'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 9a57f3404a..52b2c975d9 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.5'; +export const version = '3.31.6'; From 82752d5d442f829e2718a68ecfbb31e7d8207ad7 Mon Sep 17 00:00:00 2001 From: Joe Boccanfuso <109477394+jbocce@users.noreply.github.com> Date: Mon, 21 Jul 2025 10:15:56 -0400 Subject: [PATCH 090/212] fix(security): Pin the versions of eslint-plugin-prettier and eslint-config-prettier. (#2217) * fix(security): Pin eslint-plugin-prettier and eslint-config-prettier versions. * Added yarn.lock --- bun.lock | 22 +++++++++++----------- package.json | 6 +++--- yarn.lock | 45 ++++++++++----------------------------------- 3 files changed, 24 insertions(+), 49 deletions(-) diff --git a/bun.lock b/bun.lock index dcbfe7535f..d8594ddbab 100644 --- a/bun.lock +++ b/bun.lock @@ -59,11 +59,11 @@ "docdash": "^1.2.0", "dpdm": "^3.14.0", "eslint": "^8.39.0", - "eslint-config-prettier": "^8.8.0", + "eslint-config-prettier": "8.10.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsx-a11y": "6.7.1", - "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-prettier": "4.2.1", "eslint-plugin-tsdoc": "^0.2.17", "eslint-webpack-plugin": "^4.0.1", "execa": "^7.2.0", @@ -100,7 +100,7 @@ "postcss-import": "^15.1.0", "postcss-loader": "^7.3.0", "postcss-preset-env": "^8.3.2", - "prettier": "^2.8.8", + "prettier": "2.8.8", "puppeteer": "^13.5.0", "resemblejs": "^5.0.0", "rollup": "^3.21.3", @@ -136,7 +136,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "3.31.0", + "version": "3.31.6", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -151,7 +151,7 @@ }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "3.31.0", + "version": "3.31.6", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -169,7 +169,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "3.31.0", + "version": "3.31.6", "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", @@ -179,7 +179,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.0", + "version": "3.31.6", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -198,7 +198,7 @@ }, "packages/labelmap-interpolation": { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.0", + "version": "3.31.6", "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165", @@ -211,7 +211,7 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.0", + "version": "3.31.6", "dependencies": { "nifti-reader-js": "^0.6.8", }, @@ -221,7 +221,7 @@ }, "packages/polymorphic-segmentation": { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.0", + "version": "3.31.6", "dependencies": { "@icr/polyseg-wasm": "0.4.0", }, @@ -233,7 +233,7 @@ }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "3.31.0", + "version": "3.31.6", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", diff --git a/package.json b/package.json index 26e17c560d..958c3f1ae7 100644 --- a/package.json +++ b/package.json @@ -115,11 +115,11 @@ "docdash": "^1.2.0", "dpdm": "^3.14.0", "eslint": "^8.39.0", - "eslint-config-prettier": "^8.8.0", + "eslint-config-prettier": "8.10.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsx-a11y": "6.7.1", - "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-prettier": "4.2.1", "eslint-plugin-tsdoc": "^0.2.17", "eslint-webpack-plugin": "^4.0.1", "execa": "^7.2.0", @@ -156,7 +156,7 @@ "postcss-import": "^15.1.0", "postcss-loader": "^7.3.0", "postcss-preset-env": "^8.3.2", - "prettier": "^2.8.8", + "prettier": "2.8.8", "puppeteer": "^13.5.0", "resemblejs": "^5.0.0", "rollup": "^3.21.3", diff --git a/yarn.lock b/yarn.lock index 7a0450b0b9..e28563e815 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7606,10 +7606,10 @@ dcmjs@^0.29.8: ndarray "^1.0.19" pako "^2.0.4" -dcmjs@^0.42.0: - version "0.42.0" - resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.42.0.tgz#40a41330ccb00bd2a37f4ed4552874c45975489a" - integrity sha512-N/SXIzMvAjDRgb8vC8G7DP/2BI1QKpa3TwY47Ok34g5y6ZKIcpAR3sf+Y+OBWkQxvnCTncB6B4tkq/ih8xjmXA== +dcmjs@^0.43.1: + version "0.43.1" + resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.43.1.tgz#03223e56d52e9ec2c3b8c10afe9200d754befe62" + integrity sha512-7IAB2cs2F8QYINbfhA7PV+IDraqBuHn8N31xJc6HsyNxZXyGUPQRujcq732ACqjLhl7oJi1z8PJJgLdblQtD3Q== dependencies: "@babel/runtime-corejs3" "^7.22.5" adm-zip "^0.5.10" @@ -8673,7 +8673,7 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@^8.8.0: +eslint-config-prettier@8.10.0: version "8.10.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== @@ -8752,7 +8752,7 @@ eslint-plugin-jsx-a11y@6.7.1: object.fromentries "^2.0.6" semver "^6.3.0" -eslint-plugin-prettier@^4.2.1: +eslint-plugin-prettier@4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== @@ -16216,7 +16216,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.8.8: +prettier@2.8.8: version "2.8.8" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== @@ -18033,16 +18033,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -18127,7 +18118,7 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -18153,13 +18144,6 @@ strip-ansi@^5.1.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.0, strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -19983,7 +19967,7 @@ workerpool@^6.5.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -20001,15 +19985,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From eeebd2c93b3f3b5eeb7efe0d70e15c97fbbf30f8 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 21 Jul 2025 14:19:30 +0000 Subject: [PATCH 091/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 945d5b7f73..3a0b8bacb0 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -4ac725e94729f12ed21f471a6bffe30fea0b5296 \ No newline at end of file +82752d5d442f829e2718a68ecfbb31e7d8207ad7 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index d88430b5d0..df442c5567 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.6", - "@cornerstonejs/tools": "^3.31.6" + "@cornerstonejs/core": "^3.31.7", + "@cornerstonejs/tools": "^3.31.7" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index fb45cdf90e..ca1dbcdee9 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.6", - "@cornerstonejs/tools": "^3.31.6" + "@cornerstonejs/core": "^3.31.7", + "@cornerstonejs/tools": "^3.31.7" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 16baec19eb..84c5245925 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.6", + "@cornerstonejs/core": "^3.31.7", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 1da242666b..4c7bb7860d 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.6", - "@cornerstonejs/core": "^3.31.6", - "@cornerstonejs/dicom-image-loader": "^3.31.6", - "@cornerstonejs/nifti-volume-loader": "^3.31.6", - "@cornerstonejs/tools": "^3.31.6", + "@cornerstonejs/adapters": "^3.31.7", + "@cornerstonejs/core": "^3.31.7", + "@cornerstonejs/dicom-image-loader": "^3.31.7", + "@cornerstonejs/nifti-volume-loader": "^3.31.7", + "@cornerstonejs/tools": "^3.31.7", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 0183feea3a..68d40f1753 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.6", - "@cornerstonejs/tools": "^3.31.6", + "@cornerstonejs/core": "^3.31.7", + "@cornerstonejs/tools": "^3.31.7", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 119b307e31..65d9047a72 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.6" + "@cornerstonejs/core": "^3.31.7" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index f85918c504..89500e5e83 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.6", - "@cornerstonejs/tools": "^3.31.6", + "@cornerstonejs/core": "^3.31.7", + "@cornerstonejs/tools": "^3.31.7", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 7d8124e095..fcb8ec5c78 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.6", + "@cornerstonejs/core": "^3.31.7", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index a4cab5d482..5d0711f2a0 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.6", - "commit": "4ac725e94729f12ed21f471a6bffe30fea0b5296" + "version": "3.31.7", + "commit": "82752d5d442f829e2718a68ecfbb31e7d8207ad7" } \ No newline at end of file diff --git a/version.txt b/version.txt index 02938c1b81..c15a9ad8a2 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.6 \ No newline at end of file +3.31.7 \ No newline at end of file From e4eb6e16f35cf14cd854b970e1626e463070be04 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 21 Jul 2025 14:19:50 +0000 Subject: [PATCH 092/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 47 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22f4f20c7d..06fff7742a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) + +### Bug Fixes + +- **security:** Pin the versions of eslint-plugin-prettier and eslint-config-prettier. ([#2217](https://github.com/cornerstonejs/cornerstone3D/issues/2217)) ([82752d5](https://github.com/cornerstonejs/cornerstone3D/commit/82752d5d442f829e2718a68ecfbb31e7d8207ad7)) + ## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) ### Bug Fixes diff --git a/lerna.json b/lerna.json index adf278fa78..0415b32899 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.6", + "version": "3.31.7", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 776817370b..877357f4d9 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) ### Bug Fixes diff --git a/packages/adapters/package.json b/packages/adapters/package.json index df442c5567..b4405011db 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.6", + "version": "3.31.7", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 4a88e28cc8..5393493f6d 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index ca1dbcdee9..80608325af 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.6", + "version": "3.31.7", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 1ab94da320..8f632f45d5 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 665ef7fc82..925e8fbaf5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.6", + "version": "3.31.7", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 876c4bc017..9f5f5d6d08 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 84c5245925..f95a5f1a4f 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.6", + "version": "3.31.7", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 047c672379..77c8d23e6e 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 68d40f1753..1fab84728c 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.6", + "version": "3.31.7", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 50cb19218c..5e97c001cc 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 65d9047a72..6efc7c89cc 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.6", + "version": "3.31.7", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index e4580d8a2f..9b08a8df29 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 89500e5e83..1a655b86f7 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.6", + "version": "3.31.7", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 75be5167c6..5f85bb8ad5 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.31.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.5...v3.31.6) (2025-07-18) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index fcb8ec5c78..f259dee22d 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.6", + "version": "3.31.7", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 9df1f5858566c0b12f807aee7b3ee8ceb0ad43fd Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 21 Jul 2025 14:20:01 +0000 Subject: [PATCH 093/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 9e95133b04..a4fbd83651 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.6"; +export const version = "3.31.7"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 52b2c975d9..4e3789b6cb 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.6'; +export const version = '3.31.7'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 52b2c975d9..4e3789b6cb 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.6'; +export const version = '3.31.7'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 52b2c975d9..4e3789b6cb 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.6'; +export const version = '3.31.7'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 52b2c975d9..4e3789b6cb 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.6'; +export const version = '3.31.7'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 52b2c975d9..4e3789b6cb 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.6'; +export const version = '3.31.7'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 52b2c975d9..4e3789b6cb 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.6'; +export const version = '3.31.7'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 52b2c975d9..4e3789b6cb 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.6'; +export const version = '3.31.7'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 52b2c975d9..4e3789b6cb 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.6'; +export const version = '3.31.7'; From f0e6802aad72475092824e88af8609d498ac3baf Mon Sep 17 00:00:00 2001 From: rodrigobasilio2022 <114958722+rodrigobasilio2022@users.noreply.github.com> Date: Tue, 22 Jul 2025 11:13:51 -0300 Subject: [PATCH 094/212] fix: local segmentation load (#2222) --- .../adapters/src/adapters/Cornerstone/Segmentation_4X.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js b/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js index 9e159dbfb4..9541f7fabc 100644 --- a/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js +++ b/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js @@ -1390,6 +1390,12 @@ export function getImageIdOfSourceImageBySourceImageSequence( /frames\/\d+/, `frames/${ReferencedFrameNumber}` ); + } else if (baseImageId.includes("dicomfile:")) { + // dicomfile base 1, despite having frame= + return baseImageId.replace( + /frame=\d+/, + `frame=${ReferencedFrameNumber}` + ); } else if (baseImageId.includes("frame=")) { return baseImageId.replace( /frame=\d+/, From 3e2f6f4a56114e8ee4d318a21329cfd2563613b3 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 14:17:48 +0000 Subject: [PATCH 095/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 3a0b8bacb0..24024dd01b 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -82752d5d442f829e2718a68ecfbb31e7d8207ad7 \ No newline at end of file +f0e6802aad72475092824e88af8609d498ac3baf \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index b4405011db..9e4460d1dd 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.7", - "@cornerstonejs/tools": "^3.31.7" + "@cornerstonejs/core": "^3.31.8", + "@cornerstonejs/tools": "^3.31.8" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 80608325af..367f02cb8e 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.7", - "@cornerstonejs/tools": "^3.31.7" + "@cornerstonejs/core": "^3.31.8", + "@cornerstonejs/tools": "^3.31.8" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index f95a5f1a4f..3b19d5cb71 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.7", + "@cornerstonejs/core": "^3.31.8", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 4c7bb7860d..7738e0f6c5 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.7", - "@cornerstonejs/core": "^3.31.7", - "@cornerstonejs/dicom-image-loader": "^3.31.7", - "@cornerstonejs/nifti-volume-loader": "^3.31.7", - "@cornerstonejs/tools": "^3.31.7", + "@cornerstonejs/adapters": "^3.31.8", + "@cornerstonejs/core": "^3.31.8", + "@cornerstonejs/dicom-image-loader": "^3.31.8", + "@cornerstonejs/nifti-volume-loader": "^3.31.8", + "@cornerstonejs/tools": "^3.31.8", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 1fab84728c..07ccc551ee 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.7", - "@cornerstonejs/tools": "^3.31.7", + "@cornerstonejs/core": "^3.31.8", + "@cornerstonejs/tools": "^3.31.8", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 6efc7c89cc..a53b0fb1b2 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.7" + "@cornerstonejs/core": "^3.31.8" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 1a655b86f7..2c9b510e0b 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.7", - "@cornerstonejs/tools": "^3.31.7", + "@cornerstonejs/core": "^3.31.8", + "@cornerstonejs/tools": "^3.31.8", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index f259dee22d..867964aa87 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.7", + "@cornerstonejs/core": "^3.31.8", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 5d0711f2a0..76e7137f02 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.7", - "commit": "82752d5d442f829e2718a68ecfbb31e7d8207ad7" + "version": "3.31.8", + "commit": "f0e6802aad72475092824e88af8609d498ac3baf" } \ No newline at end of file diff --git a/version.txt b/version.txt index c15a9ad8a2..ebaa25b646 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.7 \ No newline at end of file +3.31.8 \ No newline at end of file From 3ef8ca935ef75c91babf548003afa94d80c27e68 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 14:18:08 +0000 Subject: [PATCH 096/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 6 ++++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06fff7742a..11e4f8f866 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) + +### Bug Fixes + +- local segmentation load ([#2222](https://github.com/cornerstonejs/cornerstone3D/issues/2222)) ([f0e6802](https://github.com/cornerstonejs/cornerstone3D/commit/f0e6802aad72475092824e88af8609d498ac3baf)) + ## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 0415b32899..a3d66d1ca7 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.7", + "version": "3.31.8", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 877357f4d9..b8b8ea5ce9 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) + +### Bug Fixes + +- local segmentation load ([#2222](https://github.com/cornerstonejs/cornerstone3D/issues/2222)) ([f0e6802](https://github.com/cornerstonejs/cornerstone3D/commit/f0e6802aad72475092824e88af8609d498ac3baf)) + ## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 9e4460d1dd..23ced8a6f5 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.7", + "version": "3.31.8", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 5393493f6d..0e9a11f922 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 367f02cb8e..e4d42450c7 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.7", + "version": "3.31.8", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 8f632f45d5..5d991f1058 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 925e8fbaf5..48095147c6 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.7", + "version": "3.31.8", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 9f5f5d6d08..8b25c42dad 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 3b19d5cb71..52f55a9952 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.7", + "version": "3.31.8", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 77c8d23e6e..f387d16864 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 07ccc551ee..a1bff020a2 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.7", + "version": "3.31.8", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 5e97c001cc..39c9f38f86 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index a53b0fb1b2..cbe0454d1c 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.7", + "version": "3.31.8", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 9b08a8df29..ccf09a7a7a 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 2c9b510e0b..31b9687007 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.7", + "version": "3.31.8", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 5f85bb8ad5..fc37ec7a6a 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 867964aa87..094b507ded 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.7", + "version": "3.31.8", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 6673f0a1f565e0691cea5f82defff300a690b770 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 14:18:19 +0000 Subject: [PATCH 097/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index a4fbd83651..237a14471d 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.7"; +export const version = "3.31.8"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 4e3789b6cb..97aa156513 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.7'; +export const version = '3.31.8'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 4e3789b6cb..97aa156513 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.7'; +export const version = '3.31.8'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 4e3789b6cb..97aa156513 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.7'; +export const version = '3.31.8'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 4e3789b6cb..97aa156513 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.7'; +export const version = '3.31.8'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 4e3789b6cb..97aa156513 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.7'; +export const version = '3.31.8'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 4e3789b6cb..97aa156513 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.7'; +export const version = '3.31.8'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 4e3789b6cb..97aa156513 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.7'; +export const version = '3.31.8'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 4e3789b6cb..97aa156513 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.7'; +export const version = '3.31.8'; From 86c2af6c31802ea58b717cc46b722115a66361c4 Mon Sep 17 00:00:00 2001 From: Chris Nagy Date: Tue, 22 Jul 2025 16:25:08 +0200 Subject: [PATCH 098/212] fix: make undo/redo availability publicly accessible (#2220) --- .../core/src/utilities/historyMemo/index.ts | 8 +++++ .../core/test/utilities/historyMemo.jest.js | 36 ++++++++++++++++--- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/packages/core/src/utilities/historyMemo/index.ts b/packages/core/src/utilities/historyMemo/index.ts index 0343760317..b615663c6c 100644 --- a/packages/core/src/utilities/historyMemo/index.ts +++ b/packages/core/src/utilities/historyMemo/index.ts @@ -81,6 +81,14 @@ export class HistoryMemo { this.undoAvailable = 0; } + public get canUndo() { + return this.undoAvailable > 0; + } + + public get canRedo() { + return this.redoAvailable > 0; + } + /** * Undoes up to the given number of items off the ring. * If one is a group (array) item it will undo every item inside diff --git a/packages/core/test/utilities/historyMemo.jest.js b/packages/core/test/utilities/historyMemo.jest.js index 09ba58834d..4ceebff4a6 100644 --- a/packages/core/test/utilities/historyMemo.jest.js +++ b/packages/core/test/utilities/historyMemo.jest.js @@ -1,4 +1,4 @@ -import { DefaultHistoryMemo } from '../../src/utilities/historyMemo'; +import { HistoryMemo } from '../../src/utilities/historyMemo'; import { describe, it, expect } from '@jest/globals'; @@ -17,13 +17,39 @@ function createMemo(rememberState) { }; } +let historyMemo; +beforeEach(() => { + historyMemo = new HistoryMemo(); +}); + describe('HistoryMemo', function () { - it('Simple state remembering', () => { - DefaultHistoryMemo.push(state); + it('remembers state changes', () => { + historyMemo.push(state); state.testState = 1; - DefaultHistoryMemo.undo(); + + historyMemo.undo(); expect(state.testState).toBe(0); - DefaultHistoryMemo.redo(); + historyMemo.redo(); expect(state.testState).toBe(1); }); + + it('tracks undo/redo availability', () => { + expect(historyMemo.canUndo).toBe(false); + expect(historyMemo.canRedo).toBe(false); + + historyMemo.push(state); + state.testState = 1; + + expect(historyMemo.canUndo).toBe(true); + historyMemo.undo(); + expect(historyMemo.canRedo).toBe(true); + }); + + it('works with DefaultHistoryMemo', () => { + const defaultHistoryMemo = new HistoryMemo(); + defaultHistoryMemo.push(state); + expect(defaultHistoryMemo.canUndo).toBe(true); + defaultHistoryMemo.undo(); + expect(defaultHistoryMemo.canRedo).toBe(true); + }); }); From 49380fff333459144f9e9b9090e1174b61eb7231 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 14:29:01 +0000 Subject: [PATCH 099/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 24024dd01b..b5cdc54466 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -f0e6802aad72475092824e88af8609d498ac3baf \ No newline at end of file +86c2af6c31802ea58b717cc46b722115a66361c4 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 23ced8a6f5..737b9c63be 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.8", - "@cornerstonejs/tools": "^3.31.8" + "@cornerstonejs/core": "^3.31.9", + "@cornerstonejs/tools": "^3.31.9" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index e4d42450c7..020416cfd5 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.8", - "@cornerstonejs/tools": "^3.31.8" + "@cornerstonejs/core": "^3.31.9", + "@cornerstonejs/tools": "^3.31.9" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 52f55a9952..1d576660b2 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.8", + "@cornerstonejs/core": "^3.31.9", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 7738e0f6c5..41c8eb4a35 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.8", - "@cornerstonejs/core": "^3.31.8", - "@cornerstonejs/dicom-image-loader": "^3.31.8", - "@cornerstonejs/nifti-volume-loader": "^3.31.8", - "@cornerstonejs/tools": "^3.31.8", + "@cornerstonejs/adapters": "^3.31.9", + "@cornerstonejs/core": "^3.31.9", + "@cornerstonejs/dicom-image-loader": "^3.31.9", + "@cornerstonejs/nifti-volume-loader": "^3.31.9", + "@cornerstonejs/tools": "^3.31.9", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index a1bff020a2..0e8463e9b8 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.8", - "@cornerstonejs/tools": "^3.31.8", + "@cornerstonejs/core": "^3.31.9", + "@cornerstonejs/tools": "^3.31.9", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index cbe0454d1c..cc54e436ae 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.8" + "@cornerstonejs/core": "^3.31.9" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 31b9687007..096fe33bf9 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.8", - "@cornerstonejs/tools": "^3.31.8", + "@cornerstonejs/core": "^3.31.9", + "@cornerstonejs/tools": "^3.31.9", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 094b507ded..2350b0e001 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.8", + "@cornerstonejs/core": "^3.31.9", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 76e7137f02..568e64135a 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.8", - "commit": "f0e6802aad72475092824e88af8609d498ac3baf" + "version": "3.31.9", + "commit": "86c2af6c31802ea58b717cc46b722115a66361c4" } \ No newline at end of file diff --git a/version.txt b/version.txt index ebaa25b646..bc1b035945 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.8 \ No newline at end of file +3.31.9 \ No newline at end of file From c847a6fc391e6df875b08df3ac5fa5db95458fad Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 14:29:19 +0000 Subject: [PATCH 100/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11e4f8f866..38cbf249da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) + +### Bug Fixes + +- make undo/redo availability publicly accessible ([#2220](https://github.com/cornerstonejs/cornerstone3D/issues/2220)) ([86c2af6](https://github.com/cornerstonejs/cornerstone3D/commit/86c2af6c31802ea58b717cc46b722115a66361c4)) + ## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) ### Bug Fixes diff --git a/lerna.json b/lerna.json index a3d66d1ca7..2395401c69 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.8", + "version": "3.31.9", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index b8b8ea5ce9..e32da477a6 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) ### Bug Fixes diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 737b9c63be..2951184357 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.8", + "version": "3.31.9", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 0e9a11f922..f7f0d79b48 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 020416cfd5..898c8b10ac 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.8", + "version": "3.31.9", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 5d991f1058..573e3df5a2 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) + +### Bug Fixes + +- make undo/redo availability publicly accessible ([#2220](https://github.com/cornerstonejs/cornerstone3D/issues/2220)) ([86c2af6](https://github.com/cornerstonejs/cornerstone3D/commit/86c2af6c31802ea58b717cc46b722115a66361c4)) + ## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 48095147c6..76d0a0397c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.8", + "version": "3.31.9", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 8b25c42dad..a36b36a632 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 1d576660b2..de9dc836f8 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.8", + "version": "3.31.9", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index f387d16864..223180535e 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 0e8463e9b8..801300e36d 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.8", + "version": "3.31.9", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 39c9f38f86..1ded430395 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index cc54e436ae..103167cbcf 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.8", + "version": "3.31.9", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index ccf09a7a7a..da2529f37e 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 096fe33bf9..b9790fedee 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.8", + "version": "3.31.9", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index fc37ec7a6a..985a424f46 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.31.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.7...v3.31.8) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 2350b0e001..aee5e27180 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.8", + "version": "3.31.9", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 27ed50018c72f25068a48537dd87b827afece017 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 14:29:31 +0000 Subject: [PATCH 101/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 237a14471d..83a743afb5 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.8"; +export const version = "3.31.9"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 97aa156513..a751498f5e 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.8'; +export const version = '3.31.9'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 97aa156513..a751498f5e 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.8'; +export const version = '3.31.9'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 97aa156513..a751498f5e 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.8'; +export const version = '3.31.9'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 97aa156513..a751498f5e 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.8'; +export const version = '3.31.9'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 97aa156513..a751498f5e 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.8'; +export const version = '3.31.9'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 97aa156513..a751498f5e 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.8'; +export const version = '3.31.9'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 97aa156513..a751498f5e 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.8'; +export const version = '3.31.9'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 97aa156513..a751498f5e 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.8'; +export const version = '3.31.9'; From 926224e0fadbf7dcab8cc1beaab714da0582e326 Mon Sep 17 00:00:00 2001 From: rodrigobasilio2022 <114958722+rodrigobasilio2022@users.noreply.github.com> Date: Tue, 22 Jul 2025 12:49:30 -0300 Subject: [PATCH 102/212] fix: contour Examples (#2205) * Fix contour Examples * Defaults segmentIndex equals to 1 * Sets to default 1 only if there is not a segmentationIndex selected --- .../segmentation/internalAddSegmentationRepresentation.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/tools/src/stateManagement/segmentation/internalAddSegmentationRepresentation.ts b/packages/tools/src/stateManagement/segmentation/internalAddSegmentationRepresentation.ts index a5d90dd1c7..aeb03c6f7f 100644 --- a/packages/tools/src/stateManagement/segmentation/internalAddSegmentationRepresentation.ts +++ b/packages/tools/src/stateManagement/segmentation/internalAddSegmentationRepresentation.ts @@ -1,4 +1,3 @@ -import type { Types } from '@cornerstonejs/core'; import type { RenderingConfig, RepresentationPublicInput, @@ -9,6 +8,7 @@ import { SegmentationRepresentations } from '../../enums'; import { triggerSegmentationModified } from './triggerSegmentationEvents'; import { addColorLUT } from './addColorLUT'; import { defaultSegmentationStateManager } from './SegmentationStateManager'; +import { getActiveSegmentIndex, setActiveSegmentIndex } from './segmentIndex'; function internalAddSegmentationRepresentation( viewportId: string, @@ -29,6 +29,11 @@ function internalAddSegmentationRepresentation( renderingConfig ); + // If no active segment index is set, default to segment 1 + if (!getActiveSegmentIndex(segmentationId)) { + setActiveSegmentIndex(segmentationId, 1); // defaults to segment 1 + } + if (representationInput.type === SegmentationRepresentations.Contour) { triggerAnnotationRenderForViewportIds([viewportId]); } From 9e365696eace088cef93c535587ed506c1c40cb7 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 15:53:27 +0000 Subject: [PATCH 103/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index b5cdc54466..b02a57863f 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -86c2af6c31802ea58b717cc46b722115a66361c4 \ No newline at end of file +926224e0fadbf7dcab8cc1beaab714da0582e326 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 2951184357..92c986dd31 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.9", - "@cornerstonejs/tools": "^3.31.9" + "@cornerstonejs/core": "^3.31.10", + "@cornerstonejs/tools": "^3.31.10" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 898c8b10ac..45eb72a554 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.9", - "@cornerstonejs/tools": "^3.31.9" + "@cornerstonejs/core": "^3.31.10", + "@cornerstonejs/tools": "^3.31.10" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index de9dc836f8..8ef01b30cc 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.9", + "@cornerstonejs/core": "^3.31.10", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 41c8eb4a35..7992e172fe 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.9", - "@cornerstonejs/core": "^3.31.9", - "@cornerstonejs/dicom-image-loader": "^3.31.9", - "@cornerstonejs/nifti-volume-loader": "^3.31.9", - "@cornerstonejs/tools": "^3.31.9", + "@cornerstonejs/adapters": "^3.31.10", + "@cornerstonejs/core": "^3.31.10", + "@cornerstonejs/dicom-image-loader": "^3.31.10", + "@cornerstonejs/nifti-volume-loader": "^3.31.10", + "@cornerstonejs/tools": "^3.31.10", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 801300e36d..9949df869d 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.9", - "@cornerstonejs/tools": "^3.31.9", + "@cornerstonejs/core": "^3.31.10", + "@cornerstonejs/tools": "^3.31.10", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 103167cbcf..829d998076 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.9" + "@cornerstonejs/core": "^3.31.10" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index b9790fedee..4dc5201684 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.9", - "@cornerstonejs/tools": "^3.31.9", + "@cornerstonejs/core": "^3.31.10", + "@cornerstonejs/tools": "^3.31.10", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index aee5e27180..08aed09805 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.9", + "@cornerstonejs/core": "^3.31.10", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 568e64135a..826f3ec01b 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.9", - "commit": "86c2af6c31802ea58b717cc46b722115a66361c4" + "version": "3.31.10", + "commit": "926224e0fadbf7dcab8cc1beaab714da0582e326" } \ No newline at end of file diff --git a/version.txt b/version.txt index bc1b035945..77a07996a1 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.9 \ No newline at end of file +3.31.10 \ No newline at end of file From 86aa0108b05b3f4a1445cfa5891fdeae95e38ac3 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 15:53:46 +0000 Subject: [PATCH 104/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38cbf249da..94d84ad2a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) + +### Bug Fixes + +- contour Examples ([#2205](https://github.com/cornerstonejs/cornerstone3D/issues/2205)) ([926224e](https://github.com/cornerstonejs/cornerstone3D/commit/926224e0fadbf7dcab8cc1beaab714da0582e326)) + ## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 2395401c69..d6d4cf4399 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.9", + "version": "3.31.10", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index e32da477a6..4d15080f95 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 92c986dd31..cedd892c44 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.9", + "version": "3.31.10", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index f7f0d79b48..4f5d0f84ac 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 45eb72a554..63a1f531ee 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.9", + "version": "3.31.10", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 573e3df5a2..a304aaf6af 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 76d0a0397c..1a571d520c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.9", + "version": "3.31.10", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index a36b36a632..06eb39f527 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 8ef01b30cc..2ccdda6756 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.9", + "version": "3.31.10", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 223180535e..4e87c60a72 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 9949df869d..3478269dae 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.9", + "version": "3.31.10", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 1ded430395..0d5a425466 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 829d998076..5a21bf44ca 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.9", + "version": "3.31.10", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index da2529f37e..bcbc9c08a2 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 4dc5201684..0e52ad8e17 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.9", + "version": "3.31.10", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 985a424f46..de5857f5b7 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) + +### Bug Fixes + +- contour Examples ([#2205](https://github.com/cornerstonejs/cornerstone3D/issues/2205)) ([926224e](https://github.com/cornerstonejs/cornerstone3D/commit/926224e0fadbf7dcab8cc1beaab714da0582e326)) + ## [3.31.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.8...v3.31.9) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 08aed09805..d798c60123 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.9", + "version": "3.31.10", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From df57f1e6505d3e058dbe3d9715da2d2cba89fe5a Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 15:53:57 +0000 Subject: [PATCH 105/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 83a743afb5..b647f0e4fb 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.9"; +export const version = "3.31.10"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index a751498f5e..8c76bf407c 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.9'; +export const version = '3.31.10'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index a751498f5e..8c76bf407c 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.9'; +export const version = '3.31.10'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index a751498f5e..8c76bf407c 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.9'; +export const version = '3.31.10'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index a751498f5e..8c76bf407c 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.9'; +export const version = '3.31.10'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index a751498f5e..8c76bf407c 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.9'; +export const version = '3.31.10'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index a751498f5e..8c76bf407c 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.9'; +export const version = '3.31.10'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index a751498f5e..8c76bf407c 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.9'; +export const version = '3.31.10'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index a751498f5e..8c76bf407c 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.9'; +export const version = '3.31.10'; From e5382b4468118545fddec63cd6894d2e0920deb3 Mon Sep 17 00:00:00 2001 From: Ibrahim <93064150+IbrahimCSAE@users.noreply.github.com> Date: Tue, 22 Jul 2025 13:26:50 -0400 Subject: [PATCH 106/212] fix: remove tolerance (#2223) --- .../ContextPoolRenderingEngine.ts | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts b/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts index 459fd3ea7a..86d56b2a06 100644 --- a/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts +++ b/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts @@ -388,20 +388,12 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine { const offScreenCanvasWidth = viewportCanvas.width; const offScreenCanvasHeight = viewportCanvas.height; - // Check if dimensions have changed before resizing (with 2px tolerance) - const tolerance = 2; - - const widthDiff = Math.abs( + if ( // @ts-expect-error - offScreenCanvasContainer.width - offScreenCanvasWidth - ); - - const heightDiff = Math.abs( + offScreenCanvasContainer.height === offScreenCanvasHeight && // @ts-expect-error - offScreenCanvasContainer.height - offScreenCanvasHeight - ); - - if (widthDiff <= tolerance && heightDiff <= tolerance) { + offScreenCanvasContainer.width === offScreenCanvasWidth + ) { return; } From 22c5daed20ac7aa8ffb17f1d6fabf489498d43e4 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 17:30:38 +0000 Subject: [PATCH 107/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index b02a57863f..d700436d16 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -926224e0fadbf7dcab8cc1beaab714da0582e326 \ No newline at end of file +e5382b4468118545fddec63cd6894d2e0920deb3 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index cedd892c44..9864f479c6 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.10", - "@cornerstonejs/tools": "^3.31.10" + "@cornerstonejs/core": "^3.31.11", + "@cornerstonejs/tools": "^3.31.11" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 63a1f531ee..10e45fd24d 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.10", - "@cornerstonejs/tools": "^3.31.10" + "@cornerstonejs/core": "^3.31.11", + "@cornerstonejs/tools": "^3.31.11" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 2ccdda6756..899b17605b 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.10", + "@cornerstonejs/core": "^3.31.11", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 7992e172fe..2afe007f0b 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.10", - "@cornerstonejs/core": "^3.31.10", - "@cornerstonejs/dicom-image-loader": "^3.31.10", - "@cornerstonejs/nifti-volume-loader": "^3.31.10", - "@cornerstonejs/tools": "^3.31.10", + "@cornerstonejs/adapters": "^3.31.11", + "@cornerstonejs/core": "^3.31.11", + "@cornerstonejs/dicom-image-loader": "^3.31.11", + "@cornerstonejs/nifti-volume-loader": "^3.31.11", + "@cornerstonejs/tools": "^3.31.11", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 3478269dae..8b6f4c5b1a 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.10", - "@cornerstonejs/tools": "^3.31.10", + "@cornerstonejs/core": "^3.31.11", + "@cornerstonejs/tools": "^3.31.11", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 5a21bf44ca..12311ffb82 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.10" + "@cornerstonejs/core": "^3.31.11" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 0e52ad8e17..fb172a7e92 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.10", - "@cornerstonejs/tools": "^3.31.10", + "@cornerstonejs/core": "^3.31.11", + "@cornerstonejs/tools": "^3.31.11", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index d798c60123..ce9f1936dc 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.10", + "@cornerstonejs/core": "^3.31.11", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 826f3ec01b..0037f4d3e6 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.10", - "commit": "926224e0fadbf7dcab8cc1beaab714da0582e326" + "version": "3.31.11", + "commit": "e5382b4468118545fddec63cd6894d2e0920deb3" } \ No newline at end of file diff --git a/version.txt b/version.txt index 77a07996a1..8793b8daa9 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.10 \ No newline at end of file +3.31.11 \ No newline at end of file From 1ec337c69937b666e9e9ad4ed17238ddd678679d Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 17:30:55 +0000 Subject: [PATCH 108/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94d84ad2a1..965bc61e31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) + +### Bug Fixes + +- remove tolerance ([#2223](https://github.com/cornerstonejs/cornerstone3D/issues/2223)) ([e5382b4](https://github.com/cornerstonejs/cornerstone3D/commit/e5382b4468118545fddec63cd6894d2e0920deb3)) + ## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) ### Bug Fixes diff --git a/lerna.json b/lerna.json index d6d4cf4399..3c8fef29f7 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.10", + "version": "3.31.11", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 4d15080f95..bc9e6bb706 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 9864f479c6..301d061b94 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.10", + "version": "3.31.11", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 4f5d0f84ac..2a2685a5da 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 10e45fd24d..9b58528ebb 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.10", + "version": "3.31.11", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index a304aaf6af..96bd3d289e 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) + +### Bug Fixes + +- remove tolerance ([#2223](https://github.com/cornerstonejs/cornerstone3D/issues/2223)) ([e5382b4](https://github.com/cornerstonejs/cornerstone3D/commit/e5382b4468118545fddec63cd6894d2e0920deb3)) + ## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 1a571d520c..46e350cafd 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.10", + "version": "3.31.11", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 06eb39f527..24af3061d7 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 899b17605b..4ae250dd03 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.10", + "version": "3.31.11", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 4e87c60a72..2e55a26436 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 8b6f4c5b1a..146acf6705 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.10", + "version": "3.31.11", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 0d5a425466..6eccc25c99 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 12311ffb82..478bdc186b 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.10", + "version": "3.31.11", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index bcbc9c08a2..fe0f79b85a 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index fb172a7e92..36b54521fd 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.10", + "version": "3.31.11", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index de5857f5b7..b6292eac95 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.31.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.9...v3.31.10) (2025-07-22) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index ce9f1936dc..6101bd2859 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.10", + "version": "3.31.11", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From ef652d1dc272c927ac5ad55dd460972bf765d0df Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 17:31:06 +0000 Subject: [PATCH 109/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index b647f0e4fb..9f38481b06 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.10"; +export const version = "3.31.11"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 8c76bf407c..be37a0b19c 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.10'; +export const version = '3.31.11'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 8c76bf407c..be37a0b19c 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.10'; +export const version = '3.31.11'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 8c76bf407c..be37a0b19c 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.10'; +export const version = '3.31.11'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 8c76bf407c..be37a0b19c 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.10'; +export const version = '3.31.11'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 8c76bf407c..be37a0b19c 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.10'; +export const version = '3.31.11'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 8c76bf407c..be37a0b19c 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.10'; +export const version = '3.31.11'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 8c76bf407c..be37a0b19c 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.10'; +export const version = '3.31.11'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 8c76bf407c..be37a0b19c 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.10'; +export const version = '3.31.11'; From 3d5a8c3fa87a5eeb112b30775cb473a3924b0db7 Mon Sep 17 00:00:00 2001 From: rodrigobasilio2022 <114958722+rodrigobasilio2022@users.noreply.github.com> Date: Tue, 22 Jul 2025 15:02:08 -0300 Subject: [PATCH 110/212] fix: fill functions to work with oblique planes (#2210) --- .../segmentation/strategies/fillCircle.ts | 138 +++++++++++------- .../segmentation/strategies/fillRectangle.ts | 77 +++++----- .../segmentation/strategies/fillSphere.ts | 43 +++--- 3 files changed, 152 insertions(+), 106 deletions(-) diff --git a/packages/tools/src/tools/segmentation/strategies/fillCircle.ts b/packages/tools/src/tools/segmentation/strategies/fillCircle.ts index cc6e39f5d2..d5ab593796 100644 --- a/packages/tools/src/tools/segmentation/strategies/fillCircle.ts +++ b/packages/tools/src/tools/segmentation/strategies/fillCircle.ts @@ -2,10 +2,6 @@ import { vec3 } from 'gl-matrix'; import { utilities as csUtils } from '@cornerstonejs/core'; import type { Types } from '@cornerstonejs/core'; -import { - getCanvasEllipseCorners, - precalculatePointInEllipse, -} from '../../../utilities/math/ellipse'; import { getBoundingBoxAroundShapeIJK } from '../../../utilities/boundingBox'; import BrushStrategy from './BrushStrategy'; import type { Composition, InitializedOperationData } from './BrushStrategy'; @@ -16,6 +12,24 @@ import { pointInSphere } from '../../../utilities/math/sphere'; const { transformWorldToIndex, isEqual } = csUtils; +/** + * Returns the corners of an ellipse in canvas coordinates. + * The corners are returned in the order: topLeft, bottomRight, bottomLeft, topRight. + * + * @param canvasCoordinates - The coordinates of the ellipse in the canvas. + * @returns An array of four points representing the corners of the ellipse. + */ +export function getEllipseCornersFromCanvasCoordinates( + canvasCoordinates: CanvasCoordinates +): Array { + const [bottom, top, left, right] = canvasCoordinates; + const topLeft = [left[0], top[1]]; + const bottomRight = [right[0], bottom[1]]; + const bottomLeft = [left[0], bottom[1]]; + const topRight = [right[0], top[1]]; + return [topLeft, bottomRight, bottomLeft, topRight]; +} + const initializeCircle = { [StrategyCallbacks.Initialize]: (operationData: InitializedOperationData) => { const { @@ -28,12 +42,17 @@ const initializeCircle = { if (!points) { return; } - // Average the points to get the center of the ellipse - const center = vec3.fromValues(0, 0, 0); - points.forEach((point) => { - vec3.add(center, center, point); - }); - vec3.scale(center, center, 1 / points.length); + + // Calculate the center as the midpoint between the first two points + // That calculation serves both for orthogonal and oblique planes + const center = vec3.create(); + if (points.length >= 2) { + vec3.add(center, points[0], points[1]); + vec3.scale(center, center, 0.5); + } else { + // Fallback to the first point if less than 2 points are provided + vec3.copy(center, points[0]); + } operationData.centerWorld = center as Types.Point3; operationData.centerIJK = transformWorldToIndex( @@ -45,15 +64,12 @@ const initializeCircle = { viewport.worldToCanvas(p) ) as CanvasCoordinates; - // 1. From the drawn tool: Get the ellipse (circle) topLeft and bottomRight - // corners in canvas coordinates - const [topLeftCanvas, bottomRightCanvas] = - getCanvasEllipseCorners(canvasCoordinates); - + // 1. From the drawn tool: Get the ellipse (circle) corners in canvas coordinates + const corners = getEllipseCornersFromCanvasCoordinates(canvasCoordinates); + const cornersInWorld = corners.map((corner) => + viewport.canvasToWorld(corner) + ); // 2. Find the extent of the ellipse (circle) in IJK index space of the image - const topLeftWorld = viewport.canvasToWorld(topLeftCanvas); - const bottomRightWorld = viewport.canvasToWorld(bottomRightCanvas); - const circleCornersIJK = points.map((world) => { return transformWorldToIndex(segmentationImageData, world); }); @@ -65,11 +81,8 @@ const initializeCircle = { segmentationImageData.getDimensions() ); - operationData.isInObject = createPointInEllipse({ - topLeftWorld, - bottomRightWorld, - center, - }); + // 3. Derives the ellipse function from the corners + operationData.isInObject = createPointInEllipse(cornersInWorld); operationData.isInObjectBoundsIJK = boundsIJK; }, @@ -83,23 +96,37 @@ const initializeCircle = { * sphere shape (same radius in two or three dimensions), or an elliptical shape * if they differ. */ -function createPointInEllipse(worldInfo: { - topLeftWorld: Types.Point3; - bottomRightWorld: Types.Point3; - center: Types.Point3 | vec3; -}) { - const { topLeftWorld, bottomRightWorld, center } = worldInfo; - - const xRadius = Math.abs(topLeftWorld[0] - bottomRightWorld[0]) / 2; - const yRadius = Math.abs(topLeftWorld[1] - bottomRightWorld[1]) / 2; - const zRadius = Math.abs(topLeftWorld[2] - bottomRightWorld[2]) / 2; - - const radius = Math.max(xRadius, yRadius, zRadius); - if ( - isEqual(xRadius, radius) && - isEqual(yRadius, radius) && - isEqual(zRadius, radius) - ) { +function createPointInEllipse(cornersInWorld: Types.Point3[] = []) { + if (!cornersInWorld || cornersInWorld.length !== 4) { + throw new Error('createPointInEllipse: cornersInWorld must have 4 points'); + } + const [topLeft, bottomRight, bottomLeft, topRight] = cornersInWorld; + + // Center is the midpoint of the diagonal + const center = vec3.create(); + vec3.add(center, topLeft, bottomRight); + vec3.scale(center, center, 0.5); + + // Major axis: from topLeft to topRight + const majorAxisVec = vec3.create(); + vec3.subtract(majorAxisVec, topRight, topLeft); + const xRadius = vec3.length(majorAxisVec) / 2; + vec3.normalize(majorAxisVec, majorAxisVec); + + // Minor axis: from topLeft to bottomLeft + const minorAxisVec = vec3.create(); + vec3.subtract(minorAxisVec, bottomLeft, topLeft); + const yRadius = vec3.length(minorAxisVec) / 2; + vec3.normalize(minorAxisVec, minorAxisVec); + + // Plane normal + const normal = vec3.create(); + vec3.cross(normal, majorAxisVec, minorAxisVec); + vec3.normalize(normal, normal); + + // If radii are equal, treat as sphere + if (isEqual(xRadius, yRadius)) { + const radius = xRadius; const sphereObj = { center, radius, @@ -107,16 +134,29 @@ function createPointInEllipse(worldInfo: { }; return (pointLPS) => pointInSphere(sphereObj, pointLPS); } - // using circle as a form of ellipse - const ellipseObj = { - center: center as Types.Point3, - xRadius, - yRadius, - zRadius, - }; - const { precalculated } = precalculatePointInEllipse(ellipseObj, {}); - return precalculated; + // Otherwise, treat as ellipse in oblique plane + return (pointLPS: Types.Point3) => { + // Project point onto the plane + const pointVec = vec3.create(); + vec3.subtract(pointVec, pointLPS, center); + // Remove component along normal + const distToPlane = vec3.dot(pointVec, normal); + const proj = vec3.create(); + vec3.scaleAndAdd(proj, pointVec, normal, -distToPlane); + + // Express proj in (majorAxis, minorAxis) coordinates + // Project from center, so shift origin to topLeft + const fromTopLeft = vec3.create(); + const centerToTopLeft = vec3.create(); + vec3.subtract(centerToTopLeft, center, topLeft); + vec3.subtract(fromTopLeft, proj, centerToTopLeft); + const x = vec3.dot(fromTopLeft, majorAxisVec); + const y = vec3.dot(fromTopLeft, minorAxisVec); + + // Ellipse equation: (x/xRadius)^2 + (y/yRadius)^2 <= 1 + return (x * x) / (xRadius * xRadius) + (y * y) / (yRadius * yRadius) <= 1; + }; } const CIRCLE_STRATEGY = new BrushStrategy( diff --git a/packages/tools/src/tools/segmentation/strategies/fillRectangle.ts b/packages/tools/src/tools/segmentation/strategies/fillRectangle.ts index 4513f18848..ddfe557f1a 100644 --- a/packages/tools/src/tools/segmentation/strategies/fillRectangle.ts +++ b/packages/tools/src/tools/segmentation/strategies/fillRectangle.ts @@ -2,14 +2,8 @@ import { vec3 } from 'gl-matrix'; import { utilities as csUtils, StackViewport } from '@cornerstonejs/core'; import type { Types, BaseVolumeViewport } from '@cornerstonejs/core'; -import { - getBoundingBoxAroundShapeIJK, - getBoundingBoxAroundShapeWorld, -} from '../../../utilities/boundingBox'; -import { triggerSegmentationDataModified } from '../../../stateManagement/segmentation/triggerSegmentationEvents'; +import { getBoundingBoxAroundShapeIJK } from '../../../utilities/boundingBox'; import type { LabelmapToolOperationData } from '../../../types'; -import { getStrategyData } from './utils/getStrategyData'; -import { isAxisAlignedRectangle } from '../../../utilities/rectangleROITool/isAxisAlignedRectangle'; import BrushStrategy from './BrushStrategy'; import type { Composition, InitializedOperationData } from './BrushStrategy'; import { StrategyCallbacks } from '../../../enums'; @@ -26,10 +20,8 @@ const initializeRectangle = { [StrategyCallbacks.Initialize]: (operationData: InitializedOperationData) => { const { points, // bottom, top, left, right - imageVoxelManager, viewport, segmentationImageData, - segmentationVoxelManager, } = operationData; // Happens on a preview setup @@ -91,19 +83,26 @@ function createPointInRectangle( segmentationImageData.getDimensions() ); - const isStackViewport = viewport instanceof StackViewport; - - // Are we working with 2D rectangle in axis aligned viewport view or not - const isAligned = - isStackViewport || isAxisAlignedRectangle(rectangleCornersIJK); - + // Rectangle corners in world: [topLeft, topRight, bottomRight, bottomLeft] + const [p0, p1, p2, p3] = points; + // Two axes in the plane + const axisU = vec3.create(); + const axisV = vec3.create(); + vec3.subtract(axisU, p1, p0); // p0 -> p1 + vec3.subtract(axisV, p3, p0); // p0 -> p3 + const uLen = vec3.length(axisU); + const vLen = vec3.length(axisV); + vec3.normalize(axisU, axisU); + vec3.normalize(axisV, axisV); + // Plane normal + const normal = vec3.create(); + vec3.cross(normal, axisU, axisV); + vec3.normalize(normal, normal); + + // For tolerance in the normal direction const direction = segmentationImageData.getDirection(); const spacing = segmentationImageData.getSpacing(); const { viewPlaneNormal } = viewport.getCamera(); - - // In case that we are working on oblique, our EPS is really the spacing in the - // normal direction, since we can't really test each voxel against a 2D rectangle - // we need some tolerance in the normal direction. const EPS = csUtils.getSpacingInNormalDirection( { direction, @@ -112,27 +111,25 @@ function createPointInRectangle( viewPlaneNormal ); - const pointsBoundsLPS = getBoundingBoxAroundShapeWorld(points); - let [[xMin, xMax], [yMin, yMax], [zMin, zMax]] = pointsBoundsLPS; - - // Update the bounds with +/- EPS - xMin -= EPS; - xMax += EPS; - yMin -= EPS; - yMax += EPS; - zMin -= EPS; - zMax += EPS; - - const pointInShapeFn = isAligned - ? () => true - : (pointLPS) => { - const [x, y, z] = pointLPS; - const xInside = x >= xMin && x <= xMax; - const yInside = y >= yMin && y <= yMax; - const zInside = z >= zMin && z <= zMax; - - return xInside && yInside && zInside; - }; + // Function to check if a point is inside the oblique rectangle + const pointInShapeFn = (pointLPS) => { + // Vector from p0 to point + const v = vec3.create(); + vec3.subtract(v, pointLPS, p0); + // Project onto axes + const u = vec3.dot(v, axisU); + const vproj = vec3.dot(v, axisV); + // Project onto normal + const d = Math.abs(vec3.dot(v, normal)); + // Check bounds with tolerance in normal direction + return ( + u >= -EPS && + u <= uLen + EPS && + vproj >= -EPS && + vproj <= vLen + EPS && + d <= EPS + ); + }; return { boundsIJK, pointInShapeFn }; } diff --git a/packages/tools/src/tools/segmentation/strategies/fillSphere.ts b/packages/tools/src/tools/segmentation/strategies/fillSphere.ts index 31b3327c82..59583c1b11 100644 --- a/packages/tools/src/tools/segmentation/strategies/fillSphere.ts +++ b/packages/tools/src/tools/segmentation/strategies/fillSphere.ts @@ -6,9 +6,13 @@ import BrushStrategy from './BrushStrategy'; import type { InitializedOperationData, Composition } from './BrushStrategy'; import compositions from './compositions'; import StrategyCallbacks from '../../../enums/StrategyCallbacks'; -import { createEllipseInPoint } from './fillCircle'; +import { + createEllipseInPoint, + getEllipseCornersFromCanvasCoordinates, +} from './fillCircle'; const { transformWorldToIndex } = csUtils; import { getSphereBoundsInfoFromViewport } from '../../../utilities/getSphereBoundsInfo'; +import type { CanvasCoordinates } from '../../../types'; const sphereComposition = { [StrategyCallbacks.Initialize]: (operationData: InitializedOperationData) => { @@ -18,12 +22,16 @@ const sphereComposition = { if (!points) { return; } - // Average the points to get the center of the ellipse - const center = vec3.fromValues(0, 0, 0); - points.forEach((point) => { - vec3.add(center, center, point); - }); - vec3.scale(center, center, 1 / points.length); + // Calculate the center as the midpoint between the first two points + // That calculation serves both for orthogonal and oblique planes + const center = vec3.create(); + if (points.length >= 2) { + vec3.add(center, points[0], points[1]); + vec3.scale(center, center, 0.5); + } else { + // Fallback to the first point if less than 2 points are provided + vec3.copy(center, points[0]); + } operationData.centerWorld = center as Types.Point3; operationData.centerIJK = transformWorldToIndex( @@ -31,22 +39,23 @@ const sphereComposition = { center as Types.Point3 ); - const { - boundsIJK: newBoundsIJK, - topLeftWorld, - bottomRightWorld, - } = getSphereBoundsInfoFromViewport( + const { boundsIJK: newBoundsIJK } = getSphereBoundsInfoFromViewport( points.slice(0, 2) as [Types.Point3, Types.Point3], segmentationImageData, viewport ); + const canvasCoordinates = points.map((p) => + viewport.worldToCanvas(p) + ) as CanvasCoordinates; + + // 1. From the drawn tool: Get the ellipse (circle) corners in canvas coordinates + const corners = getEllipseCornersFromCanvasCoordinates(canvasCoordinates); + const cornersInWorld = corners.map((corner) => + viewport.canvasToWorld(corner) + ); operationData.isInObjectBoundsIJK = newBoundsIJK; - operationData.isInObject = createEllipseInPoint({ - topLeftWorld, - bottomRightWorld, - center, - }); + operationData.isInObject = createEllipseInPoint(cornersInWorld); // } }, } as Composition; From 45e0306353d9ea72e88f94ccb018650c4987dcac Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 18:06:21 +0000 Subject: [PATCH 111/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index d700436d16..4b0cdeba10 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -e5382b4468118545fddec63cd6894d2e0920deb3 \ No newline at end of file +3d5a8c3fa87a5eeb112b30775cb473a3924b0db7 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 301d061b94..6b6777024d 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.11", - "@cornerstonejs/tools": "^3.31.11" + "@cornerstonejs/core": "^3.31.12", + "@cornerstonejs/tools": "^3.31.12" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 9b58528ebb..784a96e155 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.11", - "@cornerstonejs/tools": "^3.31.11" + "@cornerstonejs/core": "^3.31.12", + "@cornerstonejs/tools": "^3.31.12" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 4ae250dd03..7093dcca94 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.11", + "@cornerstonejs/core": "^3.31.12", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 2afe007f0b..47287110bf 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.11", - "@cornerstonejs/core": "^3.31.11", - "@cornerstonejs/dicom-image-loader": "^3.31.11", - "@cornerstonejs/nifti-volume-loader": "^3.31.11", - "@cornerstonejs/tools": "^3.31.11", + "@cornerstonejs/adapters": "^3.31.12", + "@cornerstonejs/core": "^3.31.12", + "@cornerstonejs/dicom-image-loader": "^3.31.12", + "@cornerstonejs/nifti-volume-loader": "^3.31.12", + "@cornerstonejs/tools": "^3.31.12", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 146acf6705..5d98e6ae5c 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.11", - "@cornerstonejs/tools": "^3.31.11", + "@cornerstonejs/core": "^3.31.12", + "@cornerstonejs/tools": "^3.31.12", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 478bdc186b..79923a5d96 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.11" + "@cornerstonejs/core": "^3.31.12" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 36b54521fd..85ae7edc5c 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.11", - "@cornerstonejs/tools": "^3.31.11", + "@cornerstonejs/core": "^3.31.12", + "@cornerstonejs/tools": "^3.31.12", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 6101bd2859..40330070b2 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.11", + "@cornerstonejs/core": "^3.31.12", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 0037f4d3e6..cb6dde6cde 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.11", - "commit": "e5382b4468118545fddec63cd6894d2e0920deb3" + "version": "3.31.12", + "commit": "3d5a8c3fa87a5eeb112b30775cb473a3924b0db7" } \ No newline at end of file diff --git a/version.txt b/version.txt index 8793b8daa9..a94a8b1d58 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.11 \ No newline at end of file +3.31.12 \ No newline at end of file From f293282b97c60f2330cf90150567151ded9cc854 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 18:06:39 +0000 Subject: [PATCH 112/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 965bc61e31..b680fb396a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) + +### Bug Fixes + +- fill functions to work with oblique planes ([#2210](https://github.com/cornerstonejs/cornerstone3D/issues/2210)) ([3d5a8c3](https://github.com/cornerstonejs/cornerstone3D/commit/3d5a8c3fa87a5eeb112b30775cb473a3924b0db7)) + ## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 3c8fef29f7..e9df18a56c 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.11", + "version": "3.31.12", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index bc9e6bb706..c2a310b63f 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 6b6777024d..f7f914b92b 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.11", + "version": "3.31.12", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 2a2685a5da..89835615d7 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 784a96e155..a0fa2e5379 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.11", + "version": "3.31.12", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 96bd3d289e..84dc0bf943 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 46e350cafd..37a3c8f92a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.11", + "version": "3.31.12", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 24af3061d7..013c9c44a3 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 7093dcca94..7b6064ef97 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.11", + "version": "3.31.12", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 2e55a26436..85dcb9f9d9 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 5d98e6ae5c..13548646f5 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.11", + "version": "3.31.12", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 6eccc25c99..3face463f1 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 79923a5d96..2d56df98cf 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.11", + "version": "3.31.12", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index fe0f79b85a..139b47aeee 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 85ae7edc5c..7bd434db6c 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.11", + "version": "3.31.12", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index b6292eac95..7d598b6668 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) + +### Bug Fixes + +- fill functions to work with oblique planes ([#2210](https://github.com/cornerstonejs/cornerstone3D/issues/2210)) ([3d5a8c3](https://github.com/cornerstonejs/cornerstone3D/commit/3d5a8c3fa87a5eeb112b30775cb473a3924b0db7)) + ## [3.31.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.10...v3.31.11) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 40330070b2..4b63357e7e 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.11", + "version": "3.31.12", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 56d8740d4fc313de859611b51e1d10b42cc6ffa1 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 22 Jul 2025 18:06:52 +0000 Subject: [PATCH 113/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index 9f38481b06..d88b74523f 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.11"; +export const version = "3.31.12"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index be37a0b19c..149f83149a 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.11'; +export const version = '3.31.12'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index be37a0b19c..149f83149a 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.11'; +export const version = '3.31.12'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index be37a0b19c..149f83149a 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.11'; +export const version = '3.31.12'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index be37a0b19c..149f83149a 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.11'; +export const version = '3.31.12'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index be37a0b19c..149f83149a 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.11'; +export const version = '3.31.12'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index be37a0b19c..149f83149a 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.11'; +export const version = '3.31.12'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index be37a0b19c..149f83149a 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.11'; +export const version = '3.31.12'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index be37a0b19c..149f83149a 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.11'; +export const version = '3.31.12'; From acb1446027950066ed9d8404ecbd27220f41f020 Mon Sep 17 00:00:00 2001 From: Bill Wallace Date: Wed, 23 Jul 2025 13:37:08 -0400 Subject: [PATCH 114/212] fix: Save label position and use valid DICOM for label text (#2224) --- .../adapters/Cornerstone/MeasurementReport.js | 12 +- .../src/adapters/Cornerstone3D/Angle.ts | 7 +- .../adapters/Cornerstone3D/ArrowAnnotate.ts | 19 +-- .../adapters/Cornerstone3D/Bidirectional.ts | 27 ++-- .../src/adapters/Cornerstone3D/CircleROI.ts | 9 +- .../src/adapters/Cornerstone3D/CobbAngle.ts | 7 +- .../adapters/Cornerstone3D/EllipticalROI.ts | 7 +- .../src/adapters/Cornerstone3D/LabelData.ts | 125 ++++++++++++++++++ .../src/adapters/Cornerstone3D/Length.ts | 8 +- .../Cornerstone3D/MeasurementReport.ts | 110 ++++++++++++--- .../Cornerstone3D/PlanarFreehandROI.ts | 11 +- .../src/adapters/Cornerstone3D/Probe.ts | 9 +- .../adapters/Cornerstone3D/RectangleROI.ts | 14 +- .../Cornerstone3D/UltrasoundDirectional.ts | 7 +- .../adapters/Cornerstone3D/constants/index.ts | 14 ++ .../src/adapters/Cornerstone3D/index.ts | 10 +- 16 files changed, 277 insertions(+), 119 deletions(-) create mode 100644 packages/adapters/src/adapters/Cornerstone3D/LabelData.ts diff --git a/packages/adapters/src/adapters/Cornerstone/MeasurementReport.js b/packages/adapters/src/adapters/Cornerstone/MeasurementReport.js index 6c8a9aea6a..fc596953dd 100644 --- a/packages/adapters/src/adapters/Cornerstone/MeasurementReport.js +++ b/packages/adapters/src/adapters/Cornerstone/MeasurementReport.js @@ -35,9 +35,9 @@ function getTID300ContentItem(tool, ReferencedSOPSequence, adapterClass) { const args = adapterClass.getTID300RepresentationArguments(tool); args.ReferencedSOPSequence = ReferencedSOPSequence; - const TID300Measurement = new adapterClass.TID300Representation(args); + const tid300Measurement = new adapterClass.TID300Representation(args); - return TID300Measurement; + return tid300Measurement; } function getMeasurementGroup(toolType, toolData, ReferencedSOPSequence) { @@ -55,11 +55,11 @@ function getMeasurementGroup(toolType, toolData, ReferencedSOPSequence) { // Loop through the array of tool instances // for this tool - const Measurements = toolTypeData.data.map(tool => { + const measurements = toolTypeData.data.map(tool => { return getTID300ContentItem(tool, ReferencedSOPSequence, toolClass); }); - return new TID1501MeasurementGroup(Measurements); + return new TID1501MeasurementGroup(measurements); } export default class MeasurementReport { @@ -184,7 +184,7 @@ export default class MeasurementReport { allMeasurementGroups.concat(measurementGroups); }); - const MeasurementReport = new TID1500MeasurementReport( + const tid1500MeasurementReport = new TID1500MeasurementReport( { TID1501MeasurementGroups: allMeasurementGroups }, options ); @@ -232,7 +232,7 @@ export default class MeasurementReport { const report = new StructuredReport([derivationSourceDataset]); - const contentItem = MeasurementReport.contentItem( + const contentItem = tid1500MeasurementReport.contentItem( derivationSourceDataset ); diff --git a/packages/adapters/src/adapters/Cornerstone3D/Angle.ts b/packages/adapters/src/adapters/Cornerstone3D/Angle.ts index 227447fd63..a0daf11495 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Angle.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Angle.ts @@ -42,11 +42,8 @@ class Angle extends BaseAdapter3D { state.annotation.data = { ...state.annotation.data, handles: { - points: worldCoords, - activeHandleIndex: 0, - textBox: { - hasMoved: false - } + ...state.annotation.data.handles, + points: worldCoords }, cachedStats, frameNumber: ReferencedFrameNumber diff --git a/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts b/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts index a4cf49ee49..94ae823386 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.ts @@ -25,7 +25,6 @@ class ArrowAnnotate extends BaseAdapter3D { const { state, SCOORDGroup, - scoordArgs, worldCoords, referencedImageId, ReferencedFrameNumber @@ -68,12 +67,9 @@ class ArrowAnnotate extends BaseAdapter3D { ...state.annotation.data, text, handles: { + ...state.annotation.data.handles, arrowFirst: true, - points: worldCoords, - activeHandleIndex: 0, - textBox: { - hasMoved: false - } + points: worldCoords }, frameNumber: ReferencedFrameNumber }; @@ -83,7 +79,7 @@ class ArrowAnnotate extends BaseAdapter3D { static getTID300RepresentationArguments(tool, is3DMeasurement = false) { const { data, metadata, findingSites } = tool; - let { finding } = tool; + const { finding } = tool; const { referencedImageId } = metadata; const scoordProps = { is3DMeasurement, @@ -110,15 +106,6 @@ class ArrowAnnotate extends BaseAdapter3D { use3DSpatialCoordinates: is3DMeasurement }; - // If freetext finding isn't present, add it from the tool text. - if (!finding || finding.CodeValue !== codeValues.CORNERSTONEFREETEXT) { - finding = { - CodeValue: codeValues.CORNERSTONEFREETEXT, - CodingSchemeDesignator: CodingScheme.CodingSchemeDesignator, - CodeMeaning: data.text - }; - } - return TID300RepresentationArguments; } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts b/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts index 95b88a52d1..db81626f43 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Bidirectional.ts @@ -19,19 +19,13 @@ class Bidirectional extends BaseAdapter3D { sopInstanceUIDToImageIdMap, metadata ) { - const { - state, - NUMGroup, - scoord, - scoordArgs, - referencedImageId, - ReferencedFrameNumber - } = MeasurementReport.getSetupMeasurementData( - MeasurementGroup, - sopInstanceUIDToImageIdMap, - metadata, - this.toolType - ); + const { state, scoordArgs, referencedImageId, ReferencedFrameNumber } = + MeasurementReport.getSetupMeasurementData( + MeasurementGroup, + sopInstanceUIDToImageIdMap, + metadata, + this.toolType + ); const { ContentSequence } = MeasurementGroup; @@ -64,16 +58,13 @@ class Bidirectional extends BaseAdapter3D { state.annotation.data = { ...state.annotation.data, handles: { + ...state.annotation.data.handles, points: [ worldCoords[0], worldCoords[1], worldCoords[2], worldCoords[3] - ], - activeHandleIndex: 0, - textBox: { - hasMoved: false - } + ] }, frameNumber: ReferencedFrameNumber }; diff --git a/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts b/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts index 543101b1da..3487c0bf87 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/CircleROI.ts @@ -20,8 +20,6 @@ class CircleROI extends BaseAdapter3D { const { state, NUMGroup, - scoord, - scoordArgs, worldCoords, referencedImageId, ReferencedFrameNumber @@ -35,11 +33,8 @@ class CircleROI extends BaseAdapter3D { state.annotation.data = { ...state.annotation.data, handles: { - points: worldCoords, - activeHandleIndex: 0, - textBox: { - hasMoved: false - } + ...state.annotation.data.handles, + points: worldCoords }, frameNumber: ReferencedFrameNumber }; diff --git a/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts b/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts index 89398520a5..511eb26395 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/CobbAngle.ts @@ -34,16 +34,13 @@ class CobbAngle extends BaseAdapter3D { state.annotation.data = { ...state.annotation.data, handles: { + ...state.annotation.data.handles, points: [ worldCoords[0], worldCoords[1], worldCoords[2], worldCoords[3] - ], - activeHandleIndex: 0, - textBox: { - hasMoved: false - } + ] }, frameNumber: ReferencedFrameNumber }; diff --git a/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts b/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts index 2fc3faf3ce..795fbe3307 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts @@ -35,11 +35,8 @@ class EllipticalROI extends BaseAdapter3D { state.annotation.data = { ...state.annotation.data, handles: { - points: worldCoords, - activeHandleIndex: 0, - textBox: { - hasMoved: false - } + ...state.annotation.data.handles, + points: worldCoords }, frameNumber: ReferencedFrameNumber }; diff --git a/packages/adapters/src/adapters/Cornerstone3D/LabelData.ts b/packages/adapters/src/adapters/Cornerstone3D/LabelData.ts new file mode 100644 index 0000000000..111b9e7d05 --- /dev/null +++ b/packages/adapters/src/adapters/Cornerstone3D/LabelData.ts @@ -0,0 +1,125 @@ +import type { Types } from "@cornerstonejs/tools"; +import { COMMENT_CODE, TEXT_ANNOTATION_POSITION } from "./constants"; +import { toScoord } from "../helpers"; +import dcmjs from "dcmjs"; + +const { + sr: { valueTypes, coding } +} = dcmjs; + +const CORNERSTONEFREETEXT = "CORNERSTONEFREETEXT"; + +/** + * Wrap a dcmjs TID.1501 content item creator with a label text/position store + * enhancements. + * THis removes the incorrect label text encoding inside finding sites, and + * adds it as a qualitative evaluation comment entry + * As well, if the position is included, it will be encoded as an SCOORD entry + * tagged to a private text annotation position value. + */ +export default class LabelData { + protected tid300Item; + protected annotation: Types.Annotation; + public ReferencedSOPSequence; + + constructor(tid300Item, annotation: Types.Annotation) { + this.tid300Item = tid300Item; + this.annotation = annotation; + this.ReferencedSOPSequence = tid300Item.ReferencedSOPSequence; + } + + /** + * This adds the additional information from the annotation data for + * the label data. + */ + public contentItem() { + const contentEntries = this.tid300Item.contentItem(); + const { label, handles } = this.annotation.data; + + if (label) { + contentEntries.push(this.createQualitativeLabel(label)); + this.filterCornerstoneFreeText(contentEntries); + } + if (handles?.textBox?.hasMoved) { + contentEntries.push( + this.createQualitativeLabelPosition(this.annotation) + ); + } + return contentEntries; + } + + /** + * Remove the incorrect finding sites entry for the text label. + */ + public filterCornerstoneFreeText(contentEntries) { + for (let i = 0; i < contentEntries.length; i++) { + const group = contentEntries[i]; + if (!group.ConceptCodeSequence) { + continue; + } + const csLabel = group.ConceptCodeSequence.find( + item => item.CodeValue === CORNERSTONEFREETEXT + ); + if (csLabel !== -1) { + group.ConceptCodeSequence.splice(csLabel, 1); + if (group.ConceptCodeSequence.length === 0) { + contentEntries.splice(i, 1); + } + return; + } + } + } + + /** + * This is the standard TID.1501 method to create a qualitative label + * comment. It returns the DCM:121106 comment code with the text value + * contained within the text. This allows for comments of up to 2^32-4 + * characters + */ + public createQualitativeLabel(label: string) { + const relationshipType = valueTypes.RelationshipTypes.CONTAINS; + return new valueTypes.TextContentItem({ + name: new coding.CodedConcept(COMMENT_CODE), + relationshipType, + value: label + }); + } + + /** + * Creates a qualitative evaluation text label position as an SCOORD (3D) + * position labelled with the text annotation position indicator. + */ + public createQualitativeLabelPosition(annotation: Types.Annotation) { + const { textBox } = annotation.data.handles; + const { referencedImageId, FrameOfReferenceUID: frameOfReferenceUID } = + annotation.metadata; + const is3DMeasurement = !referencedImageId; + const { worldPosition } = textBox; + const { x, y, z } = toScoord( + { is3DMeasurement, referencedImageId }, + worldPosition + ); + const graphicType = valueTypes.GraphicTypes.POINT; + const relationshipType = valueTypes.RelationshipTypes.CONTAINS; + const name = new coding.CodedConcept(TEXT_ANNOTATION_POSITION); + + if (is3DMeasurement) { + const graphicData = [x, y, z]; + return new valueTypes.Scoord3DContentItem({ + name, + relationshipType, + graphicType, + frameOfReferenceUID, + graphicData + }); + } + + const graphicData = [x, y]; + return new valueTypes.ScoordContentItem({ + name, + relationshipType, + graphicType, + graphicData + }); + } +} diff --git a/packages/adapters/src/adapters/Cornerstone3D/Length.ts b/packages/adapters/src/adapters/Cornerstone3D/Length.ts index 51a2cf21aa..15af533d67 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Length.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Length.ts @@ -23,8 +23,6 @@ export default class Length extends BaseAdapter3D { const { state, NUMGroup, - scoord, - scoordArgs, worldCoords, referencedImageId, ReferencedFrameNumber @@ -47,11 +45,9 @@ export default class Length extends BaseAdapter3D { state.annotation.data = { ...state.annotation.data, handles: { + ...state.annotation.data.handles, points: [worldCoords[0], worldCoords[1]], - activeHandleIndex: 0, - textBox: { - hasMoved: false - } + activeHandleIndex: 0 }, cachedStats, frameNumber: ReferencedFrameNumber diff --git a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts index 5ad84eeedd..e29d1c4225 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts @@ -21,7 +21,12 @@ import { import Cornerstone3DCodingScheme from "./CodingScheme"; import { copySeriesTags } from "../helpers/copySeriesTags"; import { toPoint3 } from "../helpers/toPoint3"; -import { NO_IMAGE_ID } from "./constants"; +import { + COMMENT_CODE, + NO_IMAGE_ID, + TEXT_ANNOTATION_POSITION +} from "./constants"; +import LabelData from "./LabelData"; type Annotation = Types.Annotation; @@ -36,6 +41,15 @@ const { TID1500MeasurementReport, TID1501MeasurementGroup } = TID1500; const { DicomMetaDictionary } = data; const FINDING = { CodingSchemeDesignator: "DCM", CodeValue: "121071" }; +const COMMENT = { + CodingSchemeDesignator: COMMENT_CODE.schemeDesignator, + CodeValue: COMMENT_CODE.value +}; +const COMMENT_POSITION = { + CodingSchemeDesignator: TEXT_ANNOTATION_POSITION.schemeDesignator, + CodeValue: TEXT_ANNOTATION_POSITION.value +}; + const FINDING_SITE = { CodingSchemeDesignator: "SCT", CodeValue: "363698007" }; const FINDING_SITE_OLD = { CodingSchemeDesignator: "SRT", CodeValue: "G-C0E3" }; @@ -45,6 +59,8 @@ type SpatialCoordinatesState = { annotation: Annotation; finding?: unknown; findingSites?: unknown; + commentGroup?; + commentPositionGroup?; }; type ScoordType = { @@ -70,6 +86,7 @@ type SetupMeasurementData = { ReferencedSOPSequence?: Record; ReferencedSOPInstanceUID?: string; referencedImageId?: string; + textBoxPosition?: ScoordType; ReferencedFrameNumber?: string; SCOORD3DGroup?: ScoordType; FrameOfReferenceUID?: string; @@ -169,8 +186,9 @@ export default class MeasurementReport { ); args.ReferencedSOPSequence = ReferencedSOPSequence; - const TID300Measurement = new toolClass.TID300Representation(args); - return TID300Measurement; + const tid300Measurement = new toolClass.TID300Representation(args); + const labelMeasurement = new LabelData(tid300Measurement, tool); + return labelMeasurement; } public static codeValueMatch = (group, code, oldCode?) => { @@ -220,7 +238,11 @@ export default class MeasurementReport { } static getCornerstoneLabelFromDefaultState(defaultState) { - const { findingSites = [], finding } = defaultState; + const { findingSites = [], finding, commentGroup } = defaultState; + + if (commentGroup?.TextValue) { + return commentGroup.TextValue; + } const cornersoneFreeTextCodingValue = Cornerstone3DCodingScheme.codeValues.CORNERSTONEFREETEXT; @@ -305,7 +327,13 @@ export default class MeasurementReport { sopInstanceUid: ReferencedSOPInstanceUID, annotation: { data: { - annotationUID + annotationUID, + handles: { + activeHandleIndex: 0, + textBox: { + hasMoved: false + } + } }, annotationUID, metadata: { @@ -332,7 +360,13 @@ export default class MeasurementReport { annotation: { annotationUID, data: { - annotationUID + annotationUID, + handles: { + activeHandleIndex: 0, + textBox: { + hasMoved: false + } + } }, metadata: { toolName: toolType, @@ -356,25 +390,32 @@ export default class MeasurementReport { metadata, toolType }): SpatialCoordinatesData { - const SCOORDGroup = toArray(NUMGroup.ContentSequence).find( + const contentSequenceArr = toArray(NUMGroup.ContentSequence); + const SCOORDGroup = contentSequenceArr.find( group => group.ValueType === "SCOORD" ); - const SCOORD3DGroup = toArray(NUMGroup.ContentSequence).find( + const SCOORD3DGroup = contentSequenceArr.find( group => group.ValueType === "SCOORD3D" ); - if (SCOORDGroup) { - return this.processSCOORDGroup({ - SCOORDGroup, - toolType, - metadata, - sopInstanceUIDToImageIdMap - }); - } else if (SCOORD3DGroup) { - return this.processSCOORD3DGroup({ SCOORD3DGroup, toolType }); - } else { + const result: SpatialCoordinatesData = + (SCOORD3DGroup && + this.processSCOORD3DGroup({ + SCOORD3DGroup, + toolType + })) || + (SCOORDGroup && + this.processSCOORDGroup({ + SCOORDGroup, + toolType, + metadata, + sopInstanceUIDToImageIdMap + })); + if (!result) { throw new Error("No spatial coordinates group found."); } + + return result; } public static processSpatialCoordinatesGroup({ @@ -383,6 +424,8 @@ export default class MeasurementReport { metadata, findingGroup, findingSiteGroups, + commentGroup, + commentPositionGroup, toolType }) { const { @@ -393,7 +436,8 @@ export default class MeasurementReport { ReferencedFrameNumber, SCOORD3DGroup, FrameOfReferenceUID, - referencedImageId + referencedImageId, + textBoxPosition } = this.getSpatialCoordinatesState({ NUMGroup, sopInstanceUIDToImageIdMap, @@ -408,15 +452,32 @@ export default class MeasurementReport { return addAccessors(fsg.ConceptCodeSequence); }); + if (commentPositionGroup) { + state.commentPositionGroup = commentPositionGroup; + const textBoxCoords = scoordToWorld( + { + is3DMeasurement: !referencedImageId, + referencedImageId + }, + commentPositionGroup + ); + state.annotation.data.handles.textBox = { + hasMoved: true, + worldPosition: textBoxCoords[0] + }; + } + state.finding = finding; state.findingSites = findingSites; + state.commentGroup = commentGroup; + state.commentPositionGroup = commentPositionGroup; if (finding) { state.description = finding.CodeMeaning; } state.annotation.data.label = - MeasurementReport.getCornerstoneLabelFromDefaultState(state); + this.getCornerstoneLabelFromDefaultState(state); return { // Deprecating the defaultState in favour of state, but there are lots @@ -429,6 +490,7 @@ export default class MeasurementReport { ReferencedSOPSequence, ReferencedSOPInstanceUID, referencedImageId, + textBoxPosition, ReferencedFrameNumber, SCOORD3DGroup, FrameOfReferenceUID @@ -447,6 +509,12 @@ export default class MeasurementReport { const findingGroup = contentSequenceArr.find(group => this.codeValueMatch(group, FINDING) ); + const commentGroup = contentSequenceArr.find(group => + this.codeValueMatch(group, COMMENT) + ); + const commentPositionGroup = contentSequenceArr.find(group => + this.codeValueMatch(group, COMMENT_POSITION) + ); const findingSiteGroups = contentSequenceArr.filter(group => this.codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD) @@ -467,6 +535,8 @@ export default class MeasurementReport { metadata, findingGroup, findingSiteGroups, + commentGroup, + commentPositionGroup, toolType }); diff --git a/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts b/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts index 4c70ec11e8..1c9c05101f 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts @@ -21,8 +21,6 @@ class PlanarFreehandROI extends BaseAdapter3D { const { state, NUMGroup, - scoord, - scoordArgs, worldCoords, referencedImageId, ReferencedFrameNumber @@ -57,11 +55,8 @@ class PlanarFreehandROI extends BaseAdapter3D { ...state.annotation.data, contour: { polyline: worldCoords, closed: !isOpenContour }, handles: { - points, - activeHandleIndex: null, - textBox: { - hasMoved: false - } + ...state.annotation.data.handles, + points }, frameNumber: ReferencedFrameNumber }; @@ -118,7 +113,7 @@ class PlanarFreehandROI extends BaseAdapter3D { ReferencedFrameOfReferenceUID: is3DMeasurement ? metadata.FrameOfReferenceUID : null, - use3DSpatialCoordinates: false + use3DSpatialCoordinates: is3DMeasurement }; } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/Probe.ts b/packages/adapters/src/adapters/Cornerstone3D/Probe.ts index 7bb60f9348..7879b8d77f 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Probe.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Probe.ts @@ -30,8 +30,6 @@ class Probe extends BaseAdapter3D { const { state, NUMGroup, - scoord, - scoordArgs, worldCoords, referencedImageId, ReferencedFrameNumber @@ -52,11 +50,8 @@ class Probe extends BaseAdapter3D { state.annotation.data = { ...state.annotation.data, handles: { - points: worldCoords, - activeHandleIndex: 0, - textBox: { - hasMoved: false - } + ...state.annotation.data.handles, + points: worldCoords }, cachedStats, frameNumber: ReferencedFrameNumber diff --git a/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts b/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts index 47835da902..3e36000a16 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts @@ -44,11 +44,8 @@ export class RectangleROI extends BaseAdapter3D { state.annotation.data = { ...state.annotation.data, handles: { - points: worldCoords, - activeHandleIndex: 0, - textBox: { - hasMoved: false - } + ...state.annotation.data.handles, + points: worldCoords }, cachedStats, frameNumber: ReferencedFrameNumber @@ -59,16 +56,13 @@ export class RectangleROI extends BaseAdapter3D { static getTID300RepresentationArguments(tool, is3DMeasurement = false) { const { data, finding, findingSites, metadata } = tool; - const { polyline, closed } = data.contour; - const isOpenContour = closed !== true; - const { referencedImageId } = metadata; const scoordProps = { is3DMeasurement, referencedImageId }; - const corners = toScoords(scoordProps, polyline); + const corners = toScoords(scoordProps, data.handles.points); const { area, perimeter } = data.cachedStats[`imageId:${referencedImageId}`] || {}; @@ -86,7 +80,7 @@ export class RectangleROI extends BaseAdapter3D { trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [], - use3DSpatialCoordinates: false + use3DSpatialCoordinates: is3DMeasurement }; } } diff --git a/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts b/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts index 46ef4f520a..15e219ab43 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/UltrasoundDirectional.ts @@ -27,11 +27,8 @@ class UltrasoundDirectional extends BaseAdapter3D { state.annotation.data = { ...state.annotation.data, handles: { - points: worldCoords, - activeHandleIndex: 0, - textBox: { - hasMoved: false - } + ...state.annotation.data.handles, + points: worldCoords }, frameNumber: ReferencedFrameNumber }; diff --git a/packages/adapters/src/adapters/Cornerstone3D/constants/index.ts b/packages/adapters/src/adapters/Cornerstone3D/constants/index.ts index 22b2de19c2..ba07980b94 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/constants/index.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/constants/index.ts @@ -1 +1,15 @@ export const NO_IMAGE_ID = "none"; + +export const CS3D_DESIGNATOR = "99CS3D"; + +export const TEXT_ANNOTATION_POSITION = { + schemeDesignator: CS3D_DESIGNATOR, + meaning: "Text Annotation Position", + value: "TextPosition" +}; + +export const COMMENT_CODE = { + schemeDesignator: "DCM", + meaning: "Comment", + value: "121106" +}; diff --git a/packages/adapters/src/adapters/Cornerstone3D/index.ts b/packages/adapters/src/adapters/Cornerstone3D/index.ts index a2a6489489..bfaaf4cb87 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/index.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/index.ts @@ -19,6 +19,11 @@ import * as Segmentation from "./Segmentation"; import * as ParametricMap from "./ParametricMap"; import * as RTSS from "./RTStruct"; import KeyImage from "./KeyImage"; +import { + COMMENT_CODE, + NO_IMAGE_ID, + TEXT_ANNOTATION_POSITION +} from "./constants"; const Cornerstone3DSR = { BaseAdapter3D, @@ -36,7 +41,10 @@ const Cornerstone3DSR = { KeyImage, MeasurementReport, CodeScheme, - CORNERSTONE_3D_TAG + CORNERSTONE_3D_TAG, + COMMENT_CODE, + NO_IMAGE_ID, + TEXT_ANNOTATION_POSITION }; const Cornerstone3DSEG = { From d05c49937bc1e5bb5d460e1625f9fded69a6b494 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 23 Jul 2025 17:41:02 +0000 Subject: [PATCH 115/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 4b0cdeba10..9d516a3d41 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -3d5a8c3fa87a5eeb112b30775cb473a3924b0db7 \ No newline at end of file +acb1446027950066ed9d8404ecbd27220f41f020 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index f7f914b92b..8eb1dd7e08 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.12", - "@cornerstonejs/tools": "^3.31.12" + "@cornerstonejs/core": "^3.31.13", + "@cornerstonejs/tools": "^3.31.13" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index a0fa2e5379..f9b5043f51 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.12", - "@cornerstonejs/tools": "^3.31.12" + "@cornerstonejs/core": "^3.31.13", + "@cornerstonejs/tools": "^3.31.13" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 7b6064ef97..6b2af32a8c 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.12", + "@cornerstonejs/core": "^3.31.13", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 47287110bf..7ed3b9b47e 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.12", - "@cornerstonejs/core": "^3.31.12", - "@cornerstonejs/dicom-image-loader": "^3.31.12", - "@cornerstonejs/nifti-volume-loader": "^3.31.12", - "@cornerstonejs/tools": "^3.31.12", + "@cornerstonejs/adapters": "^3.31.13", + "@cornerstonejs/core": "^3.31.13", + "@cornerstonejs/dicom-image-loader": "^3.31.13", + "@cornerstonejs/nifti-volume-loader": "^3.31.13", + "@cornerstonejs/tools": "^3.31.13", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 13548646f5..ec02f39b89 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.12", - "@cornerstonejs/tools": "^3.31.12", + "@cornerstonejs/core": "^3.31.13", + "@cornerstonejs/tools": "^3.31.13", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 2d56df98cf..1a4f00950d 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.12" + "@cornerstonejs/core": "^3.31.13" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 7bd434db6c..a21ade9147 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.12", - "@cornerstonejs/tools": "^3.31.12", + "@cornerstonejs/core": "^3.31.13", + "@cornerstonejs/tools": "^3.31.13", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 4b63357e7e..3536787953 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.12", + "@cornerstonejs/core": "^3.31.13", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index cb6dde6cde..11bf3f45c8 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.12", - "commit": "3d5a8c3fa87a5eeb112b30775cb473a3924b0db7" + "version": "3.31.13", + "commit": "acb1446027950066ed9d8404ecbd27220f41f020" } \ No newline at end of file diff --git a/version.txt b/version.txt index a94a8b1d58..f0b094c76f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.12 \ No newline at end of file +3.31.13 \ No newline at end of file From 5f8e1e58440472938df77a6a03d154c0f37480bb Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 23 Jul 2025 17:41:22 +0000 Subject: [PATCH 116/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 6 ++++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b680fb396a..b9452c4512 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) + +### Bug Fixes + +- Save label position and use valid DICOM for label text ([#2224](https://github.com/cornerstonejs/cornerstone3D/issues/2224)) ([acb1446](https://github.com/cornerstonejs/cornerstone3D/commit/acb1446027950066ed9d8404ecbd27220f41f020)) + ## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) ### Bug Fixes diff --git a/lerna.json b/lerna.json index e9df18a56c..4ab3433ac8 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.12", + "version": "3.31.13", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index c2a310b63f..284f04c8da 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) + +### Bug Fixes + +- Save label position and use valid DICOM for label text ([#2224](https://github.com/cornerstonejs/cornerstone3D/issues/2224)) ([acb1446](https://github.com/cornerstonejs/cornerstone3D/commit/acb1446027950066ed9d8404ecbd27220f41f020)) + ## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 8eb1dd7e08..24aa32a5e4 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.12", + "version": "3.31.13", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 89835615d7..ea1a83195f 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index f9b5043f51..d17164f546 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.12", + "version": "3.31.13", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 84dc0bf943..39c7c52833 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 37a3c8f92a..1dabef77fa 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.12", + "version": "3.31.13", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 013c9c44a3..4919ef1b56 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 6b2af32a8c..24995c9bd0 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.12", + "version": "3.31.13", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 85dcb9f9d9..4fff73f25e 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index ec02f39b89..24a799570d 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.12", + "version": "3.31.13", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 3face463f1..cf695045e6 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 1a4f00950d..075deab750 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.12", + "version": "3.31.13", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 139b47aeee..97d41dc7fb 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index a21ade9147..e88bcec37a 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.12", + "version": "3.31.13", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 7d598b6668..18fb0040f5 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 3536787953..056a98d0f7 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.12", + "version": "3.31.13", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 927b4adb9c9c46af4bb04f372c4580e40b9ee508 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 23 Jul 2025 17:41:34 +0000 Subject: [PATCH 117/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index d88b74523f..c0f2018350 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.12"; +export const version = "3.31.13"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 149f83149a..2bffa22a48 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.12'; +export const version = '3.31.13'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 149f83149a..2bffa22a48 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.12'; +export const version = '3.31.13'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 149f83149a..2bffa22a48 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.12'; +export const version = '3.31.13'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 149f83149a..2bffa22a48 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.12'; +export const version = '3.31.13'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 149f83149a..2bffa22a48 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.12'; +export const version = '3.31.13'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 149f83149a..2bffa22a48 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.12'; +export const version = '3.31.13'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 149f83149a..2bffa22a48 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.12'; +export const version = '3.31.13'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 149f83149a..2bffa22a48 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.12'; +export const version = '3.31.13'; From fa0d63ec6f677bbb7a5cae93c5aed940b8a056ac Mon Sep 17 00:00:00 2001 From: Ibrahim <93064150+IbrahimCSAE@users.noreply.github.com> Date: Fri, 25 Jul 2025 11:33:09 -0400 Subject: [PATCH 118/212] fix(widgets): disable widget renderers after render (#2229) * disable draw after render * fix typo --- .../core/src/RenderingEngine/ContextPoolRenderingEngine.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts b/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts index 86d56b2a06..e3dfac6bc5 100644 --- a/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts +++ b/packages/core/src/RenderingEngine/ContextPoolRenderingEngine.ts @@ -358,6 +358,10 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine { allRenderers.forEach(({ renderer: r }) => r.setDraw(false)); + widgetRenderers.forEach((_, renderer) => { + renderer.setDraw(false); + }); + const openGLRenderWindow = offscreenMultiRenderWindow.getOpenGLRenderWindow(); const context = openGLRenderWindow.get3DContext(); From c1079a732f121e1a6c37b9560caeb7ab94f43c54 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 25 Jul 2025 15:37:35 +0000 Subject: [PATCH 119/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 9d516a3d41..6f7c74dc51 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -acb1446027950066ed9d8404ecbd27220f41f020 \ No newline at end of file +fa0d63ec6f677bbb7a5cae93c5aed940b8a056ac \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 24aa32a5e4..7a9d0b0abb 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.13", - "@cornerstonejs/tools": "^3.31.13" + "@cornerstonejs/core": "^3.31.14", + "@cornerstonejs/tools": "^3.31.14" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index d17164f546..71f12bb27f 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.13", - "@cornerstonejs/tools": "^3.31.13" + "@cornerstonejs/core": "^3.31.14", + "@cornerstonejs/tools": "^3.31.14" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 24995c9bd0..f210970e14 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.13", + "@cornerstonejs/core": "^3.31.14", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 7ed3b9b47e..cd039b29cf 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.13", - "@cornerstonejs/core": "^3.31.13", - "@cornerstonejs/dicom-image-loader": "^3.31.13", - "@cornerstonejs/nifti-volume-loader": "^3.31.13", - "@cornerstonejs/tools": "^3.31.13", + "@cornerstonejs/adapters": "^3.31.14", + "@cornerstonejs/core": "^3.31.14", + "@cornerstonejs/dicom-image-loader": "^3.31.14", + "@cornerstonejs/nifti-volume-loader": "^3.31.14", + "@cornerstonejs/tools": "^3.31.14", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 24a799570d..bf4d8c9ea2 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.13", - "@cornerstonejs/tools": "^3.31.13", + "@cornerstonejs/core": "^3.31.14", + "@cornerstonejs/tools": "^3.31.14", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 075deab750..d378427cf1 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.13" + "@cornerstonejs/core": "^3.31.14" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index e88bcec37a..4dc80b0bb6 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.13", - "@cornerstonejs/tools": "^3.31.13", + "@cornerstonejs/core": "^3.31.14", + "@cornerstonejs/tools": "^3.31.14", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 056a98d0f7..0b3cc549d0 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.13", + "@cornerstonejs/core": "^3.31.14", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 11bf3f45c8..f4baaf171d 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.13", - "commit": "acb1446027950066ed9d8404ecbd27220f41f020" + "version": "3.31.14", + "commit": "fa0d63ec6f677bbb7a5cae93c5aed940b8a056ac" } \ No newline at end of file diff --git a/version.txt b/version.txt index f0b094c76f..01806f76dd 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.13 \ No newline at end of file +3.31.14 \ No newline at end of file From 3d0bf32f0a2fca5da4c459903522fdd4005584a9 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 25 Jul 2025 15:37:55 +0000 Subject: [PATCH 120/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9452c4512..5b27332925 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) + +### Bug Fixes + +- **widgets:** disable widget renderers after render ([#2229](https://github.com/cornerstonejs/cornerstone3D/issues/2229)) ([fa0d63e](https://github.com/cornerstonejs/cornerstone3D/commit/fa0d63ec6f677bbb7a5cae93c5aed940b8a056ac)) + ## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 4ab3433ac8..577c1649b0 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.13", + "version": "3.31.14", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 284f04c8da..5713159ccc 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) ### Bug Fixes diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 7a9d0b0abb..f9edc8e469 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.13", + "version": "3.31.14", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index ea1a83195f..4e9bfd6683 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 71f12bb27f..e2e5f086f1 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.13", + "version": "3.31.14", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 39c7c52833..d6e089ec63 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) + +### Bug Fixes + +- **widgets:** disable widget renderers after render ([#2229](https://github.com/cornerstonejs/cornerstone3D/issues/2229)) ([fa0d63e](https://github.com/cornerstonejs/cornerstone3D/commit/fa0d63ec6f677bbb7a5cae93c5aed940b8a056ac)) + ## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 1dabef77fa..6d039a34b8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.13", + "version": "3.31.14", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 4919ef1b56..d11c0c7238 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index f210970e14..d1a4b30164 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.13", + "version": "3.31.14", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 4fff73f25e..a35ca412bd 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index bf4d8c9ea2..75666b2fa3 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.13", + "version": "3.31.14", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index cf695045e6..15f1dfafef 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index d378427cf1..52644674bf 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.13", + "version": "3.31.14", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 97d41dc7fb..4b62f1ff7f 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 4dc80b0bb6..6d0eed8a3e 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.13", + "version": "3.31.14", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 18fb0040f5..4d22d59b85 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.31.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.12...v3.31.13) (2025-07-23) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 0b3cc549d0..4a300fc770 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.13", + "version": "3.31.14", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From ba95903f252ba57ee5f86be9c7d3f5f9a63621b5 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 25 Jul 2025 15:38:07 +0000 Subject: [PATCH 121/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index c0f2018350..b9136ad572 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.13"; +export const version = "3.31.14"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 2bffa22a48..e2e8d3a5ce 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.13'; +export const version = '3.31.14'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 2bffa22a48..e2e8d3a5ce 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.13'; +export const version = '3.31.14'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 2bffa22a48..e2e8d3a5ce 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.13'; +export const version = '3.31.14'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 2bffa22a48..e2e8d3a5ce 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.13'; +export const version = '3.31.14'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 2bffa22a48..e2e8d3a5ce 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.13'; +export const version = '3.31.14'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 2bffa22a48..e2e8d3a5ce 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.13'; +export const version = '3.31.14'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 2bffa22a48..e2e8d3a5ce 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.13'; +export const version = '3.31.14'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 2bffa22a48..e2e8d3a5ce 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.13'; +export const version = '3.31.14'; From e8a5a04f5c2d484c3464a5661800d84af3e58f96 Mon Sep 17 00:00:00 2001 From: "Martin Bellehumeur, M. Eng." <23396581+mbellehumeur@users.noreply.github.com> Date: Mon, 28 Jul 2025 15:07:19 +0200 Subject: [PATCH 122/212] feat: volume cropping (#2139) * feat(volumeCropping): Add 3D Volume Cropping tool example * feat(volumeCropping): Enhance 3D Volume Cropping with Trackball rotation and clipping planes * feat(volumeCropping): Implement original clipping planes management in VolumeViewport3D and update ZoomTool to handle clipping planes during zoom * feat(volumeCropping): Enhance VolumeCroppingTool with mouse and touch drag callbacks for improved interaction * refactor(volumeCropping): Clean up TrackballRotateTool integration and improve clipping planes handling * Add VolumeCroppingTool to tools index - Imported VolumeCroppingTool in the tools index file. - Exported VolumeCroppingTool alongside other manipulation tools. * feat: Restrict TrackballRotateTool to VOLUME_3D viewports and refactor VolumeCroppingTool - Added a check in TrackballRotateTool to allow rotation only for VOLUME_3D viewports. - Refactored VolumeCroppingTool to remove slab thickness handling and rotation points. - Introduced reference lines for better annotation management. - Updated annotation interfaces and removed unused methods related to slab thickness. - Enhanced handle selection logic and improved code readability. * feat(volumeCropping): Add axis parameter to addSphere method and update sphere color based on axis * feat(volumeCropping): Enhance sphere management with dragging functionality and update clipping plane references * feat(volumeCropping): Refactor VolumeCroppingTool by removing unused functions and enhancing sphere state management * refactor(volumeCropping): Remove unused functions and variables to streamline code * feat(volumeCropping): Add sphere color configuration and improve annotation handling * working example before split in 2 tools. * Add VolumeCroppingControlTool to tools index export * feat(volumeCropping): Add StackScrollTool and enhance viewport handling in VolumeCroppingControlTool * feat(volumeCropping): Add viewport indicators and sphere moved event handling in VolumeCropping tools * feat(volumeCropping): Enhance VolumeCroppingTool with additional mouse bindings and improve annotation handling * fix(volumeCropping): Update event names for VolumeCroppingControlTool and adjust zoom level in example * feat(volumeCropping): Update VolumeCroppingTool and VolumeCroppingControlTool to enhance sphere handling and event management * other sphere movement * feat(volumeCropping): Add sphere color customization and viewport orientation handling in VolumeCropping tools * refactor(volumeCropping): Clean up commented code and add debug logging for sphere colors * fix(volumeViewport3D): Initialize _originalClippingPlanes in constructor * feat(volumeCropping): Integrate CrosshairsTool and enhance sphere handling in VolumeCroppingTool * refactor(volumeCropping): Replace hardcoded crop factor with configurable initialCropFactor and clean up reference line handling * feat(volumeCropping): Add toolCenterMin and toolCenterMax properties for enhanced cropping control * refactor(volumeCropping): Adjust viewport styles and update reference line colors for improved clarity * feat(volumeCropping): Enhance VolumeCroppingControlTool with toolCenterMin and toolCenterMax properties for improved cropping control * refactor(volumeCropping): Adjust viewport width and clean up unused code in VolumeCroppingTool and VolumeCroppingControlTool * refactor(volumeCropping): Clean up debug statements in VolumeCroppingTool for improved readability * refactor(volumeCropping): Optimize clipping plane management in VolumeCroppingTool for improved performance * refactor(volumeCropping): Update instructions and clean up commented code in VolumeCroppingTool and VolumeCroppingControlTool for improved clarity * refactor(volumeCropping): Improve type definitions and clean up unused code in VolumeViewport3D and VolumeCroppingTool for better maintainability * refactor(volumeCropping): Clean up commented code and improve readability in VolumeCroppingTool * refactor(volumeCropping): Enhance corner sphere movement logic and update adjacent spheres for improved accuracy in VolumeCroppingTool * refactor(volumeCropping): Enhance corner sphere movement logic and update face sphere positions for improved accuracy in VolumeCroppingTool * refactor(volumeCropping): Simplify edge cylinder creation and update logic in VolumeCroppingTool for improved clarity and maintainability * refactor(volumeCropping): Remove commented-out code and enhance face sphere position updates for improved clarity in VolumeCroppingTool * refactor(volumeCropping): Add line intersection calculation for improved reference line handling in VolumeCroppingControlTool * refactor(volumeCropping): Adjust line width and cylinder radius for improved visual clarity in VolumeCroppingTool * Added Toggle 3D handles visible * refactor(volumeCropping): Update documentation and clean up comments for clarity in VolumeCroppingControlTool and VolumeCroppingTool * refactor(tools): Enhance type definitions and improve clarity in PanTool, TrackballRotateTool, VolumeCroppingControlTool, VolumeCroppingTool, and ZoomTool * refactor(volumeCropping): Simplify addNewAnnotation and cancel methods, and add handleSelectedCallback in VolumeCroppingTool * refactor(tools): Integrate VolumeCroppingTool's originalClippingPlanes into PanTool, TrackballRotateTool, and ZoomTool * refactor(volumeCropping): Enhance type definitions and add getVtkDisplayCoords method in VolumeCroppingTool * refactor(volumeCropping): Clean up imports and adjust getVtkDisplayCoords usage in VolumeCroppingTool * refactor(volumeCropping): Remove commented-out code and improve clarity in VolumeCroppingTool and VolumeCroppingControlTool * refactor(volumeViewport3D): Remove unnecessary blank lines in VolumeViewport3D constructor * refactor(volumeCropping): Make initial crop factor configurable in VolumeCroppingTool. Remove 0.8 * fix(volumeCropping): Add checks for volume actors and image data in VolumeCroppingTool * refactor(volumeCropping): Simplify actor checks and clipping plane additions in VolumeCroppingTool * fix(volumeCropping): Add checks for volume actors and use enums for axial.sagittal,coronal * Replace clipping plane handling in pan,zoom and rotate by events. * refactor(volumeCropping): Simplify origin and normal extraction in VolumeCroppingTool * refactor(tools): Remove unused vtkPlane imports from PanTool, TrackballRotateTool, and ZoomTool * Use CAMERA_MODIFIED event name. * refactor(TrackballRotateTool): remove viewport type check for VOLUME_3D in drag callback * Remove unused function _areViewportIdArraysEqual and other unused functions * use vec3 transform * refactor(VolumeCroppingTool): replace custom normal transformation with gl-matrix functions * Use robust transform * Normalize direction vectors * Normalize the transform in updateClippingPlanes * fix(addCylinderBetweenPoints): prevent cylinder creation for identical points * refactor(VolumeCroppingTool): simplify corner sphere position updates and streamline edge cylinder calculations * refactor(VolumeCroppingTool): enhance mouse movement handling for sphere manipulation and improve clipping plane updates * Remove 3D picker * refactor(VolumeCroppingTool): update handle visibility logic and implement corner drag offset for improved sphere manipulation * refactor(VolumeCroppingTool): add face drag offset handling for improved sphere manipulation * Add dashed extended control line option * use CAMERA_MODIFIED event * fix(PanTool, ZoomTool): clean up imports and ensure viewport renders after zoom adjustments * refactor(VolumeCroppingTool): update handle visibility logic to synchronize sphere positions with clipping planes * refactor(VolumeCroppingTool): add type annotations for improved type safety in clipping plane calculations * refactor(VolumeCroppingTool): remove viewport parameter from _updateCornerSpheres calls for consistency * Stack scroll should not change clipping planes * refactor(VolumeCroppingControlTool): remove commented-out _onSphereMoved logic for clarity * refactor(VolumeCroppingTool): remove viewport parameter from _updateCornerSpheres for consistency * refactor(VolumeCroppingTool): update initial crop factor, enable corner spheres, and improve debug logging * Add rotate to tool * refactor(VolumeCroppingTool): remove debug logs and unused mouse event handlers for clarity * feat(VolumeCroppingTool): add clipping planes visibility toggle and related methods * feat(VolumeCroppingTool): implement edge lines for corner spheres and refactor related methods * refactor(VolumeCroppingTool): adjust line width and initial crop factor for improved visibility and usability * feat(VolumeCroppingControlTool): add viewport-based tool center updates and initialize annotations for improved cropping functionality * refactor(VolumeCroppingTool): update mouse bindings and adjust sphere radius for improved interaction * fix(VolumeCroppingTool): add check for default actor in viewport before updating clipping planes * refactor(VolumeCroppingControlTool): remove redundant viewport initialization calls for improved performance * feat(VolumeCroppingControlTool): synthesize virtual annotations for missing orientations and improve viewport handling * refactor(VolumeCroppingControlTool): streamline virtual annotation handling and improve viewport synthesis logic * feat(VolumeCroppingControlTool): synthesize virtual annotations for missing orientations and enhance viewport handling * fix(VolumeCroppingControlTool): cast annotation to any for virtualNormal access * fix(VolumeCroppingControlTool): specify type for virtualAnnotation and streamline virtual annotation creation * refactor(VolumeCroppingTool): optimize clipping plane updates and improve logging * feat(VolumeCroppingControlTool): add orientation mapping from camera normal and viewport ID for virtual annotations * fix(VolumeCroppingControlTool): correct viewport orientation handling and improve debug logging * fix(VolumeCroppingControlTool): improve virtual annotation synthesis by using camera normal for orientation detection * fix(VolumeCroppingControlTool): update type annotations for referenceLines and clippingPlaneReferenceLines in VolumeCroppingAnnotation interface * refactor(VolumeCroppingControlTool): remove debug logging for viewport initialization and virtual annotation synthesis * refactor(VolumeCroppingControlTool): simplify orientation determination logic by removing fallback to viewportId * feat(VolumeCroppingControlTool): add configurable dropdown for number of orthographic viewports and update viewport handling * feat(VolumeCroppingControlTool): add configurable line colors for reference lines based on orientation * feat(VolumeCroppingTool): add configurable line widths for reference lines * refactor(VolumeCroppingTool): remove debug logging for tool activation and configuration * feat(VolumeCroppingControlTool): add annotation existence check before subscribing to viewport events * fix(VolumeCroppingControlTool): correct start and end points for dashed lines based on intersection order * fix(VolumeCroppingControlTool): disable extending reference lines by default * fix(VolumeCroppingControlTool): enable extending reference lines by default and improve intersection handling for dashed lines * fix(VolumeCroppingControlTool): improve dashed line rendering by sorting intersections based on distance * fix(VolumeCroppingControlTool): enhance sphere movement handling and streamline coordinate updates * Implement review comments regarding naming and position * refactor(VolumeCroppingTool): simplify viewport retrieval by introducing a dedicated method * refactor(VolumeCroppingTool): clean up imports and reorganize handle visibility methods * fix(VolumeCroppingTool): add debug log for cleanup process after mouseup * Fix rendering problem in OHIF when moving the first sphere quickly. * feat(VolumeCroppingTool): sync tool centers with clipping planes * refactor(VolumeCroppingTool): enhance documentation and restructure orientation utility function * feat(VolumeCroppingTool): implement adaptive sphere radius calculation for improved cropping * feat(VolumeCroppingTool): implement adaptive sphere radius calculation for spheres based on volume diagonal * feat(VolumeCroppingTool): initialize state variables for new volume processing * feat(VolumeCroppingControlTool): trigger event on tool state change * Add frameOfReference to tool events so that many tool instances can run on different series. * feat(VolumeCroppingTool): use seriesInstanceUID instead of frameOfReferenceUID to identify events. * feat(VolumeCroppingTool): enhance documentation for VolumeCroppingTool and VolumeCroppingControlTool interactions * feat(VolumeCroppingTool): update sphere color properties and add visibility control methods for cropping handles and planes * fix(VolumeCroppingControlTool): remove unused seriesInstanceUID from metadata * feat(VolumeCroppingTool): improve handle visibility logic when changing volume * refactor(VolumeCroppingTool): streamline VTK pipeline update logic and improve code clarity * fix(VolumeCroppingTool): conditionally set clipping plane origin based on visibility * fix(VolumeCroppingTool): update clipping plane origin condition to check for existing clipping planes * refactor(VolumeCroppingTool): remove VTK update logic (real problem is bun run dev:fast) --- .../examples/volumeCroppingTool/index.ts | 407 ++++ packages/tools/src/enums/Events.ts | 4 + packages/tools/src/index.ts | 4 + .../src/tools/VolumeCroppingControlTool.ts | 1937 +++++++++++++++++ .../tools/src/tools/VolumeCroppingTool.ts | 1726 +++++++++++++++ packages/tools/src/tools/index.ts | 4 + utils/ExampleRunner/example-info.json | 4 + 7 files changed, 4086 insertions(+) create mode 100644 packages/tools/examples/volumeCroppingTool/index.ts create mode 100644 packages/tools/src/tools/VolumeCroppingControlTool.ts create mode 100644 packages/tools/src/tools/VolumeCroppingTool.ts diff --git a/packages/tools/examples/volumeCroppingTool/index.ts b/packages/tools/examples/volumeCroppingTool/index.ts new file mode 100644 index 0000000000..70de70e81f --- /dev/null +++ b/packages/tools/examples/volumeCroppingTool/index.ts @@ -0,0 +1,407 @@ +import type { Types, VolumeViewport3D } from '@cornerstonejs/core'; +import { + RenderingEngine, + Enums, + setVolumesForViewports, + volumeLoader, +} from '@cornerstonejs/core'; +import { + initDemo, + createImageIdsAndCacheMetaData, + setTitleAndDescription, + setCtTransferFunctionForVolumeActor, + addDropdownToToolbar, + getLocalUrl, + addToggleButtonToToolbar, +} from '../../../../utils/demo/helpers'; + +import * as cornerstoneTools from '@cornerstonejs/tools'; + +// This is for debugging purposes +console.warn( + 'Click on index.ts to open source code for this example --------->' +); + +const { + ToolGroupManager, + Enums: csToolsEnums, + VolumeCroppingTool, + VolumeCroppingControlTool, + TrackballRotateTool, + ZoomTool, + PanTool, + OrientationMarkerTool, + StackScrollTool, + CrosshairsTool, +} = cornerstoneTools; + +const { MouseBindings } = csToolsEnums; +const { ViewportType } = Enums; + +// Define a unique id for the volume +const volumeName = 'CT_VOLUME_ID'; // Id of the volume less loader prefix +const volumeLoaderScheme = 'cornerstoneStreamingImageVolume'; // Loader id which defines which volume loader to use +const volumeId = `${volumeLoaderScheme}:${volumeName}`; // VolumeId with loader id + volume id +const toolGroupId = 'MY_TOOLGROUP_ID'; +const toolGroupIdVRT = 'MY_TOOLGROUP_VRT_ID'; + +const viewportId1 = 'CT_AXIAL'; +const viewportId2 = 'CT_CORONAL'; +const viewportId3 = 'CT_SAGITTAL'; +const viewportId4 = 'CT_3D_VOLUME'; // New 3D volume viewport +const viewportIds = [viewportId1, viewportId2, viewportId3, viewportId4]; + +// Add dropdown to toolbar to select number of orthographic viewports (reloads page with URL param) +addDropdownToToolbar({ + labelText: 'Number of Orthographic Viewports', + options: { + values: [1, 2, 3], + defaultValue: getNumViewportsFromUrl(), + }, + onSelectedValueChange: (selectedValue) => { + const url = new URL(window.location.href); + url.searchParams.set('numViewports', selectedValue); + window.location.href = url.toString(); + }, +}); +const renderingEngineId = 'myRenderingEngine'; + +///////////////////////////////////////// +// ======== Set up page ======== // +setTitleAndDescription( + 'Volume Cropping', + 'Here we demonstrate how to crop a 3D volume with 6 clipping planes aligned on the x,y and z axes.' +); + +const size = '400px'; +const content = document.getElementById('content'); +const viewportGrid = document.createElement('div'); + +viewportGrid.style.display = 'flex'; +viewportGrid.style.flexDirection = 'row'; +viewportGrid.style.width = '100%'; +viewportGrid.style.height = '800px'; + +// Create elements for the viewports +const element1 = document.createElement('div'); // Axial +const element2 = document.createElement('div'); // Sagittal +const element3 = document.createElement('div'); // Coronal +const element4 = document.createElement('div'); // 3D Volume + +// Create a container for the right side viewports +const rightViewportsContainer = document.createElement('div'); +rightViewportsContainer.style.display = 'flex'; +rightViewportsContainer.style.flexDirection = 'column'; +rightViewportsContainer.style.width = '20%'; +rightViewportsContainer.style.height = '100%'; + +// Set styles for the 2D viewports (stacked vertically on the right) +element1.style.width = '100%'; +element1.style.height = '33.33%'; +element1.style.minHeight = '200px'; + +element2.style.width = '100%'; +element2.style.height = '33.33%'; +element2.style.minHeight = '200px'; + +element3.style.width = '100%'; +element3.style.height = '33.33%'; +element3.style.minHeight = '200px'; + +// Set styles for the 3D viewport (on the left) +element4.style.width = '75%'; +element4.style.height = '100%'; +element4.style.minHeight = '600px'; +element4.style.position = 'relative'; + +// Disable right click context menu so we can have right click tools +element1.oncontextmenu = (e) => e.preventDefault(); +element2.oncontextmenu = (e) => e.preventDefault(); +element3.oncontextmenu = (e) => e.preventDefault(); +element4.oncontextmenu = (e) => e.preventDefault(); + +// Add elements to the viewport grid +// First add the 3D viewport on the left +viewportGrid.appendChild(element4); + +// Add the 2D viewports stacked vertically on the right +rightViewportsContainer.appendChild(element1); +rightViewportsContainer.appendChild(element2); +rightViewportsContainer.appendChild(element3); +viewportGrid.appendChild(rightViewportsContainer); + +content.appendChild(viewportGrid); + +const instructions = document.createElement('p'); +instructions.innerText = ` + Basic controls: + - Click/Drag the spheres in VRT or reference lines in the orthographic viewports. + - Rotate , pan or zoom the 3D viewport using the mouse. + - Use the scroll wheel to scroll through the slices in the orthographic viewports. + `; + +content.append(instructions); + +addToggleButtonToToolbar({ + title: 'Toggle 3D handles', + defaultToggle: false, + onClick: (toggle) => { + // Get the tool group for the 3D viewport + const toolGroupVRT = + cornerstoneTools.ToolGroupManager.getToolGroup(toolGroupIdVRT); + // Get the VolumeCroppingTool instance from the tool group + const croppingTool = toolGroupVRT.getToolInstance('VolumeCropping'); + // Call setHandlesVisible on the tool instance + if (croppingTool && typeof croppingTool.setHandlesVisible === 'function') { + croppingTool.setHandlesVisible(!croppingTool.getHandlesVisible()); + } + }, +}); + +addToggleButtonToToolbar({ + title: 'Toggle Cropping Planes', + defaultToggle: false, + onClick: (toggle) => { + // Get the tool group for the 3D viewport + const toolGroupVRT = + cornerstoneTools.ToolGroupManager.getToolGroup(toolGroupIdVRT); + // Get the VolumeCroppingTool instance from the tool group + const croppingTool = toolGroupVRT.getToolInstance('VolumeCropping'); + // Call setClippingPlanesVisible on the tool instance + if ( + croppingTool && + typeof croppingTool.setClippingPlanesVisible === 'function' + ) { + croppingTool.setClippingPlanesVisible( + !croppingTool.getClippingPlanesVisible() + ); + } + }, +}); + +const viewportColors = { + [viewportId1]: 'rgb(200, 0, 0)', + [viewportId2]: 'rgb(0, 200, 0)', + [viewportId3]: 'rgb(200, 200, 0)', + [viewportId4]: 'rgb(0, 200, 200)', +}; + +function getReferenceLineColor(viewportId) { + return viewportColors[viewportId]; +} + +const viewportReferenceLineControllable = [ + viewportId1, + viewportId2, + viewportId3, +]; + +/** + * Get the number of orthographic viewports from the URL (?numViewports=1|2|3) + */ +function getNumViewportsFromUrl() { + const params = new URLSearchParams(window.location.search); + const value = params.get('numViewports'); + const num = Number(value); + if ([1, 2, 3].includes(num)) { + return num; + } + return 3; // default +} + +/** + * Runs the demo with a configurable number of orthographic viewports + */ +async function run(numViewports = getNumViewportsFromUrl()) { + await initDemo(); + + cornerstoneTools.addTool(VolumeCroppingTool); + cornerstoneTools.addTool(VolumeCroppingControlTool); + cornerstoneTools.addTool(TrackballRotateTool); + cornerstoneTools.addTool(ZoomTool); + cornerstoneTools.addTool(PanTool); + cornerstoneTools.addTool(OrientationMarkerTool); + cornerstoneTools.addTool(StackScrollTool); + cornerstoneTools.addTool(CrosshairsTool); + + const imageIds = await createImageIdsAndCacheMetaData({ + StudyInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.334240657131972136850343327463', + SeriesInstanceUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.226151125820845824875394858561', + wadoRsRoot: + getLocalUrl() || 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', + }); + + const volume = await volumeLoader.createAndCacheVolume(volumeId, { + imageIds, + }); + + const renderingEngine = new RenderingEngine(renderingEngineId); + + // Only include the requested number of orthographic viewports + const orthographicViewports = [ + { + viewportId: viewportId1, + type: ViewportType.ORTHOGRAPHIC, + element: element1, + defaultOptions: { + orientation: Enums.OrientationAxis.AXIAL, + background: [0, 0, 0], + }, + }, + { + viewportId: viewportId2, + type: ViewportType.ORTHOGRAPHIC, + element: element2, + defaultOptions: { + orientation: Enums.OrientationAxis.CORONAL, + background: [0, 0, 0], + }, + }, + { + viewportId: viewportId3, + type: ViewportType.ORTHOGRAPHIC, + element: element3, + defaultOptions: { + orientation: Enums.OrientationAxis.SAGITTAL, + background: [0, 0, 0], + }, + }, + ].slice(0, numViewports); + + // Show/hide orthographic viewport elements based on numViewports + [element1, element2, element3].forEach((el, idx) => { + if (idx < numViewports) { + el.style.display = 'block'; + el.style.height = `${100 / numViewports}%`; + } else { + el.style.display = 'none'; + } + }); + + // Always set viewport4 (3D viewport) orientation to CORONAL + const viewportInputArray = [ + ...orthographicViewports, + { + viewportId: viewportId4, + type: ViewportType.VOLUME_3D, + element: element4, + defaultOptions: { + background: [0, 0, 0], + orientation: Enums.OrientationAxis.CORONAL, + }, + }, + ]; + + renderingEngine.setViewports(viewportInputArray); + + volume.load(); + + // Only set volumes for the active viewport IDs + const activeViewportIds = [ + ...orthographicViewports.map((vp) => vp.viewportId), + viewportId4, + ]; + await setVolumesForViewports( + renderingEngine, + [ + { + volumeId, + callback: setCtTransferFunctionForVolumeActor, + }, + ], + activeViewportIds + ); + + // Tool group for orthographic viewports + const toolGroup = ToolGroupManager.createToolGroup(toolGroupId); + orthographicViewports.forEach((vp) => { + toolGroup.addViewport(vp.viewportId, renderingEngineId); + }); + + toolGroup.addTool(VolumeCroppingControlTool.toolName, { + getReferenceLineColor, + viewportIndicators: true, + }); + toolGroup.setToolActive(VolumeCroppingControlTool.toolName, { + bindings: [ + { + mouseButton: MouseBindings.Primary, + }, + ], + }); + toolGroup.addTool(StackScrollTool.toolName, { + viewportIndicators: true, + }); + toolGroup.setToolActive(StackScrollTool.toolName, { + bindings: [ + { + mouseButton: MouseBindings.Wheel, + }, + { + mouseButton: MouseBindings.Secondary, + }, + ], + }); + + // Tool group for 3D viewport + const toolGroupVRT = ToolGroupManager.createToolGroup(toolGroupIdVRT); + toolGroupVRT.addTool(ZoomTool.toolName); + toolGroupVRT.setToolActive(ZoomTool.toolName, { + bindings: [ + { + mouseButton: MouseBindings.Secondary, + }, + ], + }); + toolGroupVRT.addTool(PanTool.toolName); + toolGroupVRT.setToolActive(PanTool.toolName, { + bindings: [ + { + mouseButton: MouseBindings.Auxiliary, + }, + ], + }); + toolGroupVRT.addTool(OrientationMarkerTool.toolName, { + overlayMarkerType: + OrientationMarkerTool.OVERLAY_MARKER_TYPES.ANNOTATED_CUBE, + }); + // toolGroupVRT.setToolActive(OrientationMarkerTool.toolName); + + const isMobile = window.matchMedia('(any-pointer:coarse)').matches; + const viewport = renderingEngine.getViewport(viewportId4) as VolumeViewport3D; + renderingEngine.renderViewports(activeViewportIds); + await setVolumesForViewports( + renderingEngine, + [{ volumeId }], + [viewportId4] + ).then(() => { + viewport.setProperties({ + preset: 'CT-Bone', + }); + toolGroupVRT.addViewport(viewportId4, renderingEngineId); + toolGroupVRT.addTool(VolumeCroppingTool.toolName, { + sphereRadius: 7, + sphereColors: { + x: [1, 1, 0], + y: [0, 1, 0], + z: [1, 0, 0], + corners: [0, 0, 1], + }, + showCornerSpheres: true, + initialCropFactor: 0.2, + }); + toolGroupVRT.setToolActive(VolumeCroppingTool.toolName, { + bindings: [ + { + mouseButton: MouseBindings.Primary, + }, + ], + }); + viewport.setZoom(1.2); + viewport.render(); + }); +} + +run(); diff --git a/packages/tools/src/enums/Events.ts b/packages/tools/src/enums/Events.ts index 6fce4fd7c2..f32a532921 100644 --- a/packages/tools/src/enums/Events.ts +++ b/packages/tools/src/enums/Events.ts @@ -35,6 +35,10 @@ enum Events { CROSSHAIR_TOOL_CENTER_CHANGED = 'CORNERSTONE_TOOLS_CROSSHAIR_TOOL_CENTER_CHANGED', + VOLUMECROPPINGCONTROL_TOOL_CHANGED = 'CORNERSTONE_TOOLS_VOLUMECROPPINGCONTROL_TOOL_CHANGED', + + VOLUMECROPPING_TOOL_CHANGED = 'CORNERSTONE_TOOLS_VOLUMECROPPING_TOOL_CHANGED', + /////////////////////////////////////// // Annotations /////////////////////////////////////// diff --git a/packages/tools/src/index.ts b/packages/tools/src/index.ts index fb449d1e54..670f962cff 100644 --- a/packages/tools/src/index.ts +++ b/packages/tools/src/index.ts @@ -28,6 +28,8 @@ import { AnnotationDisplayTool, PanTool, TrackballRotateTool, + VolumeCroppingTool, + VolumeCroppingControlTool, DragProbeTool, WindowLevelTool, ZoomTool, @@ -106,6 +108,8 @@ export { PanTool, SegmentBidirectionalTool, TrackballRotateTool, + VolumeCroppingTool, + VolumeCroppingControlTool, DragProbeTool, WindowLevelTool, WindowLevelRegionTool, diff --git a/packages/tools/src/tools/VolumeCroppingControlTool.ts b/packages/tools/src/tools/VolumeCroppingControlTool.ts new file mode 100644 index 0000000000..379c8818b0 --- /dev/null +++ b/packages/tools/src/tools/VolumeCroppingControlTool.ts @@ -0,0 +1,1937 @@ +import { vec2, vec3 } from 'gl-matrix'; +import vtkMath from '@kitware/vtk.js/Common/Core/Math'; +import type vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane'; + +import { AnnotationTool } from './base'; + +import type { Types } from '@cornerstonejs/core'; +import { + getRenderingEngine, + getEnabledElementByIds, + getEnabledElement, + utilities as csUtils, + Enums, + CONSTANTS, + triggerEvent, + eventTarget, +} from '@cornerstonejs/core'; + +import { + getToolGroup, + getToolGroupForViewport, +} from '../store/ToolGroupManager'; + +import { + addAnnotation, + getAnnotations, + removeAnnotation, +} from '../stateManagement/annotation/annotationState'; + +import { + drawCircle as drawCircleSvg, + drawLine as drawLineSvg, +} from '../drawingSvg'; +import { state } from '../store/state'; +import { Events } from '../enums'; +import { getViewportIdsWithToolToRender } from '../utilities/viewportFilters'; +import { + resetElementCursor, + hideElementCursor, +} from '../cursors/elementCursor'; +import liangBarksyClip from '../utilities/math/vec2/liangBarksyClip'; + +import * as lineSegment from '../utilities/math/line'; +import type { + Annotation, + Annotations, + EventTypes, + ToolHandle, + PublicToolProps, + ToolProps, + InteractionTypes, + SVGDrawingHelper, +} from '../types'; +import { isAnnotationLocked } from '../stateManagement/annotation/annotationLocking'; +import triggerAnnotationRenderForViewportIds from '../utilities/triggerAnnotationRenderForViewportIds'; + +const { RENDERING_DEFAULTS } = CONSTANTS; + +type ReferenceLine = [ + viewport: { + id: string; + canvas?: HTMLCanvasElement; + canvasToWorld?: (...args: unknown[]) => Types.Point3; + }, + startPoint: Types.Point2, + endPoint: Types.Point2, + type: 'min' | 'max' +]; + +interface VolumeCroppingAnnotation extends Annotation { + data: { + handles: { + activeOperation: number | null; // 0 translation, 1 rotation handles, 2 slab thickness handles + toolCenter: Types.Point3; + toolCenterMin: Types.Point3; + toolCenterMax: Types.Point3; + }; + activeViewportIds: string[]; // a list of the viewport ids connected to the reference lines being translated + viewportId: string; + referenceLines: ReferenceLine[]; // set in renderAnnotation + clippingPlanes?: vtkPlane[]; // clipping planes for the viewport + clippingPlaneReferenceLines?: ReferenceLine[]; + orientation?: string; // AXIAL, CORONAL, SAGITTAL + }; + isVirtual?: boolean; + virtualNormal?: Types.Point3; +} + +function defaultReferenceLineColor() { + return 'rgb(0, 200, 0)'; +} + +function defaultReferenceLineControllable() { + return true; +} + +const OPERATION = { + DRAG: 1, + ROTATE: 2, + SLAB: 3, +}; + +/** + * VolumeCroppingControlTool provides interactive reference lines to modify the cropping planes + * of the VolumeCroppingTool. It renders reference lines across 1 to 3 orthographic viewports and allows + * users to drag these lines to adjust volume cropping boundaries in real-time. + * + * @remarks + * This tool has no standalone functionality and must be used in conjunction with a VolumeCroppingTool that will be receiving volume. + * Messaging between this tool and the main cropping tool is handled through Cornerstone events that are validated by the series instance UID of the volume. + * Therefore the tool does not need to be in the same tool group as the volume cropping tool and + * multiple cropping & control instances can be used on different series in the same display. + * + * @example + * ```typescript + * // Basic setup + * const toolGroup = ToolGroupManager.createToolGroup('myToolGroup'); + * toolGroup.addTool(VolumeCroppingControlTool.toolName); + * toolGroup.addTool(VolumeCroppingTool.toolName); + * + * // Configure with custom colors and settings + * toolGroup.setToolConfiguration(VolumeCroppingControlTool.toolName, { + * lineColors: { + * AXIAL: [1.0, 0.0, 0.0], // Red for axial views + * CORONAL: [0.0, 1.0, 0.0], // Green for coronal views + * SAGITTAL: [1.0, 1.0, 0.0], // Yellow for sagittal views + * }, + * lineWidth: 2.0, + * extendReferenceLines: true, + * viewportIndicators: true + * }); + * + * // Activate the tool + * toolGroup.setToolActive(VolumeCroppingControlTool.toolName); + * ``` + * + * @public + * @class VolumeCroppingControlTool + * @extends AnnotationTool + * + * @property {string} seriesInstanceUID - Frame of reference for the tool + * @property {VolumeCroppingAnnotation[]} _virtualAnnotations - Store virtual annotations for missing viewport orientations (e.g., CT_CORONAL when only axial and sagittal are present) + * @property {string} toolName - Static tool identifier: 'VolumeCroppingControl' + * @property {Array} sphereStates - Array of sphere state objects for 3D volume manipulation handles + * @property {number|null} draggingSphereIndex - Index of currently dragged sphere, null when not dragging + * @property {Types.Point3} toolCenter - Center point of the cropping volume in world coordinates [x, y, z] + * @property {Types.Point3} toolCenterMin - Minimum bounds of the cropping volume in world coordinates [xMin, yMin, zMin] + * @property {Types.Point3} toolCenterMax - Maximum bounds of the cropping volume in world coordinates [xMax, yMax, zMax] + * @property {Function} _getReferenceLineColor - Optional callback to determine reference line color per viewport + * @property {Function} _getReferenceLineControllable - Optional callback to determine if reference lines are interactive per viewport + * + * @configuration + * @property {boolean} viewportIndicators - Whether to show colored circle indicators in viewport corners (default: false) + * @property {Object} viewportIndicatorsConfig - Configuration for viewport indicators + * @property {number} viewportIndicatorsConfig.radius - Radius of indicator circles in pixels (default: 5) + * @property {number|null} viewportIndicatorsConfig.x - X position offset, null for auto-positioning + * @property {number|null} viewportIndicatorsConfig.y - Y position offset, null for auto-positioning + * @property {number} viewportIndicatorsConfig.xOffset - X position as fraction of viewport width (default: 0.95) + * @property {number} viewportIndicatorsConfig.yOffset - Y position as fraction of viewport height (default: 0.05) + * @property {number} viewportIndicatorsConfig.circleRadius - Circle radius as fraction of diagonal length + * @property {boolean} extendReferenceLines - Whether to extend reference lines beyond intersection points with dashed lines (default: true) + * @property {number} initialCropFactor - Initial cropping factor as percentage of volume bounds (default: 0.2) + * @property {Object} mobile - Mobile-specific configuration + * @property {boolean} mobile.enabled - Enable mobile touch interactions (default: false) + * @property {number} mobile.opacity - Opacity for mobile interactions (default: 0.8) + * @property {Object} lineColors - Color configuration for different viewport orientations + * @property {number[]} lineColors.AXIAL - RGB color array for axial viewport lines [r, g, b] (default: [1.0, 0.0, 0.0]) + * @property {number[]} lineColors.CORONAL - RGB color array for coronal viewport lines [r, g, b] (default: [0.0, 1.0, 0.0]) + * @property {number[]} lineColors.SAGITTAL - RGB color array for sagittal viewport lines [r, g, b] (default: [1.0, 1.0, 0.0]) + * @property {number[]} lineColors.UNKNOWN - RGB color array for unknown orientation lines [r, g, b] (default: [0.0, 0.0, 1.0]) + * @property {number} lineWidth - Default width of reference lines in pixels (default: 1.5) + * @property {number} lineWidthActive - Width of reference lines when actively dragging in pixels (default: 2.5) + * @property {number} activeLineWidth - Alias for lineWidthActive for backward compatibility + + * @events + * @event VOLUMECROPPINGCONTROL_TOOL_CHANGED - Fired when reference lines are dragged or tool state changes + * @event VOLUMECROPPING_TOOL_CHANGED - Listens for changes from the main VolumeCroppingTool to synchronize state + * + * + * @limitations + * - Does not function independently without VolumeCroppingTool + * - Requires volume data to be loaded before activation + * - Limited to orthogonal viewport orientations (axial, coronal, sagittal)l + */ +class VolumeCroppingControlTool extends AnnotationTool { + // Store virtual annotations (e.g., for missing orientations like CT_CORONAL) + _virtualAnnotations: VolumeCroppingAnnotation[] = []; + static toolName; + seriesInstanceUID?: string; + sphereStates: { + point: Types.Point3; + axis: string; + uid: string; + sphereSource; + sphereActor; + }[] = []; + draggingSphereIndex: number | null = null; + toolCenter: Types.Point3 = [0, 0, 0]; + toolCenterMin: Types.Point3 = [0, 0, 0]; + toolCenterMax: Types.Point3 = [0, 0, 0]; + _getReferenceLineColor?: (viewportId: string) => string; + _getReferenceLineControllable?: (viewportId: string) => boolean; + constructor( + toolProps: PublicToolProps = {}, + defaultToolProps: ToolProps = { + supportedInteractionTypes: ['Mouse'], + configuration: { + // renders a colored circle on top right of the viewports whose color + // matches the color of the reference line + viewportIndicators: false, + viewportIndicatorsConfig: { + radius: 5, + x: null, + y: null, + }, + extendReferenceLines: true, + initialCropFactor: 0.2, + mobile: { + enabled: false, + opacity: 0.8, + }, + lineColors: { + AXIAL: [1.0, 0.0, 0.0], // Red for axial + CORONAL: [0.0, 1.0, 0.0], // Green for coronal + SAGITTAL: [1.0, 1.0, 0.0], // Yellow for sagittal + UNKNOWN: [0.0, 0.0, 1.0], // Blue for unknown + }, + lineWidth: 1.5, + lineWidthActive: 2.5, + }, + } + ) { + super(toolProps, defaultToolProps); + + this._getReferenceLineColor = + toolProps.configuration?.getReferenceLineColor || + defaultReferenceLineColor; + this._getReferenceLineControllable = + toolProps.configuration?.getReferenceLineControllable || + defaultReferenceLineControllable; + + const viewportsInfo = getToolGroup(this.toolGroupId)?.viewportsInfo; + + eventTarget.addEventListener( + Events.VOLUMECROPPING_TOOL_CHANGED, + this._onSphereMoved + ); + + if (viewportsInfo && viewportsInfo.length > 0) { + const { viewportId, renderingEngineId } = viewportsInfo[0]; + const enabledElement = getEnabledElementByIds( + viewportId, + renderingEngineId + ); + const renderingEngine = getRenderingEngine(renderingEngineId); + const viewport = renderingEngine.getViewport(viewportId); + const volumeActors = viewport.getActors(); + if (!volumeActors || !volumeActors.length) { + console.warn( + `VolumeCroppingControlTool: No volume actors found in viewport ${viewportId}.` + ); + return; + } + const imageData = volumeActors[0].actor.getMapper().getInputData(); + if (imageData) { + const dimensions = imageData.getDimensions(); + const spacing = imageData.getSpacing(); + const origin = imageData.getOrigin(); + this.seriesInstanceUID = imageData.seriesInstanceUID || 'unknown'; + const cropFactor = this.configuration.initialCropFactor ?? 0.2; + this.toolCenter = [ + origin[0] + cropFactor * (dimensions[0] - 1) * spacing[0], + origin[1] + cropFactor * (dimensions[1] - 1) * spacing[1], + origin[2] + cropFactor * (dimensions[2] - 1) * spacing[2], + ]; + const maxCropFactor = 1 - cropFactor; + this.toolCenterMin = [ + origin[0] + cropFactor * (dimensions[0] - 1) * spacing[0], + origin[1] + cropFactor * (dimensions[1] - 1) * spacing[1], + origin[2] + cropFactor * (dimensions[2] - 1) * spacing[2], + ]; + this.toolCenterMax = [ + origin[0] + maxCropFactor * (dimensions[0] - 1) * spacing[0], + origin[1] + maxCropFactor * (dimensions[1] - 1) * spacing[1], + origin[2] + maxCropFactor * (dimensions[2] - 1) * spacing[2], + ]; + } + } + } + + _updateToolCentersFromViewport(viewport) { + const volumeActors = viewport.getActors(); + if (!volumeActors || !volumeActors.length) { + return; + } + const imageData = volumeActors[0].actor.getMapper().getInputData(); + if (!imageData) { + return; + } + this.seriesInstanceUID = imageData.seriesInstanceUID || 'unknown'; + const dimensions = imageData.getDimensions(); + const spacing = imageData.getSpacing(); + const origin = imageData.getOrigin(); + const cropFactor = this.configuration.initialCropFactor ?? 0.2; + const cropStart = cropFactor / 2; + const cropEnd = 1 - cropFactor / 2; + this.toolCenter = [ + origin[0] + + ((cropStart + cropEnd) / 2) * (dimensions[0] - 1) * spacing[0], + origin[1] + + ((cropStart + cropEnd) / 2) * (dimensions[1] - 1) * spacing[1], + origin[2] + + ((cropStart + cropEnd) / 2) * (dimensions[2] - 1) * spacing[2], + ]; + this.toolCenterMin = [ + origin[0] + cropStart * (dimensions[0] - 1) * spacing[0], + origin[1] + cropStart * (dimensions[1] - 1) * spacing[1], + origin[2] + cropStart * (dimensions[2] - 1) * spacing[2], + ]; + this.toolCenterMax = [ + origin[0] + cropEnd * (dimensions[0] - 1) * spacing[0], + origin[1] + cropEnd * (dimensions[1] - 1) * spacing[1], + origin[2] + cropEnd * (dimensions[2] - 1) * spacing[2], + ]; + } + /** + * Gets the camera from the viewport, and adds annotation for the viewport + * to the annotationManager. If any annotation is found in the annotationManager, it + * overwrites it. + * @param viewportInfo - The viewportInfo for the viewport + * @returns viewPlaneNormal and center of viewport canvas in world space + */ + initializeViewport = ({ + renderingEngineId, + viewportId, + }: Types.IViewportId): { + normal: Types.Point3; + point: Types.Point3; + } => { + if (!renderingEngineId || !viewportId) { + console.warn( + 'VolumeCroppingControlTool: Missing renderingEngineId or viewportId' + ); + return; + } + const enabledElement = getEnabledElementByIds( + viewportId, + renderingEngineId + ); + if (!enabledElement) { + return; + } + + const { viewport } = enabledElement; + this._updateToolCentersFromViewport(viewport); + const { element } = viewport; + const { position, focalPoint, viewPlaneNormal } = viewport.getCamera(); + + // Check if there is already annotation for this viewport + let annotations = this._getAnnotations(enabledElement); + annotations = this.filterInteractableAnnotationsForElement( + element, + annotations + ); + + if (annotations?.length) { + // If found, it will override it by removing the annotation and adding it later + removeAnnotation(annotations[0].annotationUID); + } + + // Determine orientation from camera normal, fallback to viewportId string + const orientation = this._getOrientationFromNormal( + viewport.getCamera().viewPlaneNormal + ); + + const annotation = { + highlighted: false, + metadata: { + cameraPosition: [...position], + cameraFocalPoint: [...focalPoint], + toolName: this.getToolName(), + }, + data: { + handles: { + toolCenter: this.toolCenter, + toolCenterMin: this.toolCenterMin, + toolCenterMax: this.toolCenterMax, + }, + activeOperation: null, // 0 translation, 1 rotation handles, 2 slab thickness handles + activeViewportIds: [], // a list of the viewport ids connected to the reference lines being translated + viewportId, + referenceLines: [], // set in renderAnnotation + orientation, + }, + }; + + addAnnotation(annotation, element); + return { + normal: viewPlaneNormal, + point: viewport.canvasToWorld([100, 100]), + }; + }; + + _getViewportsInfo = () => { + const viewports = getToolGroup(this.toolGroupId).viewportsInfo; + return viewports; + }; + + onSetToolInactive() { + console.debug( + `VolumeCroppingControlTool: onSetToolInactive called for tool ${this.getToolName()}` + ); + } + + onSetToolActive() { + // console.debug( + // `VolumeCroppingControlTool: onSetToolActive called for tool ${this.getToolName()}` + // ); + const viewportsInfo = this._getViewportsInfo(); + + // Check if any annotation exists before proceeding + let anyAnnotationExists = false; + for (const vpInfo of viewportsInfo) { + const enabledElement = getEnabledElementByIds( + vpInfo.viewportId, + vpInfo.renderingEngineId + ); + const annotations = this._getAnnotations(enabledElement); + if (annotations && annotations.length > 0) { + anyAnnotationExists = true; + break; + } + } + if (!anyAnnotationExists) { + this._unsubscribeToViewportNewVolumeSet(viewportsInfo); + this._subscribeToViewportNewVolumeSet(viewportsInfo); + // Request the volume cropping tool to send current planes + this._computeToolCenter(viewportsInfo); + triggerEvent(eventTarget, Events.VOLUMECROPPINGCONTROL_TOOL_CHANGED, { + toolGroupId: this.toolGroupId, + viewportsInfo: viewportsInfo, + seriesInstanceUID: this.seriesInstanceUID, + }); + } else { + // Turn off visibility of existing annotations + for (const vpInfo of viewportsInfo) { + const enabledElement = getEnabledElementByIds( + vpInfo.viewportId, + vpInfo.renderingEngineId + ); + + if (!enabledElement) { + continue; + } + + const annotations = this._getAnnotations(enabledElement); + if (annotations && annotations.length > 0) { + annotations.forEach((annotation) => { + removeAnnotation(annotation.annotationUID); + }); + } + + // Render after removing annotations to clear reference lines + enabledElement.viewport.render(); + } + } + } + + onSetToolEnabled() { + console.debug( + `VolumeCroppingControlTool: onSetToolEnabled called for tool ${this.getToolName()}` + ); + const viewportsInfo = this._getViewportsInfo(); + + //this._computeToolCenter(viewportsInfo); + } + + onSetToolDisabled() { + console.debug( + `VolumeCroppingControlTool: onSetToolDisabled called for tool ${this.getToolName()}` + ); + const viewportsInfo = this._getViewportsInfo(); + + this._unsubscribeToViewportNewVolumeSet(viewportsInfo); + + // has no value when the tool is disabled + // since viewports can change (zoom, pan, scroll) + // between disabled and enabled/active states. + // so we just remove the annotations from the state + viewportsInfo.forEach(({ renderingEngineId, viewportId }) => { + const enabledElement = getEnabledElementByIds( + viewportId, + renderingEngineId + ); + + if (!enabledElement) { + return; + } + + const annotations = this._getAnnotations(enabledElement); + if (annotations?.length) { + annotations.forEach((annotation) => { + removeAnnotation(annotation.annotationUID); + }); + } + }); + } + + resetCroppingSpheres = () => { + const viewportsInfo = this._getViewportsInfo(); + for (const viewportInfo of viewportsInfo) { + const { viewportId, renderingEngineId } = viewportInfo; + const enabledElement = getEnabledElementByIds( + viewportId, + renderingEngineId + ); + const viewport = enabledElement.viewport as Types.IVolumeViewport; + const resetPan = true; + const resetZoom = true; + const resetToCenter = true; + const resetRotation = true; + const suppressEvents = true; + viewport.resetCamera({ + resetPan, + resetZoom, + resetToCenter, + resetRotation, + suppressEvents, + }); + (viewport as Types.IVolumeViewport).resetSlabThickness(); + const { element } = viewport; + let annotations = this._getAnnotations(enabledElement); + annotations = this.filterInteractableAnnotationsForElement( + element, + annotations + ); + if (annotations.length) { + removeAnnotation(annotations[0].annotationUID); + } + viewport.render(); + } + + this._computeToolCenter(viewportsInfo); + }; + + computeToolCenter = () => { + const viewportsInfo = this._getViewportsInfo(); + }; + + _computeToolCenter = (viewportsInfo): void => { + if (!viewportsInfo || !viewportsInfo[0]) { + console.warn( + ' _computeToolCenter : No valid viewportsInfo for computeToolCenter.' + ); + return; + } + // Support any missing orientation + const orientationIds = ['AXIAL', 'CORONAL', 'SAGITTAL']; + // Get present orientations from viewportsInfo + const presentOrientations = viewportsInfo + .map((vp) => { + if (vp.renderingEngineId) { + const renderingEngine = getRenderingEngine(vp.renderingEngineId); + const viewport = renderingEngine.getViewport(vp.viewportId); + if (viewport && viewport.getCamera) { + const orientation = this._getOrientationFromNormal( + viewport.getCamera().viewPlaneNormal + ); + if (orientation) { + return orientation; + } + } + } + return null; + }) + .filter(Boolean); + + const missingOrientation = orientationIds.find( + (id) => !presentOrientations.includes(id) + ); + + // Initialize present viewports + + const presentNormals: Types.Point3[] = []; + const presentCenters: Types.Point3[] = []; + // Find present viewport infos by matching orientation, not viewportId + const presentViewportInfos = viewportsInfo.filter((vp) => { + let orientation = null; + if (vp.renderingEngineId) { + const renderingEngine = getRenderingEngine(vp.renderingEngineId); + const viewport = renderingEngine.getViewport(vp.viewportId); + if (viewport && viewport.getCamera) { + orientation = this._getOrientationFromNormal( + viewport.getCamera().viewPlaneNormal + ); + } + } + return orientation && orientationIds.includes(orientation); + }); + presentViewportInfos.forEach((vpInfo) => { + const { normal, point } = this.initializeViewport(vpInfo); + presentNormals.push(normal); + presentCenters.push(point); + }); + + // If all three orientations are present, nothing to synthesize + if (presentViewportInfos.length === 2 && missingOrientation) { + // Synthesize virtual annotation for the missing orientation + const virtualNormal: Types.Point3 = [0, 0, 0]; + vec3.cross(virtualNormal, presentNormals[0], presentNormals[1]); + vec3.normalize(virtualNormal, virtualNormal); + const virtualCenter: Types.Point3 = [ + (presentCenters[0][0] + presentCenters[1][0]) / 2, + (presentCenters[0][1] + presentCenters[1][1]) / 2, + (presentCenters[0][2] + presentCenters[1][2]) / 2, + ]; + const orientation = null; + const virtualAnnotation: VolumeCroppingAnnotation = { + highlighted: false, + metadata: { + cameraPosition: [...virtualCenter], + cameraFocalPoint: [...virtualCenter], + toolName: this.getToolName(), + }, + data: { + handles: { + activeOperation: null, + toolCenter: this.toolCenter, + toolCenterMin: this.toolCenterMin, + toolCenterMax: this.toolCenterMax, + }, + activeViewportIds: [], + viewportId: missingOrientation, + referenceLines: [], + orientation, + }, + isVirtual: true, + virtualNormal, + }; + this._virtualAnnotations = [virtualAnnotation]; + } else if (presentViewportInfos.length === 1) { + // Synthesize two virtual annotations for the two missing orientations + // Get present orientation from camera normal + let presentOrientation = null; + const vpInfo = presentViewportInfos[0]; + if (vpInfo.renderingEngineId) { + const renderingEngine = getRenderingEngine(vpInfo.renderingEngineId); + const viewport = renderingEngine.getViewport(vpInfo.viewportId); + if (viewport && viewport.getCamera) { + presentOrientation = this._getOrientationFromNormal( + viewport.getCamera().viewPlaneNormal + ); + } + } + const presentCenter = presentCenters[0]; + // Map canonical normals to orientation strings + const canonicalNormals = { + AXIAL: [0, 0, 1], + CORONAL: [0, 1, 0], + SAGITTAL: [1, 0, 0], + }; + // missingIds: AXIAL, CORONAL, SAGITTAL + const missingIds = orientationIds.filter( + (id) => id !== presentOrientation + ); + const virtualAnnotations: VolumeCroppingAnnotation[] = missingIds.map( + (orientation) => { + // Use orientation string to get canonical normal + const normal = canonicalNormals[orientation]; + const virtualAnnotation = { + highlighted: false, + metadata: { + cameraPosition: [...presentCenter], + cameraFocalPoint: [...presentCenter], + toolName: this.getToolName(), + }, + data: { + handles: { + activeOperation: null, + toolCenter: this.toolCenter, + toolCenterMin: this.toolCenterMin, + toolCenterMax: this.toolCenterMax, + }, + activeViewportIds: [], + viewportId: orientation, // Use orientation string for virtual annotation + referenceLines: [], + orientation, + }, + isVirtual: true, + virtualNormal: normal, + }; + + return virtualAnnotation; + } + ); + this._virtualAnnotations = virtualAnnotations; + } + + if (viewportsInfo && viewportsInfo.length) { + triggerAnnotationRenderForViewportIds( + viewportsInfo.map(({ viewportId }) => viewportId) + ); + } + }; + /** + * Utility function to map a camera normal to an orientation string. + * Returns 'AXIAL', 'CORONAL', 'SAGITTAL', or null if not matched. + */ + _getOrientationFromNormal(normal: Types.Point3): string | null { + if (!normal) { + return null; + } + // Canonical normals + const canonical = { + AXIAL: [0, 0, 1], + CORONAL: [0, 1, 0], + SAGITTAL: [1, 0, 0], + }; + // Use a tolerance for floating point comparison + const tol = 1e-2; + for (const [key, value] of Object.entries(canonical)) { + if ( + Math.abs(normal[0] - value[0]) < tol && + Math.abs(normal[1] - value[1]) < tol && + Math.abs(normal[2] - value[2]) < tol + ) { + return key; + } + // Also check negative direction + if ( + Math.abs(normal[0] + value[0]) < tol && + Math.abs(normal[1] + value[1]) < tol && + Math.abs(normal[2] + value[2]) < tol + ) { + return key; + } + } + return null; + } + _syncWithVolumeCroppingTool(originalClippingPlanes) { + // Sync our tool centers with the clipping plane bounds + const planes = originalClippingPlanes; + if (planes.length >= 6) { + this.toolCenterMin = [ + planes[0].origin[0], // XMIN + planes[2].origin[1], // YMIN + planes[4].origin[2], // ZMIN + ]; + this.toolCenterMax = [ + planes[1].origin[0], // XMAX + planes[3].origin[1], // YMAX + planes[5].origin[2], // ZMAX + ]; + this.toolCenter = [ + (this.toolCenterMin[0] + this.toolCenterMax[0]) / 2, + (this.toolCenterMin[1] + this.toolCenterMax[1]) / 2, + (this.toolCenterMin[2] + this.toolCenterMax[2]) / 2, + ]; + + // Update annotations based on their specific orientation + const viewportsInfo = this._getViewportsInfo(); + viewportsInfo.forEach(({ viewportId, renderingEngineId }) => { + const enabledElement = getEnabledElementByIds( + viewportId, + renderingEngineId + ); + if (enabledElement) { + const annotations = this._getAnnotations(enabledElement); + annotations.forEach((annotation) => { + if ( + annotation.data && + annotation.data.handles && + annotation.data.orientation + ) { + const orientation = annotation.data.orientation; + + // Update tool centers based on the specific orientation + if (orientation === 'AXIAL') { + // Axial views see X and Y clipping planes + annotation.data.handles.toolCenterMin = [ + planes[0].origin[0], // XMIN + planes[2].origin[1], // YMIN + annotation.data.handles.toolCenterMin[2], // Keep existing Z + ]; + annotation.data.handles.toolCenterMax = [ + planes[1].origin[0], // XMAX + planes[3].origin[1], // YMAX + annotation.data.handles.toolCenterMax[2], // Keep existing Z + ]; + } else if (orientation === 'CORONAL') { + // Coronal views see X and Z clipping planes + annotation.data.handles.toolCenterMin = [ + planes[0].origin[0], // XMIN + annotation.data.handles.toolCenterMin[1], // Keep existing Y + planes[4].origin[2], // ZMIN + ]; + annotation.data.handles.toolCenterMax = [ + planes[1].origin[0], // XMAX + annotation.data.handles.toolCenterMax[1], // Keep existing Y + planes[5].origin[2], // ZMAX + ]; + } else if (orientation === 'SAGITTAL') { + // Sagittal views see Y and Z clipping planes + annotation.data.handles.toolCenterMin = [ + annotation.data.handles.toolCenterMin[0], // Keep existing X + planes[2].origin[1], // YMIN + planes[4].origin[2], // ZMIN + ]; + annotation.data.handles.toolCenterMax = [ + annotation.data.handles.toolCenterMax[0], // Keep existing X + planes[3].origin[1], // YMAX + planes[5].origin[2], // ZMAX + ]; + } + + // Update the tool center as midpoint + annotation.data.handles.toolCenter = [ + (annotation.data.handles.toolCenterMin[0] + + annotation.data.handles.toolCenterMax[0]) / + 2, + (annotation.data.handles.toolCenterMin[1] + + annotation.data.handles.toolCenterMax[1]) / + 2, + (annotation.data.handles.toolCenterMin[2] + + annotation.data.handles.toolCenterMax[2]) / + 2, + ]; + } + }); + } + }); + + // Update virtual annotations as well + if (this._virtualAnnotations && this._virtualAnnotations.length > 0) { + this._virtualAnnotations.forEach((annotation) => { + if ( + annotation.data && + annotation.data.handles && + annotation.data.orientation + ) { + const orientation = annotation.data.orientation.toUpperCase(); + + // Apply the same orientation-specific logic to virtual annotations + if (orientation === 'AXIAL') { + annotation.data.handles.toolCenterMin = [ + planes[0].origin[0], // XMIN + planes[2].origin[1], // YMIN + annotation.data.handles.toolCenterMin[2], + ]; + annotation.data.handles.toolCenterMax = [ + planes[1].origin[0], // XMAX + planes[3].origin[1], // YMAX + annotation.data.handles.toolCenterMax[2], + ]; + } else if (orientation === 'CORONAL') { + annotation.data.handles.toolCenterMin = [ + planes[0].origin[0], // XMIN + annotation.data.handles.toolCenterMin[1], + planes[4].origin[2], // ZMIN + ]; + annotation.data.handles.toolCenterMax = [ + planes[1].origin[0], // XMAX + annotation.data.handles.toolCenterMax[1], + planes[5].origin[2], // ZMAX + ]; + } else if (orientation === 'SAGITTAL') { + annotation.data.handles.toolCenterMin = [ + annotation.data.handles.toolCenterMin[0], + planes[2].origin[1], // YMIN + planes[4].origin[2], // ZMIN + ]; + annotation.data.handles.toolCenterMax = [ + annotation.data.handles.toolCenterMax[0], + planes[3].origin[1], // YMAX + planes[5].origin[2], // ZMAX + ]; + } + + annotation.data.handles.toolCenter = [ + (annotation.data.handles.toolCenterMin[0] + + annotation.data.handles.toolCenterMax[0]) / + 2, + (annotation.data.handles.toolCenterMin[1] + + annotation.data.handles.toolCenterMax[1]) / + 2, + (annotation.data.handles.toolCenterMin[2] + + annotation.data.handles.toolCenterMax[2]) / + 2, + ]; + } + }); + } + + // Trigger re-render to show updated reference lines + triggerAnnotationRenderForViewportIds( + viewportsInfo.map(({ viewportId }) => viewportId) + ); + } + } + + setToolCenter(toolCenter: Types.Point3, handleType): void { + if (handleType === 'min') { + this.toolCenterMin = [...toolCenter]; + } else if (handleType === 'max') { + this.toolCenterMax = [...toolCenter]; + } + const viewportsInfo = this._getViewportsInfo(); + + // assuming all viewports are in the same rendering engine + triggerAnnotationRenderForViewportIds( + viewportsInfo.map(({ viewportId }) => viewportId) + ); + } + + /** + * addNewAnnotation is called when the user clicks on the image. + * It does not store the annotation in the stateManager though. + * + * @param evt - The mouse event + * @param interactionType - The type of interaction (e.g., mouse, touch, etc.) + * @returns annotation + */ + + addNewAnnotation( + evt: EventTypes.InteractionEventType + ): VolumeCroppingAnnotation { + const eventDetail = evt.detail; + const { element } = eventDetail; + const enabledElement = getEnabledElement(element); + const { viewport } = enabledElement; + const annotations = this._getAnnotations(enabledElement); + const filteredAnnotations = this.filterInteractableAnnotationsForElement( + viewport.element, + annotations + ); + + // Guard clause: if no interactable annotation, return null + if ( + !filteredAnnotations || + filteredAnnotations.length === 0 || + !filteredAnnotations[0] + ) { + return null; + } + + const { data } = filteredAnnotations[0]; + + const viewportIdArray = []; + // put all the draggable reference lines in the viewportIdArray + + const referenceLines = data.referenceLines || []; + for (let i = 0; i < referenceLines.length; ++i) { + const otherViewport = referenceLines[i][0]; + const viewportControllable = this._getReferenceLineControllable( + otherViewport.id + ); + + if (!viewportControllable) { + continue; + } + viewportIdArray.push(otherViewport.id); + i++; + } + + data.activeViewportIds = [...viewportIdArray]; + // set translation operation + data.handles.activeOperation = OPERATION.DRAG; + + evt.preventDefault(); + + hideElementCursor(element); + + this._activateModify(element); + return filteredAnnotations[0]; + } + + cancel = () => { + console.log('Not implemented yet'); + }; + + /** + * It returns if the canvas point is near the provided volume cropping annotation in the + * provided element or not. A proximity is passed to the function to determine the + * proximity of the point to the annotation in number of pixels. + * + * @param element - HTML Element + * @param annotation - Annotation + * @param canvasCoords - Canvas coordinates + * @param proximity - Proximity to tool to consider + * @returns Boolean, whether the canvas point is near tool + */ + isPointNearTool = ( + element: HTMLDivElement, + annotation: VolumeCroppingAnnotation, + canvasCoords: Types.Point2, + proximity: number + ): boolean => { + if (this._pointNearTool(element, annotation, canvasCoords, 6)) { + return true; + } + + return false; + }; + + toolSelectedCallback = ( + evt: EventTypes.InteractionEventType, + annotation: Annotation, + interactionType: InteractionTypes + ): void => { + const eventDetail = evt.detail; + const { element } = eventDetail; + annotation.highlighted = true; + this._activateModify(element); + + hideElementCursor(element); + + evt.preventDefault(); + }; + + handleSelectedCallback( + evt: EventTypes.InteractionEventType, + annotation: Annotation, + handle: ToolHandle, + interactionType: InteractionTypes + ): void { + // You can customize this logic as needed + // For now, just call toolSelectedCallback if you want default behavior + this.toolSelectedCallback(evt, annotation, interactionType); + } + + onResetCamera = (evt) => { + this.resetCroppingSpheres(); + }; + + mouseMoveCallback = ( + evt: EventTypes.MouseMoveEventType, + filteredToolAnnotations: Annotations + ): boolean => { + if (!filteredToolAnnotations) { + return; + } + const { element, currentPoints } = evt.detail; + const canvasCoords = currentPoints.canvas; + let imageNeedsUpdate = false; + + for (let i = 0; i < filteredToolAnnotations.length; i++) { + const annotation = filteredToolAnnotations[i] as VolumeCroppingAnnotation; + + if (isAnnotationLocked(annotation.annotationUID)) { + continue; + } + + const { data, highlighted } = annotation; + if (!data.handles) { + continue; + } + + const previousActiveOperation = data.handles.activeOperation; + const previousActiveViewportIds = + data.activeViewportIds && data.activeViewportIds.length > 0 + ? [...data.activeViewportIds] + : []; + + // This init are necessary, because when we move the mouse they are not cleaned by _endCallback + data.activeViewportIds = []; + let near = false; + near = this._pointNearTool(element, annotation, canvasCoords, 6); + + const nearToolAndNotMarkedActive = near && !highlighted; + const notNearToolAndMarkedActive = !near && highlighted; + if (nearToolAndNotMarkedActive || notNearToolAndMarkedActive) { + annotation.highlighted = !highlighted; + imageNeedsUpdate = true; + } + } + + return imageNeedsUpdate; + }; + + filterInteractableAnnotationsForElement = (element, annotations) => { + if (!annotations || !annotations.length) { + return []; + } + + const enabledElement = getEnabledElement(element); + // Use orientation property for matching + let orientation = null; + if (enabledElement.viewport && enabledElement.viewport.getCamera) { + orientation = this._getOrientationFromNormal( + enabledElement.viewport.getCamera().viewPlaneNormal + ); + } + + // Filter annotations for this orientation, including virtual annotations + const filtered = annotations.filter((annotation) => { + // Always include virtual annotations for reference line rendering + if (annotation.isVirtual) { + return true; + } + // Match by orientation property + if ( + annotation.data.orientation && + orientation && + annotation.data.orientation === orientation + ) { + return true; + } + return false; + }); + + return filtered; + }; + + /** + * renders the volume cropping lines and handles in the requestAnimationFrame callback + * + * @param enabledElement - The Cornerstone's enabledElement. + * @param svgDrawingHelper - The svgDrawingHelper providing the context for drawing. + */ + renderAnnotation = ( + enabledElement: Types.IEnabledElement, + svgDrawingHelper: SVGDrawingHelper + ): boolean => { + function lineIntersection2D(p1, p2, q1, q2) { + const s1_x = p2[0] - p1[0]; + const s1_y = p2[1] - p1[1]; + const s2_x = q2[0] - q1[0]; + const s2_y = q2[1] - q1[1]; + const denom = -s2_x * s1_y + s1_x * s2_y; + if (Math.abs(denom) < 1e-8) { + return null; + } // Parallel + const s = (-s1_y * (p1[0] - q1[0]) + s1_x * (p1[1] - q1[1])) / denom; + const t = (s2_x * (p1[1] - q1[1]) - s2_y * (p1[0] - q1[0])) / denom; + if (s >= 0 && s <= 1 && t >= 0 && t <= 1) { + return [p1[0] + t * s1_x, p1[1] + t * s1_y]; + } + return null; + } + const viewportsInfo = this._getViewportsInfo(); + if (!viewportsInfo || viewportsInfo.length === 0) { + // No viewports available + return false; + } + let renderStatus = false; + const { viewport, renderingEngine } = enabledElement; + const { element } = viewport; + let annotations = this._getAnnotations(enabledElement); + // If we have virtual annotations , always include them + if (this._virtualAnnotations && this._virtualAnnotations.length) { + annotations = annotations.concat(this._virtualAnnotations); + } + const camera = viewport.getCamera(); + const filteredToolAnnotations = + this.filterInteractableAnnotationsForElement(element, annotations); + + // viewport Annotation: use the first annotation for the current viewport + const viewportAnnotation = filteredToolAnnotations[0]; + if (!viewportAnnotation || !viewportAnnotation.data) { + // No annotation for this viewport + return renderStatus; + } + + const annotationUID = viewportAnnotation.annotationUID; + + // Get cameras/canvases for each of these. + // -- Get two world positions for this canvas in this line (e.g. the diagonal) + // -- Convert these world positions to this canvas. + // -- Extend/confine this line to fit in this canvas. + // -- Render this line. + const { clientWidth, clientHeight } = viewport.canvas; + const canvasDiagonalLength = Math.sqrt( + clientWidth * clientWidth + clientHeight * clientHeight + ); + + const data = viewportAnnotation.data; + // Get all other annotations except the current viewport's + const otherViewportAnnotations = annotations; + + const volumeCroppingCenterCanvasMin = viewport.worldToCanvas( + this.toolCenterMin + ); + const volumeCroppingCenterCanvasMax = viewport.worldToCanvas( + this.toolCenterMax + ); + + const referenceLines = []; + + // get canvas information for points and lines (canvas box, canvas horizontal distances) + const canvasBox = [0, 0, clientWidth, clientHeight]; + + otherViewportAnnotations.forEach((annotation) => { + const data = annotation.data; + // Type guard for isVirtual property + const isVirtual = + 'isVirtual' in annotation && + (annotation as { isVirtual?: boolean }).isVirtual === true; + data.handles.toolCenter = this.toolCenter; + let otherViewport, + otherCamera, + clientWidth, + clientHeight, + otherCanvasDiagonalLength, + otherCanvasCenter, + otherViewportCenterWorld; + if (isVirtual) { + // Synthesize a virtual viewport/camera for any missing orientation + const realViewports = viewportsInfo.filter( + (vp) => vp.viewportId !== data.viewportId + ); + if (realViewports.length === 2) { + const vp1 = renderingEngine.getViewport(realViewports[0].viewportId); + const vp2 = renderingEngine.getViewport(realViewports[1].viewportId); + const normal1 = vp1.getCamera().viewPlaneNormal; + const normal2 = vp2.getCamera().viewPlaneNormal; + const virtualNormal = vec3.create(); + vec3.cross(virtualNormal, normal1, normal2); + vec3.normalize(virtualNormal, virtualNormal); + otherCamera = { + viewPlaneNormal: virtualNormal, + position: data.handles.toolCenter, + focalPoint: data.handles.toolCenter, + viewUp: [0, 1, 0], + }; + clientWidth = viewport.canvas.clientWidth; + clientHeight = viewport.canvas.clientHeight; + otherCanvasDiagonalLength = Math.sqrt( + clientWidth * clientWidth + clientHeight * clientHeight + ); + otherCanvasCenter = [clientWidth * 0.5, clientHeight * 0.5]; + otherViewportCenterWorld = data.handles.toolCenter; + otherViewport = { + id: data.viewportId, + canvas: viewport.canvas, + canvasToWorld: () => data.handles.toolCenter, + }; + } else { + // Only one real viewport: use canonical normal from virtual annotation + const virtualNormal = (annotation as VolumeCroppingAnnotation) + .virtualNormal ?? [0, 0, 1]; + otherCamera = { + viewPlaneNormal: virtualNormal, + position: data.handles.toolCenter, + focalPoint: data.handles.toolCenter, + viewUp: [0, 1, 0], + }; + clientWidth = viewport.canvas.clientWidth; + clientHeight = viewport.canvas.clientHeight; + otherCanvasDiagonalLength = Math.sqrt( + clientWidth * clientWidth + clientHeight * clientHeight + ); + otherCanvasCenter = [clientWidth * 0.5, clientHeight * 0.5]; + otherViewportCenterWorld = data.handles.toolCenter; + otherViewport = { + id: data.viewportId, + canvas: viewport.canvas, + canvasToWorld: () => data.handles.toolCenter, + }; + } + } else { + otherViewport = renderingEngine.getViewport(data.viewportId as string); + otherCamera = otherViewport.getCamera(); + clientWidth = otherViewport.canvas.clientWidth; + clientHeight = otherViewport.canvas.clientHeight; + otherCanvasDiagonalLength = Math.sqrt( + clientWidth * clientWidth + clientHeight * clientHeight + ); + otherCanvasCenter = [clientWidth * 0.5, clientHeight * 0.5]; + otherViewportCenterWorld = + otherViewport.canvasToWorld(otherCanvasCenter); + } + + const otherViewportControllable = this._getReferenceLineControllable( + otherViewport.id + ); + + const direction = [0, 0, 0]; + vtkMath.cross( + camera.viewPlaneNormal as [number, number, number], + otherCamera.viewPlaneNormal as [number, number, number], + direction as [number, number, number] + ); + vtkMath.normalize(direction as [number, number, number]); + vtkMath.multiplyScalar( + direction as [number, number, number], + otherCanvasDiagonalLength + ); + + const pointWorld0: [number, number, number] = [0, 0, 0]; + vtkMath.add( + otherViewportCenterWorld as [number, number, number], + direction as [number, number, number], + pointWorld0 + ); + const pointWorld1: [number, number, number] = [0, 0, 0]; + vtkMath.subtract( + otherViewportCenterWorld as [number, number, number], + direction as [number, number, number], + pointWorld1 + ); + + const pointCanvas0 = viewport.worldToCanvas(pointWorld0 as Types.Point3); + const otherViewportCenterCanvas = viewport.worldToCanvas([ + otherViewportCenterWorld[0] ?? 0, + otherViewportCenterWorld[1] ?? 0, + otherViewportCenterWorld[2] ?? 0, + ] as [number, number, number] as Types.Point3); + + const canvasUnitVectorFromCenter = vec2.create(); + vec2.subtract( + canvasUnitVectorFromCenter, + pointCanvas0, + otherViewportCenterCanvas + ); + vec2.normalize(canvasUnitVectorFromCenter, canvasUnitVectorFromCenter); + + const canvasVectorFromCenterLong = vec2.create(); + vec2.scale( + canvasVectorFromCenterLong, + canvasUnitVectorFromCenter, + canvasDiagonalLength * 100 + ); + + // For min + const refLinesCenterMin = otherViewportControllable + ? vec2.clone(volumeCroppingCenterCanvasMin) + : vec2.clone(otherViewportCenterCanvas); + const refLinePointMinOne = vec2.create(); + const refLinePointMinTwo = vec2.create(); + vec2.add( + refLinePointMinOne, + refLinesCenterMin, + canvasVectorFromCenterLong + ); + vec2.subtract( + refLinePointMinTwo, + refLinesCenterMin, + canvasVectorFromCenterLong + ); + liangBarksyClip(refLinePointMinOne, refLinePointMinTwo, canvasBox); + referenceLines.push([ + otherViewport, + refLinePointMinOne, + refLinePointMinTwo, + 'min', + ]); + + // For max center + const refLinesCenterMax = otherViewportControllable + ? vec2.clone(volumeCroppingCenterCanvasMax) + : vec2.clone(otherViewportCenterCanvas); + const refLinePointMaxOne = vec2.create(); + const refLinePointMaxTwo = vec2.create(); + vec2.add( + refLinePointMaxOne, + refLinesCenterMax, + canvasVectorFromCenterLong + ); + vec2.subtract( + refLinePointMaxTwo, + refLinesCenterMax, + canvasVectorFromCenterLong + ); + liangBarksyClip(refLinePointMaxOne, refLinePointMaxTwo, canvasBox); + referenceLines.push([ + otherViewport, + refLinePointMaxOne, + refLinePointMaxTwo, + 'max', + ]); + }); + + data.referenceLines = referenceLines; + + const viewportColor = this._getReferenceLineColor(viewport.id); + const color = + viewportColor !== undefined ? viewportColor : 'rgb(200, 200, 200)'; + + referenceLines.forEach((line, lineIndex) => { + // Calculate intersections with other lines in this viewport + const intersections = []; + for (let j = 0; j < referenceLines.length; ++j) { + if (j === lineIndex) { + continue; + } + const otherLine = referenceLines[j]; + const intersection = lineIntersection2D( + line[1], + line[2], + otherLine[1], + otherLine[2] + ); + if (intersection) { + intersections.push({ + with: otherLine[3], // 'min' or 'max' + point: intersection, + }); + } + } + + // get color for the reference line using orientation + const otherViewport = line[0]; + let orientation = null; + // Try to get orientation from annotation data or viewportId + if (otherViewport && otherViewport.id) { + // Try to get from annotation if available + const annotationForViewport = annotations.find( + (a) => a.data.viewportId === otherViewport.id + ); + if (annotationForViewport && annotationForViewport.data.orientation) { + orientation = String( + annotationForViewport.data.orientation + ).toUpperCase(); + } else { + // Fallback: try to infer from viewportId + const idUpper = otherViewport.id.toUpperCase(); + if (idUpper.includes('AXIAL')) { + orientation = 'AXIAL'; + } else if (idUpper.includes('CORONAL')) { + orientation = 'CORONAL'; + } else if (idUpper.includes('SAGITTAL')) { + orientation = 'SAGITTAL'; + } + } + } + // Use lineColors from configuration + const lineColors = this.configuration.lineColors || {}; + const colorArr = lineColors[orientation] || + lineColors.unknown || [1.0, 0.0, 0.0]; // fallback to red + // Convert [r,g,b] to rgb string if needed + const color = Array.isArray(colorArr) + ? `rgb(${colorArr.map((v) => Math.round(v * 255)).join(',')})` + : colorArr; + + const viewportControllable = this._getReferenceLineControllable( + otherViewport.id + ); + const selectedViewportId = data.activeViewportIds.find( + (id) => id === otherViewport.id + ); + + let lineWidth = this.configuration.lineWidth ?? 1.5; + const lineActive = + data.handles.activeOperation !== null && + data.handles.activeOperation === OPERATION.DRAG && + selectedViewportId; + if (lineActive) { + lineWidth = this.configuration.activeLineWidth ?? 2.5; + } + + const lineUID = `${lineIndex}`; + if (viewportControllable) { + if (intersections.length === 2) { + drawLineSvg( + svgDrawingHelper, + annotationUID, + lineUID, + intersections[0].point, + intersections[1].point, + { + color, + lineWidth, + } + ); + } + if ( + this.configuration.extendReferenceLines && + intersections.length === 2 + ) { + if ( + this.configuration.extendReferenceLines && + intersections.length === 2 + ) { + // Sort intersections by distance from line start + const sortedIntersections = intersections + .map((intersection) => ({ + ...intersection, + distance: vec2.distance(line[1], intersection.point), + })) + .sort((a, b) => a.distance - b.distance); + + // Draw dashed lines in correct order + drawLineSvg( + svgDrawingHelper, + annotationUID, + lineUID + '_dashed_before', + line[1], + sortedIntersections[0].point, + { color, lineWidth, lineDash: [4, 4] } + ); + + drawLineSvg( + svgDrawingHelper, + annotationUID, + lineUID + '_dashed_after', + sortedIntersections[1].point, + line[2], + { color, lineWidth, lineDash: [4, 4] } + ); + } + } + } + }); + + renderStatus = true; + + if (this.configuration.viewportIndicators) { + const { viewportIndicatorsConfig } = this.configuration; + const xOffset = viewportIndicatorsConfig?.xOffset || 0.95; + const yOffset = viewportIndicatorsConfig?.yOffset || 0.05; + const referenceColorCoordinates = [ + clientWidth * xOffset, + clientHeight * yOffset, + ]; + + const circleRadius = + viewportIndicatorsConfig?.circleRadius || canvasDiagonalLength * 0.01; + + const circleUID = '0'; + drawCircleSvg( + svgDrawingHelper, + annotationUID, + circleUID, + referenceColorCoordinates as Types.Point2, + circleRadius, + { color, fill: color } + ); + } + + return renderStatus; + }; + + _getAnnotations = (enabledElement: Types.IEnabledElement) => { + const { viewport } = enabledElement; + const annotations = + getAnnotations(this.getToolName(), viewport.element) || []; + const viewportIds = this._getViewportsInfo().map( + ({ viewportId }) => viewportId + ); + + // filter the annotations to only keep that are for this toolGroup + const toolGroupAnnotations = annotations.filter((annotation) => { + const { data } = annotation; + return viewportIds.includes(data.viewportId); + }); + + return toolGroupAnnotations; + }; + + _onSphereMoved = (evt) => { + if (evt.detail.originalClippingPlanes) { + this._syncWithVolumeCroppingTool(evt.detail.originalClippingPlanes); + } else { + if (evt.detail.seriesInstanceUID !== this.seriesInstanceUID) { + return; + } + // This is called when a sphere is moved + const { draggingSphereIndex, toolCenter } = evt.detail; + const newMin: [number, number, number] = [...this.toolCenterMin]; + const newMax: [number, number, number] = [...this.toolCenterMax]; + // face spheres + if (draggingSphereIndex >= 0 && draggingSphereIndex <= 5) { + const axis = Math.floor(draggingSphereIndex / 2); + const isMin = draggingSphereIndex % 2 === 0; + (isMin ? newMin : newMax)[axis] = toolCenter[axis]; + this.setToolCenter(newMin, 'min'); + this.setToolCenter(newMax, 'max'); + return; + } + // corner spheres + if (draggingSphereIndex >= 6 && draggingSphereIndex <= 13) { + const idx = draggingSphereIndex; + if (idx < 10) { + newMin[0] = toolCenter[0]; + } else { + newMax[0] = toolCenter[0]; + } + if ([6, 7, 10, 11].includes(idx)) { + newMin[1] = toolCenter[1]; + } else { + newMax[1] = toolCenter[1]; + } + if (idx % 2 === 0) { + newMin[2] = toolCenter[2]; + } else { + newMax[2] = toolCenter[2]; + } + this.setToolCenter(newMin, 'min'); + this.setToolCenter(newMax, 'max'); + } + } + }; + + _onNewVolume = () => { + const viewportsInfo = this._getViewportsInfo(); + if (viewportsInfo && viewportsInfo.length > 0) { + const { viewportId, renderingEngineId } = viewportsInfo[0]; + const renderingEngine = getRenderingEngine(renderingEngineId); + const viewport = renderingEngine.getViewport(viewportId); + const volumeActors = viewport.getActors(); + if (volumeActors.length > 0) { + const imageData = volumeActors[0].actor.getMapper().getInputData(); + if (imageData) { + this.seriesInstanceUID = imageData.seriesInstanceUID; + this._updateToolCentersFromViewport(viewport); + // Update all annotations' handles.toolCenter + const annotations = + getAnnotations(this.getToolName(), viewportId) || []; + annotations.forEach((annotation) => { + if (annotation.data && annotation.data.handles) { + annotation.data.handles.toolCenter = [...this.toolCenter]; + } + }); + } + } + } + this._computeToolCenter(viewportsInfo); + triggerEvent(eventTarget, Events.VOLUMECROPPINGCONTROL_TOOL_CHANGED, { + toolGroupId: this.toolGroupId, + viewportsInfo: viewportsInfo, + seriesInstanceUID: this.seriesInstanceUID, + }); + }; + + _unsubscribeToViewportNewVolumeSet(viewportsInfo) { + viewportsInfo.forEach(({ viewportId, renderingEngineId }) => { + const { viewport } = getEnabledElementByIds( + viewportId, + renderingEngineId + ); + const { element } = viewport; + + element.removeEventListener( + Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME, + this._onNewVolume + ); + }); + } + + _subscribeToViewportNewVolumeSet(viewports) { + viewports.forEach(({ viewportId, renderingEngineId }) => { + const { viewport } = getEnabledElementByIds( + viewportId, + renderingEngineId + ); + const { element } = viewport; + + element.addEventListener( + Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME, + this._onNewVolume + ); + }); + } + + _getAnnotationsForViewportsWithDifferentCameras = ( + enabledElement, + annotations + ) => { + const { viewportId, renderingEngine, viewport } = enabledElement; + + const otherViewportAnnotations = annotations.filter( + (annotation) => annotation.data.viewportId !== viewportId + ); + + if (!otherViewportAnnotations || !otherViewportAnnotations.length) { + return []; + } + + const camera = viewport.getCamera(); + const { viewPlaneNormal, position } = camera; + + const viewportsWithDifferentCameras = otherViewportAnnotations.filter( + (annotation) => { + const { viewportId } = annotation.data; + const targetViewport = renderingEngine.getViewport(viewportId); + const cameraOfTarget = targetViewport.getCamera(); + + return !( + csUtils.isEqual( + cameraOfTarget.viewPlaneNormal, + viewPlaneNormal, + 1e-2 + ) && csUtils.isEqual(cameraOfTarget.position, position, 1) + ); + } + ); + + return viewportsWithDifferentCameras; + }; + + _filterViewportWithSameOrientation = ( + enabledElement, + referenceAnnotation, + annotations + ) => { + const { renderingEngine } = enabledElement; + const { data } = referenceAnnotation; + const viewport = renderingEngine.getViewport(data.viewportId); + + const linkedViewportAnnotations = annotations.filter((annotation) => { + const { data } = annotation; + const otherViewport = renderingEngine.getViewport(data.viewportId); + const otherViewportControllable = this._getReferenceLineControllable( + otherViewport.id + ); + + return otherViewportControllable === true; + }); + + if (!linkedViewportAnnotations || !linkedViewportAnnotations.length) { + return []; + } + + const camera = viewport.getCamera(); + const viewPlaneNormal = camera.viewPlaneNormal; + vtkMath.normalize(viewPlaneNormal); + + const otherViewportsAnnotationsWithSameCameraDirection = + linkedViewportAnnotations.filter((annotation) => { + const { viewportId } = annotation.data; + const otherViewport = renderingEngine.getViewport(viewportId); + const otherCamera = otherViewport.getCamera(); + const otherViewPlaneNormal = otherCamera.viewPlaneNormal; + vtkMath.normalize(otherViewPlaneNormal); + + return ( + csUtils.isEqual(viewPlaneNormal, otherViewPlaneNormal, 1e-2) && + csUtils.isEqual(camera.viewUp, otherCamera.viewUp, 1e-2) + ); + }); + + return otherViewportsAnnotationsWithSameCameraDirection; + }; + + _activateModify = (element) => { + // mobile sometimes has lingering interaction even when touchEnd triggers + // this check allows for multiple handles to be active which doesn't affect + // tool usage. + state.isInteractingWithTool = !this.configuration.mobile?.enabled; + + element.addEventListener(Events.MOUSE_UP, this._endCallback); + element.addEventListener(Events.MOUSE_DRAG, this._dragCallback); + element.addEventListener(Events.MOUSE_CLICK, this._endCallback); + + element.addEventListener(Events.TOUCH_END, this._endCallback); + element.addEventListener(Events.TOUCH_DRAG, this._dragCallback); + element.addEventListener(Events.TOUCH_TAP, this._endCallback); + }; + + _deactivateModify = (element) => { + state.isInteractingWithTool = false; + + element.removeEventListener(Events.MOUSE_UP, this._endCallback); + element.removeEventListener(Events.MOUSE_DRAG, this._dragCallback); + element.removeEventListener(Events.MOUSE_CLICK, this._endCallback); + + element.removeEventListener(Events.TOUCH_END, this._endCallback); + element.removeEventListener(Events.TOUCH_DRAG, this._dragCallback); + element.removeEventListener(Events.TOUCH_TAP, this._endCallback); + }; + + _endCallback = (evt: EventTypes.InteractionEventType) => { + const eventDetail = evt.detail; + const { element } = eventDetail; + + this.editData.annotation.data.handles.activeOperation = null; + this.editData.annotation.data.activeViewportIds = []; + + this._deactivateModify(element); + + resetElementCursor(element); + + this.editData = null; + + const requireSameOrientation = false; + const viewportIdsToRender = getViewportIdsWithToolToRender( + element, + this.getToolName(), + requireSameOrientation + ); + + triggerAnnotationRenderForViewportIds(viewportIdsToRender); + }; + + _dragCallback = (evt: EventTypes.InteractionEventType) => { + const eventDetail = evt.detail; + const delta = eventDetail.deltaPoints.world; + + if ( + Math.abs(delta[0]) < 1e-3 && + Math.abs(delta[1]) < 1e-3 && + Math.abs(delta[2]) < 1e-3 + ) { + return; + } + + const { element } = eventDetail; + const enabledElement = getEnabledElement(element); + const { viewport } = enabledElement; + if (viewport.type === Enums.ViewportType.VOLUME_3D) { + return; + } + const annotations = this._getAnnotations( + enabledElement + ) as VolumeCroppingAnnotation[]; + const filteredToolAnnotations = + this.filterInteractableAnnotationsForElement(element, annotations); + + // viewport Annotation + const viewportAnnotation = filteredToolAnnotations[0]; + if (!viewportAnnotation) { + return; + } + + const { handles } = viewportAnnotation.data; + + if (handles.activeOperation === OPERATION.DRAG) { + if (handles.activeType === 'min') { + this.toolCenterMin[0] += delta[0]; + this.toolCenterMin[1] += delta[1]; + this.toolCenterMin[2] += delta[2]; + } else if (handles.activeType === 'max') { + this.toolCenterMax[0] += delta[0]; + this.toolCenterMax[1] += delta[1]; + this.toolCenterMax[2] += delta[2]; + } else { + this.toolCenter[0] += delta[0]; + this.toolCenter[1] += delta[1]; + this.toolCenter[2] += delta[2]; + } + const viewportsInfo = this._getViewportsInfo(); + triggerAnnotationRenderForViewportIds( + viewportsInfo.map(({ viewportId }) => viewportId) + ); + triggerEvent(eventTarget, Events.VOLUMECROPPINGCONTROL_TOOL_CHANGED, { + toolGroupId: this.toolGroupId, + toolCenter: this.toolCenter, + toolCenterMin: this.toolCenterMin, + toolCenterMax: this.toolCenterMax, + handleType: handles.activeType, + viewportOrientation: [], + seriesInstanceUID: this.seriesInstanceUID, + }); + } + }; + + _applyDeltaShiftToSelectedViewportCameras( + renderingEngine, + viewportsAnnotationsToUpdate, + delta + ) { + // update camera for the other viewports. + // NOTE1: The lines then are rendered by the onCameraModified + viewportsAnnotationsToUpdate.forEach((annotation) => { + this._applyDeltaShiftToViewportCamera(renderingEngine, annotation, delta); + }); + } + + _applyDeltaShiftToViewportCamera( + renderingEngine: Types.IRenderingEngine, + annotation, + delta + ) { + const { data } = annotation; + + const viewport = renderingEngine.getViewport(data.viewportId); + const camera = viewport.getCamera(); + const normal = camera.viewPlaneNormal; + + // Project delta over camera normal + // (we don't need to pan, we need only to scroll the camera as in the wheel stack scroll tool) + const dotProd = vtkMath.dot(delta, normal); + const projectedDelta: Types.Point3 = [...normal]; + vtkMath.multiplyScalar(projectedDelta, dotProd); + + if ( + Math.abs(projectedDelta[0]) > 1e-3 || + Math.abs(projectedDelta[1]) > 1e-3 || + Math.abs(projectedDelta[2]) > 1e-3 + ) { + const newFocalPoint: Types.Point3 = [0, 0, 0]; + const newPosition: Types.Point3 = [0, 0, 0]; + + vtkMath.add(camera.focalPoint, projectedDelta, newFocalPoint); + vtkMath.add(camera.position, projectedDelta, newPosition); + + viewport.setCamera({ + focalPoint: newFocalPoint, + position: newPosition, + }); + viewport.render(); + } + } + + _pointNearTool(element, annotation, canvasCoords, proximity) { + const { data } = annotation; + + // You must have referenceLines available in annotation.data. + // If not, you can recompute them here or store them in renderAnnotation. + // For this example, let's assume you store them as data.referenceLines. + const referenceLines = data.referenceLines; + + const viewportIdArray = []; + + if (referenceLines) { + for (let i = 0; i < referenceLines.length; ++i) { + // Each line: [otherViewport, refLinePointOne, refLinePointMinOne, ...] + const otherViewport = referenceLines[i][0]; + // First segment + const start1 = referenceLines[i][1]; + const end1 = referenceLines[i][2]; + const type = referenceLines[i][3]; // 'min' or 'max' + + const distance1 = lineSegment.distanceToPoint(start1, end1, [ + canvasCoords[0], + canvasCoords[1], + ]); + + if (distance1 <= proximity) { + viewportIdArray.push(otherViewport.id); + data.handles.activeOperation = 1; // DRAG + data.handles.activeType = type; + } + } + } + + data.activeViewportIds = [...viewportIdArray]; + + this.editData = { + annotation, + }; + return data.handles.activeOperation === 1 ? true : false; + } +} + +VolumeCroppingControlTool.toolName = 'VolumeCroppingControl'; +export default VolumeCroppingControlTool; diff --git a/packages/tools/src/tools/VolumeCroppingTool.ts b/packages/tools/src/tools/VolumeCroppingTool.ts new file mode 100644 index 0000000000..a6bac4d188 --- /dev/null +++ b/packages/tools/src/tools/VolumeCroppingTool.ts @@ -0,0 +1,1726 @@ +import vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData'; +import vtkPoints from '@kitware/vtk.js/Common/Core/Points'; +import vtkCellArray from '@kitware/vtk.js/Common/Core/CellArray'; +import { mat3, mat4, vec3 } from 'gl-matrix'; +import vtkMath from '@kitware/vtk.js/Common/Core/Math'; +import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor'; +import vtkSphereSource from '@kitware/vtk.js/Filters/Sources/SphereSource'; +import vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper'; +import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane'; +import type vtkVolumeMapper from '@kitware/vtk.js/Rendering/Core/VolumeMapper'; + +import { BaseTool } from './base'; + +import type { Types } from '@cornerstonejs/core'; +import { + getRenderingEngine, + getEnabledElementByIds, + getEnabledElement, + Enums, + triggerEvent, + eventTarget, +} from '@cornerstonejs/core'; + +import { getToolGroup } from '../store/ToolGroupManager'; +import { Events } from '../enums'; + +import type { EventTypes, PublicToolProps, ToolProps } from '../types'; + +const PLANEINDEX = { + XMIN: 0, + XMAX: 1, + YMIN: 2, + YMAX: 3, + ZMIN: 4, + ZMAX: 5, +}; +const SPHEREINDEX = { + // cube faces + XMIN: 0, + XMAX: 1, + YMIN: 2, + YMAX: 3, + ZMIN: 4, + ZMAX: 5, + // cube corners + XMIN_YMIN_ZMIN: 6, + XMIN_YMIN_ZMAX: 7, + XMIN_YMAX_ZMIN: 8, + XMIN_YMAX_ZMAX: 9, + XMAX_YMIN_ZMIN: 10, + XMAX_YMIN_ZMAX: 11, + XMAX_YMAX_ZMIN: 12, + XMAX_YMAX_ZMAX: 13, +}; + +/** + * VolumeCroppingTool provides manipulatable spheres and real-time volume cropping capabilities. + * It renders interactive handles (spheres) at face centers and corners of a cropping box, allowing users to precisely adjust volume boundaries through direct manipulation in 3D space. + * + * @remarks + * This tool creates a complete 3D cropping interface with: + * - 6 face spheres for individual axis cropping + * - 8 corner spheres for multi-axis cropping + * - 12 edge lines connecting corner spheres + * - Real-time clipping plane updates + * - Synchronization with VolumeCroppingControlTool working on the same series instance UID for cross-viewport interaction + * + * + * @example + * ```typescript + * // Basic setup + * const toolGroup = ToolGroupManager.createToolGroup('volume3D'); + * toolGroup.addTool(VolumeCroppingTool.toolName); + * + * // Configure with custom settings + * toolGroup.setToolConfiguration(VolumeCroppingTool.toolName, { + * showCornerSpheres: true, + * showHandles: true, + * initialCropFactor: 0.1, + * sphereColors: { + * SAGITTAL: [1.0, 1.0, 0.0], // Yellow for sagittal (X-axis) spheres + * CORONAL: [0.0, 1.0, 0.0], // Green for coronal (Y-axis) spheres + * AXIAL: [1.0, 0.0, 0.0], // Red for axial (Z-axis) spheres + * CORNERS: [0.0, 0.0, 1.0] // Blue for corner spheres + * }, + * sphereRadius: 10, + * grabSpherePixelDistance: 25 + * }); + * + * // Activate the tool + * toolGroup.setToolActive(VolumeCroppingTool.toolName); + * + * // Programmatically control visibility + * const tool = toolGroup.getToolInstance(VolumeCroppingTool.toolName); + * tool.setHandlesVisible(true); + * tool.setClippingPlanesVisible(true); + * + * // Toggle visibility for interactive UI + * function toggleCroppingInterface() { + * const handlesVisible = tool.getHandlesVisible(); + * const planesVisible = tool.getClippingPlanesVisible(); + * + * // Toggle handles (spheres and edge lines) + * tool.setHandlesVisible(!handlesVisible); + * + * // Toggle clipping effect + * tool.setClippingPlanesVisible(!planesVisible); + * + * console.log(`Handles: ${!handlesVisible ? 'shown' : 'hidden'}`); + * console.log(`Cropping: ${!planesVisible ? 'active' : 'disabled'}`); + * } + * + * // Common UI scenarios + * // Show handles but disable cropping (for positioning) + * tool.setHandlesVisible(true); + * tool.setClippingPlanesVisible(false); + * + * // Hide handles but keep cropping active (for clean view) + * tool.setHandlesVisible(false); + * tool.setClippingPlanesVisible(true); + * ``` + * + * @public + * @class VolumeCroppingTool + * @extends BaseTool + * + * @property {string} toolName - Static tool identifier: 'VolumeCropping' + * @property {string} seriesInstanceUID - Frame of reference for the tool + * @property {Function} touchDragCallback - Touch drag event handler for mobile interactions + * @property {Function} mouseDragCallback - Mouse drag event handler for desktop interactions + * @property {Function} cleanUp - Cleanup function for resetting tool state after interactions + * @property {Map} _resizeObservers - Map of ResizeObserver instances for viewport resize handling + * @property {Function} _viewportAddedListener - Event listener for new viewport additions + * @property {boolean} _hasResolutionChanged - Flag tracking if rendering resolution has been modified during interaction + * @property {Array} originalClippingPlanes - Array of clipping plane objects with origin and normal vectors + * @property {number|null} draggingSphereIndex - Index of currently dragged sphere, null when not dragging + * @property {Types.Point3} toolCenter - Center point of the cropping volume in world coordinates [x, y, z] + * @property {number[]|null} cornerDragOffset - 3D offset vector for corner sphere dragging [dx, dy, dz] + * @property {number|null} faceDragOffset - 1D offset value for face sphere dragging along single axis + * @property {Array} sphereStates - Array of sphere state objects containing position, VTK actors, and metadata + * @property {Object} edgeLines - Dictionary of edge line actors connecting corner spheres for wireframe visualization + * + * @typedef {Object} SphereState + * @property {Types.Point3} point - World coordinates of sphere center [x, y, z] + * @property {string} axis - Axis identifier ('x', 'y', 'z', or 'corner') + * @property {string} uid - Unique identifier for the sphere (e.g., 'x_min', 'corner_XMIN_YMIN_ZMIN') + * @property {vtkSphereSource} sphereSource - VTK sphere geometry source + * @property {vtkActor} sphereActor - VTK actor for rendering the sphere + * @property {boolean} isCorner - Flag indicating if sphere is a corner (true) or face (false) sphere + * @property {number[]} color - RGB color array [r, g, b] for sphere rendering + * + * @typedef {Object} EdgeLine + * @property {vtkActor} actor - VTK actor for rendering the edge line + * @property {vtkPolyData} source - VTK polydata source containing line geometry + * @property {string} key1 - First corner identifier (e.g., 'XMIN_YMIN_ZMIN') + * @property {string} key2 - Second corner identifier (e.g., 'XMAX_YMIN_ZMIN') + * + * @configuration + * @property {boolean} showCornerSpheres - Whether to show corner manipulation spheres (default: true) + * @property {boolean} showHandles - Whether to show all manipulation handles (spheres and edges) (default: true) + * @property {boolean} showClippingPlanes - Whether to apply clipping planes to volume rendering (default: true) + * @property {Object} mobile - Mobile device interaction settings + * @property {boolean} mobile.enabled - Enable touch-based interactions on mobile devices (default: false) + * @property {number} mobile.opacity - Opacity for mobile interaction feedback (default: 0.8) + * @property {number} initialCropFactor - Initial cropping factor as fraction of volume bounds (default: 0.08) + * @property {Object} sphereColors - Color configuration for different sphere types + * @property {number[]} sphereColors.SAGITTAL - RGB color for sagittal (X-axis) face spheres [r, g, b] (default: [1.0, 1.0, 0.0]) + * @property {number[]} sphereColors.CORONAL - RGB color for coronal (Y-axis) face spheres [r, g, b] (default: [0.0, 1.0, 0.0]) + * @property {number[]} sphereColors.AXIAL - RGB color for axial (Z-axis) face spheres [r, g, b] (default: [1.0, 0.0, 0.0]) + * @property {number[]} sphereColors.CORNERS - RGB color for corner spheres [r, g, b] (default: [0.0, 0.0, 1.0]) + * @property {number} sphereRadius - Radius of manipulation spheres in world units (default: 8) + * @property {number} grabSpherePixelDistance - Pixel distance threshold for sphere selection (default: 20) + * @property {number} rotateIncrementDegrees - Rotation increment for camera rotation (default: 2) + * @property {number} rotateSampleDistanceFactor - Sample distance multiplier during rotation for performance (default: 2) + * + * @events + * @event VOLUMECROPPING_TOOL_CHANGED - Fired when sphere positions change or clipping planes are updated + * @event VOLUMECROPPINGCONTROL_TOOL_CHANGED - Listens for changes from VolumeCroppingControlTool + * @event VOLUME_VIEWPORT_NEW_VOLUME - Listens for new volume loading to reinitialize cropping bounds + * @event TOOLGROUP_VIEWPORT_ADDED - Listens for new viewport additions to extend resize observation + * + * @methods + * - **setHandlesVisible(visible: boolean)**: Show/hide manipulation spheres and edge lines + * - **setClippingPlanesVisible(visible: boolean)**: Enable/disable volume clipping planes + * - **getHandlesVisible()**: Get current handle visibility state + * - **getClippingPlanesVisible()**: Get current clipping plane visibility state + * + * + * @see {@link VolumeCroppingControlTool} - Companion tool for 2D viewport reference lines + * @see {@link BaseTool} - Base class providing core tool functionality + * + */ +class VolumeCroppingTool extends BaseTool { + static toolName; + seriesInstanceUID?: string; + touchDragCallback: (evt: EventTypes.InteractionEventType) => void; + mouseDragCallback: (evt: EventTypes.InteractionEventType) => void; + cleanUp: () => void; + _resizeObservers = new Map(); + _viewportAddedListener: (evt) => void; + _hasResolutionChanged = false; + originalClippingPlanes: { origin: number[]; normal: number[] }[] = []; + draggingSphereIndex: number | null = null; + toolCenter: Types.Point3 = [0, 0, 0]; + cornerDragOffset: [number, number, number] | null = null; + faceDragOffset: number | null = null; + // Store spheres for show/hide actor. + sphereStates: { + point: Types.Point3; + axis: string; + uid: string; + sphereSource; + sphereActor; + isCorner: boolean; + color: number[]; // [r, g, b] color for the sphere + }[] = []; + // Store 2D edge lines between corner spheres for show/hide actor. + edgeLines: { + [uid: string]: { + actor: vtkActor; + source: vtkPolyData; + key1: string; // key1,key2: Corner identifiers such as XMIN_YMIN_ZMIN to XMAX_YMIN_ZMIN + key2: string; + }; + } = {}; + + constructor( + toolProps: PublicToolProps = {}, + defaultToolProps: ToolProps = { + configuration: { + showCornerSpheres: true, + showHandles: true, + showClippingPlanes: true, + mobile: { + enabled: false, + opacity: 0.8, + }, + initialCropFactor: 0.08, + sphereColors: { + SAGITTAL: [1.0, 1.0, 0.0], // Yellow for sagittal (X-axis) + CORONAL: [0.0, 1.0, 0.0], // Green for coronal (Y-axis) + AXIAL: [1.0, 0.0, 0.0], // Red for axial (Z-axis) + CORNERS: [0.0, 0.0, 1.0], // Blue for corners + }, + sphereRadius: 8, + grabSpherePixelDistance: 20, //pixels threshold for closeness to the sphere being grabbed + rotateIncrementDegrees: 2, + rotateSampleDistanceFactor: 2, // Factor to increase sample distance (lower resolution) when rotating + }, + } + ) { + super(toolProps, defaultToolProps); + this.touchDragCallback = this._dragCallback.bind(this); + this.mouseDragCallback = this._dragCallback.bind(this); + } + + onSetToolActive() { + // console.debug('Setting tool active: volumeCropping', this.sphereStates); + if (this.sphereStates && this.sphereStates.length > 0) { + if (this.configuration.showHandles) { + this.setHandlesVisible(false); + this.setClippingPlanesVisible(false); + // console.debug('Setting tool active: hiding controls'); + } else { + this.setHandlesVisible(true); + this.setClippingPlanesVisible(true); + // console.debug('Setting tool active: showing controls'); + } + } else { + const viewportsInfo = this._getViewportsInfo(); + const subscribeToElementResize = () => { + viewportsInfo.forEach(({ viewportId, renderingEngineId }) => { + if (!this._resizeObservers.has(viewportId)) { + const { viewport } = getEnabledElementByIds( + viewportId, + renderingEngineId + ) || { viewport: null }; + if (!viewport) { + return; + } + const { element } = viewport; + const resizeObserver = new ResizeObserver(() => { + const element = getEnabledElementByIds( + viewportId, + renderingEngineId + ); + if (!element) { + return; + } + const { viewport } = element; + const viewPresentation = viewport.getViewPresentation(); + viewport.resetCamera(); + viewport.setViewPresentation(viewPresentation); + viewport.render(); + }); + resizeObserver.observe(element); + this._resizeObservers.set(viewportId, resizeObserver); + } + }); + }; + + subscribeToElementResize(); + + this._viewportAddedListener = (evt) => { + if (evt.detail.toolGroupId === this.toolGroupId) { + subscribeToElementResize(); + } + }; + + eventTarget.addEventListener( + Events.TOOLGROUP_VIEWPORT_ADDED, + this._viewportAddedListener + ); + + this._unsubscribeToViewportNewVolumeSet(viewportsInfo); + this._subscribeToViewportNewVolumeSet(viewportsInfo); + this._initialize3DViewports(viewportsInfo); + + if (this.sphereStates && this.sphereStates.length > 0) { + this.setHandlesVisible(true); + } else { + //console.warn('Setting tool active: no spheres! trying to initialize'); + this.originalClippingPlanes = []; + this._initialize3DViewports(viewportsInfo); + } + } + } + + onSetToolConfiguration = (): void => { + console.debug('Setting tool settoolconfiguration : volumeCropping'); + //this._init(); + }; + + onSetToolEnabled = (): void => { + console.debug('Setting tool enabled: volumeCropping'); + }; + + onSetToolDisabled() { + // console.debug('Setting tool disabled: volumeCropping'); + // Disconnect all resize observers + this._resizeObservers.forEach((resizeObserver, viewportId) => { + resizeObserver.disconnect(); + this._resizeObservers.delete(viewportId); + }); + + if (this._viewportAddedListener) { + eventTarget.removeEventListener( + Events.TOOLGROUP_VIEWPORT_ADDED, + this._viewportAddedListener + ); + this._viewportAddedListener = null; // Clear the reference to the listener + } + + const viewportsInfo = this._getViewportsInfo(); + this._unsubscribeToViewportNewVolumeSet(viewportsInfo); + } + + onCameraModified = (evt) => { + const { element } = evt.currentTarget + ? { element: evt.currentTarget } + : evt.detail; + const enabledElement = getEnabledElement(element); + this._updateClippingPlanes(enabledElement.viewport); + enabledElement.viewport.render(); + }; + + preMouseDownCallback = (evt: EventTypes.InteractionEventType) => { + //console.debug('VolumeCroppingTool.preMouseDownCallback called'); + const eventDetail = evt.detail; + const { element } = eventDetail; + const enabledElement = getEnabledElement(element); + const { viewport } = enabledElement; + const actorEntry = viewport.getDefaultActor(); + const actor = actorEntry.actor as Types.VolumeActor; + const mapper = actor.getMapper(); + + const mouseCanvas: [number, number] = [ + evt.detail.currentPoints.canvas[0], + evt.detail.currentPoints.canvas[1], + ]; + // Find the sphere under the mouse + this.draggingSphereIndex = null; + this.cornerDragOffset = null; + this.faceDragOffset = null; + for (let i = 0; i < this.sphereStates.length; ++i) { + const sphereCanvas = viewport.worldToCanvas(this.sphereStates[i].point); + const dist = Math.sqrt( + Math.pow(mouseCanvas[0] - sphereCanvas[0], 2) + + Math.pow(mouseCanvas[1] - sphereCanvas[1], 2) + ); + if (dist < this.configuration.grabSpherePixelDistance) { + this.draggingSphereIndex = i; + element.style.cursor = 'grabbing'; + + // --- Store offset for corners --- + const sphereState = this.sphereStates[i]; + const mouseWorld = viewport.canvasToWorld(mouseCanvas); + if (sphereState.isCorner) { + this.cornerDragOffset = [ + sphereState.point[0] - mouseWorld[0], + sphereState.point[1] - mouseWorld[1], + sphereState.point[2] - mouseWorld[2], + ]; + this.faceDragOffset = null; + } else { + // For face spheres, only store the offset along the axis of movement + const axisIdx = { x: 0, y: 1, z: 2 }[sphereState.axis]; + this.faceDragOffset = + sphereState.point[axisIdx] - mouseWorld[axisIdx]; + this.cornerDragOffset = null; + } + + return true; + } + } + + const hasSampleDistance = + 'getSampleDistance' in mapper || 'getCurrentSampleDistance' in mapper; + + if (!hasSampleDistance) { + return true; + } + + const originalSampleDistance = mapper.getSampleDistance(); + + if (!this._hasResolutionChanged) { + const { rotateSampleDistanceFactor } = this.configuration; + mapper.setSampleDistance( + originalSampleDistance * rotateSampleDistanceFactor + ); + this._hasResolutionChanged = true; + + if (this.cleanUp !== null) { + // Clean up previous event listener + document.removeEventListener('mouseup', this.cleanUp); + } + + this.cleanUp = () => { + mapper.setSampleDistance(originalSampleDistance); + + // Reset cursor style + (evt.target as HTMLElement).style.cursor = ''; + if (this.draggingSphereIndex !== null) { + const sphereState = this.sphereStates[this.draggingSphereIndex]; + const [viewport3D] = this._getViewportsInfo(); + const renderingEngine = getRenderingEngine( + viewport3D.renderingEngineId + ); + const viewport = renderingEngine.getViewport(viewport3D.viewportId); + + if (sphereState.isCorner) { + this._updateCornerSpheres(); + this._updateFaceSpheresFromCorners(); + this._updateClippingPlanesFromFaceSpheres(viewport); + } + } + this.draggingSphereIndex = null; + this.cornerDragOffset = null; + this.faceDragOffset = null; + + viewport.render(); + this._hasResolutionChanged = false; + }; + + document.addEventListener('mouseup', this.cleanUp, { once: true }); + } + + return true; + }; + + /** + * Sets the visibility of the cropping handles (spheres and edge lines). + * + * When handles are being shown, this method automatically synchronizes the sphere positions + * with the current clipping plane positions to ensure visual consistency. This includes + * updating face spheres, corner spheres, and edge lines to match the current crop bounds. + * + * @param visible - Whether to show or hide the cropping handles + * + * @example + * ```typescript + * // Hide all cropping handles + * volumeCroppingTool.setHandlesVisible(false); + * + * // Show handles and sync with current crop state + * volumeCroppingTool.setHandlesVisible(true); + * ``` + * + */ + setHandlesVisible(visible: boolean) { + this.configuration.showHandles = visible; + // Before showing, update sphere positions to match clipping planes + if (visible) { + // Update face spheres from the current clipping planes + this.sphereStates[SPHEREINDEX.XMIN].point[0] = + this.originalClippingPlanes[PLANEINDEX.XMIN].origin[0]; + this.sphereStates[SPHEREINDEX.XMAX].point[0] = + this.originalClippingPlanes[PLANEINDEX.XMAX].origin[0]; + this.sphereStates[SPHEREINDEX.YMIN].point[1] = + this.originalClippingPlanes[PLANEINDEX.YMIN].origin[1]; + this.sphereStates[SPHEREINDEX.YMAX].point[1] = + this.originalClippingPlanes[PLANEINDEX.YMAX].origin[1]; + this.sphereStates[SPHEREINDEX.ZMIN].point[2] = + this.originalClippingPlanes[PLANEINDEX.ZMIN].origin[2]; + this.sphereStates[SPHEREINDEX.ZMAX].point[2] = + this.originalClippingPlanes[PLANEINDEX.ZMAX].origin[2]; + + // Update all sphere actors' positions + [ + SPHEREINDEX.XMIN, + SPHEREINDEX.XMAX, + SPHEREINDEX.YMIN, + SPHEREINDEX.YMAX, + SPHEREINDEX.ZMIN, + SPHEREINDEX.ZMAX, + ].forEach((idx) => { + const s = this.sphereStates[idx]; + s.sphereSource.setCenter(...s.point); + s.sphereSource.modified(); + }); + + // Update corners and edges as well + this._updateCornerSpheres(); + } + + // Show/hide actors + this._updateHandlesVisibility(); + + // Render + const viewportsInfo = this._getViewportsInfo(); + const [viewport3D] = viewportsInfo; + const renderingEngine = getRenderingEngine(viewport3D.renderingEngineId); + const viewport = renderingEngine.getViewport(viewport3D.viewportId); + viewport.render(); + } + + /** + * Gets the current visibility state of the cropping handles. + * + * @returns Whether the cropping handles (spheres and edge lines) are currently visible + * + * @example + * ```typescript + * // Check if handles are currently visible + * const handlesVisible = volumeCroppingTool.getHandlesVisible(); + * if (handlesVisible) { + * console.log('Cropping handles are currently shown'); + * } else { + * console.log('Cropping handles are currently hidden'); + * } + * ``` + * + * @remarks + * This method returns the configuration state, which controls the visibility of: + * - Face spheres (6 spheres for individual axis cropping) + * - Corner spheres (8 spheres for multi-axis cropping) + * - Edge lines connecting the corner spheres + */ + getHandlesVisible() { + return this.configuration.showHandles; + } + + /** + * Gets the current visibility state of the clipping planes. + * + * @returns Whether the clipping planes are currently visible and actively cropping the volume + * + * @example + * ```typescript + * // Check if clipping planes are currently active + * const planesVisible = volumeCroppingTool.getClippingPlanesVisible(); + * if (planesVisible) { + * console.log('Volume is currently being cropped'); + * } else { + * console.log('Volume is displayed in full'); + * } + * ``` + * + * @remarks + * This method returns the configuration state that controls whether: + * - The volume rendering respects the current clipping plane boundaries + * - Parts of the volume outside the crop bounds are hidden from view + * - The cropping effect is applied to the 3D volume visualization + */ + getClippingPlanesVisible() { + return this.configuration.showClippingPlanes; + } + + /** + * Sets the visibility of the clipping planes to enable or disable volume cropping. + * + * When clipping planes are visible, the volume rendering is cropped according to the + * current sphere positions. When disabled, the full volume is displayed without cropping. + * The viewport is automatically re-rendered after the change. + * + * @param visible - Whether to enable (true) or disable (false) volume clipping + * + * @example + * ```typescript + * // Enable volume cropping + * volumeCroppingTool.setClippingPlanesVisible(true); + * + * // Disable volume cropping to show full volume + * volumeCroppingTool.setClippingPlanesVisible(false); + * ``` + * + * @remarks + * - When enabled, parts of the volume outside the crop bounds are hidden + * - When disabled, all clipping planes are removed from the volume mapper + * - The cropping bounds are determined by the current sphere positions + * - The viewport is automatically re-rendered to reflect the change + * - This method updates the internal configuration and applies changes immediately + */ + setClippingPlanesVisible(visible: boolean) { + this.configuration.showClippingPlanes = visible; + const viewport = this._getViewport(); + this._updateClippingPlanes(viewport); + viewport.render(); + } + + _dragCallback(evt: EventTypes.InteractionEventType): void { + const { element, currentPoints, lastPoints } = evt.detail; + + if (this.draggingSphereIndex !== null) { + // crop handles + this._onMouseMoveSphere(evt); + } else { + // rotate + const currentPointsCanvas = currentPoints.canvas; + const lastPointsCanvas = lastPoints.canvas; + const { rotateIncrementDegrees } = this.configuration; + const enabledElement = getEnabledElement(element); + const { viewport } = enabledElement; + + const camera = viewport.getCamera(); + const width = element.clientWidth; + const height = element.clientHeight; + + const normalizedPosition = [ + currentPointsCanvas[0] / width, + currentPointsCanvas[1] / height, + ]; + + const normalizedPreviousPosition = [ + lastPointsCanvas[0] / width, + lastPointsCanvas[1] / height, + ]; + + const center: Types.Point2 = [width * 0.5, height * 0.5]; + // NOTE: centerWorld corresponds to the focal point in cornerstone3D + const centerWorld = viewport.canvasToWorld(center); + const normalizedCenter = [0.5, 0.5]; + + const radsq = (1.0 + Math.abs(normalizedCenter[0])) ** 2.0; + const op = [normalizedPreviousPosition[0], 0, 0]; + const oe = [normalizedPosition[0], 0, 0]; + + const opsq = op[0] ** 2; + const oesq = oe[0] ** 2; + + const lop = opsq > radsq ? 0 : Math.sqrt(radsq - opsq); + const loe = oesq > radsq ? 0 : Math.sqrt(radsq - oesq); + + const nop: Types.Point3 = [op[0], 0, lop]; + vtkMath.normalize(nop); + const noe: Types.Point3 = [oe[0], 0, loe]; + vtkMath.normalize(noe); + + const dot = vtkMath.dot(nop, noe); + if (Math.abs(dot) > 0.0001) { + const angleX = + -2 * + Math.acos(vtkMath.clampValue(dot, -1.0, 1.0)) * + Math.sign(normalizedPosition[0] - normalizedPreviousPosition[0]) * + rotateIncrementDegrees; + + const upVec = camera.viewUp; + const atV = camera.viewPlaneNormal; + const rightV: Types.Point3 = [0, 0, 0]; + const forwardV: Types.Point3 = [0, 0, 0]; + + vtkMath.cross(upVec, atV, rightV); + vtkMath.normalize(rightV); + + vtkMath.cross(atV, rightV, forwardV); + vtkMath.normalize(forwardV); + vtkMath.normalize(upVec); + + this._rotateCamera(viewport, centerWorld, forwardV, angleX); + + const angleY = + (normalizedPreviousPosition[1] - normalizedPosition[1]) * + rotateIncrementDegrees; + + this._rotateCamera(viewport, centerWorld, rightV, angleY); + } + + viewport.render(); + } + } + + _onMouseMoveSphere = (evt) => { + if (this.draggingSphereIndex === null) { + return false; + } + + const sphereState = this.sphereStates[this.draggingSphereIndex]; + if (!sphereState) { + return false; + } + + // Get viewport and world coordinates + const { viewport, world } = this._getViewportAndWorldCoords(evt); + if (!viewport || !world) { + return false; + } + + // Handle sphere movement based on type WITHOUT updating clipping planes yet + if (sphereState.isCorner) { + // Calculate and update just the dragged corner position + const newCorner = this._calculateNewCornerPosition(world); + this._updateSpherePosition(sphereState, newCorner); + + // Update related corners + const axisFlags = this._parseCornerKey(sphereState.uid); + this._updateRelatedCorners(sphereState, newCorner, axisFlags); + + // Update face spheres and corners + this._updateFaceSpheresFromCorners(); + this._updateCornerSpheres(); + } else { + // Update face sphere position + const axisIdx = { x: 0, y: 1, z: 2 }[sphereState.axis]; + let newValue = world[axisIdx]; + if (this.faceDragOffset !== null) { + newValue += this.faceDragOffset; + } + sphereState.point[axisIdx] = newValue; + sphereState.sphereSource.setCenter(...sphereState.point); + sphereState.sphereSource.modified(); + + // Update corners from face spheres + this._updateCornerSpheresFromFaces(); + this._updateFaceSpheresFromCorners(); + this._updateCornerSpheres(); + } + + // // THEN update clipping planes + this._updateClippingPlanesFromFaceSpheres(viewport); + + // Final render and event trigger + viewport.render(); + + this._triggerToolChangedEvent(sphereState); + + return true; + }; + + _onControlToolChange = (evt) => { + const viewport = this._getViewport(); + if (!evt.detail.toolCenter) { + triggerEvent(eventTarget, Events.VOLUMECROPPING_TOOL_CHANGED, { + originalClippingPlanes: this.originalClippingPlanes, + viewportId: viewport.id, + renderingEngineId: viewport.renderingEngineId, + seriesInstanceUID: this.seriesInstanceUID, + }); + } else { + if (evt.detail.seriesInstanceUID !== this.seriesInstanceUID) { + return; + } + const isMin = evt.detail.handleType === 'min'; + const toolCenter = isMin + ? evt.detail.toolCenterMin + : evt.detail.toolCenterMax; + const normals = isMin + ? [ + [1, 0, 0], + [0, 1, 0], + [0, 0, 1], + ] + : [ + [-1, 0, 0], + [0, -1, 0], + [0, 0, -1], + ]; + const planeIndices = isMin + ? [PLANEINDEX.XMIN, PLANEINDEX.YMIN, PLANEINDEX.ZMIN] + : [PLANEINDEX.XMAX, PLANEINDEX.YMAX, PLANEINDEX.ZMAX]; + const sphereIndices = isMin + ? [SPHEREINDEX.XMIN, SPHEREINDEX.YMIN, SPHEREINDEX.ZMIN] + : [SPHEREINDEX.XMAX, SPHEREINDEX.YMAX, SPHEREINDEX.ZMAX]; + const axes = ['x', 'y', 'z']; + const orientationAxes = [ + Enums.OrientationAxis.SAGITTAL, + Enums.OrientationAxis.CORONAL, + Enums.OrientationAxis.AXIAL, + ]; + + // Update planes and spheres for each axis + for (let i = 0; i < 3; ++i) { + const origin: [number, number, number] = [0, 0, 0]; + origin[i] = toolCenter[i]; + const plane = vtkPlane.newInstance({ + origin, + normal: normals[i] as [number, number, number], + }); + this.originalClippingPlanes[planeIndices[i]].origin = plane.getOrigin(); + + // Update face sphere + this.sphereStates[sphereIndices[i]].point[i] = plane.getOrigin()[i]; + this.sphereStates[sphereIndices[i]].sphereSource.setCenter( + ...this.sphereStates[sphereIndices[i]].point + ); + this.sphereStates[sphereIndices[i]].sphereSource.modified(); + + // Update center for other face spheres (not on this axis) + const otherSphere = this.sphereStates.find( + (s, idx) => s.axis === axes[i] && idx !== sphereIndices[i] + ); + const newCenter = (otherSphere.point[i] + plane.getOrigin()[i]) / 2; + this.sphereStates.forEach((state) => { + if ( + !state.isCorner && + state.axis !== axes[i] && + !evt.detail.viewportOrientation.includes(orientationAxes[i]) + ) { + state.point[i] = newCenter; + state.sphereSource.setCenter(state.point); + state.sphereActor.getProperty().setColor(state.color); + state.sphereSource.modified(); + } + }); + + // Update vtk clipping plane origin + const volumeActor = viewport.getDefaultActor()?.actor; + if (volumeActor) { + const mapper = volumeActor.getMapper() as vtkVolumeMapper; + const clippingPlanes = mapper.getClippingPlanes(); + if (clippingPlanes) { + clippingPlanes[planeIndices[i]].setOrigin(plane.getOrigin()); + } + } + } + viewport.render(); + } + }; + _updateClippingPlanes(viewport) { + // Get the actor and transformation matrix + const actorEntry = viewport.getDefaultActor(); + if (!actorEntry || !actorEntry.actor) { + // Only warn once per session for missing actor + if (!viewport._missingActorWarned) { + console.warn( + 'VolumeCroppingTool._updateClippingPlanes: No default actor found in viewport.' + ); + viewport._missingActorWarned = true; + } + return; + } + const actor = actorEntry.actor; + const mapper = actor.getMapper(); + const matrix = actor.getMatrix(); + + // Only update if clipping planes are visible + if (!this.configuration.showClippingPlanes) { + mapper.removeAllClippingPlanes(); + return; + } + + // Extract rotation part for normals + const rot = mat3.create(); + mat3.fromMat4(rot, matrix); + // Compute inverse transpose for normal transformation + const normalMatrix = mat3.create(); + mat3.invert(normalMatrix, rot); + mat3.transpose(normalMatrix, normalMatrix); + + // Cache transformed origins/normals to avoid repeated work + const originalPlanes = this.originalClippingPlanes; + if (!originalPlanes || !originalPlanes.length) { + return; + } + + // Only remove/add if the number of planes has changed or matrix has changed + // (Assume matrix changes frequently, so always update for now) + mapper.removeAllClippingPlanes(); + + // Preallocate arrays for transformed origins/normals + const transformedOrigins: Types.Point3[] = []; + const transformedNormals: Types.Point3[] = []; + + for (let i = 0; i < originalPlanes.length; ++i) { + const plane = originalPlanes[i]; + // Transform origin (full 4x4) + const oVec = vec3.create(); + vec3.transformMat4(oVec, new Float32Array(plane.origin), matrix); + const o: [number, number, number] = [oVec[0], oVec[1], oVec[2]]; + // Transform normal (rotation only) + const nVec = vec3.create(); + vec3.transformMat3(nVec, new Float32Array(plane.normal), normalMatrix); + vec3.normalize(nVec, nVec); + const n: [number, number, number] = [nVec[0], nVec[1], nVec[2]]; + transformedOrigins.push(o); + transformedNormals.push(n); + } + + // Create and add planes in a single loop + for (let i = 0; i < transformedOrigins.length; ++i) { + // Use cached transformed values + const planeInstance = vtkPlane.newInstance({ + origin: transformedOrigins[i], + normal: transformedNormals[i], + }); + mapper.addClippingPlane(planeInstance); + } + } + + _updateHandlesVisibility() { + // Spheres + this.sphereStates.forEach((state) => { + if (state.sphereActor) { + state.sphereActor.setVisibility(this.configuration.showHandles); + } + }); + + // Edge lines (box edges) + Object.values(this.edgeLines).forEach(({ actor }) => { + if (actor) { + actor.setVisibility(this.configuration.showHandles); + } + }); + } + + _addLine3DBetweenPoints( + viewport, + point1, + point2, + color: [number, number, number] = [0.7, 0.7, 0.7], + uid = '' + ) { + // Avoid creating a line if the points are the same + if ( + point1[0] === point2[0] && + point1[1] === point2[1] && + point1[2] === point2[2] + ) { + return { actor: null, source: null }; + } + const points = vtkPoints.newInstance(); + points.setNumberOfPoints(2); + points.setPoint(0, point1[0], point1[1], point1[2]); + points.setPoint(1, point2[0], point2[1], point2[2]); + + const lines = vtkCellArray.newInstance({ values: [2, 0, 1] }); + const polyData = vtkPolyData.newInstance(); + polyData.setPoints(points); + polyData.setLines(lines); + + const mapper = vtkMapper.newInstance(); + mapper.setInputData(polyData); + const actor = vtkActor.newInstance(); + actor.setMapper(mapper); + actor.getProperty().setColor(...color); + actor.getProperty().setLineWidth(0.5); // Thinner line + actor.getProperty().setOpacity(1.0); + actor.getProperty().setInterpolationToFlat(); // No shading + actor.getProperty().setAmbient(1.0); // Full ambient + actor.getProperty().setDiffuse(0.0); // No diffuse + actor.getProperty().setSpecular(0.0); // No specular + actor.setVisibility(this.configuration.showHandles); + viewport.addActor({ actor, uid }); + return { actor, source: polyData }; + } + + _getViewportsInfo = () => { + const viewports = getToolGroup(this.toolGroupId).viewportsInfo; + return viewports; + }; + + _addSphere( + viewport, + point, + axis, + position, + cornerKey = null, + adaptiveRadius + ) { + // Generate a unique UID for each sphere based on its axis and position + // Use cornerKey for corners, otherwise axis+position for faces + const uid = cornerKey ? `corner_${cornerKey}` : `${axis}_${position}`; + const sphereState = this.sphereStates.find((s) => s.uid === uid); + if (sphereState) { + return; + } + const sphereSource = vtkSphereSource.newInstance(); + sphereSource.setCenter(point); + sphereSource.setRadius(adaptiveRadius); + const sphereMapper = vtkMapper.newInstance(); + sphereMapper.setInputConnection(sphereSource.getOutputPort()); + const sphereActor = vtkActor.newInstance(); + sphereActor.setMapper(sphereMapper); + let color: [number, number, number] = [0.0, 1.0, 0.0]; // Default green + const sphereColors = this.configuration.sphereColors || {}; + + if (cornerKey) { + color = sphereColors.CORNERS || [0.0, 0.0, 1.0]; // Use corners color from config, fallback to blue + } else if (axis === 'z') { + color = sphereColors.AXIAL || [1.0, 0.0, 0.0]; // Z-axis = AXIAL planes + } else if (axis === 'x') { + color = sphereColors.SAGITTAL || [1.0, 1.0, 0.0]; // X-axis = SAGITTAL planes + } else if (axis === 'y') { + color = sphereColors.CORONAL || [0.0, 1.0, 0.0]; // Y-axis = CORONAL planes + } + // Store or update the sphere position + const idx = this.sphereStates.findIndex((s) => s.uid === uid); + if (idx === -1) { + this.sphereStates.push({ + point: point.slice(), + axis, + uid, + sphereSource, + sphereActor, + isCorner: !!cornerKey, + color, + }); + } else { + this.sphereStates[idx].point = point.slice(); + this.sphereStates[idx].sphereSource = sphereSource; + } + + // Remove existing actor with this UID if present + const existingActors = viewport.getActors(); + const existing = existingActors.find((a) => a.uid === uid); + if (existing) { + //viewport.removeActor(uid); + return; + } + sphereActor.getProperty().setColor(color); + sphereActor.setVisibility(this.configuration.showHandles); + viewport.addActor({ actor: sphereActor, uid: uid }); + } + /** + * Calculate an adaptive sphere radius based on the diagonal of the volume. + * This allows the sphere size to scale with the volume size. + * @param diagonal The diagonal length of the volume in world coordinates. + * @returns The calculated adaptive radius, clamped between min and max limits. + */ + _calculateAdaptiveSphereRadius(diagonal): number { + // Get base radius from configuration (acts as a scaling factor) + const baseRadius = + this.configuration.sphereRadius !== undefined + ? this.configuration.sphereRadius + : 8; + + // Scale radius as a percentage of diagonal (adjustable factor) + const scaleFactor = this.configuration.sphereRadiusScale || 0.01; // 1% of diagonal by default + const adaptiveRadius = diagonal * scaleFactor; + + // Apply min/max limits to prevent too small or too large spheres + const minRadius = this.configuration.minSphereRadius || 2; + const maxRadius = this.configuration.maxSphereRadius || 50; + + return Math.max(minRadius, Math.min(maxRadius, adaptiveRadius)); + } + + _initialize3DViewports = (viewportsInfo): void => { + if (!viewportsInfo || !viewportsInfo.length || !viewportsInfo[0]) { + console.warn( + 'VolumeCroppingTool: No viewportsInfo available for initialization of volumecroppingtool.' + ); + return; + } + const viewport = this._getViewport(); + const volumeActors = viewport.getActors(); + if (!volumeActors || volumeActors.length === 0) { + console.warn( + 'VolumeCroppingTool: No volume actors found in the viewport.' + ); + return; + } + const imageData = volumeActors[0].actor.getMapper().getInputData(); + if (!imageData) { + console.warn('VolumeCroppingTool: No image data found for volume actor.'); + return; + } + this.seriesInstanceUID = imageData.seriesInstanceUID || 'unknown'; + const worldBounds = imageData.getBounds(); // Already in world coordinates + const cropFactor = this.configuration.initialCropFactor || 0.1; + + // Calculate cropping bounds using world bounds + const xRange = worldBounds[1] - worldBounds[0]; + const yRange = worldBounds[3] - worldBounds[2]; + const zRange = worldBounds[5] - worldBounds[4]; + + const xMin = worldBounds[0] + cropFactor * xRange; + const xMax = worldBounds[1] - cropFactor * xRange; + const yMin = worldBounds[2] + cropFactor * yRange; + const yMax = worldBounds[3] - cropFactor * yRange; + const zMin = worldBounds[4] + cropFactor * zRange; + const zMax = worldBounds[5] - cropFactor * zRange; + + const planes: vtkPlane[] = []; + + // X min plane (cuts everything left of xMin) + const planeXmin = vtkPlane.newInstance({ + origin: [xMin, 0, 0], + normal: [1, 0, 0], + }); + const planeXmax = vtkPlane.newInstance({ + origin: [xMax, 0, 0], + normal: [-1, 0, 0], + }); + const planeYmin = vtkPlane.newInstance({ + origin: [0, yMin, 0], + normal: [0, 1, 0], + }); + const planeYmax = vtkPlane.newInstance({ + origin: [0, yMax, 0], + normal: [0, -1, 0], + }); + const planeZmin = vtkPlane.newInstance({ + origin: [0, 0, zMin], + normal: [0, 0, 1], + }); + const planeZmax = vtkPlane.newInstance({ + origin: [0, 0, zMax], + normal: [0, 0, -1], + }); + const mapper = viewport + .getDefaultActor() + .actor.getMapper() as vtkVolumeMapper; + planes.push(planeXmin); + planes.push(planeXmax); + planes.push(planeYmin); + planes.push(planeYmax); + planes.push(planeZmin); + planes.push(planeZmax); + + const originalPlanes = planes.map((plane) => ({ + origin: [...plane.getOrigin()], + normal: [...plane.getNormal()], + })); + + this.originalClippingPlanes = originalPlanes; + const sphereXminPoint = [xMin, (yMax + yMin) / 2, (zMax + zMin) / 2]; + const sphereXmaxPoint = [xMax, (yMax + yMin) / 2, (zMax + zMin) / 2]; + const sphereYminPoint = [(xMax + xMin) / 2, yMin, (zMax + zMin) / 2]; + const sphereYmaxPoint = [(xMax + xMin) / 2, yMax, (zMax + zMin) / 2]; + const sphereZminPoint = [(xMax + xMin) / 2, (yMax + yMin) / 2, zMin]; + const sphereZmaxPoint = [(xMax + xMin) / 2, (yMax + yMin) / 2, zMax]; + const adaptiveRadius = this._calculateAdaptiveSphereRadius( + Math.sqrt(xRange * xRange + yRange * yRange + zRange * zRange) + ); + this._addSphere( + viewport, + sphereXminPoint, + 'x', + 'min', + null, + adaptiveRadius + ); + this._addSphere( + viewport, + sphereXmaxPoint, + 'x', + 'max', + null, + adaptiveRadius + ); + this._addSphere( + viewport, + sphereYminPoint, + 'y', + 'min', + null, + adaptiveRadius + ); + this._addSphere( + viewport, + sphereYmaxPoint, + 'y', + 'max', + null, + adaptiveRadius + ); + this._addSphere( + viewport, + sphereZminPoint, + 'z', + 'min', + null, + adaptiveRadius + ); + this._addSphere( + viewport, + sphereZmaxPoint, + 'z', + 'max', + null, + adaptiveRadius + ); + + const corners = [ + [xMin, yMin, zMin], + [xMin, yMin, zMax], + [xMin, yMax, zMin], + [xMin, yMax, zMax], + [xMax, yMin, zMin], + [xMax, yMin, zMax], + [xMax, yMax, zMin], + [xMax, yMax, zMax], + ]; + + const cornerKeys = [ + 'XMIN_YMIN_ZMIN', + 'XMIN_YMIN_ZMAX', + 'XMIN_YMAX_ZMIN', + 'XMIN_YMAX_ZMAX', + 'XMAX_YMIN_ZMIN', + 'XMAX_YMIN_ZMAX', + 'XMAX_YMAX_ZMIN', + 'XMAX_YMAX_ZMAX', + ]; + + for (let i = 0; i < corners.length; i++) { + this._addSphere( + viewport, + corners[i], + 'corner', + null, + cornerKeys[i], + adaptiveRadius + ); + } + + // draw the lines between corners + // All 12 edges as pairs of corner keys + const edgeCornerPairs = [ + // X edges + ['XMIN_YMIN_ZMIN', 'XMAX_YMIN_ZMIN'], + ['XMIN_YMIN_ZMAX', 'XMAX_YMIN_ZMAX'], + ['XMIN_YMAX_ZMIN', 'XMAX_YMAX_ZMIN'], + ['XMIN_YMAX_ZMAX', 'XMAX_YMAX_ZMAX'], + // Y edges + ['XMIN_YMIN_ZMIN', 'XMIN_YMAX_ZMIN'], + ['XMIN_YMIN_ZMAX', 'XMIN_YMAX_ZMAX'], + ['XMAX_YMIN_ZMIN', 'XMAX_YMAX_ZMIN'], + ['XMAX_YMIN_ZMAX', 'XMAX_YMAX_ZMAX'], + // Z edges + ['XMIN_YMIN_ZMIN', 'XMIN_YMIN_ZMAX'], + ['XMIN_YMAX_ZMIN', 'XMIN_YMAX_ZMAX'], + ['XMAX_YMIN_ZMIN', 'XMAX_YMIN_ZMAX'], + ['XMAX_YMAX_ZMIN', 'XMAX_YMAX_ZMAX'], + ]; + + edgeCornerPairs.forEach(([key1, key2], i) => { + const state1 = this.sphereStates.find((s) => s.uid === `corner_${key1}`); + const state2 = this.sphereStates.find((s) => s.uid === `corner_${key2}`); + if (state1 && state2) { + const uid = `edge_${key1}_${key2}`; + const { actor, source } = this._addLine3DBetweenPoints( + viewport, + state1.point, + state2.point, + [0.7, 0.7, 0.7], + uid + ); + this.edgeLines[uid] = { actor, source, key1, key2 }; + } + }); + + mapper.addClippingPlane(planeXmin); + mapper.addClippingPlane(planeXmax); + mapper.addClippingPlane(planeYmin); + mapper.addClippingPlane(planeYmax); + mapper.addClippingPlane(planeZmin); + mapper.addClippingPlane(planeZmax); + + eventTarget.addEventListener( + Events.VOLUMECROPPINGCONTROL_TOOL_CHANGED, + (evt) => { + this._onControlToolChange(evt); + } + ); + viewport.render(); + }; + + // Helper method to get viewport and world coordinates + _getViewportAndWorldCoords = (evt) => { + const viewport = this._getViewport(); + const x = evt.detail.currentPoints.canvas[0]; + const y = evt.detail.currentPoints.canvas[1]; + const world = viewport.canvasToWorld([x, y]); + + return { viewport, world }; + }; + + _getViewport = () => { + const [viewport3D] = this._getViewportsInfo(); + const renderingEngine = getRenderingEngine(viewport3D.renderingEngineId); + return renderingEngine.getViewport(viewport3D.viewportId); + }; + + // Handle corner sphere movement + _handleCornerSphereMovement = (sphereState, world, viewport) => { + // Calculate new position with offset + const newCorner = this._calculateNewCornerPosition(world); + + // Update the dragged corner + this._updateSpherePosition(sphereState, newCorner); + + // Parse corner key to determine axes + const axisFlags = this._parseCornerKey(sphereState.uid); + + // Update related corners efficiently + this._updateRelatedCorners(sphereState, newCorner, axisFlags); + + // Update dependent elements + this._updateAfterCornerMovement(viewport); + }; + + // Handle face sphere movement + _handleFaceSphereMovement = (sphereState, world, viewport) => { + const axisIdx = { x: 0, y: 1, z: 2 }[sphereState.axis]; + let newValue = world[axisIdx]; + + if (this.faceDragOffset !== null) { + newValue += this.faceDragOffset; + } + + // Update only the relevant axis + sphereState.point[axisIdx] = newValue; + sphereState.sphereSource.setCenter(...sphereState.point); + sphereState.sphereSource.modified(); + + // Update dependent elements + this._updateAfterFaceMovement(viewport); + }; + + // Calculate new corner position with offset + _calculateNewCornerPosition = (world) => { + let newCorner = [world[0], world[1], world[2]]; + + if (this.cornerDragOffset) { + newCorner = [ + world[0] + this.cornerDragOffset[0], + world[1] + this.cornerDragOffset[1], + world[2] + this.cornerDragOffset[2], + ]; + } + + return newCorner; + }; + + // Parse corner key to determine which axes are min/max + _parseCornerKey = (uid) => { + const cornerKey = uid.replace('corner_', ''); + return { + isXMin: cornerKey.includes('XMIN'), + isXMax: cornerKey.includes('XMAX'), + isYMin: cornerKey.includes('YMIN'), + isYMax: cornerKey.includes('YMAX'), + isZMin: cornerKey.includes('ZMIN'), + isZMax: cornerKey.includes('ZMAX'), + }; + }; + + // Update sphere position + _updateSpherePosition = (sphereState, newPosition) => { + sphereState.point = newPosition; + sphereState.sphereSource.setCenter(...newPosition); + sphereState.sphereSource.modified(); + }; + + // Update related corners that share axes + _updateRelatedCorners = (draggedSphere, newCorner, axisFlags) => { + this.sphereStates.forEach((state) => { + if (!state.isCorner || state === draggedSphere) { + return; + } + + const key = state.uid.replace('corner_', ''); + const shouldUpdate = this._shouldUpdateCorner(key, axisFlags); + + if (shouldUpdate) { + this._updateCornerCoordinates(state, newCorner, key, axisFlags); + } + }); + }; + + // Determine if a corner should be updated + _shouldUpdateCorner = (cornerKey, axisFlags) => { + return ( + (axisFlags.isXMin && cornerKey.includes('XMIN')) || + (axisFlags.isXMax && cornerKey.includes('XMAX')) || + (axisFlags.isYMin && cornerKey.includes('YMIN')) || + (axisFlags.isYMax && cornerKey.includes('YMAX')) || + (axisFlags.isZMin && cornerKey.includes('ZMIN')) || + (axisFlags.isZMax && cornerKey.includes('ZMAX')) + ); + }; + + // Update individual corner coordinates + _updateCornerCoordinates = (state, newCorner, cornerKey, axisFlags) => { + // X axis updates + if ( + (axisFlags.isXMin && cornerKey.includes('XMIN')) || + (axisFlags.isXMax && cornerKey.includes('XMAX')) + ) { + state.point[0] = newCorner[0]; + } + + // Y axis updates + if ( + (axisFlags.isYMin && cornerKey.includes('YMIN')) || + (axisFlags.isYMax && cornerKey.includes('YMAX')) + ) { + state.point[1] = newCorner[1]; + } + + // Z axis updates + if ( + (axisFlags.isZMin && cornerKey.includes('ZMIN')) || + (axisFlags.isZMax && cornerKey.includes('ZMAX')) + ) { + state.point[2] = newCorner[2]; + } + + // Apply changes + state.sphereSource.setCenter(...state.point); + state.sphereSource.modified(); + }; + + // Update after corner movement + _updateAfterCornerMovement = (viewport) => { + this._updateFaceSpheresFromCorners(); + this._updateCornerSpheres(); + this._updateClippingPlanesFromFaceSpheres(viewport); + }; + + // Update after face movement + _updateAfterFaceMovement = (viewport) => { + this._updateCornerSpheresFromFaces(); + // this._updateFaceSpheresFromCorners(); + // this._updateCornerSpheres(); + this._updateClippingPlanesFromFaceSpheres(viewport); + }; + + // Trigger tool changed event + _triggerToolChangedEvent = (sphereState) => { + triggerEvent(eventTarget, Events.VOLUMECROPPING_TOOL_CHANGED, { + toolCenter: sphereState.point, + axis: sphereState.isCorner ? 'corner' : sphereState.axis, + draggingSphereIndex: this.draggingSphereIndex, + seriesInstanceUID: this.seriesInstanceUID, + }); + }; + + _updateClippingPlanesFromFaceSpheres(viewport) { + const mapper = viewport.getDefaultActor().actor.getMapper(); + // Update origins in originalClippingPlanes + this.originalClippingPlanes[0].origin = [ + ...this.sphereStates[SPHEREINDEX.XMIN].point, + ]; + this.originalClippingPlanes[1].origin = [ + ...this.sphereStates[SPHEREINDEX.XMAX].point, + ]; + this.originalClippingPlanes[2].origin = [ + ...this.sphereStates[SPHEREINDEX.YMIN].point, + ]; + this.originalClippingPlanes[3].origin = [ + ...this.sphereStates[SPHEREINDEX.YMAX].point, + ]; + this.originalClippingPlanes[4].origin = [ + ...this.sphereStates[SPHEREINDEX.ZMIN].point, + ]; + this.originalClippingPlanes[5].origin = [ + ...this.sphereStates[SPHEREINDEX.ZMAX].point, + ]; + + mapper.removeAllClippingPlanes(); + for (let i = 0; i < 6; ++i) { + const origin = this.originalClippingPlanes[i].origin as [ + number, + number, + number + ]; + const normal = this.originalClippingPlanes[i].normal as [ + number, + number, + number + ]; + const plane = vtkPlane.newInstance({ + origin, + normal, + }); + mapper.addClippingPlane(plane); + } + } + + _updateCornerSpheresFromFaces() { + // Get face sphere positions + const xMin = this.sphereStates[SPHEREINDEX.XMIN].point[0]; + const xMax = this.sphereStates[SPHEREINDEX.XMAX].point[0]; + const yMin = this.sphereStates[SPHEREINDEX.YMIN].point[1]; + const yMax = this.sphereStates[SPHEREINDEX.YMAX].point[1]; + const zMin = this.sphereStates[SPHEREINDEX.ZMIN].point[2]; + const zMax = this.sphereStates[SPHEREINDEX.ZMAX].point[2]; + + const corners = [ + { key: 'XMIN_YMIN_ZMIN', pos: [xMin, yMin, zMin] }, + { key: 'XMIN_YMIN_ZMAX', pos: [xMin, yMin, zMax] }, + { key: 'XMIN_YMAX_ZMIN', pos: [xMin, yMax, zMin] }, + { key: 'XMIN_YMAX_ZMAX', pos: [xMin, yMax, zMax] }, + { key: 'XMAX_YMIN_ZMIN', pos: [xMax, yMin, zMin] }, + { key: 'XMAX_YMIN_ZMAX', pos: [xMax, yMin, zMax] }, + { key: 'XMAX_YMAX_ZMIN', pos: [xMax, yMax, zMin] }, + { key: 'XMAX_YMAX_ZMAX', pos: [xMax, yMax, zMax] }, + ]; + + for (const corner of corners) { + const state = this.sphereStates.find( + (s) => s.uid === `corner_${corner.key}` + ); + if (state) { + state.point[0] = corner.pos[0]; + state.point[1] = corner.pos[1]; + state.point[2] = corner.pos[2]; + state.sphereSource.setCenter(...state.point); + state.sphereSource.modified(); + } + } + } + _updateFaceSpheresFromCorners() { + // Get all corner points + const corners = [ + this.sphereStates[SPHEREINDEX.XMIN_YMIN_ZMIN].point, + this.sphereStates[SPHEREINDEX.XMIN_YMIN_ZMAX].point, + this.sphereStates[SPHEREINDEX.XMIN_YMAX_ZMIN].point, + this.sphereStates[SPHEREINDEX.XMIN_YMAX_ZMAX].point, + this.sphereStates[SPHEREINDEX.XMAX_YMIN_ZMIN].point, + this.sphereStates[SPHEREINDEX.XMAX_YMIN_ZMAX].point, + this.sphereStates[SPHEREINDEX.XMAX_YMAX_ZMIN].point, + this.sphereStates[SPHEREINDEX.XMAX_YMAX_ZMAX].point, + ]; + + const xs = corners.map((p) => p[0]); + const ys = corners.map((p) => p[1]); + const zs = corners.map((p) => p[2]); + + const xMin = Math.min(...xs), + xMax = Math.max(...xs); + const yMin = Math.min(...ys), + yMax = Math.max(...ys); + const zMin = Math.min(...zs), + zMax = Math.max(...zs); + + // Face spheres should always be at the center of their face + this.sphereStates[SPHEREINDEX.XMIN].point = [ + xMin, + (yMin + yMax) / 2, + (zMin + zMax) / 2, + ]; + this.sphereStates[SPHEREINDEX.XMAX].point = [ + xMax, + (yMin + yMax) / 2, + (zMin + zMax) / 2, + ]; + this.sphereStates[SPHEREINDEX.YMIN].point = [ + (xMin + xMax) / 2, + yMin, + (zMin + zMax) / 2, + ]; + this.sphereStates[SPHEREINDEX.YMAX].point = [ + (xMin + xMax) / 2, + yMax, + (zMin + zMax) / 2, + ]; + this.sphereStates[SPHEREINDEX.ZMIN].point = [ + (xMin + xMax) / 2, + (yMin + yMax) / 2, + zMin, + ]; + this.sphereStates[SPHEREINDEX.ZMAX].point = [ + (xMin + xMax) / 2, + (yMin + yMax) / 2, + zMax, + ]; + + [ + SPHEREINDEX.XMIN, + SPHEREINDEX.XMAX, + SPHEREINDEX.YMIN, + SPHEREINDEX.YMAX, + SPHEREINDEX.ZMIN, + SPHEREINDEX.ZMAX, + ].forEach((idx) => { + const s = this.sphereStates[idx]; + s.sphereSource.setCenter(...s.point); + s.sphereSource.modified(); + }); + } + + _updateCornerSpheres() { + // Get face sphere positions + const xMin = this.sphereStates[SPHEREINDEX.XMIN].point[0]; + const xMax = this.sphereStates[SPHEREINDEX.XMAX].point[0]; + const yMin = this.sphereStates[SPHEREINDEX.YMIN].point[1]; + const yMax = this.sphereStates[SPHEREINDEX.YMAX].point[1]; + const zMin = this.sphereStates[SPHEREINDEX.ZMIN].point[2]; + const zMax = this.sphereStates[SPHEREINDEX.ZMAX].point[2]; + + // Define all 8 corners from face sphere positions + const corners = [ + { key: 'XMIN_YMIN_ZMIN', pos: [xMin, yMin, zMin] }, + { key: 'XMIN_YMIN_ZMAX', pos: [xMin, yMin, zMax] }, + { key: 'XMIN_YMAX_ZMIN', pos: [xMin, yMax, zMin] }, + { key: 'XMIN_YMAX_ZMAX', pos: [xMin, yMax, zMax] }, + { key: 'XMAX_YMIN_ZMIN', pos: [xMax, yMin, zMin] }, + { key: 'XMAX_YMIN_ZMAX', pos: [xMax, yMin, zMax] }, + { key: 'XMAX_YMAX_ZMIN', pos: [xMax, yMax, zMin] }, + { key: 'XMAX_YMAX_ZMAX', pos: [xMax, yMax, zMax] }, + ]; + + // Update corner spheres + for (const corner of corners) { + const state = this.sphereStates.find( + (s) => s.uid === `corner_${corner.key}` + ); + if (state) { + state.point[0] = corner.pos[0]; + state.point[1] = corner.pos[1]; + state.point[2] = corner.pos[2]; + state.sphereSource.setCenter(...state.point); + state.sphereSource.modified(); + } + } + + // Update edge lines to follow the corner spheres + Object.values(this.edgeLines).forEach(({ source, key1, key2 }) => { + const state1 = this.sphereStates.find((s) => s.uid === `corner_${key1}`); + const state2 = this.sphereStates.find((s) => s.uid === `corner_${key2}`); + if (state1 && state2) { + const points = source.getPoints(); + points.setPoint(0, state1.point[0], state1.point[1], state1.point[2]); + points.setPoint(1, state2.point[0], state2.point[1], state2.point[2]); + points.modified(); + source.modified(); + } + }); + } + + _onNewVolume = () => { + const viewportsInfo = this._getViewportsInfo(); + this.originalClippingPlanes = []; + this.sphereStates = []; + this.edgeLines = {}; + this._initialize3DViewports(viewportsInfo); + }; + + _unsubscribeToViewportNewVolumeSet(viewportsInfo) { + viewportsInfo.forEach(({ viewportId, renderingEngineId }) => { + const { viewport } = getEnabledElementByIds( + viewportId, + renderingEngineId + ); + const { element } = viewport; + + element.removeEventListener( + Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME, + this._onNewVolume + ); + }); + } + + _subscribeToViewportNewVolumeSet(viewports) { + viewports.forEach(({ viewportId, renderingEngineId }) => { + const { viewport } = getEnabledElementByIds( + viewportId, + renderingEngineId + ); + const { element } = viewport; + + element.addEventListener( + Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME, + this._onNewVolume + ); + }); + } + + _rotateCamera = (viewport, centerWorld, axis, angle) => { + const vtkCamera = viewport.getVtkActiveCamera(); + const viewUp = vtkCamera.getViewUp(); + const focalPoint = vtkCamera.getFocalPoint(); + const position = vtkCamera.getPosition(); + + const newPosition: Types.Point3 = [0, 0, 0]; + const newFocalPoint: Types.Point3 = [0, 0, 0]; + const newViewUp: Types.Point3 = [0, 0, 0]; + + const transform = mat4.identity(new Float32Array(16)); + mat4.translate(transform, transform, centerWorld); + mat4.rotate(transform, transform, angle, axis); + mat4.translate(transform, transform, [ + -centerWorld[0], + -centerWorld[1], + -centerWorld[2], + ]); + vec3.transformMat4(newPosition, position, transform); + vec3.transformMat4(newFocalPoint, focalPoint, transform); + + mat4.identity(transform); + mat4.rotate(transform, transform, angle, axis); + vec3.transformMat4(newViewUp, viewUp, transform); + + viewport.setCamera({ + position: newPosition, + viewUp: newViewUp, + focalPoint: newFocalPoint, + }); + }; +} + +VolumeCroppingTool.toolName = 'VolumeCropping'; +export default VolumeCroppingTool; diff --git a/packages/tools/src/tools/index.ts b/packages/tools/src/tools/index.ts index 35393622f9..186d2c7d76 100644 --- a/packages/tools/src/tools/index.ts +++ b/packages/tools/src/tools/index.ts @@ -1,6 +1,8 @@ import { BaseTool, AnnotationTool, AnnotationDisplayTool } from './base'; import PanTool from './PanTool'; import TrackballRotateTool from './TrackballRotateTool'; +import VolumeCroppingTool from './VolumeCroppingTool'; +import VolumeCroppingControlTool from './VolumeCroppingControlTool'; import WindowLevelTool from './WindowLevelTool'; import WindowLevelRegionTool from './WindowLevelRegionTool'; import StackScrollTool from './StackScrollTool'; @@ -72,6 +74,8 @@ export { // Manipulation Tools PanTool, TrackballRotateTool, + VolumeCroppingTool, + VolumeCroppingControlTool, DragProbeTool, WindowLevelTool, WindowLevelRegionTool, diff --git a/utils/ExampleRunner/example-info.json b/utils/ExampleRunner/example-info.json index 23a484feb6..05cbb38bac 100644 --- a/utils/ExampleRunner/example-info.json +++ b/utils/ExampleRunner/example-info.json @@ -179,6 +179,10 @@ "name": "3D Volume Picking", "description": "Demonstrates how to use the VTK.js vtkCellPicker object to pick 3D point in volume rendering scene. Also shows how to synchronize between 3D and 2D viewports." }, + "volumeCroppingTool": { + "name": "3D Volume Cropping", + "description": "Demonstrates how to use the VolumeCropping and VolumeCroppingControl tools." + }, "multipleToolGroups": { "name": "Multiple Tool Groups", "description": "Demonstrates the usage of multiple tool groups for a set of viewports." From 7d67a828e76b0e9847b2f74971840266097016b9 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 28 Jul 2025 13:11:07 +0000 Subject: [PATCH 123/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 6f7c74dc51..d2deb655c7 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -fa0d63ec6f677bbb7a5cae93c5aed940b8a056ac \ No newline at end of file +e8a5a04f5c2d484c3464a5661800d84af3e58f96 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index f9edc8e469..3c0e51a704 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.14", - "@cornerstonejs/tools": "^3.31.14" + "@cornerstonejs/core": "^3.32.0", + "@cornerstonejs/tools": "^3.32.0" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index e2e5f086f1..323dd90caa 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.14", - "@cornerstonejs/tools": "^3.31.14" + "@cornerstonejs/core": "^3.32.0", + "@cornerstonejs/tools": "^3.32.0" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index d1a4b30164..a63b1f7d90 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.14", + "@cornerstonejs/core": "^3.32.0", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index cd039b29cf..8f63c1c424 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.31.14", - "@cornerstonejs/core": "^3.31.14", - "@cornerstonejs/dicom-image-loader": "^3.31.14", - "@cornerstonejs/nifti-volume-loader": "^3.31.14", - "@cornerstonejs/tools": "^3.31.14", + "@cornerstonejs/adapters": "^3.32.0", + "@cornerstonejs/core": "^3.32.0", + "@cornerstonejs/dicom-image-loader": "^3.32.0", + "@cornerstonejs/nifti-volume-loader": "^3.32.0", + "@cornerstonejs/tools": "^3.32.0", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 75666b2fa3..6f137ffa8a 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.14", - "@cornerstonejs/tools": "^3.31.14", + "@cornerstonejs/core": "^3.32.0", + "@cornerstonejs/tools": "^3.32.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 52644674bf..349d2df99f 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.14" + "@cornerstonejs/core": "^3.32.0" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 6d0eed8a3e..22c36e73f5 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.14", - "@cornerstonejs/tools": "^3.31.14", + "@cornerstonejs/core": "^3.32.0", + "@cornerstonejs/tools": "^3.32.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 4a300fc770..8abb7a56ad 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.14", + "@cornerstonejs/core": "^3.32.0", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index f4baaf171d..d5c69ac1c9 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.31.14", - "commit": "fa0d63ec6f677bbb7a5cae93c5aed940b8a056ac" + "version": "3.32.0", + "commit": "e8a5a04f5c2d484c3464a5661800d84af3e58f96" } \ No newline at end of file diff --git a/version.txt b/version.txt index 01806f76dd..40fc72677c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.31.14 \ No newline at end of file +3.32.0 \ No newline at end of file From 1ce78491c12ac1f94131efcf389b7eae18cffbd0 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 28 Jul 2025 13:11:26 +0000 Subject: [PATCH 124/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b27332925..5be566c1ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) + +### Features + +- volume cropping ([#2139](https://github.com/cornerstonejs/cornerstone3D/issues/2139)) ([e8a5a04](https://github.com/cornerstonejs/cornerstone3D/commit/e8a5a04f5c2d484c3464a5661800d84af3e58f96)) + ## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 577c1649b0..4576582336 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.31.14", + "version": "3.32.0", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 5713159ccc..22238e9fbe 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 3c0e51a704..721e64d1b3 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.31.14", + "version": "3.32.0", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 4e9bfd6683..074b10dcf5 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 323dd90caa..0192163900 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.31.14", + "version": "3.32.0", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index d6e089ec63..f6ccd06e29 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 6d039a34b8..66844d8b86 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.31.14", + "version": "3.32.0", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index d11c0c7238..0d2eb36942 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index a63b1f7d90..a12b67ec15 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.14", + "version": "3.32.0", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index a35ca412bd..ffd7cded56 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 6f137ffa8a..5a8485aa4d 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.14", + "version": "3.32.0", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 15f1dfafef..d251d21d74 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 349d2df99f..5068092274 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.14", + "version": "3.32.0", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 4b62f1ff7f..84d9da0a9e 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 22c36e73f5..8e63275738 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.14", + "version": "3.32.0", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 4d22d59b85..da44c26fff 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) + +### Features + +- volume cropping ([#2139](https://github.com/cornerstonejs/cornerstone3D/issues/2139)) ([e8a5a04](https://github.com/cornerstonejs/cornerstone3D/commit/e8a5a04f5c2d484c3464a5661800d84af3e58f96)) + ## [3.31.14](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.13...v3.31.14) (2025-07-25) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 8abb7a56ad..62056b1c62 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.31.14", + "version": "3.32.0", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From ca7a296a71a65445ecb8f870ca7a412fb0bd39fd Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 28 Jul 2025 13:11:37 +0000 Subject: [PATCH 125/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index b9136ad572..ddd42311c1 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.31.14"; +export const version = "3.32.0"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index e2e8d3a5ce..d78220531a 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.14'; +export const version = '3.32.0'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index e2e8d3a5ce..d78220531a 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.14'; +export const version = '3.32.0'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index e2e8d3a5ce..d78220531a 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.14'; +export const version = '3.32.0'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index e2e8d3a5ce..d78220531a 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.14'; +export const version = '3.32.0'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index e2e8d3a5ce..d78220531a 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.14'; +export const version = '3.32.0'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index e2e8d3a5ce..d78220531a 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.14'; +export const version = '3.32.0'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index e2e8d3a5ce..d78220531a 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.14'; +export const version = '3.32.0'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index e2e8d3a5ce..d78220531a 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.31.14'; +export const version = '3.32.0'; From d527ea2858b44af1f461f1a468d788a0eb8b5059 Mon Sep 17 00:00:00 2001 From: "Martin Bellehumeur, M. Eng." <23396581+mbellehumeur@users.noreply.github.com> Date: Mon, 28 Jul 2025 23:02:01 +0200 Subject: [PATCH 126/212] fix: add missing call to update spheres on on receive event from control tool (#2230) --- packages/tools/src/tools/VolumeCroppingTool.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tools/src/tools/VolumeCroppingTool.ts b/packages/tools/src/tools/VolumeCroppingTool.ts index a6bac4d188..def665f4c0 100644 --- a/packages/tools/src/tools/VolumeCroppingTool.ts +++ b/packages/tools/src/tools/VolumeCroppingTool.ts @@ -842,6 +842,7 @@ class VolumeCroppingTool extends BaseTool { } } } + this._updateCornerSpheres(); viewport.render(); } }; From b2c5377d4ce02faf2a994b94156c284452f6b351 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 28 Jul 2025 21:05:50 +0000 Subject: [PATCH 127/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index d2deb655c7..1ccd30a3e7 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -e8a5a04f5c2d484c3464a5661800d84af3e58f96 \ No newline at end of file +d527ea2858b44af1f461f1a468d788a0eb8b5059 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 721e64d1b3..41fefc8ae0 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.0", - "@cornerstonejs/tools": "^3.32.0" + "@cornerstonejs/core": "^3.32.1", + "@cornerstonejs/tools": "^3.32.1" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 0192163900..fb093f7631 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.0", - "@cornerstonejs/tools": "^3.32.0" + "@cornerstonejs/core": "^3.32.1", + "@cornerstonejs/tools": "^3.32.1" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index a12b67ec15..5792f3dfc9 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.0", + "@cornerstonejs/core": "^3.32.1", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 8f63c1c424..10f7c2bbe5 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.0", - "@cornerstonejs/core": "^3.32.0", - "@cornerstonejs/dicom-image-loader": "^3.32.0", - "@cornerstonejs/nifti-volume-loader": "^3.32.0", - "@cornerstonejs/tools": "^3.32.0", + "@cornerstonejs/adapters": "^3.32.1", + "@cornerstonejs/core": "^3.32.1", + "@cornerstonejs/dicom-image-loader": "^3.32.1", + "@cornerstonejs/nifti-volume-loader": "^3.32.1", + "@cornerstonejs/tools": "^3.32.1", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 5a8485aa4d..b3af690c1b 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.0", - "@cornerstonejs/tools": "^3.32.0", + "@cornerstonejs/core": "^3.32.1", + "@cornerstonejs/tools": "^3.32.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 5068092274..d73ebee8c1 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.0" + "@cornerstonejs/core": "^3.32.1" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 8e63275738..ccb6540938 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.0", - "@cornerstonejs/tools": "^3.32.0", + "@cornerstonejs/core": "^3.32.1", + "@cornerstonejs/tools": "^3.32.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 62056b1c62..7e85fd1b6a 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.0", + "@cornerstonejs/core": "^3.32.1", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index d5c69ac1c9..0bc028cf9d 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.0", - "commit": "e8a5a04f5c2d484c3464a5661800d84af3e58f96" + "version": "3.32.1", + "commit": "d527ea2858b44af1f461f1a468d788a0eb8b5059" } \ No newline at end of file diff --git a/version.txt b/version.txt index 40fc72677c..c058d50e0f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.0 \ No newline at end of file +3.32.1 \ No newline at end of file From 6c4140d134524a105140734cf87fe37ca861a5a8 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 28 Jul 2025 21:06:06 +0000 Subject: [PATCH 128/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5be566c1ca..d2a5e2e10f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) + +### Bug Fixes + +- add missing call to update spheres on on receive event from control tool ([#2230](https://github.com/cornerstonejs/cornerstone3D/issues/2230)) ([d527ea2](https://github.com/cornerstonejs/cornerstone3D/commit/d527ea2858b44af1f461f1a468d788a0eb8b5059)) + # [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) ### Features diff --git a/lerna.json b/lerna.json index 4576582336..5a2e1a185a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.0", + "version": "3.32.1", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 22238e9fbe..2aa70147fd 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/adapters + # [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 41fefc8ae0..ed937e53be 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.0", + "version": "3.32.1", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 074b10dcf5..7b8df247a1 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/ai + # [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index fb093f7631..84528f3537 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.0", + "version": "3.32.1", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index f6ccd06e29..c9916af172 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/core + # [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 66844d8b86..515851d77c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.0", + "version": "3.32.1", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 0d2eb36942..cef1a931c1 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + # [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 5792f3dfc9..2ce5df7e97 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.0", + "version": "3.32.1", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index ffd7cded56..56a89f41b9 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + # [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index b3af690c1b..a19f2c8801 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.0", + "version": "3.32.1", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index d251d21d74..869c57c33b 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + # [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index d73ebee8c1..51c61c9f67 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.0", + "version": "3.32.1", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 84d9da0a9e..a65969017d 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + # [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index ccb6540938..fa3c7d7d4a 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.0", + "version": "3.32.1", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index da44c26fff..92844cac65 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) + +### Bug Fixes + +- add missing call to update spheres on on receive event from control tool ([#2230](https://github.com/cornerstonejs/cornerstone3D/issues/2230)) ([d527ea2](https://github.com/cornerstonejs/cornerstone3D/commit/d527ea2858b44af1f461f1a468d788a0eb8b5059)) + # [3.32.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.14...v3.32.0) (2025-07-28) ### Features diff --git a/packages/tools/package.json b/packages/tools/package.json index 7e85fd1b6a..fc5e3b7b1f 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.0", + "version": "3.32.1", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From ffafeda5af8b68d84749c0a3c05acdc8c4de60ec Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 28 Jul 2025 21:06:17 +0000 Subject: [PATCH 129/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index ddd42311c1..ac8b30741d 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.32.0"; +export const version = "3.32.1"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index d78220531a..5a63c55eb7 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.0'; +export const version = '3.32.1'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index d78220531a..5a63c55eb7 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.0'; +export const version = '3.32.1'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index d78220531a..5a63c55eb7 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.0'; +export const version = '3.32.1'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index d78220531a..5a63c55eb7 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.0'; +export const version = '3.32.1'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index d78220531a..5a63c55eb7 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.0'; +export const version = '3.32.1'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index d78220531a..5a63c55eb7 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.0'; +export const version = '3.32.1'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index d78220531a..5a63c55eb7 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.0'; +export const version = '3.32.1'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index d78220531a..5a63c55eb7 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.0'; +export const version = '3.32.1'; From c7ece43c3d26585c7e5c35b8986c65f6576cba51 Mon Sep 17 00:00:00 2001 From: Alireza Date: Tue, 29 Jul 2025 17:17:13 -0400 Subject: [PATCH 130/212] fix first segment active (#2231) --- .../internalAddSegmentationRepresentation.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/tools/src/stateManagement/segmentation/internalAddSegmentationRepresentation.ts b/packages/tools/src/stateManagement/segmentation/internalAddSegmentationRepresentation.ts index aeb03c6f7f..773ec0ce07 100644 --- a/packages/tools/src/stateManagement/segmentation/internalAddSegmentationRepresentation.ts +++ b/packages/tools/src/stateManagement/segmentation/internalAddSegmentationRepresentation.ts @@ -29,9 +29,18 @@ function internalAddSegmentationRepresentation( renderingConfig ); - // If no active segment index is set, default to segment 1 + // If no active segment index is set, default to the first segment if (!getActiveSegmentIndex(segmentationId)) { - setActiveSegmentIndex(segmentationId, 1); // defaults to segment 1 + const segmentation = + defaultSegmentationStateManager.getSegmentation(segmentationId); + + if (segmentation) { + const segmentKeys = Object.keys(segmentation.segments); + if (segmentKeys.length > 0) { + const firstSegmentIndex = segmentKeys.map((k) => Number(k)).sort()[0]; + setActiveSegmentIndex(segmentationId, firstSegmentIndex); + } + } } if (representationInput.type === SegmentationRepresentations.Contour) { From 71c36c9cbe576cae229ba6f27105dd2eaa61c362 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 29 Jul 2025 21:21:09 +0000 Subject: [PATCH 131/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 1ccd30a3e7..dc430eee8f 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -d527ea2858b44af1f461f1a468d788a0eb8b5059 \ No newline at end of file +c7ece43c3d26585c7e5c35b8986c65f6576cba51 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index ed937e53be..40ef5a8b11 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.1", - "@cornerstonejs/tools": "^3.32.1" + "@cornerstonejs/core": "^3.32.2", + "@cornerstonejs/tools": "^3.32.2" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 84528f3537..64148c0c09 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.1", - "@cornerstonejs/tools": "^3.32.1" + "@cornerstonejs/core": "^3.32.2", + "@cornerstonejs/tools": "^3.32.2" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 2ce5df7e97..df6eeb660c 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.1", + "@cornerstonejs/core": "^3.32.2", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 10f7c2bbe5..6503f9b9a7 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.1", - "@cornerstonejs/core": "^3.32.1", - "@cornerstonejs/dicom-image-loader": "^3.32.1", - "@cornerstonejs/nifti-volume-loader": "^3.32.1", - "@cornerstonejs/tools": "^3.32.1", + "@cornerstonejs/adapters": "^3.32.2", + "@cornerstonejs/core": "^3.32.2", + "@cornerstonejs/dicom-image-loader": "^3.32.2", + "@cornerstonejs/nifti-volume-loader": "^3.32.2", + "@cornerstonejs/tools": "^3.32.2", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index a19f2c8801..966d95ab56 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.1", - "@cornerstonejs/tools": "^3.32.1", + "@cornerstonejs/core": "^3.32.2", + "@cornerstonejs/tools": "^3.32.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 51c61c9f67..7d7b25e5aa 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.1" + "@cornerstonejs/core": "^3.32.2" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index fa3c7d7d4a..1b0bc647b2 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.1", - "@cornerstonejs/tools": "^3.32.1", + "@cornerstonejs/core": "^3.32.2", + "@cornerstonejs/tools": "^3.32.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index fc5e3b7b1f..c162ff3925 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.1", + "@cornerstonejs/core": "^3.32.2", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 0bc028cf9d..a56aae0bfe 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.1", - "commit": "d527ea2858b44af1f461f1a468d788a0eb8b5059" + "version": "3.32.2", + "commit": "c7ece43c3d26585c7e5c35b8986c65f6576cba51" } \ No newline at end of file diff --git a/version.txt b/version.txt index c058d50e0f..66df80b692 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.1 \ No newline at end of file +3.32.2 \ No newline at end of file From 3242ea999762cfcc01d61d89962fc4978d719672 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 29 Jul 2025 21:21:27 +0000 Subject: [PATCH 132/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 4 ++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 45 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2a5e2e10f..0818e8f1bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) + +**Note:** Version bump only for package root + ## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 5a2e1a185a..2f21026657 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.1", + "version": "3.32.2", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 2aa70147fd..34ed95ca87 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 40ef5a8b11..dac3978b2d 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.1", + "version": "3.32.2", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 7b8df247a1..61091f2817 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 64148c0c09..ce86154f18 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.1", + "version": "3.32.2", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index c9916af172..1bd8c26ac2 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 515851d77c..04449a0ccb 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.1", + "version": "3.32.2", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index cef1a931c1..1e4a413657 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index df6eeb660c..e419ff9c6e 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.1", + "version": "3.32.2", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 56a89f41b9..36d6d29f56 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 966d95ab56..b7cea92ab2 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.1", + "version": "3.32.2", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 869c57c33b..44365e95ef 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 7d7b25e5aa..83b680b571 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.1", + "version": "3.32.2", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index a65969017d..3801a60eba 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 1b0bc647b2..1dfa448ca5 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.1", + "version": "3.32.2", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 92844cac65..3ed614628c 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.32.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.0...v3.32.1) (2025-07-28) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index c162ff3925..cfaeaded2b 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.1", + "version": "3.32.2", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 60a9a8fc952debf62fbba4c7c545e9adeb882e7c Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 29 Jul 2025 21:21:38 +0000 Subject: [PATCH 133/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index ac8b30741d..d808a367d4 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.32.1"; +export const version = "3.32.2"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 5a63c55eb7..97883a8efc 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.1'; +export const version = '3.32.2'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 5a63c55eb7..97883a8efc 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.1'; +export const version = '3.32.2'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 5a63c55eb7..97883a8efc 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.1'; +export const version = '3.32.2'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 5a63c55eb7..97883a8efc 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.1'; +export const version = '3.32.2'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 5a63c55eb7..97883a8efc 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.1'; +export const version = '3.32.2'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 5a63c55eb7..97883a8efc 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.1'; +export const version = '3.32.2'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 5a63c55eb7..97883a8efc 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.1'; +export const version = '3.32.2'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 5a63c55eb7..97883a8efc 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.1'; +export const version = '3.32.2'; From 07620e9b5b2e427866cc91fd616ae0e292b48f3b Mon Sep 17 00:00:00 2001 From: Bill Wallace Date: Tue, 29 Jul 2025 21:53:42 -0400 Subject: [PATCH 134/212] fix: Adapter issues (#2233) --- .../src/adapters/Cornerstone3D/Angle.ts | 2 +- .../src/adapters/Cornerstone3D/Probe.ts | 6 +++-- .../adapters/Cornerstone3D/RectangleROI.ts | 23 ++++++++++++++----- .../tools/src/tools/annotation/ProbeTool.ts | 1 + 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/adapters/Cornerstone3D/Angle.ts b/packages/adapters/src/adapters/Cornerstone3D/Angle.ts index a0daf11495..feebb00059 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Angle.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Angle.ts @@ -43,7 +43,7 @@ class Angle extends BaseAdapter3D { ...state.annotation.data, handles: { ...state.annotation.data.handles, - points: worldCoords + points: [worldCoords[0], worldCoords[1], worldCoords[3]] }, cachedStats, frameNumber: ReferencedFrameNumber diff --git a/packages/adapters/src/adapters/Cornerstone3D/Probe.ts b/packages/adapters/src/adapters/Cornerstone3D/Probe.ts index 7879b8d77f..fd7b9693da 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Probe.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Probe.ts @@ -43,7 +43,8 @@ class Probe extends BaseAdapter3D { const cachedStats = referencedImageId ? { [`imageId:${referencedImageId}`]: { - length: NUMGroup?.MeasuredValueSequence?.NumericValue || 0 + value: + NUMGroup?.MeasuredValueSequence?.NumericValue ?? null } } : {}; @@ -54,7 +55,8 @@ class Probe extends BaseAdapter3D { points: worldCoords }, cachedStats, - frameNumber: ReferencedFrameNumber + frameNumber: ReferencedFrameNumber, + invalidated: true }; return state; diff --git a/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts b/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts index 3e36000a16..99fe95ddb8 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts @@ -20,8 +20,6 @@ export class RectangleROI extends BaseAdapter3D { const { state, NUMGroup, - scoord, - scoordArgs, worldCoords, referencedImageId, ReferencedFrameNumber @@ -32,12 +30,20 @@ export class RectangleROI extends BaseAdapter3D { this.toolType ); + const areaGroup = MeasurementGroup.ContentSequence.find( + g => + g.ValueType === "NUM" && + g.ConceptNameCodeSequence[0].CodeMeaning === "Area" + ); const cachedStats = referencedImageId ? { [`imageId:${referencedImageId}`]: { - area: NUMGroup - ? NUMGroup.MeasuredValueSequence.NumericValue - : 0 + area: + areaGroup?.MeasuredValueSequence?.[0]?.NumericValue || + 0, + areaUnit: + areaGroup?.MeasuredValueSequence?.[0] + ?.MeasurementUnitsCodeSequence?.CodeValue } } : {}; @@ -45,7 +51,12 @@ export class RectangleROI extends BaseAdapter3D { ...state.annotation.data, handles: { ...state.annotation.data.handles, - points: worldCoords + points: [ + worldCoords[0], + worldCoords[1], + worldCoords[3], + worldCoords[2] + ] }, cachedStats, frameNumber: ReferencedFrameNumber diff --git a/packages/tools/src/tools/annotation/ProbeTool.ts b/packages/tools/src/tools/annotation/ProbeTool.ts index d18d582f38..a803d5632f 100644 --- a/packages/tools/src/tools/annotation/ProbeTool.ts +++ b/packages/tools/src/tools/annotation/ProbeTool.ts @@ -658,6 +658,7 @@ class ProbeTool extends AnnotationTool { Modality: modality, modalityUnit, }; + annotation.invalidated = true; } else { this.isHandleOutsideImage = true; cachedStats[targetId] = { From 067ea5bac3d42c1a17a302ac699d5e11689f4793 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 30 Jul 2025 01:57:18 +0000 Subject: [PATCH 135/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index dc430eee8f..06f32325c5 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -c7ece43c3d26585c7e5c35b8986c65f6576cba51 \ No newline at end of file +07620e9b5b2e427866cc91fd616ae0e292b48f3b \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index dac3978b2d..0660da643f 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.2", - "@cornerstonejs/tools": "^3.32.2" + "@cornerstonejs/core": "^3.32.3", + "@cornerstonejs/tools": "^3.32.3" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index ce86154f18..0d0de6ed14 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.2", - "@cornerstonejs/tools": "^3.32.2" + "@cornerstonejs/core": "^3.32.3", + "@cornerstonejs/tools": "^3.32.3" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index e419ff9c6e..48c347c1a5 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.2", + "@cornerstonejs/core": "^3.32.3", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 6503f9b9a7..0ecb4f28af 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.2", - "@cornerstonejs/core": "^3.32.2", - "@cornerstonejs/dicom-image-loader": "^3.32.2", - "@cornerstonejs/nifti-volume-loader": "^3.32.2", - "@cornerstonejs/tools": "^3.32.2", + "@cornerstonejs/adapters": "^3.32.3", + "@cornerstonejs/core": "^3.32.3", + "@cornerstonejs/dicom-image-loader": "^3.32.3", + "@cornerstonejs/nifti-volume-loader": "^3.32.3", + "@cornerstonejs/tools": "^3.32.3", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index b7cea92ab2..4c0552c07c 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.2", - "@cornerstonejs/tools": "^3.32.2", + "@cornerstonejs/core": "^3.32.3", + "@cornerstonejs/tools": "^3.32.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 83b680b571..e8613852db 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.2" + "@cornerstonejs/core": "^3.32.3" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 1dfa448ca5..585653104c 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.2", - "@cornerstonejs/tools": "^3.32.2", + "@cornerstonejs/core": "^3.32.3", + "@cornerstonejs/tools": "^3.32.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index cfaeaded2b..eb887cef10 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.2", + "@cornerstonejs/core": "^3.32.3", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index a56aae0bfe..165616453b 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.2", - "commit": "c7ece43c3d26585c7e5c35b8986c65f6576cba51" + "version": "3.32.3", + "commit": "07620e9b5b2e427866cc91fd616ae0e292b48f3b" } \ No newline at end of file diff --git a/version.txt b/version.txt index 66df80b692..537ea5e920 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.2 \ No newline at end of file +3.32.3 \ No newline at end of file From 24b9682a2515c442f32c21b12de51aed13cc3aee Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 30 Jul 2025 01:57:35 +0000 Subject: [PATCH 136/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 6 ++++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 51 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0818e8f1bd..cf2617bdac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) + +### Bug Fixes + +- Adapter issues ([#2233](https://github.com/cornerstonejs/cornerstone3D/issues/2233)) ([07620e9](https://github.com/cornerstonejs/cornerstone3D/commit/07620e9b5b2e427866cc91fd616ae0e292b48f3b)) + ## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index 2f21026657..34dddaf8d1 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.2", + "version": "3.32.3", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 34ed95ca87..e6d7ce7315 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) + +### Bug Fixes + +- Adapter issues ([#2233](https://github.com/cornerstonejs/cornerstone3D/issues/2233)) ([07620e9](https://github.com/cornerstonejs/cornerstone3D/commit/07620e9b5b2e427866cc91fd616ae0e292b48f3b)) + ## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 0660da643f..ffe32c866f 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.2", + "version": "3.32.3", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 61091f2817..363aedb30e 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 0d0de6ed14..a64c7dff36 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.2", + "version": "3.32.3", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 1bd8c26ac2..d3e0ae6d29 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 04449a0ccb..7eff8c3c7f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.2", + "version": "3.32.3", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 1e4a413657..29b200c2ad 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 48c347c1a5..195f2369c9 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.2", + "version": "3.32.3", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 36d6d29f56..058ee90e96 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 4c0552c07c..81e0f577fa 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.2", + "version": "3.32.3", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 44365e95ef..18ec700458 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index e8613852db..13d751305a 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.2", + "version": "3.32.3", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 3801a60eba..14e56581fa 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 585653104c..426cce4014 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.2", + "version": "3.32.3", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 3ed614628c..9c9c4de9c9 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) + +### Bug Fixes + +- Adapter issues ([#2233](https://github.com/cornerstonejs/cornerstone3D/issues/2233)) ([07620e9](https://github.com/cornerstonejs/cornerstone3D/commit/07620e9b5b2e427866cc91fd616ae0e292b48f3b)) + ## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index eb887cef10..3bf74f8f74 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.2", + "version": "3.32.3", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From d4cc06b31a3f90368db0829db0f4b539de7a96c7 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 30 Jul 2025 01:57:46 +0000 Subject: [PATCH 137/212] chore: update generated version file [skip ci] --- packages/adapters/src/version.ts | 2 +- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts index d808a367d4..a80352863a 100644 --- a/packages/adapters/src/version.ts +++ b/packages/adapters/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = "3.32.2"; +export const version = "3.32.3"; diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 97883a8efc..a7f22c9882 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.2'; +export const version = '3.32.3'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 97883a8efc..a7f22c9882 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.2'; +export const version = '3.32.3'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 97883a8efc..a7f22c9882 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.2'; +export const version = '3.32.3'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 97883a8efc..a7f22c9882 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.2'; +export const version = '3.32.3'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 97883a8efc..a7f22c9882 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.2'; +export const version = '3.32.3'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 97883a8efc..a7f22c9882 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.2'; +export const version = '3.32.3'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 97883a8efc..a7f22c9882 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.2'; +export const version = '3.32.3'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 97883a8efc..a7f22c9882 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.2'; +export const version = '3.32.3'; From 35062daedcb6b9f4f785095bfcf0ff811cdbc4f1 Mon Sep 17 00:00:00 2001 From: Bill Wallace Date: Wed, 30 Jul 2025 12:32:17 -0400 Subject: [PATCH 138/212] fix: Ensure FOR is stored when required and cachedStats created (#2237) --- packages/adapters/.gitignore | 3 +++ .../adapters/Cornerstone/MeasurementReport.js | 3 +++ .../src/adapters/Cornerstone3D/Length.ts | 3 --- .../Cornerstone3D/MeasurementReport.ts | 6 ++++++ .../adapters/Cornerstone3D/RectangleROI.ts | 19 +++++++------------ packages/adapters/src/version.ts | 5 ----- 6 files changed, 19 insertions(+), 20 deletions(-) delete mode 100644 packages/adapters/src/version.ts diff --git a/packages/adapters/.gitignore b/packages/adapters/.gitignore index 19dae9fb8f..d46c37c93e 100644 --- a/packages/adapters/.gitignore +++ b/packages/adapters/.gitignore @@ -1,4 +1,7 @@ +# Ignore the version.js because it is generated +src/version.ts +# Misc items *.sw* *~ diff --git a/packages/adapters/src/adapters/Cornerstone/MeasurementReport.js b/packages/adapters/src/adapters/Cornerstone/MeasurementReport.js index fc596953dd..9c26d8dd0e 100644 --- a/packages/adapters/src/adapters/Cornerstone/MeasurementReport.js +++ b/packages/adapters/src/adapters/Cornerstone/MeasurementReport.js @@ -34,6 +34,9 @@ const codeValueMatch = (group, code, oldCode) => { function getTID300ContentItem(tool, ReferencedSOPSequence, adapterClass) { const args = adapterClass.getTID300RepresentationArguments(tool); args.ReferencedSOPSequence = ReferencedSOPSequence; + args.ReferencedFrameOfReferenceUID = args.use3DSpatialCoordinates + ? tool.metadata.FrameOfReferenceUID + : null; const tid300Measurement = new adapterClass.TID300Representation(args); diff --git a/packages/adapters/src/adapters/Cornerstone3D/Length.ts b/packages/adapters/src/adapters/Cornerstone3D/Length.ts index 15af533d67..49b68d797c 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/Length.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/Length.ts @@ -80,9 +80,6 @@ export default class Length extends BaseAdapter3D { trackingIdentifierTextValue: this.trackingIdentifierTextValue, finding, findingSites: findingSites || [], - ReferencedFrameOfReferenceUID: is3DMeasurement - ? metadata.FrameOfReferenceUID - : null, use3DSpatialCoordinates: is3DMeasurement }; } diff --git a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts index e29d1c4225..59e3c06349 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts @@ -185,6 +185,10 @@ export default class MeasurementReport { is3DMeasurement ); args.ReferencedSOPSequence = ReferencedSOPSequence; + if (args.use3DSpatialCoordinates) { + args.ReferencedFrameOfReferenceUID = + tool.metadata.FrameOfReferenceUID; + } const tid300Measurement = new toolClass.TID300Representation(args); const labelMeasurement = new LabelData(tid300Measurement, tool); @@ -328,6 +332,7 @@ export default class MeasurementReport { annotation: { data: { annotationUID, + cachedStats: {}, handles: { activeHandleIndex: 0, textBox: { @@ -361,6 +366,7 @@ export default class MeasurementReport { annotationUID, data: { annotationUID, + cachedStats: {}, handles: { activeHandleIndex: 0, textBox: { diff --git a/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts b/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts index 99fe95ddb8..1287b86685 100644 --- a/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts +++ b/packages/adapters/src/adapters/Cornerstone3D/RectangleROI.ts @@ -17,18 +17,13 @@ export class RectangleROI extends BaseAdapter3D { sopInstanceUIDToImageIdMap, metadata ) { - const { - state, - NUMGroup, - worldCoords, - referencedImageId, - ReferencedFrameNumber - } = MeasurementReport.getSetupMeasurementData( - MeasurementGroup, - sopInstanceUIDToImageIdMap, - metadata, - this.toolType - ); + const { state, worldCoords, referencedImageId, ReferencedFrameNumber } = + MeasurementReport.getSetupMeasurementData( + MeasurementGroup, + sopInstanceUIDToImageIdMap, + metadata, + this.toolType + ); const areaGroup = MeasurementGroup.ContentSequence.find( g => diff --git a/packages/adapters/src/version.ts b/packages/adapters/src/version.ts deleted file mode 100644 index a80352863a..0000000000 --- a/packages/adapters/src/version.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Auto-generated from version.json - * Do not modify this file directly - */ -export const version = "3.32.3"; From 1eb2a443c64685603ad6cf0165d7614a628ddfa8 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 30 Jul 2025 16:36:08 +0000 Subject: [PATCH 139/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 06f32325c5..0c499f6a3a 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -07620e9b5b2e427866cc91fd616ae0e292b48f3b \ No newline at end of file +35062daedcb6b9f4f785095bfcf0ff811cdbc4f1 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index ffe32c866f..ffe979e6fb 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.3", - "@cornerstonejs/tools": "^3.32.3" + "@cornerstonejs/core": "^3.32.4", + "@cornerstonejs/tools": "^3.32.4" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index a64c7dff36..7b97ca08d2 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.3", - "@cornerstonejs/tools": "^3.32.3" + "@cornerstonejs/core": "^3.32.4", + "@cornerstonejs/tools": "^3.32.4" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 195f2369c9..8310701f6b 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.3", + "@cornerstonejs/core": "^3.32.4", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 0ecb4f28af..2cc45c93de 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.3", - "@cornerstonejs/core": "^3.32.3", - "@cornerstonejs/dicom-image-loader": "^3.32.3", - "@cornerstonejs/nifti-volume-loader": "^3.32.3", - "@cornerstonejs/tools": "^3.32.3", + "@cornerstonejs/adapters": "^3.32.4", + "@cornerstonejs/core": "^3.32.4", + "@cornerstonejs/dicom-image-loader": "^3.32.4", + "@cornerstonejs/nifti-volume-loader": "^3.32.4", + "@cornerstonejs/tools": "^3.32.4", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 81e0f577fa..dd10447036 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.3", - "@cornerstonejs/tools": "^3.32.3", + "@cornerstonejs/core": "^3.32.4", + "@cornerstonejs/tools": "^3.32.4", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 13d751305a..4bb0147957 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.3" + "@cornerstonejs/core": "^3.32.4" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 426cce4014..510da427df 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.3", - "@cornerstonejs/tools": "^3.32.3", + "@cornerstonejs/core": "^3.32.4", + "@cornerstonejs/tools": "^3.32.4", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 3bf74f8f74..75ba902619 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.3", + "@cornerstonejs/core": "^3.32.4", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 165616453b..b8b8c913d2 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.3", - "commit": "07620e9b5b2e427866cc91fd616ae0e292b48f3b" + "version": "3.32.4", + "commit": "35062daedcb6b9f4f785095bfcf0ff811cdbc4f1" } \ No newline at end of file diff --git a/version.txt b/version.txt index 537ea5e920..462914540b 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.3 \ No newline at end of file +3.32.4 \ No newline at end of file From 8c27e61aedf03e45aef2d4180218e547f3079133 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 30 Jul 2025 16:36:26 +0000 Subject: [PATCH 140/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 6 ++++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf2617bdac..e358d98bcb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) + +### Bug Fixes + +- Ensure FOR is stored when required and cachedStats created ([#2237](https://github.com/cornerstonejs/cornerstone3D/issues/2237)) ([35062da](https://github.com/cornerstonejs/cornerstone3D/commit/35062daedcb6b9f4f785095bfcf0ff811cdbc4f1)) + ## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 34dddaf8d1..c2581b71e6 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.3", + "version": "3.32.4", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index e6d7ce7315..11f1c31bd4 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) + +### Bug Fixes + +- Ensure FOR is stored when required and cachedStats created ([#2237](https://github.com/cornerstonejs/cornerstone3D/issues/2237)) ([35062da](https://github.com/cornerstonejs/cornerstone3D/commit/35062daedcb6b9f4f785095bfcf0ff811cdbc4f1)) + ## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) ### Bug Fixes diff --git a/packages/adapters/package.json b/packages/adapters/package.json index ffe979e6fb..2eebb5020a 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.3", + "version": "3.32.4", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 363aedb30e..2904237395 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 7b97ca08d2..81c16668c7 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.3", + "version": "3.32.4", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index d3e0ae6d29..e73e6d8500 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 7eff8c3c7f..0423e341a4 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.3", + "version": "3.32.4", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 29b200c2ad..5c473fe6d0 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 8310701f6b..43cfc37003 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.3", + "version": "3.32.4", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 058ee90e96..a949cea0f8 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index dd10447036..1b7dbc2e51 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.3", + "version": "3.32.4", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 18ec700458..366ee28cf3 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 4bb0147957..795afbe0e5 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.3", + "version": "3.32.4", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 14e56581fa..26638b03b8 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 510da427df..e6366bfc8a 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.3", + "version": "3.32.4", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 9c9c4de9c9..b3c30ba5ca 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 75ba902619..c8486ed68a 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.3", + "version": "3.32.4", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From ab88654e25aefb7f43a807c0f38ce601af4c20a4 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 30 Jul 2025 16:36:36 +0000 Subject: [PATCH 141/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index a7f22c9882..41f531e5d9 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.3'; +export const version = '3.32.4'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index a7f22c9882..41f531e5d9 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.3'; +export const version = '3.32.4'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index a7f22c9882..41f531e5d9 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.3'; +export const version = '3.32.4'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index a7f22c9882..41f531e5d9 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.3'; +export const version = '3.32.4'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index a7f22c9882..41f531e5d9 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.3'; +export const version = '3.32.4'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index a7f22c9882..41f531e5d9 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.3'; +export const version = '3.32.4'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index a7f22c9882..41f531e5d9 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.3'; +export const version = '3.32.4'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index a7f22c9882..41f531e5d9 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.3'; +export const version = '3.32.4'; From 2bf6e2d8d3b54d8e91d041bfd40ad2d3d84a5c65 Mon Sep 17 00:00:00 2001 From: Bill Wallace Date: Wed, 30 Jul 2025 16:21:09 -0400 Subject: [PATCH 142/212] fix: Reset view plane to axial/sag/cor by default if possible (#2238) --- .../src/RenderingEngine/BaseVolumeViewport.ts | 108 +++++++++++------- packages/core/src/types/OrientationVectors.ts | 2 +- 2 files changed, 69 insertions(+), 41 deletions(-) diff --git a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts index 193e735029..2cad61cd32 100644 --- a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts +++ b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts @@ -76,6 +76,7 @@ import * as metaData from '../metaData'; import { getCameraVectors } from './helpers/getCameraVectors'; import { isContextPoolRenderingEngine } from './helpers/isContextPoolRenderingEngine'; import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; +import mprCameraValues from '../constants/mprCameraValues'; /** * Abstract base class for volume viewports. VolumeViewports are used to render * 3D volumes from which various orientations can be viewed. Since VolumeViewports @@ -716,6 +717,60 @@ abstract class BaseVolumeViewport extends Viewport { abstract isInAcquisitionPlane(): boolean; + /** + * This will apply a camera orientation that is compatible with inPlaneVector1 and 2 + * + * 1. If inPlaneVector1 and inPlaneVector2 are compatible with, no change. + * 2. If dot products of the current view plane normal and inPlaneVector 1 and 2 are zero, no change + * + */ + public setBestOrentation(inPlaneVector1, inPlaneVector2) { + if (!inPlaneVector1 && !inPlaneVector2) { + // Any view is compatible with a point position + return; + } + const { viewPlaneNormal } = this.getCamera(); + if ( + isCompatible(viewPlaneNormal, inPlaneVector2) && + isCompatible(viewPlaneNormal, inPlaneVector1) + ) { + // Orthogonal view to the current view, so no change. + return; + } + + const acquisition = this._getAcquisitionPlaneOrientation(); + if ( + isCompatible(acquisition.viewPlaneNormal, inPlaneVector2) && + isCompatible(acquisition.viewPlaneNormal, inPlaneVector1) + ) { + // Orthogonal view to the current view, so no change. + this.setOrientation(acquisition); + return; + } + for (const orientation of <{ viewPlaneNormal: Point3 }[]>( + Object.values(mprCameraValues) + )) { + if ( + isCompatible(orientation.viewPlaneNormal, inPlaneVector2) && + isCompatible(orientation.viewPlaneNormal, inPlaneVector1) + ) { + // Orthogonal view to the current view, so no change. + this.setOrientation(orientation); + return; + } + } + + const planeNormal = ( + vec3.cross( + vec3.create(), + inPlaneVector2 || acquisition.viewPlaneNormal, + inPlaneVector1 + ) + ); + vec3.normalize(planeNormal, planeNormal); + this.setOrientation({ viewPlaneNormal: planeNormal }); + } + /** * Sets the view reference given a referenced plane and the current * view plane normal being applied. @@ -723,48 +778,16 @@ abstract class BaseVolumeViewport extends Viewport { * a new view plane normal as the referenced plane normal, or else the * cross product of the existing view plane normal and the inPlaneVector1 */ - public setViewPlane(planeRestriction: PlaneRestriction, viewPlaneNormal) { + public setViewPlane(planeRestriction: PlaneRestriction) { const { point, inPlaneVector1, inPlaneVector2, FrameOfReferenceUID } = planeRestriction; - if (!inPlaneVector1) { - return this.setViewReference({ - FrameOfReferenceUID, - cameraFocalPoint: point, - }); - } - - // const planeUp = vec3.normalize(vec3.create(), inPlaneVector1); - if (inPlaneVector2) { - const planeNormal = ( - vec3.cross(vec3.create(), inPlaneVector1, inPlaneVector2) - ); - vec3.normalize(planeNormal, planeNormal); - return this.setViewReference({ - FrameOfReferenceUID, - cameraFocalPoint: point, - viewPlaneNormal: planeNormal, - // viewUp: planeUp, - }); - } - const dotNormal = vec3.dot(viewPlaneNormal, inPlaneVector1); - if (isEqual(dotNormal, 0)) { - return this.setViewReference({ - FrameOfReferenceUID, - viewPlaneNormal, - cameraFocalPoint: point, - }); - } + this.setBestOrentation(inPlaneVector1, inPlaneVector2); - const planeNormal = ( - vec3.cross(vec3.create(), viewPlaneNormal, inPlaneVector1) - ); - vec3.normalize(planeNormal, planeNormal); - return this.setViewReference({ + this.setViewReference({ FrameOfReferenceUID, - viewPlaneNormal: planeNormal, cameraFocalPoint: point, - // viewUp: planeUp, + viewPlaneNormal: this.getCamera().viewPlaneNormal, }); } @@ -786,12 +809,12 @@ abstract class BaseVolumeViewport extends Viewport { } = viewRef; let { sliceIndex } = viewRef; - const { focalPoint, viewPlaneNormal, position } = this.getCamera(); - - if (planeRestriction?.inPlaneVector1 && !refViewPlaneNormal) { - return this.setViewPlane(planeRestriction, viewPlaneNormal); + if (planeRestriction && !refViewPlaneNormal) { + return this.setViewPlane(planeRestriction); } + const { focalPoint, viewPlaneNormal, position } = this.getCamera(); + const isNegativeNormal = isEqualNegative( viewPlaneNormal, refViewPlaneNormal @@ -2288,4 +2311,9 @@ abstract class BaseVolumeViewport extends Viewport { }; } +/** Checks of a vector is compatible with the view plane normal */ +function isCompatible(viewPlaneNormal, vector) { + return !vector || isEqual(vec3.dot(viewPlaneNormal, vector), 0); +} + export default BaseVolumeViewport; diff --git a/packages/core/src/types/OrientationVectors.ts b/packages/core/src/types/OrientationVectors.ts index e275e30813..37913ece53 100644 --- a/packages/core/src/types/OrientationVectors.ts +++ b/packages/core/src/types/OrientationVectors.ts @@ -30,7 +30,7 @@ interface OrientationVectors { /** Slice Normal for the viewport - the normal that points in the opposite direction of the slice normal out of screen and is negative of direction of projection */ viewPlaneNormal: Point3; /** viewUp direction for the viewport - the vector that points from bottom to top of the viewport */ - viewUp: Point3; + viewUp?: Point3; } export type { OrientationVectors as default }; From b0a6353d72c975312d3e9a1bc3c2e10473578eaf Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 30 Jul 2025 20:24:48 +0000 Subject: [PATCH 143/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 0c499f6a3a..d5a79a6a3f 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -35062daedcb6b9f4f785095bfcf0ff811cdbc4f1 \ No newline at end of file +2bf6e2d8d3b54d8e91d041bfd40ad2d3d84a5c65 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 2eebb5020a..58744e7f4a 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -90,7 +90,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.4", - "@cornerstonejs/tools": "^3.32.4" + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 81c16668c7..c7315146fb 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.4", - "@cornerstonejs/tools": "^3.32.4" + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 43cfc37003..516b55ef1e 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -116,7 +116,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.4", + "@cornerstonejs/core": "^3.32.5", "dicom-parser": "^1.8.9" }, "lint-staged": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 2cc45c93de..33fbf5c197 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -37,11 +37,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.4", - "@cornerstonejs/core": "^3.32.4", - "@cornerstonejs/dicom-image-loader": "^3.32.4", - "@cornerstonejs/nifti-volume-loader": "^3.32.4", - "@cornerstonejs/tools": "^3.32.4", + "@cornerstonejs/adapters": "^3.32.5", + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/dicom-image-loader": "^3.32.5", + "@cornerstonejs/nifti-volume-loader": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 1b7dbc2e51..f002ec586a 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -56,8 +56,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.4", - "@cornerstonejs/tools": "^3.32.4", + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 795afbe0e5..a85963ba96 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.4" + "@cornerstonejs/core": "^3.32.5" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index e6366bfc8a..7e1c603332 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -54,8 +54,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.4", - "@cornerstonejs/tools": "^3.32.4", + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index c8486ed68a..3969150eea 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.4", + "@cornerstonejs/core": "^3.32.5", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index b8b8c913d2..9ad12b5ff6 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.4", - "commit": "35062daedcb6b9f4f785095bfcf0ff811cdbc4f1" + "version": "3.32.5", + "commit": "2bf6e2d8d3b54d8e91d041bfd40ad2d3d84a5c65" } \ No newline at end of file diff --git a/version.txt b/version.txt index 462914540b..28fb4be5ea 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.4 \ No newline at end of file +3.32.5 \ No newline at end of file From 646e5613f8583b85f6240dce55646871feba84e3 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 30 Jul 2025 20:25:07 +0000 Subject: [PATCH 144/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e358d98bcb..a61b2077ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) + +### Bug Fixes + +- Reset view plane to axial/sag/cor by default if possible ([#2238](https://github.com/cornerstonejs/cornerstone3D/issues/2238)) ([2bf6e2d](https://github.com/cornerstonejs/cornerstone3D/commit/2bf6e2d8d3b54d8e91d041bfd40ad2d3d84a5c65)) + ## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) ### Bug Fixes diff --git a/lerna.json b/lerna.json index c2581b71e6..58a82f06cd 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.4", + "version": "3.32.5", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 11f1c31bd4..150b1e3f2d 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) ### Bug Fixes diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 58744e7f4a..a4b45df720 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.4", + "version": "3.32.5", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 2904237395..30e1880e70 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index c7315146fb..ae808799d3 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.4", + "version": "3.32.5", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index e73e6d8500..ba4bf6bd24 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) + +### Bug Fixes + +- Reset view plane to axial/sag/cor by default if possible ([#2238](https://github.com/cornerstonejs/cornerstone3D/issues/2238)) ([2bf6e2d](https://github.com/cornerstonejs/cornerstone3D/commit/2bf6e2d8d3b54d8e91d041bfd40ad2d3d84a5c65)) + ## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 0423e341a4..0c1c5cc97d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.4", + "version": "3.32.5", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 5c473fe6d0..569e72eb63 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 516b55ef1e..9d31f33851 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.4", + "version": "3.32.5", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index a949cea0f8..63e54ee2f9 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index f002ec586a..d17ca29ffb 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.4", + "version": "3.32.5", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 366ee28cf3..cdca23a228 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index a85963ba96..4dacb257b0 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.4", + "version": "3.32.5", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 26638b03b8..e16633b470 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 7e1c603332..fcb90d4a9a 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.4", + "version": "3.32.5", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index b3c30ba5ca..1a5e23479b 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.32.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.3...v3.32.4) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 3969150eea..3128818a48 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.4", + "version": "3.32.5", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From aba7909a09c4525ce692e3341d44a9d0f286e6f1 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 30 Jul 2025 20:25:19 +0000 Subject: [PATCH 145/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 41f531e5d9..efe6b2ae49 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.4'; +export const version = '3.32.5'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 41f531e5d9..efe6b2ae49 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.4'; +export const version = '3.32.5'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 41f531e5d9..efe6b2ae49 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.4'; +export const version = '3.32.5'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 41f531e5d9..efe6b2ae49 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.4'; +export const version = '3.32.5'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 41f531e5d9..efe6b2ae49 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.4'; +export const version = '3.32.5'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 41f531e5d9..efe6b2ae49 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.4'; +export const version = '3.32.5'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 41f531e5d9..efe6b2ae49 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.4'; +export const version = '3.32.5'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 41f531e5d9..efe6b2ae49 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.4'; +export const version = '3.32.5'; From cf847c481942c59c3371d2634172599e4c0464c7 Mon Sep 17 00:00:00 2001 From: Alireza Date: Mon, 4 Aug 2025 22:09:08 -0400 Subject: [PATCH 146/212] chore: off eslint and move to oxc 1.0 (#2232) --- .eslintignore | 6 - .eslintrc.json | 156 -- .github/pull_request_template.md | 2 - .github/workflows/format-check.yml | 4 +- .gitignore | 1 + .husky/pre-commit | 2 - .oxlintrc.json | 8 + .prettierrc | 3 +- .vscode/extensions.json | 6 +- addOns/README.md | 15 +- bun.lock | 611 ++----- package.json | 20 +- packages/adapters/README.md | 36 +- packages/adapters/generate-dictionary.js | 215 +-- packages/adapters/package.json | 3 +- packages/ai/package.json | 3 +- .../examples/dicomLoader/customImageLoader.ts | 2 +- packages/core/package.json | 2 +- .../src/RenderingEngine/RenderingEngine.ts | 1 + packages/core/src/utilities/logger.ts | 1 - packages/dicomImageLoader/docs/Building.md | 14 +- packages/dicomImageLoader/docs/ImageIds.md | 11 +- .../dicomImageLoader/docs/TransferSyntaxes.md | 61 +- packages/dicomImageLoader/package.json | 13 +- .../docs/concepts/cornerstone-core/cahce.md | 1 + .../annotation/annotationManager.md | 4 +- .../cornerstone-tools/segmentation/active.md | 5 +- .../cornerstone-tools/segmentation/config.md | 24 +- .../cornerstone-tools/segmentation/index.md | 2 - .../cornerstone-tools/segmentation/locking.md | 10 +- .../cornerstone-tools/segmentation/state.md | 23 +- .../concepts/streaming-image-volume/index.md | 1 - .../streaming-image-volume/streaming.md | 3 - packages/docs/docs/help.md | 1 - .../migration-guides/2x/2-streaming-loader.md | 1 - .../docs/docs/migration-guides/2x/3-core.md | 2 - .../docs/docs/migration-guides/2x/5-tools.md | 1 - .../2x/6-dicom-image-loader.md | 3 - .../2x/7-nifti-volume-loader.md | 3 - .../2x/8-deverloper-experience.md | 2 - .../migration-guides/3x/2-threshold-tools.md | 23 +- .../migration-guides/3x/4-get-statistics.md | 11 +- packages/docs/docs/test-coverage.md | 3 +- packages/docs/scripts/README.md | 1 + .../docs/scripts/generate-llms-full-txt.js | 142 +- packages/docs/scripts/generate-redirects.js | 6 +- .../docs/src/components/HomepageFeatures.js | 6 +- packages/docs/src/pages/index.module.css | 4 +- packages/labelmap-interpolation/README.md | 4 +- packages/labelmap-interpolation/package.json | 3 +- packages/nifti-volume-loader/package.json | 2 +- .../polymorphic-segmentation/package.json | 3 +- .../ellipticalROIToolUI.ts | 5 +- packages/tools/examples/petCt/index.ts | 8 +- .../index.ts | 2 +- packages/tools/package.json | 2 +- .../utils/generateConvexHullFromContour.ts | 6 +- tests/contextPoolRenderingEngine.spec.ts | 4 +- tsconfig.json | 4 +- utils/assets/assetsURL.json | 1 - version.json | 2 +- yarn.lock | 1403 ++++------------- 62 files changed, 825 insertions(+), 2102 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.json create mode 100644 .oxlintrc.json diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index f859685105..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,6 +0,0 @@ -*.css -*.md -*.json -packages/adapters/config/webpack/*.js -packages/docs/*.js -packages/tools/src/utilities/segmentation/growCut/runGrowCut.ts diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index a52bf493f6..0000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,156 +0,0 @@ -// This config is a little messy because it needs to work -// for both our library and our example app in /examples. -// A good "@TODO" item would be to separate the linting/bundling -// for them. -{ - "root": true, - "parser": "@typescript-eslint/parser", - - // eslint-plugin-prettier - // - prettier - // - // @typescript-eslint/eslint-plugin - // - @typescript-eslint - // - // - // - import - "plugins": [ - "@typescript-eslint", - "import", - "eslint-plugin-tsdoc", - "prettier" - ], - - // Order matters here. Last will override - // eslint-config-prettier (only turns rules off) - // - prettier # eslint conflicts - // - prettier/react # react conflicts - // - prettier/@typescript-eslint # typescript conflicts - // - // eslint-plugin-prettier - // - plugin:prettier/recommended - // - // eslint-plugin-react - // - plugin:react/recommended - // - // eslint-plugin-react-hooks - // - plugin:react-hooks/recommended - // - // @typescript-eslint/eslint-plugin - // - - "extends": [ - "eslint:recommended", - "plugin:import/errors", - "plugin:import/warnings", - "plugin:import/typescript", - "plugin:@typescript-eslint/recommended", - // sets up the plugin AND eslint-config-prettier - "plugin:prettier/recommended" - ], - - "parserOptions": { - "ecmaVersion": 2022, - "sourceType": "module", - "project": "./tsconfig.json", - "tsconfigRootDir": "./", - "warnOnUnsupportedTypeScriptVersion": false - }, - "ignorePatterns": [ - "packages/docs", - "dist", - "**/*_test.js", - "**/*_jest.js", - "**/*babel*", - "**/*.d.ts", - "**/*_types.ts" - ], - "rules": { - "import/no-cycle": ["error", { "maxDepth": 15 }], - // Enforce consistent brace style for all control statements for readability - "curly": "error", - "tsdoc/syntax": "off", - "@typescript-eslint/ban-ts-comment": "off", - "no-console": "off", - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/consistent-type-exports": "error", - "@typescript-eslint/no-unsafe-function-type": "off", - "@typescript-eslint/no-empty-object-type": "off", - "@typescript-eslint/no-unused-expressions": "warn", - "@typescript-eslint/consistent-type-imports": [ - "error", - { - "prefer": "type-imports", - "disallowTypeAnnotations": true - } - ], - "@typescript-eslint/no-import-type-side-effects": "error", - - "import/extensions": [ - "error", - "ignorePackages", - { - "js": "never", - "jsx": "never", - "ts": "never", - "tsx": "never" - } - ], - "import/prefer-default-export": "off", - "prettier/prettier": [ - "error", - { - "endOfLine": "auto", - "printWidth": 80 - } - ], - "no-undef": "warn", - "import/no-named-as-default": "off", - "import/no-named-as-default-member": "off" - }, - "overrides": [ - { - "files": ["*.ts", "*.tsx"], // Apply the rules to TypeScript files - "rules": { - "import/no-cycle": ["error", { "maxDepth": 15 }] - } - }, - { - "files": ["**/examples/**"], - "rules": { - "@typescript-eslint/no-explicit-any": "off" // Disable the rule for files in the examples directory - } - } - ], - "env": { - "es6": true, - "browser": true, - "node": true - }, - "settings": { - "import/resolver": { - "node": { - "extensions": [".js", ".jsx", ".ts", ".tsx"] - }, - "typescript": { - "project": "./tsconfig.json" - } - } - }, - "globals": { - "context": true, - "jasmine": true, - "es6": true, - "browser": true, - "node": true, - "afterEach": true, - "beforeEach": true, - "done": true, - "describe": "readonly", - "beforeAll": "readonly", - "it": "readonly", - "jest": "readonly", - "expect": "readonly", - "assert": true - } -} diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index df00a4bbb2..5f7181b5bf 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -72,8 +72,6 @@ after the commits are squashed. - [] My code has been well-documented (function documentation, inline comments, etc.) - - #### Public Documentation Updates diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml index 4a1b3c1402..9d61bb3c8f 100644 --- a/.github/workflows/format-check.yml +++ b/.github/workflows/format-check.yml @@ -11,7 +11,7 @@ on: branches: [ beta ] jobs: - format-check: + lint: timeout-minutes: 30 runs-on: ubuntu-latest @@ -37,6 +37,6 @@ jobs: run: bun run build:esm - name: Run format check - run: bun run format-check + run: bun run lint env: NODE_OPTIONS: --max_old_space_size=32896 diff --git a/.gitignore b/.gitignore index 9a530f575b..954af29d70 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # dependencies +CLAUDE.md node_modules .nyc_output .nx diff --git a/.husky/pre-commit b/.husky/pre-commit index 84603bca5f..3723623171 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,3 +1 @@ -# .husky/pre-commit - yarn lint-staged diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000000..c014f88236 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,8 @@ +{ + "plugins": ["typescript", "import"], + "ignorePatterns": ["utils/**", "**/examples/**", "packages/dicomImageLoader/src/types/codec*"], + "rules": { + "typescript/no-explicit-any": "error", + "import/no-cycle": "error" + } +} diff --git a/.prettierrc b/.prettierrc index cfb47e1096..e39ec15e72 100644 --- a/.prettierrc +++ b/.prettierrc @@ -5,5 +5,6 @@ "tabWidth": 2, "semi": true, "singleQuote": true, - "arrowParens": "always" + "arrowParens": "always", + "plugins": ["@prettier/plugin-oxc"] } diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 0ceb70df6f..02d44498a1 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,3 +1,7 @@ { - "recommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint", "PolyMeilex.wgsl"] + "recommendations": [ + "esbenp.prettier-vscode", + "PolyMeilex.wgsl", + "oxc.oxc-vscode" + ] } diff --git a/addOns/README.md b/addOns/README.md index 6a102d6968..982b68bdab 100644 --- a/addOns/README.md +++ b/addOns/README.md @@ -1,8 +1,7 @@ -# External Dependencies - -This module contains optional and external dependencies for including in OHIF, such as the DICOM Microscopy Viewer component. - - -# External Components - -This directory contains various external components. These can be fetched in various ways such as NPM dependencies or by fetching files externally. +# External Dependencies + +This module contains optional and external dependencies for including in OHIF, such as the DICOM Microscopy Viewer component. + +# External Components + +This directory contains various external components. These can be fetched in various ways such as NPM dependencies or by fetching files externally. diff --git a/bun.lock b/bun.lock index d8594ddbab..bd92d8d490 100644 --- a/bun.lock +++ b/bun.lock @@ -5,7 +5,6 @@ "name": "root", "devDependencies": { "@babel/core": "^7.21.8", - "@babel/eslint-parser": "^7.19.1", "@babel/plugin-external-helpers": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.14.7", @@ -21,6 +20,7 @@ "@microsoft/api-extractor": "7.49.2", "@microsoft/tsdoc": "^0.15.0", "@playwright/test": "^1.51.1", + "@prettier/plugin-oxc": "^0.0.4", "@rollup/plugin-babel": "^6.0.3", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.2", @@ -35,8 +35,6 @@ "@types/node": "^20.14.8", "@types/react": "^17.0.58", "@types/react-dom": "^17.0.20", - "@typescript-eslint/eslint-plugin": "^8.1.0", - "@typescript-eslint/parser": "^8.1.0", "@webgpu/types": "^0.1.40", "acorn": "^8.8.2", "acorn-jsx": "^5.3.2", @@ -58,21 +56,13 @@ "cssnano": "^6.0.1", "docdash": "^1.2.0", "dpdm": "^3.14.0", - "eslint": "^8.39.0", - "eslint-config-prettier": "8.10.0", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsx-a11y": "6.7.1", - "eslint-plugin-prettier": "4.2.1", - "eslint-plugin-tsdoc": "^0.2.17", - "eslint-webpack-plugin": "^4.0.1", "execa": "^7.2.0", "exports-loader": "^3.0.0", "file-loader": "^6.2.0", "follow-redirects": "^1.15.2", "fs-extra": "^10.0.0", "html-webpack-plugin": "^5.5.1", - "husky": "^9.1.4", + "husky": "^9.1.7", "jasmine": "^4.6.0", "jest": "^29.7.0", "jest-canvas-mock": "^2.5.2", @@ -94,6 +84,7 @@ "netlify-cli": "^17.34.1", "nyc": "^17.1.0", "open-cli": "^7.0.1", + "oxlint": "^1.9.0", "path-browserify": "^1.0.1", "playwright-test-coverage": "^1.2.12", "postcss": "^8.4.23", @@ -136,7 +127,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "3.31.6", + "version": "3.32.2", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -151,7 +142,7 @@ }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "3.31.6", + "version": "3.32.2", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -169,7 +160,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "3.31.6", + "version": "3.32.2", "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", @@ -179,7 +170,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.31.6", + "version": "3.32.2", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -198,7 +189,7 @@ }, "packages/labelmap-interpolation": { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.31.6", + "version": "3.32.2", "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165", @@ -211,7 +202,7 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.31.6", + "version": "3.32.2", "dependencies": { "nifti-reader-js": "^0.6.8", }, @@ -221,7 +212,7 @@ }, "packages/polymorphic-segmentation": { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.31.6", + "version": "3.32.2", "dependencies": { "@icr/polyseg-wasm": "0.4.0", }, @@ -233,7 +224,7 @@ }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "3.31.6", + "version": "3.32.2", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -265,8 +256,6 @@ "@babel/core": ["@babel/core@7.26.10", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.10", "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.10", "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ=="], - "@babel/eslint-parser": ["@babel/eslint-parser@7.26.10", "", { "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "sha512-QsfQZr4AiLpKqn7fz+j7SN+f43z2DZCgGyYbNJ2vJOqKfG4E6MZer1+jqGZqKJaxq/gdO2DC/nUu45+pOL5p2Q=="], - "@babel/generator": ["@babel/generator@7.26.10", "", { "dependencies": { "@babel/parser": "^7.26.10", "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang=="], "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g=="], @@ -661,14 +650,6 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.2", "", { "os": "win32", "cpu": "x64" }, "sha512-VEfTCZicoZnZ6sGkjFPGRFFJuL2fZn2bLhsekZl1CJslflp2cJS/VoKs1jMk+3pDfsGW6CfQVUckP707HwbXeQ=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.5.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w=="], - - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], - - "@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], - - "@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], - "@externals/dicom-microscopy-viewer": ["@externals/dicom-microscopy-viewer@workspace:addOns/externals/dicom-microscopy-viewer"], "@fastify/accept-negotiator": ["@fastify/accept-negotiator@1.1.0", "", {}, "sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ=="], @@ -685,14 +666,8 @@ "@fastify/static": ["@fastify/static@7.0.4", "", { "dependencies": { "@fastify/accept-negotiator": "^1.0.0", "@fastify/send": "^2.0.0", "content-disposition": "^0.5.3", "fastify-plugin": "^4.0.0", "fastq": "^1.17.0", "glob": "^10.3.4" } }, "sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q=="], - "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.13.0", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw=="], - - "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - "@humanwhocodes/momoa": ["@humanwhocodes/momoa@2.0.4", "", {}, "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA=="], - "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="], - "@hutson/parse-repository-url": ["@hutson/parse-repository-url@3.0.2", "", {}, "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q=="], "@iarna/toml": ["@iarna/toml@2.2.5", "", {}, "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg=="], @@ -883,16 +858,12 @@ "@netlify/zip-it-and-ship-it": ["@netlify/zip-it-and-ship-it@9.42.1", "", { "dependencies": { "@babel/parser": "^7.22.5", "@babel/types": "7.26.3", "@netlify/binary-info": "^1.0.0", "@netlify/serverless-functions-api": "^1.31.1", "@vercel/nft": "0.27.7", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", "cp-file": "^10.0.0", "es-module-lexer": "^1.0.0", "esbuild": "0.19.11", "execa": "^6.0.0", "fast-glob": "^3.3.2", "filter-obj": "^5.0.0", "find-up": "^6.0.0", "glob": "^8.0.3", "is-builtin-module": "^3.1.0", "is-path-inside": "^4.0.0", "junk": "^4.0.0", "locate-path": "^7.0.0", "merge-options": "^3.0.4", "minimatch": "^9.0.0", "normalize-path": "^3.0.0", "p-map": "^5.0.0", "path-exists": "^5.0.0", "precinct": "^11.0.0", "require-package-name": "^2.0.1", "resolve": "^2.0.0-next.1", "semver": "^7.3.8", "tmp-promise": "^3.0.2", "toml": "^3.0.0", "unixify": "^1.0.0", "urlpattern-polyfill": "8.0.2", "yargs": "^17.0.0", "zod": "^3.23.8" }, "bin": { "zip-it-and-ship-it": "bin.js" } }, "sha512-ZCGM2OnLbiFOZO+kpODI6BKjH6X4a6vE/tJd0aqIvKWiygZgxhIw5APZUzgwLGv4BahIBG+tcfKgW7krpZYLwA=="], - "@nicolo-ribaudo/eslint-scope-5-internals": ["@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1", "", { "dependencies": { "eslint-scope": "5.1.1" } }, "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg=="], - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="], - "@npmcli/agent": ["@npmcli/agent@2.2.2", "", { "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", "socks-proxy-agent": "^8.0.3" } }, "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og=="], "@npmcli/arborist": ["@npmcli/arborist@7.5.4", "", { "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^3.1.1", "@npmcli/installed-package-contents": "^2.1.0", "@npmcli/map-workspaces": "^3.0.2", "@npmcli/metavuln-calculator": "^7.1.1", "@npmcli/name-from-folder": "^2.0.0", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.1.0", "@npmcli/query": "^3.1.0", "@npmcli/redact": "^2.0.0", "@npmcli/run-script": "^8.1.0", "bin-links": "^4.0.4", "cacache": "^18.0.3", "common-ancestor-path": "^1.0.1", "hosted-git-info": "^7.0.2", "json-parse-even-better-errors": "^3.0.2", "json-stringify-nice": "^1.1.4", "lru-cache": "^10.2.2", "minimatch": "^9.0.4", "nopt": "^7.2.1", "npm-install-checks": "^6.2.0", "npm-package-arg": "^11.0.2", "npm-pick-manifest": "^9.0.1", "npm-registry-fetch": "^17.0.1", "pacote": "^18.0.6", "parse-conflict-json": "^3.0.0", "proc-log": "^4.2.0", "proggy": "^2.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", "ssri": "^10.0.6", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" }, "bin": { "arborist": "bin/index.js" } }, "sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g=="], @@ -979,6 +950,54 @@ "@opentelemetry/api": ["@opentelemetry/api@1.8.0", "", {}, "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w=="], + "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.74.0", "", { "os": "android", "cpu": "arm64" }, "sha512-lgq8TJq22eyfojfa2jBFy2m66ckAo7iNRYDdyn9reXYA3I6Wx7tgGWVx1JAp1lO+aUiqdqP/uPlDaETL9tqRcg=="], + + "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.74.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xbY/io/hkARggbpYEMFX6CwFzb7f4iS6WuBoBeZtdqRWfIEi7sm/uYWXfyVeB8uqOATvJ07WRFC2upI8PSI83g=="], + + "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.74.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-FIj2gAGtFaW0Zk+TnGyenMUoRu1ju+kJ/h71D77xc1owOItbFZFGa+4WSVck1H8rTtceeJlK+kux+vCjGFCl9Q=="], + + "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.74.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-W1I+g5TJg0TRRMHgEWNWsTIfe782V3QuaPgZxnfPNmDMywYdtlzllzclBgaDq6qzvZCCQc/UhvNb37KWTCTj8A=="], + + "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.74.0", "", { "os": "linux", "cpu": "arm" }, "sha512-gxqkyRGApeVI8dgvJ19SYe59XASW3uVxF1YUgkE7peW/XIg5QRAOVTFKyTjI9acYuK1MF6OJHqx30cmxmZLtiQ=="], + + "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.74.0", "", { "os": "linux", "cpu": "arm" }, "sha512-jpnAUP4Fa93VdPPDzxxBguJmldj/Gpz7wTXKFzpAueqBMfZsy9KNC+0qT2uZ9HGUDMzNuKw0Se3bPCpL/gfD2Q=="], + + "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.74.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-fcWyM7BNfCkHqIf3kll8fJctbR/PseL4RnS2isD9Y3FFBhp4efGAzhDaxIUK5GK7kIcFh1P+puIRig8WJ6IMVQ=="], + + "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.74.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-AMY30z/C77HgiRRJX7YtVUaelKq1ex0aaj28XoJu4SCezdS8i0IftUNTtGS1UzGjGZB8zQz5SFwVy4dRu4GLwg=="], + + "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.74.0", "", { "os": "linux", "cpu": "none" }, "sha512-/RZAP24TgZo4vV/01TBlzRqs0R7E6xvatww4LnmZEBBulQBU/SkypDywfriFqWuFoa61WFXPV7sLcTjJGjim/w=="], + + "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.74.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-620J1beNAlGSPBD+Msb3ptvrwxu04B8iULCH03zlf0JSLy/5sqlD6qBs0XUVkUJv1vbakUw1gfVnUQqv0UTuEg=="], + + "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.74.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WBFgQmGtFnPNzHyLKbC1wkYGaRIBxXGofO0+hz1xrrkPgbxbJS1Ukva1EB8sPaVBBQ52Bdc2GjLSp721NWRvww=="], + + "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.74.0", "", { "os": "linux", "cpu": "x64" }, "sha512-y4mapxi0RGqlp3t6Sm+knJlAEqdKDYrEue2LlXOka/F2i4sRN0XhEMPiSOB3ppHmvK4I2zY2XBYTsX1Fel0fAg=="], + + "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.74.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-yDS9bRDh5ymobiS2xBmjlrGdUuU61IZoJBaJC5fELdYT5LJNBXlbr3Yc6m2PWfRJwkH6Aq5fRvxAZ4wCbkGa8w=="], + + "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.74.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-XFWY52Rfb4N5wEbMCTSBMxRkDLGbAI9CBSL24BIDywwDJMl31gHEVlmHdCDRoXAmanCI6gwbXYTrWe0HvXJ7Aw=="], + + "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.74.0", "", { "os": "win32", "cpu": "x64" }, "sha512-1D3x6iU2apLyfTQHygbdaNbX3nZaHu4yaXpD7ilYpoLo7f0MX0tUuoDrqJyJrVGqvyXgc0uz4yXz9tH9ZZhvvg=="], + + "@oxc-project/types": ["@oxc-project/types@0.74.0", "", {}, "sha512-KOw/RZrVlHGhCXh1RufBFF7Nuo7HdY5w1lRJukM/igIl6x9qtz8QycDvZdzb4qnHO7znrPyo2sJrFJK2eKHgfQ=="], + + "@oxlint/darwin-arm64": ["@oxlint/darwin-arm64@1.9.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-VRxI/T0I4bq+xoaI0qNFeGPxOOganHlfLmx8JbFFZswoxMkm5lIvVYScDKLrsbbPSe4bcZ5v1DmX5sNGQ619Uw=="], + + "@oxlint/darwin-x64": ["@oxlint/darwin-x64@1.9.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-vMBa3eNrJMSBApXvsx6FgMuWCnNE+ETJJieLPhemZKctMNWOJQX+2i09CG2kb1IkmxagLapH7dZ4i0+Lf13mqg=="], + + "@oxlint/linux-arm64-gnu": ["@oxlint/linux-arm64-gnu@1.9.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-8wnMjloRbz7hPKvcgqd8HKNgkEgFJZvp9Los2pdE1CKh33msIxIXPGT3KKhYzyrtBaRaG2LJHshUPub02Q+x9A=="], + + "@oxlint/linux-arm64-musl": ["@oxlint/linux-arm64-musl@1.9.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-elj9FTNXvq9oP8UedeHHq2R8lCtTmBGvUO/xLez734zVx3tvBl3avmuEfPBqR4wlUKDANExDh3Rg0pssflhw9w=="], + + "@oxlint/linux-x64-gnu": ["@oxlint/linux-x64-gnu@1.9.0", "", { "os": "linux", "cpu": "x64" }, "sha512-d7VjQttKDgXKIYY3tm2GXTD83dyI+D8POGdPRT8GjhitHKasHQWFMBDG5iLp60FNc5Ky1cIe/2nwKW9ReQvhKw=="], + + "@oxlint/linux-x64-musl": ["@oxlint/linux-x64-musl@1.9.0", "", { "os": "linux", "cpu": "x64" }, "sha512-R9vi5LGxNNi3pisp4dG7Ez00mAvCeki8VI5DUg6W1MR0GTnaejlVtMflziA2jqpdTGOK4bjLDsHKIadGC1SMVg=="], + + "@oxlint/win32-arm64": ["@oxlint/win32-arm64@1.9.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-TiV7xYBMhkc/r0X+c9cMwGKUWYJRlWnI61m8powqer6lMJ8VfDe1RkRF4ttO5wlPGkiBwBa3vYWAgxaXc9JAMQ=="], + + "@oxlint/win32-x64": ["@oxlint/win32-x64@1.9.0", "", { "os": "win32", "cpu": "x64" }, "sha512-OWqqkXsLrpS1uQsxjNqiOkC9a/CszMLa3VwlRcpm/z3iPxEL/qEVjGfjZX6XZw8Q6YukFB77rgYqzotvtCvI1A=="], + "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], @@ -1025,6 +1044,8 @@ "@polka/url": ["@polka/url@1.0.0-next.28", "", {}, "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw=="], + "@prettier/plugin-oxc": ["@prettier/plugin-oxc@0.0.4", "", { "dependencies": { "oxc-parser": "0.74.0" } }, "sha512-UGXe+g/rSRbglL0FOJiar+a+nUrst7KaFmsg05wYbKiInGWP6eAj/f8A2Uobgo5KxEtb2X10zeflNH6RK2xeIQ=="], + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], @@ -1085,8 +1106,6 @@ "@rspack/lite-tapable": ["@rspack/lite-tapable@1.0.1", "", {}, "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w=="], - "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], - "@rushstack/node-core-library": ["@rushstack/node-core-library@5.11.0", "", { "dependencies": { "ajv": "~8.13.0", "ajv-draft-04": "~1.0.0", "ajv-formats": "~3.0.1", "fs-extra": "~11.3.0", "import-lazy": "~4.0.0", "jju": "~1.4.0", "resolve": "~1.22.1", "semver": "~7.5.4" }, "peerDependencies": { "@types/node": "*" }, "optionalPeers": ["@types/node"] }, "sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ=="], "@rushstack/rig-package": ["@rushstack/rig-package@0.5.3", "", { "dependencies": { "resolve": "~1.22.1", "strip-json-comments": "~3.1.1" } }, "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow=="], @@ -1231,8 +1250,6 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], - "@types/karma": ["@types/karma@6.3.9", "", { "dependencies": { "@types/node": "*", "log4js": "^6.4.1" } }, "sha512-sjE/MHnoAZAQYAKRXAbjTOiBKyGGErEM725bruRcmDdMa2vp1bjWPhApI7/i564PTyHlzc3vIGXLL6TFIpAxFg=="], "@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="], @@ -1299,46 +1316,14 @@ "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.26.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.26.1", "@typescript-eslint/type-utils": "8.26.1", "@typescript-eslint/utils": "8.26.1", "@typescript-eslint/visitor-keys": "8.26.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA=="], - - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.26.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.26.1", "@typescript-eslint/types": "8.26.1", "@typescript-eslint/typescript-estree": "8.26.1", "@typescript-eslint/visitor-keys": "8.26.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ=="], - - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.26.1", "", { "dependencies": { "@typescript-eslint/types": "8.26.1", "@typescript-eslint/visitor-keys": "8.26.1" } }, "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg=="], + "@typescript-eslint/types": ["@typescript-eslint/types@5.62.0", "", {}, "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.26.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.26.1", "@typescript-eslint/utils": "8.26.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.26.1", "", {}, "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ=="], - - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.26.1", "", { "dependencies": { "@typescript-eslint/types": "8.26.1", "@typescript-eslint/visitor-keys": "8.26.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA=="], - - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.26.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.26.1", "@typescript-eslint/types": "8.26.1", "@typescript-eslint/typescript-estree": "8.26.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg=="], - - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.26.1", "", { "dependencies": { "@typescript-eslint/types": "8.26.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } }, "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw=="], "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], - "@unrs/rspack-resolver-binding-darwin-arm64": ["@unrs/rspack-resolver-binding-darwin-arm64@1.1.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bQx2L40UF5XxsXwkD26PzuspqUbUswWVbmclmUC+c83Cv/EFrFJ1JaZj5Q5jyYglKGOtyIWY/hXTCdWRN9vT0Q=="], - - "@unrs/rspack-resolver-binding-darwin-x64": ["@unrs/rspack-resolver-binding-darwin-x64@1.1.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-dMi9a7//BsuPTnhWEDxmdKZ6wxQlPnAob8VSjefGbKX/a+pHfTaX1pm/jv2VPdarP96IIjCKPatJS/TtLQeGQA=="], - - "@unrs/rspack-resolver-binding-freebsd-x64": ["@unrs/rspack-resolver-binding-freebsd-x64@1.1.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-RiBZQ+LSORQObfhV1yH7jGz+4sN3SDYtV53jgc8tUVvqdqVDaUm1KA3zHLffmoiYNGrYkE3sSreGC+FVpsB4Vg=="], - - "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": ["@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.1.2", "", { "os": "linux", "cpu": "arm" }, "sha512-IyKIFBtOvuPCJt1WPx9e9ovTGhZzrIbW11vWzw4aPmx3VShE+YcMpAldqQubdCep0UVKZyFt+2hQDQZwFiJ4jg=="], - - "@unrs/rspack-resolver-binding-linux-arm64-gnu": ["@unrs/rspack-resolver-binding-linux-arm64-gnu@1.1.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-RfYtlCtJrv5i6TO4dSlpbyOJX9Zbhmkqrr9hjDfr6YyE5KD0ywLRzw8UjXsohxG1XWgRpb2tvPuRYtURJwbqWg=="], - - "@unrs/rspack-resolver-binding-linux-arm64-musl": ["@unrs/rspack-resolver-binding-linux-arm64-musl@1.1.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-MaITzkoqsn1Rm3+YnplubgAQEfOt+2jHfFvuFhXseUfcfbxe8Zyc3TM7LKwgv7mRVjIl+/yYN5JqL0cjbnhAnQ=="], - - "@unrs/rspack-resolver-binding-linux-x64-gnu": ["@unrs/rspack-resolver-binding-linux-x64-gnu@1.1.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Nu981XmzQqis/uB3j4Gi3p5BYCd/zReU5zbJmjMrEH7IIRH0dxZpdOmS/+KwEk6ao7Xd8P2D2gDHpHD/QTp0aQ=="], - - "@unrs/rspack-resolver-binding-linux-x64-musl": ["@unrs/rspack-resolver-binding-linux-x64-musl@1.1.2", "", { "os": "linux", "cpu": "x64" }, "sha512-xJupeDvaRpV0ADMuG1dY9jkOjhUzTqtykvchiU2NldSD+nafSUcMWnoqzNUx7HGiqbTMOw9d9xT8ZiFs+6ZFyQ=="], - - "@unrs/rspack-resolver-binding-wasm32-wasi": ["@unrs/rspack-resolver-binding-wasm32-wasi@1.1.2", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.7" }, "cpu": "none" }, "sha512-un6X/xInks+KEgGpIHFV8BdoODHRohaDRvOwtjq+FXuoI4Ga0P6sLRvf4rPSZDvoMnqUhZtVNG0jG9oxOnrrLQ=="], - - "@unrs/rspack-resolver-binding-win32-arm64-msvc": ["@unrs/rspack-resolver-binding-win32-arm64-msvc@1.1.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-2lCFkeT1HYUb/OOStBS1m67aZOf9BQxRA+Wf/xs94CGgzmoQt7H4V/BrkB/GSGKsudXjkiwt2oHNkHiowAS90A=="], - - "@unrs/rspack-resolver-binding-win32-x64-msvc": ["@unrs/rspack-resolver-binding-win32-x64-msvc@1.1.2", "", { "os": "win32", "cpu": "x64" }, "sha512-EYfya5HCQ/8Yfy7rvAAX2rGytu81+d/CIhNCbZfNKLQ690/qFsdEeTXRsMQW1afHoluMM50PsjPYu8ndy8fSQg=="], - "@vercel/nft": ["@vercel/nft@0.27.7", "", { "dependencies": { "@mapbox/node-pre-gyp": "^1.0.11", "@rollup/pluginutils": "^5.1.3", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "micromatch": "^4.0.8", "node-gyp-build": "^4.2.2", "resolve-from": "^5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-FG6H5YkP4bdw9Ll1qhmbxuE8KwW2E/g8fJpM183fWQLeVDGqzeywMIeJ9h2txdWZ03psgWMn6QymTxaDLmdwUg=="], "@web3-storage/car-block-validator": ["@web3-storage/car-block-validator@1.2.2", "", { "dependencies": { "@multiformats/blake2": "^2.0.2", "@multiformats/murmur3": "^2.1.8", "@multiformats/sha3": "^3.0.2", "multiformats": "^13.3.1", "uint8arrays": "^5.1.0" } }, "sha512-lR9l+ZszhTid5HfZE8ohnGf2RJp2kaBOnoejmsACs3iTNiy+3K09dnPm8MhgBE9RCIgPBKM0CCWXO9l+I6jrKA=="], @@ -1483,32 +1468,18 @@ "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], - - "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], - "array-differ": ["array-differ@3.0.0", "", {}, "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg=="], "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], "array-ify": ["array-ify@1.0.0", "", {}, "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng=="], - "array-includes": ["array-includes@3.1.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ=="], - "array-timsort": ["array-timsort@1.0.3", "", {}, "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ=="], "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], "array-uniq": ["array-uniq@1.0.3", "", {}, "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q=="], - "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], - - "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], - - "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], - - "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], - "arrify": ["arrify@2.0.1", "", {}, "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="], "ascii-table": ["ascii-table@0.0.9", "", {}, "sha512-xpkr6sCDIYTPqzvjG8M3ncw1YOTaloWZOyrUmicoEifBEKzQzt+ooUpRpQ/AbOoJfO/p2ZKiyp79qHThzJDulQ=="], @@ -1521,14 +1492,10 @@ "ast-module-types": ["ast-module-types@5.0.0", "", {}, "sha512-JvqziE0Wc0rXQfma0HZC/aY7URXHFuZV84fJRtP8u+lhp0JYCNd5wJzVXP45t0PH0Mej3ynlzvdyITYIu0G4LQ=="], - "ast-types-flow": ["ast-types-flow@0.0.7", "", {}, "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag=="], - "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], "async": ["async@1.5.2", "", {}, "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w=="], - "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], - "async-sema": ["async-sema@3.1.1", "", {}, "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg=="], "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], @@ -1539,20 +1506,14 @@ "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], - "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - "avvio": ["avvio@8.4.0", "", { "dependencies": { "@fastify/error": "^3.3.0", "fastq": "^1.17.1" } }, "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA=="], "aws-sign2": ["aws-sign2@0.7.0", "", {}, "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="], "aws4": ["aws4@1.13.2", "", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="], - "axe-core": ["axe-core@4.10.3", "", {}, "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg=="], - "axios": ["axios@1.8.3", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A=="], - "axobject-query": ["axobject-query@3.2.4", "", {}, "sha512-aPTElBrbifBU1krmZxGZOlBkslORe7Ll7+BDnI50Wy4LgOt69luMgevkDfTq1O/ZgprooPCtWpjCwKSZw/iZ4A=="], - "b4a": ["b4a@1.6.7", "", {}, "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="], "babel-jest": ["babel-jest@29.7.0", "", { "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg=="], @@ -1683,8 +1644,6 @@ "caching-transform": ["caching-transform@4.0.0", "", { "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", "package-hash": "^4.0.0", "write-file-atomic": "^3.0.0" } }, "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA=="], - "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], @@ -1975,8 +1934,6 @@ "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], - "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="], - "dargs": ["dargs@7.0.0", "", {}, "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg=="], "dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="], @@ -1985,12 +1942,6 @@ "data-urls": ["data-urls@3.0.2", "", { "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^11.0.0" } }, "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ=="], - "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], - - "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], - - "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], - "date-format": ["date-format@4.0.14", "", {}, "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg=="], "date-time": ["date-time@3.1.0", "", { "dependencies": { "time-zone": "^1.0.0" } }, "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg=="], @@ -2029,8 +1980,6 @@ "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], - "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], "default-browser": ["default-browser@4.0.0", "", { "dependencies": { "bundle-name": "^3.0.0", "default-browser-id": "^3.0.0", "execa": "^7.1.1", "titleize": "^3.0.0" } }, "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA=="], @@ -2117,8 +2066,6 @@ "docdash": ["docdash@1.2.0", "", {}, "sha512-IYZbgYthPTspgqYeciRJNPhSwL51yer7HAwDXhF5p+H7mTDbPvY3PCk/QDjNxdPCpWkaJVFC4t7iCNB/t9E5Kw=="], - "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], - "dom-converter": ["dom-converter@0.2.0", "", { "dependencies": { "utila": "~0.4" } }, "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA=="], "dom-serialize": ["dom-serialize@2.2.1", "", { "dependencies": { "custom-event": "~1.0.0", "ent": "~2.2.0", "extend": "^3.0.0", "void-elements": "^2.0.0" } }, "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ=="], @@ -2165,7 +2112,7 @@ "emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="], - "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], @@ -2203,8 +2150,6 @@ "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], - "es-abstract": ["es-abstract@1.23.9", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" } }, "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA=="], - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], @@ -2215,10 +2160,6 @@ "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], - "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], - - "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], - "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], "es6-promisify": ["es6-promisify@6.1.1", "", {}, "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg=="], @@ -2233,43 +2174,19 @@ "escape-latex": ["escape-latex@1.2.0", "", {}, "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw=="], - "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + "escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], - "eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="], - - "eslint-config-prettier": ["eslint-config-prettier@8.10.0", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg=="], - - "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], - - "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.9.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^1.3.0", "rspack-resolver": "^1.1.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.12" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-euxa5rTGqHeqVxmOHT25hpk58PxkQ4mNoX6Yun4ooGaCHAxOCojJYNvjmyeOQxj/LyW+3fulH0+xtk+p2kPPTw=="], - - "eslint-module-utils": ["eslint-module-utils@2.12.0", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg=="], - - "eslint-plugin-import": ["eslint-plugin-import@2.31.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A=="], - - "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.7.1", "", { "dependencies": { "@babel/runtime": "^7.20.7", "aria-query": "^5.1.3", "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "ast-types-flow": "^0.0.7", "axe-core": "^4.6.2", "axobject-query": "^3.1.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", "jsx-ast-utils": "^3.3.3", "language-tags": "=1.0.5", "minimatch": "^3.1.2", "object.entries": "^1.1.6", "object.fromentries": "^2.0.6", "semver": "^6.3.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA=="], - - "eslint-plugin-prettier": ["eslint-plugin-prettier@4.2.1", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0" }, "peerDependencies": { "eslint": ">=7.28.0", "prettier": ">=2.0.0" } }, "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ=="], - - "eslint-plugin-tsdoc": ["eslint-plugin-tsdoc@0.2.17", "", { "dependencies": { "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "0.16.2" } }, "sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA=="], - - "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], + "eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], - "eslint-visitor-keys": ["eslint-visitor-keys@2.1.0", "", {}, "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="], - - "eslint-webpack-plugin": ["eslint-webpack-plugin@4.2.0", "", { "dependencies": { "@types/eslint": "^8.56.10", "jest-worker": "^29.7.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "schema-utils": "^4.2.0" }, "peerDependencies": { "eslint": "^8.0.0 || ^9.0.0", "webpack": "^5.0.0" } }, "sha512-rsfpFQ01AWQbqtjgPRr2usVRxhWDuG0YDYcG8DJOteD3EFnpeuYuOwk0PQiN7PRBTqS6ElNdtPZPggj8If9WnA=="], - - "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], + "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], - "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], @@ -2331,8 +2248,6 @@ "fast-json-stringify": ["fast-json-stringify@5.16.1", "", { "dependencies": { "@fastify/merge-json-schemas": "^0.1.0", "ajv": "^8.10.0", "ajv-formats": "^3.0.1", "fast-deep-equal": "^3.1.3", "fast-uri": "^2.1.0", "json-schema-ref-resolver": "^1.0.1", "rfdc": "^1.2.0" } }, "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g=="], - "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - "fast-querystring": ["fast-querystring@1.1.2", "", { "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg=="], "fast-redact": ["fast-redact@3.5.0", "", {}, "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="], @@ -2367,7 +2282,7 @@ "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], - "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], + "file-entry-cache": ["file-entry-cache@7.0.2", "", { "dependencies": { "flat-cache": "^3.2.0" } }, "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g=="], "file-loader": ["file-loader@6.2.0", "", { "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw=="], @@ -2413,8 +2328,6 @@ "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], - "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], - "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], "forever-agent": ["forever-agent@0.6.1", "", {}, "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="], @@ -2455,10 +2368,6 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], - - "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], - "fuzzy": ["fuzzy@0.1.3", "", {}, "sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w=="], "gauge": ["gauge@3.0.2", "", { "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.1", "object-assign": "^4.1.1", "signal-exit": "^3.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.2" } }, "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q=="], @@ -2491,10 +2400,6 @@ "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], - "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], - - "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="], - "getpass": ["getpass@0.1.7", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng=="], "gh-release-fetch": ["gh-release-fetch@4.0.3", "", { "dependencies": { "@xhmikosr/downloader": "^13.0.0", "node-fetch": "^3.3.1", "semver": "^7.5.3" } }, "sha512-TOiP1nwLsH5shG85Yt6v6Kjq5JU/44jXyEpbcfPgmj3C829yeXIlx9nAEwQRaxtRF3SJinn2lz7XUkfG9W/U4g=="], @@ -2531,7 +2436,7 @@ "global-prefix": ["global-prefix@3.0.0", "", { "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", "which": "^1.3.1" } }, "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg=="], - "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], + "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], "globalthis": ["globalthis@1.0.3", "", { "dependencies": { "define-properties": "^1.1.3" } }, "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA=="], @@ -2547,8 +2452,6 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], - "guid-typescript": ["guid-typescript@1.0.9", "", {}, "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ=="], "gzip-size": ["gzip-size@6.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q=="], @@ -2567,18 +2470,12 @@ "hard-rejection": ["hard-rejection@2.1.0", "", {}, "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA=="], - "has": ["has@1.0.4", "", {}, "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ=="], - - "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "has-own-prop": ["has-own-prop@2.0.0", "", {}, "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ=="], "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], - "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], - "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], @@ -2691,8 +2588,6 @@ "interface-store": ["interface-store@6.0.2", "", {}, "sha512-KSFCXtBlNoG0hzwNa0RmhHtrdhzexp+S+UY2s0rWTBJyfdEIgn6i6Zl9otVqrcFYbYrneBT7hbmHQ8gE0C3umA=="], - "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], - "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], "interpret": ["interpret@3.1.1", "", {}, "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ=="], @@ -2713,46 +2608,26 @@ "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], - "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], - "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], - "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], - - "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], - "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], - "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], - "is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="], "is-builtin-module": ["is-builtin-module@3.2.1", "", { "dependencies": { "builtin-modules": "^3.3.0" } }, "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A=="], - "is-bun-module": ["is-bun-module@1.3.0", "", { "dependencies": { "semver": "^7.6.3" } }, "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA=="], - - "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], - "is-ci": ["is-ci@3.0.1", "", { "dependencies": { "ci-info": "^3.2.0" }, "bin": { "is-ci": "bin.js" } }, "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ=="], "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], - "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], - - "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], - "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], - "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], "is-generator-fn": ["is-generator-fn@2.1.0", "", {}, "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="], - "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], "is-in-ci": ["is-in-ci@1.0.0", "", { "bin": { "is-in-ci": "cli.js" } }, "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg=="], @@ -2765,8 +2640,6 @@ "is-lambda": ["is-lambda@1.0.1", "", {}, "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="], - "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], - "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], "is-natural-number": ["is-natural-number@4.0.1", "", {}, "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ=="], @@ -2777,15 +2650,13 @@ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], - "is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], "is-path-cwd": ["is-path-cwd@2.2.0", "", {}, "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ=="], "is-path-in-cwd": ["is-path-in-cwd@2.1.0", "", { "dependencies": { "is-path-inside": "^2.1.0" } }, "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ=="], - "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], + "is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], "is-plain-obj": ["is-plain-obj@2.1.0", "", {}, "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="], @@ -2795,22 +2666,12 @@ "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], - "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], - - "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], - "is-ssh": ["is-ssh@1.4.1", "", { "dependencies": { "protocols": "^2.0.1" } }, "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg=="], "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], - "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], - - "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], - "is-text-path": ["is-text-path@1.0.1", "", { "dependencies": { "text-extensions": "^1.0.0" } }, "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w=="], - "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], - "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], @@ -2819,12 +2680,6 @@ "is-url-superb": ["is-url-superb@4.0.0", "", {}, "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA=="], - "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], - - "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], - - "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], - "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], @@ -2945,7 +2800,7 @@ "jest-watcher": ["jest-watcher@29.7.0", "", { "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" } }, "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g=="], - "jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], @@ -2983,8 +2838,6 @@ "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], - "json-stringify-nice": ["json-stringify-nice@1.1.4", "", {}, "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw=="], "json-stringify-pretty-compact": ["json-stringify-pretty-compact@2.0.0", "", {}, "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ=="], @@ -3005,8 +2858,6 @@ "jsprim": ["jsprim@1.4.2", "", { "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.4.0", "verror": "1.10.0" } }, "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw=="], - "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], - "junk": ["junk@4.0.1", "", {}, "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ=="], "just-diff": ["just-diff@6.0.2", "", {}, "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA=="], @@ -3055,10 +2906,6 @@ "lambda-local": ["lambda-local@2.2.0", "", { "dependencies": { "commander": "^10.0.1", "dotenv": "^16.3.1", "winston": "^3.10.0" }, "bin": { "lambda-local": "build/cli.js" } }, "sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg=="], - "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="], - - "language-tags": ["language-tags@1.0.5", "", { "dependencies": { "language-subtag-registry": "~0.3.2" } }, "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ=="], - "latest-version": ["latest-version@9.0.0", "", { "dependencies": { "package-json": "^10.0.0" } }, "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA=="], "launch-editor": ["launch-editor@2.10.0", "", { "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" } }, "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA=="], @@ -3075,8 +2922,6 @@ "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], - "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], - "libnpmaccess": ["libnpmaccess@8.0.6", "", { "dependencies": { "npm-package-arg": "^11.0.2", "npm-registry-fetch": "^17.0.1" } }, "sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw=="], "libnpmpublish": ["libnpmpublish@9.0.9", "", { "dependencies": { "ci-info": "^4.0.0", "normalize-package-data": "^6.0.1", "npm-package-arg": "^11.0.2", "npm-registry-fetch": "^17.0.1", "proc-log": "^4.2.0", "semver": "^7.3.7", "sigstore": "^2.2.0", "ssri": "^10.0.6" } }, "sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg=="], @@ -3135,8 +2980,6 @@ "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="], "lodash.transform": ["lodash.transform@4.6.0", "", {}, "sha512-LO37ZnhmBVx0GvOU/caQuipEh4GN82TcWv3yHlebGDgOxbxiwwzW5Pcx2AcvpIv2WmvmSMoC492yQFNhy/l/UQ=="], @@ -3249,7 +3092,7 @@ "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], - "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "micromatch": ["micromatch@4.0.5", "", { "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA=="], "mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], @@ -3429,16 +3272,6 @@ "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], - "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], - - "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], - - "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], - - "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], - - "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], - "obuf": ["obuf@1.1.2", "", {}, "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="], "ofetch": ["ofetch@1.4.1", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", "ufo": "^1.5.4" } }, "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw=="], @@ -3473,15 +3306,15 @@ "opener": ["opener@1.5.2", "", { "bin": { "opener": "bin/opener-bin.js" } }, "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A=="], - "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - "ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="], "os-name": ["os-name@5.1.0", "", { "dependencies": { "macos-release": "^3.1.0", "windows-release": "^5.0.1" } }, "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ=="], "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], - "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + "oxc-parser": ["oxc-parser@0.74.0", "", { "dependencies": { "@oxc-project/types": "^0.74.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm64": "0.74.0", "@oxc-parser/binding-darwin-arm64": "0.74.0", "@oxc-parser/binding-darwin-x64": "0.74.0", "@oxc-parser/binding-freebsd-x64": "0.74.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.74.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.74.0", "@oxc-parser/binding-linux-arm64-gnu": "0.74.0", "@oxc-parser/binding-linux-arm64-musl": "0.74.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.74.0", "@oxc-parser/binding-linux-s390x-gnu": "0.74.0", "@oxc-parser/binding-linux-x64-gnu": "0.74.0", "@oxc-parser/binding-linux-x64-musl": "0.74.0", "@oxc-parser/binding-wasm32-wasi": "0.74.0", "@oxc-parser/binding-win32-arm64-msvc": "0.74.0", "@oxc-parser/binding-win32-x64-msvc": "0.74.0" } }, "sha512-2tDN/ttU8WE6oFh8EzKNam7KE7ZXSG5uXmvX85iNzxdJfMssDWcj3gpYzZi1E04XuE7m3v1dVWl/8BE886vPGw=="], + + "oxlint": ["oxlint@1.9.0", "", { "optionalDependencies": { "@oxlint/darwin-arm64": "1.9.0", "@oxlint/darwin-x64": "1.9.0", "@oxlint/linux-arm64-gnu": "1.9.0", "@oxlint/linux-arm64-musl": "1.9.0", "@oxlint/linux-x64-gnu": "1.9.0", "@oxlint/linux-x64-musl": "1.9.0", "@oxlint/win32-arm64": "1.9.0", "@oxlint/win32-x64": "1.9.0" }, "bin": { "oxlint": "bin/oxlint", "oxc_language_server": "bin/oxc_language_server" } }, "sha512-vvqpkRt7UA1F1DoOJGYO2+T52L6jV4RxS+9hFVCPQ0X+hcNVtbl/TxQuwjobBw8Yw2U8Rb9d8VLJxa8eRSqpQQ=="], "p-cancelable": ["p-cancelable@3.0.0", "", {}, "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="], @@ -3619,8 +3452,6 @@ "playwright-test-coverage": ["playwright-test-coverage@1.2.12", "", { "peerDependencies": { "@playwright/test": "^1.14.1" } }, "sha512-WdR3shV+7IWtlB1AZcXSysUyZmyAqXM9+DT3iBSS1p4SkJoWZslkTqk04l5ZExSkuaM+5fKl0M9TyUuJWuGgLA=="], - "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], "postcss-attribute-case-insensitive": ["postcss-attribute-case-insensitive@6.0.3", "", { "dependencies": { "postcss-selector-parser": "^6.0.13" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ=="], @@ -3759,12 +3590,8 @@ "precond": ["precond@0.2.3", "", {}, "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ=="], - "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], - "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], - "pretty-error": ["pretty-error@4.0.0", "", { "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" } }, "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw=="], "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], @@ -3895,8 +3722,6 @@ "redent": ["redent@4.0.0", "", { "dependencies": { "indent-string": "^5.0.0", "strip-indent": "^4.0.0" } }, "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag=="], - "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], - "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.0", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA=="], @@ -3911,8 +3736,6 @@ "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], - "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], - "regexpu-core": ["regexpu-core@6.2.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA=="], "registry-auth-token": ["registry-auth-token@5.1.0", "", { "dependencies": { "@pnpm/npm-conf": "^2.1.0" } }, "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw=="], @@ -3957,8 +3780,6 @@ "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - "resolve-protobuf-schema": ["resolve-protobuf-schema@2.1.0", "", { "dependencies": { "protocol-buffers-schema": "^3.3.1" } }, "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ=="], "resolve.exports": ["resolve.exports@2.0.3", "", {}, "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A=="], @@ -3979,8 +3800,6 @@ "rollup": ["rollup@3.29.5", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w=="], - "rspack-resolver": ["rspack-resolver@1.1.2", "", { "optionalDependencies": { "@unrs/rspack-resolver-binding-darwin-arm64": "1.1.2", "@unrs/rspack-resolver-binding-darwin-x64": "1.1.2", "@unrs/rspack-resolver-binding-freebsd-x64": "1.1.2", "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": "1.1.2", "@unrs/rspack-resolver-binding-linux-arm64-gnu": "1.1.2", "@unrs/rspack-resolver-binding-linux-arm64-musl": "1.1.2", "@unrs/rspack-resolver-binding-linux-x64-gnu": "1.1.2", "@unrs/rspack-resolver-binding-linux-x64-musl": "1.1.2", "@unrs/rspack-resolver-binding-wasm32-wasi": "1.1.2", "@unrs/rspack-resolver-binding-win32-arm64-msvc": "1.1.2", "@unrs/rspack-resolver-binding-win32-x64-msvc": "1.1.2" } }, "sha512-eHhz+9JWHFdbl/CVVqEP6kviLFZqw1s0MWxLdsGMtUKUspSO3SERptPohmrUIC9jT1bGV9Bd3+r8AmWbdfNAzQ=="], - "run-applescript": ["run-applescript@5.0.0", "", { "dependencies": { "execa": "^5.0.0" } }, "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg=="], "run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="], @@ -3993,14 +3812,10 @@ "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], - "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], "safe-json-stringify": ["safe-json-stringify@1.2.0", "", {}, "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg=="], - "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], - "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], "safe-regex2": ["safe-regex2@3.1.0", "", { "dependencies": { "ret": "~0.4.0" } }, "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug=="], @@ -4039,12 +3854,6 @@ "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], - "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], - - "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], - - "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], - "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], @@ -4157,8 +3966,6 @@ "ssri": ["ssri@10.0.6", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ=="], - "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="], - "stack-generator": ["stack-generator@2.0.10", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ=="], "stack-trace": ["stack-trace@0.0.10", "", {}, "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="], @@ -4187,12 +3994,6 @@ "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], - - "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], - - "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], - "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], @@ -4203,7 +4004,7 @@ "strip-ansi-control-characters": ["strip-ansi-control-characters@2.0.0", "", {}, "sha512-Q0/k5orrVGeaOlIOUn1gybGU0IcAbgHQT1faLo5hik4DqClKVSaka5xOhNNoRgtfztHVxCYxi7j71mrWom0bIw=="], - "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + "strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], "strip-dirs": ["strip-dirs@2.1.0", "", { "dependencies": { "is-natural-number": "^4.0.1" } }, "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g=="], @@ -4277,8 +4078,6 @@ "text-hex": ["text-hex@1.0.0", "", {}, "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="], - "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], - "thingies": ["thingies@1.21.0", "", { "peerDependencies": { "tslib": "^2" } }, "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g=="], "thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="], @@ -4297,8 +4096,6 @@ "tiny-emitter": ["tiny-emitter@2.1.0", "", {}, "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="], - "tinyglobby": ["tinyglobby@0.2.12", "", { "dependencies": { "fdir": "^6.4.3", "picomatch": "^4.0.2" } }, "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww=="], - "titleize": ["titleize@3.0.0", "", {}, "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ=="], "tmp": ["tmp@0.2.3", "", {}, "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w=="], @@ -4341,13 +4138,11 @@ "triple-beam": ["triple-beam@1.4.1", "", {}, "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg=="], - "ts-api-utils": ["ts-api-utils@2.0.1", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w=="], - "ts-loader": ["ts-loader@9.5.1", "", { "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4", "source-map": "^0.7.4" }, "peerDependencies": { "typescript": "*", "webpack": "^5.0.0" } }, "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg=="], "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="], - "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -4359,22 +4154,12 @@ "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], - "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], - "type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], + "type-fest": ["type-fest@0.6.0", "", {}, "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="], "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], - "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], - - "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], - - "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], - - "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], - "typed-function": ["typed-function@4.2.1", "", {}, "sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA=="], "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], @@ -4403,8 +4188,6 @@ "ulid": ["ulid@2.3.0", "", { "bin": { "ulid": "./bin/cli.js" } }, "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw=="], - "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], - "unbzip2-stream": ["unbzip2-stream@1.4.3", "", { "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" } }, "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg=="], "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], @@ -4557,16 +4340,8 @@ "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], - "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], - - "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], - - "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], - "which-module": ["which-module@2.0.1", "", {}, "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="], - "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], - "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], "widest-line": ["widest-line@4.0.1", "", { "dependencies": { "string-width": "^5.0.1" } }, "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig=="], @@ -4579,8 +4354,6 @@ "winston-transport": ["winston-transport@4.9.0", "", { "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" } }, "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A=="], - "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], "worker-loader": ["worker-loader@3.0.8", "", { "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g=="], @@ -4653,24 +4426,18 @@ "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/eslint-parser/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/plugin-transform-classes/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], - "@babel/plugin-transform-runtime/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/runtime-corejs2/core-js": ["core-js@2.6.12", "", {}, "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="], - "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], - "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], "@csstools/css-color-parser/@csstools/color-helpers": ["@csstools/color-helpers@4.2.1", "", {}, "sha512-CEypeeykO9AN7JWkr1OEOQb0HRzZlPWGwV0Ya6DuVgFdDi6g3ma/cPZ5ZPZM4AWQikDpq/0llnGGlIL+j8afzw=="], @@ -4679,22 +4446,12 @@ "@csstools/postcss-is-pseudo-class/@csstools/selector-specificity": ["@csstools/selector-specificity@2.2.0", "", { "peerDependencies": { "postcss-selector-parser": "^6.0.10" } }, "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw=="], - "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@eslint/eslintrc/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - - "@eslint/eslintrc/js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], - - "@eslint/eslintrc/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "@fastify/ajv-compiler/ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], "@fastify/ajv-compiler/fast-uri": ["fast-uri@2.4.0", "", {}, "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA=="], "@fastify/send/mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], - "@humanwhocodes/config-array/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], @@ -4709,10 +4466,16 @@ "@jest/core/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + "@jest/core/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "@jest/reporters/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "@jest/reporters/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + "@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="], + "@jest/transform/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "@jest/transform/write-file-atomic": ["write-file-atomic@4.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } }, "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg=="], "@jsdevtools/coverage-istanbul-loader/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], @@ -4831,8 +4594,6 @@ "@netlify/edge-bundler/get-port": ["get-port@6.1.2", "", {}, "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw=="], - "@netlify/edge-bundler/is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], - "@netlify/edge-bundler/jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], "@netlify/edge-bundler/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], @@ -4851,6 +4612,8 @@ "@netlify/git-utils/execa": ["execa@6.1.0", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", "human-signals": "^3.0.1", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^3.0.7", "strip-final-newline": "^3.0.0" } }, "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA=="], + "@netlify/git-utils/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "@netlify/git-utils/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], "@netlify/headers-parser/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], @@ -4875,8 +4638,6 @@ "@netlify/zip-it-and-ship-it/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], - "@netlify/zip-it-and-ship-it/is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], - "@netlify/zip-it-and-ship-it/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], "@netlify/zip-it-and-ship-it/p-map": ["p-map@5.5.0", "", { "dependencies": { "aggregate-error": "^4.0.0" } }, "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg=="], @@ -4885,8 +4646,6 @@ "@netlify/zip-it-and-ship-it/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], - "@nicolo-ribaudo/eslint-scope-5-internals/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], - "@npmcli/agent/http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], "@npmcli/agent/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], @@ -4915,8 +4674,14 @@ "@nx/devkit/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], + "@oxc-parser/binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], + "@parcel/watcher/detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + "@parcel/watcher/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "@parcel/watcher-wasm/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "@parcel/watcher-wasm/napi-wasm": ["napi-wasm@1.1.3", "", { "bundled": true }, "sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg=="], "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], @@ -4945,14 +4710,12 @@ "@types/express/@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.6", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A=="], - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], - - "@unrs/rspack-resolver-binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.7", "", { "dependencies": { "@emnapi/core": "^1.3.1", "@emnapi/runtime": "^1.3.1", "@tybys/wasm-util": "^0.9.0" } }, "sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw=="], + "@typescript-eslint/typescript-estree/globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], "@vercel/nft/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "@vercel/nft/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "@xhmikosr/decompress/strip-dirs": ["strip-dirs@3.0.0", "", { "dependencies": { "inspect-with-kind": "^1.0.5", "is-plain-obj": "^1.1.0" } }, "sha512-I0sdgcFTfKQlUPZyAqPJmSG3HLO9rWDFnxonnIbskYNM3DwFOeTNB5KzVq3dA1GdRAc/25b5Y7UO2TQfKWw4aQ=="], "@xhmikosr/decompress-tar/tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], @@ -5091,6 +4854,8 @@ "cpy/cp-file": ["cp-file@9.1.0", "", { "dependencies": { "graceful-fs": "^4.1.2", "make-dir": "^3.0.0", "nested-error-stacks": "^2.0.0", "p-event": "^4.1.0" } }, "sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA=="], + "cpy/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "cpy/p-filter": ["p-filter@3.0.0", "", { "dependencies": { "p-map": "^5.1.0" } }, "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg=="], "cpy/p-map": ["p-map@5.5.0", "", { "dependencies": { "aggregate-error": "^4.0.0" } }, "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg=="], @@ -5141,8 +4906,6 @@ "default-gateway/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], - "default-require-extensions/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], - "del/globby": ["globby@6.1.0", "", { "dependencies": { "array-union": "^1.0.1", "glob": "^7.0.3", "object-assign": "^4.0.1", "pify": "^2.0.0", "pinkie-promise": "^2.0.0" } }, "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw=="], "del/p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="], @@ -5151,8 +4914,6 @@ "del/rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], - "detective-typescript/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA=="], - "detective-typescript/typescript": ["typescript@5.7.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg=="], "dicom-microscopy-viewer/dcmjs": ["dcmjs@0.29.13", "", { "dependencies": { "@babel/runtime-corejs3": "^7.22.5", "adm-zip": "^0.5.10", "gl-matrix": "^3.1.0", "lodash.clonedeep": "^4.5.0", "loglevelnext": "^3.0.1", "ndarray": "^1.0.19", "pako": "^2.0.4" } }, "sha512-Bf9tKzJNWqk4kbV210N5TLEHDqaZvO3S+MH9vezFAU8WKcG4cR6z4/II3TQVqhLI185eNUL+lhfPCVH1Uu2yTA=="], @@ -5175,39 +4936,9 @@ "ent/punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], - "es-abstract/globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + "escodegen/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], - "eslint/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - - "eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "eslint/js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], - - "eslint/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-plugin-import/doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], - - "eslint-plugin-import/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "eslint-plugin-jsx-a11y/@babel/runtime": ["@babel/runtime@7.21.5", "", { "dependencies": { "regenerator-runtime": "^0.13.11" } }, "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q=="], - - "eslint-plugin-jsx-a11y/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "eslint-plugin-jsx-a11y/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "eslint-plugin-tsdoc/@microsoft/tsdoc": ["@microsoft/tsdoc@0.14.2", "", {}, "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug=="], - - "eslint-plugin-tsdoc/@microsoft/tsdoc-config": ["@microsoft/tsdoc-config@0.16.2", "", { "dependencies": { "@microsoft/tsdoc": "0.14.2", "ajv": "~6.12.6", "jju": "~1.4.0", "resolve": "~1.19.0" } }, "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw=="], - - "espree/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], "express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], @@ -5223,6 +4954,8 @@ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "fast-glob/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "fast-json-stringify/fast-uri": ["fast-uri@2.4.0", "", {}, "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA=="], "fetch-node-website/colors-option": ["colors-option@4.5.0", "", { "dependencies": { "chalk": "^5.0.1", "is-plain-obj": "^4.1.0" } }, "sha512-Soe5lerRg3erMRgYC0EC696/8dMCGpBzcQchFfi55Yrkja8F+P7cUt0LVTIg7u5ob5BexLZ/F1kO+ejmv+nq8w=="], @@ -5295,6 +5028,8 @@ "http-proxy-middleware/is-plain-obj": ["is-plain-obj@3.0.0", "", {}, "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA=="], + "http-proxy-middleware/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "http2-wrapper/quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], "ignore-walk/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], @@ -5317,8 +5052,6 @@ "is-ci/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], - "is-installed-globally/is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], - "is-path-in-cwd/is-path-inside": ["is-path-inside@2.1.0", "", { "dependencies": { "path-is-inside": "^1.0.2" } }, "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg=="], "istanbul-lib-processinfo/p-map": ["p-map@3.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ=="], @@ -5345,14 +5078,22 @@ "jest-config/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "jest-config/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "jest-haste-map/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + + "jest-haste-map/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "jest-junit/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "jest-message-util/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "jest-runner/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + "jest-runner/source-map-support": ["source-map-support@0.5.13", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w=="], "jest-runtime/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - "jest-runtime/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], - "jest-util/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], "jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], @@ -5361,8 +5102,6 @@ "jest-watcher/ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], - "jsdoc/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], - "jsdom/form-data": ["form-data@4.0.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w=="], "jsdom/https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], @@ -5423,8 +5162,6 @@ "lint-staged/lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="], - "lint-staged/micromatch": ["micromatch@4.0.5", "", { "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA=="], - "listhen/jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], "listr2/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], @@ -5433,10 +5170,6 @@ "listr2/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - "load-json-file/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], - - "load-json-file/type-fest": ["type-fest@0.6.0", "", {}, "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="], - "log-process-errors/figures": ["figures@4.0.1", "", { "dependencies": { "escape-string-regexp": "^5.0.0", "is-unicode-supported": "^1.2.0" } }, "sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w=="], "log-process-errors/filter-obj": ["filter-obj@3.0.0", "", {}, "sha512-oQZM+QmVni8MsYzcq9lgTHD/qeLqaG8XaOPOW7dzuSafVxSUlH1+1ZDefj2OD9f2XsmG5lFl2Euc9NI4jgwFWg=="], @@ -5483,6 +5216,8 @@ "mlly/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "mocha/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + "mocha/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], "mocha/js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], @@ -5559,8 +5294,6 @@ "nx/ora": ["ora@5.3.0", "", { "dependencies": { "bl": "^4.0.3", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "log-symbols": "^4.0.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g=="], - "nx/tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="], - "nx/yaml": ["yaml@2.7.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="], "nyc/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], @@ -5663,10 +5396,6 @@ "run-applescript/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], - "safe-array-concat/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - - "safe-push-apply/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - "schema-utils/ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], "seek-bzip/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], @@ -5721,26 +5450,20 @@ "spdy-transport/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], - "stream-browserify/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], "streamroller/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], - "string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "stylelint/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], - "stylelint/file-entry-cache": ["file-entry-cache@7.0.2", "", { "dependencies": { "flat-cache": "^3.2.0" } }, "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g=="], - "stylelint/globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], "stylelint/meow": ["meow@10.1.5", "", { "dependencies": { "@types/minimist": "^1.2.2", "camelcase-keys": "^7.0.0", "decamelize": "^5.0.0", "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", "normalize-package-data": "^3.0.2", "read-pkg-up": "^8.0.0", "redent": "^4.0.0", "trim-newlines": "^4.0.2", "type-fest": "^1.2.2", "yargs-parser": "^20.2.9" } }, "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw=="], + "stylelint/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "supports-hyperlinks/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "svgo/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], @@ -5771,8 +5494,6 @@ "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - "terser-webpack-plugin/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], - "test-exclude/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], "test-exclude/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], @@ -5783,11 +5504,13 @@ "trim-repeated/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + "ts-loader/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "ts-loader/source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], "ts-node/diff": ["diff@4.0.2", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="], - "tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + "tsconfig-paths/strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], "tsutils/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], @@ -5821,12 +5544,12 @@ "wait-port/commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], - "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], - "webpack/schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="], "webpack-bundle-analyzer/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + "webpack-bundle-analyzer/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + "webpack-bundle-analyzer/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], "webpack-dev-server/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], @@ -5837,8 +5560,6 @@ "which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - "widest-line/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "windows-release/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], @@ -5881,9 +5602,7 @@ "zip-stream/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], - "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], @@ -5899,10 +5618,14 @@ "@jest/core/ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + "@jest/core/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "@jest/reporters/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "@jest/transform/babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], + "@jest/transform/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "@jsdevtools/coverage-istanbul-loader/istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@jsdevtools/coverage-istanbul-loader/schema-utils/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], @@ -5959,6 +5682,8 @@ "@netlify/build/pkg-dir/find-up": ["find-up@6.3.0", "", { "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" } }, "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw=="], + "@netlify/build/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "@netlify/build/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], "@netlify/config/dot-prop/type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], @@ -5991,8 +5716,6 @@ "@netlify/functions-utils/@netlify/zip-it-and-ship-it/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], - "@netlify/functions-utils/@netlify/zip-it-and-ship-it/is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], - "@netlify/functions-utils/@netlify/zip-it-and-ship-it/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], "@netlify/functions-utils/@netlify/zip-it-and-ship-it/p-map": ["p-map@7.0.2", "", {}, "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q=="], @@ -6001,6 +5724,8 @@ "@netlify/git-utils/execa/human-signals": ["human-signals@3.0.1", "", {}, "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ=="], + "@netlify/git-utils/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "@netlify/run-utils/execa/human-signals": ["human-signals@3.0.1", "", {}, "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ=="], "@netlify/zip-it-and-ship-it/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.19.11", "", { "os": "aix", "cpu": "ppc64" }, "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g=="], @@ -6057,14 +5782,22 @@ "@netlify/zip-it-and-ship-it/p-map/aggregate-error": ["aggregate-error@4.0.1", "", { "dependencies": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" } }, "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w=="], - "@nicolo-ribaudo/eslint-scope-5-internals/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], - "@npmcli/arborist/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], "@npmcli/map-workspaces/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], "@nx/devkit/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "@oxc-parser/binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/core": ["@emnapi/core@1.4.5", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.4", "tslib": "^2.4.0" } }, "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q=="], + + "@oxc-parser/binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/runtime": ["@emnapi/runtime@1.4.5", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg=="], + + "@oxc-parser/binding-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], + + "@parcel/watcher-wasm/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "@parcel/watcher/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "@rspack/cli/webpack-bundle-analyzer/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], "@rspack/cli/webpack-bundle-analyzer/sirv": ["sirv@1.0.19", "", { "dependencies": { "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", "totalist": "^1.0.0" } }, "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ=="], @@ -6083,10 +5816,10 @@ "@tufjs/models/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - "@vercel/nft/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "@vercel/nft/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "@xhmikosr/decompress/strip-dirs/is-plain-obj": ["is-plain-obj@1.1.0", "", {}, "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg=="], "archiver-utils/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], @@ -6107,6 +5840,8 @@ "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "boxen/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "boxen/string-width/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], "boxen/wrap-ansi/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], @@ -6115,6 +5850,8 @@ "cli-truncate/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="], + "cli-truncate/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "cli-truncate/string-width/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], "clipboardy/execa/get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], @@ -6197,6 +5934,8 @@ "cpy/cp-file/p-event": ["p-event@4.2.0", "", { "dependencies": { "p-timeout": "^3.1.0" } }, "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ=="], + "cpy/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "cpy/p-map/aggregate-error": ["aggregate-error@4.0.1", "", { "dependencies": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" } }, "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w=="], "crc32-stream/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], @@ -6227,24 +5966,10 @@ "del/rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - "detective-typescript/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@5.62.0", "", {}, "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ=="], - - "detective-typescript/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } }, "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw=="], - - "detective-typescript/@typescript-eslint/typescript-estree/globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], - - "eslint-plugin-jsx-a11y/@babel/runtime/regenerator-runtime": ["regenerator-runtime@0.13.11", "", {}, "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="], - - "eslint-plugin-tsdoc/@microsoft/tsdoc-config/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - - "eslint-plugin-tsdoc/@microsoft/tsdoc-config/resolve": ["resolve@1.19.0", "", { "dependencies": { "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg=="], - - "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "eslint/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "fast-glob/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "fetch-node-website/colors-option/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="], "fetch-node-website/figures/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], @@ -6307,6 +6032,8 @@ "har-validator/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "http-proxy-middleware/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "ignore-walk/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], "inquirer-autocomplete-prompt/ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], @@ -6335,6 +6062,12 @@ "jest-config/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "jest-config/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "jest-haste-map/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "jest-message-util/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "jest-runtime/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "jest-watcher/ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], @@ -6373,8 +6106,6 @@ "lint-staged/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], - "lint-staged/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "listr2/log-update/ansi-escapes": ["ansi-escapes@5.0.0", "", { "dependencies": { "type-fest": "^1.0.2" } }, "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA=="], "listr2/log-update/cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="], @@ -6531,6 +6262,8 @@ "read-pkg/load-json-file/pify": ["pify@3.0.0", "", {}, "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg=="], + "read-pkg/load-json-file/strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + "read-pkg/normalize-package-data/hosted-git-info": ["hosted-git-info@2.8.9", "", {}, "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="], "read-pkg/normalize-package-data/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], @@ -6603,6 +6336,8 @@ "stylelint/meow/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], + "stylelint/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "svgo/css-select/domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], "svgo/css-select/domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], @@ -6639,6 +6374,8 @@ "through2-map/through2/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "ts-loader/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "typedoc/markdown-it/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "typedoc/markdown-it/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], @@ -6673,12 +6410,12 @@ "webpack-dev-server/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], - "webpack/schema-utils/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "webpack/schema-utils/ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], + "widest-line/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "widest-line/string-width/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], "windows-release/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], @@ -6787,6 +6524,8 @@ "@nx/devkit/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "@oxc-parser/binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.4", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g=="], + "@rspack/cli/webpack-bundle-analyzer/sirv/mrmime": ["mrmime@1.0.1", "", {}, "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw=="], "@rspack/cli/webpack-bundle-analyzer/sirv/totalist": ["totalist@1.1.0", "", {}, "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g=="], @@ -6797,8 +6536,6 @@ "@tufjs/models/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "babel-jest/babel-plugin-istanbul/istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "boxen/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], @@ -6881,10 +6618,6 @@ "del/rimraf/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "detective-typescript/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "eslint-plugin-tsdoc/@microsoft/tsdoc-config/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "file-loader/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "filelist/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], @@ -6957,6 +6690,8 @@ "listr2/log-update/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + "listr2/wrap-ansi/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "listr2/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], "log-process-errors/jest-validate/@jest/types/@types/yargs": ["@types/yargs@16.0.9", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA=="], diff --git a/package.json b/package.json index 958c3f1ae7..0b9ac9c1b8 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "docs:watch": "npx lerna run docs:watch", "preinstall": "node preinstall.js", "prepare": "husky", + "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,css,md}\"", "commit:prepare": "yarn test:ci && yarn test:unit", "start": "yarn run dev", "test:e2e:coverage": "nyc --reporter=html yarn run test:e2e:ci", @@ -56,12 +57,12 @@ "test:unit": "jest --collectCoverage", "test:debug": "karma start ./karma.conf.js --browsers Chrome --no-single-run", "lint-staged": "lint-staged", - "lint": "eslint --quiet -c .eslintrc.json packages/**/src", + "lint": "oxlint packages/**/src --quiet", "webpack:watch": "npx lerna run webpack:watch" }, "devDependencies": { + "@prettier/plugin-oxc": "^0.0.4", "@babel/core": "^7.21.8", - "@babel/eslint-parser": "^7.19.1", "@babel/plugin-external-helpers": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.14.7", @@ -91,8 +92,6 @@ "@types/node": "^20.14.8", "@types/react": "^17.0.58", "@types/react-dom": "^17.0.20", - "@typescript-eslint/eslint-plugin": "^8.1.0", - "@typescript-eslint/parser": "^8.1.0", "@webgpu/types": "^0.1.40", "acorn": "^8.8.2", "acorn-jsx": "^5.3.2", @@ -114,21 +113,14 @@ "cssnano": "^6.0.1", "docdash": "^1.2.0", "dpdm": "^3.14.0", - "eslint": "^8.39.0", - "eslint-config-prettier": "8.10.0", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsx-a11y": "6.7.1", - "eslint-plugin-prettier": "4.2.1", - "eslint-plugin-tsdoc": "^0.2.17", - "eslint-webpack-plugin": "^4.0.1", + "oxlint": "^1.9.0", "execa": "^7.2.0", "exports-loader": "^3.0.0", "file-loader": "^6.2.0", "follow-redirects": "^1.15.2", "fs-extra": "^10.0.0", "html-webpack-plugin": "^5.5.1", - "husky": "^9.1.4", + "husky": "^9.1.7", "jasmine": "^4.6.0", "jest": "^29.7.0", "jest-canvas-mock": "^2.5.2", @@ -184,7 +176,7 @@ }, "lint-staged": { "packages/**/*.{ts,js,jsx,tsx,json,md,css}": [ - "eslint --fix", + "oxlint", "prettier --write" ] }, diff --git a/packages/adapters/README.md b/packages/adapters/README.md index adbaa45389..600906fa00 100644 --- a/packages/adapters/README.md +++ b/packages/adapters/README.md @@ -8,26 +8,26 @@ # History -- 2014 - - [DCMTK](dcmtk.org) cross compiled to javascript at [CTK Hackfest](http://www.commontk.org/index.php/CTK-Hackfest-May-2014). While this was useful and powerful, it was heavyweight for typical web usage. -- 2016 - - A [Medical Imaging Web Appliction meeting at Stanford](http://qiicr.org/web/outreach/Medical-Imaging-Web-Apps/) and [follow-on hackfest in Boston](http://qiicr.org/web/outreach/MIWS-hackfest/) helped elaborate the needs for manipulating DICOM in pure Javascript. - - Based on [DICOM Part 10 read/write code](https://github.com/OHIF/dicom-dimse) initiated by Weiwei Wu of [OHIF](http://ohif.org), Steve Pieper [developed further features](https://github.com/pieper/sites/tree/gh-pages/dcmio) and [examples of creating multiframe and segmentation objects](https://github.com/pieper/sites/tree/gh-pages/DICOMzero) discussed with the community at RSNA -- 2017 - - At [NA-MIC Project Week 25](https://na-mic.org/wiki/Project_Week_25) Erik Ziegler and Steve Pieper [worked](https://na-mic.org/wiki/Project_Week_25/DICOM_Segmentation_Support_for_Cornerstone_and_OHIF_Viewer) - with the community to define some example use cases to mix the pure JavaScript DICOM code with Cornerstone and [CornerstoneTools](https://github.com/chafey/cornerstoneTools). -- 2018-2022 - - Work continues to develop SR and SEG support to [OHIFViewer](http://ohif.org) allow interoperability with [DICOM4QI](https://legacy.gitbook.com/book/qiicr/dicom4qi/details) -- 2023 - - Moved the adapters into cornerstone3D from dcmjsj +- 2014 + - [DCMTK](dcmtk.org) cross compiled to javascript at [CTK Hackfest](http://www.commontk.org/index.php/CTK-Hackfest-May-2014). While this was useful and powerful, it was heavyweight for typical web usage. +- 2016 + - A [Medical Imaging Web Appliction meeting at Stanford](http://qiicr.org/web/outreach/Medical-Imaging-Web-Apps/) and [follow-on hackfest in Boston](http://qiicr.org/web/outreach/MIWS-hackfest/) helped elaborate the needs for manipulating DICOM in pure Javascript. + - Based on [DICOM Part 10 read/write code](https://github.com/OHIF/dicom-dimse) initiated by Weiwei Wu of [OHIF](http://ohif.org), Steve Pieper [developed further features](https://github.com/pieper/sites/tree/gh-pages/dcmio) and [examples of creating multiframe and segmentation objects](https://github.com/pieper/sites/tree/gh-pages/DICOMzero) discussed with the community at RSNA +- 2017 + - At [NA-MIC Project Week 25](https://na-mic.org/wiki/Project_Week_25) Erik Ziegler and Steve Pieper [worked](https://na-mic.org/wiki/Project_Week_25/DICOM_Segmentation_Support_for_Cornerstone_and_OHIF_Viewer) + with the community to define some example use cases to mix the pure JavaScript DICOM code with Cornerstone and [CornerstoneTools](https://github.com/chafey/cornerstoneTools). +- 2018-2022 + - Work continues to develop SR and SEG support to [OHIFViewer](http://ohif.org) allow interoperability with [DICOM4QI](https://legacy.gitbook.com/book/qiicr/dicom4qi/details) +- 2023 + - Moved the adapters into cornerstone3D from dcmjsj # Support The developers gratefully acknowledge their research support: -- Open Health Imaging Foundation ([OHIF](http://ohif.org)) -- Quantitative Image Informatics for Cancer Research ([QIICR](http://qiicr.org)) -- [Radiomics](http://radiomics.io) -- The [Neuroimage Analysis Center](http://nac.spl.harvard.edu) -- The [National Center for Image Guided Therapy](http://ncigt.org) -- The [NCI Imaging Data Commons](https://imagingdatacommons.github.io/) NCI Imaging Data Commons: contract number 19X037Q from Leidos Biomedical Research under Task Order HHSN26100071 from NCI +- Open Health Imaging Foundation ([OHIF](http://ohif.org)) +- Quantitative Image Informatics for Cancer Research ([QIICR](http://qiicr.org)) +- [Radiomics](http://radiomics.io) +- The [Neuroimage Analysis Center](http://nac.spl.harvard.edu) +- The [National Center for Image Guided Therapy](http://ncigt.org) +- The [NCI Imaging Data Commons](https://imagingdatacommons.github.io/) NCI Imaging Data Commons: contract number 19X037Q from Leidos Biomedical Research under Task Order HHSN26100071 from NCI diff --git a/packages/adapters/generate-dictionary.js b/packages/adapters/generate-dictionary.js index 3715d120e1..0e10d5d606 100644 --- a/packages/adapters/generate-dictionary.js +++ b/packages/adapters/generate-dictionary.js @@ -3,143 +3,156 @@ * Reformat The DICOM dictionary PS3.6 and PS3.7 docbook XML files (from e.g. standard docs) to JavaScript syntax. * Based on https://github.com/pydicom/pydicom/blob/8112bb69bfc0423c3a08cb89e7960defbe7237bf/source/generate_dict/generate_dicom_dict.py */ -const fs = require('fs/promises'); -const http = require('http'); -const xml2js = require('xml2js'); +const fs = require("fs/promises"); +const http = require("http"); +const xml2js = require("xml2js"); -require('@babel/register'); -const DICTIONARY_PATH = './src/dictionary.js'; +require("@babel/register"); +const DICTIONARY_PATH = "./src/dictionary.js"; const dictionary = require(DICTIONARY_PATH).default; -const { Tag } = require('./src/Tag'); +const { Tag } = require("./src/Tag"); async function main() { - const tags = []; + const tags = []; - /** - * Collect DICOM tags from XML documents - */ - const part06 = await getDocbook('part06/part06.xml'); - const part06Rows = part06.book.chapter.find(chapter => chapter.$['xml:id'] === 'chapter_6').table[0].tbody[0].tr; - tags.push(...part06Rows.map(row => { - const retired = getCellData(row.td[5])?.startsWith('RET'); - const name = getCellData(row.td[2]); - return { - tag: getCellData(row.td[0]), - vr: getCellData(row.td[3]), - name: retired ? `RETIRED_${name}` : name, - vm: getCellData(row.td[4]), - version: retired ? 'DICOM/retired' : 'DICOM', - } - })); + /** + * Collect DICOM tags from XML documents + */ + const part06 = await getDocbook("part06/part06.xml"); + const part06Rows = part06.book.chapter.find( + chapter => chapter.$["xml:id"] === "chapter_6" + ).table[0].tbody[0].tr; + tags.push( + ...part06Rows.map(row => { + const retired = getCellData(row.td[5])?.startsWith("RET"); + const name = getCellData(row.td[2]); + return { + tag: getCellData(row.td[0]), + vr: getCellData(row.td[3]), + name: retired ? `RETIRED_${name}` : name, + vm: getCellData(row.td[4]), + version: retired ? "DICOM/retired" : "DICOM" + }; + }) + ); - const part07 = await getDocbook('part07/part07.xml'); - const chapterE = part07.book.chapter.find(chapter => chapter.$['xml:id'] === 'chapter_E'); - const commandFields = chapterE.section[0].table[0].tbody[0].tr; - tags.push(...commandFields.map(row => { - return { - tag: getCellData(row.td[0]), - vr: getCellData(row.td[3]), - name: getCellData(row.td[2]), - vm: getCellData(row.td[4]), - version: 'DICOM', - } - })); - const retiredCommandFields = chapterE.section[1].table[0].tbody[0].tr; - tags.push(...retiredCommandFields.map(row => { - return { - tag: getCellData(row.td[0]), - vr: getCellData(row.td[3]), - name: `RETIRED_${getCellData(row.td[2])}`, - vm: getCellData(row.td[4]), - version: 'DICOM/retired', - } - })); + const part07 = await getDocbook("part07/part07.xml"); + const chapterE = part07.book.chapter.find( + chapter => chapter.$["xml:id"] === "chapter_E" + ); + const commandFields = chapterE.section[0].table[0].tbody[0].tr; + tags.push( + ...commandFields.map(row => { + return { + tag: getCellData(row.td[0]), + vr: getCellData(row.td[3]), + name: getCellData(row.td[2]), + vm: getCellData(row.td[4]), + version: "DICOM" + }; + }) + ); + const retiredCommandFields = chapterE.section[1].table[0].tbody[0].tr; + tags.push( + ...retiredCommandFields.map(row => { + return { + tag: getCellData(row.td[0]), + vr: getCellData(row.td[3]), + name: `RETIRED_${getCellData(row.td[2])}`, + vm: getCellData(row.td[4]), + version: "DICOM/retired" + }; + }) + ); - const newTags = tags.filter(tag => tag.vr && tag.name && tag.vm) - .filter(tag => !(tag.tag in dictionary)) // filter already defined - .filter(tag => !/[(,\dA-F]x+[A-F\d,)]/.test(tag.tag)); // filter repeater tags + const newTags = tags + .filter(tag => tag.vr && tag.name && tag.vm) + .filter(tag => !(tag.tag in dictionary)) // filter already defined + .filter(tag => !/[(,\dA-F]x+[A-F\d,)]/.test(tag.tag)); // filter repeater tags - /** - * Insert new tags into dictionary, ordered among tags with the same version - */ - const dictionaryArray = Object.values(dictionary); - for (const newTag of newTags) { - const parsedTag = Tag.fromPString(newTag.tag); - const insertIndex = dictionaryArray.findIndex(tag => { - if (tag.version !== newTag.version) { - return false; - } - const thisTag = Tag.fromPString(tag.tag); - return thisTag.toCleanString() > parsedTag.toCleanString(); - }); - dictionaryArray.splice(insertIndex, 0, newTag); - } + /** + * Insert new tags into dictionary, ordered among tags with the same version + */ + const dictionaryArray = Object.values(dictionary); + for (const newTag of newTags) { + const parsedTag = Tag.fromPString(newTag.tag); + const insertIndex = dictionaryArray.findIndex(tag => { + if (tag.version !== newTag.version) { + return false; + } + const thisTag = Tag.fromPString(tag.tag); + return thisTag.toCleanString() > parsedTag.toCleanString(); + }); + dictionaryArray.splice(insertIndex, 0, newTag); + } - await writeDictionary(dictionaryArray); + await writeDictionary(dictionaryArray); } async function writeDictionary(tags) { - let data = 'const dictionary = {'; - for (const tag of tags) { - if (!tag.tag) { - data += ` + let data = "const dictionary = {"; + for (const tag of tags) { + if (!tag.tag) { + data += ` "": { tag: "" - },` - continue; - } - const tagKey = tag.tag.includes('"') ? `'${tag.tag}'` : `"${tag.tag}"`; - data += ` + },`; + continue; + } + const tagKey = tag.tag.includes('"') ? `'${tag.tag}'` : `"${tag.tag}"`; + data += ` ${tagKey}: { tag: ${tagKey}, vr: "${tag.vr}", name: "${tag.name}", vm: "${tag.vm}", - version: "${tag.version ?? 'PrivateTag'}" + version: "${tag.version ?? "PrivateTag"}" },`; - } - data += ` + } + data += ` }; export default dictionary; `; - await fs.writeFile(DICTIONARY_PATH, data); + await fs.writeFile(DICTIONARY_PATH, data); } async function getDocbook(part) { - const source = await getUrl(`http://dicom.nema.org/medical/dicom/current/source/docbook/${part}`); - return xml2js.parseStringPromise(source); + const source = await getUrl( + `http://dicom.nema.org/medical/dicom/current/source/docbook/${part}` + ); + return xml2js.parseStringPromise(source); } function getCellData(td) { - const para = td.para?.[0]; - if (!para) { - return undefined; - } - const text = para.emphasis ? para.emphasis[0]._ : para._; - return text?.trim().replace(/[\u200b\uffff]/g, ''); + const para = td.para?.[0]; + if (!para) { + return undefined; + } + const text = para.emphasis ? para.emphasis[0]._ : para._; + return text?.trim().replace(/[\u200b\uffff]/g, ""); } function getUrl(url) { - return new Promise((resolve, reject) => { - http.get(url, request => { - let data = ''; - request.on('error', () => { - reject(error); - }); - request.on('end', () => { - resolve(data); - }); - request.on('data', chunk => { - data += chunk; - }); + return new Promise((resolve, reject) => { + http.get(url, request => { + let data = ""; + request.on("error", () => { + reject(error); + }); + request.on("end", () => { + resolve(data); + }); + request.on("data", chunk => { + data += chunk; + }); + }); }); - }); } if (require.main === module) { - main().catch(error => { - console.log(error); - }); + main().catch(error => { + console.log(error); + }); } diff --git a/packages/adapters/package.json b/packages/adapters/package.json index a4b45df720..3fad4db686 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -65,11 +65,10 @@ "clean:deep": "yarn run clean && shx rm -rf node_modules", "dev": "rollup --watch -c rollup.config.mjs", "build:all": "yarn build", - "format-check": "npx eslint ./src --quiet", "api-check": "echo 'No API check for this package'", "start": "rollup --watch -c rollup.config.mjs", "format": "prettier --write 'src/**/*.js' 'test/**/*.js'", - "lint": "eslint --fix .", + "lint": "oxlint .", "prebuild": "node ../../scripts/generate-version.js ./" }, "repository": { diff --git a/packages/ai/package.json b/packages/ai/package.json index ae808799d3..3c7ed5003a 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -36,8 +36,7 @@ "build:all": "yarn run build:esm", "start": "tsc --project ./tsconfig.json --watch", "format": "prettier --write 'src/**/*.js' 'test/**/*.js'", - "lint": "eslint --fix .", - "format-check": "npx eslint ./src --quiet", + "lint": "oxlint .", "api-check": "api-extractor --debug run ", "prepublishOnly": "yarn clean && yarn build" }, diff --git a/packages/core/examples/dicomLoader/customImageLoader.ts b/packages/core/examples/dicomLoader/customImageLoader.ts index a868a09fa8..8b888e9f0e 100644 --- a/packages/core/examples/dicomLoader/customImageLoader.ts +++ b/packages/core/examples/dicomLoader/customImageLoader.ts @@ -36,7 +36,7 @@ function _loadImageIntoBuffer( imageId, pixelData, transferSyntax, - options as any + options as unknown ); logFn('Loader: done loading image: ', sopInstanceUid); diff --git a/packages/core/package.json b/packages/core/package.json index 0c1c5cc97d..3e8d9a97f4 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -76,8 +76,8 @@ "build": "yarn run build:esm", "build:all": "yarn run build:esm", "dev": "tsc --project ./tsconfig.json --watch", - "format-check": "npx eslint ./src --quiet", "api-check": "api-extractor --debug run ", + "lint": "oxlint .", "prepublishOnly": "yarn run build" }, "dependencies": { diff --git a/packages/core/src/RenderingEngine/RenderingEngine.ts b/packages/core/src/RenderingEngine/RenderingEngine.ts index c8b7bdab66..e6d3a006a5 100644 --- a/packages/core/src/RenderingEngine/RenderingEngine.ts +++ b/packages/core/src/RenderingEngine/RenderingEngine.ts @@ -13,6 +13,7 @@ import { RenderingEngineModeEnum } from '../enums'; class RenderingEngine { public hasBeenDestroyed: boolean; + // eslint-disable-next-line @typescript-eslint/no-explicit-any public offscreenMultiRenderWindow: VtkOffscreenMultiRenderWindow; private _implementation?: BaseRenderingEngine; diff --git a/packages/core/src/utilities/logger.ts b/packages/core/src/utilities/logger.ts index d1a3111a75..4764998639 100644 --- a/packages/core/src/utilities/logger.ts +++ b/packages/core/src/utilities/logger.ts @@ -13,7 +13,6 @@ if (typeof window !== 'undefined') { (window as unknown as WindowLog).log = loglevel; } - export type Logger = LogLevelLogger & { getLogger: (...categories: string[]) => Logger; }; diff --git a/packages/dicomImageLoader/docs/Building.md b/packages/dicomImageLoader/docs/Building.md index 537edcac2a..a8768735bd 100644 --- a/packages/dicomImageLoader/docs/Building.md +++ b/packages/dicomImageLoader/docs/Building.md @@ -1,21 +1,21 @@ -Build System -============ +# Build System This project uses Webpack to build the software. -Pre-requisites: ---------------- +## Pre-requisites: NodeJs - [click to visit web site for installation instructions](http://nodejs.org). -Common Tasks ------------- +## Common Tasks Update dependencies (after each pull): + > npm install Running the build: + > npm run build Automatically running the build and unit tests after each source change: -> npm run watch \ No newline at end of file + +> npm run watch diff --git a/packages/dicomImageLoader/docs/ImageIds.md b/packages/dicomImageLoader/docs/ImageIds.md index 9a9d5fdd72..a058255566 100644 --- a/packages/dicomImageLoader/docs/ImageIds.md +++ b/packages/dicomImageLoader/docs/ImageIds.md @@ -1,8 +1,7 @@ -ImageIds -======== +# ImageIds The image loader prefix is 'wadouri' (note that the prefix dicomweb is also supported but is deprecated and will eventually -be removed). Here are some example imageId's: +be removed). Here are some example imageId's: absolute url: @@ -29,7 +28,7 @@ wadouri:http://localhost:8042/instances/8cce70aa-576ad738-b76cb63f-caedb3c7-2b21 ``` Note that the web server must support [Cross origin resource sharing](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) -or the image will fail to load. If you are unable to get CORS enabled on the web server that you are loading DICOM P10 -instances from, you can use a [reverse proxy](http://en.wikipedia.org/wiki/Reverse_proxy). Here is a +or the image will fail to load. If you are unable to get CORS enabled on the web server that you are loading DICOM P10 +instances from, you can use a [reverse proxy](http://en.wikipedia.org/wiki/Reverse_proxy). Here is a [simple Node.js based http-proxy](http://chafey.blogspot.com/2014/09/working-around-cors.html) that adds CORS headers -that you might find useful. \ No newline at end of file +that you might find useful. diff --git a/packages/dicomImageLoader/docs/TransferSyntaxes.md b/packages/dicomImageLoader/docs/TransferSyntaxes.md index 24605dff66..27f24deb8a 100644 --- a/packages/dicomImageLoader/docs/TransferSyntaxes.md +++ b/packages/dicomImageLoader/docs/TransferSyntaxes.md @@ -1,36 +1,35 @@ -Transfer Syntaxes -================= +# Transfer Syntaxes This image loader supports the following transfer syntaxes: -Uncompressed ------------- -* 1.2.840.10008.1.2 Implicit VR Endian -* 1.2.840.10008.1.2.1 Explicit VR Little Endian -* 1.2.840.10008.1.2.2 Explicit VR Big Endian +## Uncompressed -Compressed (requires codec, see below) --------------------------------------- -* 1.2.840.10008.1.2.5 RLE Lossless -* 1.2.840.10008.1.2.4.50 JPEG Baseline (Process 1 - 8 bit) -* 1.2.840.10008.1.2.4.51 JPEG Baseline (Processes 2 & 4 - 12 bit) -* 1.2.840.10008.1.2.4.57 JPEG Lossless, Nonhierarchical (Processes 14) -* 1.2.840.10008.1.2.4.70 JPEG Lossless, Nonhierarchical (Processes 14 [Selection 1]) -* 1.2.840.10008.1.2.4.80 JPEG-LS Lossless Image Compression -* 1.2.840.10008.1.2.4.81 JPEG-LS Lossy (Near-Lossless) Image Compression -* 1.2.840.10008.1.2.4.90 JPEG 2000 Image Compression (Lossless Only) -* 1.2.840.10008.1.2.4.91 JPEG 2000 Image Compression -* 3.2.840.10008.1.2.4.96 HTJ2K (private TSUID for HTJ2K) -* 1.2.840.10008.1.2.4.202 High Throughput JPEG 2000 (HTJ2K with RPCL) -* 1.2.840.10008.1.2.1.99 Deflate Transfer Syntax +- 1.2.840.10008.1.2 Implicit VR Endian +- 1.2.840.10008.1.2.1 Explicit VR Little Endian +- 1.2.840.10008.1.2.2 Explicit VR Big Endian -Photometric Interpretations ---------------------------- -* MONOCHROME1 -* MONOCHROME2 -* RGB (pixel and planar configurations) -* PALETTE COLOR -* YBR_FULL -* YBR_FULL_422 -* YBR_RCT -* YBR_ICT +## Compressed (requires codec, see below) + +- 1.2.840.10008.1.2.5 RLE Lossless +- 1.2.840.10008.1.2.4.50 JPEG Baseline (Process 1 - 8 bit) +- 1.2.840.10008.1.2.4.51 JPEG Baseline (Processes 2 & 4 - 12 bit) +- 1.2.840.10008.1.2.4.57 JPEG Lossless, Nonhierarchical (Processes 14) +- 1.2.840.10008.1.2.4.70 JPEG Lossless, Nonhierarchical (Processes 14 [Selection 1]) +- 1.2.840.10008.1.2.4.80 JPEG-LS Lossless Image Compression +- 1.2.840.10008.1.2.4.81 JPEG-LS Lossy (Near-Lossless) Image Compression +- 1.2.840.10008.1.2.4.90 JPEG 2000 Image Compression (Lossless Only) +- 1.2.840.10008.1.2.4.91 JPEG 2000 Image Compression +- 3.2.840.10008.1.2.4.96 HTJ2K (private TSUID for HTJ2K) +- 1.2.840.10008.1.2.4.202 High Throughput JPEG 2000 (HTJ2K with RPCL) +- 1.2.840.10008.1.2.1.99 Deflate Transfer Syntax + +## Photometric Interpretations + +- MONOCHROME1 +- MONOCHROME2 +- RGB (pixel and planar configurations) +- PALETTE COLOR +- YBR_FULL +- YBR_FULL_422 +- YBR_RCT +- YBR_ICT diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 9d31f33851..e25d156dca 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -74,7 +74,6 @@ "copy-dts": "echo 'not implemented yet'", "clean": "shx rm -rf dist", "clean:deep": "yarn run clean && shx rm -rf node_modules", - "format-check": "npx eslint ./src --quiet", "api-check": "api-extractor --debug run ", "cm": "npx git-cz", "clean:dist": "shx rm -rf dist", @@ -83,10 +82,7 @@ "doc": "npm run doc:generate && opn documentation/index.html", "doc:generate": "npm run clean:docs && jsdoc -c .jsdocrc", "dev": "tsc --project ./tsconfig.json --watch", - "eslint": "eslint -c .eslintrc.js src", - "eslint-quiet": "eslint -c .eslintrc.js --quiet src", - "eslint-fix": "eslint -c .eslintrc.js --fix src", - "eslint-fix-test": "eslint -c .eslintrc.js --fix test", + "lint": "oxlint .", "start": "npm run webpack:dev", "start:dev": "webpack-dev-server --config .webpack/webpack-dev", "test": "npm run test:chrome", @@ -119,13 +115,6 @@ "@cornerstonejs/core": "^3.32.5", "dicom-parser": "^1.8.9" }, - "lint-staged": { - "src/**/*.{js,jsx,json,css}": [ - "eslint --fix", - "prettier --write", - "git add" - ] - }, "config": { "commitizen": { "path": "./node_modules/cz-conventional-changelog" diff --git a/packages/docs/docs/concepts/cornerstone-core/cahce.md b/packages/docs/docs/concepts/cornerstone-core/cahce.md index e8944376c4..4d2dac542d 100644 --- a/packages/docs/docs/concepts/cornerstone-core/cahce.md +++ b/packages/docs/docs/concepts/cornerstone-core/cahce.md @@ -32,6 +32,7 @@ If you ever actually need the full voxel data of a volume, you can use the `Voxe This new change that was introduced in `Cornerstone3D` 2.x is part of the new image-based approach that aims to improve performance, reduce memory usage, and provide more efficient data access, especially for large datasets. Here are other benefits of the new approach: + 1. Single Source of Truth - Previously: Data existed in both image cache and volume cache, leading to synchronization issues. diff --git a/packages/docs/docs/concepts/cornerstone-tools/annotation/annotationManager.md b/packages/docs/docs/concepts/cornerstone-tools/annotation/annotationManager.md index a8e6804a87..295a55a0b1 100644 --- a/packages/docs/docs/concepts/cornerstone-tools/annotation/annotationManager.md +++ b/packages/docs/docs/concepts/cornerstone-tools/annotation/annotationManager.md @@ -8,6 +8,7 @@ The Annotation Manager is a singleton class that manages annotations in Cornerst We use the Annotation Manager to store annotations, retrieve annotations, and save and restore annotations. ## Default Annotation Manager + The default Annotation Manager, `FrameOfReferenceSpecificAnnotationManager`, stores annotations based on the FrameOfReferenceUID. This means that annotations are stored separately for each FrameOfReferenceUID. @@ -16,11 +17,10 @@ FrameOfReferenceUID, they will share the same annotations. However, StackViewpor works on the per imageId basis, so annotations are not shared between StackViewports. ### GroupKey + Annotation groups are identified by a groupKey. The groupKey is a string that is used to identify the group of annotations. As mentioned above, the default Annotation Manager stores annotations based on the FrameOfReferenceUID, so the groupKey is the `FrameOfReferenceUID`. - - ## Custom Annotation Manager You can create your own custom Annotation Manager by implementing the `IAnnotationManager` interface: diff --git a/packages/docs/docs/concepts/cornerstone-tools/segmentation/active.md b/packages/docs/docs/concepts/cornerstone-tools/segmentation/active.md index d9e806e2de..7a4f66230f 100644 --- a/packages/docs/docs/concepts/cornerstone-tools/segmentation/active.md +++ b/packages/docs/docs/concepts/cornerstone-tools/segmentation/active.md @@ -4,22 +4,20 @@ title: Active Segmentation summary: Viewport-specific system for determining which segmentation is currently being edited, with distinct visual styling for active versus inactive segmentations --- - # Active Segmentation ![](../../../assets/active-segmentation.png) - Each viewport can display multiple segmentation representations simultaneously, but only one segmentation can be active per viewport. The active segmentation is the one that will be modified by segmentation tools. You can have different styles for active and inactive segmentations. For instance, you can configure different fill and outline properties for active versus inactive segmentations in each viewport. - As shown in the image above, you can display multiple labelmap segmentations in the same viewport. By default, active segmentations have a higher outline width to make them more visually distinct from inactive segmentations. ## Viewport-Specific Active Segmentations An important concept in version 2.x is that active segmentations are viewport-specific. This means: + - Each viewport can have its own active segmentation - The same segmentation can be active in one viewport and inactive in another - Segmentation tools will only modify the active segmentation in the viewport they're being used in @@ -44,7 +42,6 @@ Once you have the active segmentation, you can access various properties: ```js const activeSegmentation = segmentation.getActiveSegmentation(viewportId); - ``` ### Working with Multiple Viewports diff --git a/packages/docs/docs/concepts/cornerstone-tools/segmentation/config.md b/packages/docs/docs/concepts/cornerstone-tools/segmentation/config.md index da7fb2798e..ede5f5e182 100644 --- a/packages/docs/docs/concepts/cornerstone-tools/segmentation/config.md +++ b/packages/docs/docs/concepts/cornerstone-tools/segmentation/config.md @@ -4,7 +4,6 @@ title: Config summary: Multi-level styling system for segmentation visualizations, with a hierarchy that ranges from global settings to segment-specific properties like color, outline, and fill --- - # Configuration In version 2.x, segmentation configurations are managed through a unified style system that can be applied at different levels of specificity using a specifier object. @@ -12,6 +11,7 @@ In version 2.x, segmentation configurations are managed through a unified style ## Style System Styles can be applied at multiple levels: + - Global styles for all segmentations - Type-specific styles (e.g., all Labelmaps) - Viewport-specific styles @@ -53,10 +53,10 @@ import { segmentation } from '@cornerstonejs/tools'; // Get style for a specific context const style = segmentation.getStyle({ - viewportId: 'viewport1', // optional - segmentationId: 'segmentation1', // optional - type: Enums.SegmentationRepresentations.Labelmap, // required - segmentIndex: 1 // optional + viewportId: 'viewport1', // optional + segmentationId: 'segmentation1', // optional + type: Enums.SegmentationRepresentations.Labelmap, // required + segmentIndex: 1, // optional }); // Set style for a specific context @@ -64,12 +64,12 @@ segmentation.setStyle( { viewportId: 'viewport1', segmentationId: 'segmentation1', - type: Enums.SegmentationRepresentations.Labelmap + type: Enums.SegmentationRepresentations.Labelmap, }, { renderFill: true, renderOutline: true, - outlineWidth: 3 + outlineWidth: 3, } ); @@ -80,7 +80,7 @@ segmentation.resetToGlobalStyle(); const hasCustomStyle = segmentation.hasCustomStyle({ viewportId: 'viewport1', segmentationId: 'segmentation1', - type: Enums.SegmentationRepresentations.Labelmap + type: Enums.SegmentationRepresentations.Labelmap, }); ``` @@ -121,13 +121,14 @@ segmentation.setSegmentIndexColor( 'viewport1', 'segmentation1', segmentIndex, - [255, 0, 0, 255] // RGBA color + [255, 0, 0, 255] // RGBA color ); ``` ### Style Hierarchy Styles are applied in the following order of precedence (highest to lowest): + 1. Segment-specific style (when segmentIndex is provided) 2. Viewport-specific style (when viewportId is provided) 3. Segmentation-specific style (when segmentationId is provided) @@ -135,6 +136,7 @@ Styles are applied in the following order of precedence (highest to lowest): 5. Global style Example: + ```js // Set global style for all labelmaps segmentation.setStyle( @@ -146,7 +148,7 @@ segmentation.setStyle( segmentation.setStyle( { viewportId: 'viewport1', - type: Enums.SegmentationRepresentations.Labelmap + type: Enums.SegmentationRepresentations.Labelmap, }, { renderOutline: false } ); @@ -157,7 +159,7 @@ segmentation.setStyle( viewportId: 'viewport1', segmentationId: 'segmentation1', type: Enums.SegmentationRepresentations.Labelmap, - segmentIndex: 1 + segmentIndex: 1, }, { outlineWidth: 5 } ); diff --git a/packages/docs/docs/concepts/cornerstone-tools/segmentation/index.md b/packages/docs/docs/concepts/cornerstone-tools/segmentation/index.md index 42ee1aca76..ee51feb56b 100644 --- a/packages/docs/docs/concepts/cornerstone-tools/segmentation/index.md +++ b/packages/docs/docs/concepts/cornerstone-tools/segmentation/index.md @@ -23,8 +23,6 @@ Similar relationship structure has been adapted in popular medical imaging softw such as [3D Slicer](https://www.slicer.org/) with the addition of [polymorph segmentation](https://github.com/PerkLab/PolySeg). ::: - - ## API `Segmentation` related functions and classes are available in the `segmentation` module. diff --git a/packages/docs/docs/concepts/cornerstone-tools/segmentation/locking.md b/packages/docs/docs/concepts/cornerstone-tools/segmentation/locking.md index a352e19e56..119c2a4e8f 100644 --- a/packages/docs/docs/concepts/cornerstone-tools/segmentation/locking.md +++ b/packages/docs/docs/concepts/cornerstone-tools/segmentation/locking.md @@ -6,13 +6,12 @@ summary: Feature that prevents modification of specified segments, protecting co # Segment Locking - ![](../../../assets/segment-locking.png) - You can lock specific segments in a segmentation to prevent them from being modified by any tools. For example, consider the following image with an overlaid labelmap: + - Left image: shows `segment index 1` - Middle image: shows the result when `segment index 2` is drawn on top of `segment index 1` - Right image: shows the result when `segment index 1` is locked and `segment index 2` is drawn on top of `segment index 1` @@ -36,7 +35,8 @@ segmentation.locking.setSegmentIndexLocked( ); // Get all locked segment indices for a segmentation -const lockedIndices = segmentation.locking.getLockedSegmentIndices(segmentationId); +const lockedIndices = + segmentation.locking.getLockedSegmentIndices(segmentationId); // Check if a segment index is locked const isLocked = segmentation.locking.isSegmentIndexLocked( @@ -56,7 +56,8 @@ const isLocked = segmentation.locking.isSegmentIndexLocked('segmentation1', 1); console.log(`Segment 1 is ${isLocked ? 'locked' : 'unlocked'}`); // Get all locked segments -const lockedIndices = segmentation.locking.getLockedSegmentIndices('segmentation1'); +const lockedIndices = + segmentation.locking.getLockedSegmentIndices('segmentation1'); console.log('Locked segment indices:', lockedIndices); // Unlock segment 1 @@ -67,6 +68,7 @@ segmentation.locking.setSegmentIndexLocked('segmentation1', 1, false); 1. Renamed `getLockedSegments` to `getLockedSegmentIndices` for clarity 2. The locked state is now stored in the segment data structure: + ```js { segments: { diff --git a/packages/docs/docs/concepts/cornerstone-tools/segmentation/state.md b/packages/docs/docs/concepts/cornerstone-tools/segmentation/state.md index 9ace1a170d..4b33e47890 100644 --- a/packages/docs/docs/concepts/cornerstone-tools/segmentation/state.md +++ b/packages/docs/docs/concepts/cornerstone-tools/segmentation/state.md @@ -70,10 +70,10 @@ segmentation.addSegmentations([ representation: { type: Enums.SegmentationRepresentations.Labelmap, data: { - imageIds: segmentationImageIds - } - } - } + imageIds: segmentationImageIds, + }, + }, + }, ]); ``` @@ -93,12 +93,11 @@ import { segmentation, Enums } from '@cornerstonejs/tools'; await segmentation.addSegmentationRepresentations(viewportId, [ { segmentationId, - type: Enums.SegmentationRepresentations.Labelmap - } + type: Enums.SegmentationRepresentations.Labelmap, + }, ]); ``` - ### Representation-Specific Methods Cornerstone3D v2 provides dedicated methods for adding different types of segmentation representations: @@ -137,15 +136,15 @@ const viewportInputMap = { viewport1: [ { segmentationId: 'seg1', - type: Enums.SegmentationRepresentations.Labelmap - } + type: Enums.SegmentationRepresentations.Labelmap, + }, ], viewport2: [ { segmentationId: 'seg1', - type: Enums.SegmentationRepresentations.Labelmap - } - ] + type: Enums.SegmentationRepresentations.Labelmap, + }, + ], }; await segmentation.addLabelmapRepresentationToViewportMap(viewportInputMap); diff --git a/packages/docs/docs/concepts/streaming-image-volume/index.md b/packages/docs/docs/concepts/streaming-image-volume/index.md index 3e72b63128..bcb33369df 100644 --- a/packages/docs/docs/concepts/streaming-image-volume/index.md +++ b/packages/docs/docs/concepts/streaming-image-volume/index.md @@ -4,7 +4,6 @@ title: Streaming ImageVolume summary: Introduction to the volume loader that implements progressive loading of volume data to the GPU for efficient rendering --- - # Streaming ImageVolume We have added a new volume loader which implements a progressive loading of volumes to the GPU. You can read diff --git a/packages/docs/docs/concepts/streaming-image-volume/streaming.md b/packages/docs/docs/concepts/streaming-image-volume/streaming.md index 0d226c6258..0330e4d6fd 100644 --- a/packages/docs/docs/concepts/streaming-image-volume/streaming.md +++ b/packages/docs/docs/concepts/streaming-image-volume/streaming.md @@ -17,10 +17,8 @@ Therefore, an initial call to fetch images metadata is required for this loader. not only we can pre-allocate and cache a `Volume` in memory, but we also can render the volume as the 2D images are being loaded (progressive loading). - ![](../../assets/volume-building.png) - By pre-fetching the metadata from all images (`imageIds`), we don't need to create the [`Image`](../cornerstone-core/images.md) object for each imageId. Instead, we can just insert the pixelData of the image is directly inserted into the volume @@ -57,7 +55,6 @@ Since the volume loader does not need to create the [`Image`](../cornerstone-cor the `StreamingImageVolume`, it will use the `skipCreateImage` option internally to skip the creation of the image object. Otherwise, the volume's image loader is the same as wadors image loader written in `cornerstone-wado-image-loader`. - ```js const imageIds = ['wadors:imageId1', 'wadors:imageId2']; diff --git a/packages/docs/docs/help.md b/packages/docs/docs/help.md index 885c590545..2e2cfbf964 100644 --- a/packages/docs/docs/help.md +++ b/packages/docs/docs/help.md @@ -24,5 +24,4 @@ resources and must be judicious with how we allocate them. If you find yourself in this situation and in need of assistance, it may be in your best interest to persue paid support. - [gh-issues]: https://github.com/cornerstonejs/cornerstone3D/issues/ diff --git a/packages/docs/docs/migration-guides/2x/2-streaming-loader.md b/packages/docs/docs/migration-guides/2x/2-streaming-loader.md index c9e6dce079..9864dd424d 100644 --- a/packages/docs/docs/migration-guides/2x/2-streaming-loader.md +++ b/packages/docs/docs/migration-guides/2x/2-streaming-loader.md @@ -7,7 +7,6 @@ summary: Migration guide for changes to the streaming-image-volume-loader when u import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - # @cornerstonejs/streaming-image-volume-loader After years of development on Cornerstone3D, we recognized that volume loading should be treated as a first-class feature rather than a separate library. As a result, we have merged all functionality related to streaming image loading into the core library. diff --git a/packages/docs/docs/migration-guides/2x/3-core.md b/packages/docs/docs/migration-guides/2x/3-core.md index af239c5ba1..50d02a2ad8 100644 --- a/packages/docs/docs/migration-guides/2x/3-core.md +++ b/packages/docs/docs/migration-guides/2x/3-core.md @@ -7,8 +7,6 @@ summary: Changes to the core package when migrating from Cornerstone3D 1.x to 2. import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - - # @cornerstonejs/core ## Initialization diff --git a/packages/docs/docs/migration-guides/2x/5-tools.md b/packages/docs/docs/migration-guides/2x/5-tools.md index b9f6c84698..3fd114c864 100644 --- a/packages/docs/docs/migration-guides/2x/5-tools.md +++ b/packages/docs/docs/migration-guides/2x/5-tools.md @@ -7,7 +7,6 @@ summary: Updates to the tools package when migrating from Cornerstone3D 1.x to 2 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - # @cornerstonejs/tools ## triggerAnnotationRenderForViewportIds diff --git a/packages/docs/docs/migration-guides/2x/6-dicom-image-loader.md b/packages/docs/docs/migration-guides/2x/6-dicom-image-loader.md index ae4d8c7004..6fe9b46acb 100644 --- a/packages/docs/docs/migration-guides/2x/6-dicom-image-loader.md +++ b/packages/docs/docs/migration-guides/2x/6-dicom-image-loader.md @@ -4,12 +4,9 @@ title: '@cornerstonejs/dicom-image-loader' summary: Changes to the DICOM image loader package when upgrading from Cornerstone3D 1.x to 2.x --- - import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - - # @cornerstonejs/dicom-image-loader ## Initialization and Configuration diff --git a/packages/docs/docs/migration-guides/2x/7-nifti-volume-loader.md b/packages/docs/docs/migration-guides/2x/7-nifti-volume-loader.md index ee5de8e853..f612013a73 100644 --- a/packages/docs/docs/migration-guides/2x/7-nifti-volume-loader.md +++ b/packages/docs/docs/migration-guides/2x/7-nifti-volume-loader.md @@ -4,12 +4,9 @@ title: '@cornerstonejs/nifti-volume-loader' summary: Migration guide for the NIFTI volume loader when updating from Cornerstone3D 1.x to 2.x --- - import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - - # `@cornerstonejs/nifti-image-volume-loader` After migrating to the new pixel data model for volumes, we have also updated the Nifti image volume loader to align with this model. diff --git a/packages/docs/docs/migration-guides/2x/8-deverloper-experience.md b/packages/docs/docs/migration-guides/2x/8-deverloper-experience.md index 890dd373b5..77e28ac9de 100644 --- a/packages/docs/docs/migration-guides/2x/8-deverloper-experience.md +++ b/packages/docs/docs/migration-guides/2x/8-deverloper-experience.md @@ -7,14 +7,12 @@ summary: Improvements to the developer experience when migrating from Cornerston import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - # Developer Experience ### Dependency Cycles We have removed all dependency cycles in the library, ensuring it is now free of any such issues. To maintain this, we have added rules in our linters that will catch any dependency cycles in pull requests during continuous integration. Additionally, you can run `yarn run format-check` to ensure that the formatting is correct and to check for dependencies as well. - ### Karma tests There has been a lot of work to clean up tests let's dive in diff --git a/packages/docs/docs/migration-guides/3x/2-threshold-tools.md b/packages/docs/docs/migration-guides/3x/2-threshold-tools.md index d2b1b27f91..5845ba4f14 100644 --- a/packages/docs/docs/migration-guides/3x/2-threshold-tools.md +++ b/packages/docs/docs/migration-guides/3x/2-threshold-tools.md @@ -9,20 +9,21 @@ import TabItem from '@theme/TabItem'; ## Key Changes: -* The nested `strategySpecificConfiguration` object has been removed completely -* Configuration properties have been moved to the root level of the configuration object -* Threshold configuration has been restructured: - * `threshold` array is now a `range` property inside a `threshold` object - * Additional threshold properties (`isDynamic`, `dynamicRadius`) are part of the same object -* `setBrushThresholdForToolGroup()` function signature has changed to accept a structured threshold object -* Strategy-specific properties like `useCenterSegmentIndex` have been moved to the root configuration level -* `activeStrategy` is now a standalone property in tool operations data, no longer inside a nested configuration +- The nested `strategySpecificConfiguration` object has been removed completely +- Configuration properties have been moved to the root level of the configuration object +- Threshold configuration has been restructured: + - `threshold` array is now a `range` property inside a `threshold` object + - Additional threshold properties (`isDynamic`, `dynamicRadius`) are part of the same object +- `setBrushThresholdForToolGroup()` function signature has changed to accept a structured threshold object +- Strategy-specific properties like `useCenterSegmentIndex` have been moved to the root configuration level +- `activeStrategy` is now a standalone property in tool operations data, no longer inside a nested configuration ## Migration Steps: ### 1. Replace strategySpecificConfiguration with direct properties **Before:** + ```diff - configuration: { - activeStrategy: 'THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL', @@ -37,6 +38,7 @@ import TabItem from '@theme/TabItem'; ``` **After:** + ```diff + configuration: { + activeStrategy: 'THRESHOLD_INSIDE_SPHERE_WITH_ISLAND_REMOVAL', @@ -52,6 +54,7 @@ import TabItem from '@theme/TabItem'; ### 2. Update threshold configuration structure **Before:** + ```diff - strategySpecificConfiguration: { - THRESHOLD: { @@ -63,6 +66,7 @@ import TabItem from '@theme/TabItem'; ``` **After:** + ```diff + threshold: { + range: [-150, -70], // New 'range' property replaces 'threshold' @@ -74,6 +78,7 @@ import TabItem from '@theme/TabItem'; ### 3. Update setBrushThresholdForToolGroup calls **Before:** + ```diff - segmentationUtils.setBrushThresholdForToolGroup( - toolGroupId, @@ -83,6 +88,7 @@ import TabItem from '@theme/TabItem'; ``` **After:** + ```diff + segmentationUtils.setBrushThresholdForToolGroup( + toolGroupId, @@ -91,6 +97,7 @@ import TabItem from '@theme/TabItem'; ``` Note that `thresholdArgs` should now be an object with the structure: + ```javascript { range: [min, max], // Previously 'threshold' diff --git a/packages/docs/docs/migration-guides/3x/4-get-statistics.md b/packages/docs/docs/migration-guides/3x/4-get-statistics.md index e0bf7b8154..a5a788a006 100644 --- a/packages/docs/docs/migration-guides/3x/4-get-statistics.md +++ b/packages/docs/docs/migration-guides/3x/4-get-statistics.md @@ -7,19 +7,19 @@ summary: Updates to the segmentation statistics API when migrating to Cornerston import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - ## Key Changes: -* Statistics calculation has been moved from brush tool methods to a dedicated utility function -* Statistics are now calculated asynchronously using web workers -* The function signature for getting statistics has changed completely -* Progress events are now emitted during statistics calculation +- Statistics calculation has been moved from brush tool methods to a dedicated utility function +- Statistics are now calculated asynchronously using web workers +- The function signature for getting statistics has changed completely +- Progress events are now emitted during statistics calculation ## Migration Steps: ### 1. Replace tool-based statistics methods with the standalone utility **Before:** + ```diff - const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); - const activeName = toolGroup.getActivePrimaryMouseButtonTool(); @@ -28,6 +28,7 @@ import TabItem from '@theme/TabItem'; ``` **After:** + ```diff + const stats = await segmentationUtils.getStatistics({ + segmentationId, diff --git a/packages/docs/docs/test-coverage.md b/packages/docs/docs/test-coverage.md index eb27e48bc2..6f95153e20 100644 --- a/packages/docs/docs/test-coverage.md +++ b/packages/docs/docs/test-coverage.md @@ -10,9 +10,8 @@ summary: Information about Cornerstone3D's test coverage using Playwright, with ## Playwright - Here's the test coverage report for our Playwright tests. Keep in mind that this doesn't include our Karma tests, so our actual test coverage is likely higher than what's shown. We're focusing on Playwright for future Cornerstone3D testing, and we're really pushing to improve that coverage number. - You can view our latest test coverage report here: + - [Cornerstone3D Playwright Test Coverage Report](https://www.cornerstonejs.org/coverage) diff --git a/packages/docs/scripts/README.md b/packages/docs/scripts/README.md index aceac4b0e6..9f04f45acf 100644 --- a/packages/docs/scripts/README.md +++ b/packages/docs/scripts/README.md @@ -88,6 +88,7 @@ The script is automatically run as part of the `build:docs` command (after `gene 5. Save the file to the build directory root so it will be accessible at the root of the website The output file has the following structure: + - Title and introduction for Cornerstone3D - Files are organized by their directory structure (e.g., concepts, tutorials) - Each file has a header with its title and source URL diff --git a/packages/docs/scripts/generate-llms-full-txt.js b/packages/docs/scripts/generate-llms-full-txt.js index 8b2010e678..8a5643644f 100644 --- a/packages/docs/scripts/generate-llms-full-txt.js +++ b/packages/docs/scripts/generate-llms-full-txt.js @@ -18,15 +18,15 @@ const outputFilePath = path.join(__dirname, '../build/llms-full.txt'); // Get all subdirectories to create sections async function getDirectorySections() { const directories = new Set(); - + // Find all subdirectories that contain markdown files const markdownFiles = await glob(`${llmDir}/**/*.md`); - + markdownFiles.forEach((filePath) => { // Get the relative directory from the llm dir const relativePath = path.relative(llmDir, filePath); const dirPath = path.dirname(relativePath); - + // Add to set if it's not in the root if (dirPath !== '.') { // Get the top-level directory @@ -34,7 +34,7 @@ async function getDirectorySections() { directories.add(topDir); } }); - + return Array.from(directories).sort(); } @@ -42,21 +42,21 @@ async function getDirectorySections() { async function getSubdirectories(section) { const sectionPath = path.join(llmDir, section); const subdirectories = new Set(); - + // Find all markdown files in this section const markdownFiles = await glob(`${sectionPath}/**/*.md`); - + markdownFiles.forEach((filePath) => { // Get the relative directory from the section path const relativePath = path.relative(sectionPath, filePath); const dirPath = path.dirname(relativePath); - + // Add to set if it's not in the root if (dirPath !== '.') { subdirectories.add(dirPath); } }); - + return Array.from(subdirectories).sort(); } @@ -64,15 +64,18 @@ async function getSubdirectories(section) { function adjustHeadingLevels(content, baseLevel) { // Replace headings with adjusted levels while limiting max depth to h4 let processedContent = content; - + // Process all heading levels from h1 to h6 for (let i = 1; i <= 6; i++) { // Limit maximum heading level to h4 const newLevel = Math.min(i + baseLevel, 4); const pattern = new RegExp(`^(#{${i}})\\s+(.+)$`, 'gm'); - processedContent = processedContent.replace(pattern, `${'#'.repeat(newLevel)} $2`); + processedContent = processedContent.replace( + pattern, + `${'#'.repeat(newLevel)} $2` + ); } - + return processedContent; } @@ -80,17 +83,17 @@ function adjustHeadingLevels(content, baseLevel) { function processMarkdownFile(filePath, baseLevel) { // Read the file content const content = fs.readFileSync(filePath, 'utf8'); - + // Process content to remove frontmatter let processedContent = content; const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n/); if (frontmatterMatch) { processedContent = content.replace(/^---\n[\s\S]*?\n---\n/, ''); } - + // Adjust heading levels processedContent = adjustHeadingLevels(processedContent, baseLevel); - + return processedContent; } @@ -98,24 +101,24 @@ function processMarkdownFile(filePath, baseLevel) { async function processSubsectionFiles(section, subsection) { const subsectionPath = path.join(llmDir, section, subsection); const subsectionContent = []; - + // Get all markdown files for this subsection const markdownFiles = await glob(`${subsectionPath}/*.md`); - + // Sort files alphabetically markdownFiles.sort(); - + for (const filePath of markdownFiles) { // Get the file name const fileName = path.basename(filePath, '.md'); const relativePath = path.relative(llmDir, filePath); - + // Extract title from frontmatter or filename const content = fs.readFileSync(filePath, 'utf8'); let title = ''; const frontmatterTitleMatch = content.match(/title:\s*([^\n]+)/); const firstHeadingMatch = content.match(/# ([^\n]+)/); - + if (frontmatterTitleMatch) { title = frontmatterTitleMatch[1].trim(); // Remove quotes if present @@ -126,19 +129,21 @@ async function processSubsectionFiles(section, subsection) { // Use filename as fallback title = fileName; } - + // Add file header (as h3, since section is h1 and subsection is h2) subsectionContent.push(`\n\n### ${title}\n`); - subsectionContent.push(`Source: https://cornerstonejs.org/docs/llm/${relativePath}\n`); - + subsectionContent.push( + `Source: https://cornerstonejs.org/docs/llm/${relativePath}\n` + ); + // Process the file content with adjusted heading levels (h1->h4, h2->h5, etc.) const processedContent = processMarkdownFile(filePath, 3); subsectionContent.push(processedContent); - + // Add separator subsectionContent.push('\n\n---\n'); } - + return subsectionContent.join('\n'); } @@ -146,24 +151,24 @@ async function processSubsectionFiles(section, subsection) { async function processSectionRootFiles(section) { const sectionPath = path.join(llmDir, section); const sectionContent = []; - + // Get all markdown files directly in the section root const markdownFiles = await glob(`${sectionPath}/*.md`); - + // Sort files alphabetically markdownFiles.sort(); - + for (const filePath of markdownFiles) { // Get the file name const fileName = path.basename(filePath, '.md'); const relativePath = path.relative(llmDir, filePath); - + // Extract title from frontmatter or filename const content = fs.readFileSync(filePath, 'utf8'); let title = ''; const frontmatterTitleMatch = content.match(/title:\s*([^\n]+)/); const firstHeadingMatch = content.match(/# ([^\n]+)/); - + if (frontmatterTitleMatch) { title = frontmatterTitleMatch[1].trim(); // Remove quotes if present @@ -174,42 +179,44 @@ async function processSectionRootFiles(section) { // Use filename as fallback title = fileName; } - + // Add file header (as h2, since section is h1) sectionContent.push(`\n\n## ${title}\n`); - sectionContent.push(`Source: https://cornerstonejs.org/docs/llm/${relativePath}\n`); - + sectionContent.push( + `Source: https://cornerstonejs.org/docs/llm/${relativePath}\n` + ); + // Process the file content with adjusted heading levels (h1->h3, h2->h4, etc.) const processedContent = processMarkdownFile(filePath, 2); sectionContent.push(processedContent); - + // Add separator sectionContent.push('\n\n---\n'); } - + return sectionContent.join('\n'); } // Process root files async function processRootFiles() { const rootContent = []; - + // Get all markdown files in the root directory const rootFiles = await glob(`${llmDir}/*.md`); - + // Sort files alphabetically rootFiles.sort(); - + for (const filePath of rootFiles) { // Get the file name const fileName = path.basename(filePath, '.md'); - + // Extract title from frontmatter or filename const content = fs.readFileSync(filePath, 'utf8'); let title = ''; const frontmatterTitleMatch = content.match(/title:\s*([^\n]+)/); const firstHeadingMatch = content.match(/# ([^\n]+)/); - + if (frontmatterTitleMatch) { title = frontmatterTitleMatch[1].trim(); // Remove quotes if present @@ -220,72 +227,83 @@ async function processRootFiles() { // Use filename as fallback title = fileName; } - + // Add file header (as h2, since root is h1) rootContent.push(`\n\n## ${title}\n`); - rootContent.push(`Source: https://cornerstonejs.org/docs/llm/${fileName}\n`); - + rootContent.push( + `Source: https://cornerstonejs.org/docs/llm/${fileName}\n` + ); + // Process the file content with adjusted heading levels (h1->h3, h2->h4, etc.) const processedContent = processMarkdownFile(filePath, 2); rootContent.push(processedContent); - + // Add separator rootContent.push('\n\n---\n'); } - + return rootContent.join('\n'); } // Generate the full concatenated content async function generateLlmsFullTxt() { let content = ''; - + // Add title and introduction content += '# Cornerstone3D Documentation\n\n'; - - content += '> Cornerstone3D is a modern, high-performance JavaScript library for medical imaging, designed for building web-based medical imaging applications. It provides tools for rendering, manipulating, and analyzing medical images in various formats including DICOM.\n\n'; - - content += 'This file contains the complete documentation for Cornerstone3D, concatenated for easy reference and searching. Each section is clearly marked with its source URL.\n\n'; - + + content += + '> Cornerstone3D is a modern, high-performance JavaScript library for medical imaging, designed for building web-based medical imaging applications. It provides tools for rendering, manipulating, and analyzing medical images in various formats including DICOM.\n\n'; + + content += + 'This file contains the complete documentation for Cornerstone3D, concatenated for easy reference and searching. Each section is clearly marked with its source URL.\n\n'; + // Process root files first (if any) const rootFiles = await glob(`${llmDir}/*.md`); if (rootFiles.length > 0) { content += '# Root Documentation\n\n'; - + // Process root files const rootContent = await processRootFiles(); content += rootContent; } - + // Get all sections const sections = await getDirectorySections(); - + // Process each section for (const section of sections) { // Add section header (as h1) - content += `\n\n# ${section.charAt(0).toUpperCase() + section.slice(1)}\n\n`; - + content += `\n\n# ${ + section.charAt(0).toUpperCase() + section.slice(1) + }\n\n`; + // Process files directly in the section root const sectionRootContent = await processSectionRootFiles(section); content += sectionRootContent; - + // Process subsections if any const subsections = await getSubdirectories(section); - + for (const subsection of subsections) { // Add subsection header (as h2) - content += `\n\n## ${subsection.charAt(0).toUpperCase() + subsection.slice(1)}\n\n`; - + content += `\n\n## ${ + subsection.charAt(0).toUpperCase() + subsection.slice(1) + }\n\n`; + // Process files in this subsection - const subsectionContent = await processSubsectionFiles(section, subsection); + const subsectionContent = await processSubsectionFiles( + section, + subsection + ); content += subsectionContent; } } - + // Write the llms-full.txt file fs.writeFileSync(outputFilePath, content); console.log(`Generated llms-full.txt file at ${outputFilePath}`); } // Run the script -generateLlmsFullTxt(); \ No newline at end of file +generateLlmsFullTxt(); diff --git a/packages/docs/scripts/generate-redirects.js b/packages/docs/scripts/generate-redirects.js index 345e2eef45..ad1b4e10ca 100644 --- a/packages/docs/scripts/generate-redirects.js +++ b/packages/docs/scripts/generate-redirects.js @@ -15,11 +15,13 @@ const redirectsContent = `# Netlify redirects // Ensure the build directory exists if (!fs.existsSync(buildDir)) { - console.error('Build directory does not exist. Make sure the Docusaurus build has completed.'); + console.error( + 'Build directory does not exist. Make sure the Docusaurus build has completed.' + ); process.exit(1); } // Write the _redirects file fs.writeFileSync(redirectsPath, redirectsContent); -console.log('_redirects file generated successfully in', redirectsPath); \ No newline at end of file +console.log('_redirects file generated successfully in', redirectsPath); diff --git a/packages/docs/src/components/HomepageFeatures.js b/packages/docs/src/components/HomepageFeatures.js index ea64d37760..2083cde32b 100644 --- a/packages/docs/src/components/HomepageFeatures.js +++ b/packages/docs/src/components/HomepageFeatures.js @@ -8,7 +8,8 @@ const FeatureList = [ title: 'Standards Compliant', description: ( <> - Robust DICOM Parsing. Supports DICOMweb and all transfer syntaxes out-of-the-box. + Robust DICOM Parsing. Supports DICOMweb and all transfer syntaxes + out-of-the-box. ), }, @@ -16,7 +17,8 @@ const FeatureList = [ title: 'Fast', description: ( <> - High performance GPU-accelerated image display. Multi-threaded image decoding. Progressive data streaming. + High performance GPU-accelerated image display. Multi-threaded image + decoding. Progressive data streaming. ), }, diff --git a/packages/docs/src/pages/index.module.css b/packages/docs/src/pages/index.module.css index 4be86d113d..061fdb2c72 100644 --- a/packages/docs/src/pages/index.module.css +++ b/packages/docs/src/pages/index.module.css @@ -83,12 +83,12 @@ border-bottom-left-radius: 8px; background-color: #5e16eb; margin-left: 15px; - font-size:16px + font-size: 16px; } .announcementBar { display: flex; - font-size:16px + font-size: 16px; } .smallScreenAnnouncement { diff --git a/packages/labelmap-interpolation/README.md b/packages/labelmap-interpolation/README.md index 568ed58f98..6a38aaba36 100644 --- a/packages/labelmap-interpolation/README.md +++ b/packages/labelmap-interpolation/README.md @@ -40,8 +40,8 @@ interpolate({ noHeuristicAlignment: false, // Whether to disable heuristic alignment noUseDistanceTransform: false, // Whether to disable distance transform useCustomSlicePositions: false, // Whether to use custom slice positions - preview: false // Whether to preview the interpolation result - } + preview: false, // Whether to preview the interpolation result + }, }); ``` diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index d17ca29ffb..0d194ea2c2 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -36,8 +36,7 @@ "build:all": "yarn run build:esm", "start": "tsc --project ./tsconfig.json --watch", "format": "prettier --write 'src/**/*.js' 'test/**/*.js'", - "lint": "eslint --fix .", - "format-check": "npx eslint ./src --quiet", + "lint": "oxlint .", "api-check": "api-extractor --debug run ", "prepublishOnly": "yarn clean && yarn build" }, diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 4dacb257b0..3c16970636 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -56,7 +56,7 @@ "build": "yarn run build:all", "clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist", "clean:deep": "yarn run clean && shx rm -rf node_modules", - "format-check": "npx eslint ./src --quiet", + "lint": "oxlint .", "api-check": "api-extractor --debug run ", "prepublishOnly": "yarn run build", "webpack:watch": "webpack --mode development --progress --watch --config ./.webpack/webpack.dev.js" diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index fcb90d4a9a..91a4ca2684 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -35,8 +35,7 @@ "build:all": "yarn run build:esm", "start": "tsc --project ./tsconfig.json --watch", "format": "prettier --write 'src/**/*.js' 'test/**/*.js'", - "lint": "eslint --fix .", - "format-check": "npx eslint ./src --quiet", + "lint": "oxlint .", "api-check": "api-extractor --debug run ", "prepublishOnly": "yarn clean && yarn build" }, diff --git a/packages/tools/examples/dynamicallyAddAnnotations/ellipticalROIToolUI.ts b/packages/tools/examples/dynamicallyAddAnnotations/ellipticalROIToolUI.ts index 4f64d6f789..5225673ad9 100644 --- a/packages/tools/examples/dynamicallyAddAnnotations/ellipticalROIToolUI.ts +++ b/packages/tools/examples/dynamicallyAddAnnotations/ellipticalROIToolUI.ts @@ -101,7 +101,10 @@ function addButtonListeners(form: HTMLFormElement): void { const convertPoint = (point: Point2): Point3 => type === 'image' - ? (utilities.imageToWorldCoords(imageId || currentImageId, point) as Point3) + ? (utilities.imageToWorldCoords( + imageId || currentImageId, + point + ) as Point3) : viewport.canvasToWorld(point); const points: Point3[] = [ diff --git a/packages/tools/examples/petCt/index.ts b/packages/tools/examples/petCt/index.ts index 99831cd73c..69352891df 100644 --- a/packages/tools/examples/petCt/index.ts +++ b/packages/tools/examples/petCt/index.ts @@ -30,7 +30,7 @@ const { CrosshairsTool, TrackballRotateTool, VolumeRotateTool, - RectangleROITool + RectangleROITool, } = cornerstoneTools; const { MouseBindings } = csToolsEnums; @@ -89,7 +89,11 @@ setTitleAndDescription( 'PT-CT fusion layout with Crosshairs, and synchronized cameras, CT W/L and PET threshold' ); -const optionsValues = [WindowLevelTool.toolName, CrosshairsTool.toolName, RectangleROITool.toolName]; +const optionsValues = [ + WindowLevelTool.toolName, + CrosshairsTool.toolName, + RectangleROITool.toolName, +]; // ============================= // addDropdownToToolbar({ diff --git a/packages/tools/examples/rectangleROIStartEndThresholdWithSegmentation/index.ts b/packages/tools/examples/rectangleROIStartEndThresholdWithSegmentation/index.ts index 1c99cf838d..096c3bbb15 100644 --- a/packages/tools/examples/rectangleROIStartEndThresholdWithSegmentation/index.ts +++ b/packages/tools/examples/rectangleROIStartEndThresholdWithSegmentation/index.ts @@ -372,7 +372,7 @@ async function run() { showTextBox: true, storePointData: true, /*Set a custom wait time */ - throttleTimeout: 100 + throttleTimeout: 100, }); toolGroup.setToolActive(RectangleROIStartEndThresholdTool.toolName, { diff --git a/packages/tools/package.json b/packages/tools/package.json index 3128818a48..7f4ac42996 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -94,7 +94,7 @@ "clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist", "clean:deep": "yarn run clean && shx rm -rf node_modules", "dev": "tsc --project ./tsconfig.json --watch", - "format-check": "npx eslint ./src --quiet", + "lint": "oxlint .", "api-check": "api-extractor --debug run ", "prepublishOnly": "yarn run build", "webpack:watch": "webpack --mode development --progress --watch --config ./.webpack/webpack.dev.js" diff --git a/packages/tools/src/tools/annotation/UltrasoundPleuraBLineTool/utils/generateConvexHullFromContour.ts b/packages/tools/src/tools/annotation/UltrasoundPleuraBLineTool/utils/generateConvexHullFromContour.ts index 2897a01f16..f99da3bdad 100644 --- a/packages/tools/src/tools/annotation/UltrasoundPleuraBLineTool/utils/generateConvexHullFromContour.ts +++ b/packages/tools/src/tools/annotation/UltrasoundPleuraBLineTool/utils/generateConvexHullFromContour.ts @@ -1,5 +1,5 @@ import type { Types } from '@cornerstonejs/core'; -import { utilities } from '@cornerstonejs/tools'; +import * as math from '../../../../utilities/math'; /** * Generate a convex hull from a contour by simplifying, smoothing, and computing the hull @@ -12,9 +12,9 @@ import { utilities } from '@cornerstonejs/tools'; */ export function generateConvexHullFromContour(contour: Array) { // 1) Simplify jagged bits (ε = e.g. 2px): - const simplified = utilities.math.polyline.decimate(contour, 2); + const simplified = math.polyline.decimate(contour, 2); // calculate convex hull - const hull = utilities.math.polyline.convexHull(simplified); + const hull = math.polyline.convexHull(simplified); return { simplified, hull }; } diff --git a/tests/contextPoolRenderingEngine.spec.ts b/tests/contextPoolRenderingEngine.spec.ts index 39dee3e4ef..f168d74d3d 100644 --- a/tests/contextPoolRenderingEngine.spec.ts +++ b/tests/contextPoolRenderingEngine.spec.ts @@ -11,7 +11,9 @@ test.beforeEach(async ({ page, context }) => { }); test.describe('Context Pool Rendering Engine', async () => { - test('should display context pool rendering engine example', async ({ page }) => { + test('should display context pool rendering engine example', async ({ + page, + }) => { const locator = page.locator('#viewportContainer'); await checkForScreenshot( page, diff --git a/tsconfig.json b/tsconfig.json index 21596cd2c1..c824c6790e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,9 @@ "@cornerstonejs/nifti-volume-loader": ["nifti-volume-loader/src"], "@cornerstonejs/ai": ["ai/src"], "@cornerstonejs/labelmap-interpolation": ["labelmap-interpolation/src"], - "@cornerstonejs/polymorphic-segmentation": ["polymorphic-segmentation/src"], + "@cornerstonejs/polymorphic-segmentation": [ + "polymorphic-segmentation/src" + ], "@cornerstonejs/adapters": ["adapters/src"] } } diff --git a/utils/assets/assetsURL.json b/utils/assets/assetsURL.json index fd928c5ef3..cfd910779c 100644 --- a/utils/assets/assetsURL.json +++ b/utils/assets/assetsURL.json @@ -7,5 +7,4 @@ "SurfaceLung16": "https://ohif-assets.s3.us-east-2.amazonaws.com/cornerstone3D/segmentation/surface/lung16.json", "SurfaceLung17": "https://ohif-assets.s3.us-east-2.amazonaws.com/cornerstone3D/segmentation/surface/lung17.json", "Labelmap": "https://ohif-assets.s3.us-east-2.amazonaws.com/cornerstone3D/segmentation/labelmap/lung/labelMap.json" - } diff --git a/version.json b/version.json index 9ad12b5ff6..95e81ac7cb 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { "version": "3.32.5", "commit": "2bf6e2d8d3b54d8e91d041bfd40ad2d3d84a5c65" -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index e28563e815..56335383f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -62,15 +62,6 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@^7.19.1": - version "7.25.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz#469cee4bd18a88ff3edbdfbd227bd20e82aa9b82" - integrity sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg== - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.1" - "@babel/generator@^7.25.0", "@babel/generator@^7.7.2": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e" @@ -1125,7 +1116,7 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/runtime@7.26.10", "@babel/runtime@^7.20.7", "@babel/runtime@^7.23.2", "@babel/runtime@^7.8.4": +"@babel/runtime@7.26.10", "@babel/runtime@^7.23.2", "@babel/runtime@^7.8.4": version "7.26.10" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.10.tgz#a07b4d8fa27af131a633d7b3524db803eb4764c2" integrity sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw== @@ -1580,6 +1571,14 @@ "@emnapi/wasi-threads" "1.0.1" tslib "^2.4.0" +"@emnapi/core@^1.4.3": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.5.tgz#bfbb0cbbbb9f96ec4e2c4fd917b7bbe5495ceccb" + integrity sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q== + dependencies: + "@emnapi/wasi-threads" "1.0.4" + tslib "^2.4.0" + "@emnapi/runtime@^1.1.0": version "1.3.1" resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" @@ -1587,6 +1586,13 @@ dependencies: tslib "^2.4.0" +"@emnapi/runtime@^1.4.3": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.5.tgz#c67710d0661070f38418b6474584f159de38aba9" + integrity sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg== + dependencies: + tslib "^2.4.0" + "@emnapi/wasi-threads@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz#d7ae71fd2166b1c916c6cd2d0df2ef565a2e1a5b" @@ -1594,6 +1600,13 @@ dependencies: tslib "^2.4.0" +"@emnapi/wasi-threads@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz#703fc094d969e273b1b71c292523b2f792862bf4" + integrity sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g== + dependencies: + tslib "^2.4.0" + "@esbuild/aix-ppc64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3" @@ -1824,38 +1837,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.2.tgz#825b4e7c89b7e7ec64c450ed494a8af7e405a84d" integrity sha512-VEfTCZicoZnZ6sGkjFPGRFFJuL2fZn2bLhsekZl1CJslflp2cJS/VoKs1jMk+3pDfsGW6CfQVUckP707HwbXeQ== -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - "@fastify/accept-negotiator@^1.0.0", "@fastify/accept-negotiator@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz#c1c66b3b771c09742a54dd5bc87c582f6b0630ff" @@ -1912,30 +1893,11 @@ fastq "^1.17.0" glob "^10.3.4" -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - "@humanwhocodes/momoa@^2.0.2": version "2.0.4" resolved "https://registry.yarnpkg.com/@humanwhocodes/momoa/-/momoa-2.0.4.tgz#8b9e7a629651d15009c3587d07a222deeb829385" integrity sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA== -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - "@hutson/parse-repository-url@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" @@ -2525,16 +2487,6 @@ source-map "~0.6.1" typescript "5.7.2" -"@microsoft/tsdoc-config@0.16.2": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz#b786bb4ead00d54f53839a458ce626c8548d3adf" - integrity sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw== - dependencies: - "@microsoft/tsdoc" "0.14.2" - ajv "~6.12.6" - jju "~1.4.0" - resolve "~1.19.0" - "@microsoft/tsdoc-config@~0.17.1": version "0.17.1" resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz#e0f0b50628f4ad7fe121ca616beacfe6a25b9335" @@ -2545,11 +2497,6 @@ jju "~1.4.0" resolve "~1.22.2" -"@microsoft/tsdoc@0.14.2": - version "0.14.2" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb" - integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== - "@microsoft/tsdoc@0.15.1", "@microsoft/tsdoc@~0.15.1": version "0.15.1" resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz#d4f6937353bc4568292654efb0a0e0532adbcba2" @@ -2637,6 +2584,15 @@ "@emnapi/runtime" "^1.1.0" "@tybys/wasm-util" "^0.9.0" +"@napi-rs/wasm-runtime@^0.2.11": + version "0.2.12" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2" + integrity sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ== + dependencies: + "@emnapi/core" "^1.4.3" + "@emnapi/runtime" "^1.4.3" + "@tybys/wasm-util" "^0.10.0" + "@netlify/binary-info@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@netlify/binary-info/-/binary-info-1.0.0.tgz#cd0d86fb783fb03e52067f0cd284865e57be86c8" @@ -2998,13 +2954,6 @@ yargs "^17.0.0" zod "^3.23.8" -"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - version "5.1.1-v1" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" - integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== - dependencies: - eslint-scope "5.1.1" - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -3018,7 +2967,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.3": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -3505,6 +3454,128 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.8.0.tgz#5aa7abb48f23f693068ed2999ae627d2f7d902ec" integrity sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w== +"@oxc-parser/binding-android-arm64@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.74.0.tgz#011237edea650491eb716cd3b5717ca989e22218" + integrity sha512-lgq8TJq22eyfojfa2jBFy2m66ckAo7iNRYDdyn9reXYA3I6Wx7tgGWVx1JAp1lO+aUiqdqP/uPlDaETL9tqRcg== + +"@oxc-parser/binding-darwin-arm64@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.74.0.tgz#7240779fcf19f671f8eab6602ec4a721fdbd6f9b" + integrity sha512-xbY/io/hkARggbpYEMFX6CwFzb7f4iS6WuBoBeZtdqRWfIEi7sm/uYWXfyVeB8uqOATvJ07WRFC2upI8PSI83g== + +"@oxc-parser/binding-darwin-x64@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.74.0.tgz#7f8caef0a2772a370bd7169113f9aca179c23236" + integrity sha512-FIj2gAGtFaW0Zk+TnGyenMUoRu1ju+kJ/h71D77xc1owOItbFZFGa+4WSVck1H8rTtceeJlK+kux+vCjGFCl9Q== + +"@oxc-parser/binding-freebsd-x64@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.74.0.tgz#aed875794b21c6b88eb8304baa24c22c28433205" + integrity sha512-W1I+g5TJg0TRRMHgEWNWsTIfe782V3QuaPgZxnfPNmDMywYdtlzllzclBgaDq6qzvZCCQc/UhvNb37KWTCTj8A== + +"@oxc-parser/binding-linux-arm-gnueabihf@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.74.0.tgz#d000011a8e9959d9a5d517371dfc79c7e93bf495" + integrity sha512-gxqkyRGApeVI8dgvJ19SYe59XASW3uVxF1YUgkE7peW/XIg5QRAOVTFKyTjI9acYuK1MF6OJHqx30cmxmZLtiQ== + +"@oxc-parser/binding-linux-arm-musleabihf@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.74.0.tgz#c3c045017845b55fb91aae89de09e6a6e5281461" + integrity sha512-jpnAUP4Fa93VdPPDzxxBguJmldj/Gpz7wTXKFzpAueqBMfZsy9KNC+0qT2uZ9HGUDMzNuKw0Se3bPCpL/gfD2Q== + +"@oxc-parser/binding-linux-arm64-gnu@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.74.0.tgz#cb13b831352231d8f7f87e1aa007c1146a4b5e58" + integrity sha512-fcWyM7BNfCkHqIf3kll8fJctbR/PseL4RnS2isD9Y3FFBhp4efGAzhDaxIUK5GK7kIcFh1P+puIRig8WJ6IMVQ== + +"@oxc-parser/binding-linux-arm64-musl@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.74.0.tgz#c7ac40e70ba656815ad53d7d33b26a870107456f" + integrity sha512-AMY30z/C77HgiRRJX7YtVUaelKq1ex0aaj28XoJu4SCezdS8i0IftUNTtGS1UzGjGZB8zQz5SFwVy4dRu4GLwg== + +"@oxc-parser/binding-linux-riscv64-gnu@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.74.0.tgz#3b8d6317803b44610ed7c6297821ca834104c303" + integrity sha512-/RZAP24TgZo4vV/01TBlzRqs0R7E6xvatww4LnmZEBBulQBU/SkypDywfriFqWuFoa61WFXPV7sLcTjJGjim/w== + +"@oxc-parser/binding-linux-s390x-gnu@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.74.0.tgz#c111ac2c83d38ce4cd40c90c2f7ad8b61dacd52d" + integrity sha512-620J1beNAlGSPBD+Msb3ptvrwxu04B8iULCH03zlf0JSLy/5sqlD6qBs0XUVkUJv1vbakUw1gfVnUQqv0UTuEg== + +"@oxc-parser/binding-linux-x64-gnu@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.74.0.tgz#a8483cf6aaa63c76dc78a478853de570411b652c" + integrity sha512-WBFgQmGtFnPNzHyLKbC1wkYGaRIBxXGofO0+hz1xrrkPgbxbJS1Ukva1EB8sPaVBBQ52Bdc2GjLSp721NWRvww== + +"@oxc-parser/binding-linux-x64-musl@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.74.0.tgz#aa933b967509f936da7b3ebc7387e53d20f1d6ed" + integrity sha512-y4mapxi0RGqlp3t6Sm+knJlAEqdKDYrEue2LlXOka/F2i4sRN0XhEMPiSOB3ppHmvK4I2zY2XBYTsX1Fel0fAg== + +"@oxc-parser/binding-wasm32-wasi@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.74.0.tgz#f610be484451235419fc14837c5c2c5c127a5b2b" + integrity sha512-yDS9bRDh5ymobiS2xBmjlrGdUuU61IZoJBaJC5fELdYT5LJNBXlbr3Yc6m2PWfRJwkH6Aq5fRvxAZ4wCbkGa8w== + dependencies: + "@napi-rs/wasm-runtime" "^0.2.11" + +"@oxc-parser/binding-win32-arm64-msvc@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.74.0.tgz#84daac72cb58d51f5cc83dd41f4faae430f83e55" + integrity sha512-XFWY52Rfb4N5wEbMCTSBMxRkDLGbAI9CBSL24BIDywwDJMl31gHEVlmHdCDRoXAmanCI6gwbXYTrWe0HvXJ7Aw== + +"@oxc-parser/binding-win32-x64-msvc@0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.74.0.tgz#ff6f9f711b28e7042d0c84937ae28aa9ee4d10a0" + integrity sha512-1D3x6iU2apLyfTQHygbdaNbX3nZaHu4yaXpD7ilYpoLo7f0MX0tUuoDrqJyJrVGqvyXgc0uz4yXz9tH9ZZhvvg== + +"@oxc-project/types@^0.74.0": + version "0.74.0" + resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.74.0.tgz#3e4e997ec22fd7dac3fd05dd2edf2fca143e253a" + integrity sha512-KOw/RZrVlHGhCXh1RufBFF7Nuo7HdY5w1lRJukM/igIl6x9qtz8QycDvZdzb4qnHO7znrPyo2sJrFJK2eKHgfQ== + +"@oxlint/darwin-arm64@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@oxlint/darwin-arm64/-/darwin-arm64-1.9.0.tgz#5a772911f6d9dd56231be5cf4beb3db8a0bdb918" + integrity sha512-VRxI/T0I4bq+xoaI0qNFeGPxOOganHlfLmx8JbFFZswoxMkm5lIvVYScDKLrsbbPSe4bcZ5v1DmX5sNGQ619Uw== + +"@oxlint/darwin-x64@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@oxlint/darwin-x64/-/darwin-x64-1.9.0.tgz#fb917ece591b28c8dacf689daa2e9b5e173252bf" + integrity sha512-vMBa3eNrJMSBApXvsx6FgMuWCnNE+ETJJieLPhemZKctMNWOJQX+2i09CG2kb1IkmxagLapH7dZ4i0+Lf13mqg== + +"@oxlint/linux-arm64-gnu@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@oxlint/linux-arm64-gnu/-/linux-arm64-gnu-1.9.0.tgz#d0f5064dc260eef30c72cfc01db57f68472cc599" + integrity sha512-8wnMjloRbz7hPKvcgqd8HKNgkEgFJZvp9Los2pdE1CKh33msIxIXPGT3KKhYzyrtBaRaG2LJHshUPub02Q+x9A== + +"@oxlint/linux-arm64-musl@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@oxlint/linux-arm64-musl/-/linux-arm64-musl-1.9.0.tgz#5f79d284fb1000cd57b58258cccd3271c3ec8156" + integrity sha512-elj9FTNXvq9oP8UedeHHq2R8lCtTmBGvUO/xLez734zVx3tvBl3avmuEfPBqR4wlUKDANExDh3Rg0pssflhw9w== + +"@oxlint/linux-x64-gnu@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@oxlint/linux-x64-gnu/-/linux-x64-gnu-1.9.0.tgz#bd6da8a5602498d71781f6fe9104e678ba4ead92" + integrity sha512-d7VjQttKDgXKIYY3tm2GXTD83dyI+D8POGdPRT8GjhitHKasHQWFMBDG5iLp60FNc5Ky1cIe/2nwKW9ReQvhKw== + +"@oxlint/linux-x64-musl@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@oxlint/linux-x64-musl/-/linux-x64-musl-1.9.0.tgz#d4ba804d9fabbcf6742cb84f0d16ee72eb228ef6" + integrity sha512-R9vi5LGxNNi3pisp4dG7Ez00mAvCeki8VI5DUg6W1MR0GTnaejlVtMflziA2jqpdTGOK4bjLDsHKIadGC1SMVg== + +"@oxlint/win32-arm64@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@oxlint/win32-arm64/-/win32-arm64-1.9.0.tgz#01c051ddeba05596dfac61dd8a7addaa57bf1bf9" + integrity sha512-TiV7xYBMhkc/r0X+c9cMwGKUWYJRlWnI61m8powqer6lMJ8VfDe1RkRF4ttO5wlPGkiBwBa3vYWAgxaXc9JAMQ== + +"@oxlint/win32-x64@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@oxlint/win32-x64/-/win32-x64-1.9.0.tgz#9a41059ea95262592fdf19060e3b132999e863bc" + integrity sha512-OWqqkXsLrpS1uQsxjNqiOkC9a/CszMLa3VwlRcpm/z3iPxEL/qEVjGfjZX6XZw8Q6YukFB77rgYqzotvtCvI1A== + "@parcel/watcher-android-arm64@2.4.1": version "2.4.1" resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84" @@ -3653,6 +3724,13 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== +"@prettier/plugin-oxc@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@prettier/plugin-oxc/-/plugin-oxc-0.0.4.tgz#17fd31c29f3b4df604db6119820f3e75cd5677b7" + integrity sha512-UGXe+g/rSRbglL0FOJiar+a+nUrst7KaFmsg05wYbKiInGWP6eAj/f8A2Uobgo5KxEtb2X10zeflNH6RK2xeIQ== + dependencies: + oxc-parser "0.74.0" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -4127,6 +4205,13 @@ "@tufjs/canonical-json" "2.0.0" minimatch "^9.0.4" +"@tybys/wasm-util@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.0.tgz#2fd3cd754b94b378734ce17058d0507c45c88369" + integrity sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ== + dependencies: + tslib "^2.4.0" + "@tybys/wasm-util@^0.9.0": version "0.9.0" resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz#3e75eb00604c8d6db470bf18c37b7d984a0e3355" @@ -4245,14 +4330,6 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/eslint@^8.56.10": - version "8.56.11" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.11.tgz#e2ff61510a3b9454b3329fe7731e3b4c6f780041" - integrity sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - "@types/estree@*", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" @@ -4368,11 +4445,6 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - "@types/karma@^6.3.3": version "6.3.8" resolved "https://registry.yarnpkg.com/@types/karma/-/karma-6.3.8.tgz#06cb3ecddabece81eb43a1087a8f01adecf64645" @@ -4616,74 +4688,11 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.1.0.tgz#3c020deeaaba82a6f741d00dacf172c53be4911f" - integrity sha512-LlNBaHFCEBPHyD4pZXb35mzjGkuGKXU5eeCA1SxvHfiRES0E82dOounfVpL4DCqYvJEKab0bZIA0gCRpdLKkCw== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.1.0" - "@typescript-eslint/type-utils" "8.1.0" - "@typescript-eslint/utils" "8.1.0" - "@typescript-eslint/visitor-keys" "8.1.0" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/parser@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.1.0.tgz#b7e77f5fa212df59eba51ecd4986f194bccc2303" - integrity sha512-U7iTAtGgJk6DPX9wIWPPOlt1gO57097G06gIcl0N0EEnNw8RGD62c+2/DiP/zL7KrkqnnqF7gtFGR7YgzPllTA== - dependencies: - "@typescript-eslint/scope-manager" "8.1.0" - "@typescript-eslint/types" "8.1.0" - "@typescript-eslint/typescript-estree" "8.1.0" - "@typescript-eslint/visitor-keys" "8.1.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.1.0.tgz#dd8987d2efebb71d230a1c71d82e84a7aead5c3d" - integrity sha512-DsuOZQji687sQUjm4N6c9xABJa7fjvfIdjqpSIIVOgaENf2jFXiM9hIBZOL3hb6DHK9Nvd2d7zZnoMLf9e0OtQ== - dependencies: - "@typescript-eslint/types" "8.1.0" - "@typescript-eslint/visitor-keys" "8.1.0" - -"@typescript-eslint/type-utils@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.1.0.tgz#dbf5a4308166dfc37a36305390dea04a3a3b5048" - integrity sha512-oLYvTxljVvsMnldfl6jIKxTaU7ok7km0KDrwOt1RHYu6nxlhN3TIx8k5Q52L6wR33nOwDgM7VwW1fT1qMNfFIA== - dependencies: - "@typescript-eslint/typescript-estree" "8.1.0" - "@typescript-eslint/utils" "8.1.0" - debug "^4.3.4" - ts-api-utils "^1.3.0" - "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.1.0.tgz#fbf1eaa668a7e444ac507732ca9d3c3468e5db9c" - integrity sha512-q2/Bxa0gMOu/2/AKALI0tCKbG2zppccnRIRCW6BaaTlRVaPKft4oVYPp7WOPpcnsgbr0qROAVCVKCvIQ0tbWog== - -"@typescript-eslint/typescript-estree@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.1.0.tgz#c44e5667683c0bb5caa43192e27de6a994f4e4c4" - integrity sha512-NTHhmufocEkMiAord/g++gWKb0Fr34e9AExBRdqgWdVBaKoei2dIyYKD9Q0jBnvfbEA5zaf8plUFMUH6kQ0vGg== - dependencies: - "@typescript-eslint/types" "8.1.0" - "@typescript-eslint/visitor-keys" "8.1.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - "@typescript-eslint/typescript-estree@^5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" @@ -4697,16 +4706,6 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.1.0.tgz#a922985a43d2560ce0d293be79148fa80c1325e0" - integrity sha512-ypRueFNKTIFwqPeJBfeIpxZ895PQhNyH4YID6js0UoBImWYoSjBsahUn9KMiJXh94uOjVBgHD9AmkyPsPnFwJA== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.1.0" - "@typescript-eslint/types" "8.1.0" - "@typescript-eslint/typescript-estree" "8.1.0" - "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" @@ -4715,15 +4714,7 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.1.0.tgz#ab2b3a9699a8ddebf0c205e133f114c1fed9daad" - integrity sha512-ba0lNI19awqZ5ZNKh6wCModMwoZs457StTebQ0q1NP58zSi2F6MOZRXwfKZy+jB78JNJ/WH8GSh2IQNzXX8Nag== - dependencies: - "@typescript-eslint/types" "8.1.0" - eslint-visitor-keys "^3.4.3" - -"@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": +"@ungap/structured-clone@^1.0.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== @@ -5075,7 +5066,7 @@ acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.1.1: dependencies: acorn "^8.11.0" -acorn@^8.0.4, acorn@^8.1.0, acorn@^8.11.0, acorn@^8.11.3, acorn@^8.4.1, acorn@^8.6.0, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.0.4, acorn@^8.1.0, acorn@^8.11.0, acorn@^8.11.3, acorn@^8.4.1, acorn@^8.6.0, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2: version "8.12.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -5161,7 +5152,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@~6.12.6: +ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -5390,21 +5381,6 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.1.3: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - array-differ@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" @@ -5420,18 +5396,6 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.6, array-includes@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - array-timsort@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" @@ -5454,52 +5418,6 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -5542,11 +5460,6 @@ ast-module-types@^5.0.0: resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-5.0.0.tgz#32b2b05c56067ff38e95df66f11d6afd6c9ba16b" integrity sha512-JvqziE0Wc0rXQfma0HZC/aY7URXHFuZV84fJRtP8u+lhp0JYCNd5wJzVXP45t0PH0Mej3ynlzvdyITYIu0G4LQ== -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== - astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" @@ -5589,13 +5502,6 @@ autoprefixer@^10.4.14: picocolors "^1.0.1" postcss-value-parser "^4.2.0" -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - avvio@^8.3.0: version "8.4.0" resolved "https://registry.yarnpkg.com/avvio/-/avvio-8.4.0.tgz#7cbd5bca74f0c9effa944ced601f94ffd8afc5ed" @@ -5614,11 +5520,6 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.1.tgz#bb5f8b8a20739f6ae1caeaf7eea2c7913df8048e" integrity sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA== -axe-core@^4.6.2: - version "4.10.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.0.tgz#d9e56ab0147278272739a000880196cdfe113b59" - integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g== - axios@^1.4.0, axios@^1.6.2, axios@^1.7.4: version "1.8.2" resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.2.tgz#fabe06e241dfe83071d4edfbcaa7b1c3a40f7979" @@ -5628,11 +5529,6 @@ axios@^1.4.0, axios@^1.6.2, axios@^1.7.4: form-data "^4.0.0" proxy-from-env "^1.1.0" -axobject-query@^3.1.1: - version "3.2.4" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.4.tgz#6dfba930294ea14d7d2fc68b9d007211baedb94c" - integrity sha512-aPTElBrbifBU1krmZxGZOlBkslORe7Ll7+BDnI50Wy4LgOt69luMgevkDfTq1O/ZgprooPCtWpjCwKSZw/iZ4A== - b4a@^1.6.4: version "1.6.6" resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" @@ -6207,7 +6103,7 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: +call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -7247,7 +7143,7 @@ cross-fetch@3.1.5: dependencies: node-fetch "2.6.7" -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.6: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -7518,11 +7414,6 @@ d3-scale@4.0.2: dependencies: d3-array "2 - 3" -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" @@ -7549,33 +7440,6 @@ data-urls@^3.0.2: whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - date-format@^4.0.14: version "4.0.14" resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" @@ -7631,7 +7495,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.3.6, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: +debug@4, debug@4.3.6, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.3.5, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: version "4.3.6" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== @@ -7645,13 +7509,6 @@ debug@4.3.4: dependencies: ms "2.1.2" -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - decache@4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/decache/-/decache-4.6.2.tgz#c1df1325a2f36d53922e08f33380f083148199cd" @@ -7767,11 +7624,6 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - deepmerge@^4.2.2: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" @@ -7853,7 +7705,7 @@ define-lazy-prop@^3.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.1.3: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -7905,7 +7757,7 @@ deprecation@^2.0.0: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== -dequal@^2.0.0, dequal@^2.0.3: +dequal@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== @@ -8094,20 +7946,6 @@ docdash@^1.2.0: resolved "https://registry.yarnpkg.com/docdash/-/docdash-1.2.0.tgz#f99dde5b8a89aa4ed083a3150383e042d06c7f49" integrity sha512-IYZbgYthPTspgqYeciRJNPhSwL51yer7HAwDXhF5p+H7mTDbPvY3PCk/QDjNxdPCpWkaJVFC4t7iCNB/t9E5Kw== -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -8377,7 +8215,7 @@ engine.io@~6.5.2: engine.io-parser "~5.2.1" ws "~8.17.1" -enhanced-resolve@^5.0.0, enhanced-resolve@^5.12.0, enhanced-resolve@^5.13.0: +enhanced-resolve@^5.0.0, enhanced-resolve@^5.13.0: version "5.17.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== @@ -8453,58 +8291,6 @@ error-stack-parser@^2.0.2, error-stack-parser@^2.0.3: dependencies: stackframe "^1.3.4" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" @@ -8512,7 +8298,7 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== @@ -8522,38 +8308,6 @@ es-module-lexer@^1.0.0, es-module-lexer@^1.2.1: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - es6-error@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" @@ -8673,100 +8427,6 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@8.10.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" - integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-import-resolver-typescript@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - fast-glob "^3.3.1" - get-tsconfig "^4.5.0" - is-core-module "^2.11.0" - is-glob "^4.0.3" - -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-jsx-a11y@6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" - integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== - dependencies: - "@babel/runtime" "^7.20.7" - aria-query "^5.1.3" - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - ast-types-flow "^0.0.7" - axe-core "^4.6.2" - axobject-query "^3.1.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - has "^1.0.3" - jsx-ast-utils "^3.3.3" - language-tags "=1.0.5" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - semver "^6.3.0" - -eslint-plugin-prettier@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-tsdoc@^0.2.17: - version "0.2.17" - resolved "https://registry.yarnpkg.com/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz#27789495bbd8778abbf92db1707fec2ed3dfe281" - integrity sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA== - dependencies: - "@microsoft/tsdoc" "0.14.2" - "@microsoft/tsdoc-config" "0.16.2" - eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -8775,100 +8435,16 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.3.0: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-webpack-plugin@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-4.2.0.tgz#41f54b25379908eb9eca8645bc997c90cfdbd34e" - integrity sha512-rsfpFQ01AWQbqtjgPRr2usVRxhWDuG0YDYcG8DJOteD3EFnpeuYuOwk0PQiN7PRBTqS6ElNdtPZPggj8If9WnA== - dependencies: - "@types/eslint" "^8.56.10" - jest-worker "^29.7.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - schema-utils "^4.2.0" - -eslint@^8.39.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -8881,7 +8457,7 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -9180,7 +8756,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2, fast-diff@^1.2.0: +fast-diff@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== @@ -9224,11 +8800,6 @@ fast-json-stringify@^5.7.0, fast-json-stringify@^5.8.0: json-schema-ref-resolver "^1.0.1" rfdc "^1.2.0" -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - fast-querystring@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.2.tgz#a6d24937b4fc6f791b4ee31dcb6f53aeafb89f53" @@ -9385,13 +8956,6 @@ figures@^5.0.0: escape-string-regexp "^5.0.0" is-unicode-supported "^1.2.0" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - file-entry-cache@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-7.0.2.tgz#2d61bb70ba89b9548e3035b7c9173fe91deafff0" @@ -9588,7 +9152,7 @@ find-up@^6.0.0, find-up@^6.3.0: locate-path "^7.1.0" path-exists "^5.0.0" -flat-cache@^3.0.4, flat-cache@^3.2.0: +flat-cache@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== @@ -9637,13 +9201,6 @@ follow-redirects@^1.0.0, follow-redirects@^1.15.2, follow-redirects@^1.15.6: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - foreground-child@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" @@ -9840,21 +9397,6 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - fuzzy@0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/fuzzy/-/fuzzy-0.1.3.tgz#4c76ec2ff0ac1a36a9dccf9a00df8623078d4ed8" @@ -9912,7 +9454,7 @@ get-east-asian-width@^1.0.0: resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -9993,22 +9535,6 @@ get-stream@^8.0.1: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -get-tsconfig@^4.5.0: - version "4.7.6" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.6.tgz#118fd5b7b9bae234cc7705a00cd771d7eb65d62a" - integrity sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA== - dependencies: - resolve-pkg-maps "^1.0.0" - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -10094,7 +9620,7 @@ gl-matrix@3.4.3, gl-matrix@^3.1.0, gl-matrix@^3.4.3: resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== -glob-parent@6.0.2, glob-parent@^6.0.1, glob-parent@^6.0.2: +glob-parent@6.0.2, glob-parent@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -10194,13 +9720,6 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - globalthis@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" @@ -10208,14 +9727,6 @@ globalthis@1.0.3: dependencies: define-properties "^1.1.3" -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - globby@11.1.0, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -10296,11 +9807,6 @@ graceful-fs@4.2.11, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.1 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - guid-typescript@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" @@ -10372,11 +9878,6 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -10399,33 +9900,21 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1, has-proto@^1.0.3: +has-proto@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== -has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - has-unicode@2.0.1, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -has@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - hasbin@1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/hasbin/-/hasbin-1.2.3.tgz#78c5926893c80215c2b568ae1fd3fcab7a2696b0" @@ -10441,7 +9930,7 @@ hasha@5.2.2, hasha@^5.0.0: is-stream "^2.0.0" type-fest "^0.8.0" -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: +hasown@^2.0.0, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -10734,10 +10223,10 @@ human-signals@^5.0.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== -husky@^9.1.4: - version "9.1.4" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.4.tgz#926fd19c18d345add5eab0a42b2b6d9a80259b34" - integrity sha512-bho94YyReb4JV7LYWRWxZ/xr6TtOTt8cMfmQ39MQYJ7f/YE268s3GdghGwi+y4zAeqewE5zYLvuhV0M0ijsDEA== +husky@^9.1.7: + version "9.1.7" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" + integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== hyperdyperid@^1.2.0: version "1.2.0" @@ -10775,7 +10264,7 @@ ignore-walk@^6.0.4: dependencies: minimatch "^9.0.0" -ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: +ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== @@ -10792,7 +10281,7 @@ image-type@^4.1: dependencies: file-type "^10.10.0" -import-fresh@^3.2.1, import-fresh@^3.3.0: +import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -10958,15 +10447,6 @@ interface-store@^6.0.0: resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-6.0.2.tgz#1746a1ee07634f7678b3aa778738b79e3f75c909" integrity sha512-KSFCXtBlNoG0hzwNa0RmhHtrdhzexp+S+UY2s0rWTBJyfdEIgn6i6Zl9otVqrcFYbYrneBT7hbmHQ8gE0C3umA== -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - "internmap@1 - 2": version "2.0.3" resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" @@ -11079,14 +10559,6 @@ iron-webcrypto@^1.1.1: resolved "https://registry.yarnpkg.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz#aa60ff2aa10550630f4c0b11fd2442becdb35a6f" integrity sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg== -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -11097,13 +10569,6 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -11111,14 +10576,6 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-buffer@^1.0.2: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -11131,11 +10588,6 @@ is-builtin-module@^3.1.0, is-builtin-module@^3.2.1: dependencies: builtin-modules "^3.3.0" -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - is-ci@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" @@ -11143,27 +10595,13 @@ is-ci@3.0.1: dependencies: ci-info "^3.2.0" -is-core-module@^2.1.0, is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0, is-core-module@^2.8.1: +is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1: version "2.15.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== dependencies: hasown "^2.0.2" -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - is-docker@3.0.0, is-docker@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" @@ -11206,7 +10644,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -11258,11 +10696,6 @@ is-natural-number@^4.0.1: resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" integrity sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ== -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - is-network-error@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.1.0.tgz#d26a760e3770226d11c169052f266a4803d9c997" @@ -11273,13 +10706,6 @@ is-npm@^6.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -11309,7 +10735,7 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-path-inside@^3.0.2, is-path-inside@^3.0.3: +is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -11356,21 +10782,6 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - is-ssh@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" @@ -11403,20 +10814,6 @@ is-stream@^3.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" @@ -11424,13 +10821,6 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -11461,13 +10851,6 @@ is-url@^1.2.4: resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -11494,11 +10877,6 @@ is64bit@^2.0.0: dependencies: system-architecture "^0.1.0" -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -12350,11 +11728,6 @@ json-schema@0.4.0: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - json-stringify-nice@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" @@ -12370,7 +11743,7 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^1.0.1, json5@^1.0.2: +json5@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== @@ -12444,16 +11817,6 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -jsx-ast-utils@^3.3.3: - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - junk@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/junk/-/junk-4.0.1.tgz#7ee31f876388c05177fe36529ee714b07b50fbed" @@ -12633,18 +11996,6 @@ lambda-local@2.2.0: dotenv "^16.3.1" winston "^3.10.0" -language-subtag-registry@~0.3.2: - version "0.3.23" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" - integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== - -language-tags@=1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== - dependencies: - language-subtag-registry "~0.3.2" - latest-version@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" @@ -12782,14 +12133,6 @@ leven@^3.1.0, "leven@^3.1.0 < 4": resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - libnpmaccess@8.0.6: version "8.0.6" resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-8.0.6.tgz#73be4c236258babc0a0bca6d3b6a93a6adf937cf" @@ -13066,11 +12409,6 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - lodash.once@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" @@ -13714,7 +13052,7 @@ minimatch@9.0.3: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -14656,53 +13994,6 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.6: - version "1.1.8" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" - integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -object.fromentries@^2.0.6, object.fromentries@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.1.6, object.values@^1.1.7: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -14882,18 +14173,6 @@ opener@^1.5.2: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - ora@5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" @@ -14951,6 +14230,43 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +oxc-parser@0.74.0: + version "0.74.0" + resolved "https://registry.yarnpkg.com/oxc-parser/-/oxc-parser-0.74.0.tgz#309e406adb3d2e6ceae4695c4255d379ec70229d" + integrity sha512-2tDN/ttU8WE6oFh8EzKNam7KE7ZXSG5uXmvX85iNzxdJfMssDWcj3gpYzZi1E04XuE7m3v1dVWl/8BE886vPGw== + dependencies: + "@oxc-project/types" "^0.74.0" + optionalDependencies: + "@oxc-parser/binding-android-arm64" "0.74.0" + "@oxc-parser/binding-darwin-arm64" "0.74.0" + "@oxc-parser/binding-darwin-x64" "0.74.0" + "@oxc-parser/binding-freebsd-x64" "0.74.0" + "@oxc-parser/binding-linux-arm-gnueabihf" "0.74.0" + "@oxc-parser/binding-linux-arm-musleabihf" "0.74.0" + "@oxc-parser/binding-linux-arm64-gnu" "0.74.0" + "@oxc-parser/binding-linux-arm64-musl" "0.74.0" + "@oxc-parser/binding-linux-riscv64-gnu" "0.74.0" + "@oxc-parser/binding-linux-s390x-gnu" "0.74.0" + "@oxc-parser/binding-linux-x64-gnu" "0.74.0" + "@oxc-parser/binding-linux-x64-musl" "0.74.0" + "@oxc-parser/binding-wasm32-wasi" "0.74.0" + "@oxc-parser/binding-win32-arm64-msvc" "0.74.0" + "@oxc-parser/binding-win32-x64-msvc" "0.74.0" + +oxlint@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/oxlint/-/oxlint-1.9.0.tgz#688504678127c546e14ac84407bace079b8f02a7" + integrity sha512-vvqpkRt7UA1F1DoOJGYO2+T52L6jV4RxS+9hFVCPQ0X+hcNVtbl/TxQuwjobBw8Yw2U8Rb9d8VLJxa8eRSqpQQ== + optionalDependencies: + "@oxlint/darwin-arm64" "1.9.0" + "@oxlint/darwin-x64" "1.9.0" + "@oxlint/linux-arm64-gnu" "1.9.0" + "@oxlint/linux-arm64-musl" "1.9.0" + "@oxlint/linux-x64-gnu" "1.9.0" + "@oxlint/linux-x64-musl" "1.9.0" + "@oxlint/win32-arm64" "1.9.0" + "@oxlint/win32-x64" "1.9.0" + p-cancelable@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" @@ -15419,7 +14735,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -15626,11 +14942,6 @@ playwright@1.51.1: optionalDependencies: fsevents "2.3.2" -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - postcss-attribute-case-insensitive@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-6.0.3.tgz#d118023911a768dfccfc0b0147f5ff06d8485806" @@ -16204,18 +15515,6 @@ precond@0.2: resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ== -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - prettier@2.8.8: version "2.8.8" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" @@ -16850,16 +16149,6 @@ regex@^4.3.2: resolved "https://registry.yarnpkg.com/regex/-/regex-4.3.3.tgz#8cda73ccbdfa7c5691881d02f9bb142dba9daa6a" integrity sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg== -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - regexpu-core@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" @@ -17013,11 +16302,6 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - resolve-protobuf-schema@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" @@ -17030,7 +16314,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4, resolve@~1.22.1, resolve@~1.22.2: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@~1.22.1, resolve@~1.22.2: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -17048,14 +16332,6 @@ resolve@^2.0.0-next.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@~1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== - dependencies: - is-core-module "^2.1.0" - path-parse "^1.0.6" - responselike@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" @@ -17205,16 +16481,6 @@ sade@^1.8.1: dependencies: mri "^1.1.0" -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -17230,15 +16496,6 @@ safe-json-stringify@^1.2.0: resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - safe-regex2@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/safe-regex2/-/safe-regex2-3.1.0.tgz#fd7ec23908e2c730e1ce7359a5b72883a87d2763" @@ -17338,7 +16595,7 @@ semver-diff@^4.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.6.3, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: +semver@7.6.3, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -17455,16 +16712,6 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -set-function-name@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - setimmediate@~1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -18033,7 +17280,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -18068,34 +17324,6 @@ string-width@^7.0.0: get-east-asian-width "^1.0.0" strip-ansi "^7.1.0" -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -18118,7 +17346,7 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -18144,6 +17372,13 @@ strip-ansi@^5.1.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.0, strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -18550,11 +17785,6 @@ text-hex@1.0.x: resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - thingies@^1.20.0: version "1.21.0" resolved "https://registry.yarnpkg.com/thingies/-/thingies-1.21.0.tgz#e80fbe58fd6fdaaab8fad9b67bd0a5c943c445c1" @@ -18772,11 +18002,6 @@ triple-beam@^1.3.0: resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== -ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - ts-loader@9.5.1: version "9.5.1" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.1.tgz#63d5912a86312f1fbe32cef0859fb8b2193d9b89" @@ -18807,16 +18032,6 @@ ts-node@^10.9.1, ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - tsconfig-paths@^4.1.2: version "4.2.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" @@ -18869,13 +18084,6 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -18891,11 +18099,6 @@ type-fest@^0.18.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -18944,50 +18147,6 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - typed-function@^4.1.1: version "4.2.1" resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-4.2.1.tgz#19aa51847aa2dea9ef5e7fb7641c060179a74426" @@ -19097,16 +18256,6 @@ ulid@2.3.0: resolved "https://registry.yarnpkg.com/ulid/-/ulid-2.3.0.tgz#93063522771a9774121a84d126ecd3eb9804071f" integrity sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw== -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - unbzip2-stream@1.4.3, unbzip2-stream@^1.0.9, unbzip2-stream@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" @@ -19844,33 +18993,11 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - which-module@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - which@^1.2.1, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -19944,11 +19071,6 @@ winston@^3.10.0: triple-beam "^1.3.0" winston-transport "^4.7.0" -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -19967,7 +19089,7 @@ workerpool@^6.5.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -19985,6 +19107,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 26be31235dee7e3d24a84ef66c9b2d313e391656 Mon Sep 17 00:00:00 2001 From: Alireza Date: Mon, 4 Aug 2025 22:53:52 -0400 Subject: [PATCH 147/212] chore: fix tests to publish docs (#2247) --- .github/workflows/docusaurus-build.yml | 67 +++++++++++++++++++ .github/workflows/format-check.yml | 8 +-- .gitignore | 2 +- .../src/adapters/helpers/toScoordType.ts | 2 +- packages/docs/bun.lock | 24 +++---- packages/docs/docusaurus.config.js | 2 + packages/docs/package.json | 1 + 7 files changed, 87 insertions(+), 19 deletions(-) create mode 100644 .github/workflows/docusaurus-build.yml diff --git a/.github/workflows/docusaurus-build.yml b/.github/workflows/docusaurus-build.yml new file mode 100644 index 0000000000..c9475477f0 --- /dev/null +++ b/.github/workflows/docusaurus-build.yml @@ -0,0 +1,67 @@ +name: Docusaurus Build + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + ACTIONS_STEP_DEBUG: true + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + docusaurus-build: + timeout-minutes: 30 + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20.18.1' + cache: 'npm' + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install root dependencies + run: bun install --frozen-lockfile + + - name: reset nx cache + run: rm -rf .nx/cache + + - name: reset nx cache + run: bun nx reset + + - name: Build packages in ESM format + run: bun run build:esm + env: + NX_CACHE_DIRECTORY: ${{ runner.temp }}/nx-cache + NX_DAEMON: false + + - name: Install docs dependencies + run: cd packages/docs && bun install + + - name: Build Docusaurus documentation + run: cd packages/docs && bun run build:ci + env: + NODE_OPTIONS: --max_old_space_size=32384 + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + if: always() + with: + name: docusaurus-build-${{ github.sha }} + path: packages/docs/build/ + retention-days: 7 diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml index 9d61bb3c8f..22411a3351 100644 --- a/.github/workflows/format-check.yml +++ b/.github/workflows/format-check.yml @@ -33,10 +33,8 @@ jobs: - name: Install dependencies run: bun install - - name: Build dependencies - run: bun run build:esm + - name: Run lint + run: bun run lint - name: Run format check - run: bun run lint - env: - NODE_OPTIONS: --max_old_space_size=32896 + run: bun run format-check diff --git a/.gitignore b/.gitignore index 954af29d70..1ec3097c4b 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,6 @@ coverage/ .cursor **/.claude/settings.local.json - +CLAUDE.md # External repositories vtk-js/ diff --git a/packages/adapters/src/adapters/helpers/toScoordType.ts b/packages/adapters/src/adapters/helpers/toScoordType.ts index f85f3b3924..858416fddf 100644 --- a/packages/adapters/src/adapters/helpers/toScoordType.ts +++ b/packages/adapters/src/adapters/helpers/toScoordType.ts @@ -5,7 +5,7 @@ const { worldToImageCoords: globalWorldToImageCoords } = utilities; let useWorldToImageCoords = globalWorldToImageCoords; /** - * Converts a Point2 or a Point3 into a SCOORD { x,y, z? } point. + * Converts a Point2 or a Point3 into a SCOORD object x,y, and optional z. */ export function toScoord({ is3DMeasurement, referencedImageId }, point) { if (is3DMeasurement) { diff --git a/packages/docs/bun.lock b/packages/docs/bun.lock index d8fc65d301..065142a7e8 100644 --- a/packages/docs/bun.lock +++ b/packages/docs/bun.lock @@ -4,11 +4,11 @@ "": { "name": "docs", "dependencies": { - "@cornerstonejs/adapters": "^3.30.0", - "@cornerstonejs/core": "^3.30.0", - "@cornerstonejs/dicom-image-loader": "^3.30.0", - "@cornerstonejs/nifti-volume-loader": "^3.30.0", - "@cornerstonejs/tools": "^3.30.0", + "@cornerstonejs/adapters": "^3.32.5", + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/dicom-image-loader": "^3.32.5", + "@cornerstonejs/nifti-volume-loader": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", @@ -19,7 +19,7 @@ "@svgr/webpack": "^8.1.0", "clsx": "^1.1.1", "cross-env": "^7.0.3", - "dcmjs": "^0.42.0", + "dcmjs": "^0.43.1", "dicom-parser": "^1.8.21", "dicomweb-client": "0.10.4", "docusaurus-plugin-copy": "0.1.1", @@ -309,7 +309,7 @@ "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="], - "@cornerstonejs/adapters": ["@cornerstonejs/adapters@3.30.0", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.42.0", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "^3.30.0", "@cornerstonejs/tools": "^3.30.0" } }, "sha512-QC9LTsHjjD/R1IPWWNFm+Gyz78PJvqZ2AKlq1CD0yD7t3KD3McKVYQJqZC2JlcC6gw6RcmACPCOuNhL7L0EifA=="], + "@cornerstonejs/adapters": ["@cornerstonejs/adapters@3.32.5", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.43.1", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.5", "@cornerstonejs/tools": "^3.32.5" } }, "sha512-tpd+sHjE54VOqme83HZ9XqGKztjikrwbrWR4M3e8X+fuR6LJ+qNQ6+YkPdfThzu0KxN+q8mO5aSvGyJo82rRnA=="], "@cornerstonejs/codec-charls": ["@cornerstonejs/codec-charls@1.2.3", "", {}, "sha512-qKUe6DN0dnGzhhfZLYhH9UZacMcudjxcaLXCrpxJImT/M/PQvZCT2rllu6VGJbWKJWG+dMVV2zmmleZcdJ7/cA=="], @@ -319,13 +319,13 @@ "@cornerstonejs/codec-openjph": ["@cornerstonejs/codec-openjph@2.4.7", "", {}, "sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w=="], - "@cornerstonejs/core": ["@cornerstonejs/core@3.30.0", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", "gl-matrix": "^3.4.3", "loglevel": "^1.9.2" } }, "sha512-oMVNyZYmYVNgynaUl3JKyYaN0dDzD4spY18dWJd0aLVLnVzxJydx6+8bWO78wYSb+/s5jfRQeTPaJCe4UGqVPA=="], + "@cornerstonejs/core": ["@cornerstonejs/core@3.32.5", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", "gl-matrix": "^3.4.3", "loglevel": "^1.9.2" } }, "sha512-6m/ODfSyM+8/ZigD2wM2wl8yjxmDx9DTen/R5nxCHUe4sqK97PKjfmcN5OK9cOCzwlzqQBZTFow1Ra6UAfkKCA=="], - "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@3.30.0", "", { "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", "comlink": "^4.4.1", "dicom-parser": "^1.8.9", "jpeg-lossless-decoder-js": "^2.1.0", "pako": "^2.0.4", "uuid": "^9.0.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.30.0" } }, "sha512-DOM3rdTt9GnxcWfT2f7vE8l8pR6MByKKG23aWCJLjqCwTkG5YAK/Lh0ROgCSbl/B3PzB01JpjjjacgyPOM4VUQ=="], + "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@3.32.5", "", { "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", "comlink": "^4.4.1", "dicom-parser": "^1.8.9", "jpeg-lossless-decoder-js": "^2.1.0", "pako": "^2.0.4", "uuid": "^9.0.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.5" } }, "sha512-fOUkphjdzTG8Flw0XV4bGUEZtbASeE2/Y+HssKr4PiwiDvGcVvVQF7RxyKkvabP3OsZIAaBOhPB8ghKEEXDp2w=="], - "@cornerstonejs/nifti-volume-loader": ["@cornerstonejs/nifti-volume-loader@3.30.0", "", { "dependencies": { "nifti-reader-js": "^0.6.8" }, "peerDependencies": { "@cornerstonejs/core": "^3.30.0" } }, "sha512-JDl5n0K4j7fqv1gLQuQzpclXfPJzG8C2tb99KwXBezPqkB53ppn3F9S/QNhrPFeFbbQFMUDGmEUaxdlisuzl/w=="], + "@cornerstonejs/nifti-volume-loader": ["@cornerstonejs/nifti-volume-loader@3.32.5", "", { "dependencies": { "nifti-reader-js": "^0.6.8" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.5" } }, "sha512-Lf+CC4ZjsEHEQjo7lxuYjffexyImP4SDy6m/rnU5le1KP5bC+ucF4Sduy0sC3aEPHfSumJJISQ9HI9oDwxyONQ=="], - "@cornerstonejs/tools": ["@cornerstonejs/tools@3.30.0", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "^3.30.0", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", "d3-array": "^3.2.3", "d3-interpolate": "^3.0.1", "gl-matrix": "^3.4.3" } }, "sha512-tpuEySlLsOJ8M9i3d4W6diauSG1ayC3yb7CiYWeQQjoujsBM2dYtAmnUXWe/P4jAkDWj/RUAzRL/ib0t1WLlXw=="], + "@cornerstonejs/tools": ["@cornerstonejs/tools@3.32.5", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "^3.32.5", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", "d3-array": "^3.2.3", "d3-interpolate": "^3.0.1", "gl-matrix": "^3.4.3" } }, "sha512-h1UWy/u8Cz1QPsMvbNF+rRGwaEdRnGwCbOSZQwLzYOuvaV+rvGAI6l+Xbhe9zUgzE1lSbBigiQjdGHiNtnVWPQ=="], "@csstools/cascade-layer-name-parser": ["@csstools/cascade-layer-name-parser@2.0.4", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA=="], @@ -1149,7 +1149,7 @@ "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], - "dcmjs": ["dcmjs@0.42.0", "", { "dependencies": { "@babel/runtime-corejs3": "^7.22.5", "adm-zip": "^0.5.10", "gl-matrix": "^3.1.0", "lodash.clonedeep": "^4.5.0", "loglevel": "^1.8.1", "ndarray": "^1.0.19", "pako": "^2.0.4" } }, "sha512-N/SXIzMvAjDRgb8vC8G7DP/2BI1QKpa3TwY47Ok34g5y6ZKIcpAR3sf+Y+OBWkQxvnCTncB6B4tkq/ih8xjmXA=="], + "dcmjs": ["dcmjs@0.43.1", "", { "dependencies": { "@babel/runtime-corejs3": "^7.22.5", "adm-zip": "^0.5.10", "gl-matrix": "^3.1.0", "lodash.clonedeep": "^4.5.0", "loglevel": "^1.8.1", "ndarray": "^1.0.19", "pako": "^2.0.4" } }, "sha512-7IAB2cs2F8QYINbfhA7PV+IDraqBuHn8N31xJc6HsyNxZXyGUPQRujcq732ACqjLhl7oJi1z8PJJgLdblQtD3Q=="], "debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], diff --git a/packages/docs/docusaurus.config.js b/packages/docs/docusaurus.config.js index 744f789db8..e6184e74b0 100644 --- a/packages/docs/docusaurus.config.js +++ b/packages/docs/docusaurus.config.js @@ -254,6 +254,8 @@ module.exports = { out: `./docs/api/${pkg}`, entryPoints: [`../${pkg}/src/index.ts`], tsconfig: `../${pkg}/tsconfig.json`, + exclude: [`../${pkg}/test/**/*`, `../${pkg}/jest.config.js`], + skipErrorChecking: true, }, ]); } diff --git a/packages/docs/package.json b/packages/docs/package.json index 33fbf5c197..2cf29ba4d3 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -7,6 +7,7 @@ "preinstall": "node preinstall.js", "build": "echo 'build'", "build:docs": "cd ../../ && yarn install && yarn run build:esm && cd packages/docs && cross-env NODE_OPTIONS=--max_old_space_size=32384 yarn run prep-examples && docusaurus build && node ./scripts/prepare-markdown-files.js && node ./scripts/generate-llms-txt.js && node ./scripts/generate-llms-full-txt.js && node ./scripts/generate-redirects.js", + "build:ci": "cross-env NODE_OPTIONS=--max_old_space_size=32384 yarn run prep-examples && docusaurus build && node ./scripts/prepare-markdown-files.js && node ./scripts/generate-llms-txt.js && node ./scripts/generate-llms-full-txt.js && node ./scripts/generate-redirects.js", "prepare-markdown-files": "node ./scripts/prepare-markdown-files.js", "generate-llms-txt": "node ./scripts/generate-llms-txt.js", "generate-llms-full-txt": "node ./scripts/generate-llms-full-txt.js", From 7c6a1420c1ec9f30d2ca3984705450d8b6ca086b Mon Sep 17 00:00:00 2001 From: Alireza Date: Mon, 4 Aug 2025 23:01:23 -0400 Subject: [PATCH 148/212] chore: fix tests (#2248) --- .github/workflows/docusaurus-build.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/docusaurus-build.yml b/.github/workflows/docusaurus-build.yml index c9475477f0..db1311cbb2 100644 --- a/.github/workflows/docusaurus-build.yml +++ b/.github/workflows/docusaurus-build.yml @@ -1,8 +1,6 @@ name: Docusaurus Build on: - push: - branches: [ main ] pull_request: branches: [ main ] From 26f653d34351c12bafdcda8e37bbfed90a3a426e Mon Sep 17 00:00:00 2001 From: Alireza Date: Mon, 4 Aug 2025 23:10:23 -0400 Subject: [PATCH 149/212] chore: fix tests to publish docs (#2249) --- publish-version.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/publish-version.mjs b/publish-version.mjs index 89228eb950..f64256eea3 100644 --- a/publish-version.mjs +++ b/publish-version.mjs @@ -115,6 +115,7 @@ async function run() { await execa('git', ['add', '-A']); await execa('git', [ 'commit', + '--no-verify', '-m', 'chore(version): version.json [skip ci]', ]); From 90e41cd8f71e7ade6a0f730000e8e8ca0781c5d5 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 5 Aug 2025 03:14:11 +0000 Subject: [PATCH 150/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 170 +++++++++--------- packages/ai/package.json | 4 +- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +- packages/labelmap-interpolation/package.json | 4 +- packages/nifti-volume-loader/package.json | 2 +- .../polymorphic-segmentation/package.json | 4 +- packages/tools/package.json | 2 +- version.json | 6 +- version.txt | 2 +- 11 files changed, 104 insertions(+), 104 deletions(-) diff --git a/commit.txt b/commit.txt index d5a79a6a3f..2c35b9dacc 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -2bf6e2d8d3b54d8e91d041bfd40ad2d3d84a5c65 \ No newline at end of file +26f653d34351c12bafdcda8e37bbfed90a3a426e \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 3fad4db686..b2d6120116 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,95 +1,95 @@ { - "name": "@cornerstonejs/adapters", - "version": "3.32.5", - "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", - "module": "./dist/esm/index.js", - "types": "./dist/esm/index.d.ts", - "files": [ - "dist" - ], - "directories": { - "build": "dist" + "name": "@cornerstonejs/adapters", + "version": "3.32.5", + "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", + "files": [ + "dist" + ], + "directories": { + "build": "dist" + }, + "exports": { + ".": { + "import": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts" }, - "exports": { - ".": { - "import": "./dist/esm/index.js", - "types": "./dist/esm/index.d.ts" - }, - "./cornerstone": { - "import": "./dist/esm/adapters/Cornerstone/index.js", - "types": "./dist/esm/adapters/Cornerstone/index.d.ts" - }, - "./cornerstone/*": { - "import": "./dist/esm/adapters/Cornerstone/*.js", - "types": "./dist/esm/adapters/Cornerstone/*.d.ts" - }, - "./cornerstone3D": { - "import": "./dist/esm/adapters/Cornerstone3D/index.js", - "types": "./dist/esm/adapters/Cornerstone3D/index.d.ts" - }, - "./cornerstone3D/*": { - "import": "./dist/esm/adapters/Cornerstone3D/*.js", - "types": "./dist/esm/adapters/Cornerstone3D/*.d.ts" - }, - "./enums": { - "import": "./dist/esm/adapters/enums/index.js", - "types": "./dist/esm/adapters/enums/index.d.ts" - }, - "./enums/*": { - "import": "./dist/esm/adapters/enums/*.js", - "types": "./dist/esm/adapters/enums/*.d.ts" - }, - "./helpers": { - "import": "./dist/esm/adapters/helpers/index.js", - "types": "./dist/esm/adapters/helpers/index.d.ts" - }, - "./helpers/*": { - "import": "./dist/esm/adapters/helpers/*.js", - "types": "./dist/esm/adapters/helpers/*.d.ts" - }, - "./version": { - "node": "./dist/esm/version.js", - "import": "./dist/esm/version.js", - "types": "./dist/esm/version.d.ts" - } + "./cornerstone": { + "import": "./dist/esm/adapters/Cornerstone/index.js", + "types": "./dist/esm/adapters/Cornerstone/index.d.ts" }, - "publishConfig": { - "access": "public" + "./cornerstone/*": { + "import": "./dist/esm/adapters/Cornerstone/*.js", + "types": "./dist/esm/adapters/Cornerstone/*.d.ts" }, - "scripts": { - "test": "jest --testTimeout 60000", - "build": "rollup -c rollup.config.mjs", - "build:esm": "rollup -c rollup.config.mjs", - "build:esm:watch": "rollup --watch -c rollup.config.mjs", - "clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist", - "clean:deep": "yarn run clean && shx rm -rf node_modules", - "dev": "rollup --watch -c rollup.config.mjs", - "build:all": "yarn build", - "api-check": "echo 'No API check for this package'", - "start": "rollup --watch -c rollup.config.mjs", - "format": "prettier --write 'src/**/*.js' 'test/**/*.js'", - "lint": "oxlint .", - "prebuild": "node ../../scripts/generate-version.js ./" + "./cornerstone3D": { + "import": "./dist/esm/adapters/Cornerstone3D/index.js", + "types": "./dist/esm/adapters/Cornerstone3D/index.d.ts" }, - "repository": { - "type": "git", - "url": "git+https://github.com/cornerstonejs/cornerstone3D.git" + "./cornerstone3D/*": { + "import": "./dist/esm/adapters/Cornerstone3D/*.js", + "types": "./dist/esm/adapters/Cornerstone3D/*.d.ts" }, - "author": "@cornerstonejs adapters package", - "license": "MIT", - "bugs": { - "url": "https://github.com/cornerstonejs/cornerstone3D/issues" + "./enums": { + "import": "./dist/esm/adapters/enums/index.js", + "types": "./dist/esm/adapters/enums/index.d.ts" }, - "homepage": "https://github.com/cornerstonejs/cornerstone3D/blob/main/packages/adapters/README.md", - "dependencies": { - "@babel/runtime-corejs2": "^7.17.8", - "buffer": "^6.0.3", - "dcmjs": "^0.43.1", - "gl-matrix": "^3.4.3", - "ndarray": "^1.0.19" + "./enums/*": { + "import": "./dist/esm/adapters/enums/*.js", + "types": "./dist/esm/adapters/enums/*.d.ts" }, - "peerDependencies": { - "@cornerstonejs/core": "^3.32.5", - "@cornerstonejs/tools": "^3.32.5" + "./helpers": { + "import": "./dist/esm/adapters/helpers/index.js", + "types": "./dist/esm/adapters/helpers/index.d.ts" + }, + "./helpers/*": { + "import": "./dist/esm/adapters/helpers/*.js", + "types": "./dist/esm/adapters/helpers/*.d.ts" + }, + "./version": { + "node": "./dist/esm/version.js", + "import": "./dist/esm/version.js", + "types": "./dist/esm/version.d.ts" } + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "test": "jest --testTimeout 60000", + "build": "rollup -c rollup.config.mjs", + "build:esm": "rollup -c rollup.config.mjs", + "build:esm:watch": "rollup --watch -c rollup.config.mjs", + "clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist", + "clean:deep": "yarn run clean && shx rm -rf node_modules", + "dev": "rollup --watch -c rollup.config.mjs", + "build:all": "yarn build", + "api-check": "echo 'No API check for this package'", + "start": "rollup --watch -c rollup.config.mjs", + "format": "prettier --write 'src/**/*.js' 'test/**/*.js'", + "lint": "oxlint .", + "prebuild": "node ../../scripts/generate-version.js ./" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/cornerstonejs/cornerstone3D.git" + }, + "author": "@cornerstonejs adapters package", + "license": "MIT", + "bugs": { + "url": "https://github.com/cornerstonejs/cornerstone3D/issues" + }, + "homepage": "https://github.com/cornerstonejs/cornerstone3D/blob/main/packages/adapters/README.md", + "dependencies": { + "@babel/runtime-corejs2": "^7.17.8", + "buffer": "^6.0.3", + "dcmjs": "^0.43.1", + "gl-matrix": "^3.4.3", + "ndarray": "^1.0.19" + }, + "peerDependencies": { + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6" + } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 3c7ed5003a..57355ee1ca 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5", - "@cornerstonejs/tools": "^3.32.5" + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index e25d156dca..f4eae98b7a 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/core": "^3.32.6", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 2cf29ba4d3..ab8d7c3fc7 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.5", - "@cornerstonejs/core": "^3.32.5", - "@cornerstonejs/dicom-image-loader": "^3.32.5", - "@cornerstonejs/nifti-volume-loader": "^3.32.5", - "@cornerstonejs/tools": "^3.32.5", + "@cornerstonejs/adapters": "^3.32.6", + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/dicom-image-loader": "^3.32.6", + "@cornerstonejs/nifti-volume-loader": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 0d194ea2c2..863de87969 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5", - "@cornerstonejs/tools": "^3.32.5", + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 3c16970636..edb235fb88 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5" + "@cornerstonejs/core": "^3.32.6" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 91a4ca2684..fd46d6274c 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5", - "@cornerstonejs/tools": "^3.32.5", + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 7f4ac42996..79e6881384 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/core": "^3.32.6", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 95e81ac7cb..f977dd784b 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.5", - "commit": "2bf6e2d8d3b54d8e91d041bfd40ad2d3d84a5c65" -} + "version": "3.32.6", + "commit": "26f653d34351c12bafdcda8e37bbfed90a3a426e" +} \ No newline at end of file diff --git a/version.txt b/version.txt index 28fb4be5ea..72fd668004 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.5 \ No newline at end of file +3.32.6 \ No newline at end of file From 0a4c30613cd770933014f7c89f7145d3fd8be3e4 Mon Sep 17 00:00:00 2001 From: Alireza Date: Mon, 4 Aug 2025 23:23:42 -0400 Subject: [PATCH 151/212] chore: fix tests to publish docs (#2250) --- publish-version.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/publish-version.mjs b/publish-version.mjs index f64256eea3..93483e0948 100644 --- a/publish-version.mjs +++ b/publish-version.mjs @@ -147,6 +147,7 @@ async function run() { await execa('git', ['add', '.']); await execa('git', [ 'commit', + '--no-verify', '-m', 'chore: update generated version file [skip ci]', ]); From 564e3f92c0773fc8eff1ef5884b3e59002c8d19e Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 5 Aug 2025 03:27:24 +0000 Subject: [PATCH 152/212] chore(version): version.json [skip ci] --- bun.lock | 38 +++++++++++++++++++------------------- commit.txt | 2 +- version.json | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/bun.lock b/bun.lock index bd92d8d490..c3298202ca 100644 --- a/bun.lock +++ b/bun.lock @@ -127,7 +127,7 @@ }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "3.32.2", + "version": "3.32.5", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -136,13 +136,13 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.0", - "@cornerstonejs/tools": "^3.31.0", + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6", }, }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "3.32.2", + "version": "3.32.5", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -154,13 +154,13 @@ "onnxruntime-web": "1.17.1", }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.0", - "@cornerstonejs/tools": "^3.31.0", + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6", }, }, "packages/core": { "name": "@cornerstonejs/core", - "version": "3.32.2", + "version": "3.32.5", "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", @@ -170,7 +170,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.2", + "version": "3.32.5", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -183,48 +183,48 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.7.6", + "@cornerstonejs/core": "^3.32.6", "dicom-parser": "^1.8.9", }, }, "packages/labelmap-interpolation": { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.2", + "version": "3.32.5", "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165", }, "peerDependencies": { - "@cornerstonejs/core": "^3.7.6", - "@cornerstonejs/tools": "^3.7.6", + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6", "@kitware/vtk.js": "32.12.1", }, }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.2", + "version": "3.32.5", "dependencies": { "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^3.7.6", + "@cornerstonejs/core": "^3.32.6", }, }, "packages/polymorphic-segmentation": { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.2", + "version": "3.32.5", "dependencies": { "@icr/polyseg-wasm": "0.4.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.7.6", - "@cornerstonejs/tools": "^3.7.6", + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6", "@kitware/vtk.js": "32.12.1", }, }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "3.32.2", + "version": "3.32.5", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -234,7 +234,7 @@ "canvas": "^3.1.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.31.0", + "@cornerstonejs/core": "^3.32.6", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/commit.txt b/commit.txt index 2c35b9dacc..3855005cee 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -26f653d34351c12bafdcda8e37bbfed90a3a426e \ No newline at end of file +0a4c30613cd770933014f7c89f7145d3fd8be3e4 \ No newline at end of file diff --git a/version.json b/version.json index f977dd784b..150cf4920b 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { "version": "3.32.6", - "commit": "26f653d34351c12bafdcda8e37bbfed90a3a426e" + "commit": "0a4c30613cd770933014f7c89f7145d3fd8be3e4" } \ No newline at end of file From 52b5feaded9b799b69e7b9c9a8a127cbec44d395 Mon Sep 17 00:00:00 2001 From: Alireza Date: Mon, 4 Aug 2025 23:50:24 -0400 Subject: [PATCH 153/212] chore: update prettier (#2251) --- .oxlintrc.json | 6 +- bun.lock | 26 +- package.json | 2 +- packages/adapters/CHANGELOG.md | 474 +++++++++--------- packages/adapters/README.md | 36 +- packages/adapters/package.json | 170 +++---- .../adapters/Cornerstone/Segmentation_4X.js | 6 +- packages/ai/package.json | 4 +- packages/ai/src/ONNXSegmentationController.ts | 5 +- .../helpers/getCameraVectors.ts | 2 +- .../cache/classes/BaseStreamingImageVolume.ts | 23 +- .../src/loaders/ProgressiveRetrieveImages.ts | 4 +- packages/core/src/loaders/volumeLoader.ts | 4 +- packages/core/src/types/AffineMatrix.ts | 2 +- packages/core/src/utilities/roundNumber.ts | 20 +- packages/dicomImageLoader/package.json | 2 +- packages/dicomImageLoader/src/codecs/jpeg.js | 4 +- .../src/types/WADORSMetaData.ts | 2 +- .../docs/concepts/cornerstone-core/cahce.md | 5 - .../concepts/cornerstone-core/volumeLoader.md | 1 - .../docs/docs/migration-guides/2x/3-core.md | 9 - .../docs/docs/migration-guides/2x/5-tools.md | 5 - .../docs/migration-guides/legacy-to-3d.md | 8 +- packages/docs/package.json | 10 +- packages/labelmap-interpolation/package.json | 4 +- packages/nifti-volume-loader/package.json | 2 +- .../index.ts | 5 +- .../polymorphic-segmentation/package.json | 4 +- .../src/Labelmap/convertContourToLabelmap.ts | 5 +- .../src/Surface/updateSurfaceData.ts | 5 +- packages/tools/examples/CINETool/index.ts | 5 +- .../tools/examples/contourRendering/index.ts | 5 +- .../contourRenderingConfiguration/index.ts | 5 +- .../contourRenderingMultiple/index.ts | 5 +- .../dynamicallyAddAnnotations/angleToolUI.ts | 26 +- .../arrowAnnotateToolUI.ts | 18 +- .../circleROIToolUI.ts | 18 +- .../ellipticalROIToolUI.ts | 10 +- .../dynamicallyAddAnnotations/labelToolUI.ts | 10 +- .../dynamicallyAddAnnotations/lengthToolUI.ts | 18 +- .../dynamicallyAddAnnotations/probeToolUI.ts | 10 +- .../rectangleROIToolUI.ts | 10 +- .../splineROIToolUI.ts | 26 +- .../examples/labelmapStatistics/index.ts | 5 +- .../tools/examples/regionSegmentPlus/index.ts | 5 +- .../segmentBidirectionalToolStack/index.ts | 5 +- packages/tools/examples/segmentLabel/index.ts | 5 +- .../tools/examples/segmentSelect/index.ts | 5 +- .../stackLabelmapSegmentation/index.ts | 10 +- packages/tools/examples/stackRange/index.ts | 4 +- packages/tools/examples/videoColor/index.ts | 5 +- packages/tools/examples/videoGroup/index.ts | 12 +- packages/tools/examples/videoRange/index.ts | 8 +- packages/tools/examples/videoTools/index.ts | 4 +- packages/tools/examples/webWorker/index.ts | 20 +- packages/tools/package.json | 2 +- .../segmentation/config/styleHelpers.ts | 8 +- .../src/tools/VolumeCroppingControlTool.ts | 2 +- .../tools/src/tools/VolumeCroppingTool.ts | 4 +- .../src/tools/annotation/CircleROITool.ts | 2 +- .../src/tools/annotation/CobbAngleTool.ts | 8 +- .../src/tools/annotation/EllipticalROITool.ts | 2 +- .../tools/annotation/PlanarFreehandROITool.ts | 4 +- .../CircleROIStartEndThresholdTool.ts | 2 +- .../tools/segmentation/LabelmapBaseTool.ts | 4 +- .../src/types/ToolSpecificAnnotationTypes.ts | 2 +- .../contours/interpolation/interpolate.ts | 3 +- .../tools/src/utilities/math/circle/_types.ts | 2 +- .../math/ellipse/getCanvasEllipseCorners.ts | 2 +- .../src/utilities/math/line/intersectLine.ts | 4 +- tests/utils/reduceViewportsSize.ts | 17 +- version.json | 4 +- version.txt | 2 +- yarn.lock | 8 +- 74 files changed, 580 insertions(+), 611 deletions(-) diff --git a/.oxlintrc.json b/.oxlintrc.json index c014f88236..369cef1e94 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -1,6 +1,10 @@ { "plugins": ["typescript", "import"], - "ignorePatterns": ["utils/**", "**/examples/**", "packages/dicomImageLoader/src/types/codec*"], + "ignorePatterns": [ + "utils/**", + "**/examples/**", + "packages/dicomImageLoader/src/types/codec*" + ], "rules": { "typescript/no-explicit-any": "error", "import/no-cycle": "error" diff --git a/bun.lock b/bun.lock index c3298202ca..9351814f6d 100644 --- a/bun.lock +++ b/bun.lock @@ -91,7 +91,7 @@ "postcss-import": "^15.1.0", "postcss-loader": "^7.3.0", "postcss-preset-env": "^8.3.2", - "prettier": "2.8.8", + "prettier": "^3.6.2", "puppeteer": "^13.5.0", "resemblejs": "^5.0.0", "rollup": "^3.21.3", @@ -136,8 +136,8 @@ "ndarray": "^1.0.19", }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6", + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5", }, }, "packages/ai": { @@ -154,8 +154,8 @@ "onnxruntime-web": "1.17.1", }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6", + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5", }, }, "packages/core": { @@ -183,7 +183,7 @@ "uuid": "^9.0.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/core": "^3.32.5", "dicom-parser": "^1.8.9", }, }, @@ -195,8 +195,8 @@ "itk-wasm": "1.0.0-b.165", }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6", + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5", "@kitware/vtk.js": "32.12.1", }, }, @@ -207,7 +207,7 @@ "nifti-reader-js": "^0.6.8", }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/core": "^3.32.5", }, }, "packages/polymorphic-segmentation": { @@ -217,8 +217,8 @@ "@icr/polyseg-wasm": "0.4.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6", + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5", "@kitware/vtk.js": "32.12.1", }, }, @@ -234,7 +234,7 @@ "canvas": "^3.1.0", }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/core": "^3.32.5", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", @@ -3590,7 +3590,7 @@ "precond": ["precond@0.2.3", "", {}, "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ=="], - "prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], "pretty-error": ["pretty-error@4.0.0", "", { "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" } }, "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw=="], diff --git a/package.json b/package.json index 0b9ac9c1b8..4f1b7b7804 100644 --- a/package.json +++ b/package.json @@ -148,7 +148,7 @@ "postcss-import": "^15.1.0", "postcss-loader": "^7.3.0", "postcss-preset-env": "^8.3.2", - "prettier": "2.8.8", + "prettier": "^3.6.2", "puppeteer": "^13.5.0", "resemblejs": "^5.0.0", "rollup": "^3.21.3", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 150b1e3f2d..7b06a6bb75 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -11,13 +11,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- Ensure FOR is stored when required and cachedStats created ([#2237](https://github.com/cornerstonejs/cornerstone3D/issues/2237)) ([35062da](https://github.com/cornerstonejs/cornerstone3D/commit/35062daedcb6b9f4f785095bfcf0ff811cdbc4f1)) +- Ensure FOR is stored when required and cachedStats created ([#2237](https://github.com/cornerstonejs/cornerstone3D/issues/2237)) ([35062da](https://github.com/cornerstonejs/cornerstone3D/commit/35062daedcb6b9f4f785095bfcf0ff811cdbc4f1)) ## [3.32.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.2...v3.32.3) (2025-07-30) ### Bug Fixes -- Adapter issues ([#2233](https://github.com/cornerstonejs/cornerstone3D/issues/2233)) ([07620e9](https://github.com/cornerstonejs/cornerstone3D/commit/07620e9b5b2e427866cc91fd616ae0e292b48f3b)) +- Adapter issues ([#2233](https://github.com/cornerstonejs/cornerstone3D/issues/2233)) ([07620e9](https://github.com/cornerstonejs/cornerstone3D/commit/07620e9b5b2e427866cc91fd616ae0e292b48f3b)) ## [3.32.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.1...v3.32.2) (2025-07-29) @@ -39,7 +39,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- Save label position and use valid DICOM for label text ([#2224](https://github.com/cornerstonejs/cornerstone3D/issues/2224)) ([acb1446](https://github.com/cornerstonejs/cornerstone3D/commit/acb1446027950066ed9d8404ecbd27220f41f020)) +- Save label position and use valid DICOM for label text ([#2224](https://github.com/cornerstonejs/cornerstone3D/issues/2224)) ([acb1446](https://github.com/cornerstonejs/cornerstone3D/commit/acb1446027950066ed9d8404ecbd27220f41f020)) ## [3.31.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.11...v3.31.12) (2025-07-22) @@ -61,7 +61,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- local segmentation load ([#2222](https://github.com/cornerstonejs/cornerstone3D/issues/2222)) ([f0e6802](https://github.com/cornerstonejs/cornerstone3D/commit/f0e6802aad72475092824e88af8609d498ac3baf)) +- local segmentation load ([#2222](https://github.com/cornerstonejs/cornerstone3D/issues/2222)) ([f0e6802](https://github.com/cornerstonejs/cornerstone3D/commit/f0e6802aad72475092824e88af8609d498ac3baf)) ## [3.31.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.6...v3.31.7) (2025-07-21) @@ -71,13 +71,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **probe:** rehydrate ([#2214](https://github.com/cornerstonejs/cornerstone3D/issues/2214)) ([4ac725e](https://github.com/cornerstonejs/cornerstone3D/commit/4ac725e94729f12ed21f471a6bffe30fea0b5296)) +- **probe:** rehydrate ([#2214](https://github.com/cornerstonejs/cornerstone3D/issues/2214)) ([4ac725e](https://github.com/cornerstonejs/cornerstone3D/commit/4ac725e94729f12ed21f471a6bffe30fea0b5296)) ## [3.31.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.4...v3.31.5) (2025-07-18) ### Bug Fixes -- adapter should be able to convert all the types, including points ([#2211](https://github.com/cornerstonejs/cornerstone3D/issues/2211)) ([9b3fd22](https://github.com/cornerstonejs/cornerstone3D/commit/9b3fd227c11d78e7cc3fbddcfb8926e8a22572fc)) +- adapter should be able to convert all the types, including points ([#2211](https://github.com/cornerstonejs/cornerstone3D/issues/2211)) ([9b3fd22](https://github.com/cornerstonejs/cornerstone3D/commit/9b3fd227c11d78e7cc3fbddcfb8926e8a22572fc)) ## [3.31.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.31.3...v3.31.4) (2025-07-17) @@ -95,7 +95,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- Distinguishing between scoord3d and scoord (3d/2d) measurements and parsing them ([#2099](https://github.com/cornerstonejs/cornerstone3D/issues/2099)) ([23c03d9](https://github.com/cornerstonejs/cornerstone3D/commit/23c03d9d330750c5f3ab09336819c3cf1fe6cff3)) +- Distinguishing between scoord3d and scoord (3d/2d) measurements and parsing them ([#2099](https://github.com/cornerstonejs/cornerstone3D/issues/2099)) ([23c03d9](https://github.com/cornerstonejs/cornerstone3D/commit/23c03d9d330750c5f3ab09336819c3cf1fe6cff3)) # [3.31.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.30.3...v3.31.0) (2025-07-15) @@ -133,7 +133,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **rendering:** Introduce SequentialRenderingEngine to resolve canvas size limitation, performance degradation on high res monitors and enhance multi-monitor support ([#2181](https://github.com/cornerstonejs/cornerstone3D/issues/2181)) ([6ee565b](https://github.com/cornerstonejs/cornerstone3D/commit/6ee565be36e22a98070ce2a0536f3d821979cac4)) +- **rendering:** Introduce SequentialRenderingEngine to resolve canvas size limitation, performance degradation on high res monitors and enhance multi-monitor support ([#2181](https://github.com/cornerstonejs/cornerstone3D/issues/2181)) ([6ee565b](https://github.com/cornerstonejs/cornerstone3D/commit/6ee565be36e22a98070ce2a0536f3d821979cac4)) ## [3.29.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.29.0...v3.29.1) (2025-07-10) @@ -183,7 +183,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **labelmap:** labelmap seg implementation ([#2156](https://github.com/cornerstonejs/cornerstone3D/issues/2156)) ([72e55df](https://github.com/cornerstonejs/cornerstone3D/commit/72e55df74e627b76a7313c0aff5c167d84634bee)) +- **labelmap:** labelmap seg implementation ([#2156](https://github.com/cornerstonejs/cornerstone3D/issues/2156)) ([72e55df](https://github.com/cornerstonejs/cornerstone3D/commit/72e55df74e627b76a7313c0aff5c167d84634bee)) ## [3.23.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.23.0...v3.23.1) (2025-06-24) @@ -309,7 +309,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- remove random none string ([#2081](https://github.com/cornerstonejs/cornerstone3D/issues/2081)) ([c1df7de](https://github.com/cornerstonejs/cornerstone3D/commit/c1df7dea9a448427c36a7b1dcd60f728e7d54d86)) +- remove random none string ([#2081](https://github.com/cornerstonejs/cornerstone3D/issues/2081)) ([c1df7de](https://github.com/cornerstonejs/cornerstone3D/commit/c1df7dea9a448427c36a7b1dcd60f728e7d54d86)) ## [3.15.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.15.1...v3.15.2) (2025-05-15) @@ -323,7 +323,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- save scoord3d for tools ([#2035](https://github.com/cornerstonejs/cornerstone3D/issues/2035)) ([4ff099f](https://github.com/cornerstonejs/cornerstone3D/commit/4ff099f16c31115b6fb6371359a51dcd442e4f7b)) +- save scoord3d for tools ([#2035](https://github.com/cornerstonejs/cornerstone3D/issues/2035)) ([4ff099f](https://github.com/cornerstonejs/cornerstone3D/commit/4ff099f16c31115b6fb6371359a51dcd442e4f7b)) ## [3.14.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.14.3...v3.14.4) (2025-05-15) @@ -345,7 +345,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **version:** add version property ([#2068](https://github.com/cornerstonejs/cornerstone3D/issues/2068)) ([b7db4cc](https://github.com/cornerstonejs/cornerstone3D/commit/b7db4cc157027ebbd108c9ef9e4a01abb0769864)) +- **version:** add version property ([#2068](https://github.com/cornerstonejs/cornerstone3D/issues/2068)) ([b7db4cc](https://github.com/cornerstonejs/cornerstone3D/commit/b7db4cc157027ebbd108c9ef9e4a01abb0769864)) # [3.13.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.12.3...v3.13.0) (2025-05-13) @@ -411,7 +411,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **copyStudyTags:** missing SeriesInstanceUID ([#2028](https://github.com/cornerstonejs/cornerstone3D/issues/2028)) ([046dad2](https://github.com/cornerstonejs/cornerstone3D/commit/046dad2270fd038adc5d4f81ac55fb4bdc477862)) +- **copyStudyTags:** missing SeriesInstanceUID ([#2028](https://github.com/cornerstonejs/cornerstone3D/issues/2028)) ([046dad2](https://github.com/cornerstonejs/cornerstone3D/commit/046dad2270fd038adc5d4f81ac55fb4bdc477862)) ## [3.10.29](https://github.com/cornerstonejs/cornerstone3D/compare/v3.10.28...v3.10.29) (2025-04-22) @@ -569,7 +569,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **segmentation:** Enhance RTSS generation, surface updates, and contour set processing; address minor tool issues ([#1962](https://github.com/cornerstonejs/cornerstone3D/issues/1962)) ([f51c38c](https://github.com/cornerstonejs/cornerstone3D/commit/f51c38c535b026fc22cf7f9195a749644aee4996)) +- **segmentation:** Enhance RTSS generation, surface updates, and contour set processing; address minor tool issues ([#1962](https://github.com/cornerstonejs/cornerstone3D/issues/1962)) ([f51c38c](https://github.com/cornerstonejs/cornerstone3D/commit/f51c38c535b026fc22cf7f9195a749644aee4996)) ## [3.8.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.8.2...v3.8.3) (2025-04-02) @@ -595,7 +595,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- Add multiframe SEG support ([#1934](https://github.com/cornerstonejs/cornerstone3D/issues/1934)) ([e469a37](https://github.com/cornerstonejs/cornerstone3D/commit/e469a373534d3413aeac91bc85aecc7b8041568d)) +- Add multiframe SEG support ([#1934](https://github.com/cornerstonejs/cornerstone3D/issues/1934)) ([e469a37](https://github.com/cornerstonejs/cornerstone3D/commit/e469a373534d3413aeac91bc85aecc7b8041568d)) ## [3.7.15](https://github.com/cornerstonejs/cornerstone3D/compare/v3.7.14...v3.7.15) (2025-03-27) @@ -633,13 +633,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **segmentation:** Enhance Segmentation and Annotation Tools ([#1929](https://github.com/cornerstonejs/cornerstone3D/issues/1929)) ([b952d9b](https://github.com/cornerstonejs/cornerstone3D/commit/b952d9b05a871d8b8ac91def0e029703d19b57d6)) +- **segmentation:** Enhance Segmentation and Annotation Tools ([#1929](https://github.com/cornerstonejs/cornerstone3D/issues/1929)) ([b952d9b](https://github.com/cornerstonejs/cornerstone3D/commit/b952d9b05a871d8b8ac91def0e029703d19b57d6)) ## [3.7.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.7.5...v3.7.6) (2025-03-20) ### Bug Fixes -- Only copy patient/study attributes rather than all ([#1887](https://github.com/cornerstonejs/cornerstone3D/issues/1887)) ([7584ec7](https://github.com/cornerstonejs/cornerstone3D/commit/7584ec78da64bf860ce389aad233f38a90020187)) +- Only copy patient/study attributes rather than all ([#1887](https://github.com/cornerstonejs/cornerstone3D/issues/1887)) ([7584ec7](https://github.com/cornerstonejs/cornerstone3D/commit/7584ec78da64bf860ce389aad233f38a90020187)) ## [3.7.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.7.4...v3.7.5) (2025-03-19) @@ -661,7 +661,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- reintroduce seg events and chunks ([#1913](https://github.com/cornerstonejs/cornerstone3D/issues/1913)) ([c23048c](https://github.com/cornerstonejs/cornerstone3D/commit/c23048c64295954c97f4ccbaefd7b34906bdda1d)) +- reintroduce seg events and chunks ([#1913](https://github.com/cornerstonejs/cornerstone3D/issues/1913)) ([c23048c](https://github.com/cornerstonejs/cornerstone3D/commit/c23048c64295954c97f4ccbaefd7b34906bdda1d)) # [3.7.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.6.1...v3.7.0) (2025-03-18) @@ -695,7 +695,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **adapters:** overlapping segs with labelmap images ([#1815](https://github.com/cornerstonejs/cornerstone3D/issues/1815)) ([95972e2](https://github.com/cornerstonejs/cornerstone3D/commit/95972e205c722c72f37f951aec0ab6bb25ef0773)) +- **adapters:** overlapping segs with labelmap images ([#1815](https://github.com/cornerstonejs/cornerstone3D/issues/1815)) ([95972e2](https://github.com/cornerstonejs/cornerstone3D/commit/95972e205c722c72f37f951aec0ab6bb25ef0773)) ## [3.3.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.3.3...v3.3.4) (2025-03-13) @@ -761,7 +761,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **surface-segmentation:** add visibilty configuration for surface segmentation ([#1846](https://github.com/cornerstonejs/cornerstone3D/issues/1846)) ([e1b5bc6](https://github.com/cornerstonejs/cornerstone3D/commit/e1b5bc646f3997be88ec237f86406c310420379a)) +- **surface-segmentation:** add visibilty configuration for surface segmentation ([#1846](https://github.com/cornerstonejs/cornerstone3D/issues/1846)) ([e1b5bc6](https://github.com/cornerstonejs/cornerstone3D/commit/e1b5bc646f3997be88ec237f86406c310420379a)) ## [3.0.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0...v3.0.1) (2025-02-27) @@ -771,13 +771,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- Cornerstone3D 3.0 ([#1865](https://github.com/cornerstonejs/cornerstone3D/issues/1865)) ([fe65459](https://github.com/cornerstonejs/cornerstone3D/commit/fe654590d16414e76361e1b2826fd64c3734ae87)) +- Cornerstone3D 3.0 ([#1865](https://github.com/cornerstonejs/cornerstone3D/issues/1865)) ([fe65459](https://github.com/cornerstonejs/cornerstone3D/commit/fe654590d16414e76361e1b2826fd64c3734ae87)) # [3.0.0-beta.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2025-02-27) ### Features -- Add key image adapters for key image point mark ([#1754](https://github.com/cornerstonejs/cornerstone3D/issues/1754)) ([a1fd3f9](https://github.com/cornerstonejs/cornerstone3D/commit/a1fd3f9d0ea40d53cafd792d59bc1dbfc90663a5)) +- Add key image adapters for key image point mark ([#1754](https://github.com/cornerstonejs/cornerstone3D/issues/1754)) ([a1fd3f9](https://github.com/cornerstonejs/cornerstone3D/commit/a1fd3f9d0ea40d53cafd792d59bc1dbfc90663a5)) ## [2.17.3](https://github.com/dcmjs-org/dcmjs/compare/v2.17.2...v2.17.3) (2025-01-22) @@ -787,7 +787,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **seg:** Refactor LabelmapBaseTool and SphereScissorsTool to fix sphere bug in stack ([#1772](https://github.com/dcmjs-org/dcmjs/issues/1772)) ([5eeda06](https://github.com/dcmjs-org/dcmjs/commit/5eeda0626a2722397aba910ae4bd4a5e650d32c6)) +- **seg:** Refactor LabelmapBaseTool and SphereScissorsTool to fix sphere bug in stack ([#1772](https://github.com/dcmjs-org/dcmjs/issues/1772)) ([5eeda06](https://github.com/dcmjs-org/dcmjs/commit/5eeda0626a2722397aba910ae4bd4a5e650d32c6)) ## [2.17.1](https://github.com/dcmjs-org/dcmjs/compare/v2.17.0...v2.17.1) (2025-01-22) @@ -901,7 +901,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **adapters:** default to creation of labelmap images in 2D instead of a volume ([#1692](https://github.com/dcmjs-org/dcmjs/issues/1692)) ([960b75a](https://github.com/dcmjs-org/dcmjs/commit/960b75a2ebed3a141ceefcf4f38fb6de388a4ca0)) +- **adapters:** default to creation of labelmap images in 2D instead of a volume ([#1692](https://github.com/dcmjs-org/dcmjs/issues/1692)) ([960b75a](https://github.com/dcmjs-org/dcmjs/commit/960b75a2ebed3a141ceefcf4f38fb6de388a4ca0)) ## [2.11.7](https://github.com/dcmjs-org/dcmjs/compare/v2.11.6...v2.11.7) (2024-12-13) @@ -955,7 +955,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **examples:** stack and volume segmentation ([#1684](https://github.com/dcmjs-org/dcmjs/issues/1684)) ([5149b31](https://github.com/dcmjs-org/dcmjs/commit/5149b31d54dca9ff8d0f24dcf8d432b6df1dd29b)) +- **examples:** stack and volume segmentation ([#1684](https://github.com/dcmjs-org/dcmjs/issues/1684)) ([5149b31](https://github.com/dcmjs-org/dcmjs/commit/5149b31d54dca9ff8d0f24dcf8d432b6df1dd29b)) ## [2.8.3](https://github.com/dcmjs-org/dcmjs/compare/v2.8.2...v2.8.3) (2024-12-06) @@ -969,7 +969,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **examples:** fix the stack and volume segmentation adapters example ([#1680](https://github.com/dcmjs-org/dcmjs/issues/1680)) ([85e8ca4](https://github.com/dcmjs-org/dcmjs/commit/85e8ca4bda0a2948565ac88c9ddd07aa2b02f2d3)) +- **examples:** fix the stack and volume segmentation adapters example ([#1680](https://github.com/dcmjs-org/dcmjs/issues/1680)) ([85e8ca4](https://github.com/dcmjs-org/dcmjs/commit/85e8ca4bda0a2948565ac88c9ddd07aa2b02f2d3)) # [2.8.0](https://github.com/dcmjs-org/dcmjs/compare/v2.7.4...v2.8.0) (2024-12-05) @@ -995,7 +995,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **webgpu:** growcut base tools ([#1670](https://github.com/dcmjs-org/dcmjs/issues/1670)) ([7494c9e](https://github.com/dcmjs-org/dcmjs/commit/7494c9e683cd5d27eb9f6f71d958786381a774d5)) +- **webgpu:** growcut base tools ([#1670](https://github.com/dcmjs-org/dcmjs/issues/1670)) ([7494c9e](https://github.com/dcmjs-org/dcmjs/commit/7494c9e683cd5d27eb9f6f71d958786381a774d5)) ## [2.6.5](https://github.com/dcmjs-org/dcmjs/compare/v2.6.4...v2.6.5) (2024-12-04) @@ -1021,7 +1021,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- automatic segmentation using onnx to run local AI algorithms ([#1656](https://github.com/dcmjs-org/dcmjs/issues/1656)) ([5b5856f](https://github.com/dcmjs-org/dcmjs/commit/5b5856fe19eb3ac61fe7877283ed5a7f8a7fa53c)) +- automatic segmentation using onnx to run local AI algorithms ([#1656](https://github.com/dcmjs-org/dcmjs/issues/1656)) ([5b5856f](https://github.com/dcmjs-org/dcmjs/commit/5b5856fe19eb3ac61fe7877283ed5a7f8a7fa53c)) ## [2.5.3](https://github.com/dcmjs-org/dcmjs/compare/v2.5.2...v2.5.3) (2024-12-03) @@ -1115,7 +1115,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **examples:** fix dynamicallyaddannotations, webloader, segmentationVolume examples ([#1592](https://github.com/dcmjs-org/dcmjs/issues/1592)) ([6b07a48](https://github.com/dcmjs-org/dcmjs/commit/6b07a48cb47026adeb8fd6b961140efd65c26c01)) +- **examples:** fix dynamicallyaddannotations, webloader, segmentationVolume examples ([#1592](https://github.com/dcmjs-org/dcmjs/issues/1592)) ([6b07a48](https://github.com/dcmjs-org/dcmjs/commit/6b07a48cb47026adeb8fd6b961140efd65c26c01)) ## [2.2.6](https://github.com/dcmjs-org/dcmjs/compare/v2.2.5...v2.2.6) (2024-11-15) @@ -1193,7 +1193,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **jpeg:** Export JpegImage from JPEG codecs ([#1552](https://github.com/dcmjs-org/dcmjs/issues/1552)) ([fbaa769](https://github.com/dcmjs-org/dcmjs/commit/fbaa7690bbd493ec81e2d729af124c217fd5d46a)) +- **jpeg:** Export JpegImage from JPEG codecs ([#1552](https://github.com/dcmjs-org/dcmjs/issues/1552)) ([fbaa769](https://github.com/dcmjs-org/dcmjs/commit/fbaa7690bbd493ec81e2d729af124c217fd5d46a)) ## [2.1.10](https://github.com/dcmjs-org/dcmjs/compare/v2.1.9...v2.1.10) (2024-11-05) @@ -1231,7 +1231,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **arrow-adapter:** save 2nd point for arrow annotation ([#1450](https://github.com/dcmjs-org/dcmjs/issues/1450)) ([d66a905](https://github.com/dcmjs-org/dcmjs/commit/d66a90591f45d791aeb035736ad40c297650b26d)) +- **arrow-adapter:** save 2nd point for arrow annotation ([#1450](https://github.com/dcmjs-org/dcmjs/issues/1450)) ([d66a905](https://github.com/dcmjs-org/dcmjs/commit/d66a90591f45d791aeb035736ad40c297650b26d)) ## [2.1.1](https://github.com/dcmjs-org/dcmjs/compare/v2.1.0...v2.1.1) (2024-10-30) @@ -1241,7 +1241,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **tools:** Enhance error handling, documentation and code maintainability ([#1522](https://github.com/dcmjs-org/dcmjs/issues/1522)) ([7a1c67f](https://github.com/dcmjs-org/dcmjs/commit/7a1c67f9d1eaf97654a3ec3bfdec729289ae3d6b)) +- **tools:** Enhance error handling, documentation and code maintainability ([#1522](https://github.com/dcmjs-org/dcmjs/issues/1522)) ([7a1c67f](https://github.com/dcmjs-org/dcmjs/commit/7a1c67f9d1eaf97654a3ec3bfdec729289ae3d6b)) ## [2.0.5](https://github.com/dcmjs-org/dcmjs/compare/v2.0.4...v2.0.5) (2024-10-29) @@ -1259,7 +1259,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- peer dependency issues ([#1521](https://github.com/dcmjs-org/dcmjs/issues/1521)) ([a2c2154](https://github.com/dcmjs-org/dcmjs/commit/a2c21542c4858e1568511c337695474391745939)) +- peer dependency issues ([#1521](https://github.com/dcmjs-org/dcmjs/issues/1521)) ([a2c2154](https://github.com/dcmjs-org/dcmjs/commit/a2c21542c4858e1568511c337695474391745939)) ## [2.0.1](https://github.com/dcmjs-org/dcmjs/compare/v2.0.0...v2.0.1) (2024-10-29) @@ -1269,7 +1269,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- Cornerstone3D 2.0 ([#1400](https://github.com/dcmjs-org/dcmjs/issues/1400)) ([692d9af](https://github.com/dcmjs-org/dcmjs/commit/692d9afc6a8bcfa801c4aff0eec7706812bbfed8)) +- Cornerstone3D 2.0 ([#1400](https://github.com/dcmjs-org/dcmjs/issues/1400)) ([692d9af](https://github.com/dcmjs-org/dcmjs/commit/692d9afc6a8bcfa801c4aff0eec7706812bbfed8)) # [2.0.0-beta.30](https://github.com/dcmjs-org/dcmjs/compare/v2.0.0-beta.29...v2.0.0-beta.30) (2024-10-04) @@ -1291,13 +1291,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- segmentation and versioned docs([#1488](https://github.com/dcmjs-org/dcmjs/issues/1488)) ([580dc4b](https://github.com/dcmjs-org/dcmjs/commit/580dc4b06a8e9c9698de8f8a37921a581e77ce84)) +- segmentation and versioned docs([#1488](https://github.com/dcmjs-org/dcmjs/issues/1488)) ([580dc4b](https://github.com/dcmjs-org/dcmjs/commit/580dc4b06a8e9c9698de8f8a37921a581e77ce84)) # [2.0.0-beta.28](https://github.com/dcmjs-org/dcmjs/compare/v2.0.0-beta.27...v2.0.0-beta.28) (2024-09-12) ### Features -- **segmentation:** Refactor segmentation and style handling ([#1449](https://github.com/dcmjs-org/dcmjs/issues/1449)) ([51f7cde](https://github.com/dcmjs-org/dcmjs/commit/51f7cde477dda5f580ab020b69a0a54a7d31efcb)) +- **segmentation:** Refactor segmentation and style handling ([#1449](https://github.com/dcmjs-org/dcmjs/issues/1449)) ([51f7cde](https://github.com/dcmjs-org/dcmjs/commit/51f7cde477dda5f580ab020b69a0a54a7d31efcb)) # [2.0.0-beta.27](https://github.com/dcmjs-org/dcmjs/compare/v2.0.0-beta.26...v2.0.0-beta.27) (2024-08-26) @@ -1321,7 +1321,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **pmap:** added parametric map adapter ([#1382](https://github.com/dcmjs-org/dcmjs/issues/1382)) ([4b5705d](https://github.com/dcmjs-org/dcmjs/commit/4b5705d937c202fb9f84c5aac2158e9577aa5aa4)) +- **pmap:** added parametric map adapter ([#1382](https://github.com/dcmjs-org/dcmjs/issues/1382)) ([4b5705d](https://github.com/dcmjs-org/dcmjs/commit/4b5705d937c202fb9f84c5aac2158e9577aa5aa4)) ## [1.82.7](https://github.com/dcmjs-org/dcmjs/compare/v1.82.6...v1.82.7) (2024-07-24) @@ -1347,7 +1347,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- wheel register API change to use binding ([#1422](https://github.com/dcmjs-org/dcmjs/issues/1422)) ([9e1fb8d](https://github.com/dcmjs-org/dcmjs/commit/9e1fb8df7508afc56df96e243be21bc34c3b0809)) +- wheel register API change to use binding ([#1422](https://github.com/dcmjs-org/dcmjs/issues/1422)) ([9e1fb8d](https://github.com/dcmjs-org/dcmjs/commit/9e1fb8df7508afc56df96e243be21bc34c3b0809)) # [2.0.0-beta.19](https://github.com/dcmjs-org/dcmjs/compare/v2.0.0-beta.18...v2.0.0-beta.19) (2024-07-04) @@ -1357,7 +1357,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- new segmentation state model per viewport ([#1374](https://github.com/dcmjs-org/dcmjs/issues/1374)) ([05cb720](https://github.com/dcmjs-org/dcmjs/commit/05cb7206e76ff07aafb953125b8e8e1a1be53d23)) +- new segmentation state model per viewport ([#1374](https://github.com/dcmjs-org/dcmjs/issues/1374)) ([05cb720](https://github.com/dcmjs-org/dcmjs/commit/05cb7206e76ff07aafb953125b8e8e1a1be53d23)) # [2.0.0-beta.17](https://github.com/dcmjs-org/dcmjs/compare/v2.0.0-beta.16...v2.0.0-beta.17) (2024-06-21) @@ -1387,7 +1387,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **viewport:** Various viewport-related changes and improvements ([#1324](https://github.com/dcmjs-org/dcmjs/issues/1324)) ([ea63b3e](https://github.com/dcmjs-org/dcmjs/commit/ea63b3ef88ace08ff1291a2f67989d027e51e41e)) +- **viewport:** Various viewport-related changes and improvements ([#1324](https://github.com/dcmjs-org/dcmjs/issues/1324)) ([ea63b3e](https://github.com/dcmjs-org/dcmjs/commit/ea63b3ef88ace08ff1291a2f67989d027e51e41e)) # [2.0.0-beta.10](https://github.com/dcmjs-org/dcmjs/compare/v2.0.0-beta.9...v2.0.0-beta.10) (2024-06-13) @@ -1397,7 +1397,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **dicom loader:** switch the build to es modules with types ([#1322](https://github.com/dcmjs-org/dcmjs/issues/1322)) ([89e95eb](https://github.com/dcmjs-org/dcmjs/commit/89e95eba292e3322c031d92bcc71a39bdd65e330)) +- **dicom loader:** switch the build to es modules with types ([#1322](https://github.com/dcmjs-org/dcmjs/issues/1322)) ([89e95eb](https://github.com/dcmjs-org/dcmjs/commit/89e95eba292e3322c031d92bcc71a39bdd65e330)) # [2.0.0-beta.8](https://github.com/dcmjs-org/dcmjs/compare/v2.0.0-beta.7...v2.0.0-beta.8) (2024-06-12) @@ -1407,7 +1407,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **structuredClone:** drop lodash.clonedeep in favor of structuredClone ([#517](https://github.com/dcmjs-org/dcmjs/issues/517)) ([04c863d](https://github.com/dcmjs-org/dcmjs/commit/04c863d442195ed9ad8271a581be646d78baca70)) +- **structuredClone:** drop lodash.clonedeep in favor of structuredClone ([#517](https://github.com/dcmjs-org/dcmjs/issues/517)) ([04c863d](https://github.com/dcmjs-org/dcmjs/commit/04c863d442195ed9ad8271a581be646d78baca70)) ## [1.84.1](https://github.com/dcmjs-org/dcmjs/compare/v1.84.0...v1.84.1) (2024-08-19) @@ -1437,7 +1437,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **pmap:** added parametric map adapter ([#1382](https://github.com/dcmjs-org/dcmjs/issues/1382)) ([4b5705d](https://github.com/dcmjs-org/dcmjs/commit/4b5705d937c202fb9f84c5aac2158e9577aa5aa4)) +- **pmap:** added parametric map adapter ([#1382](https://github.com/dcmjs-org/dcmjs/issues/1382)) ([4b5705d](https://github.com/dcmjs-org/dcmjs/commit/4b5705d937c202fb9f84c5aac2158e9577aa5aa4)) ## [1.82.7](https://github.com/dcmjs-org/dcmjs/compare/v1.82.6...v1.82.7) (2024-07-24) @@ -1499,7 +1499,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **pmap:** added parametric map adapter ([#1382](https://github.com/dcmjs-org/dcmjs/issues/1382)) ([4b5705d](https://github.com/dcmjs-org/dcmjs/commit/4b5705d937c202fb9f84c5aac2158e9577aa5aa4)) +- **pmap:** added parametric map adapter ([#1382](https://github.com/dcmjs-org/dcmjs/issues/1382)) ([4b5705d](https://github.com/dcmjs-org/dcmjs/commit/4b5705d937c202fb9f84c5aac2158e9577aa5aa4)) ## [1.82.7](https://github.com/dcmjs-org/dcmjs/compare/v1.82.6...v1.82.7) (2024-07-24) @@ -1709,7 +1709,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **adapters-export:** Set SpecificCharacterSet to "ISO_IR 192" in Cornerstone and Cornerstone3D adapters ([#1257](https://github.com/dcmjs-org/dcmjs/issues/1257)) ([03a51a2](https://github.com/dcmjs-org/dcmjs/commit/03a51a2f81f2126926c7bead455de58d5b364990)) +- **adapters-export:** Set SpecificCharacterSet to "ISO_IR 192" in Cornerstone and Cornerstone3D adapters ([#1257](https://github.com/dcmjs-org/dcmjs/issues/1257)) ([03a51a2](https://github.com/dcmjs-org/dcmjs/commit/03a51a2f81f2126926c7bead455de58d5b364990)) # [1.74.0](https://github.com/dcmjs-org/dcmjs/compare/v1.73.1...v1.74.0) (2024-05-17) @@ -1863,13 +1863,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **cornerstone-dicom-sr:** Freehand SR hydration support ([#1160](https://github.com/dcmjs-org/dcmjs/issues/1160)) ([5e778a1](https://github.com/dcmjs-org/dcmjs/commit/5e778a1b637eaeb85fe3d3c3120388a322d33c53)) +- **cornerstone-dicom-sr:** Freehand SR hydration support ([#1160](https://github.com/dcmjs-org/dcmjs/issues/1160)) ([5e778a1](https://github.com/dcmjs-org/dcmjs/commit/5e778a1b637eaeb85fe3d3c3120388a322d33c53)) # [1.68.0](https://github.com/dcmjs-org/dcmjs/compare/v1.67.1...v1.68.0) (2024-03-29) ### Features -- **MetaDataProvider:** Update metadata provider ([#1165](https://github.com/dcmjs-org/dcmjs/issues/1165)) ([df5583d](https://github.com/dcmjs-org/dcmjs/commit/df5583dbac34087182887ea2ca457416a77bf0b6)) +- **MetaDataProvider:** Update metadata provider ([#1165](https://github.com/dcmjs-org/dcmjs/issues/1165)) ([df5583d](https://github.com/dcmjs-org/dcmjs/commit/df5583dbac34087182887ea2ca457416a77bf0b6)) ## [1.67.1](https://github.com/dcmjs-org/dcmjs/compare/v1.67.0...v1.67.1) (2024-03-28) @@ -1959,7 +1959,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **bundles:** try to bundle adapters correctly ([#1124](https://github.com/dcmjs-org/dcmjs/issues/1124)) ([143e2b5](https://github.com/dcmjs-org/dcmjs/commit/143e2b5c8a7e4955f17c4483991ef591f07f452f)) +- **bundles:** try to bundle adapters correctly ([#1124](https://github.com/dcmjs-org/dcmjs/issues/1124)) ([143e2b5](https://github.com/dcmjs-org/dcmjs/commit/143e2b5c8a7e4955f17c4483991ef591f07f452f)) ## [1.64.2](https://github.com/dcmjs-org/dcmjs/compare/v1.64.1...v1.64.2) (2024-02-26) @@ -2173,7 +2173,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **interpolation:** Contour segmentation interpolation for freehand and SplineROI ([#1003](https://github.com/dcmjs-org/dcmjs/issues/1003)) ([8434c8e](https://github.com/dcmjs-org/dcmjs/commit/8434c8e7386c1e5980099c325e087c60e8c270a1)) +- **interpolation:** Contour segmentation interpolation for freehand and SplineROI ([#1003](https://github.com/dcmjs-org/dcmjs/issues/1003)) ([8434c8e](https://github.com/dcmjs-org/dcmjs/commit/8434c8e7386c1e5980099c325e087c60e8c270a1)) ## [1.48.2](https://github.com/dcmjs-org/dcmjs/compare/v1.48.1...v1.48.2) (2024-01-22) @@ -2215,7 +2215,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **UltrasoundDirectionalTool:** add us directional adapter ([#999](https://github.com/dcmjs-org/dcmjs/issues/999)) ([1f78fd2](https://github.com/dcmjs-org/dcmjs/commit/1f78fd2859865ad19200096378ff7ce224209fb5)) +- **UltrasoundDirectionalTool:** add us directional adapter ([#999](https://github.com/dcmjs-org/dcmjs/issues/999)) ([1f78fd2](https://github.com/dcmjs-org/dcmjs/commit/1f78fd2859865ad19200096378ff7ce224209fb5)) ## [1.45.1](https://github.com/dcmjs-org/dcmjs/compare/v1.45.0...v1.45.1) (2024-01-12) @@ -2245,7 +2245,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **segmentation:** notify overlapping segments in generateToolState function ([#989](https://github.com/dcmjs-org/dcmjs/issues/989)) ([626cdbc](https://github.com/dcmjs-org/dcmjs/commit/626cdbc94d27c148ecd18ac8032174e2f202afbd)) +- **segmentation:** notify overlapping segments in generateToolState function ([#989](https://github.com/dcmjs-org/dcmjs/issues/989)) ([626cdbc](https://github.com/dcmjs-org/dcmjs/commit/626cdbc94d27c148ecd18ac8032174e2f202afbd)) ## [1.43.6](https://github.com/dcmjs-org/dcmjs/compare/v1.43.5...v1.43.6) (2024-01-08) @@ -2275,7 +2275,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **vtk.js:** Upgrade version and add Segment Select Tool ([#922](https://github.com/dcmjs-org/dcmjs/issues/922)) ([d5f6abb](https://github.com/dcmjs-org/dcmjs/commit/d5f6abbfd0ca7f868d229696d27f047fb47f99cc)) +- **vtk.js:** Upgrade version and add Segment Select Tool ([#922](https://github.com/dcmjs-org/dcmjs/issues/922)) ([d5f6abb](https://github.com/dcmjs-org/dcmjs/commit/d5f6abbfd0ca7f868d229696d27f047fb47f99cc)) ## [1.42.1](https://github.com/dcmjs-org/dcmjs/compare/v1.42.0...v1.42.1) (2024-01-03) @@ -2285,7 +2285,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **tool:** Bidirectional creation on largest segment slice ([#937](https://github.com/dcmjs-org/dcmjs/issues/937)) ([b4ee6bf](https://github.com/dcmjs-org/dcmjs/commit/b4ee6bfdad64c208e37183a39681ba80c06ffe85)) +- **tool:** Bidirectional creation on largest segment slice ([#937](https://github.com/dcmjs-org/dcmjs/issues/937)) ([b4ee6bf](https://github.com/dcmjs-org/dcmjs/commit/b4ee6bfdad64c208e37183a39681ba80c06ffe85)) # [1.41.0](https://github.com/dcmjs-org/dcmjs/compare/v1.40.3...v1.41.0) (2023-12-15) @@ -2319,7 +2319,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- Provide access to tracking unique measurement to allow combining parts of a measurement ([#932](https://github.com/dcmjs-org/dcmjs/issues/932)) ([65245ce](https://github.com/dcmjs-org/dcmjs/commit/65245ce8924776e20c78b18b6e5a86283b6e2668)) +- Provide access to tracking unique measurement to allow combining parts of a measurement ([#932](https://github.com/dcmjs-org/dcmjs/issues/932)) ([65245ce](https://github.com/dcmjs-org/dcmjs/commit/65245ce8924776e20c78b18b6e5a86283b6e2668)) ## [1.37.1](https://github.com/dcmjs-org/dcmjs/compare/v1.37.0...v1.37.1) (2023-12-11) @@ -2345,7 +2345,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **segmentation:** segmentation color change and fix seg import([#920](https://github.com/dcmjs-org/dcmjs/issues/920)) ([3af4437](https://github.com/dcmjs-org/dcmjs/commit/3af4437c4b20f7cc2556de4d655fc8f118e310a4)) +- **segmentation:** segmentation color change and fix seg import([#920](https://github.com/dcmjs-org/dcmjs/issues/920)) ([3af4437](https://github.com/dcmjs-org/dcmjs/commit/3af4437c4b20f7cc2556de4d655fc8f118e310a4)) ## [1.35.3](https://github.com/dcmjs-org/dcmjs/compare/v1.35.2...v1.35.3) (2023-12-01) @@ -2483,7 +2483,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **colormap:** add colormap props and default properties ([#834](https://github.com/dcmjs-org/dcmjs/issues/834)) ([475914d](https://github.com/dcmjs-org/dcmjs/commit/475914d0eaa35f1ae65b989c74efda042dc6d97a)) +- **colormap:** add colormap props and default properties ([#834](https://github.com/dcmjs-org/dcmjs/issues/834)) ([475914d](https://github.com/dcmjs-org/dcmjs/commit/475914d0eaa35f1ae65b989c74efda042dc6d97a)) ## [1.21.2](https://github.com/dcmjs-org/dcmjs/compare/v1.21.1...v1.21.2) (2023-10-16) @@ -2509,13 +2509,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **exports:** clean up rtss exports ([#814](https://github.com/dcmjs-org/dcmjs/issues/814)) ([a0dd324](https://github.com/dcmjs-org/dcmjs/commit/a0dd32499cc58001e4f49e2bda8d034b7f4ef48f)) +- **exports:** clean up rtss exports ([#814](https://github.com/dcmjs-org/dcmjs/issues/814)) ([a0dd324](https://github.com/dcmjs-org/dcmjs/commit/a0dd32499cc58001e4f49e2bda8d034b7f4ef48f)) # [1.20.0](https://github.com/dcmjs-org/dcmjs/compare/v1.19.4...v1.20.0) (2023-10-06) ### Features -- **adapter:** add RTSS Adapter and Labelmaps to Contours convertor ([#734](https://github.com/dcmjs-org/dcmjs/issues/734)) ([e3e05bd](https://github.com/dcmjs-org/dcmjs/commit/e3e05bd5ec0d851576fc76a2440e688c0a6e70d9)) +- **adapter:** add RTSS Adapter and Labelmaps to Contours convertor ([#734](https://github.com/dcmjs-org/dcmjs/issues/734)) ([e3e05bd](https://github.com/dcmjs-org/dcmjs/commit/e3e05bd5ec0d851576fc76a2440e688c0a6e70d9)) ## [1.19.4](https://github.com/dcmjs-org/dcmjs/compare/v1.19.3...v1.19.4) (2023-10-04) @@ -2581,7 +2581,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **cine:** fix cine black images for slow computers ([#761](https://github.com/dcmjs-org/dcmjs/issues/761)) ([b110bda](https://github.com/dcmjs-org/dcmjs/commit/b110bdad1d5c561721d379bbd20cfe07639756ef)) +- **cine:** fix cine black images for slow computers ([#761](https://github.com/dcmjs-org/dcmjs/issues/761)) ([b110bda](https://github.com/dcmjs-org/dcmjs/commit/b110bdad1d5c561721d379bbd20cfe07639756ef)) # [1.15.0](https://github.com/dcmjs-org/dcmjs/compare/v1.14.4...v1.15.0) (2023-09-12) @@ -2611,7 +2611,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **brush size:** brush size should be calculated in world not in canvas ([#771](https://github.com/dcmjs-org/dcmjs/issues/771)) ([6ca1e3a](https://github.com/dcmjs-org/dcmjs/commit/6ca1e3a6d7bc445bbe8aed08a46ec4998f9f8c54)) +- **brush size:** brush size should be calculated in world not in canvas ([#771](https://github.com/dcmjs-org/dcmjs/issues/771)) ([6ca1e3a](https://github.com/dcmjs-org/dcmjs/commit/6ca1e3a6d7bc445bbe8aed08a46ec4998f9f8c54)) ## [1.13.2](https://github.com/dcmjs-org/dcmjs/compare/v1.13.1...v1.13.2) (2023-09-05) @@ -2621,7 +2621,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- **Adapters:** adaptersSEG cornerstoneSR to cornerstoneSEG ([#766](https://github.com/dcmjs-org/dcmjs/issues/766)) ([e5d7826](https://github.com/dcmjs-org/dcmjs/commit/e5d78260320681714c6371a1747bdab8956e6e6b)) +- **Adapters:** adaptersSEG cornerstoneSR to cornerstoneSEG ([#766](https://github.com/dcmjs-org/dcmjs/issues/766)) ([e5d7826](https://github.com/dcmjs-org/dcmjs/commit/e5d78260320681714c6371a1747bdab8956e6e6b)) # [1.13.0](https://github.com/dcmjs-org/dcmjs/compare/v1.12.1...v1.13.0) (2023-08-30) @@ -2703,7 +2703,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **segmentation export:** add new cornerstone3D segmentation export adapter ([#692](https://github.com/dcmjs-org/dcmjs/issues/692)) ([9e743f5](https://github.com/dcmjs-org/dcmjs/commit/9e743f5d2b58dedb17dcbe0de40f42e703f77b14)) +- **segmentation export:** add new cornerstone3D segmentation export adapter ([#692](https://github.com/dcmjs-org/dcmjs/issues/692)) ([9e743f5](https://github.com/dcmjs-org/dcmjs/commit/9e743f5d2b58dedb17dcbe0de40f42e703f77b14)) ## [1.7.2](https://github.com/dcmjs-org/dcmjs/compare/v1.7.1...v1.7.2) (2023-07-27) @@ -2721,7 +2721,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Features -- **calibration:** Add calibration type labels (ERMF, PROJ, USER) ([#638](https://github.com/dcmjs-org/dcmjs/issues/638)) ([0aafbc2](https://github.com/dcmjs-org/dcmjs/commit/0aafbc2be6f50f4733792b7eb924863ec3200f23)) +- **calibration:** Add calibration type labels (ERMF, PROJ, USER) ([#638](https://github.com/dcmjs-org/dcmjs/issues/638)) ([0aafbc2](https://github.com/dcmjs-org/dcmjs/commit/0aafbc2be6f50f4733792b7eb924863ec3200f23)) # [1.5.0](https://github.com/dcmjs-org/dcmjs/compare/v1.4.6...v1.5.0) (2023-07-18) @@ -2851,263 +2851,263 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ### Bug Fixes -- 🐛 adding readme notes ([#191](https://github.com/dcmjs-org/dcmjs/issues/191)) ([459260d](https://github.com/dcmjs-org/dcmjs/commit/459260d6e2a6f905729ddf68b1f12d3140b53849)) -- 🐛 fix array format regression from commit 70b24332783d63c9db2ed21d512d9f7b526c5222 ([#236](https://github.com/dcmjs-org/dcmjs/issues/236)) ([5441063](https://github.com/dcmjs-org/dcmjs/commit/5441063d0395ede6d9f8bd3ac0d92ee14f6ef209)) -- 🐛 Fix rotation mapping for SEG cornerstone adapter ([#151](https://github.com/dcmjs-org/dcmjs/issues/151)) ([3fab68c](https://github.com/dcmjs-org/dcmjs/commit/3fab68cbfd95f82820663b9fc99a2b0cd07e43c8)) -- 🐛 Harden Segmentation import for different possible SEGs ([#146](https://github.com/dcmjs-org/dcmjs/issues/146)) ([c4952bc](https://github.com/dcmjs-org/dcmjs/commit/c4952bc5842bab80a5d928de0d860f89afc8f400)) -- 🐛 IDC Re [#2003](https://github.com/dcmjs-org/dcmjs/issues/2003): fix regression in parsing segmentation orietations ([#220](https://github.com/dcmjs-org/dcmjs/issues/220)) ([5c0c6a8](https://github.com/dcmjs-org/dcmjs/commit/5c0c6a85e67b25ce5f39412ced37d8e825691481)) -- 🐛 IDC2733: find segmentations reference source image Ids ([#253](https://github.com/dcmjs-org/dcmjs/issues/253)) ([f3e7101](https://github.com/dcmjs-org/dcmjs/commit/f3e71016dffa233bf0fb912cc7cf413718b8a1a9)) -- 🐛 ignore frames without SourceImageSequence information when loading a segmentation ([#198](https://github.com/dcmjs-org/dcmjs/issues/198)) ([82709c4](https://github.com/dcmjs-org/dcmjs/commit/82709c4a8a317aa1354244010300ab9b902802dd)) -- 🐛 indentation in nearlyEqual ([#202](https://github.com/dcmjs-org/dcmjs/issues/202)) ([989d6c9](https://github.com/dcmjs-org/dcmjs/commit/989d6c9a80686425563c55424ac1795e6a06cd7b)) -- 🐛 relax condition in nearlyEquals check for detecting numbers near to zero ([#304](https://github.com/dcmjs-org/dcmjs/issues/304)) ([974cddd](https://github.com/dcmjs-org/dcmjs/commit/974cddd785c076f1ac0211b534a7c0b82a4ba68a)) -- 🐛 When converting to multiframe, fix IPP issues ([#152](https://github.com/dcmjs-org/dcmjs/issues/152)) ([80496e4](https://github.com/dcmjs-org/dcmjs/commit/80496e422152c1a3dfd850a145011dd3dc632964)) -- **adapter:** Removed comment around getTID300RepresentationArguments 'tool' parameter ([#322](https://github.com/dcmjs-org/dcmjs/issues/322)) ([d8f05ff](https://github.com/dcmjs-org/dcmjs/commit/d8f05ffb9ef1b5cce254980a597b4c428ffdfb6e)), closes [#306](https://github.com/dcmjs-org/dcmjs/issues/306) -- **adapters:** Measurement reports can throw exceptions that prevent loading ([#458](https://github.com/dcmjs-org/dcmjs/issues/458)) ([7bc7d8a](https://github.com/dcmjs-org/dcmjs/commit/7bc7d8aaeb5aa0df91c24e278665d14f590ec234)) -- **adapters:** Update rollup to newer version ([#407](https://github.com/dcmjs-org/dcmjs/issues/407)) ([543675f](https://github.com/dcmjs-org/dcmjs/commit/543675f1269f8b739764291b1c27b40470c48c63)) -- **adapters:** Update the build a little to allow debugging into typescript ([#439](https://github.com/dcmjs-org/dcmjs/issues/439)) ([05e6419](https://github.com/dcmjs-org/dcmjs/commit/05e6419e1a6705f40c367ac4b52c3975f6fd25c6)) -- **adapter:** The rectangle encoding of SR ([#437](https://github.com/dcmjs-org/dcmjs/issues/437)) ([bff23ec](https://github.com/dcmjs-org/dcmjs/commit/bff23ecfe551312a1339211ddb7838993514a377)) -- **add check for nullable numeric string vrs:** adds a check for nullable numeric strinv vrs ([#150](https://github.com/dcmjs-org/dcmjs/issues/150)) ([75046c4](https://github.com/dcmjs-org/dcmjs/commit/75046c4e1b2830dd3a32dc8d6938f6def71940a5)) -- **anonymizer:** [FIX & TESTS] cleanTags : check if param is undefined. Add 3 test ([#308](https://github.com/dcmjs-org/dcmjs/issues/308)) ([44d23d6](https://github.com/dcmjs-org/dcmjs/commit/44d23d6a9e347fcf049053129d4d7323a9258b71)) -- ArrowAnnotateTool adapter in Cornerstone3D parsing label ([#270](https://github.com/dcmjs-org/dcmjs/issues/270)) ([cb84979](https://github.com/dcmjs-org/dcmjs/commit/cb84979be6eef8835cc7ced006625751a04356aa)) -- avoid using replaceAll() which isn't available in Node.js 14 ([#296](https://github.com/dcmjs-org/dcmjs/issues/296)) ([7aac3ab](https://github.com/dcmjs-org/dcmjs/commit/7aac3ab05fdedfe1a7a159097690bec00c0bcd2b)) -- bug tolerance parameter was not propagated ([#241](https://github.com/dcmjs-org/dcmjs/issues/241)) ([c2ed627](https://github.com/dcmjs-org/dcmjs/commit/c2ed6275ccb80fbbab3c0f9c67893d6b681b0bab)) -- **build:** adapters build missing files ([#400](https://github.com/dcmjs-org/dcmjs/issues/400)) ([901dd88](https://github.com/dcmjs-org/dcmjs/commit/901dd8815e121f29c50da0b1b9764d90d881114b)) -- **build:** Adding exports and files ([#398](https://github.com/dcmjs-org/dcmjs/issues/398)) ([2e8101f](https://github.com/dcmjs-org/dcmjs/commit/2e8101f229aa4c112405cb03558903956fc7e7f8)) -- **build:** fixing publish of adapters in package json ([#396](https://github.com/dcmjs-org/dcmjs/issues/396)) ([5a45b2f](https://github.com/dcmjs-org/dcmjs/commit/5a45b2f9ebeca9b800642d2735720a8d8400cd12)) -- **build:** Include adapters in circleci config ([#402](https://github.com/dcmjs-org/dcmjs/issues/402)) ([45c8416](https://github.com/dcmjs-org/dcmjs/commit/45c84167b40c6a48bb2c499b6153c200763778a0)) -- **build:** try to publish adapters ([#395](https://github.com/dcmjs-org/dcmjs/issues/395)) ([191a17b](https://github.com/dcmjs-org/dcmjs/commit/191a17b690d2ac60ad98a4b8ecb8379a92638d67)) -- checking the length before writing a DS and using exponential if ([#176](https://github.com/dcmjs-org/dcmjs/issues/176)) ([601aa9e](https://github.com/dcmjs-org/dcmjs/commit/601aa9e8a6df26876b08da739451e538d46aa37b)) -- **coding-scheme:** Fix coding scheme for updated standard ([ae3f0b5](https://github.com/dcmjs-org/dcmjs/commit/ae3f0b5bcd398a4230c8fba2954e225fda97cc2f)) -- **cornerstone:** exceptions caused by undefined cached stats in adapters. Safe programming fix only ([#301](https://github.com/dcmjs-org/dcmjs/issues/301)) ([893be43](https://github.com/dcmjs-org/dcmjs/commit/893be433af05f11a03cfce0a572b448303b9334b)) -- **cs:** [#318](https://github.com/dcmjs-org/dcmjs/issues/318) - check instance's NumberOfFrames property to see if it is a multi-frame file or not ([#320](https://github.com/dcmjs-org/dcmjs/issues/320)) ([0b030a4](https://github.com/dcmjs-org/dcmjs/commit/0b030a45dd48f22a61a90dfe5bbb5848425960ca)) -- **cs:** Resolves [#316](https://github.com/dcmjs-org/dcmjs/issues/316) Cornerstone3D adaptor - Multiframe support - add "frameNumber" to the Annotation.data ([#317](https://github.com/dcmjs-org/dcmjs/issues/317)) ([5fe862e](https://github.com/dcmjs-org/dcmjs/commit/5fe862e22653d30bfc78e5be5de3669610887727)) -- **dcmjs:** Add a set of accessors to the sequence list so the API is more consistent ([#224](https://github.com/dcmjs-org/dcmjs/issues/224)) ([9dad6c5](https://github.com/dcmjs-org/dcmjs/commit/9dad6c549cb4dd5c351caa13386998cbe48a1ba6)) -- **DicomMessage:** Fix readFile after options were added ([c2b62a1](https://github.com/dcmjs-org/dcmjs/commit/c2b62a13b3afc78516f39b906ca7576537037c20)) -- Elliptical roi when in flipped/rotated state ([#479](https://github.com/dcmjs-org/dcmjs/issues/479)) ([f0961ae](https://github.com/dcmjs-org/dcmjs/commit/f0961ae6f5e912230f2bf17be5acfe30f775bcae)) -- **encoding:** encapsulation is applied for only PixelData ([#199](https://github.com/dcmjs-org/dcmjs/issues/199)) ([ede2950](https://github.com/dcmjs-org/dcmjs/commit/ede2950d530fb189bb5817db6b5285e2be74ffee)), closes [#194](https://github.com/dcmjs-org/dcmjs/issues/194) -- Ensure DS and IS Value Representations are returned as arrays ([#83](https://github.com/dcmjs-org/dcmjs/issues/83)) ([a264661](https://github.com/dcmjs-org/dcmjs/commit/a264661d5a0a899b761c58492955f6d18cc03a4d)) -- exception writing NaN and Infinity values of FD tags ([#325](https://github.com/dcmjs-org/dcmjs/issues/325)) ([e86daaa](https://github.com/dcmjs-org/dcmjs/commit/e86daaad4c47e7ec2c135b94f0b0de622de69310)) -- Export loglevelnext logger as dcmjs.log for configuration ([#156](https://github.com/dcmjs-org/dcmjs/issues/156)) ([33515e5](https://github.com/dcmjs-org/dcmjs/commit/33515e5fe3f581d71278674860834ee1ea932faa)) -- Fix UN & AT VR processing logic ([#167](https://github.com/dcmjs-org/dcmjs/issues/167)) ([#168](https://github.com/dcmjs-org/dcmjs/issues/168)) ([7cb975a](https://github.com/dcmjs-org/dcmjs/commit/7cb975af106d2e3e943881a7dac06f1fe391809c)) -- force a release for commit caaac4b ([#240](https://github.com/dcmjs-org/dcmjs/issues/240)) ([f53b630](https://github.com/dcmjs-org/dcmjs/commit/f53b6306ce138c5ad3106015c4751b63fbcca362)) -- **fragment:** Refactor and fragment bug ([#283](https://github.com/dcmjs-org/dcmjs/issues/283)) ([307d60a](https://github.com/dcmjs-org/dcmjs/commit/307d60a6ffecf7d96bc729a37a45775c6b6e189c)), closes [#282](https://github.com/dcmjs-org/dcmjs/issues/282) -- **fragment:** write padding to even length on final fragments of encapsulated frame data ([#294](https://github.com/dcmjs-org/dcmjs/issues/294)) ([34b7561](https://github.com/dcmjs-org/dcmjs/commit/34b7561fa48870a87b948eb427d4e32808b4d40e)), closes [#293](https://github.com/dcmjs-org/dcmjs/issues/293) -- **idc-02252:** typo + release ([#180](https://github.com/dcmjs-org/dcmjs/issues/180)) ([3f5cb24](https://github.com/dcmjs-org/dcmjs/commit/3f5cb24fd0e50668d36dc21390a1ff527505a8db)) -- **image-comments:** Move ImageComments to DerivedPixels ([da11200](https://github.com/dcmjs-org/dcmjs/commit/da112001e3c1c01b30acbd634fd9b2f46a9d3a63)) -- **import:** missing import for addAccessors ([#295](https://github.com/dcmjs-org/dcmjs/issues/295)) ([6b631b6](https://github.com/dcmjs-org/dcmjs/commit/6b631b6c8bdb2a7a70637308c9ebfe849fe9ccaf)) -- infinite loop on dcm with no meta length ([#331](https://github.com/dcmjs-org/dcmjs/issues/331)) ([51b156b](https://github.com/dcmjs-org/dcmjs/commit/51b156bf1278fc0f9476de70c89697576c0f4b55)) -- Invalid VR of the private creator tag of the "Implicit VR Endian" typed DICOM file ([#242](https://github.com/dcmjs-org/dcmjs/issues/242)) ([#243](https://github.com/dcmjs-org/dcmjs/issues/243)) ([6d0552f](https://github.com/dcmjs-org/dcmjs/commit/6d0552fb96c59dcf3e39b3306a50004b24128330)) -- issues in binary tag parsing ([#276](https://github.com/dcmjs-org/dcmjs/issues/276)) ([60c3af1](https://github.com/dcmjs-org/dcmjs/commit/60c3af1654b8f64baea1cd47f1049fd16ea2fee8)) -- **measurement-report:** Fix issues with Measurement Report for Bidirectional measurements ([25cf222](https://github.com/dcmjs-org/dcmjs/commit/25cf222e9d80bbe5b68854362383ac4fcaec7f6c)) -- **measurement-report:** Fix ReferencedFrameNumber usage in MeasurementReport ([b80cd2a](https://github.com/dcmjs-org/dcmjs/commit/b80cd2af070d0280295e88ee24d7e4d43c4af861)) -- **naturalize:** revert single element sequence ([#223](https://github.com/dcmjs-org/dcmjs/issues/223)) ([0743ed3](https://github.com/dcmjs-org/dcmjs/commit/0743ed34f657b622d4868fe5db37015ad1aa7850)) -- **naturalizing:** Fix the exception on naturalize twice ([#237](https://github.com/dcmjs-org/dcmjs/issues/237)) ([abced98](https://github.com/dcmjs-org/dcmjs/commit/abced980dccbabce7c4b159600f89c25ba747076)) -- **parsing:** can't read an encapsulated frame whose size is greater than fragment size ([#205](https://github.com/dcmjs-org/dcmjs/issues/205)) ([176875d](https://github.com/dcmjs-org/dcmjs/commit/176875d0c9c34704302512d2c27103db205b1c8f)), closes [#204](https://github.com/dcmjs-org/dcmjs/issues/204) -- Re IDC [#2761](https://github.com/dcmjs-org/dcmjs/issues/2761) fix loading of segmentations ([#258](https://github.com/dcmjs-org/dcmjs/issues/258)) ([ceaf09a](https://github.com/dcmjs-org/dcmjs/commit/ceaf09af74f5727205e5d5869c97114b2c283ae5)) -- **Segmentation_4X:** Update tag name in getSegmentIndex method for segs ([#183](https://github.com/dcmjs-org/dcmjs/issues/183)) ([1e96ee3](https://github.com/dcmjs-org/dcmjs/commit/1e96ee3ce3280900d56f1887da81471f9b128d30)) -- **seg:** Use ReferencedSegmentNumber in shared fg ([#166](https://github.com/dcmjs-org/dcmjs/issues/166)) ([0ed3347](https://github.com/dcmjs-org/dcmjs/commit/0ed33477bb1c13b05d682c342edaf0a901fe0f7a)) -- several issues with character set handling ([#299](https://github.com/dcmjs-org/dcmjs/issues/299)) ([8e22107](https://github.com/dcmjs-org/dcmjs/commit/8e221074179b6d33b82ab5c6f1ae4c06c5522d6b)) -- **tests:** unified test data loading ([#292](https://github.com/dcmjs-org/dcmjs/issues/292)) ([c34f398](https://github.com/dcmjs-org/dcmjs/commit/c34f39813755227b79f7a0958a81a5e5c0935b73)) -- **update jsdocs, cut release:** release ([#203](https://github.com/dcmjs-org/dcmjs/issues/203)) ([307974c](https://github.com/dcmjs-org/dcmjs/commit/307974cb399d07152e0f6d4dd9f40fe1c17f076e)) -- update readme to trigger release ([#257](https://github.com/dcmjs-org/dcmjs/issues/257)) ([554f50d](https://github.com/dcmjs-org/dcmjs/commit/554f50d838fbcbeed25460c7384e14dc46bebb11)) -- update variable name for frame index ([#332](https://github.com/dcmjs-org/dcmjs/issues/332)) ([5515d6e](https://github.com/dcmjs-org/dcmjs/commit/5515d6e0abe11dee04f9b75272d3fbb5d00b2bd7)) -- use metadataProvider option instead of cornerstone.metaData ([#280](https://github.com/dcmjs-org/dcmjs/issues/280)) ([3a0e484](https://github.com/dcmjs-org/dcmjs/commit/3a0e484d203770cd309e2bd9f78946a733e79d0c)) -- **utilities:** Export Bidirectional and Polyline inside TID300 ([75e0e29](https://github.com/dcmjs-org/dcmjs/commit/75e0e29f771843a80bfa32532d2186a4e7cdbd57)) -- **VR:** added support for specific character set ([#291](https://github.com/dcmjs-org/dcmjs/issues/291)) ([f103d19](https://github.com/dcmjs-org/dcmjs/commit/f103d1918d02780c4881db5c8aa30f653c4da6b6)) -- **vr:** Convert empty DecimalString and NumberString to null instead of to zero ([#278](https://github.com/dcmjs-org/dcmjs/issues/278)) ([43cd8ea](https://github.com/dcmjs-org/dcmjs/commit/43cd8eaa316a08ff1a025b1267fedda239526acb)) -- **writeBytes:** create release from commit ([d9a4105](https://github.com/dcmjs-org/dcmjs/commit/d9a41050e756f9b7e56ef4ae3d5000ce86ea39eb)) +- 🐛 adding readme notes ([#191](https://github.com/dcmjs-org/dcmjs/issues/191)) ([459260d](https://github.com/dcmjs-org/dcmjs/commit/459260d6e2a6f905729ddf68b1f12d3140b53849)) +- 🐛 fix array format regression from commit 70b24332783d63c9db2ed21d512d9f7b526c5222 ([#236](https://github.com/dcmjs-org/dcmjs/issues/236)) ([5441063](https://github.com/dcmjs-org/dcmjs/commit/5441063d0395ede6d9f8bd3ac0d92ee14f6ef209)) +- 🐛 Fix rotation mapping for SEG cornerstone adapter ([#151](https://github.com/dcmjs-org/dcmjs/issues/151)) ([3fab68c](https://github.com/dcmjs-org/dcmjs/commit/3fab68cbfd95f82820663b9fc99a2b0cd07e43c8)) +- 🐛 Harden Segmentation import for different possible SEGs ([#146](https://github.com/dcmjs-org/dcmjs/issues/146)) ([c4952bc](https://github.com/dcmjs-org/dcmjs/commit/c4952bc5842bab80a5d928de0d860f89afc8f400)) +- 🐛 IDC Re [#2003](https://github.com/dcmjs-org/dcmjs/issues/2003): fix regression in parsing segmentation orietations ([#220](https://github.com/dcmjs-org/dcmjs/issues/220)) ([5c0c6a8](https://github.com/dcmjs-org/dcmjs/commit/5c0c6a85e67b25ce5f39412ced37d8e825691481)) +- 🐛 IDC2733: find segmentations reference source image Ids ([#253](https://github.com/dcmjs-org/dcmjs/issues/253)) ([f3e7101](https://github.com/dcmjs-org/dcmjs/commit/f3e71016dffa233bf0fb912cc7cf413718b8a1a9)) +- 🐛 ignore frames without SourceImageSequence information when loading a segmentation ([#198](https://github.com/dcmjs-org/dcmjs/issues/198)) ([82709c4](https://github.com/dcmjs-org/dcmjs/commit/82709c4a8a317aa1354244010300ab9b902802dd)) +- 🐛 indentation in nearlyEqual ([#202](https://github.com/dcmjs-org/dcmjs/issues/202)) ([989d6c9](https://github.com/dcmjs-org/dcmjs/commit/989d6c9a80686425563c55424ac1795e6a06cd7b)) +- 🐛 relax condition in nearlyEquals check for detecting numbers near to zero ([#304](https://github.com/dcmjs-org/dcmjs/issues/304)) ([974cddd](https://github.com/dcmjs-org/dcmjs/commit/974cddd785c076f1ac0211b534a7c0b82a4ba68a)) +- 🐛 When converting to multiframe, fix IPP issues ([#152](https://github.com/dcmjs-org/dcmjs/issues/152)) ([80496e4](https://github.com/dcmjs-org/dcmjs/commit/80496e422152c1a3dfd850a145011dd3dc632964)) +- **adapter:** Removed comment around getTID300RepresentationArguments 'tool' parameter ([#322](https://github.com/dcmjs-org/dcmjs/issues/322)) ([d8f05ff](https://github.com/dcmjs-org/dcmjs/commit/d8f05ffb9ef1b5cce254980a597b4c428ffdfb6e)), closes [#306](https://github.com/dcmjs-org/dcmjs/issues/306) +- **adapters:** Measurement reports can throw exceptions that prevent loading ([#458](https://github.com/dcmjs-org/dcmjs/issues/458)) ([7bc7d8a](https://github.com/dcmjs-org/dcmjs/commit/7bc7d8aaeb5aa0df91c24e278665d14f590ec234)) +- **adapters:** Update rollup to newer version ([#407](https://github.com/dcmjs-org/dcmjs/issues/407)) ([543675f](https://github.com/dcmjs-org/dcmjs/commit/543675f1269f8b739764291b1c27b40470c48c63)) +- **adapters:** Update the build a little to allow debugging into typescript ([#439](https://github.com/dcmjs-org/dcmjs/issues/439)) ([05e6419](https://github.com/dcmjs-org/dcmjs/commit/05e6419e1a6705f40c367ac4b52c3975f6fd25c6)) +- **adapter:** The rectangle encoding of SR ([#437](https://github.com/dcmjs-org/dcmjs/issues/437)) ([bff23ec](https://github.com/dcmjs-org/dcmjs/commit/bff23ecfe551312a1339211ddb7838993514a377)) +- **add check for nullable numeric string vrs:** adds a check for nullable numeric strinv vrs ([#150](https://github.com/dcmjs-org/dcmjs/issues/150)) ([75046c4](https://github.com/dcmjs-org/dcmjs/commit/75046c4e1b2830dd3a32dc8d6938f6def71940a5)) +- **anonymizer:** [FIX & TESTS] cleanTags : check if param is undefined. Add 3 test ([#308](https://github.com/dcmjs-org/dcmjs/issues/308)) ([44d23d6](https://github.com/dcmjs-org/dcmjs/commit/44d23d6a9e347fcf049053129d4d7323a9258b71)) +- ArrowAnnotateTool adapter in Cornerstone3D parsing label ([#270](https://github.com/dcmjs-org/dcmjs/issues/270)) ([cb84979](https://github.com/dcmjs-org/dcmjs/commit/cb84979be6eef8835cc7ced006625751a04356aa)) +- avoid using replaceAll() which isn't available in Node.js 14 ([#296](https://github.com/dcmjs-org/dcmjs/issues/296)) ([7aac3ab](https://github.com/dcmjs-org/dcmjs/commit/7aac3ab05fdedfe1a7a159097690bec00c0bcd2b)) +- bug tolerance parameter was not propagated ([#241](https://github.com/dcmjs-org/dcmjs/issues/241)) ([c2ed627](https://github.com/dcmjs-org/dcmjs/commit/c2ed6275ccb80fbbab3c0f9c67893d6b681b0bab)) +- **build:** adapters build missing files ([#400](https://github.com/dcmjs-org/dcmjs/issues/400)) ([901dd88](https://github.com/dcmjs-org/dcmjs/commit/901dd8815e121f29c50da0b1b9764d90d881114b)) +- **build:** Adding exports and files ([#398](https://github.com/dcmjs-org/dcmjs/issues/398)) ([2e8101f](https://github.com/dcmjs-org/dcmjs/commit/2e8101f229aa4c112405cb03558903956fc7e7f8)) +- **build:** fixing publish of adapters in package json ([#396](https://github.com/dcmjs-org/dcmjs/issues/396)) ([5a45b2f](https://github.com/dcmjs-org/dcmjs/commit/5a45b2f9ebeca9b800642d2735720a8d8400cd12)) +- **build:** Include adapters in circleci config ([#402](https://github.com/dcmjs-org/dcmjs/issues/402)) ([45c8416](https://github.com/dcmjs-org/dcmjs/commit/45c84167b40c6a48bb2c499b6153c200763778a0)) +- **build:** try to publish adapters ([#395](https://github.com/dcmjs-org/dcmjs/issues/395)) ([191a17b](https://github.com/dcmjs-org/dcmjs/commit/191a17b690d2ac60ad98a4b8ecb8379a92638d67)) +- checking the length before writing a DS and using exponential if ([#176](https://github.com/dcmjs-org/dcmjs/issues/176)) ([601aa9e](https://github.com/dcmjs-org/dcmjs/commit/601aa9e8a6df26876b08da739451e538d46aa37b)) +- **coding-scheme:** Fix coding scheme for updated standard ([ae3f0b5](https://github.com/dcmjs-org/dcmjs/commit/ae3f0b5bcd398a4230c8fba2954e225fda97cc2f)) +- **cornerstone:** exceptions caused by undefined cached stats in adapters. Safe programming fix only ([#301](https://github.com/dcmjs-org/dcmjs/issues/301)) ([893be43](https://github.com/dcmjs-org/dcmjs/commit/893be433af05f11a03cfce0a572b448303b9334b)) +- **cs:** [#318](https://github.com/dcmjs-org/dcmjs/issues/318) - check instance's NumberOfFrames property to see if it is a multi-frame file or not ([#320](https://github.com/dcmjs-org/dcmjs/issues/320)) ([0b030a4](https://github.com/dcmjs-org/dcmjs/commit/0b030a45dd48f22a61a90dfe5bbb5848425960ca)) +- **cs:** Resolves [#316](https://github.com/dcmjs-org/dcmjs/issues/316) Cornerstone3D adaptor - Multiframe support - add "frameNumber" to the Annotation.data ([#317](https://github.com/dcmjs-org/dcmjs/issues/317)) ([5fe862e](https://github.com/dcmjs-org/dcmjs/commit/5fe862e22653d30bfc78e5be5de3669610887727)) +- **dcmjs:** Add a set of accessors to the sequence list so the API is more consistent ([#224](https://github.com/dcmjs-org/dcmjs/issues/224)) ([9dad6c5](https://github.com/dcmjs-org/dcmjs/commit/9dad6c549cb4dd5c351caa13386998cbe48a1ba6)) +- **DicomMessage:** Fix readFile after options were added ([c2b62a1](https://github.com/dcmjs-org/dcmjs/commit/c2b62a13b3afc78516f39b906ca7576537037c20)) +- Elliptical roi when in flipped/rotated state ([#479](https://github.com/dcmjs-org/dcmjs/issues/479)) ([f0961ae](https://github.com/dcmjs-org/dcmjs/commit/f0961ae6f5e912230f2bf17be5acfe30f775bcae)) +- **encoding:** encapsulation is applied for only PixelData ([#199](https://github.com/dcmjs-org/dcmjs/issues/199)) ([ede2950](https://github.com/dcmjs-org/dcmjs/commit/ede2950d530fb189bb5817db6b5285e2be74ffee)), closes [#194](https://github.com/dcmjs-org/dcmjs/issues/194) +- Ensure DS and IS Value Representations are returned as arrays ([#83](https://github.com/dcmjs-org/dcmjs/issues/83)) ([a264661](https://github.com/dcmjs-org/dcmjs/commit/a264661d5a0a899b761c58492955f6d18cc03a4d)) +- exception writing NaN and Infinity values of FD tags ([#325](https://github.com/dcmjs-org/dcmjs/issues/325)) ([e86daaa](https://github.com/dcmjs-org/dcmjs/commit/e86daaad4c47e7ec2c135b94f0b0de622de69310)) +- Export loglevelnext logger as dcmjs.log for configuration ([#156](https://github.com/dcmjs-org/dcmjs/issues/156)) ([33515e5](https://github.com/dcmjs-org/dcmjs/commit/33515e5fe3f581d71278674860834ee1ea932faa)) +- Fix UN & AT VR processing logic ([#167](https://github.com/dcmjs-org/dcmjs/issues/167)) ([#168](https://github.com/dcmjs-org/dcmjs/issues/168)) ([7cb975a](https://github.com/dcmjs-org/dcmjs/commit/7cb975af106d2e3e943881a7dac06f1fe391809c)) +- force a release for commit caaac4b ([#240](https://github.com/dcmjs-org/dcmjs/issues/240)) ([f53b630](https://github.com/dcmjs-org/dcmjs/commit/f53b6306ce138c5ad3106015c4751b63fbcca362)) +- **fragment:** Refactor and fragment bug ([#283](https://github.com/dcmjs-org/dcmjs/issues/283)) ([307d60a](https://github.com/dcmjs-org/dcmjs/commit/307d60a6ffecf7d96bc729a37a45775c6b6e189c)), closes [#282](https://github.com/dcmjs-org/dcmjs/issues/282) +- **fragment:** write padding to even length on final fragments of encapsulated frame data ([#294](https://github.com/dcmjs-org/dcmjs/issues/294)) ([34b7561](https://github.com/dcmjs-org/dcmjs/commit/34b7561fa48870a87b948eb427d4e32808b4d40e)), closes [#293](https://github.com/dcmjs-org/dcmjs/issues/293) +- **idc-02252:** typo + release ([#180](https://github.com/dcmjs-org/dcmjs/issues/180)) ([3f5cb24](https://github.com/dcmjs-org/dcmjs/commit/3f5cb24fd0e50668d36dc21390a1ff527505a8db)) +- **image-comments:** Move ImageComments to DerivedPixels ([da11200](https://github.com/dcmjs-org/dcmjs/commit/da112001e3c1c01b30acbd634fd9b2f46a9d3a63)) +- **import:** missing import for addAccessors ([#295](https://github.com/dcmjs-org/dcmjs/issues/295)) ([6b631b6](https://github.com/dcmjs-org/dcmjs/commit/6b631b6c8bdb2a7a70637308c9ebfe849fe9ccaf)) +- infinite loop on dcm with no meta length ([#331](https://github.com/dcmjs-org/dcmjs/issues/331)) ([51b156b](https://github.com/dcmjs-org/dcmjs/commit/51b156bf1278fc0f9476de70c89697576c0f4b55)) +- Invalid VR of the private creator tag of the "Implicit VR Endian" typed DICOM file ([#242](https://github.com/dcmjs-org/dcmjs/issues/242)) ([#243](https://github.com/dcmjs-org/dcmjs/issues/243)) ([6d0552f](https://github.com/dcmjs-org/dcmjs/commit/6d0552fb96c59dcf3e39b3306a50004b24128330)) +- issues in binary tag parsing ([#276](https://github.com/dcmjs-org/dcmjs/issues/276)) ([60c3af1](https://github.com/dcmjs-org/dcmjs/commit/60c3af1654b8f64baea1cd47f1049fd16ea2fee8)) +- **measurement-report:** Fix issues with Measurement Report for Bidirectional measurements ([25cf222](https://github.com/dcmjs-org/dcmjs/commit/25cf222e9d80bbe5b68854362383ac4fcaec7f6c)) +- **measurement-report:** Fix ReferencedFrameNumber usage in MeasurementReport ([b80cd2a](https://github.com/dcmjs-org/dcmjs/commit/b80cd2af070d0280295e88ee24d7e4d43c4af861)) +- **naturalize:** revert single element sequence ([#223](https://github.com/dcmjs-org/dcmjs/issues/223)) ([0743ed3](https://github.com/dcmjs-org/dcmjs/commit/0743ed34f657b622d4868fe5db37015ad1aa7850)) +- **naturalizing:** Fix the exception on naturalize twice ([#237](https://github.com/dcmjs-org/dcmjs/issues/237)) ([abced98](https://github.com/dcmjs-org/dcmjs/commit/abced980dccbabce7c4b159600f89c25ba747076)) +- **parsing:** can't read an encapsulated frame whose size is greater than fragment size ([#205](https://github.com/dcmjs-org/dcmjs/issues/205)) ([176875d](https://github.com/dcmjs-org/dcmjs/commit/176875d0c9c34704302512d2c27103db205b1c8f)), closes [#204](https://github.com/dcmjs-org/dcmjs/issues/204) +- Re IDC [#2761](https://github.com/dcmjs-org/dcmjs/issues/2761) fix loading of segmentations ([#258](https://github.com/dcmjs-org/dcmjs/issues/258)) ([ceaf09a](https://github.com/dcmjs-org/dcmjs/commit/ceaf09af74f5727205e5d5869c97114b2c283ae5)) +- **Segmentation_4X:** Update tag name in getSegmentIndex method for segs ([#183](https://github.com/dcmjs-org/dcmjs/issues/183)) ([1e96ee3](https://github.com/dcmjs-org/dcmjs/commit/1e96ee3ce3280900d56f1887da81471f9b128d30)) +- **seg:** Use ReferencedSegmentNumber in shared fg ([#166](https://github.com/dcmjs-org/dcmjs/issues/166)) ([0ed3347](https://github.com/dcmjs-org/dcmjs/commit/0ed33477bb1c13b05d682c342edaf0a901fe0f7a)) +- several issues with character set handling ([#299](https://github.com/dcmjs-org/dcmjs/issues/299)) ([8e22107](https://github.com/dcmjs-org/dcmjs/commit/8e221074179b6d33b82ab5c6f1ae4c06c5522d6b)) +- **tests:** unified test data loading ([#292](https://github.com/dcmjs-org/dcmjs/issues/292)) ([c34f398](https://github.com/dcmjs-org/dcmjs/commit/c34f39813755227b79f7a0958a81a5e5c0935b73)) +- **update jsdocs, cut release:** release ([#203](https://github.com/dcmjs-org/dcmjs/issues/203)) ([307974c](https://github.com/dcmjs-org/dcmjs/commit/307974cb399d07152e0f6d4dd9f40fe1c17f076e)) +- update readme to trigger release ([#257](https://github.com/dcmjs-org/dcmjs/issues/257)) ([554f50d](https://github.com/dcmjs-org/dcmjs/commit/554f50d838fbcbeed25460c7384e14dc46bebb11)) +- update variable name for frame index ([#332](https://github.com/dcmjs-org/dcmjs/issues/332)) ([5515d6e](https://github.com/dcmjs-org/dcmjs/commit/5515d6e0abe11dee04f9b75272d3fbb5d00b2bd7)) +- use metadataProvider option instead of cornerstone.metaData ([#280](https://github.com/dcmjs-org/dcmjs/issues/280)) ([3a0e484](https://github.com/dcmjs-org/dcmjs/commit/3a0e484d203770cd309e2bd9f78946a733e79d0c)) +- **utilities:** Export Bidirectional and Polyline inside TID300 ([75e0e29](https://github.com/dcmjs-org/dcmjs/commit/75e0e29f771843a80bfa32532d2186a4e7cdbd57)) +- **VR:** added support for specific character set ([#291](https://github.com/dcmjs-org/dcmjs/issues/291)) ([f103d19](https://github.com/dcmjs-org/dcmjs/commit/f103d1918d02780c4881db5c8aa30f653c4da6b6)) +- **vr:** Convert empty DecimalString and NumberString to null instead of to zero ([#278](https://github.com/dcmjs-org/dcmjs/issues/278)) ([43cd8ea](https://github.com/dcmjs-org/dcmjs/commit/43cd8eaa316a08ff1a025b1267fedda239526acb)) +- **writeBytes:** create release from commit ([d9a4105](https://github.com/dcmjs-org/dcmjs/commit/d9a41050e756f9b7e56ef4ae3d5000ce86ea39eb)) ### Features -- **adapters:** Add adapter for exporting polylines from dicom-microscopy-viewer to DICOM-SR ([#44](https://github.com/dcmjs-org/dcmjs/issues/44)) ([7a1947c](https://github.com/dcmjs-org/dcmjs/commit/7a1947c6ec164da4e9f66e90c1bbf1055978b173)) -- **adapters:** Add adapter to generate segments & geometry from SEG for easier use in VTKjs (migrated from vtkDisplay example) ([398b74d](https://github.com/dcmjs-org/dcmjs/commit/398b74d70deb32824a74e98210127326887dfa77)) -- **adapters:** Add adapters for Rectangle, Angle and fix generate DICOM ([#427](https://github.com/dcmjs-org/dcmjs/issues/427)) ([b8ca75e](https://github.com/dcmjs-org/dcmjs/commit/b8ca75e6ba378f175bd987d07f094f44b41a46cf)) -- **adapters:** First steps for DICOM-SR read support for polylines with dicom-microscopy-viewer ([#49](https://github.com/dcmjs-org/dcmjs/issues/49)) ([37f1888](https://github.com/dcmjs-org/dcmjs/commit/37f18881dd7369818de4aa22c5730012c2829616)) -- Add a CircleROI tool ([#459](https://github.com/dcmjs-org/dcmjs/issues/459)) ([1c03ed3](https://github.com/dcmjs-org/dcmjs/commit/1c03ed3457fbb63bbd87315b90bfed99b1cd09cc)) -- Add Cornerstone3D adapter for Length tool ([#261](https://github.com/dcmjs-org/dcmjs/issues/261)) ([2cab0d9](https://github.com/dcmjs-org/dcmjs/commit/2cab0d9edba20e99b11407d41ed2a4bf60a6ab9b)) -- Add overlapping segment check to Cornerstone 4.x DICOM SEG adapter ([#155](https://github.com/dcmjs-org/dcmjs/issues/155)) ([df44e27](https://github.com/dcmjs-org/dcmjs/commit/df44e27b3b1c26082bf3d7a9477ab7f0d5ca1d19)) -- Allow backslashes in UIDs in order to support DICOM Q&R ([#277](https://github.com/dcmjs-org/dcmjs/issues/277)) ([6d2d5c6](https://github.com/dcmjs-org/dcmjs/commit/6d2d5c60f500174abb1be7757094178ec6a1d144)) -- **anonymizer:** export Array tagNamesToEmpty and modify cleanTags ([#303](https://github.com/dcmjs-org/dcmjs/issues/303)) ([e960085](https://github.com/dcmjs-org/dcmjs/commit/e960085ca08fb28a0a8134fbfee7d450722d8c64)) -- Bidirectional Arrow and EllipticalROI adapters for CS3D ([#264](https://github.com/dcmjs-org/dcmjs/issues/264)) ([1fc7932](https://github.com/dcmjs-org/dcmjs/commit/1fc7932e3eed85fa1a0f857d84bab35a2e62d80d)) -- **CobbAngle:** Add CobbAngle tool ([#353](https://github.com/dcmjs-org/dcmjs/issues/353)) ([b9bd701](https://github.com/dcmjs-org/dcmjs/commit/b9bd701df41ae2b8b2afbcf1d092d7587f7b267a)) -- **contour api:** add api for contour rendering configuration ([#443](https://github.com/dcmjs-org/dcmjs/issues/443)) ([4ab751d](https://github.com/dcmjs-org/dcmjs/commit/4ab751df4082c56b64e4b97e9d6ca6de3c60c7e5)) -- **cornerstone:** Feature add cornerstone adapters ([#225](https://github.com/dcmjs-org/dcmjs/issues/225)) ([23c0877](https://github.com/dcmjs-org/dcmjs/commit/23c08777f7a93d4c0576a5e583113029a1a1e05f)) -- **deflated:** Added support for reading datasets with deflated transfer syntax ([#312](https://github.com/dcmjs-org/dcmjs/issues/312)) ([ee8f8f2](https://github.com/dcmjs-org/dcmjs/commit/ee8f8f21babbbd8eac2b19e8e957db2cc5a09325)) -- **dicomImageLoader types:** Add types to the dicom image loader ([#441](https://github.com/dcmjs-org/dcmjs/issues/441)) ([10a3370](https://github.com/dcmjs-org/dcmjs/commit/10a3370b7f23084d1f2c55506079c17dea959659)), closes [#449](https://github.com/dcmjs-org/dcmjs/issues/449) [#450](https://github.com/dcmjs-org/dcmjs/issues/450) -- **mem:** Zero Copy ArrayBuffer ([#279](https://github.com/dcmjs-org/dcmjs/issues/279)) ([a17f2d7](https://github.com/dcmjs-org/dcmjs/commit/a17f2d75bc102cc789289f0eae51e5b416ce1567)) -- Move adapters from dcmjs for Cornerstone/3d and VTK ([b136a21](https://github.com/dcmjs-org/dcmjs/commit/b136a21fb96bb28c3a10a63b6b78083b897f4e19)) -- **npm:** bump minor version (minor readme edits) ([b48f665](https://github.com/dcmjs-org/dcmjs/commit/b48f665893f5e4b643c68ddc2fc3b13c641b6b29)) -- **readme:** stress need for a PR for npm package ([#310](https://github.com/dcmjs-org/dcmjs/issues/310)) ([dafd78d](https://github.com/dcmjs-org/dcmjs/commit/dafd78d004ccb9d0b505f0b7e0fd461eda9c3710)) -- **sr:** export TID300 - Point class ([#323](https://github.com/dcmjs-org/dcmjs/issues/323)) ([d2aebc3](https://github.com/dcmjs-org/dcmjs/commit/d2aebc3166c23e14dce4d7a8b7f1e2fc933f6328)) -- **structured-reports:** Add initial work on Adapters / Utilities for Imaging Measurement Structured Report input / output ([#17](https://github.com/dcmjs-org/dcmjs/issues/17)) ([941ad75](https://github.com/dcmjs-org/dcmjs/commit/941ad75320eece3368104d08247fdc371497c7cd)) -- **testing:** Use the Jest testing framework and switch to GitHub Actions ([#254](https://github.com/dcmjs-org/dcmjs/issues/254)) ([a91ff2b](https://github.com/dcmjs-org/dcmjs/commit/a91ff2babd2c6a44f20ecbd954ab38901276cf41)) +- **adapters:** Add adapter for exporting polylines from dicom-microscopy-viewer to DICOM-SR ([#44](https://github.com/dcmjs-org/dcmjs/issues/44)) ([7a1947c](https://github.com/dcmjs-org/dcmjs/commit/7a1947c6ec164da4e9f66e90c1bbf1055978b173)) +- **adapters:** Add adapter to generate segments & geometry from SEG for easier use in VTKjs (migrated from vtkDisplay example) ([398b74d](https://github.com/dcmjs-org/dcmjs/commit/398b74d70deb32824a74e98210127326887dfa77)) +- **adapters:** Add adapters for Rectangle, Angle and fix generate DICOM ([#427](https://github.com/dcmjs-org/dcmjs/issues/427)) ([b8ca75e](https://github.com/dcmjs-org/dcmjs/commit/b8ca75e6ba378f175bd987d07f094f44b41a46cf)) +- **adapters:** First steps for DICOM-SR read support for polylines with dicom-microscopy-viewer ([#49](https://github.com/dcmjs-org/dcmjs/issues/49)) ([37f1888](https://github.com/dcmjs-org/dcmjs/commit/37f18881dd7369818de4aa22c5730012c2829616)) +- Add a CircleROI tool ([#459](https://github.com/dcmjs-org/dcmjs/issues/459)) ([1c03ed3](https://github.com/dcmjs-org/dcmjs/commit/1c03ed3457fbb63bbd87315b90bfed99b1cd09cc)) +- Add Cornerstone3D adapter for Length tool ([#261](https://github.com/dcmjs-org/dcmjs/issues/261)) ([2cab0d9](https://github.com/dcmjs-org/dcmjs/commit/2cab0d9edba20e99b11407d41ed2a4bf60a6ab9b)) +- Add overlapping segment check to Cornerstone 4.x DICOM SEG adapter ([#155](https://github.com/dcmjs-org/dcmjs/issues/155)) ([df44e27](https://github.com/dcmjs-org/dcmjs/commit/df44e27b3b1c26082bf3d7a9477ab7f0d5ca1d19)) +- Allow backslashes in UIDs in order to support DICOM Q&R ([#277](https://github.com/dcmjs-org/dcmjs/issues/277)) ([6d2d5c6](https://github.com/dcmjs-org/dcmjs/commit/6d2d5c60f500174abb1be7757094178ec6a1d144)) +- **anonymizer:** export Array tagNamesToEmpty and modify cleanTags ([#303](https://github.com/dcmjs-org/dcmjs/issues/303)) ([e960085](https://github.com/dcmjs-org/dcmjs/commit/e960085ca08fb28a0a8134fbfee7d450722d8c64)) +- Bidirectional Arrow and EllipticalROI adapters for CS3D ([#264](https://github.com/dcmjs-org/dcmjs/issues/264)) ([1fc7932](https://github.com/dcmjs-org/dcmjs/commit/1fc7932e3eed85fa1a0f857d84bab35a2e62d80d)) +- **CobbAngle:** Add CobbAngle tool ([#353](https://github.com/dcmjs-org/dcmjs/issues/353)) ([b9bd701](https://github.com/dcmjs-org/dcmjs/commit/b9bd701df41ae2b8b2afbcf1d092d7587f7b267a)) +- **contour api:** add api for contour rendering configuration ([#443](https://github.com/dcmjs-org/dcmjs/issues/443)) ([4ab751d](https://github.com/dcmjs-org/dcmjs/commit/4ab751df4082c56b64e4b97e9d6ca6de3c60c7e5)) +- **cornerstone:** Feature add cornerstone adapters ([#225](https://github.com/dcmjs-org/dcmjs/issues/225)) ([23c0877](https://github.com/dcmjs-org/dcmjs/commit/23c08777f7a93d4c0576a5e583113029a1a1e05f)) +- **deflated:** Added support for reading datasets with deflated transfer syntax ([#312](https://github.com/dcmjs-org/dcmjs/issues/312)) ([ee8f8f2](https://github.com/dcmjs-org/dcmjs/commit/ee8f8f21babbbd8eac2b19e8e957db2cc5a09325)) +- **dicomImageLoader types:** Add types to the dicom image loader ([#441](https://github.com/dcmjs-org/dcmjs/issues/441)) ([10a3370](https://github.com/dcmjs-org/dcmjs/commit/10a3370b7f23084d1f2c55506079c17dea959659)), closes [#449](https://github.com/dcmjs-org/dcmjs/issues/449) [#450](https://github.com/dcmjs-org/dcmjs/issues/450) +- **mem:** Zero Copy ArrayBuffer ([#279](https://github.com/dcmjs-org/dcmjs/issues/279)) ([a17f2d7](https://github.com/dcmjs-org/dcmjs/commit/a17f2d75bc102cc789289f0eae51e5b416ce1567)) +- Move adapters from dcmjs for Cornerstone/3d and VTK ([b136a21](https://github.com/dcmjs-org/dcmjs/commit/b136a21fb96bb28c3a10a63b6b78083b897f4e19)) +- **npm:** bump minor version (minor readme edits) ([b48f665](https://github.com/dcmjs-org/dcmjs/commit/b48f665893f5e4b643c68ddc2fc3b13c641b6b29)) +- **readme:** stress need for a PR for npm package ([#310](https://github.com/dcmjs-org/dcmjs/issues/310)) ([dafd78d](https://github.com/dcmjs-org/dcmjs/commit/dafd78d004ccb9d0b505f0b7e0fd461eda9c3710)) +- **sr:** export TID300 - Point class ([#323](https://github.com/dcmjs-org/dcmjs/issues/323)) ([d2aebc3](https://github.com/dcmjs-org/dcmjs/commit/d2aebc3166c23e14dce4d7a8b7f1e2fc933f6328)) +- **structured-reports:** Add initial work on Adapters / Utilities for Imaging Measurement Structured Report input / output ([#17](https://github.com/dcmjs-org/dcmjs/issues/17)) ([941ad75](https://github.com/dcmjs-org/dcmjs/commit/941ad75320eece3368104d08247fdc371497c7cd)) +- **testing:** Use the Jest testing framework and switch to GitHub Actions ([#254](https://github.com/dcmjs-org/dcmjs/issues/254)) ([a91ff2b](https://github.com/dcmjs-org/dcmjs/commit/a91ff2babd2c6a44f20ecbd954ab38901276cf41)) # [0.6.0](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.5.0...@cornerstonejs/adapters@0.6.0) (2023-03-28) ### Features -- **contour api:** add api for contour rendering configuration ([#443](https://github.com/dcmjs-org/dcmjs/issues/443)) ([4ab751d](https://github.com/dcmjs-org/dcmjs/commit/4ab751df4082c56b64e4b97e9d6ca6de3c60c7e5)) +- **contour api:** add api for contour rendering configuration ([#443](https://github.com/dcmjs-org/dcmjs/issues/443)) ([4ab751d](https://github.com/dcmjs-org/dcmjs/commit/4ab751df4082c56b64e4b97e9d6ca6de3c60c7e5)) # [0.5.0](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.4.2...@cornerstonejs/adapters@0.5.0) (2023-03-22) ### Features -- Add a CircleROI tool ([#459](https://github.com/dcmjs-org/dcmjs/issues/459)) ([1c03ed3](https://github.com/dcmjs-org/dcmjs/commit/1c03ed3457fbb63bbd87315b90bfed99b1cd09cc)) +- Add a CircleROI tool ([#459](https://github.com/dcmjs-org/dcmjs/issues/459)) ([1c03ed3](https://github.com/dcmjs-org/dcmjs/commit/1c03ed3457fbb63bbd87315b90bfed99b1cd09cc)) ## [0.4.2](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.4.1...@cornerstonejs/adapters@0.4.2) (2023-03-22) ### Bug Fixes -- Elliptical roi when in flipped/rotated state ([#479](https://github.com/dcmjs-org/dcmjs/issues/479)) ([f0961ae](https://github.com/dcmjs-org/dcmjs/commit/f0961ae6f5e912230f2bf17be5acfe30f775bcae)) +- Elliptical roi when in flipped/rotated state ([#479](https://github.com/dcmjs-org/dcmjs/issues/479)) ([f0961ae](https://github.com/dcmjs-org/dcmjs/commit/f0961ae6f5e912230f2bf17be5acfe30f775bcae)) ## [0.4.1](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.4.0...@cornerstonejs/adapters@0.4.1) (2023-03-03) ### Bug Fixes -- **adapters:** Measurement reports can throw exceptions that prevent loading ([#458](https://github.com/dcmjs-org/dcmjs/issues/458)) ([7bc7d8a](https://github.com/dcmjs-org/dcmjs/commit/7bc7d8aaeb5aa0df91c24e278665d14f590ec234)) +- **adapters:** Measurement reports can throw exceptions that prevent loading ([#458](https://github.com/dcmjs-org/dcmjs/issues/458)) ([7bc7d8a](https://github.com/dcmjs-org/dcmjs/commit/7bc7d8aaeb5aa0df91c24e278665d14f590ec234)) # [0.4.0](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.3.2...@cornerstonejs/adapters@0.4.0) (2023-03-03) ### Features -- **dicomImageLoader types:** Add types to the dicom image loader ([#441](https://github.com/dcmjs-org/dcmjs/issues/441)) ([10a3370](https://github.com/dcmjs-org/dcmjs/commit/10a3370b7f23084d1f2c55506079c17dea959659)), closes [#449](https://github.com/dcmjs-org/dcmjs/issues/449) [#450](https://github.com/dcmjs-org/dcmjs/issues/450) +- **dicomImageLoader types:** Add types to the dicom image loader ([#441](https://github.com/dcmjs-org/dcmjs/issues/441)) ([10a3370](https://github.com/dcmjs-org/dcmjs/commit/10a3370b7f23084d1f2c55506079c17dea959659)), closes [#449](https://github.com/dcmjs-org/dcmjs/issues/449) [#450](https://github.com/dcmjs-org/dcmjs/issues/450) ## [0.3.2](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.3.1...@cornerstonejs/adapters@0.3.2) (2023-02-17) ### Bug Fixes -- **adapters:** Update the build a little to allow debugging into typescript ([#439](https://github.com/dcmjs-org/dcmjs/issues/439)) ([05e6419](https://github.com/dcmjs-org/dcmjs/commit/05e6419e1a6705f40c367ac4b52c3975f6fd25c6)) +- **adapters:** Update the build a little to allow debugging into typescript ([#439](https://github.com/dcmjs-org/dcmjs/issues/439)) ([05e6419](https://github.com/dcmjs-org/dcmjs/commit/05e6419e1a6705f40c367ac4b52c3975f6fd25c6)) ## [0.3.1](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.3.0...@cornerstonejs/adapters@0.3.1) (2023-02-16) ### Bug Fixes -- **adapter:** The rectangle encoding of SR ([#437](https://github.com/dcmjs-org/dcmjs/issues/437)) ([bff23ec](https://github.com/dcmjs-org/dcmjs/commit/bff23ecfe551312a1339211ddb7838993514a377)) +- **adapter:** The rectangle encoding of SR ([#437](https://github.com/dcmjs-org/dcmjs/issues/437)) ([bff23ec](https://github.com/dcmjs-org/dcmjs/commit/bff23ecfe551312a1339211ddb7838993514a377)) # [0.3.0](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.2.1...@cornerstonejs/adapters@0.3.0) (2023-02-08) ### Features -- **adapters:** Add adapters for Rectangle, Angle and fix generate DICOM ([#427](https://github.com/dcmjs-org/dcmjs/issues/427)) ([b8ca75e](https://github.com/dcmjs-org/dcmjs/commit/b8ca75e6ba378f175bd987d07f094f44b41a46cf)) +- **adapters:** Add adapters for Rectangle, Angle and fix generate DICOM ([#427](https://github.com/dcmjs-org/dcmjs/issues/427)) ([b8ca75e](https://github.com/dcmjs-org/dcmjs/commit/b8ca75e6ba378f175bd987d07f094f44b41a46cf)) ## [0.2.1](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.2.0...@cornerstonejs/adapters@0.2.1) (2023-02-03) ### Bug Fixes -- **adapters:** Update rollup to newer version ([#407](https://github.com/dcmjs-org/dcmjs/issues/407)) ([543675f](https://github.com/dcmjs-org/dcmjs/commit/543675f1269f8b739764291b1c27b40470c48c63)) +- **adapters:** Update rollup to newer version ([#407](https://github.com/dcmjs-org/dcmjs/issues/407)) ([543675f](https://github.com/dcmjs-org/dcmjs/commit/543675f1269f8b739764291b1c27b40470c48c63)) # [0.2.0](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.1.5...@cornerstonejs/adapters@0.2.0) (2023-01-30) ### Features -- **CobbAngle:** Add CobbAngle tool ([#353](https://github.com/dcmjs-org/dcmjs/issues/353)) ([b9bd701](https://github.com/dcmjs-org/dcmjs/commit/b9bd701df41ae2b8b2afbcf1d092d7587f7b267a)) +- **CobbAngle:** Add CobbAngle tool ([#353](https://github.com/dcmjs-org/dcmjs/issues/353)) ([b9bd701](https://github.com/dcmjs-org/dcmjs/commit/b9bd701df41ae2b8b2afbcf1d092d7587f7b267a)) ## [0.1.5](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.1.4...@cornerstonejs/adapters@0.1.5) (2023-01-30) ### Bug Fixes -- **build:** Include adapters in circleci config ([#402](https://github.com/dcmjs-org/dcmjs/issues/402)) ([45c8416](https://github.com/dcmjs-org/dcmjs/commit/45c84167b40c6a48bb2c499b6153c200763778a0)) +- **build:** Include adapters in circleci config ([#402](https://github.com/dcmjs-org/dcmjs/issues/402)) ([45c8416](https://github.com/dcmjs-org/dcmjs/commit/45c84167b40c6a48bb2c499b6153c200763778a0)) ## [0.1.4](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.1.3...@cornerstonejs/adapters@0.1.4) (2023-01-30) ### Bug Fixes -- **build:** adapters build missing files ([#400](https://github.com/dcmjs-org/dcmjs/issues/400)) ([901dd88](https://github.com/dcmjs-org/dcmjs/commit/901dd8815e121f29c50da0b1b9764d90d881114b)) +- **build:** adapters build missing files ([#400](https://github.com/dcmjs-org/dcmjs/issues/400)) ([901dd88](https://github.com/dcmjs-org/dcmjs/commit/901dd8815e121f29c50da0b1b9764d90d881114b)) ## [0.1.3](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.1.2...@cornerstonejs/adapters@0.1.3) (2023-01-28) ### Bug Fixes -- **build:** Adding exports and files ([#398](https://github.com/dcmjs-org/dcmjs/issues/398)) ([2e8101f](https://github.com/dcmjs-org/dcmjs/commit/2e8101f229aa4c112405cb03558903956fc7e7f8)) +- **build:** Adding exports and files ([#398](https://github.com/dcmjs-org/dcmjs/issues/398)) ([2e8101f](https://github.com/dcmjs-org/dcmjs/commit/2e8101f229aa4c112405cb03558903956fc7e7f8)) ## [0.1.2](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.1.1...@cornerstonejs/adapters@0.1.2) (2023-01-27) ### Bug Fixes -- **build:** fixing publish of adapters in package json ([#396](https://github.com/dcmjs-org/dcmjs/issues/396)) ([5a45b2f](https://github.com/dcmjs-org/dcmjs/commit/5a45b2f9ebeca9b800642d2735720a8d8400cd12)) +- **build:** fixing publish of adapters in package json ([#396](https://github.com/dcmjs-org/dcmjs/issues/396)) ([5a45b2f](https://github.com/dcmjs-org/dcmjs/commit/5a45b2f9ebeca9b800642d2735720a8d8400cd12)) ## [0.1.1](https://github.com/dcmjs-org/dcmjs/compare/@cornerstonejs/adapters@0.1.0...@cornerstonejs/adapters@0.1.1) (2023-01-27) ### Bug Fixes -- **build:** try to publish adapters ([#395](https://github.com/dcmjs-org/dcmjs/issues/395)) ([191a17b](https://github.com/dcmjs-org/dcmjs/commit/191a17b690d2ac60ad98a4b8ecb8379a92638d67)) +- **build:** try to publish adapters ([#395](https://github.com/dcmjs-org/dcmjs/issues/395)) ([191a17b](https://github.com/dcmjs-org/dcmjs/commit/191a17b690d2ac60ad98a4b8ecb8379a92638d67)) # 0.1.0 (2023-01-27) ### Bug Fixes -- 🐛 adding readme notes ([#191](https://github.com/dcmjs-org/dcmjs/issues/191)) ([459260d](https://github.com/dcmjs-org/dcmjs/commit/459260d6e2a6f905729ddf68b1f12d3140b53849)) -- 🐛 fix array format regression from commit 70b24332783d63c9db2ed21d512d9f7b526c5222 ([#236](https://github.com/dcmjs-org/dcmjs/issues/236)) ([5441063](https://github.com/dcmjs-org/dcmjs/commit/5441063d0395ede6d9f8bd3ac0d92ee14f6ef209)) -- 🐛 Fix rotation mapping for SEG cornerstone adapter ([#151](https://github.com/dcmjs-org/dcmjs/issues/151)) ([3fab68c](https://github.com/dcmjs-org/dcmjs/commit/3fab68cbfd95f82820663b9fc99a2b0cd07e43c8)) -- 🐛 Harden Segmentation import for different possible SEGs ([#146](https://github.com/dcmjs-org/dcmjs/issues/146)) ([c4952bc](https://github.com/dcmjs-org/dcmjs/commit/c4952bc5842bab80a5d928de0d860f89afc8f400)) -- 🐛 IDC Re [#2003](https://github.com/dcmjs-org/dcmjs/issues/2003): fix regression in parsing segmentation orietations ([#220](https://github.com/dcmjs-org/dcmjs/issues/220)) ([5c0c6a8](https://github.com/dcmjs-org/dcmjs/commit/5c0c6a85e67b25ce5f39412ced37d8e825691481)) -- 🐛 IDC2733: find segmentations reference source image Ids ([#253](https://github.com/dcmjs-org/dcmjs/issues/253)) ([f3e7101](https://github.com/dcmjs-org/dcmjs/commit/f3e71016dffa233bf0fb912cc7cf413718b8a1a9)) -- 🐛 ignore frames without SourceImageSequence information when loading a segmentation ([#198](https://github.com/dcmjs-org/dcmjs/issues/198)) ([82709c4](https://github.com/dcmjs-org/dcmjs/commit/82709c4a8a317aa1354244010300ab9b902802dd)) -- 🐛 indentation in nearlyEqual ([#202](https://github.com/dcmjs-org/dcmjs/issues/202)) ([989d6c9](https://github.com/dcmjs-org/dcmjs/commit/989d6c9a80686425563c55424ac1795e6a06cd7b)) -- 🐛 relax condition in nearlyEquals check for detecting numbers near to zero ([#304](https://github.com/dcmjs-org/dcmjs/issues/304)) ([974cddd](https://github.com/dcmjs-org/dcmjs/commit/974cddd785c076f1ac0211b534a7c0b82a4ba68a)) -- 🐛 When converting to multiframe, fix IPP issues ([#152](https://github.com/dcmjs-org/dcmjs/issues/152)) ([80496e4](https://github.com/dcmjs-org/dcmjs/commit/80496e422152c1a3dfd850a145011dd3dc632964)) -- **adapter:** Removed comment around getTID300RepresentationArguments 'tool' parameter ([#322](https://github.com/dcmjs-org/dcmjs/issues/322)) ([d8f05ff](https://github.com/dcmjs-org/dcmjs/commit/d8f05ffb9ef1b5cce254980a597b4c428ffdfb6e)), closes [#306](https://github.com/dcmjs-org/dcmjs/issues/306) -- **add check for nullable numeric string vrs:** adds a check for nullable numeric strinv vrs ([#150](https://github.com/dcmjs-org/dcmjs/issues/150)) ([75046c4](https://github.com/dcmjs-org/dcmjs/commit/75046c4e1b2830dd3a32dc8d6938f6def71940a5)) -- **anonymizer:** [FIX & TESTS] cleanTags : check if param is undefined. Add 3 test ([#308](https://github.com/dcmjs-org/dcmjs/issues/308)) ([44d23d6](https://github.com/dcmjs-org/dcmjs/commit/44d23d6a9e347fcf049053129d4d7323a9258b71)) -- ArrowAnnotateTool adapter in Cornerstone3D parsing label ([#270](https://github.com/dcmjs-org/dcmjs/issues/270)) ([cb84979](https://github.com/dcmjs-org/dcmjs/commit/cb84979be6eef8835cc7ced006625751a04356aa)) -- avoid using replaceAll() which isn't available in Node.js 14 ([#296](https://github.com/dcmjs-org/dcmjs/issues/296)) ([7aac3ab](https://github.com/dcmjs-org/dcmjs/commit/7aac3ab05fdedfe1a7a159097690bec00c0bcd2b)) -- bug tolerance parameter was not propagated ([#241](https://github.com/dcmjs-org/dcmjs/issues/241)) ([c2ed627](https://github.com/dcmjs-org/dcmjs/commit/c2ed6275ccb80fbbab3c0f9c67893d6b681b0bab)) -- checking the length before writing a DS and using exponential if ([#176](https://github.com/dcmjs-org/dcmjs/issues/176)) ([601aa9e](https://github.com/dcmjs-org/dcmjs/commit/601aa9e8a6df26876b08da739451e538d46aa37b)) -- **coding-scheme:** Fix coding scheme for updated standard ([ae3f0b5](https://github.com/dcmjs-org/dcmjs/commit/ae3f0b5bcd398a4230c8fba2954e225fda97cc2f)) -- **cornerstone:** exceptions caused by undefined cached stats in adapters. Safe programming fix only ([#301](https://github.com/dcmjs-org/dcmjs/issues/301)) ([893be43](https://github.com/dcmjs-org/dcmjs/commit/893be433af05f11a03cfce0a572b448303b9334b)) -- **cs:** [#318](https://github.com/dcmjs-org/dcmjs/issues/318) - check instance's NumberOfFrames property to see if it is a multi-frame file or not ([#320](https://github.com/dcmjs-org/dcmjs/issues/320)) ([0b030a4](https://github.com/dcmjs-org/dcmjs/commit/0b030a45dd48f22a61a90dfe5bbb5848425960ca)) -- **cs:** Resolves [#316](https://github.com/dcmjs-org/dcmjs/issues/316) Cornerstone3D adaptor - Multiframe support - add "frameNumber" to the Annotation.data ([#317](https://github.com/dcmjs-org/dcmjs/issues/317)) ([5fe862e](https://github.com/dcmjs-org/dcmjs/commit/5fe862e22653d30bfc78e5be5de3669610887727)) -- **dcmjs:** Add a set of accessors to the sequence list so the API is more consistent ([#224](https://github.com/dcmjs-org/dcmjs/issues/224)) ([9dad6c5](https://github.com/dcmjs-org/dcmjs/commit/9dad6c549cb4dd5c351caa13386998cbe48a1ba6)) -- **DicomMessage:** Fix readFile after options were added ([c2b62a1](https://github.com/dcmjs-org/dcmjs/commit/c2b62a13b3afc78516f39b906ca7576537037c20)) -- **encoding:** encapsulation is applied for only PixelData ([#199](https://github.com/dcmjs-org/dcmjs/issues/199)) ([ede2950](https://github.com/dcmjs-org/dcmjs/commit/ede2950d530fb189bb5817db6b5285e2be74ffee)), closes [#194](https://github.com/dcmjs-org/dcmjs/issues/194) -- Ensure DS and IS Value Representations are returned as arrays ([#83](https://github.com/dcmjs-org/dcmjs/issues/83)) ([a264661](https://github.com/dcmjs-org/dcmjs/commit/a264661d5a0a899b761c58492955f6d18cc03a4d)) -- exception writing NaN and Infinity values of FD tags ([#325](https://github.com/dcmjs-org/dcmjs/issues/325)) ([e86daaa](https://github.com/dcmjs-org/dcmjs/commit/e86daaad4c47e7ec2c135b94f0b0de622de69310)) -- Export loglevelnext logger as dcmjs.log for configuration ([#156](https://github.com/dcmjs-org/dcmjs/issues/156)) ([33515e5](https://github.com/dcmjs-org/dcmjs/commit/33515e5fe3f581d71278674860834ee1ea932faa)) -- Fix UN & AT VR processing logic ([#167](https://github.com/dcmjs-org/dcmjs/issues/167)) ([#168](https://github.com/dcmjs-org/dcmjs/issues/168)) ([7cb975a](https://github.com/dcmjs-org/dcmjs/commit/7cb975af106d2e3e943881a7dac06f1fe391809c)) -- force a release for commit caaac4b ([#240](https://github.com/dcmjs-org/dcmjs/issues/240)) ([f53b630](https://github.com/dcmjs-org/dcmjs/commit/f53b6306ce138c5ad3106015c4751b63fbcca362)) -- **fragment:** Refactor and fragment bug ([#283](https://github.com/dcmjs-org/dcmjs/issues/283)) ([307d60a](https://github.com/dcmjs-org/dcmjs/commit/307d60a6ffecf7d96bc729a37a45775c6b6e189c)), closes [#282](https://github.com/dcmjs-org/dcmjs/issues/282) -- **fragment:** write padding to even length on final fragments of encapsulated frame data ([#294](https://github.com/dcmjs-org/dcmjs/issues/294)) ([34b7561](https://github.com/dcmjs-org/dcmjs/commit/34b7561fa48870a87b948eb427d4e32808b4d40e)), closes [#293](https://github.com/dcmjs-org/dcmjs/issues/293) -- **idc-02252:** typo + release ([#180](https://github.com/dcmjs-org/dcmjs/issues/180)) ([3f5cb24](https://github.com/dcmjs-org/dcmjs/commit/3f5cb24fd0e50668d36dc21390a1ff527505a8db)) -- **image-comments:** Move ImageComments to DerivedPixels ([da11200](https://github.com/dcmjs-org/dcmjs/commit/da112001e3c1c01b30acbd634fd9b2f46a9d3a63)) -- **import:** missing import for addAccessors ([#295](https://github.com/dcmjs-org/dcmjs/issues/295)) ([6b631b6](https://github.com/dcmjs-org/dcmjs/commit/6b631b6c8bdb2a7a70637308c9ebfe849fe9ccaf)) -- infinite loop on dcm with no meta length ([#331](https://github.com/dcmjs-org/dcmjs/issues/331)) ([51b156b](https://github.com/dcmjs-org/dcmjs/commit/51b156bf1278fc0f9476de70c89697576c0f4b55)) -- Invalid VR of the private creator tag of the "Implicit VR Endian" typed DICOM file ([#242](https://github.com/dcmjs-org/dcmjs/issues/242)) ([#243](https://github.com/dcmjs-org/dcmjs/issues/243)) ([6d0552f](https://github.com/dcmjs-org/dcmjs/commit/6d0552fb96c59dcf3e39b3306a50004b24128330)) -- issues in binary tag parsing ([#276](https://github.com/dcmjs-org/dcmjs/issues/276)) ([60c3af1](https://github.com/dcmjs-org/dcmjs/commit/60c3af1654b8f64baea1cd47f1049fd16ea2fee8)) -- **measurement-report:** Fix issues with Measurement Report for Bidirectional measurements ([25cf222](https://github.com/dcmjs-org/dcmjs/commit/25cf222e9d80bbe5b68854362383ac4fcaec7f6c)) -- **measurement-report:** Fix ReferencedFrameNumber usage in MeasurementReport ([b80cd2a](https://github.com/dcmjs-org/dcmjs/commit/b80cd2af070d0280295e88ee24d7e4d43c4af861)) -- **naturalize:** revert single element sequence ([#223](https://github.com/dcmjs-org/dcmjs/issues/223)) ([0743ed3](https://github.com/dcmjs-org/dcmjs/commit/0743ed34f657b622d4868fe5db37015ad1aa7850)) -- **naturalizing:** Fix the exception on naturalize twice ([#237](https://github.com/dcmjs-org/dcmjs/issues/237)) ([abced98](https://github.com/dcmjs-org/dcmjs/commit/abced980dccbabce7c4b159600f89c25ba747076)) -- **parsing:** can't read an encapsulated frame whose size is greater than fragment size ([#205](https://github.com/dcmjs-org/dcmjs/issues/205)) ([176875d](https://github.com/dcmjs-org/dcmjs/commit/176875d0c9c34704302512d2c27103db205b1c8f)), closes [#204](https://github.com/dcmjs-org/dcmjs/issues/204) -- Re IDC [#2761](https://github.com/dcmjs-org/dcmjs/issues/2761) fix loading of segmentations ([#258](https://github.com/dcmjs-org/dcmjs/issues/258)) ([ceaf09a](https://github.com/dcmjs-org/dcmjs/commit/ceaf09af74f5727205e5d5869c97114b2c283ae5)) -- **Segmentation_4X:** Update tag name in getSegmentIndex method for segs ([#183](https://github.com/dcmjs-org/dcmjs/issues/183)) ([1e96ee3](https://github.com/dcmjs-org/dcmjs/commit/1e96ee3ce3280900d56f1887da81471f9b128d30)) -- **seg:** Use ReferencedSegmentNumber in shared fg ([#166](https://github.com/dcmjs-org/dcmjs/issues/166)) ([0ed3347](https://github.com/dcmjs-org/dcmjs/commit/0ed33477bb1c13b05d682c342edaf0a901fe0f7a)) -- several issues with character set handling ([#299](https://github.com/dcmjs-org/dcmjs/issues/299)) ([8e22107](https://github.com/dcmjs-org/dcmjs/commit/8e221074179b6d33b82ab5c6f1ae4c06c5522d6b)) -- **tests:** unified test data loading ([#292](https://github.com/dcmjs-org/dcmjs/issues/292)) ([c34f398](https://github.com/dcmjs-org/dcmjs/commit/c34f39813755227b79f7a0958a81a5e5c0935b73)) -- **update jsdocs, cut release:** release ([#203](https://github.com/dcmjs-org/dcmjs/issues/203)) ([307974c](https://github.com/dcmjs-org/dcmjs/commit/307974cb399d07152e0f6d4dd9f40fe1c17f076e)) -- update readme to trigger release ([#257](https://github.com/dcmjs-org/dcmjs/issues/257)) ([554f50d](https://github.com/dcmjs-org/dcmjs/commit/554f50d838fbcbeed25460c7384e14dc46bebb11)) -- update variable name for frame index ([#332](https://github.com/dcmjs-org/dcmjs/issues/332)) ([5515d6e](https://github.com/dcmjs-org/dcmjs/commit/5515d6e0abe11dee04f9b75272d3fbb5d00b2bd7)) -- use metadataProvider option instead of cornerstone.metaData ([#280](https://github.com/dcmjs-org/dcmjs/issues/280)) ([3a0e484](https://github.com/dcmjs-org/dcmjs/commit/3a0e484d203770cd309e2bd9f78946a733e79d0c)) -- **utilities:** Export Bidirectional and Polyline inside TID300 ([75e0e29](https://github.com/dcmjs-org/dcmjs/commit/75e0e29f771843a80bfa32532d2186a4e7cdbd57)) -- **VR:** added support for specific character set ([#291](https://github.com/dcmjs-org/dcmjs/issues/291)) ([f103d19](https://github.com/dcmjs-org/dcmjs/commit/f103d1918d02780c4881db5c8aa30f653c4da6b6)) -- **vr:** Convert empty DecimalString and NumberString to null instead of to zero ([#278](https://github.com/dcmjs-org/dcmjs/issues/278)) ([43cd8ea](https://github.com/dcmjs-org/dcmjs/commit/43cd8eaa316a08ff1a025b1267fedda239526acb)) -- **writeBytes:** create release from commit ([d9a4105](https://github.com/dcmjs-org/dcmjs/commit/d9a41050e756f9b7e56ef4ae3d5000ce86ea39eb)) +- 🐛 adding readme notes ([#191](https://github.com/dcmjs-org/dcmjs/issues/191)) ([459260d](https://github.com/dcmjs-org/dcmjs/commit/459260d6e2a6f905729ddf68b1f12d3140b53849)) +- 🐛 fix array format regression from commit 70b24332783d63c9db2ed21d512d9f7b526c5222 ([#236](https://github.com/dcmjs-org/dcmjs/issues/236)) ([5441063](https://github.com/dcmjs-org/dcmjs/commit/5441063d0395ede6d9f8bd3ac0d92ee14f6ef209)) +- 🐛 Fix rotation mapping for SEG cornerstone adapter ([#151](https://github.com/dcmjs-org/dcmjs/issues/151)) ([3fab68c](https://github.com/dcmjs-org/dcmjs/commit/3fab68cbfd95f82820663b9fc99a2b0cd07e43c8)) +- 🐛 Harden Segmentation import for different possible SEGs ([#146](https://github.com/dcmjs-org/dcmjs/issues/146)) ([c4952bc](https://github.com/dcmjs-org/dcmjs/commit/c4952bc5842bab80a5d928de0d860f89afc8f400)) +- 🐛 IDC Re [#2003](https://github.com/dcmjs-org/dcmjs/issues/2003): fix regression in parsing segmentation orietations ([#220](https://github.com/dcmjs-org/dcmjs/issues/220)) ([5c0c6a8](https://github.com/dcmjs-org/dcmjs/commit/5c0c6a85e67b25ce5f39412ced37d8e825691481)) +- 🐛 IDC2733: find segmentations reference source image Ids ([#253](https://github.com/dcmjs-org/dcmjs/issues/253)) ([f3e7101](https://github.com/dcmjs-org/dcmjs/commit/f3e71016dffa233bf0fb912cc7cf413718b8a1a9)) +- 🐛 ignore frames without SourceImageSequence information when loading a segmentation ([#198](https://github.com/dcmjs-org/dcmjs/issues/198)) ([82709c4](https://github.com/dcmjs-org/dcmjs/commit/82709c4a8a317aa1354244010300ab9b902802dd)) +- 🐛 indentation in nearlyEqual ([#202](https://github.com/dcmjs-org/dcmjs/issues/202)) ([989d6c9](https://github.com/dcmjs-org/dcmjs/commit/989d6c9a80686425563c55424ac1795e6a06cd7b)) +- 🐛 relax condition in nearlyEquals check for detecting numbers near to zero ([#304](https://github.com/dcmjs-org/dcmjs/issues/304)) ([974cddd](https://github.com/dcmjs-org/dcmjs/commit/974cddd785c076f1ac0211b534a7c0b82a4ba68a)) +- 🐛 When converting to multiframe, fix IPP issues ([#152](https://github.com/dcmjs-org/dcmjs/issues/152)) ([80496e4](https://github.com/dcmjs-org/dcmjs/commit/80496e422152c1a3dfd850a145011dd3dc632964)) +- **adapter:** Removed comment around getTID300RepresentationArguments 'tool' parameter ([#322](https://github.com/dcmjs-org/dcmjs/issues/322)) ([d8f05ff](https://github.com/dcmjs-org/dcmjs/commit/d8f05ffb9ef1b5cce254980a597b4c428ffdfb6e)), closes [#306](https://github.com/dcmjs-org/dcmjs/issues/306) +- **add check for nullable numeric string vrs:** adds a check for nullable numeric strinv vrs ([#150](https://github.com/dcmjs-org/dcmjs/issues/150)) ([75046c4](https://github.com/dcmjs-org/dcmjs/commit/75046c4e1b2830dd3a32dc8d6938f6def71940a5)) +- **anonymizer:** [FIX & TESTS] cleanTags : check if param is undefined. Add 3 test ([#308](https://github.com/dcmjs-org/dcmjs/issues/308)) ([44d23d6](https://github.com/dcmjs-org/dcmjs/commit/44d23d6a9e347fcf049053129d4d7323a9258b71)) +- ArrowAnnotateTool adapter in Cornerstone3D parsing label ([#270](https://github.com/dcmjs-org/dcmjs/issues/270)) ([cb84979](https://github.com/dcmjs-org/dcmjs/commit/cb84979be6eef8835cc7ced006625751a04356aa)) +- avoid using replaceAll() which isn't available in Node.js 14 ([#296](https://github.com/dcmjs-org/dcmjs/issues/296)) ([7aac3ab](https://github.com/dcmjs-org/dcmjs/commit/7aac3ab05fdedfe1a7a159097690bec00c0bcd2b)) +- bug tolerance parameter was not propagated ([#241](https://github.com/dcmjs-org/dcmjs/issues/241)) ([c2ed627](https://github.com/dcmjs-org/dcmjs/commit/c2ed6275ccb80fbbab3c0f9c67893d6b681b0bab)) +- checking the length before writing a DS and using exponential if ([#176](https://github.com/dcmjs-org/dcmjs/issues/176)) ([601aa9e](https://github.com/dcmjs-org/dcmjs/commit/601aa9e8a6df26876b08da739451e538d46aa37b)) +- **coding-scheme:** Fix coding scheme for updated standard ([ae3f0b5](https://github.com/dcmjs-org/dcmjs/commit/ae3f0b5bcd398a4230c8fba2954e225fda97cc2f)) +- **cornerstone:** exceptions caused by undefined cached stats in adapters. Safe programming fix only ([#301](https://github.com/dcmjs-org/dcmjs/issues/301)) ([893be43](https://github.com/dcmjs-org/dcmjs/commit/893be433af05f11a03cfce0a572b448303b9334b)) +- **cs:** [#318](https://github.com/dcmjs-org/dcmjs/issues/318) - check instance's NumberOfFrames property to see if it is a multi-frame file or not ([#320](https://github.com/dcmjs-org/dcmjs/issues/320)) ([0b030a4](https://github.com/dcmjs-org/dcmjs/commit/0b030a45dd48f22a61a90dfe5bbb5848425960ca)) +- **cs:** Resolves [#316](https://github.com/dcmjs-org/dcmjs/issues/316) Cornerstone3D adaptor - Multiframe support - add "frameNumber" to the Annotation.data ([#317](https://github.com/dcmjs-org/dcmjs/issues/317)) ([5fe862e](https://github.com/dcmjs-org/dcmjs/commit/5fe862e22653d30bfc78e5be5de3669610887727)) +- **dcmjs:** Add a set of accessors to the sequence list so the API is more consistent ([#224](https://github.com/dcmjs-org/dcmjs/issues/224)) ([9dad6c5](https://github.com/dcmjs-org/dcmjs/commit/9dad6c549cb4dd5c351caa13386998cbe48a1ba6)) +- **DicomMessage:** Fix readFile after options were added ([c2b62a1](https://github.com/dcmjs-org/dcmjs/commit/c2b62a13b3afc78516f39b906ca7576537037c20)) +- **encoding:** encapsulation is applied for only PixelData ([#199](https://github.com/dcmjs-org/dcmjs/issues/199)) ([ede2950](https://github.com/dcmjs-org/dcmjs/commit/ede2950d530fb189bb5817db6b5285e2be74ffee)), closes [#194](https://github.com/dcmjs-org/dcmjs/issues/194) +- Ensure DS and IS Value Representations are returned as arrays ([#83](https://github.com/dcmjs-org/dcmjs/issues/83)) ([a264661](https://github.com/dcmjs-org/dcmjs/commit/a264661d5a0a899b761c58492955f6d18cc03a4d)) +- exception writing NaN and Infinity values of FD tags ([#325](https://github.com/dcmjs-org/dcmjs/issues/325)) ([e86daaa](https://github.com/dcmjs-org/dcmjs/commit/e86daaad4c47e7ec2c135b94f0b0de622de69310)) +- Export loglevelnext logger as dcmjs.log for configuration ([#156](https://github.com/dcmjs-org/dcmjs/issues/156)) ([33515e5](https://github.com/dcmjs-org/dcmjs/commit/33515e5fe3f581d71278674860834ee1ea932faa)) +- Fix UN & AT VR processing logic ([#167](https://github.com/dcmjs-org/dcmjs/issues/167)) ([#168](https://github.com/dcmjs-org/dcmjs/issues/168)) ([7cb975a](https://github.com/dcmjs-org/dcmjs/commit/7cb975af106d2e3e943881a7dac06f1fe391809c)) +- force a release for commit caaac4b ([#240](https://github.com/dcmjs-org/dcmjs/issues/240)) ([f53b630](https://github.com/dcmjs-org/dcmjs/commit/f53b6306ce138c5ad3106015c4751b63fbcca362)) +- **fragment:** Refactor and fragment bug ([#283](https://github.com/dcmjs-org/dcmjs/issues/283)) ([307d60a](https://github.com/dcmjs-org/dcmjs/commit/307d60a6ffecf7d96bc729a37a45775c6b6e189c)), closes [#282](https://github.com/dcmjs-org/dcmjs/issues/282) +- **fragment:** write padding to even length on final fragments of encapsulated frame data ([#294](https://github.com/dcmjs-org/dcmjs/issues/294)) ([34b7561](https://github.com/dcmjs-org/dcmjs/commit/34b7561fa48870a87b948eb427d4e32808b4d40e)), closes [#293](https://github.com/dcmjs-org/dcmjs/issues/293) +- **idc-02252:** typo + release ([#180](https://github.com/dcmjs-org/dcmjs/issues/180)) ([3f5cb24](https://github.com/dcmjs-org/dcmjs/commit/3f5cb24fd0e50668d36dc21390a1ff527505a8db)) +- **image-comments:** Move ImageComments to DerivedPixels ([da11200](https://github.com/dcmjs-org/dcmjs/commit/da112001e3c1c01b30acbd634fd9b2f46a9d3a63)) +- **import:** missing import for addAccessors ([#295](https://github.com/dcmjs-org/dcmjs/issues/295)) ([6b631b6](https://github.com/dcmjs-org/dcmjs/commit/6b631b6c8bdb2a7a70637308c9ebfe849fe9ccaf)) +- infinite loop on dcm with no meta length ([#331](https://github.com/dcmjs-org/dcmjs/issues/331)) ([51b156b](https://github.com/dcmjs-org/dcmjs/commit/51b156bf1278fc0f9476de70c89697576c0f4b55)) +- Invalid VR of the private creator tag of the "Implicit VR Endian" typed DICOM file ([#242](https://github.com/dcmjs-org/dcmjs/issues/242)) ([#243](https://github.com/dcmjs-org/dcmjs/issues/243)) ([6d0552f](https://github.com/dcmjs-org/dcmjs/commit/6d0552fb96c59dcf3e39b3306a50004b24128330)) +- issues in binary tag parsing ([#276](https://github.com/dcmjs-org/dcmjs/issues/276)) ([60c3af1](https://github.com/dcmjs-org/dcmjs/commit/60c3af1654b8f64baea1cd47f1049fd16ea2fee8)) +- **measurement-report:** Fix issues with Measurement Report for Bidirectional measurements ([25cf222](https://github.com/dcmjs-org/dcmjs/commit/25cf222e9d80bbe5b68854362383ac4fcaec7f6c)) +- **measurement-report:** Fix ReferencedFrameNumber usage in MeasurementReport ([b80cd2a](https://github.com/dcmjs-org/dcmjs/commit/b80cd2af070d0280295e88ee24d7e4d43c4af861)) +- **naturalize:** revert single element sequence ([#223](https://github.com/dcmjs-org/dcmjs/issues/223)) ([0743ed3](https://github.com/dcmjs-org/dcmjs/commit/0743ed34f657b622d4868fe5db37015ad1aa7850)) +- **naturalizing:** Fix the exception on naturalize twice ([#237](https://github.com/dcmjs-org/dcmjs/issues/237)) ([abced98](https://github.com/dcmjs-org/dcmjs/commit/abced980dccbabce7c4b159600f89c25ba747076)) +- **parsing:** can't read an encapsulated frame whose size is greater than fragment size ([#205](https://github.com/dcmjs-org/dcmjs/issues/205)) ([176875d](https://github.com/dcmjs-org/dcmjs/commit/176875d0c9c34704302512d2c27103db205b1c8f)), closes [#204](https://github.com/dcmjs-org/dcmjs/issues/204) +- Re IDC [#2761](https://github.com/dcmjs-org/dcmjs/issues/2761) fix loading of segmentations ([#258](https://github.com/dcmjs-org/dcmjs/issues/258)) ([ceaf09a](https://github.com/dcmjs-org/dcmjs/commit/ceaf09af74f5727205e5d5869c97114b2c283ae5)) +- **Segmentation_4X:** Update tag name in getSegmentIndex method for segs ([#183](https://github.com/dcmjs-org/dcmjs/issues/183)) ([1e96ee3](https://github.com/dcmjs-org/dcmjs/commit/1e96ee3ce3280900d56f1887da81471f9b128d30)) +- **seg:** Use ReferencedSegmentNumber in shared fg ([#166](https://github.com/dcmjs-org/dcmjs/issues/166)) ([0ed3347](https://github.com/dcmjs-org/dcmjs/commit/0ed33477bb1c13b05d682c342edaf0a901fe0f7a)) +- several issues with character set handling ([#299](https://github.com/dcmjs-org/dcmjs/issues/299)) ([8e22107](https://github.com/dcmjs-org/dcmjs/commit/8e221074179b6d33b82ab5c6f1ae4c06c5522d6b)) +- **tests:** unified test data loading ([#292](https://github.com/dcmjs-org/dcmjs/issues/292)) ([c34f398](https://github.com/dcmjs-org/dcmjs/commit/c34f39813755227b79f7a0958a81a5e5c0935b73)) +- **update jsdocs, cut release:** release ([#203](https://github.com/dcmjs-org/dcmjs/issues/203)) ([307974c](https://github.com/dcmjs-org/dcmjs/commit/307974cb399d07152e0f6d4dd9f40fe1c17f076e)) +- update readme to trigger release ([#257](https://github.com/dcmjs-org/dcmjs/issues/257)) ([554f50d](https://github.com/dcmjs-org/dcmjs/commit/554f50d838fbcbeed25460c7384e14dc46bebb11)) +- update variable name for frame index ([#332](https://github.com/dcmjs-org/dcmjs/issues/332)) ([5515d6e](https://github.com/dcmjs-org/dcmjs/commit/5515d6e0abe11dee04f9b75272d3fbb5d00b2bd7)) +- use metadataProvider option instead of cornerstone.metaData ([#280](https://github.com/dcmjs-org/dcmjs/issues/280)) ([3a0e484](https://github.com/dcmjs-org/dcmjs/commit/3a0e484d203770cd309e2bd9f78946a733e79d0c)) +- **utilities:** Export Bidirectional and Polyline inside TID300 ([75e0e29](https://github.com/dcmjs-org/dcmjs/commit/75e0e29f771843a80bfa32532d2186a4e7cdbd57)) +- **VR:** added support for specific character set ([#291](https://github.com/dcmjs-org/dcmjs/issues/291)) ([f103d19](https://github.com/dcmjs-org/dcmjs/commit/f103d1918d02780c4881db5c8aa30f653c4da6b6)) +- **vr:** Convert empty DecimalString and NumberString to null instead of to zero ([#278](https://github.com/dcmjs-org/dcmjs/issues/278)) ([43cd8ea](https://github.com/dcmjs-org/dcmjs/commit/43cd8eaa316a08ff1a025b1267fedda239526acb)) +- **writeBytes:** create release from commit ([d9a4105](https://github.com/dcmjs-org/dcmjs/commit/d9a41050e756f9b7e56ef4ae3d5000ce86ea39eb)) ### Features -- **adapters:** Add adapter for exporting polylines from dicom-microscopy-viewer to DICOM-SR ([#44](https://github.com/dcmjs-org/dcmjs/issues/44)) ([7a1947c](https://github.com/dcmjs-org/dcmjs/commit/7a1947c6ec164da4e9f66e90c1bbf1055978b173)) -- **adapters:** Add adapter to generate segments & geometry from SEG for easier use in VTKjs (migrated from vtkDisplay example) ([398b74d](https://github.com/dcmjs-org/dcmjs/commit/398b74d70deb32824a74e98210127326887dfa77)) -- **adapters:** First steps for DICOM-SR read support for polylines with dicom-microscopy-viewer ([#49](https://github.com/dcmjs-org/dcmjs/issues/49)) ([37f1888](https://github.com/dcmjs-org/dcmjs/commit/37f18881dd7369818de4aa22c5730012c2829616)) -- Add Cornerstone3D adapter for Length tool ([#261](https://github.com/dcmjs-org/dcmjs/issues/261)) ([2cab0d9](https://github.com/dcmjs-org/dcmjs/commit/2cab0d9edba20e99b11407d41ed2a4bf60a6ab9b)) -- Add overlapping segment check to Cornerstone 4.x DICOM SEG adapter ([#155](https://github.com/dcmjs-org/dcmjs/issues/155)) ([df44e27](https://github.com/dcmjs-org/dcmjs/commit/df44e27b3b1c26082bf3d7a9477ab7f0d5ca1d19)) -- Allow backslashes in UIDs in order to support DICOM Q&R ([#277](https://github.com/dcmjs-org/dcmjs/issues/277)) ([6d2d5c6](https://github.com/dcmjs-org/dcmjs/commit/6d2d5c60f500174abb1be7757094178ec6a1d144)) -- **anonymizer:** export Array tagNamesToEmpty and modify cleanTags ([#303](https://github.com/dcmjs-org/dcmjs/issues/303)) ([e960085](https://github.com/dcmjs-org/dcmjs/commit/e960085ca08fb28a0a8134fbfee7d450722d8c64)) -- Bidirectional Arrow and EllipticalROI adapters for CS3D ([#264](https://github.com/dcmjs-org/dcmjs/issues/264)) ([1fc7932](https://github.com/dcmjs-org/dcmjs/commit/1fc7932e3eed85fa1a0f857d84bab35a2e62d80d)) -- **cornerstone:** Feature add cornerstone adapters ([#225](https://github.com/dcmjs-org/dcmjs/issues/225)) ([23c0877](https://github.com/dcmjs-org/dcmjs/commit/23c08777f7a93d4c0576a5e583113029a1a1e05f)) -- **deflated:** Added support for reading datasets with deflated transfer syntax ([#312](https://github.com/dcmjs-org/dcmjs/issues/312)) ([ee8f8f2](https://github.com/dcmjs-org/dcmjs/commit/ee8f8f21babbbd8eac2b19e8e957db2cc5a09325)) -- **mem:** Zero Copy ArrayBuffer ([#279](https://github.com/dcmjs-org/dcmjs/issues/279)) ([a17f2d7](https://github.com/dcmjs-org/dcmjs/commit/a17f2d75bc102cc789289f0eae51e5b416ce1567)) -- Move adapters from dcmjs for Cornerstone/3d and VTK ([b136a21](https://github.com/dcmjs-org/dcmjs/commit/b136a21fb96bb28c3a10a63b6b78083b897f4e19)) -- **npm:** bump minor version (minor readme edits) ([b48f665](https://github.com/dcmjs-org/dcmjs/commit/b48f665893f5e4b643c68ddc2fc3b13c641b6b29)) -- **readme:** stress need for a PR for npm package ([#310](https://github.com/dcmjs-org/dcmjs/issues/310)) ([dafd78d](https://github.com/dcmjs-org/dcmjs/commit/dafd78d004ccb9d0b505f0b7e0fd461eda9c3710)) -- **sr:** export TID300 - Point class ([#323](https://github.com/dcmjs-org/dcmjs/issues/323)) ([d2aebc3](https://github.com/dcmjs-org/dcmjs/commit/d2aebc3166c23e14dce4d7a8b7f1e2fc933f6328)) -- **structured-reports:** Add initial work on Adapters / Utilities for Imaging Measurement Structured Report input / output ([#17](https://github.com/dcmjs-org/dcmjs/issues/17)) ([941ad75](https://github.com/dcmjs-org/dcmjs/commit/941ad75320eece3368104d08247fdc371497c7cd)) -- **testing:** Use the Jest testing framework and switch to GitHub Actions ([#254](https://github.com/dcmjs-org/dcmjs/issues/254)) ([a91ff2b](https://github.com/dcmjs-org/dcmjs/commit/a91ff2babd2c6a44f20ecbd954ab38901276cf41)) +- **adapters:** Add adapter for exporting polylines from dicom-microscopy-viewer to DICOM-SR ([#44](https://github.com/dcmjs-org/dcmjs/issues/44)) ([7a1947c](https://github.com/dcmjs-org/dcmjs/commit/7a1947c6ec164da4e9f66e90c1bbf1055978b173)) +- **adapters:** Add adapter to generate segments & geometry from SEG for easier use in VTKjs (migrated from vtkDisplay example) ([398b74d](https://github.com/dcmjs-org/dcmjs/commit/398b74d70deb32824a74e98210127326887dfa77)) +- **adapters:** First steps for DICOM-SR read support for polylines with dicom-microscopy-viewer ([#49](https://github.com/dcmjs-org/dcmjs/issues/49)) ([37f1888](https://github.com/dcmjs-org/dcmjs/commit/37f18881dd7369818de4aa22c5730012c2829616)) +- Add Cornerstone3D adapter for Length tool ([#261](https://github.com/dcmjs-org/dcmjs/issues/261)) ([2cab0d9](https://github.com/dcmjs-org/dcmjs/commit/2cab0d9edba20e99b11407d41ed2a4bf60a6ab9b)) +- Add overlapping segment check to Cornerstone 4.x DICOM SEG adapter ([#155](https://github.com/dcmjs-org/dcmjs/issues/155)) ([df44e27](https://github.com/dcmjs-org/dcmjs/commit/df44e27b3b1c26082bf3d7a9477ab7f0d5ca1d19)) +- Allow backslashes in UIDs in order to support DICOM Q&R ([#277](https://github.com/dcmjs-org/dcmjs/issues/277)) ([6d2d5c6](https://github.com/dcmjs-org/dcmjs/commit/6d2d5c60f500174abb1be7757094178ec6a1d144)) +- **anonymizer:** export Array tagNamesToEmpty and modify cleanTags ([#303](https://github.com/dcmjs-org/dcmjs/issues/303)) ([e960085](https://github.com/dcmjs-org/dcmjs/commit/e960085ca08fb28a0a8134fbfee7d450722d8c64)) +- Bidirectional Arrow and EllipticalROI adapters for CS3D ([#264](https://github.com/dcmjs-org/dcmjs/issues/264)) ([1fc7932](https://github.com/dcmjs-org/dcmjs/commit/1fc7932e3eed85fa1a0f857d84bab35a2e62d80d)) +- **cornerstone:** Feature add cornerstone adapters ([#225](https://github.com/dcmjs-org/dcmjs/issues/225)) ([23c0877](https://github.com/dcmjs-org/dcmjs/commit/23c08777f7a93d4c0576a5e583113029a1a1e05f)) +- **deflated:** Added support for reading datasets with deflated transfer syntax ([#312](https://github.com/dcmjs-org/dcmjs/issues/312)) ([ee8f8f2](https://github.com/dcmjs-org/dcmjs/commit/ee8f8f21babbbd8eac2b19e8e957db2cc5a09325)) +- **mem:** Zero Copy ArrayBuffer ([#279](https://github.com/dcmjs-org/dcmjs/issues/279)) ([a17f2d7](https://github.com/dcmjs-org/dcmjs/commit/a17f2d75bc102cc789289f0eae51e5b416ce1567)) +- Move adapters from dcmjs for Cornerstone/3d and VTK ([b136a21](https://github.com/dcmjs-org/dcmjs/commit/b136a21fb96bb28c3a10a63b6b78083b897f4e19)) +- **npm:** bump minor version (minor readme edits) ([b48f665](https://github.com/dcmjs-org/dcmjs/commit/b48f665893f5e4b643c68ddc2fc3b13c641b6b29)) +- **readme:** stress need for a PR for npm package ([#310](https://github.com/dcmjs-org/dcmjs/issues/310)) ([dafd78d](https://github.com/dcmjs-org/dcmjs/commit/dafd78d004ccb9d0b505f0b7e0fd461eda9c3710)) +- **sr:** export TID300 - Point class ([#323](https://github.com/dcmjs-org/dcmjs/issues/323)) ([d2aebc3](https://github.com/dcmjs-org/dcmjs/commit/d2aebc3166c23e14dce4d7a8b7f1e2fc933f6328)) +- **structured-reports:** Add initial work on Adapters / Utilities for Imaging Measurement Structured Report input / output ([#17](https://github.com/dcmjs-org/dcmjs/issues/17)) ([941ad75](https://github.com/dcmjs-org/dcmjs/commit/941ad75320eece3368104d08247fdc371497c7cd)) +- **testing:** Use the Jest testing framework and switch to GitHub Actions ([#254](https://github.com/dcmjs-org/dcmjs/issues/254)) ([a91ff2b](https://github.com/dcmjs-org/dcmjs/commit/a91ff2babd2c6a44f20ecbd954ab38901276cf41)) diff --git a/packages/adapters/README.md b/packages/adapters/README.md index 600906fa00..99e6b67531 100644 --- a/packages/adapters/README.md +++ b/packages/adapters/README.md @@ -8,26 +8,26 @@ # History -- 2014 - - [DCMTK](dcmtk.org) cross compiled to javascript at [CTK Hackfest](http://www.commontk.org/index.php/CTK-Hackfest-May-2014). While this was useful and powerful, it was heavyweight for typical web usage. -- 2016 - - A [Medical Imaging Web Appliction meeting at Stanford](http://qiicr.org/web/outreach/Medical-Imaging-Web-Apps/) and [follow-on hackfest in Boston](http://qiicr.org/web/outreach/MIWS-hackfest/) helped elaborate the needs for manipulating DICOM in pure Javascript. - - Based on [DICOM Part 10 read/write code](https://github.com/OHIF/dicom-dimse) initiated by Weiwei Wu of [OHIF](http://ohif.org), Steve Pieper [developed further features](https://github.com/pieper/sites/tree/gh-pages/dcmio) and [examples of creating multiframe and segmentation objects](https://github.com/pieper/sites/tree/gh-pages/DICOMzero) discussed with the community at RSNA -- 2017 - - At [NA-MIC Project Week 25](https://na-mic.org/wiki/Project_Week_25) Erik Ziegler and Steve Pieper [worked](https://na-mic.org/wiki/Project_Week_25/DICOM_Segmentation_Support_for_Cornerstone_and_OHIF_Viewer) - with the community to define some example use cases to mix the pure JavaScript DICOM code with Cornerstone and [CornerstoneTools](https://github.com/chafey/cornerstoneTools). -- 2018-2022 - - Work continues to develop SR and SEG support to [OHIFViewer](http://ohif.org) allow interoperability with [DICOM4QI](https://legacy.gitbook.com/book/qiicr/dicom4qi/details) -- 2023 - - Moved the adapters into cornerstone3D from dcmjsj +- 2014 + - [DCMTK](dcmtk.org) cross compiled to javascript at [CTK Hackfest](http://www.commontk.org/index.php/CTK-Hackfest-May-2014). While this was useful and powerful, it was heavyweight for typical web usage. +- 2016 + - A [Medical Imaging Web Appliction meeting at Stanford](http://qiicr.org/web/outreach/Medical-Imaging-Web-Apps/) and [follow-on hackfest in Boston](http://qiicr.org/web/outreach/MIWS-hackfest/) helped elaborate the needs for manipulating DICOM in pure Javascript. + - Based on [DICOM Part 10 read/write code](https://github.com/OHIF/dicom-dimse) initiated by Weiwei Wu of [OHIF](http://ohif.org), Steve Pieper [developed further features](https://github.com/pieper/sites/tree/gh-pages/dcmio) and [examples of creating multiframe and segmentation objects](https://github.com/pieper/sites/tree/gh-pages/DICOMzero) discussed with the community at RSNA +- 2017 + - At [NA-MIC Project Week 25](https://na-mic.org/wiki/Project_Week_25) Erik Ziegler and Steve Pieper [worked](https://na-mic.org/wiki/Project_Week_25/DICOM_Segmentation_Support_for_Cornerstone_and_OHIF_Viewer) + with the community to define some example use cases to mix the pure JavaScript DICOM code with Cornerstone and [CornerstoneTools](https://github.com/chafey/cornerstoneTools). +- 2018-2022 + - Work continues to develop SR and SEG support to [OHIFViewer](http://ohif.org) allow interoperability with [DICOM4QI](https://legacy.gitbook.com/book/qiicr/dicom4qi/details) +- 2023 + - Moved the adapters into cornerstone3D from dcmjsj # Support The developers gratefully acknowledge their research support: -- Open Health Imaging Foundation ([OHIF](http://ohif.org)) -- Quantitative Image Informatics for Cancer Research ([QIICR](http://qiicr.org)) -- [Radiomics](http://radiomics.io) -- The [Neuroimage Analysis Center](http://nac.spl.harvard.edu) -- The [National Center for Image Guided Therapy](http://ncigt.org) -- The [NCI Imaging Data Commons](https://imagingdatacommons.github.io/) NCI Imaging Data Commons: contract number 19X037Q from Leidos Biomedical Research under Task Order HHSN26100071 from NCI +- Open Health Imaging Foundation ([OHIF](http://ohif.org)) +- Quantitative Image Informatics for Cancer Research ([QIICR](http://qiicr.org)) +- [Radiomics](http://radiomics.io) +- The [Neuroimage Analysis Center](http://nac.spl.harvard.edu) +- The [National Center for Image Guided Therapy](http://ncigt.org) +- The [NCI Imaging Data Commons](https://imagingdatacommons.github.io/) NCI Imaging Data Commons: contract number 19X037Q from Leidos Biomedical Research under Task Order HHSN26100071 from NCI diff --git a/packages/adapters/package.json b/packages/adapters/package.json index b2d6120116..3fad4db686 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,95 +1,95 @@ { - "name": "@cornerstonejs/adapters", - "version": "3.32.5", - "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", - "module": "./dist/esm/index.js", - "types": "./dist/esm/index.d.ts", - "files": [ - "dist" - ], - "directories": { - "build": "dist" - }, - "exports": { - ".": { - "import": "./dist/esm/index.js", - "types": "./dist/esm/index.d.ts" + "name": "@cornerstonejs/adapters", + "version": "3.32.5", + "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", + "files": [ + "dist" + ], + "directories": { + "build": "dist" }, - "./cornerstone": { - "import": "./dist/esm/adapters/Cornerstone/index.js", - "types": "./dist/esm/adapters/Cornerstone/index.d.ts" + "exports": { + ".": { + "import": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts" + }, + "./cornerstone": { + "import": "./dist/esm/adapters/Cornerstone/index.js", + "types": "./dist/esm/adapters/Cornerstone/index.d.ts" + }, + "./cornerstone/*": { + "import": "./dist/esm/adapters/Cornerstone/*.js", + "types": "./dist/esm/adapters/Cornerstone/*.d.ts" + }, + "./cornerstone3D": { + "import": "./dist/esm/adapters/Cornerstone3D/index.js", + "types": "./dist/esm/adapters/Cornerstone3D/index.d.ts" + }, + "./cornerstone3D/*": { + "import": "./dist/esm/adapters/Cornerstone3D/*.js", + "types": "./dist/esm/adapters/Cornerstone3D/*.d.ts" + }, + "./enums": { + "import": "./dist/esm/adapters/enums/index.js", + "types": "./dist/esm/adapters/enums/index.d.ts" + }, + "./enums/*": { + "import": "./dist/esm/adapters/enums/*.js", + "types": "./dist/esm/adapters/enums/*.d.ts" + }, + "./helpers": { + "import": "./dist/esm/adapters/helpers/index.js", + "types": "./dist/esm/adapters/helpers/index.d.ts" + }, + "./helpers/*": { + "import": "./dist/esm/adapters/helpers/*.js", + "types": "./dist/esm/adapters/helpers/*.d.ts" + }, + "./version": { + "node": "./dist/esm/version.js", + "import": "./dist/esm/version.js", + "types": "./dist/esm/version.d.ts" + } }, - "./cornerstone/*": { - "import": "./dist/esm/adapters/Cornerstone/*.js", - "types": "./dist/esm/adapters/Cornerstone/*.d.ts" + "publishConfig": { + "access": "public" }, - "./cornerstone3D": { - "import": "./dist/esm/adapters/Cornerstone3D/index.js", - "types": "./dist/esm/adapters/Cornerstone3D/index.d.ts" + "scripts": { + "test": "jest --testTimeout 60000", + "build": "rollup -c rollup.config.mjs", + "build:esm": "rollup -c rollup.config.mjs", + "build:esm:watch": "rollup --watch -c rollup.config.mjs", + "clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist", + "clean:deep": "yarn run clean && shx rm -rf node_modules", + "dev": "rollup --watch -c rollup.config.mjs", + "build:all": "yarn build", + "api-check": "echo 'No API check for this package'", + "start": "rollup --watch -c rollup.config.mjs", + "format": "prettier --write 'src/**/*.js' 'test/**/*.js'", + "lint": "oxlint .", + "prebuild": "node ../../scripts/generate-version.js ./" }, - "./cornerstone3D/*": { - "import": "./dist/esm/adapters/Cornerstone3D/*.js", - "types": "./dist/esm/adapters/Cornerstone3D/*.d.ts" + "repository": { + "type": "git", + "url": "git+https://github.com/cornerstonejs/cornerstone3D.git" }, - "./enums": { - "import": "./dist/esm/adapters/enums/index.js", - "types": "./dist/esm/adapters/enums/index.d.ts" + "author": "@cornerstonejs adapters package", + "license": "MIT", + "bugs": { + "url": "https://github.com/cornerstonejs/cornerstone3D/issues" }, - "./enums/*": { - "import": "./dist/esm/adapters/enums/*.js", - "types": "./dist/esm/adapters/enums/*.d.ts" + "homepage": "https://github.com/cornerstonejs/cornerstone3D/blob/main/packages/adapters/README.md", + "dependencies": { + "@babel/runtime-corejs2": "^7.17.8", + "buffer": "^6.0.3", + "dcmjs": "^0.43.1", + "gl-matrix": "^3.4.3", + "ndarray": "^1.0.19" }, - "./helpers": { - "import": "./dist/esm/adapters/helpers/index.js", - "types": "./dist/esm/adapters/helpers/index.d.ts" - }, - "./helpers/*": { - "import": "./dist/esm/adapters/helpers/*.js", - "types": "./dist/esm/adapters/helpers/*.d.ts" - }, - "./version": { - "node": "./dist/esm/version.js", - "import": "./dist/esm/version.js", - "types": "./dist/esm/version.d.ts" + "peerDependencies": { + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5" } - }, - "publishConfig": { - "access": "public" - }, - "scripts": { - "test": "jest --testTimeout 60000", - "build": "rollup -c rollup.config.mjs", - "build:esm": "rollup -c rollup.config.mjs", - "build:esm:watch": "rollup --watch -c rollup.config.mjs", - "clean": "rm -rf node_modules/.cache/storybook && shx rm -rf dist", - "clean:deep": "yarn run clean && shx rm -rf node_modules", - "dev": "rollup --watch -c rollup.config.mjs", - "build:all": "yarn build", - "api-check": "echo 'No API check for this package'", - "start": "rollup --watch -c rollup.config.mjs", - "format": "prettier --write 'src/**/*.js' 'test/**/*.js'", - "lint": "oxlint .", - "prebuild": "node ../../scripts/generate-version.js ./" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/cornerstonejs/cornerstone3D.git" - }, - "author": "@cornerstonejs adapters package", - "license": "MIT", - "bugs": { - "url": "https://github.com/cornerstonejs/cornerstone3D/issues" - }, - "homepage": "https://github.com/cornerstonejs/cornerstone3D/blob/main/packages/adapters/README.md", - "dependencies": { - "@babel/runtime-corejs2": "^7.17.8", - "buffer": "^6.0.3", - "dcmjs": "^0.43.1", - "gl-matrix": "^3.4.3", - "ndarray": "^1.0.19" - }, - "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6" - } } diff --git a/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js b/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js index 9541f7fabc..dff6ff380e 100644 --- a/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js +++ b/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js @@ -1087,9 +1087,9 @@ export const getSegmentIndex = (multiframe, frame) => { ? PerFrameFunctionalGroups.SegmentIdentificationSequence .ReferencedSegmentNumber : SharedFunctionalGroupsSequence.SegmentIdentificationSequence - ? SharedFunctionalGroupsSequence.SegmentIdentificationSequence - .ReferencedSegmentNumber - : undefined; + ? SharedFunctionalGroupsSequence.SegmentIdentificationSequence + .ReferencedSegmentNumber + : undefined; }; export function insertPixelDataPlanar( diff --git a/packages/ai/package.json b/packages/ai/package.json index 57355ee1ca..3c7ed5003a 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6" + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5" } } diff --git a/packages/ai/src/ONNXSegmentationController.ts b/packages/ai/src/ONNXSegmentationController.ts index 9f7ef59209..6cad9e50d8 100644 --- a/packages/ai/src/ONNXSegmentationController.ts +++ b/packages/ai/src/ONNXSegmentationController.ts @@ -1002,9 +1002,8 @@ export default class ONNXSegmentationController { renderArguments.viewReference = viewRef; renderArguments.imageId = null; } - imageSession.canvasPosition = await utilities.loadImageToCanvas( - renderArguments - ); + imageSession.canvasPosition = + await utilities.loadImageToCanvas(renderArguments); canvas.style.width = size; canvas.style.height = size; if (isCurrent) { diff --git a/packages/core/src/RenderingEngine/helpers/getCameraVectors.ts b/packages/core/src/RenderingEngine/helpers/getCameraVectors.ts index 220f7b2d62..a1c576bf1a 100644 --- a/packages/core/src/RenderingEngine/helpers/getCameraVectors.ts +++ b/packages/core/src/RenderingEngine/helpers/getCameraVectors.ts @@ -176,7 +176,7 @@ export function calculateCameraPosition( viewRight: [viewRight[0], viewRight[1], viewRight[2]] as [ number, number, - number + number, ], }; } diff --git a/packages/core/src/cache/classes/BaseStreamingImageVolume.ts b/packages/core/src/cache/classes/BaseStreamingImageVolume.ts index a9e66aa337..556d2b6e4f 100644 --- a/packages/core/src/cache/classes/BaseStreamingImageVolume.ts +++ b/packages/core/src/cache/classes/BaseStreamingImageVolume.ts @@ -283,11 +283,11 @@ export default class BaseStreamingImageVolume this.imagesLoader = this.isDynamicVolume() ? this : imageRetrieveConfiguration - ? ( - imageRetrieveConfiguration.create || - ProgressiveRetrieveImages.createProgressive - )(imageRetrieveConfiguration) - : this; + ? ( + imageRetrieveConfiguration.create || + ProgressiveRetrieveImages.createProgressive + )(imageRetrieveConfiguration) + : this; if (loadStatus.loading === true) { return; // Already loading, will get callbacks from main load. @@ -441,11 +441,14 @@ export default class BaseStreamingImageVolume loadAndCacheImage(imageId, options) ); - return uncompressedIterator.forEach((image) => { - // scalarData is the volume container we are progressively loading into - // image is the pixelData decoded from workers in cornerstoneDICOMImageLoader - this.successCallback(imageId, image); - }, this.errorCallback.bind(this, imageIdIndex, imageId)); + return uncompressedIterator.forEach( + (image) => { + // scalarData is the volume container we are progressively loading into + // image is the pixelData decoded from workers in cornerstoneDICOMImageLoader + this.successCallback(imageId, image); + }, + this.errorCallback.bind(this, imageIdIndex, imageId) + ); } protected getImageIdsRequests(imageIds: string[], priorityDefault: number) { diff --git a/packages/core/src/loaders/ProgressiveRetrieveImages.ts b/packages/core/src/loaders/ProgressiveRetrieveImages.ts index 24dcd1e0d4..ed7fb20072 100644 --- a/packages/core/src/loaders/ProgressiveRetrieveImages.ts +++ b/packages/core/src/loaders/ProgressiveRetrieveImages.ts @@ -301,8 +301,8 @@ class ProgressiveRetrieveImagesInstance { position < 0 ? this.imageIds.length + position : position < 1 - ? Math.floor((this.imageIds.length - 1) * position) - : position; + ? Math.floor((this.imageIds.length - 1) * position) + : position; const imageId = this.imageIds[index]; if (!imageId) { throw new Error(`No value found to add to requests at ${position}`); diff --git a/packages/core/src/loaders/volumeLoader.ts b/packages/core/src/loaders/volumeLoader.ts index a99b0556cc..305629bb93 100644 --- a/packages/core/src/loaders/volumeLoader.ts +++ b/packages/core/src/loaders/volumeLoader.ts @@ -218,7 +218,7 @@ export function createAndCacheDerivedVolume( ? ( referencedVolume as StreamingDynamicImageVolume ).getCurrentDimensionGroupImageIds() - : referencedVolume.imageIds ?? []; + : (referencedVolume.imageIds ?? []); // Todo: fix later // const byteLength = referencedImageIds.reduce((total, imageId) => { @@ -377,7 +377,7 @@ export function createLocalVolume( const dataType = scalarData ? (scalarData.constructor.name as PixelDataTypedArrayString) - : targetBuffer?.type ?? 'Float32Array'; + : (targetBuffer?.type ?? 'Float32Array'); const totalNumberOfVoxels = sliceLength * dimensions[2]; let byteLength; diff --git a/packages/core/src/types/AffineMatrix.ts b/packages/core/src/types/AffineMatrix.ts index 5d75c4d049..4553244611 100644 --- a/packages/core/src/types/AffineMatrix.ts +++ b/packages/core/src/types/AffineMatrix.ts @@ -2,7 +2,7 @@ type AffineMatrix = [ [number, number, number, number], [number, number, number, number], [number, number, number, number], - [number, number, number, number] + [number, number, number, number], ]; export type { AffineMatrix }; diff --git a/packages/core/src/utilities/roundNumber.ts b/packages/core/src/utilities/roundNumber.ts index cfb8f54a67..59dd01390e 100644 --- a/packages/core/src/utilities/roundNumber.ts +++ b/packages/core/src/utilities/roundNumber.ts @@ -31,16 +31,16 @@ function roundNumber( absValue >= 100 ? precision - 2 : absValue >= 10 - ? precision - 1 - : absValue >= 1 - ? precision - : absValue >= 0.1 - ? precision + 1 - : absValue >= 0.01 - ? precision + 2 - : absValue >= 0.001 - ? precision + 3 - : precision + 4; + ? precision - 1 + : absValue >= 1 + ? precision + : absValue >= 0.1 + ? precision + 1 + : absValue >= 0.01 + ? precision + 2 + : absValue >= 0.001 + ? precision + 3 + : precision + 4; return value.toFixed(fixedPrecision); } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index f4eae98b7a..e25d156dca 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/core": "^3.32.5", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/dicomImageLoader/src/codecs/jpeg.js b/packages/dicomImageLoader/src/codecs/jpeg.js index 4fbec0a6b7..7bf175b1ae 100644 --- a/packages/dicomImageLoader/src/codecs/jpeg.js +++ b/packages/dicomImageLoader/src/codecs/jpeg.js @@ -527,8 +527,8 @@ function quantizeAndInverse(component, blockBufferOffset, p) { q <= -2056 / component.bitConversion ? 0 : q >= 2024 / component.bitConversion - ? 255 / component.bitConversion - : (q + 2056 / component.bitConversion) >> 4; + ? 255 / component.bitConversion + : (q + 2056 / component.bitConversion) >> 4; component.blockData[index] = q; } } diff --git a/packages/dicomImageLoader/src/types/WADORSMetaData.ts b/packages/dicomImageLoader/src/types/WADORSMetaData.ts index bf3db80140..87de6d748d 100644 --- a/packages/dicomImageLoader/src/types/WADORSMetaData.ts +++ b/packages/dicomImageLoader/src/types/WADORSMetaData.ts @@ -1,5 +1,5 @@ export interface WADORSMetaDataElement< - ValueType = string[] | number[] | boolean + ValueType = string[] | number[] | boolean, > { Value: ValueType; } diff --git a/packages/docs/docs/concepts/cornerstone-core/cahce.md b/packages/docs/docs/concepts/cornerstone-core/cahce.md index 4d2dac542d..a2a995920e 100644 --- a/packages/docs/docs/concepts/cornerstone-core/cahce.md +++ b/packages/docs/docs/concepts/cornerstone-core/cahce.md @@ -34,13 +34,11 @@ This new change that was introduced in `Cornerstone3D` 2.x is part of the new im Here are other benefits of the new approach: 1. Single Source of Truth - - Previously: Data existed in both image cache and volume cache, leading to synchronization issues. - Now: Only one source of truth - the image cache. - Benefits: Improved syncing between stack and volume segmentations. 2. New Volume Creation Approach - - Everything now loads as images. - Volume streaming is performed image by image. - Only images are cached in the image cache. @@ -48,7 +46,6 @@ Here are other benefits of the new approach: - Benefits: Eliminated need for scalar data in CPU, reduced memory usage, improved performance. 3. VoxelManager for Tools - - Acts as an intermediary between indexes and scalar data. - Provides mappers from IJK to indexes. - Retrieves information without creating scalar data. @@ -56,12 +53,10 @@ Here are other benefits of the new approach: - Benefits: Efficient handling of tools requiring pixel data in CPU. 4. Handling Non-Image Volumes - - Volumes without images (e.g., NIFTI) are chopped and converted to stack format. - Makes non-image volumes compatible with the new image-based approach. 5. Optimized Caching Mechanism - - Data stored in native format instead of always caching as float32. - On-the-fly conversion to required format when updating GPU textures. - Benefits: Reduced memory usage, eliminated unnecessary data type conversions. diff --git a/packages/docs/docs/concepts/cornerstone-core/volumeLoader.md b/packages/docs/docs/concepts/cornerstone-core/volumeLoader.md index f6603895b0..73f8c39896 100644 --- a/packages/docs/docs/concepts/cornerstone-core/volumeLoader.md +++ b/packages/docs/docs/concepts/cornerstone-core/volumeLoader.md @@ -21,7 +21,6 @@ Below you can see a simplified code for our `cornerstoneStreamingImageVolumeLoad 1. Based on a set of imageIds, we compute volume metadata such as: spacing, origin, direction, etc. 2. Instantiate a new [`StreamingImageVolume`](/docs/api/core/classes/streamingimagevolume/) - - `StreamingImageVolume` implements methods for loading (`.load`) - It implements load via using `imageLoadPoolManager` - Each loaded frame (imageId) is put at the correct slice in the 3D volume diff --git a/packages/docs/docs/migration-guides/2x/3-core.md b/packages/docs/docs/migration-guides/2x/3-core.md index 50d02a2ad8..386fc4cafe 100644 --- a/packages/docs/docs/migration-guides/2x/3-core.md +++ b/packages/docs/docs/migration-guides/2x/3-core.md @@ -224,13 +224,11 @@ It is more accurate to use `getViewReferenceId` to reflect the actual function o The Cornerstone library has undergone significant changes in how it handles image volumes and texture management. These changes aim to improve performance, reduce memory usage, and provide more efficient data access, especially for large datasets. 1. Single Source of Truth - - Previously: Data existed in both image cache and volume cache, leading to synchronization issues. - Now: Only one source of truth - the image cache. - Benefits: Improved syncing between stack and volume segmentations. 2. New Volume Creation Approach - - Everything now loads as images. - Volume streaming is performed image by image. - Only images are cached in the image cache. @@ -238,7 +236,6 @@ The Cornerstone library has undergone significant changes in how it handles imag - Benefits: Eliminated need for scalar data in CPU, reduced memory usage, improved performance. 3. VoxelManager for Tools - - Acts as an intermediary between indexes and scalar data. - Provides mappers from IJK to indexes. - Retrieves information without creating scalar data. @@ -246,12 +243,10 @@ The Cornerstone library has undergone significant changes in how it handles imag - Benefits: Efficient handling of tools requiring pixel data in CPU. 4. Handling Non-Image Volumes - - Volumes without images (e.g., NIFTI) are chopped and converted to stack format. - Makes non-image volumes compatible with the new image-based approach. 5. Optimized Caching Mechanism - - Data stored in native format instead of always caching as float32. - On-the-fly conversion to required format when updating GPU textures. - Benefits: Reduced memory usage, eliminated unnecessary data type conversions. @@ -290,7 +285,6 @@ A new `VoxelManager` class has been introduced to handle voxel data more efficie b. For 3D coordinates, use `getAtIJK(i, j, k)` and `setAtIJK(i, j, k, value)`. 4. Available VoxelManager Methods: - - `getScalarData()`: Returns the entire scalar data array (only for IImage, not for volumes). - `getScalarDataLength()`: Returns the total number of voxels. - `getAtIndex(index)`: Gets the value at a specific index. @@ -325,7 +319,6 @@ A new `VoxelManager` class has been introduced to handle voxel data more efficie ``` 7. Getting volume information: - - Dimensions: `volume.dimensions` - Spacing: `volume.spacing` - Direction: `volume.direction` @@ -336,14 +329,12 @@ A new `VoxelManager` class has been introduced to handle voxel data more efficie If dealing with RGB data, the `getAtIndex` and `getAtIJK` methods will return an array `[r, g, b]`. 9. Performance considerations: - - Use `getAtIndex` and `setAtIndex` for bulk operations when possible, as they're generally faster than `getAtIJK` and `setAtIJK`. - When iterating over a large portion of the volume, consider using `forEach` for optimized performance. 10. Dynamic Volumes: For 4D datasets, additional methods are available: - - `setTimePoint(timePoint)`: Sets the current time point. - `getAtIndexAndTimePoint(index, timePoint)`: Gets a value for a specific index and time point. diff --git a/packages/docs/docs/migration-guides/2x/5-tools.md b/packages/docs/docs/migration-guides/2x/5-tools.md index 3fd114c864..dfdf4d4400 100644 --- a/packages/docs/docs/migration-guides/2x/5-tools.md +++ b/packages/docs/docs/migration-guides/2x/5-tools.md @@ -93,25 +93,21 @@ We have a new segmentation model that is more flexible and easier to use. In Cornerstone3D version 2, we've made significant architectural changes to our segmentation model while maintaining familiar terminology. This redesign aims to provide a more flexible and intuitive approach to working with segmentations across different viewports. Here are the key changes and the reasons behind them: 1. **Viewport-Specific, Not Tool Group-Based**: - - Old: Segmentations were tied to tool groups, which typically consist of multiple viewports. This created complications when users wanted to add segmentations to some viewports but not others within the same tool group. - New: Segmentations are now viewport-specific. Instead of adding or removing representations to a tool group, users can add them directly to viewports. This provides much finer control over what each viewport renders. - Why: We discovered that tying rendering to a tool group is not an effective approach. It often necessitated creating an extra tool group for a specific viewport to customize or prevent rendering. 2. **Simplified Identification of Segmentation Representations**: - - Old: Required a unique segmentationRepresentationUID for identification. - New: Segmentation representations are identified by a combination of `segmentationId` and representation `type`. This allows each viewport to have different representations of the same segmentation. - Why: This simplification makes it easier to manage and reference segmentation representations across different viewports. 3. **Decoupling of Data and Visualization**: - - Old: Segmentation rendering was tightly coupled with tool groups. - New: Segmentation is now treated purely as data, separate from the tools used to interact with it. - Why: While it's appropriate for tools to be bound to tool groups, viewport-specific functionalities like segmentation rendering should be the responsibility of individual viewports. This separation allows for more flexible rendering and interaction options across different viewports. 4. **Polymorphic Segmentation Support**: - - The new architecture better supports the concept of polymorphic segmentations, where a single segmentation can have multiple representations (e.g., labelmap, contour, surface) that can be efficiently converted between each other. - Why: This flexibility allows for more efficient storage, analysis, and real-time visualization of segmentations. @@ -355,7 +351,6 @@ The previous model required users to provide an imageIdReferenceMap, which linke 1. Manual creation of the map was error-prone, particularly regarding the order of imageIds. 2. Once a segmentation was associated with specific viewport imageIds, rendering it elsewhere became problematic. For example: - - Rendering a CT image stack segmentation on a single key image. - Rendering a CT image stack segmentation on a stack that includes both CT and other images. - Rendering a DX dual energy segmentation from energy 1 on energy 2. diff --git a/packages/docs/docs/migration-guides/legacy-to-3d.md b/packages/docs/docs/migration-guides/legacy-to-3d.md index e967e47ca4..a780ddfb8e 100644 --- a/packages/docs/docs/migration-guides/legacy-to-3d.md +++ b/packages/docs/docs/migration-guides/legacy-to-3d.md @@ -269,7 +269,7 @@ renderingEngine.destroy(); // The ELEMENT_DISABLED event contains just a reference to the canvas element which is now disabled, and related IDs. eventDetail: { - viewportId, renderingEngineId, canvas; + (viewportId, renderingEngineId, canvas); } ``` @@ -409,12 +409,12 @@ viewport: { ```js camera: { - viewUp, + (viewUp, viewPlaneNormal, position, focalPoint, orthogonalOrPerspective, - viewAngle; + viewAngle); } ``` @@ -445,7 +445,7 @@ startPoints / lastPoints / currentPoints / deltaPoints: { ```js // Location in 3D in world space { - CanvasCoord, WorldCoord; + (CanvasCoord, WorldCoord); } ``` diff --git a/packages/docs/package.json b/packages/docs/package.json index ab8d7c3fc7..2cf29ba4d3 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.6", - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/dicom-image-loader": "^3.32.6", - "@cornerstonejs/nifti-volume-loader": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6", + "@cornerstonejs/adapters": "^3.32.5", + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/dicom-image-loader": "^3.32.5", + "@cornerstonejs/nifti-volume-loader": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 863de87969..0d194ea2c2 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6", + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index edb235fb88..3c16970636 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6" + "@cornerstonejs/core": "^3.32.5" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/examples/PolySegWasmStackLabelmapToSurface/index.ts b/packages/polymorphic-segmentation/examples/PolySegWasmStackLabelmapToSurface/index.ts index 0f6d667ab5..c08b23564f 100644 --- a/packages/polymorphic-segmentation/examples/PolySegWasmStackLabelmapToSurface/index.ts +++ b/packages/polymorphic-segmentation/examples/PolySegWasmStackLabelmapToSurface/index.ts @@ -225,9 +225,8 @@ async function run() { cornerstoneTools.utilities.stackContextPrefetch.enable(element1); - const segImages = await imageLoader.createAndCacheDerivedLabelmapImages( - imageIds - ); + const segImages = + await imageLoader.createAndCacheDerivedLabelmapImages(imageIds); const segmentationImageIds = segImages.map((it) => it.imageId); diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index fd46d6274c..91a4ca2684 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6", + "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/tools": "^3.32.5", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/polymorphic-segmentation/src/Labelmap/convertContourToLabelmap.ts b/packages/polymorphic-segmentation/src/Labelmap/convertContourToLabelmap.ts index 11ef3f3076..4dcfd6ac56 100644 --- a/packages/polymorphic-segmentation/src/Labelmap/convertContourToLabelmap.ts +++ b/packages/polymorphic-segmentation/src/Labelmap/convertContourToLabelmap.ts @@ -124,9 +124,8 @@ export async function convertContourToStackLabelmap( }); // create - const segImages = await imageLoader.createAndCacheDerivedLabelmapImages( - imageIds - ); + const segImages = + await imageLoader.createAndCacheDerivedLabelmapImages(imageIds); const segmentationImageIds = segImages.map((it) => it.imageId); diff --git a/packages/polymorphic-segmentation/src/Surface/updateSurfaceData.ts b/packages/polymorphic-segmentation/src/Surface/updateSurfaceData.ts index d45a13ee8e..d79afbe1d6 100644 --- a/packages/polymorphic-segmentation/src/Surface/updateSurfaceData.ts +++ b/packages/polymorphic-segmentation/src/Surface/updateSurfaceData.ts @@ -21,9 +21,8 @@ const { } = cornerstoneTools; export async function updateSurfaceData(segmentationId) { - const surfacesObj = await computeSurfaceFromLabelmapSegmentation( - segmentationId - ); + const surfacesObj = + await computeSurfaceFromLabelmapSegmentation(segmentationId); if (!surfacesObj) { return; diff --git a/packages/tools/examples/CINETool/index.ts b/packages/tools/examples/CINETool/index.ts index fcddd745a7..a02cf78d7f 100644 --- a/packages/tools/examples/CINETool/index.ts +++ b/packages/tools/examples/CINETool/index.ts @@ -146,9 +146,8 @@ function setActiveElement(element) { (document.querySelector('#fpsSlider')).value = fps; - (( - document.querySelector('#fpsSlider-label') - )).innerText = ` Frames per second: ${fps}`; + (document.querySelector('#fpsSlider-label')).innerText = + ` Frames per second: ${fps}`; } /** diff --git a/packages/tools/examples/contourRendering/index.ts b/packages/tools/examples/contourRendering/index.ts index 44495d706e..7b16619618 100644 --- a/packages/tools/examples/contourRendering/index.ts +++ b/packages/tools/examples/contourRendering/index.ts @@ -127,9 +127,8 @@ async function run() { // Add some segmentations based on the source data volume - const geometriesInfo = await createAndCacheGeometriesFromContours( - 'SampleContour' - ); + const geometriesInfo = + await createAndCacheGeometriesFromContours('SampleContour'); // Add the segmentations to state segmentation.addSegmentations([ diff --git a/packages/tools/examples/contourRenderingConfiguration/index.ts b/packages/tools/examples/contourRenderingConfiguration/index.ts index 54d1d8539b..9fcea17725 100644 --- a/packages/tools/examples/contourRenderingConfiguration/index.ts +++ b/packages/tools/examples/contourRenderingConfiguration/index.ts @@ -134,9 +134,8 @@ addSliderToToolbar({ async function addSegmentationsToState() { // load the contour data - const geometryIds = await createAndCacheGeometriesFromContours( - 'CircleContour' - ); + const geometryIds = + await createAndCacheGeometriesFromContours('CircleContour'); // Add the segmentations to state segmentation.addSegmentations([ diff --git a/packages/tools/examples/contourRenderingMultiple/index.ts b/packages/tools/examples/contourRenderingMultiple/index.ts index a96f41d5cd..98d833fc10 100644 --- a/packages/tools/examples/contourRenderingMultiple/index.ts +++ b/packages/tools/examples/contourRenderingMultiple/index.ts @@ -145,9 +145,8 @@ async function run() { }); // Add some segmentations based on the source data volume - const geometriesInfo = await createAndCacheGeometriesFromContours( - 'SampleContour' - ); + const geometriesInfo = + await createAndCacheGeometriesFromContours('SampleContour'); // Add the segmentations to state segmentation.addSegmentations([ diff --git a/packages/tools/examples/dynamicallyAddAnnotations/angleToolUI.ts b/packages/tools/examples/dynamicallyAddAnnotations/angleToolUI.ts index a80d6ff903..c30675d49e 100644 --- a/packages/tools/examples/dynamicallyAddAnnotations/angleToolUI.ts +++ b/packages/tools/examples/dynamicallyAddAnnotations/angleToolUI.ts @@ -39,29 +39,29 @@ function createFormElement(): HTMLFormElement { coordType.charAt(0).toUpperCase() + coordType.slice(1) } Coords: Point 1 [${coordType === 'canvas' ? 'x, y' : 'i, j'}]: + coordType === 'canvas' ? 'x' : 'i' + }" value="10"> + coordType === 'canvas' ? 'y' : 'j' + }" value="10"> + coordType === 'canvas' ? 'x' : 'i' + }" value="100"> + coordType === 'canvas' ? 'y' : 'j' + }" value="100"> + coordType === 'canvas' ? 'x' : 'i' + }" value="100"> + coordType === 'canvas' ? 'y' : 'j' + }" value="10">
@@ -84,7 +84,7 @@ function addButtonListeners(form: HTMLFormElement): void { const [type, viewportType, useImageId] = button.id.split('-') as [ 'canvas' | 'image', keyof typeof typeToIdMap, - 'imageId'? + 'imageId'?, ]; const enabledElement = getEnabledElementByViewportId( typeToIdMap[viewportType] diff --git a/packages/tools/examples/dynamicallyAddAnnotations/arrowAnnotateToolUI.ts b/packages/tools/examples/dynamicallyAddAnnotations/arrowAnnotateToolUI.ts index d0578d4ed5..f9c96d6148 100644 --- a/packages/tools/examples/dynamicallyAddAnnotations/arrowAnnotateToolUI.ts +++ b/packages/tools/examples/dynamicallyAddAnnotations/arrowAnnotateToolUI.ts @@ -34,20 +34,20 @@ function createFormElement(): HTMLFormElement { coordType.charAt(0).toUpperCase() + coordType.slice(1) } Coords: Start [${coordType === 'canvas' ? 'x, y' : 'i, j'}]: + coordType === 'canvas' ? 'x' : 'i' + }" value="10"> + coordType === 'canvas' ? 'y' : 'j' + }" value="10"> + coordType === 'canvas' ? 'x' : 'i' + }" value="100"> + coordType === 'canvas' ? 'y' : 'j' + }" value="100">
@@ -72,7 +72,7 @@ function addButtonListeners(form: HTMLFormElement): void { const [type, viewportType, useImageId] = button.id.split('-') as [ 'canvas' | 'image', keyof typeof typeToIdMap, - 'imageId'? + 'imageId'?, ]; const enabledElement = getEnabledElementByViewportId( typeToIdMap[viewportType] diff --git a/packages/tools/examples/dynamicallyAddAnnotations/circleROIToolUI.ts b/packages/tools/examples/dynamicallyAddAnnotations/circleROIToolUI.ts index f83446704b..7267848dff 100644 --- a/packages/tools/examples/dynamicallyAddAnnotations/circleROIToolUI.ts +++ b/packages/tools/examples/dynamicallyAddAnnotations/circleROIToolUI.ts @@ -34,20 +34,20 @@ function createFormElement(): HTMLFormElement { coordType.charAt(0).toUpperCase() + coordType.slice(1) } Coords: Center [${coordType === 'canvas' ? 'x, y' : 'i, j'}]: + coordType === 'canvas' ? 'x' : 'i' + }" value="50"> + coordType === 'canvas' ? 'y' : 'j' + }" value="50"> + coordType === 'canvas' ? 'x' : 'i' + }" value="100"> + coordType === 'canvas' ? 'y' : 'j' + }" value="50">
@@ -70,7 +70,7 @@ function addButtonListeners(form: HTMLFormElement): void { const [type, viewportType, useImageId] = button.id.split('-') as [ 'canvas' | 'image', keyof typeof typeToIdMap, - 'imageId'? + 'imageId'?, ]; const enabledElement = getEnabledElementByViewportId( typeToIdMap[viewportType] diff --git a/packages/tools/examples/dynamicallyAddAnnotations/ellipticalROIToolUI.ts b/packages/tools/examples/dynamicallyAddAnnotations/ellipticalROIToolUI.ts index 5225673ad9..38e7235823 100644 --- a/packages/tools/examples/dynamicallyAddAnnotations/ellipticalROIToolUI.ts +++ b/packages/tools/examples/dynamicallyAddAnnotations/ellipticalROIToolUI.ts @@ -46,11 +46,11 @@ function createFormElement(): HTMLFormElement { coordType.charAt(0).toUpperCase() + coordType.slice(1) } Coords: Top Left [${coordType === 'canvas' ? 'x, y' : 'i, j'}]: + coordType === 'canvas' ? 'x' : 'i' + }" value="10"> + coordType === 'canvas' ? 'y' : 'j' + }" value="10"> @@ -89,7 +89,7 @@ function addButtonListeners(form: HTMLFormElement): void { const [type, viewportType, useImageId] = button.id.split('-') as [ 'canvas' | 'image', keyof typeof typeToIdMap, - 'imageId'? + 'imageId'?, ]; const enabledElement = getEnabledElementByViewportId( typeToIdMap[viewportType] diff --git a/packages/tools/examples/dynamicallyAddAnnotations/labelToolUI.ts b/packages/tools/examples/dynamicallyAddAnnotations/labelToolUI.ts index 41b04dc412..3509dff897 100644 --- a/packages/tools/examples/dynamicallyAddAnnotations/labelToolUI.ts +++ b/packages/tools/examples/dynamicallyAddAnnotations/labelToolUI.ts @@ -28,11 +28,11 @@ function createFormElement(): HTMLFormElement { coordType.charAt(0).toUpperCase() + coordType.slice(1) } Coords: Start [${coordType === 'canvas' ? 'x, y' : 'i, j'}]: + coordType === 'canvas' ? 'x' : 'i' + }" value="10"> + coordType === 'canvas' ? 'y' : 'j' + }" value="10">
@@ -51,7 +51,7 @@ function addButtonListeners(form: HTMLFormElement): void { button.addEventListener('click', () => { const [type, viewportType] = button.id.split('-') as [ 'canvas' | 'image', - keyof typeof typeToIdMap + keyof typeof typeToIdMap, ]; const enabledElement = getEnabledElementByViewportId( typeToIdMap[viewportType] diff --git a/packages/tools/examples/dynamicallyAddAnnotations/lengthToolUI.ts b/packages/tools/examples/dynamicallyAddAnnotations/lengthToolUI.ts index 4a065b20ea..23c9a765fe 100644 --- a/packages/tools/examples/dynamicallyAddAnnotations/lengthToolUI.ts +++ b/packages/tools/examples/dynamicallyAddAnnotations/lengthToolUI.ts @@ -35,20 +35,20 @@ function createFormElement(): HTMLFormElement { coordType.charAt(0).toUpperCase() + coordType.slice(1) } Coords: Start [${coordType === 'canvas' ? 'x, y' : 'i, j'}]: + coordType === 'canvas' ? 'x' : 'i' + }" value="10"> + coordType === 'canvas' ? 'y' : 'j' + }" value="10"> + coordType === 'canvas' ? 'x' : 'i' + }" value="100"> + coordType === 'canvas' ? 'y' : 'j' + }" value="100">
@@ -71,7 +71,7 @@ function addButtonListeners(form: HTMLFormElement): void { const [type, viewportType, useImageId] = button.id.split('-') as [ 'canvas' | 'image', keyof typeof typeToIdMap, - 'imageId'? + 'imageId'?, ]; const enabledElement = getEnabledElementByViewportId( typeToIdMap[viewportType] diff --git a/packages/tools/examples/dynamicallyAddAnnotations/probeToolUI.ts b/packages/tools/examples/dynamicallyAddAnnotations/probeToolUI.ts index 71df27ed8d..d2cd03ab64 100644 --- a/packages/tools/examples/dynamicallyAddAnnotations/probeToolUI.ts +++ b/packages/tools/examples/dynamicallyAddAnnotations/probeToolUI.ts @@ -34,11 +34,11 @@ function createFormElement(): HTMLFormElement { coordType.charAt(0).toUpperCase() + coordType.slice(1) } Coords: Point [${coordType === 'canvas' ? 'x, y' : 'i, j'}]: + coordType === 'canvas' ? 'x' : 'i' + }" value="10"> + coordType === 'canvas' ? 'y' : 'j' + }" value="10">
@@ -61,7 +61,7 @@ function addButtonListeners(form: HTMLFormElement): void { const [type, viewportType, useImageId] = button.id.split('-') as [ 'canvas' | 'image', keyof typeof typeToIdMap, - 'imageId'? + 'imageId'?, ]; const enabledElement = getEnabledElementByViewportId( typeToIdMap[viewportType] diff --git a/packages/tools/examples/dynamicallyAddAnnotations/rectangleROIToolUI.ts b/packages/tools/examples/dynamicallyAddAnnotations/rectangleROIToolUI.ts index 0e5acad432..bf73e9e1cd 100644 --- a/packages/tools/examples/dynamicallyAddAnnotations/rectangleROIToolUI.ts +++ b/packages/tools/examples/dynamicallyAddAnnotations/rectangleROIToolUI.ts @@ -47,11 +47,11 @@ function createFormElement(): HTMLFormElement { coordType.charAt(0).toUpperCase() + coordType.slice(1) } Coords: Top Left [${coordType === 'canvas' ? 'x, y' : 'i, j'}]: + coordType === 'canvas' ? 'x' : 'i' + }" value="10"> + coordType === 'canvas' ? 'y' : 'j' + }" value="10"> @@ -90,7 +90,7 @@ function addButtonListeners(form: HTMLFormElement): void { const [type, viewportType, useImageId] = button.id.split('-') as [ 'canvas' | 'image', keyof typeof typeToIdMap, - 'imageId'? + 'imageId'?, ]; const enabledElement = getEnabledElementByViewportId( typeToIdMap[viewportType] diff --git a/packages/tools/examples/dynamicallyAddAnnotations/splineROIToolUI.ts b/packages/tools/examples/dynamicallyAddAnnotations/splineROIToolUI.ts index d2dcb39983..05f31ddc0a 100644 --- a/packages/tools/examples/dynamicallyAddAnnotations/splineROIToolUI.ts +++ b/packages/tools/examples/dynamicallyAddAnnotations/splineROIToolUI.ts @@ -39,29 +39,29 @@ function createFormElement(): HTMLFormElement { coordType.charAt(0).toUpperCase() + coordType.slice(1) } Coords: Point 1 [${coordType === 'canvas' ? 'x, y' : 'i, j'}]: + coordType === 'canvas' ? 'x' : 'i' + }" value="50"> + coordType === 'canvas' ? 'y' : 'j' + }" value="50"> + coordType === 'canvas' ? 'x' : 'i' + }" value="100"> + coordType === 'canvas' ? 'y' : 'j' + }" value="100"> + coordType === 'canvas' ? 'x' : 'i' + }" value="150"> + coordType === 'canvas' ? 'y' : 'j' + }" value="50">
@@ -84,7 +84,7 @@ function addButtonListeners(form: HTMLFormElement): void { const [type, viewportType, useImageId] = button.id.split('-') as [ 'canvas' | 'image', keyof typeof typeToIdMap, - 'imageId'? + 'imageId'?, ]; const enabledElement = getEnabledElementByViewportId( typeToIdMap[viewportType] diff --git a/packages/tools/examples/labelmapStatistics/index.ts b/packages/tools/examples/labelmapStatistics/index.ts index 87a433a4c3..9edd2b47d3 100644 --- a/packages/tools/examples/labelmapStatistics/index.ts +++ b/packages/tools/examples/labelmapStatistics/index.ts @@ -275,9 +275,8 @@ async function run() { // Create a stack of images const imageIdsArray = imageIds.slice(0, 10); // Create segmentation images for the stack - const segImages = await imageLoader.createAndCacheDerivedLabelmapImages( - imageIdsArray - ); + const segImages = + await imageLoader.createAndCacheDerivedLabelmapImages(imageIdsArray); // Instantiate a rendering engine renderingEngine = new RenderingEngine(renderingEngineId); diff --git a/packages/tools/examples/regionSegmentPlus/index.ts b/packages/tools/examples/regionSegmentPlus/index.ts index f4c6a3f7f0..a69d3f2b56 100644 --- a/packages/tools/examples/regionSegmentPlus/index.ts +++ b/packages/tools/examples/regionSegmentPlus/index.ts @@ -152,9 +152,8 @@ const updateSeedVariancesConfig = cstUtils.throttle( async function addSegmentationToState(imageIds) { // Create segmentation images for each image in the stack - const segImages = await imageLoader.createAndCacheDerivedLabelmapImages( - imageIds - ); + const segImages = + await imageLoader.createAndCacheDerivedLabelmapImages(imageIds); // Add the segmentation to state segmentation.addSegmentations([ diff --git a/packages/tools/examples/segmentBidirectionalToolStack/index.ts b/packages/tools/examples/segmentBidirectionalToolStack/index.ts index f0722ec5fa..44bc65559d 100644 --- a/packages/tools/examples/segmentBidirectionalToolStack/index.ts +++ b/packages/tools/examples/segmentBidirectionalToolStack/index.ts @@ -202,9 +202,8 @@ addButtonToToolbar({ async function addSegmentationsToState(imageIds) { // Create a segmentation of the same resolution as the source data - const segImages = await imageLoader.createAndCacheDerivedLabelmapImages( - imageIds - ); + const segImages = + await imageLoader.createAndCacheDerivedLabelmapImages(imageIds); // Add the segmentations to state segmentation.addSegmentations([ diff --git a/packages/tools/examples/segmentLabel/index.ts b/packages/tools/examples/segmentLabel/index.ts index 96fbcd81c2..df5345eb2b 100644 --- a/packages/tools/examples/segmentLabel/index.ts +++ b/packages/tools/examples/segmentLabel/index.ts @@ -317,9 +317,8 @@ async function _handleStackViewports(stackImageIds: string[]) { const imageIdsArray = [stackImageIds[0]]; - const segImages = await imageLoader.createAndCacheDerivedLabelmapImages( - imageIdsArray - ); + const segImages = + await imageLoader.createAndCacheDerivedLabelmapImages(imageIdsArray); const segmentationImageIds = segImages.map((it) => it.imageId); diff --git a/packages/tools/examples/segmentSelect/index.ts b/packages/tools/examples/segmentSelect/index.ts index 78cc2cac6d..ae6553e0b6 100644 --- a/packages/tools/examples/segmentSelect/index.ts +++ b/packages/tools/examples/segmentSelect/index.ts @@ -317,9 +317,8 @@ async function _handleStackViewports(stackImageIds: string[]) { const imageIdsArray = [stackImageIds[0]]; - const segImages = await imageLoader.createAndCacheDerivedLabelmapImages( - imageIdsArray - ); + const segImages = + await imageLoader.createAndCacheDerivedLabelmapImages(imageIdsArray); const segmentationImageIds = segImages.map((it) => it.imageId); diff --git a/packages/tools/examples/stackLabelmapSegmentation/index.ts b/packages/tools/examples/stackLabelmapSegmentation/index.ts index 0a12af81f0..bd4e688746 100644 --- a/packages/tools/examples/stackLabelmapSegmentation/index.ts +++ b/packages/tools/examples/stackLabelmapSegmentation/index.ts @@ -484,13 +484,11 @@ async function run() { viewport = renderingEngine.getViewport(viewportId); const ctImageIds = imageIds.slice(0, 3); - const ctSegImages = await imageLoader.createAndCacheDerivedLabelmapImages( - ctImageIds - ); + const ctSegImages = + await imageLoader.createAndCacheDerivedLabelmapImages(ctImageIds); - const mgSegImages = await imageLoader.createAndCacheDerivedLabelmapImages( - mgImageIds - ); + const mgSegImages = + await imageLoader.createAndCacheDerivedLabelmapImages(mgImageIds); const viewport2 = renderingEngine.getViewport(viewportId2); await viewport.setStack(ctImageIds, 0); diff --git a/packages/tools/examples/stackRange/index.ts b/packages/tools/examples/stackRange/index.ts index 02b7be9c2c..26f69e6933 100644 --- a/packages/tools/examples/stackRange/index.ts +++ b/packages/tools/examples/stackRange/index.ts @@ -218,8 +218,8 @@ function updateAnnotationDiv(uid) { const range = AnnotationMultiSlice.getFrameRangeStr(annotation); selectionDiv.innerHTML = ` ${toolName} Annotation UID:${uid} Label:${ - data.label || data.text - } ${annotation.isVisible ? 'visible' : 'not visible'}
+ data.label || data.text + } ${annotation.isVisible ? 'visible' : 'not visible'}
Range: Frames: ${range}
`; } diff --git a/packages/tools/examples/videoColor/index.ts b/packages/tools/examples/videoColor/index.ts index 3c74076c85..162f5e4682 100644 --- a/packages/tools/examples/videoColor/index.ts +++ b/packages/tools/examples/videoColor/index.ts @@ -142,9 +142,8 @@ addButtonToToolbar({ ); console.log('White=', white); viewport.setAverageWhite(white); - document.getElementById( - 'Color Correct' - ).innerText = `Avg Color: ${white.join(',')}`; + document.getElementById('Color Correct').innerText = + `Avg Color: ${white.join(',')}`; currentWhite = -1; }, }); diff --git a/packages/tools/examples/videoGroup/index.ts b/packages/tools/examples/videoGroup/index.ts index e4ea2b446d..90a0604441 100644 --- a/packages/tools/examples/videoGroup/index.ts +++ b/packages/tools/examples/videoGroup/index.ts @@ -256,13 +256,13 @@ function updateAnnotationDiv(uid) { const { fps } = viewport; selectionDiv.innerHTML = ` ${toolName} Annotation UID:${uid} Label:${ - data.label || data.text - } ${annotation.isVisible ? 'visible' : 'not visible'}
+ data.label || data.text + } ${annotation.isVisible ? 'visible' : 'not visible'}
Range: ${rangeArr.join('-')} Time ${rangeArr - .map((it) => Math.round((it * 10) / fps) / 10) - .join('-')} Groups: ${group1.has(uid) ? '1' : ''} ${ - group2.has(uid) ? '2' : '' - }
+ .map((it) => Math.round((it * 10) / fps) / 10) + .join('-')} Groups: ${group1.has(uid) ? '1' : ''} ${ + group2.has(uid) ? '2' : '' + }
`; } diff --git a/packages/tools/examples/videoRange/index.ts b/packages/tools/examples/videoRange/index.ts index f02003cf12..24f5581bdb 100644 --- a/packages/tools/examples/videoRange/index.ts +++ b/packages/tools/examples/videoRange/index.ts @@ -234,11 +234,11 @@ function updateAnnotationDiv(uid) { const { fps } = viewport; selectionDiv.innerHTML = ` ${toolName} Annotation UID:${uid} Label:${ - data.label || data.text - } ${annotation.isVisible ? 'visible' : 'not visible'}
+ data.label || data.text + } ${annotation.isVisible ? 'visible' : 'not visible'}
Range: Frames: ${rangeArr.join('-')} Times ${rangeArr - .map((it) => Math.round((it * 10) / fps) / 10) - .join('-')}
+ .map((it) => Math.round((it * 10) / fps) / 10) + .join('-')}
`; } diff --git a/packages/tools/examples/videoTools/index.ts b/packages/tools/examples/videoTools/index.ts index d874705ac8..33d33f7604 100644 --- a/packages/tools/examples/videoTools/index.ts +++ b/packages/tools/examples/videoTools/index.ts @@ -149,8 +149,8 @@ function updateAnnotationDiv(uid) { const { toolName } = metadata; selectionDiv.innerHTML = ` ${toolName} Annotation UID:${uid} Label:${ - data.label || data.text - } ${annotation.isVisible ? 'visible' : 'not visible'} + data.label || data.text + } ${annotation.isVisible ? 'visible' : 'not visible'} `; } diff --git a/packages/tools/examples/webWorker/index.ts b/packages/tools/examples/webWorker/index.ts index bf853a2d5c..485d3bfcab 100644 --- a/packages/tools/examples/webWorker/index.ts +++ b/packages/tools/examples/webWorker/index.ts @@ -79,16 +79,14 @@ workerManager.registerWorker('test-worker', workerFn, options); addButtonToToolbar({ title: 'Run a heavy task off the main thread', onClick: () => { - document.getElementById( - 'sleep-result' - ).innerText = `Running a heavy task off the main thread for 5 seconds...`; + document.getElementById('sleep-result').innerText = + `Running a heavy task off the main thread for 5 seconds...`; workerManager .executeTask('test-worker', 'sleep', { time: 5000 }) .then((result) => { - document.getElementById( - 'sleep-result' - ).innerText = `Heavy task completed!`; + document.getElementById('sleep-result').innerText = + `Heavy task completed!`; }) .catch((error) => { console.error('error', error); @@ -99,16 +97,14 @@ addButtonToToolbar({ addButtonToToolbar({ title: 'Calculate Fibonacci number 43', onClick: () => { - document.getElementById( - 'fib-result' - ).innerText = `Calculating Fibonacci number 43...`; + document.getElementById('fib-result').innerText = + `Calculating Fibonacci number 43...`; workerManager .executeTask('test-worker', 'fib', { value: 43 }) .then((result) => { - document.getElementById( - 'fib-result' - ).innerText = `Fibonacci number 43 is ${result}`; + document.getElementById('fib-result').innerText = + `Fibonacci number 43 is ${result}`; }) .catch((error) => { console.error('error', error); diff --git a/packages/tools/package.json b/packages/tools/package.json index 79e6881384..7f4ac42996 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/core": "^3.32.5", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/packages/tools/src/stateManagement/segmentation/config/styleHelpers.ts b/packages/tools/src/stateManagement/segmentation/config/styleHelpers.ts index e1cffd0b0e..5c359a462b 100644 --- a/packages/tools/src/stateManagement/segmentation/config/styleHelpers.ts +++ b/packages/tools/src/stateManagement/segmentation/config/styleHelpers.ts @@ -24,10 +24,10 @@ type StyleForType = T extends SegmentationRepresentations.Labelmap ? LabelmapStyle : T extends SegmentationRepresentations.Contour - ? ContourStyle - : T extends SegmentationRepresentations.Surface - ? SurfaceStyle - : never; + ? ContourStyle + : T extends SegmentationRepresentations.Surface + ? SurfaceStyle + : never; /** * Get the style for a given segmentation representation. diff --git a/packages/tools/src/tools/VolumeCroppingControlTool.ts b/packages/tools/src/tools/VolumeCroppingControlTool.ts index 379c8818b0..1db0f07e4d 100644 --- a/packages/tools/src/tools/VolumeCroppingControlTool.ts +++ b/packages/tools/src/tools/VolumeCroppingControlTool.ts @@ -64,7 +64,7 @@ type ReferenceLine = [ }, startPoint: Types.Point2, endPoint: Types.Point2, - type: 'min' | 'max' + type: 'min' | 'max', ]; interface VolumeCroppingAnnotation extends Annotation { diff --git a/packages/tools/src/tools/VolumeCroppingTool.ts b/packages/tools/src/tools/VolumeCroppingTool.ts index def665f4c0..f8bda9c21a 100644 --- a/packages/tools/src/tools/VolumeCroppingTool.ts +++ b/packages/tools/src/tools/VolumeCroppingTool.ts @@ -1485,12 +1485,12 @@ class VolumeCroppingTool extends BaseTool { const origin = this.originalClippingPlanes[i].origin as [ number, number, - number + number, ]; const normal = this.originalClippingPlanes[i].normal as [ number, number, - number + number, ]; const plane = vtkPlane.newInstance({ origin, diff --git a/packages/tools/src/tools/annotation/CircleROITool.ts b/packages/tools/src/tools/annotation/CircleROITool.ts index 03642e0232..9aea758180 100644 --- a/packages/tools/src/tools/annotation/CircleROITool.ts +++ b/packages/tools/src/tools/annotation/CircleROITool.ts @@ -201,7 +201,7 @@ class CircleROITool extends AnnotationTool { Types.Point3, Types.Point3, Types.Point3, - Types.Point3 + Types.Point3, ]; } diff --git a/packages/tools/src/tools/annotation/CobbAngleTool.ts b/packages/tools/src/tools/annotation/CobbAngleTool.ts index d13e80be57..449281e59f 100644 --- a/packages/tools/src/tools/annotation/CobbAngleTool.ts +++ b/packages/tools/src/tools/annotation/CobbAngleTool.ts @@ -805,11 +805,11 @@ class CobbAngleTool extends AnnotationTool { const firstLine = [canvasCoordinates[0], canvasCoordinates[1]] as [ Types.Point2, - Types.Point2 + Types.Point2, ]; const secondLine = [canvasCoordinates[2], canvasCoordinates[3]] as [ Types.Point2, - Types.Point2 + Types.Point2, ]; let lineUID = 'line1'; @@ -1036,11 +1036,11 @@ class CobbAngleTool extends AnnotationTool { const firstLine = [canvasPoints[0], canvasPoints[1]] as [ Types.Point2, - Types.Point2 + Types.Point2, ]; const secondLine = [canvasPoints[2], canvasPoints[3]] as [ Types.Point2, - Types.Point2 + Types.Point2, ]; const mid1 = midPoint2(firstLine[0], firstLine[1]); diff --git a/packages/tools/src/tools/annotation/EllipticalROITool.ts b/packages/tools/src/tools/annotation/EllipticalROITool.ts index 40c5fdd049..ed483a0c2b 100644 --- a/packages/tools/src/tools/annotation/EllipticalROITool.ts +++ b/packages/tools/src/tools/annotation/EllipticalROITool.ts @@ -337,7 +337,7 @@ class EllipticalROITool extends AnnotationTool { Types.Point2, Types.Point2, Types.Point2, - Types.Point2 + Types.Point2, ]; const [bottom, top, left, right] = canvasCoordinates; diff --git a/packages/tools/src/tools/annotation/PlanarFreehandROITool.ts b/packages/tools/src/tools/annotation/PlanarFreehandROITool.ts index 33e69bc6f5..72d242fcad 100644 --- a/packages/tools/src/tools/annotation/PlanarFreehandROITool.ts +++ b/packages/tools/src/tools/annotation/PlanarFreehandROITool.ts @@ -997,8 +997,8 @@ class PlanarFreehandROITool extends ContourSegmentationBaseTool { return a[index] === b[index] ? 0 : a[index] < b[index] - ? -1 - : 1; + ? -1 + : 1; }; })(0) ); diff --git a/packages/tools/src/tools/segmentation/CircleROIStartEndThresholdTool.ts b/packages/tools/src/tools/segmentation/CircleROIStartEndThresholdTool.ts index 07741a17e3..23cb8d1bc8 100644 --- a/packages/tools/src/tools/segmentation/CircleROIStartEndThresholdTool.ts +++ b/packages/tools/src/tools/segmentation/CircleROIStartEndThresholdTool.ts @@ -186,7 +186,7 @@ class CircleROIStartEndThresholdTool extends CircleROITool { Types.Point3, Types.Point3, Types.Point3, - Types.Point3 + Types.Point3, ]; } diff --git a/packages/tools/src/tools/segmentation/LabelmapBaseTool.ts b/packages/tools/src/tools/segmentation/LabelmapBaseTool.ts index 3cea0eb307..80c41e27be 100644 --- a/packages/tools/src/tools/segmentation/LabelmapBaseTool.ts +++ b/packages/tools/src/tools/segmentation/LabelmapBaseTool.ts @@ -630,8 +630,8 @@ export default class LabelmapBaseTool extends BaseTool { const segmentIndex = hasBoth ? startValue : startValue === 0 - ? activeIndex - : 0; + ? activeIndex + : 0; for (let i = boundsIJK[0][0]; i <= boundsIJK[0][1]; i++) { for (let j = boundsIJK[1][0]; j <= boundsIJK[1][1]; j++) { for (let k = boundsIJK[2][0]; k <= boundsIJK[2][1]; k++) { diff --git a/packages/tools/src/types/ToolSpecificAnnotationTypes.ts b/packages/tools/src/types/ToolSpecificAnnotationTypes.ts index c1e03f2df1..04f2720f7d 100644 --- a/packages/tools/src/types/ToolSpecificAnnotationTypes.ts +++ b/packages/tools/src/types/ToolSpecificAnnotationTypes.ts @@ -124,7 +124,7 @@ export interface CircleROIAnnotation extends Annotation { Types.Point3, Types.Point3, Types.Point3, - Types.Point3 + Types.Point3, ]; // [center, top, bottom, left, right] activeHandleIndex: number | null; textBox?: { diff --git a/packages/tools/src/utilities/contours/interpolation/interpolate.ts b/packages/tools/src/utilities/contours/interpolation/interpolate.ts index 03c949df9b..2ed98bf701 100644 --- a/packages/tools/src/utilities/contours/interpolation/interpolate.ts +++ b/packages/tools/src/utilities/contours/interpolation/interpolate.ts @@ -611,8 +611,7 @@ function _getNodesPerSegment(perimInterp, perimInd) { arr.push(i); } return arr; - }, - []); + }, []); const nodesPerSegment = []; diff --git a/packages/tools/src/utilities/math/circle/_types.ts b/packages/tools/src/utilities/math/circle/_types.ts index c7a09f0eff..3f4b1603d2 100644 --- a/packages/tools/src/utilities/math/circle/_types.ts +++ b/packages/tools/src/utilities/math/circle/_types.ts @@ -2,5 +2,5 @@ import type { Types } from '@cornerstonejs/core'; export type canvasCoordinates = [ Types.Point2, // center - Types.Point2 // end + Types.Point2, // end ]; diff --git a/packages/tools/src/utilities/math/ellipse/getCanvasEllipseCorners.ts b/packages/tools/src/utilities/math/ellipse/getCanvasEllipseCorners.ts index 059359632d..da3dae3124 100644 --- a/packages/tools/src/utilities/math/ellipse/getCanvasEllipseCorners.ts +++ b/packages/tools/src/utilities/math/ellipse/getCanvasEllipseCorners.ts @@ -4,7 +4,7 @@ export type CanvasCoordinates = [ Types.Point2, // bottom Types.Point2, // top Types.Point2, // left - Types.Point2 // right + Types.Point2, // right ]; /** diff --git a/packages/tools/src/utilities/math/line/intersectLine.ts b/packages/tools/src/utilities/math/line/intersectLine.ts index 2dafd3aa34..53a450057e 100644 --- a/packages/tools/src/utilities/math/line/intersectLine.ts +++ b/packages/tools/src/utilities/math/line/intersectLine.ts @@ -8,8 +8,8 @@ function sign(x: number | string): number { ? -1 : 1 : x === x - ? 0 - : NaN + ? 0 + : NaN : NaN; } diff --git a/tests/utils/reduceViewportsSize.ts b/tests/utils/reduceViewportsSize.ts index 2c13956353..4402ddcf95 100644 --- a/tests/utils/reduceViewportsSize.ts +++ b/tests/utils/reduceViewportsSize.ts @@ -5,12 +5,15 @@ */ export const reduceViewportsSize = async (page) => { - await page.evaluate(({ cornerstone }) => { - const enabledElements = cornerstone.getEnabledElements(); + await page.evaluate( + ({ cornerstone }) => { + const enabledElements = cornerstone.getEnabledElements(); - enabledElements.forEach(({ viewport }) => { - viewport.setZoom(0.4); - viewport.render(); - }); - }, await page.evaluateHandle('window')); + enabledElements.forEach(({ viewport }) => { + viewport.setZoom(0.4); + viewport.render(); + }); + }, + await page.evaluateHandle('window') + ); }; diff --git a/version.json b/version.json index 150cf4920b..a37d2db69b 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.6", + "version": "3.32.5", "commit": "0a4c30613cd770933014f7c89f7145d3fd8be3e4" -} \ No newline at end of file +} diff --git a/version.txt b/version.txt index 72fd668004..458ad38e2f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.6 \ No newline at end of file +3.32.5 diff --git a/yarn.lock b/yarn.lock index 56335383f8..bf09867bf9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15515,10 +15515,10 @@ precond@0.2: resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ== -prettier@2.8.8: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prettier@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" + integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== pretty-error@^4.0.0: version "4.0.0" From 85b5b0cb08e07113343b7801b8dbb1d5d0ac5a6a Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 5 Aug 2025 03:53:50 +0000 Subject: [PATCH 154/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 6 +++--- version.txt | 2 +- 11 files changed, 21 insertions(+), 21 deletions(-) diff --git a/commit.txt b/commit.txt index 3855005cee..bf251b5c40 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -0a4c30613cd770933014f7c89f7145d3fd8be3e4 \ No newline at end of file +52b5feaded9b799b69e7b9c9a8a127cbec44d395 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 3fad4db686..b2015a56f2 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5", - "@cornerstonejs/tools": "^3.32.5" + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 3c7ed5003a..57355ee1ca 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5", - "@cornerstonejs/tools": "^3.32.5" + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index e25d156dca..f4eae98b7a 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/core": "^3.32.6", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 2cf29ba4d3..ab8d7c3fc7 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.5", - "@cornerstonejs/core": "^3.32.5", - "@cornerstonejs/dicom-image-loader": "^3.32.5", - "@cornerstonejs/nifti-volume-loader": "^3.32.5", - "@cornerstonejs/tools": "^3.32.5", + "@cornerstonejs/adapters": "^3.32.6", + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/dicom-image-loader": "^3.32.6", + "@cornerstonejs/nifti-volume-loader": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 0d194ea2c2..863de87969 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5", - "@cornerstonejs/tools": "^3.32.5", + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 3c16970636..edb235fb88 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5" + "@cornerstonejs/core": "^3.32.6" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 91a4ca2684..fd46d6274c 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5", - "@cornerstonejs/tools": "^3.32.5", + "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/tools": "^3.32.6", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 7f4ac42996..79e6881384 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.5", + "@cornerstonejs/core": "^3.32.6", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index a37d2db69b..7fad8035b4 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.5", - "commit": "0a4c30613cd770933014f7c89f7145d3fd8be3e4" -} + "version": "3.32.6", + "commit": "52b5feaded9b799b69e7b9c9a8a127cbec44d395" +} \ No newline at end of file diff --git a/version.txt b/version.txt index 458ad38e2f..72fd668004 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.5 +3.32.6 \ No newline at end of file From c1727cf8a13bd2ee5e9a9b16a3a3f5145481b67e Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 5 Aug 2025 03:54:03 +0000 Subject: [PATCH 155/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 4 ++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 45 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a61b2077ca..95767b50ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) + +**Note:** Version bump only for package root + ## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 58a82f06cd..4f121fd732 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.5", + "version": "3.32.6", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 7b06a6bb75..018bac712c 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index b2015a56f2..fc98121fa3 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.5", + "version": "3.32.6", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 30e1880e70..62df6e2c3a 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 57355ee1ca..9462e5a9b5 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.5", + "version": "3.32.6", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index ba4bf6bd24..3a3ece427a 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 3e8d9a97f4..609cec3e69 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.5", + "version": "3.32.6", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 569e72eb63..9013d5f2cd 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index f4eae98b7a..32b5b0a9cc 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.5", + "version": "3.32.6", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 63e54ee2f9..a625ee59ac 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 863de87969..5a6e6e0060 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.5", + "version": "3.32.6", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index cdca23a228..cb5394fa34 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index edb235fb88..24a28b065c 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.5", + "version": "3.32.6", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index e16633b470..4cf781dd70 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index fd46d6274c..6f70f6a427 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.5", + "version": "3.32.6", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 1a5e23479b..98f280ab53 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.32.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.4...v3.32.5) (2025-07-30) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 79e6881384..39586330da 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.5", + "version": "3.32.6", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From af40281b222938a78ea1db18d9dd1b85a975e99c Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 5 Aug 2025 03:54:12 +0000 Subject: [PATCH 156/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index efe6b2ae49..ae7512f14d 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.5'; +export const version = '3.32.6'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index efe6b2ae49..ae7512f14d 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.5'; +export const version = '3.32.6'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index efe6b2ae49..ae7512f14d 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.5'; +export const version = '3.32.6'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index efe6b2ae49..ae7512f14d 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.5'; +export const version = '3.32.6'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index efe6b2ae49..ae7512f14d 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.5'; +export const version = '3.32.6'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index efe6b2ae49..ae7512f14d 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.5'; +export const version = '3.32.6'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index efe6b2ae49..ae7512f14d 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.5'; +export const version = '3.32.6'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index efe6b2ae49..ae7512f14d 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.5'; +export const version = '3.32.6'; From 8605b39fb09644a0cb24b2f43976ac9f1455417b Mon Sep 17 00:00:00 2001 From: bbagdanovas Date: Tue, 5 Aug 2025 17:19:47 +0300 Subject: [PATCH 157/212] fix: Remove duplicate set cache (#2239) --- packages/core/src/cache/cache.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/core/src/cache/cache.ts b/packages/core/src/cache/cache.ts index d439492193..a9016afc00 100644 --- a/packages/core/src/cache/cache.ts +++ b/packages/core/src/cache/cache.ts @@ -505,8 +505,6 @@ class Cache { sizeInBytes: 0, }; - this._imageCache.set(imageId, cachedImage); - // For some reason we need to put it here after the rework of volumes this._imageCache.set(imageId, cachedImage); From a64230ab8ba623ed41cd7131355f35556b811db6 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 5 Aug 2025 14:23:58 +0000 Subject: [PATCH 158/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index bf251b5c40..8c23fc5b6a 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -52b5feaded9b799b69e7b9c9a8a127cbec44d395 \ No newline at end of file +8605b39fb09644a0cb24b2f43976ac9f1455417b \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index fc98121fa3..60452f5e67 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6" + "@cornerstonejs/core": "^3.32.7", + "@cornerstonejs/tools": "^3.32.7" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 9462e5a9b5..fa6de90a02 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6" + "@cornerstonejs/core": "^3.32.7", + "@cornerstonejs/tools": "^3.32.7" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 32b5b0a9cc..8725fffbd7 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/core": "^3.32.7", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index ab8d7c3fc7..c5d883be28 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.6", - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/dicom-image-loader": "^3.32.6", - "@cornerstonejs/nifti-volume-loader": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6", + "@cornerstonejs/adapters": "^3.32.7", + "@cornerstonejs/core": "^3.32.7", + "@cornerstonejs/dicom-image-loader": "^3.32.7", + "@cornerstonejs/nifti-volume-loader": "^3.32.7", + "@cornerstonejs/tools": "^3.32.7", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 5a6e6e0060..f19cd3b439 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6", + "@cornerstonejs/core": "^3.32.7", + "@cornerstonejs/tools": "^3.32.7", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 24a28b065c..f2e825b3ed 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6" + "@cornerstonejs/core": "^3.32.7" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 6f70f6a427..cd8fd8817b 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", - "@cornerstonejs/tools": "^3.32.6", + "@cornerstonejs/core": "^3.32.7", + "@cornerstonejs/tools": "^3.32.7", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 39586330da..8a886978fe 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.6", + "@cornerstonejs/core": "^3.32.7", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 7fad8035b4..070ee08de0 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.6", - "commit": "52b5feaded9b799b69e7b9c9a8a127cbec44d395" + "version": "3.32.7", + "commit": "8605b39fb09644a0cb24b2f43976ac9f1455417b" } \ No newline at end of file diff --git a/version.txt b/version.txt index 72fd668004..490717c76c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.6 \ No newline at end of file +3.32.7 \ No newline at end of file From 19c7ce49f738ccfdda4d3653dc1449fef5f541cd Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 5 Aug 2025 14:24:12 +0000 Subject: [PATCH 159/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95767b50ea..9b6a04b509 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) + +### Bug Fixes + +- Remove duplicate set cache ([#2239](https://github.com/cornerstonejs/cornerstone3D/issues/2239)) ([8605b39](https://github.com/cornerstonejs/cornerstone3D/commit/8605b39fb09644a0cb24b2f43976ac9f1455417b)) + ## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index 4f121fd732..37983c9143 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.6", + "version": "3.32.7", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 018bac712c..03d27bf7cd 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 60452f5e67..95f7f422a3 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.6", + "version": "3.32.7", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 62df6e2c3a..f87d774ee1 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index fa6de90a02..22d75739ed 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.6", + "version": "3.32.7", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 3a3ece427a..89a87437a5 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) + +### Bug Fixes + +- Remove duplicate set cache ([#2239](https://github.com/cornerstonejs/cornerstone3D/issues/2239)) ([8605b39](https://github.com/cornerstonejs/cornerstone3D/commit/8605b39fb09644a0cb24b2f43976ac9f1455417b)) + ## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 609cec3e69..5e0b131c70 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.6", + "version": "3.32.7", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 9013d5f2cd..1c97f238b5 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 8725fffbd7..2219532cf5 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.6", + "version": "3.32.7", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index a625ee59ac..23b1f1b1f0 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index f19cd3b439..3f6b74eb8c 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.6", + "version": "3.32.7", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index cb5394fa34..0fdb0f4e1e 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index f2e825b3ed..7a491cfd99 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.6", + "version": "3.32.7", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 4cf781dd70..709e7a8a24 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index cd8fd8817b..0625fd6282 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.6", + "version": "3.32.7", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 98f280ab53..1da085b3ec 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.32.6](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.5...v3.32.6) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 8a886978fe..db3c8c142f 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.6", + "version": "3.32.7", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From c44f143cc46481da7b29830d6468e74ae6767fa7 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Tue, 5 Aug 2025 14:24:22 +0000 Subject: [PATCH 160/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index ae7512f14d..4a0def975e 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.6'; +export const version = '3.32.7'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index ae7512f14d..4a0def975e 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.6'; +export const version = '3.32.7'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index ae7512f14d..4a0def975e 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.6'; +export const version = '3.32.7'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index ae7512f14d..4a0def975e 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.6'; +export const version = '3.32.7'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index ae7512f14d..4a0def975e 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.6'; +export const version = '3.32.7'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index ae7512f14d..4a0def975e 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.6'; +export const version = '3.32.7'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index ae7512f14d..4a0def975e 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.6'; +export const version = '3.32.7'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index ae7512f14d..4a0def975e 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.6'; +export const version = '3.32.7'; From 23c4fde2db590d7051c5d66d3dbc5f1625ae196b Mon Sep 17 00:00:00 2001 From: rodrigobasilio2022 <114958722+rodrigobasilio2022@users.noreply.github.com> Date: Wed, 6 Aug 2025 08:32:53 -0300 Subject: [PATCH 161/212] fix floating point issues in getViewReferenceId (#2252) --- packages/core/src/RenderingEngine/BaseVolumeViewport.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts index 2cad61cd32..e1cc064d04 100644 --- a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts +++ b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts @@ -2241,9 +2241,10 @@ abstract class BaseVolumeViewport extends Viewport { sliceIndex ??= currentIndex; const { viewPlaneNormal, focalPoint } = this.getCamera(); const querySeparator = volumeId.includes('?') ? '&' : '?'; - return `volumeId:${volumeId}${querySeparator}sliceIndex=${sliceIndex}&viewPlaneNormal=${viewPlaneNormal.join( - ',' - )}`; + // Format each element of viewPlaneNormal to 3 decimal places + // to avoid floating point precision issues + const formattedNormal = viewPlaneNormal.map((v) => v.toFixed(3)).join(','); + return `volumeId:${volumeId}${querySeparator}sliceIndex=${sliceIndex}&viewPlaneNormal=${formattedNormal}`; } private _addVolumeId(volumeId: string): void { From 0d4c6076159cb4ba7fba9e599cd5017458093c6d Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 6 Aug 2025 11:36:40 +0000 Subject: [PATCH 162/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 8c23fc5b6a..52b7a580bc 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -8605b39fb09644a0cb24b2f43976ac9f1455417b \ No newline at end of file +23c4fde2db590d7051c5d66d3dbc5f1625ae196b \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 95f7f422a3..dbd9b659cb 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.7", - "@cornerstonejs/tools": "^3.32.7" + "@cornerstonejs/core": "^3.32.8", + "@cornerstonejs/tools": "^3.32.8" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 22d75739ed..1ab3b543fb 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.7", - "@cornerstonejs/tools": "^3.32.7" + "@cornerstonejs/core": "^3.32.8", + "@cornerstonejs/tools": "^3.32.8" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 2219532cf5..1eb83e0de7 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.7", + "@cornerstonejs/core": "^3.32.8", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index c5d883be28..88880774e3 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.7", - "@cornerstonejs/core": "^3.32.7", - "@cornerstonejs/dicom-image-loader": "^3.32.7", - "@cornerstonejs/nifti-volume-loader": "^3.32.7", - "@cornerstonejs/tools": "^3.32.7", + "@cornerstonejs/adapters": "^3.32.8", + "@cornerstonejs/core": "^3.32.8", + "@cornerstonejs/dicom-image-loader": "^3.32.8", + "@cornerstonejs/nifti-volume-loader": "^3.32.8", + "@cornerstonejs/tools": "^3.32.8", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 3f6b74eb8c..78384e1166 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.7", - "@cornerstonejs/tools": "^3.32.7", + "@cornerstonejs/core": "^3.32.8", + "@cornerstonejs/tools": "^3.32.8", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 7a491cfd99..5a9be31a2a 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.7" + "@cornerstonejs/core": "^3.32.8" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 0625fd6282..e161d6f9b3 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.7", - "@cornerstonejs/tools": "^3.32.7", + "@cornerstonejs/core": "^3.32.8", + "@cornerstonejs/tools": "^3.32.8", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index db3c8c142f..79acc11ac8 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.7", + "@cornerstonejs/core": "^3.32.8", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 070ee08de0..6566014e36 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.7", - "commit": "8605b39fb09644a0cb24b2f43976ac9f1455417b" + "version": "3.32.8", + "commit": "23c4fde2db590d7051c5d66d3dbc5f1625ae196b" } \ No newline at end of file diff --git a/version.txt b/version.txt index 490717c76c..4fe56a23e6 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.7 \ No newline at end of file +3.32.8 \ No newline at end of file From 2284265b95ea70e24eca53e2cdc703c6e3920165 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 6 Aug 2025 11:36:55 +0000 Subject: [PATCH 163/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 4 ++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 45 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b6a04b509..dce3f9f4e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) + +**Note:** Version bump only for package root + ## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 37983c9143..558f3d3726 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.7", + "version": "3.32.8", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 03d27bf7cd..312b7bd86d 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index dbd9b659cb..7a0f4c503a 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.7", + "version": "3.32.8", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index f87d774ee1..09c61b91d0 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 1ab3b543fb..6c777e82a4 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.7", + "version": "3.32.8", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 89a87437a5..ff9228ae7d 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 5e0b131c70..3e229335cf 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.7", + "version": "3.32.8", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 1c97f238b5..e91b4ea758 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 1eb83e0de7..deca6a49aa 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.7", + "version": "3.32.8", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 23b1f1b1f0..94f66d1c9f 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 78384e1166..717da195f7 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.7", + "version": "3.32.8", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 0fdb0f4e1e..4d43e4705f 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 5a9be31a2a..fa27a34a37 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.7", + "version": "3.32.8", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 709e7a8a24..8c8e573963 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index e161d6f9b3..9d23df3cd3 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.7", + "version": "3.32.8", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 1da085b3ec..7450b101b3 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.32.7](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.6...v3.32.7) (2025-08-05) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 79acc11ac8..b41d2b73c2 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.7", + "version": "3.32.8", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From b5a354e7bc36ceb7519728585a46a3074340def5 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 6 Aug 2025 11:37:05 +0000 Subject: [PATCH 164/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 4a0def975e..891dfebcc4 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.7'; +export const version = '3.32.8'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 4a0def975e..891dfebcc4 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.7'; +export const version = '3.32.8'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 4a0def975e..891dfebcc4 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.7'; +export const version = '3.32.8'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 4a0def975e..891dfebcc4 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.7'; +export const version = '3.32.8'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 4a0def975e..891dfebcc4 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.7'; +export const version = '3.32.8'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 4a0def975e..891dfebcc4 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.7'; +export const version = '3.32.8'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 4a0def975e..891dfebcc4 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.7'; +export const version = '3.32.8'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 4a0def975e..891dfebcc4 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.7'; +export const version = '3.32.8'; From d23ef9b77f50a313d0311bce499a8f3d2c678411 Mon Sep 17 00:00:00 2001 From: Salim Kanoun Date: Mon, 11 Aug 2025 15:55:10 +0200 Subject: [PATCH 165/212] fix: getBrushToolInstances always return array (#2258) --- .../tools/src/utilities/segmentation/getBrushToolInstances.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tools/src/utilities/segmentation/getBrushToolInstances.ts b/packages/tools/src/utilities/segmentation/getBrushToolInstances.ts index d68919a893..2a70e95d42 100644 --- a/packages/tools/src/utilities/segmentation/getBrushToolInstances.ts +++ b/packages/tools/src/utilities/segmentation/getBrushToolInstances.ts @@ -5,13 +5,13 @@ export function getBrushToolInstances(toolGroupId: string, toolName?: string) { const toolGroup = getToolGroup(toolGroupId); if (toolGroup === undefined) { - return; + return []; } const toolInstances = toolGroup._toolInstances; if (!Object.keys(toolInstances).length) { - return; + return []; } if (toolName && toolInstances[toolName]) { From 89e9b9e70a49875f3dda51a18df3c3e9eec7f10d Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 11 Aug 2025 13:58:43 +0000 Subject: [PATCH 166/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 52b7a580bc..850007631f 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -23c4fde2db590d7051c5d66d3dbc5f1625ae196b \ No newline at end of file +d23ef9b77f50a313d0311bce499a8f3d2c678411 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 7a0f4c503a..263165c32a 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.8", - "@cornerstonejs/tools": "^3.32.8" + "@cornerstonejs/core": "^3.32.9", + "@cornerstonejs/tools": "^3.32.9" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 6c777e82a4..7b5dca7050 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.8", - "@cornerstonejs/tools": "^3.32.8" + "@cornerstonejs/core": "^3.32.9", + "@cornerstonejs/tools": "^3.32.9" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index deca6a49aa..49d0ed9ade 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.8", + "@cornerstonejs/core": "^3.32.9", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 88880774e3..40f551cc3d 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.8", - "@cornerstonejs/core": "^3.32.8", - "@cornerstonejs/dicom-image-loader": "^3.32.8", - "@cornerstonejs/nifti-volume-loader": "^3.32.8", - "@cornerstonejs/tools": "^3.32.8", + "@cornerstonejs/adapters": "^3.32.9", + "@cornerstonejs/core": "^3.32.9", + "@cornerstonejs/dicom-image-loader": "^3.32.9", + "@cornerstonejs/nifti-volume-loader": "^3.32.9", + "@cornerstonejs/tools": "^3.32.9", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 717da195f7..aebfda1ef7 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.8", - "@cornerstonejs/tools": "^3.32.8", + "@cornerstonejs/core": "^3.32.9", + "@cornerstonejs/tools": "^3.32.9", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index fa27a34a37..7e85f1e066 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.8" + "@cornerstonejs/core": "^3.32.9" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 9d23df3cd3..17077a6e8b 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.8", - "@cornerstonejs/tools": "^3.32.8", + "@cornerstonejs/core": "^3.32.9", + "@cornerstonejs/tools": "^3.32.9", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index b41d2b73c2..82a41120af 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.8", + "@cornerstonejs/core": "^3.32.9", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 6566014e36..f4b2c8e4f4 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.8", - "commit": "23c4fde2db590d7051c5d66d3dbc5f1625ae196b" + "version": "3.32.9", + "commit": "d23ef9b77f50a313d0311bce499a8f3d2c678411" } \ No newline at end of file diff --git a/version.txt b/version.txt index 4fe56a23e6..8b1ac98d56 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.8 \ No newline at end of file +3.32.9 \ No newline at end of file From a9d3353ec9b2a25dd59e8bace689ac20ebba5d9b Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 11 Aug 2025 13:58:55 +0000 Subject: [PATCH 167/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dce3f9f4e7..ef06cfb1a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) + +### Bug Fixes + +- getBrushToolInstances always return array ([#2258](https://github.com/cornerstonejs/cornerstone3D/issues/2258)) ([d23ef9b](https://github.com/cornerstonejs/cornerstone3D/commit/d23ef9b77f50a313d0311bce499a8f3d2c678411)) + ## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index 558f3d3726..584260fe42 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.8", + "version": "3.32.9", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 312b7bd86d..ceb4a5157e 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 263165c32a..14fb5c721f 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.8", + "version": "3.32.9", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 09c61b91d0..1d25660b6e 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 7b5dca7050..6ad9cd8133 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.8", + "version": "3.32.9", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index ff9228ae7d..6a57a1c05f 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 3e229335cf..2a4cbecf8a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.8", + "version": "3.32.9", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index e91b4ea758..432446059a 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 49d0ed9ade..d65423ad00 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.8", + "version": "3.32.9", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 94f66d1c9f..ad4e02a1dc 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index aebfda1ef7..69ffc809e3 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.8", + "version": "3.32.9", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 4d43e4705f..dc26faea15 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 7e85f1e066..b777f5cb15 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.8", + "version": "3.32.9", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 8c8e573963..4284b96349 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 17077a6e8b..0142270a52 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.8", + "version": "3.32.9", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 7450b101b3..8b8f8f52e8 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) + +### Bug Fixes + +- getBrushToolInstances always return array ([#2258](https://github.com/cornerstonejs/cornerstone3D/issues/2258)) ([d23ef9b](https://github.com/cornerstonejs/cornerstone3D/commit/d23ef9b77f50a313d0311bce499a8f3d2c678411)) + ## [3.32.8](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.7...v3.32.8) (2025-08-06) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 82a41120af..1b84b174ea 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.8", + "version": "3.32.9", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 670a27bd425cc0866a931ce62c9f26f6e6b1fabb Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 11 Aug 2025 13:59:03 +0000 Subject: [PATCH 168/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 891dfebcc4..0c95cd96c8 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.8'; +export const version = '3.32.9'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 891dfebcc4..0c95cd96c8 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.8'; +export const version = '3.32.9'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 891dfebcc4..0c95cd96c8 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.8'; +export const version = '3.32.9'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 891dfebcc4..0c95cd96c8 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.8'; +export const version = '3.32.9'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 891dfebcc4..0c95cd96c8 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.8'; +export const version = '3.32.9'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 891dfebcc4..0c95cd96c8 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.8'; +export const version = '3.32.9'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 891dfebcc4..0c95cd96c8 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.8'; +export const version = '3.32.9'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 891dfebcc4..0c95cd96c8 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.8'; +export const version = '3.32.9'; From 9ea91402a277b50cc233382b8d1f09b5725f43ab Mon Sep 17 00:00:00 2001 From: Devu-trenser <91659097+Devu-trenser@users.noreply.github.com> Date: Mon, 11 Aug 2025 19:55:01 +0530 Subject: [PATCH 169/212] fix(annotation): toggle visibility off (#2262) --- .../src/stateManagement/annotation/annotationVisibility.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/tools/src/stateManagement/annotation/annotationVisibility.ts b/packages/tools/src/stateManagement/annotation/annotationVisibility.ts index 7bb17eb317..3d0bb4c4f8 100644 --- a/packages/tools/src/stateManagement/annotation/annotationVisibility.ts +++ b/packages/tools/src/stateManagement/annotation/annotationVisibility.ts @@ -98,6 +98,8 @@ function hide( deselectAnnotation(annotationUID); } detail.lastHidden.push(annotationUID); + const annotation = getAnnotation(annotationUID); + annotation.isVisible = false; } } From 501d6de14e0c1d57eaa1f8d39a612fd593564cfa Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 11 Aug 2025 14:28:57 +0000 Subject: [PATCH 170/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 850007631f..c761c299a9 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -d23ef9b77f50a313d0311bce499a8f3d2c678411 \ No newline at end of file +9ea91402a277b50cc233382b8d1f09b5725f43ab \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 14fb5c721f..ab47172108 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.9", - "@cornerstonejs/tools": "^3.32.9" + "@cornerstonejs/core": "^3.32.10", + "@cornerstonejs/tools": "^3.32.10" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 6ad9cd8133..19fb2aaa51 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.9", - "@cornerstonejs/tools": "^3.32.9" + "@cornerstonejs/core": "^3.32.10", + "@cornerstonejs/tools": "^3.32.10" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index d65423ad00..bda4c66e4f 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.9", + "@cornerstonejs/core": "^3.32.10", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 40f551cc3d..a1a038e9fd 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.9", - "@cornerstonejs/core": "^3.32.9", - "@cornerstonejs/dicom-image-loader": "^3.32.9", - "@cornerstonejs/nifti-volume-loader": "^3.32.9", - "@cornerstonejs/tools": "^3.32.9", + "@cornerstonejs/adapters": "^3.32.10", + "@cornerstonejs/core": "^3.32.10", + "@cornerstonejs/dicom-image-loader": "^3.32.10", + "@cornerstonejs/nifti-volume-loader": "^3.32.10", + "@cornerstonejs/tools": "^3.32.10", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 69ffc809e3..4636840e32 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.9", - "@cornerstonejs/tools": "^3.32.9", + "@cornerstonejs/core": "^3.32.10", + "@cornerstonejs/tools": "^3.32.10", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index b777f5cb15..06449813b3 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.9" + "@cornerstonejs/core": "^3.32.10" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 0142270a52..8b14bbcf15 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.9", - "@cornerstonejs/tools": "^3.32.9", + "@cornerstonejs/core": "^3.32.10", + "@cornerstonejs/tools": "^3.32.10", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 1b84b174ea..b7e11f3bf0 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.9", + "@cornerstonejs/core": "^3.32.10", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index f4b2c8e4f4..c9d454e09e 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.9", - "commit": "d23ef9b77f50a313d0311bce499a8f3d2c678411" + "version": "3.32.10", + "commit": "9ea91402a277b50cc233382b8d1f09b5725f43ab" } \ No newline at end of file diff --git a/version.txt b/version.txt index 8b1ac98d56..07bf200ade 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.9 \ No newline at end of file +3.32.10 \ No newline at end of file From 2840296f5a0fdf4a0abae0e44fef7ea77cd9d749 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 11 Aug 2025 14:29:09 +0000 Subject: [PATCH 171/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef06cfb1a2..49bc132e58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) + +### Bug Fixes + +- **annotation:** toggle visibility off ([#2262](https://github.com/cornerstonejs/cornerstone3D/issues/2262)) ([9ea9140](https://github.com/cornerstonejs/cornerstone3D/commit/9ea91402a277b50cc233382b8d1f09b5725f43ab)) + ## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 584260fe42..45f068f2ed 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.9", + "version": "3.32.10", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index ceb4a5157e..cb33d7abe4 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index ab47172108..8fbec22db0 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.9", + "version": "3.32.10", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 1d25660b6e..238a77af84 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 19fb2aaa51..4741a32881 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.9", + "version": "3.32.10", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 6a57a1c05f..173618f117 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 2a4cbecf8a..9ea5653ec2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.9", + "version": "3.32.10", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 432446059a..b210f243e7 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index bda4c66e4f..8eea08e654 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.9", + "version": "3.32.10", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index ad4e02a1dc..a6df6ce2cb 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 4636840e32..e8476be2e0 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.9", + "version": "3.32.10", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index dc26faea15..ac7a6f6ee4 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 06449813b3..9032384dba 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.9", + "version": "3.32.10", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 4284b96349..06d3d0629d 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 8b14bbcf15..2b1441d637 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.9", + "version": "3.32.10", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 8b8f8f52e8..3020921cde 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) + +### Bug Fixes + +- **annotation:** toggle visibility off ([#2262](https://github.com/cornerstonejs/cornerstone3D/issues/2262)) ([9ea9140](https://github.com/cornerstonejs/cornerstone3D/commit/9ea91402a277b50cc233382b8d1f09b5725f43ab)) + ## [3.32.9](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.8...v3.32.9) (2025-08-11) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index b7e11f3bf0..518025b9e8 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.9", + "version": "3.32.10", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 643819927064304e4d9d8a8e8fdb8cffbd59bec2 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 11 Aug 2025 14:29:17 +0000 Subject: [PATCH 172/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 0c95cd96c8..f9c7192329 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.9'; +export const version = '3.32.10'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 0c95cd96c8..f9c7192329 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.9'; +export const version = '3.32.10'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 0c95cd96c8..f9c7192329 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.9'; +export const version = '3.32.10'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 0c95cd96c8..f9c7192329 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.9'; +export const version = '3.32.10'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 0c95cd96c8..f9c7192329 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.9'; +export const version = '3.32.10'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 0c95cd96c8..f9c7192329 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.9'; +export const version = '3.32.10'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 0c95cd96c8..f9c7192329 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.9'; +export const version = '3.32.10'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 0c95cd96c8..f9c7192329 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.9'; +export const version = '3.32.10'; From 17047e65b5237675a7daeb9d7754203126fdb89d Mon Sep 17 00:00:00 2001 From: Jason Hostetter Date: Mon, 18 Aug 2025 10:13:58 -0400 Subject: [PATCH 173/212] fix: partial image quality misreporting when not Multipart (#2269) When issuing a range request, if the response is not multipart, the `extractMultipart` function will return without the `extractDone` parameter defined. Then `getImageQualityStatus` will use the (inaccurate) default "true" value for the second parameter, since `doneAllBytes` is false and the ternary then uses `undefined` from `extract.extractDone`. --- .../dicomImageLoader/src/imageLoader/internal/rangeRequest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dicomImageLoader/src/imageLoader/internal/rangeRequest.ts b/packages/dicomImageLoader/src/imageLoader/internal/rangeRequest.ts index b4800bd8e1..48f9e89d9d 100644 --- a/packages/dicomImageLoader/src/imageLoader/internal/rangeRequest.ts +++ b/packages/dicomImageLoader/src/imageLoader/internal/rangeRequest.ts @@ -104,7 +104,7 @@ export default function rangeRequest( // Allow over-writing the done status to indicate complete on partial const imageQualityStatus = getImageQualityStatus( retrieveOptions, - doneAllBytes || extract.extractDone + doneAllBytes || extract.extractDone === true ); resolve({ ...extract, From a76c8b115a68fbfc0a7f10d23c06f8161b58e6eb Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 18 Aug 2025 14:17:54 +0000 Subject: [PATCH 174/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index c761c299a9..6e6ab51791 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -9ea91402a277b50cc233382b8d1f09b5725f43ab \ No newline at end of file +17047e65b5237675a7daeb9d7754203126fdb89d \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 8fbec22db0..739074d4af 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.10", - "@cornerstonejs/tools": "^3.32.10" + "@cornerstonejs/core": "^3.32.11", + "@cornerstonejs/tools": "^3.32.11" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 4741a32881..c21ffbbf44 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.10", - "@cornerstonejs/tools": "^3.32.10" + "@cornerstonejs/core": "^3.32.11", + "@cornerstonejs/tools": "^3.32.11" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 8eea08e654..5bdc07e6da 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.10", + "@cornerstonejs/core": "^3.32.11", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index a1a038e9fd..894ba3ffd5 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.10", - "@cornerstonejs/core": "^3.32.10", - "@cornerstonejs/dicom-image-loader": "^3.32.10", - "@cornerstonejs/nifti-volume-loader": "^3.32.10", - "@cornerstonejs/tools": "^3.32.10", + "@cornerstonejs/adapters": "^3.32.11", + "@cornerstonejs/core": "^3.32.11", + "@cornerstonejs/dicom-image-loader": "^3.32.11", + "@cornerstonejs/nifti-volume-loader": "^3.32.11", + "@cornerstonejs/tools": "^3.32.11", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index e8476be2e0..68ab00b4b6 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.10", - "@cornerstonejs/tools": "^3.32.10", + "@cornerstonejs/core": "^3.32.11", + "@cornerstonejs/tools": "^3.32.11", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 9032384dba..b8b6bddb9a 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.10" + "@cornerstonejs/core": "^3.32.11" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 2b1441d637..c7aeeb8290 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.10", - "@cornerstonejs/tools": "^3.32.10", + "@cornerstonejs/core": "^3.32.11", + "@cornerstonejs/tools": "^3.32.11", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 518025b9e8..284d7224ff 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.10", + "@cornerstonejs/core": "^3.32.11", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index c9d454e09e..9be43cc076 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.10", - "commit": "9ea91402a277b50cc233382b8d1f09b5725f43ab" + "version": "3.32.11", + "commit": "17047e65b5237675a7daeb9d7754203126fdb89d" } \ No newline at end of file diff --git a/version.txt b/version.txt index 07bf200ade..bba9e4fff3 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.10 \ No newline at end of file +3.32.11 \ No newline at end of file From 90c168f45d1e8bfc3c823e0282245a18c0f2fe2d Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 18 Aug 2025 14:18:09 +0000 Subject: [PATCH 175/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 6 ++++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49bc132e58..1f145126e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) + +### Bug Fixes + +- partial image quality misreporting when not Multipart ([#2269](https://github.com/cornerstonejs/cornerstone3D/issues/2269)) ([17047e6](https://github.com/cornerstonejs/cornerstone3D/commit/17047e65b5237675a7daeb9d7754203126fdb89d)) + ## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 45f068f2ed..659f00b2fc 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.10", + "version": "3.32.11", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index cb33d7abe4..f2cdf7c4cc 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 739074d4af..5e4448d5c9 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.10", + "version": "3.32.11", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 238a77af84..440a30570b 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index c21ffbbf44..03a3bc6181 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.10", + "version": "3.32.11", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 173618f117..dbdc3d3dd5 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 9ea5653ec2..9837c99b7c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.10", + "version": "3.32.11", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index b210f243e7..0029bf2ae6 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) + +### Bug Fixes + +- partial image quality misreporting when not Multipart ([#2269](https://github.com/cornerstonejs/cornerstone3D/issues/2269)) ([17047e6](https://github.com/cornerstonejs/cornerstone3D/commit/17047e65b5237675a7daeb9d7754203126fdb89d)) + ## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 5bdc07e6da..07a2d8c123 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.10", + "version": "3.32.11", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index a6df6ce2cb..c7b4caedff 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 68ab00b4b6..72652b6369 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.10", + "version": "3.32.11", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index ac7a6f6ee4..ce5ae705f6 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index b8b6bddb9a..0dd29e422c 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.10", + "version": "3.32.11", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 06d3d0629d..05d0141fb9 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index c7aeeb8290..e9b7fd3eda 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.10", + "version": "3.32.11", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 3020921cde..ad6132c756 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.32.10](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.9...v3.32.10) (2025-08-11) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 284d7224ff..e2f599f670 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.10", + "version": "3.32.11", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 97703adfdd2ee0be2db34e007f141c2d9981a3e1 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 18 Aug 2025 14:18:19 +0000 Subject: [PATCH 176/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index f9c7192329..7fcdd6d5d0 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.10'; +export const version = '3.32.11'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index f9c7192329..7fcdd6d5d0 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.10'; +export const version = '3.32.11'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index f9c7192329..7fcdd6d5d0 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.10'; +export const version = '3.32.11'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index f9c7192329..7fcdd6d5d0 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.10'; +export const version = '3.32.11'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index f9c7192329..7fcdd6d5d0 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.10'; +export const version = '3.32.11'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index f9c7192329..7fcdd6d5d0 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.10'; +export const version = '3.32.11'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index f9c7192329..7fcdd6d5d0 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.10'; +export const version = '3.32.11'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index f9c7192329..7fcdd6d5d0 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.10'; +export const version = '3.32.11'; From 0088cbcfa910af62937dae0e554603d4c008710e Mon Sep 17 00:00:00 2001 From: Bill Wallace Date: Mon, 18 Aug 2025 12:04:31 -0400 Subject: [PATCH 177/212] fix: Load microscopy viewer using updated paths (#2226) --- .../dicom-microscopy-viewer/package.json | 2 +- bun.lock | 78 ++++++++----------- package.json | 9 ++- packages/core/examples/wsi/index.ts | 8 +- .../core/src/RenderingEngine/WSIViewport.ts | 12 +-- packages/docs/package.json | 2 +- .../tools/examples/volumeProgressive/index.ts | 2 +- .../examples/wsiAnnotationTools/index.ts | 7 +- utils/ExampleRunner/template-config.js | 2 +- .../template-multiexample-config.js | 2 +- utils/demo/helpers/initDemo.ts | 4 + 11 files changed, 60 insertions(+), 68 deletions(-) diff --git a/addOns/externals/dicom-microscopy-viewer/package.json b/addOns/externals/dicom-microscopy-viewer/package.json index acd9175e76..c8318274e8 100644 --- a/addOns/externals/dicom-microscopy-viewer/package.json +++ b/addOns/externals/dicom-microscopy-viewer/package.json @@ -9,7 +9,7 @@ "yarn": ">=1.19.1" }, "dependencies": { - "dicom-microscopy-viewer": "^0.46.1" + "dicom-microscopy-viewer": "^0.48.6" }, "scripts": { "build": "echo addOns externals dependency" diff --git a/bun.lock b/bun.lock index 9351814f6d..4826530132 100644 --- a/bun.lock +++ b/bun.lock @@ -3,6 +3,9 @@ "workspaces": { "": { "name": "root", + "dependencies": { + "caniuse-lite": "^1.0.30001734", + }, "devDependencies": { "@babel/core": "^7.21.8", "@babel/plugin-external-helpers": "^7.18.6", @@ -54,6 +57,7 @@ "cross-env": "^7.0.3", "css-loader": "^6.7.3", "cssnano": "^6.0.1", + "dicomweb-client": "^0.11.2", "docdash": "^1.2.0", "dpdm": "^3.14.0", "execa": "^7.2.0", @@ -122,12 +126,12 @@ "name": "@externals/dicom-microscopy-viewer", "version": "2.1.10", "dependencies": { - "dicom-microscopy-viewer": "^0.46.1", + "dicom-microscopy-viewer": "^0.48.6", }, }, "packages/adapters": { "name": "@cornerstonejs/adapters", - "version": "3.32.5", + "version": "3.32.9", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -142,7 +146,7 @@ }, "packages/ai": { "name": "@cornerstonejs/ai", - "version": "3.32.5", + "version": "3.32.9", "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", @@ -160,7 +164,7 @@ }, "packages/core": { "name": "@cornerstonejs/core", - "version": "3.32.5", + "version": "3.32.9", "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", @@ -170,7 +174,7 @@ }, "packages/dicomImageLoader": { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.5", + "version": "3.32.9", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", @@ -189,7 +193,7 @@ }, "packages/labelmap-interpolation": { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.5", + "version": "3.32.9", "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165", @@ -202,7 +206,7 @@ }, "packages/nifti-volume-loader": { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.5", + "version": "3.32.9", "dependencies": { "nifti-reader-js": "^0.6.8", }, @@ -212,7 +216,7 @@ }, "packages/polymorphic-segmentation": { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.5", + "version": "3.32.9", "dependencies": { "@icr/polyseg-wasm": "0.4.0", }, @@ -224,7 +228,7 @@ }, "packages/tools": { "name": "@cornerstonejs/tools", - "version": "3.32.5", + "version": "3.32.9", "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -756,16 +760,8 @@ "@lukeed/ms": ["@lukeed/ms@2.0.2", "", {}, "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA=="], - "@mapbox/jsonlint-lines-primitives": ["@mapbox/jsonlint-lines-primitives@2.0.2", "", {}, "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ=="], - - "@mapbox/mapbox-gl-style-spec": ["@mapbox/mapbox-gl-style-spec@13.28.0", "", { "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/point-geometry": "^0.1.0", "@mapbox/unitbezier": "^0.0.0", "csscolorparser": "~1.0.2", "json-stringify-pretty-compact": "^2.0.0", "minimist": "^1.2.6", "rw": "^1.3.3", "sort-object": "^0.3.2" }, "bin": { "gl-style-format": "bin/gl-style-format.js", "gl-style-migrate": "bin/gl-style-migrate.js", "gl-style-validate": "bin/gl-style-validate.js", "gl-style-composite": "bin/gl-style-composite.js" } }, "sha512-B8xM7Fp1nh5kejfIl4SWeY0gtIeewbuRencqO3cJDrCHZpaPg7uY+V8abuR+esMeuOjRl5cLhVTP40v+1ywxbg=="], - "@mapbox/node-pre-gyp": ["@mapbox/node-pre-gyp@1.0.11", "", { "dependencies": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", "node-fetch": "^2.6.7", "nopt": "^5.0.0", "npmlog": "^5.0.1", "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.11" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ=="], - "@mapbox/point-geometry": ["@mapbox/point-geometry@0.1.0", "", {}, "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ=="], - - "@mapbox/unitbezier": ["@mapbox/unitbezier@0.0.0", "", {}, "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA=="], - "@microsoft/api-extractor": ["@microsoft/api-extractor@7.49.2", "", { "dependencies": { "@microsoft/api-extractor-model": "7.30.3", "@microsoft/tsdoc": "~0.15.1", "@microsoft/tsdoc-config": "~0.17.1", "@rushstack/node-core-library": "5.11.0", "@rushstack/rig-package": "0.5.3", "@rushstack/terminal": "0.14.6", "@rushstack/ts-command-line": "4.23.4", "lodash": "~4.17.15", "minimatch": "~3.0.3", "resolve": "~1.22.1", "semver": "~7.5.4", "source-map": "~0.6.1", "typescript": "5.7.2" }, "bin": { "api-extractor": "bin/api-extractor" } }, "sha512-DI/WnvhbkHcucxxc4ys00ejCiViFls5EKPrEfe4NV3GGpVkoM5ZXF61HZNSGA8IG0oEV4KfTqIa59Rc3wdMopw=="], "@microsoft/api-extractor-model": ["@microsoft/api-extractor-model@7.30.3", "", { "dependencies": { "@microsoft/tsdoc": "~0.15.1", "@microsoft/tsdoc-config": "~0.17.1", "@rushstack/node-core-library": "5.11.0" } }, "sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w=="], @@ -1280,6 +1276,8 @@ "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], + "@types/rbush": ["@types/rbush@4.0.0", "", {}, "sha512-+N+2H39P8X+Hy1I5mC6awlTX54k3FhiUmvt7HWzGJZvF+syUAAxP/stwppS8JE84YHqFgRMv6fCy31202CMFxQ=="], + "@types/react": ["@types/react@17.0.83", "", { "dependencies": { "@types/prop-types": "*", "@types/scheduler": "^0.16", "csstype": "^3.0.2" } }, "sha512-l0m4ArKJvmFtR4e8UmKrj1pB4tUgOhJITf+mADyF/p69Ts1YAR/E+G9XEM0mHXKVRa1dQNHseyyDNzeuAXfXQw=="], "@types/react-dom": ["@types/react-dom@17.0.26", "", { "peerDependencies": { "@types/react": "^17.0.0" } }, "sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg=="], @@ -1660,7 +1658,7 @@ "caniuse-api": ["caniuse-api@3.0.0", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="], - "caniuse-lite": ["caniuse-lite@1.0.30001705", "", {}, "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg=="], + "caniuse-lite": ["caniuse-lite@1.0.30001734", "", {}, "sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A=="], "canvas": ["canvas@3.1.0", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.1" } }, "sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg=="], @@ -1892,8 +1890,6 @@ "css-what": ["css-what@6.1.0", "", {}, "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="], - "csscolorparser": ["csscolorparser@1.0.3", "", {}, "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w=="], - "cssdb": ["cssdb@7.11.2", "", {}, "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A=="], "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], @@ -2048,13 +2044,13 @@ "di": ["di@0.0.1", "", {}, "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA=="], - "dicom-microscopy-viewer": ["dicom-microscopy-viewer@0.46.1", "", { "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", "colormap": "^2.3", "dcmjs": "^0.29.8", "dicomicc": "^0.1", "dicomweb-client": "^0.8.4", "image-type": "^4.1", "mathjs": "^11.2", "ol": "^7.1", "uuid": "^9.0" } }, "sha512-QLozX/iM6ZA0TxheHQnTNiLg+RbSVlxYKMNG9qdqV5oNbEDOf+z4/8mDqnAQ8wjlQXE2MbUDX8JRa0LmO9mDTg=="], + "dicom-microscopy-viewer": ["dicom-microscopy-viewer@0.48.6", "", { "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.4", "@cornerstonejs/codec-openjph": "^2.4.5", "colormap": "^2.3", "dcmjs": "^0.41.0", "dicomicc": "^0.1", "dicomweb-client": "^0.10.3", "image-type": "^4.1", "mathjs": "^11.2", "ol": "^10.4.0", "uuid": "^9.0" } }, "sha512-cTQ14qE3zqzlH0QOIhxbrIOsLVNCV6/i9qDrIiOnmD3I1R2W6cwRN4iMgQ0c6zas/9+o645Tu37FA6BqQ3fIlg=="], "dicom-parser": ["dicom-parser@1.8.21", "", {}, "sha512-lYCweHQDsC8UFpXErPlg86Px2A8bay0HiUY+wzoG3xv5GzgqVHU3lziwSc/Gzn7VV7y2KeP072SzCviuOoU02w=="], "dicomicc": ["dicomicc@0.1.0", "", {}, "sha512-kZejPGjLQ9NsgovSyVsiAuCpq6LofNR9Erc8Tt/vQAYGYCoQnTyWDlg5D0TJJQATKul7cSr9k/q0TF8G9qdDkQ=="], - "dicomweb-client": ["dicomweb-client@0.8.4", "", {}, "sha512-/6oY3/Fg9JyAlbTWuJOYbVqici3+nlZt43+Z/Y47RNiqLc028JcxNlY28u4VQqksxfB59f1hhNbsqsHyDT4vhw=="], + "dicomweb-client": ["dicomweb-client@0.11.2", "", {}, "sha512-HsjQtmw4XY35ZyrhW5WY7P5ZgGIrY1M1jfLeq2IKANDIqfWoE4QW496VcsbuX4qnTNoeHBauei73vU0WwMYrYg=="], "diff": ["diff@5.2.0", "", {}, "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="], @@ -2096,7 +2092,7 @@ "duplexer2": ["duplexer2@0.1.4", "", { "dependencies": { "readable-stream": "^2.0.2" } }, "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA=="], - "earcut": ["earcut@2.2.4", "", {}, "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="], + "earcut": ["earcut@3.0.2", "", {}, "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ=="], "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], @@ -2840,8 +2836,6 @@ "json-stringify-nice": ["json-stringify-nice@1.1.4", "", {}, "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw=="], - "json-stringify-pretty-compact": ["json-stringify-pretty-compact@2.0.0", "", {}, "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ=="], - "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], @@ -3002,8 +2996,6 @@ "loglevel": ["loglevel@1.9.2", "", {}, "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg=="], - "loglevelnext": ["loglevelnext@3.0.1", "", {}, "sha512-JpjaJhIN1reaSb26SIxDGtE0uc67gPl19OMVHrr+Ggt6b/Vy60jmCtKgQBrygAH0bhRA2nkxgDvM+8QvR8r0YA=="], - "long": ["long@5.3.1", "", {}, "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng=="], "loupe": ["loupe@3.1.3", "", {}, "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug=="], @@ -3030,8 +3022,6 @@ "map-obj": ["map-obj@5.0.2", "", {}, "sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A=="], - "mapbox-to-css-font": ["mapbox-to-css-font@2.4.5", "", {}, "sha512-VJ6nB8emkO9VODI0Fk+TQ/0zKBTqmf/Pkt8Xv0kHstoc0iXRajA00DAid4Kc3K5xeFIOoiZrVxijEzj0GLVO2w=="], - "markdown-it": ["markdown-it@12.3.2", "", { "dependencies": { "argparse": "^2.0.1", "entities": "~2.1.0", "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "bin": { "markdown-it": "bin/markdown-it.js" } }, "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg=="], "markdown-it-anchor": ["markdown-it-anchor@8.6.7", "", { "peerDependencies": { "@types/markdown-it": "*", "markdown-it": "*" } }, "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA=="], @@ -3276,9 +3266,7 @@ "ofetch": ["ofetch@1.4.1", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", "ufo": "^1.5.4" } }, "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw=="], - "ol": ["ol@7.5.2", "", { "dependencies": { "earcut": "^2.2.3", "geotiff": "^2.0.7", "ol-mapbox-style": "^10.1.0", "pbf": "3.2.1", "rbush": "^3.0.1" } }, "sha512-HJbb3CxXrksM6ct367LsP3N+uh+iBBMdP3DeGGipdV9YAYTP0vTJzqGnoqQ6C2IW4qf8krw9yuyQbc9fjOIaOQ=="], - - "ol-mapbox-style": ["ol-mapbox-style@10.7.0", "", { "dependencies": { "@mapbox/mapbox-gl-style-spec": "^13.23.1", "mapbox-to-css-font": "^2.4.1", "ol": "^7.3.0" } }, "sha512-S/UdYBuOjrotcR95Iq9AejGYbifKeZE85D9VtH11ryJLQPTZXZSW1J5bIXcr4AlAH6tyjPPHTK34AdkwB32Myw=="], + "ol": ["ol@10.6.1", "", { "dependencies": { "@types/rbush": "4.0.0", "earcut": "^3.0.0", "geotiff": "^2.1.3", "pbf": "4.0.1", "rbush": "^4.0.0" } }, "sha512-xp174YOwPeLj7c7/8TCIEHQ4d41tgTDDhdv6SqNdySsql5/MaFJEJkjlsYcvOPt7xA6vrum/QG4UdJ0iCGT1cg=="], "omit.js": ["omit.js@2.0.2", "", {}, "sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg=="], @@ -3412,7 +3400,7 @@ "pathval": ["pathval@2.0.0", "", {}, "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA=="], - "pbf": ["pbf@3.2.1", "", { "dependencies": { "ieee754": "^1.1.12", "resolve-protobuf-schema": "^2.1.0" }, "bin": { "pbf": "bin/pbf" } }, "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ=="], + "pbf": ["pbf@4.0.1", "", { "dependencies": { "resolve-protobuf-schema": "^2.1.0" }, "bin": { "pbf": "bin/pbf" } }, "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA=="], "peek-readable": ["peek-readable@5.4.2", "", {}, "sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg=="], @@ -3672,7 +3660,7 @@ "quick-lru": ["quick-lru@6.1.2", "", {}, "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ=="], - "quickselect": ["quickselect@2.0.0", "", {}, "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="], + "quickselect": ["quickselect@3.0.0", "", {}, "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g=="], "quote-unquote": ["quote-unquote@1.0.0", "", {}, "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg=="], @@ -3688,7 +3676,7 @@ "raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], - "rbush": ["rbush@3.0.1", "", { "dependencies": { "quickselect": "^2.0.0" } }, "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w=="], + "rbush": ["rbush@4.0.1", "", { "dependencies": { "quickselect": "^3.0.0" } }, "sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ=="], "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], @@ -3806,8 +3794,6 @@ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], - "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], @@ -3920,16 +3906,10 @@ "sonic-boom": ["sonic-boom@4.2.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww=="], - "sort-asc": ["sort-asc@0.1.0", "", {}, "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw=="], - - "sort-desc": ["sort-desc@0.1.1", "", {}, "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw=="], - "sort-keys": ["sort-keys@2.0.0", "", { "dependencies": { "is-plain-obj": "^1.0.0" } }, "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg=="], "sort-keys-length": ["sort-keys-length@1.0.1", "", { "dependencies": { "sort-keys": "^1.0.0" } }, "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw=="], - "sort-object": ["sort-object@0.3.2", "", { "dependencies": { "sort-asc": "^0.1.0", "sort-desc": "^0.1.1" } }, "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA=="], - "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], @@ -4688,6 +4668,8 @@ "@rspack/cli/webpack-bundle-analyzer": ["webpack-bundle-analyzer@4.6.1", "", { "dependencies": { "acorn": "^8.0.4", "acorn-walk": "^8.0.0", "chalk": "^4.1.0", "commander": "^7.2.0", "gzip-size": "^6.0.0", "lodash": "^4.17.20", "opener": "^1.5.2", "sirv": "^1.0.7", "ws": "^7.3.1" }, "bin": { "webpack-bundle-analyzer": "lib/bin/analyzer.js" } }, "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw=="], + "@rspack/core/caniuse-lite": ["caniuse-lite@1.0.30001705", "", {}, "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg=="], + "@rspack/dev-server/webpack-dev-middleware": ["webpack-dev-middleware@7.4.2", "", { "dependencies": { "colorette": "^2.0.10", "memfs": "^4.6.0", "mime-types": "^2.1.31", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "peerDependencies": { "webpack": "^5.0.0" }, "optionalPeers": ["webpack"] }, "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA=="], "@rspack/dev-server/webpack-dev-server": ["webpack-dev-server@5.0.4", "", { "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", "@types/express": "^4.17.21", "@types/serve-index": "^1.9.4", "@types/serve-static": "^1.15.5", "@types/sockjs": "^0.3.36", "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.2.1", "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.4.0", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", "open": "^10.0.3", "p-retry": "^6.2.0", "rimraf": "^5.0.5", "schema-utils": "^4.2.0", "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^7.1.0", "ws": "^8.16.0" }, "peerDependencies": { "webpack": "^5.0.0" }, "optionalPeers": ["webpack"], "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" } }, "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA=="], @@ -4750,6 +4732,8 @@ "are-we-there-yet/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "autoprefixer/caniuse-lite": ["caniuse-lite@1.0.30001705", "", {}, "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg=="], + "axios/form-data": ["form-data@4.0.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w=="], "babel-jest/babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="], @@ -4778,6 +4762,8 @@ "brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "browserslist/caniuse-lite": ["caniuse-lite@1.0.30001705", "", {}, "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg=="], + "cacache/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "caching-transform/make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], @@ -4790,6 +4776,8 @@ "camelcase-keys/type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], + "caniuse-api/caniuse-lite": ["caniuse-lite@1.0.30001705", "", {}, "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg=="], + "chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -4916,7 +4904,9 @@ "detective-typescript/typescript": ["typescript@5.7.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg=="], - "dicom-microscopy-viewer/dcmjs": ["dcmjs@0.29.13", "", { "dependencies": { "@babel/runtime-corejs3": "^7.22.5", "adm-zip": "^0.5.10", "gl-matrix": "^3.1.0", "lodash.clonedeep": "^4.5.0", "loglevelnext": "^3.0.1", "ndarray": "^1.0.19", "pako": "^2.0.4" } }, "sha512-Bf9tKzJNWqk4kbV210N5TLEHDqaZvO3S+MH9vezFAU8WKcG4cR6z4/II3TQVqhLI185eNUL+lhfPCVH1Uu2yTA=="], + "dicom-microscopy-viewer/dcmjs": ["dcmjs@0.41.0", "", { "dependencies": { "@babel/runtime-corejs3": "^7.22.5", "adm-zip": "^0.5.10", "gl-matrix": "^3.1.0", "lodash.clonedeep": "^4.5.0", "loglevel": "^1.8.1", "ndarray": "^1.0.19", "pako": "^2.0.4" } }, "sha512-kr46REomItFeWz+0ck4Wif4uS5VVDWVlwdh5GGaCtTYHWfNQmrcCSiQOkrShc7Dc5zP8vNKrHEdORlZXenlg3w=="], + + "dicom-microscopy-viewer/dicomweb-client": ["dicomweb-client@0.10.4", "", {}, "sha512-TEt26c0JI37IGmSqoj1k1/Y/ZIyq33/ysVaUwE0/Haosn2IBM55NEIPkT+AnhFss2nFAMVtKKWKWLox4luthVw=="], "dir-glob/path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], diff --git a/package.json b/package.json index 4f1b7b7804..4bf15891bc 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,6 @@ "webpack:watch": "npx lerna run webpack:watch" }, "devDependencies": { - "@prettier/plugin-oxc": "^0.0.4", "@babel/core": "^7.21.8", "@babel/plugin-external-helpers": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6", @@ -78,6 +77,7 @@ "@microsoft/api-extractor": "7.49.2", "@microsoft/tsdoc": "^0.15.0", "@playwright/test": "^1.51.1", + "@prettier/plugin-oxc": "^0.0.4", "@rollup/plugin-babel": "^6.0.3", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.2", @@ -111,9 +111,9 @@ "cross-env": "^7.0.3", "css-loader": "^6.7.3", "cssnano": "^6.0.1", + "dicomweb-client": "^0.11.2", "docdash": "^1.2.0", "dpdm": "^3.14.0", - "oxlint": "^1.9.0", "execa": "^7.2.0", "exports-loader": "^3.0.0", "file-loader": "^6.2.0", @@ -142,6 +142,7 @@ "netlify-cli": "^17.34.1", "nyc": "^17.1.0", "open-cli": "^7.0.1", + "oxlint": "^1.9.0", "path-browserify": "^1.0.1", "playwright-test-coverage": "^1.2.12", "postcss": "^8.4.23", @@ -187,7 +188,9 @@ "not op_mini all" ], "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e", - "dependencies": {}, + "dependencies": { + "caniuse-lite": "^1.0.30001734" + }, "resolutions": { "canvas": "3.1.0" } diff --git a/packages/core/examples/wsi/index.ts b/packages/core/examples/wsi/index.ts index 05dcd48615..3e564907db 100644 --- a/packages/core/examples/wsi/index.ts +++ b/packages/core/examples/wsi/index.ts @@ -90,13 +90,13 @@ async function run() { // Get Cornerstone imageIds and fetch metadata into RAM // TODO - deploy the testdata publically + const wadoRsRoot = - getLocalUrl() || 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb'; + getLocalUrl() || 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb'; const client = new api.DICOMwebClient({ url: wadoRsRoot }); const imageIds = await createImageIdsAndCacheMetaData({ - StudyInstanceUID: '1.2.276.1.74.1.2.132733202464108492637644434464108492', - SeriesInstanceUID: - '2.16.840.1.113883.3.8467.132733202477512857637644434477512857', + StudyInstanceUID: '2.25.269859997690759739055099378767846712697', + SeriesInstanceUID: '2.25.274641717059635090989922952756233538416', client, wadoRsRoot, convertMultiframe: false, diff --git a/packages/core/src/RenderingEngine/WSIViewport.ts b/packages/core/src/RenderingEngine/WSIViewport.ts index e174cb561e..c5c8922a61 100644 --- a/packages/core/src/RenderingEngine/WSIViewport.ts +++ b/packages/core/src/RenderingEngine/WSIViewport.ts @@ -8,7 +8,6 @@ import type { VOIRange, CPUIImageData, ViewportInput, - BoundsIJK, } from '../types'; import uuidv4 from '../utilities/uuidv4'; import * as metaData from '../metaData'; @@ -18,13 +17,10 @@ import { getOrCreateCanvas } from './helpers'; import { EPSILON } from '../constants'; import triggerEvent from '../utilities/triggerEvent'; import { peerImport } from '../init'; -import { pointInShapeCallback } from '../utilities/pointInShapeCallback'; import microscopyViewportCss from '../constants/microscopyViewportCss'; import type { DataSetOptions } from '../types/IViewport'; let WSIUtilFunctions = null; -const _map = Symbol.for('map'); -const affineSymbol = Symbol.for('affine'); const EVENT_POSTRENDER = 'postrender'; /** * A viewport which shows a microscopy view using the dicom-microscopy-viewer @@ -492,7 +488,7 @@ class WSIViewport extends Viewport { if (!WSIUtilFunctions) { return; } - const affine = this.viewer[affineSymbol]; + const affine = this.viewer.getAffine(); const pixelCoords = WSIUtilFunctions.applyInverseTransform({ coordinate: [point[0], point[1]], affine, @@ -511,7 +507,7 @@ class WSIViewport extends Viewport { } const sliceCoords = WSIUtilFunctions.applyTransform({ coordinate: [point[0], point[1]], - affine: this.viewer[affineSymbol], + affine: this.viewer.getAffine(), }); return [sliceCoords[0], sliceCoords[1], 0] as Point3; } @@ -654,7 +650,7 @@ class WSIViewport extends Viewport { viewer.deactivateDragPanInteraction(); this.viewer = viewer; - this.map = viewer[_map]; + this.map = viewer.getMap(); this.map.on(EVENT_POSTRENDER, this.postrender); this.resize(); this.microscopyElement.innerText = ''; @@ -721,7 +717,7 @@ class WSIViewport extends Viewport { return; } // TODO - use a native method rather than accessing internals directly - const map = this.viewer[_map]; + const map = this.viewer.getMap(); // TODO - remove the globals setter const anyWindow = window as unknown as Record; anyWindow.map = map; diff --git a/packages/docs/package.json b/packages/docs/package.json index 894ba3ffd5..09c3426989 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -13,7 +13,7 @@ "generate-llms-full-txt": "node ./scripts/generate-llms-full-txt.js", "generate-redirects": "node ./scripts/generate-redirects.js", "copy-coverage-to-docs": "cp -R ../../coverage/*Chrome*/. ./static/test-coverage/", - "copy-examples-to-docs": "cp -R ../../.static-examples/. ./static/live-examples/ && cp -R ../../node_modules/dicom-microscopy-viewer/dist/dynamic-import/dicom-microscopy-viewer ./static/dicom-microscopy-viewer", + "copy-examples-to-docs": "cp -R ../../.static-examples/. ./static/live-examples/ && cp -R ../../node_modules/dicom-microscopy-viewer/dist/dynamic-import ./static/dicom-microscopy-viewer", "docusaurus": "docusaurus", "docusaurus:build": "docusaurus build", "docs": "cross-env NODE_OPTIONS=--max_old_space_size=16384 docusaurus start --port 3333", diff --git a/packages/tools/examples/volumeProgressive/index.ts b/packages/tools/examples/volumeProgressive/index.ts index 4072f1cf27..f0eb4b884a 100644 --- a/packages/tools/examples/volumeProgressive/index.ts +++ b/packages/tools/examples/volumeProgressive/index.ts @@ -173,7 +173,7 @@ content.append(instructions); * Generate the various configurations by using the options on static DICOMweb: * Base lossy/full thumbnail configuration for HTJ2K: * ``` - * mkdicomweb create -t jhc --recompress true --alternate jhc --alternate-name lossy d:\src\viewer-testdata\dcm\Juno + * mkdicomweb create -t jhc --recompress true --alternate jhc --alternate-name lossy /src/viewer-testdata/dcm/Juno * ``` * * JLS and JLS thumbnails: diff --git a/packages/tools/examples/wsiAnnotationTools/index.ts b/packages/tools/examples/wsiAnnotationTools/index.ts index cd02abbcfa..5079889f2f 100644 --- a/packages/tools/examples/wsiAnnotationTools/index.ts +++ b/packages/tools/examples/wsiAnnotationTools/index.ts @@ -150,12 +150,11 @@ async function run() { // Get Cornerstone imageIds and fetch metadata const wadoRsRoot = - getLocalUrl() || 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb'; + getLocalUrl() || 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb'; const client = new api.DICOMwebClient({ url: wadoRsRoot }); const imageIds = await createImageIdsAndCacheMetaData({ - StudyInstanceUID: '1.2.276.1.74.1.2.132733202464108492637644434464108492', - SeriesInstanceUID: - '2.16.840.1.113883.3.8467.132733202477512857637644434477512857', + StudyInstanceUID: '2.25.269859997690759739055099378767846712697', + SeriesInstanceUID: '2.25.274641717059635090989922952756233538416', client, wadoRsRoot, convertMultiframe: false, diff --git a/utils/ExampleRunner/template-config.js b/utils/ExampleRunner/template-config.js index 5a3e4a2380..56f729f112 100644 --- a/utils/ExampleRunner/template-config.js +++ b/utils/ExampleRunner/template-config.js @@ -40,7 +40,7 @@ module.exports = { { from: '../../../node_modules/dicom-microscopy-viewer/dist/dynamic-import/', - to: '${destPath.replace(/\\/g, '/')}', + to: '${destPath.replace(/\\/g, '/') + '/dicom-microscopy-viewer'}', noErrorOnMissing: true, }, { diff --git a/utils/ExampleRunner/template-multiexample-config.js b/utils/ExampleRunner/template-multiexample-config.js index 5afd8b0b6d..01eef335b1 100644 --- a/utils/ExampleRunner/template-multiexample-config.js +++ b/utils/ExampleRunner/template-multiexample-config.js @@ -73,7 +73,7 @@ module.exports = { }, { from: '../../../node_modules/dicom-microscopy-viewer/dist/dynamic-import/', - to: '${destPath.replace(/\\/g, '/')}', + to: '${destPath.replace(/\\/g, '/') + '/dicom-microscopy-viewer/'}', noErrorOnMissing: true, }, { diff --git a/utils/demo/helpers/initDemo.ts b/utils/demo/helpers/initDemo.ts index 7db49b519c..2e6f123764 100644 --- a/utils/demo/helpers/initDemo.ts +++ b/utils/demo/helpers/initDemo.ts @@ -62,6 +62,10 @@ export default async function initDemo(config: any = {}) { */ export async function peerImport(moduleId) { if (moduleId === 'dicom-microscopy-viewer') { + // The microscopy viewer loads relative to the public URL + window.PUBLIC_URL ||= '/'; + // Use a relative library path that includes the component name + window.PUBLIC_LIB_URL ||= './${component}/'; return importGlobal( '/dicom-microscopy-viewer/dicomMicroscopyViewer.min.js', 'dicomMicroscopyViewer' From bf53bce9ac2473431c041cd259662f51e61cf7bb Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 18 Aug 2025 16:08:05 +0000 Subject: [PATCH 178/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 6e6ab51791..0dd1302991 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -17047e65b5237675a7daeb9d7754203126fdb89d \ No newline at end of file +0088cbcfa910af62937dae0e554603d4c008710e \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 5e4448d5c9..be62cf9243 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.11", - "@cornerstonejs/tools": "^3.32.11" + "@cornerstonejs/core": "^3.32.12", + "@cornerstonejs/tools": "^3.32.12" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 03a3bc6181..35c22fef59 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.11", - "@cornerstonejs/tools": "^3.32.11" + "@cornerstonejs/core": "^3.32.12", + "@cornerstonejs/tools": "^3.32.12" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 07a2d8c123..d5a6307cb0 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.11", + "@cornerstonejs/core": "^3.32.12", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 09c3426989..cab4d6c27c 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.11", - "@cornerstonejs/core": "^3.32.11", - "@cornerstonejs/dicom-image-loader": "^3.32.11", - "@cornerstonejs/nifti-volume-loader": "^3.32.11", - "@cornerstonejs/tools": "^3.32.11", + "@cornerstonejs/adapters": "^3.32.12", + "@cornerstonejs/core": "^3.32.12", + "@cornerstonejs/dicom-image-loader": "^3.32.12", + "@cornerstonejs/nifti-volume-loader": "^3.32.12", + "@cornerstonejs/tools": "^3.32.12", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 72652b6369..fda4850a6f 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.11", - "@cornerstonejs/tools": "^3.32.11", + "@cornerstonejs/core": "^3.32.12", + "@cornerstonejs/tools": "^3.32.12", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 0dd29e422c..50d279ab0c 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.11" + "@cornerstonejs/core": "^3.32.12" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index e9b7fd3eda..c01013f7c3 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.11", - "@cornerstonejs/tools": "^3.32.11", + "@cornerstonejs/core": "^3.32.12", + "@cornerstonejs/tools": "^3.32.12", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index e2f599f670..22b6c3d9be 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.11", + "@cornerstonejs/core": "^3.32.12", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 9be43cc076..14563c0437 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.11", - "commit": "17047e65b5237675a7daeb9d7754203126fdb89d" + "version": "3.32.12", + "commit": "0088cbcfa910af62937dae0e554603d4c008710e" } \ No newline at end of file diff --git a/version.txt b/version.txt index bba9e4fff3..54fea655ee 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.11 \ No newline at end of file +3.32.12 \ No newline at end of file From e79870c1b49ef13420b1c83e1c3885466f5ca1a8 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 18 Aug 2025 16:08:19 +0000 Subject: [PATCH 179/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 6 ++++++ packages/tools/package.json | 2 +- 18 files changed, 51 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f145126e7..be9e707650 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) + +### Bug Fixes + +- Load microscopy viewer using updated paths ([#2226](https://github.com/cornerstonejs/cornerstone3D/issues/2226)) ([0088cbc](https://github.com/cornerstonejs/cornerstone3D/commit/0088cbcfa910af62937dae0e554603d4c008710e)) + ## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 659f00b2fc..098b200176 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.11", + "version": "3.32.12", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index f2cdf7c4cc..5067733f87 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index be62cf9243..aff06c4947 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.11", + "version": "3.32.12", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 440a30570b..6ac1ad5813 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 35c22fef59..a4d8f2c597 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.11", + "version": "3.32.12", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index dbdc3d3dd5..24bf136cb8 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) + +### Bug Fixes + +- Load microscopy viewer using updated paths ([#2226](https://github.com/cornerstonejs/cornerstone3D/issues/2226)) ([0088cbc](https://github.com/cornerstonejs/cornerstone3D/commit/0088cbcfa910af62937dae0e554603d4c008710e)) + ## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 9837c99b7c..6b967bae57 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.11", + "version": "3.32.12", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 0029bf2ae6..48813b3d91 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) ### Bug Fixes diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index d5a6307cb0..f4e2476c38 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.11", + "version": "3.32.12", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index c7b4caedff..a6b67ee8b1 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index fda4850a6f..0fbe7c7adb 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.11", + "version": "3.32.12", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index ce5ae705f6..adff309e3c 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 50d279ab0c..488cca516c 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.11", + "version": "3.32.12", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 05d0141fb9..b05a6f8f04 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index c01013f7c3..efe32d37a6 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.11", + "version": "3.32.12", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index ad6132c756..0b7faa70fd 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) + +### Bug Fixes + +- Load microscopy viewer using updated paths ([#2226](https://github.com/cornerstonejs/cornerstone3D/issues/2226)) ([0088cbc](https://github.com/cornerstonejs/cornerstone3D/commit/0088cbcfa910af62937dae0e554603d4c008710e)) + ## [3.32.11](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.10...v3.32.11) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 22b6c3d9be..5476a1103b 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.11", + "version": "3.32.12", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 18e77561cbed314d083d89c60d43b8c7f0311108 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 18 Aug 2025 16:08:28 +0000 Subject: [PATCH 180/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 7fcdd6d5d0..28af201c9d 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.11'; +export const version = '3.32.12'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 7fcdd6d5d0..28af201c9d 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.11'; +export const version = '3.32.12'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 7fcdd6d5d0..28af201c9d 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.11'; +export const version = '3.32.12'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 7fcdd6d5d0..28af201c9d 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.11'; +export const version = '3.32.12'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 7fcdd6d5d0..28af201c9d 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.11'; +export const version = '3.32.12'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 7fcdd6d5d0..28af201c9d 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.11'; +export const version = '3.32.12'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 7fcdd6d5d0..28af201c9d 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.11'; +export const version = '3.32.12'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 7fcdd6d5d0..28af201c9d 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.11'; +export const version = '3.32.12'; From 5bc93d79c65a7dbcf0347cae451a082298b38c79 Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Wed, 20 Aug 2025 11:54:20 -0400 Subject: [PATCH 181/212] fix: tolerance func updates to address seg orientation issues (#2281) * Fix tolerance func for orientation * Replace compareArray cals --- .../src/adapters/Cornerstone/ParametricMap.ts | 4 +-- .../adapters/Cornerstone/Segmentation_4X.js | 22 +++++++------- .../src/adapters/helpers/checkOrientation.ts | 4 +-- .../src/adapters/helpers/compareArrays.ts | 29 ------------------- 4 files changed, 15 insertions(+), 44 deletions(-) delete mode 100644 packages/adapters/src/adapters/helpers/compareArrays.ts diff --git a/packages/adapters/src/adapters/Cornerstone/ParametricMap.ts b/packages/adapters/src/adapters/Cornerstone/ParametricMap.ts index eba5a20419..89b3f97939 100644 --- a/packages/adapters/src/adapters/Cornerstone/ParametricMap.ts +++ b/packages/adapters/src/adapters/Cornerstone/ParametricMap.ts @@ -1,6 +1,6 @@ import { log, data as dcmjsData, normalizers } from "dcmjs"; import checkOrientation from "../helpers/checkOrientation"; -import compareArrays from "../helpers/compareArrays"; +import { utilities } from "@cornerstonejs/core"; const { DicomMessage, DicomMetaDictionary } = dcmjsData; const { Normalizer } = normalizers; @@ -338,7 +338,7 @@ function getImageIdOfSourceImagebyGeometry( } if ( - compareArrays( + utilities.isEqual( PerFrameFunctionalGroup.PlanePositionSequence[0] .ImagePositionPatient, sourceImageMetadata.ImagePositionPatient, diff --git a/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js b/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js index dff6ff380e..b11293db58 100644 --- a/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js +++ b/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js @@ -8,7 +8,7 @@ import { import ndarray from "ndarray"; import getDatasetsFromImages from "../helpers/getDatasetsFromImages"; import checkOrientation from "../helpers/checkOrientation"; -import compareArrays from "../helpers/compareArrays"; +import { utilities as csUtilities } from "@cornerstonejs/core"; import { Events } from "../enums"; @@ -1482,12 +1482,12 @@ export function getImageIdOfSourceImagebyGeometry( if ( framePosition && - compareArrays(segFramePosition, framePosition, tolerance) + csUtilities.isEqual(segFramePosition, framePosition, tolerance) ) { return imageId; } } else if ( - compareArrays( + csUtilities.isEqual( segFramePosition, sourceImageMetadata.ImagePositionPatient, tolerance @@ -1575,38 +1575,38 @@ export function alignPixelDataWithSourceData( orientations, tolerance ) { - if (compareArrays(iop, orientations[0], tolerance)) { + if (csUtilities.isEqual(iop, orientations[0], tolerance)) { return pixelData2D; - } else if (compareArrays(iop, orientations[1], tolerance)) { + } else if (csUtilities.isEqual(iop, orientations[1], tolerance)) { // Flipped vertically. // Undo Flip return flipMatrix2D.v(pixelData2D); - } else if (compareArrays(iop, orientations[2], tolerance)) { + } else if (csUtilities.isEqual(iop, orientations[2], tolerance)) { // Flipped horizontally. // Unfo flip return flipMatrix2D.h(pixelData2D); - } else if (compareArrays(iop, orientations[3], tolerance)) { + } else if (csUtilities.isEqual(iop, orientations[3], tolerance)) { //Rotated 90 degrees // Rotate back return rotateMatrix902D(pixelData2D); - } else if (compareArrays(iop, orientations[4], tolerance)) { + } else if (csUtilities.isEqual(iop, orientations[4], tolerance)) { //Rotated 90 degrees and fliped horizontally. // Undo flip and rotate back. return rotateMatrix902D(flipMatrix2D.h(pixelData2D)); - } else if (compareArrays(iop, orientations[5], tolerance)) { + } else if (csUtilities.isEqual(iop, orientations[5], tolerance)) { // Rotated 90 degrees and fliped vertically // Unfo flip and rotate back. return rotateMatrix902D(flipMatrix2D.v(pixelData2D)); - } else if (compareArrays(iop, orientations[6], tolerance)) { + } else if (csUtilities.isEqual(iop, orientations[6], tolerance)) { // Rotated 180 degrees. // TODO -> Do this more effeciently, there is a 1:1 mapping like 90 degree rotation. return rotateMatrix902D(rotateMatrix902D(pixelData2D)); - } else if (compareArrays(iop, orientations[7], tolerance)) { + } else if (csUtilities.isEqual(iop, orientations[7], tolerance)) { // Rotated 270 degrees // Rotate back. diff --git a/packages/adapters/src/adapters/helpers/checkOrientation.ts b/packages/adapters/src/adapters/helpers/checkOrientation.ts index d8d2610cd7..dc5aa13fa1 100644 --- a/packages/adapters/src/adapters/helpers/checkOrientation.ts +++ b/packages/adapters/src/adapters/helpers/checkOrientation.ts @@ -1,5 +1,5 @@ import checkIfPerpendicular from "./checkIfPerpendicular"; -import compareArrays from "./compareArrays"; +import { utilities } from "@cornerstonejs/core"; export default function checkOrientation( multiframe, @@ -25,7 +25,7 @@ export default function checkOrientation( .ImageOrientationPatient; const inPlane = validOrientations.some(operation => - compareArrays(iop, operation, tolerance) + utilities.isEqual(iop, operation, tolerance) ); if (inPlane) { diff --git a/packages/adapters/src/adapters/helpers/compareArrays.ts b/packages/adapters/src/adapters/helpers/compareArrays.ts deleted file mode 100644 index a51b472dc4..0000000000 --- a/packages/adapters/src/adapters/helpers/compareArrays.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { utilities } from "dcmjs"; - -const { nearlyEqual } = utilities.orientation; - -/** - * Returns true if array1 and array2 are equal within a tolerance. - * - * @param array1 - First array - * @param array2 - Second array - * @param tolerance - Tolerance - * @returns True if array1 and array2 are equal. - */ -export default function compareArrays( - array1: number[], - array2: number[], - tolerance: number -): boolean { - if (array1.length !== array2.length) { - return false; - } - - for (let i = 0; i < array1.length; ++i) { - if (!nearlyEqual(array1[i], array2[i], tolerance)) { - return false; - } - } - - return true; -} From 8bd50dadfc0fcdcb1f4dc07c97822f91de95180d Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 20 Aug 2025 15:58:11 +0000 Subject: [PATCH 182/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 0dd1302991..3c8697422e 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -0088cbcfa910af62937dae0e554603d4c008710e \ No newline at end of file +5bc93d79c65a7dbcf0347cae451a082298b38c79 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index aff06c4947..8ec4b89658 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.12", - "@cornerstonejs/tools": "^3.32.12" + "@cornerstonejs/core": "^3.32.13", + "@cornerstonejs/tools": "^3.32.13" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index a4d8f2c597..a9f447e076 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.12", - "@cornerstonejs/tools": "^3.32.12" + "@cornerstonejs/core": "^3.32.13", + "@cornerstonejs/tools": "^3.32.13" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index f4e2476c38..59864546ef 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.12", + "@cornerstonejs/core": "^3.32.13", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index cab4d6c27c..17eefe472b 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.12", - "@cornerstonejs/core": "^3.32.12", - "@cornerstonejs/dicom-image-loader": "^3.32.12", - "@cornerstonejs/nifti-volume-loader": "^3.32.12", - "@cornerstonejs/tools": "^3.32.12", + "@cornerstonejs/adapters": "^3.32.13", + "@cornerstonejs/core": "^3.32.13", + "@cornerstonejs/dicom-image-loader": "^3.32.13", + "@cornerstonejs/nifti-volume-loader": "^3.32.13", + "@cornerstonejs/tools": "^3.32.13", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 0fbe7c7adb..b1a76c4689 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.12", - "@cornerstonejs/tools": "^3.32.12", + "@cornerstonejs/core": "^3.32.13", + "@cornerstonejs/tools": "^3.32.13", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 488cca516c..e5db6e29af 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.12" + "@cornerstonejs/core": "^3.32.13" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index efe32d37a6..70477e64e6 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.12", - "@cornerstonejs/tools": "^3.32.12", + "@cornerstonejs/core": "^3.32.13", + "@cornerstonejs/tools": "^3.32.13", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 5476a1103b..89e009dcb6 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.12", + "@cornerstonejs/core": "^3.32.13", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 14563c0437..cab8399100 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.12", - "commit": "0088cbcfa910af62937dae0e554603d4c008710e" + "version": "3.32.13", + "commit": "5bc93d79c65a7dbcf0347cae451a082298b38c79" } \ No newline at end of file diff --git a/version.txt b/version.txt index 54fea655ee..632d4f692d 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.12 \ No newline at end of file +3.32.13 \ No newline at end of file From f8e550097fd41b5d927e5dfbc9ca05d97f9cb777 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 20 Aug 2025 15:58:23 +0000 Subject: [PATCH 183/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 6 ++++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be9e707650..b781a1578c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) + +### Bug Fixes + +- tolerance func updates to address seg orientation issues ([#2281](https://github.com/cornerstonejs/cornerstone3D/issues/2281)) ([5bc93d7](https://github.com/cornerstonejs/cornerstone3D/commit/5bc93d79c65a7dbcf0347cae451a082298b38c79)) + ## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 098b200176..35e03a3758 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.12", + "version": "3.32.13", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 5067733f87..8e700154e6 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) + +### Bug Fixes + +- tolerance func updates to address seg orientation issues ([#2281](https://github.com/cornerstonejs/cornerstone3D/issues/2281)) ([5bc93d7](https://github.com/cornerstonejs/cornerstone3D/commit/5bc93d79c65a7dbcf0347cae451a082298b38c79)) + ## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 8ec4b89658..f77bc73f94 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.12", + "version": "3.32.13", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 6ac1ad5813..0a948149b4 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index a9f447e076..21b6540234 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.12", + "version": "3.32.13", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 24bf136cb8..7fdf3479d7 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) ### Bug Fixes diff --git a/packages/core/package.json b/packages/core/package.json index 6b967bae57..31c96feec5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.12", + "version": "3.32.13", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 48813b3d91..37bf0ca2cd 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 59864546ef..bda6158be5 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.12", + "version": "3.32.13", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index a6b67ee8b1..860ae718b1 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index b1a76c4689..df38f72d70 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.12", + "version": "3.32.13", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index adff309e3c..6cf1d5b22c 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index e5db6e29af..1a637df3da 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.12", + "version": "3.32.13", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index b05a6f8f04..c2fee3a782 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 70477e64e6..dbc3a280f5 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.12", + "version": "3.32.13", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 0b7faa70fd..49ee8ec4da 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.32.12](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.11...v3.32.12) (2025-08-18) ### Bug Fixes diff --git a/packages/tools/package.json b/packages/tools/package.json index 89e009dcb6..4baae44b01 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.12", + "version": "3.32.13", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 77216294c5fa7bf9b60bb1e91ea1066aa177a7d6 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 20 Aug 2025 15:58:32 +0000 Subject: [PATCH 184/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 28af201c9d..a56f8f1b33 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.12'; +export const version = '3.32.13'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 28af201c9d..a56f8f1b33 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.12'; +export const version = '3.32.13'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 28af201c9d..a56f8f1b33 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.12'; +export const version = '3.32.13'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 28af201c9d..a56f8f1b33 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.12'; +export const version = '3.32.13'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 28af201c9d..a56f8f1b33 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.12'; +export const version = '3.32.13'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 28af201c9d..a56f8f1b33 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.12'; +export const version = '3.32.13'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 28af201c9d..a56f8f1b33 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.12'; +export const version = '3.32.13'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 28af201c9d..a56f8f1b33 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.12'; +export const version = '3.32.13'; From 0762dc7b2a4653143fb45ef184cafd1f36b62c3c Mon Sep 17 00:00:00 2001 From: "Martin Bellehumeur, M. Eng." <23396581+mbellehumeur@users.noreply.github.com> Date: Wed, 20 Aug 2025 23:29:41 +0200 Subject: [PATCH 185/212] feat: Sampling distance for 3D rendering settings (#2275) * Load and apply 3d setting * reapply presets * Remove import * Remove debug log for updated sampling quality in createVolumeMapper * Refactor rendering pipeline: .Make sample distance multiplier a property of the viewport. move sample distance change out of updateRenderingPipeline method and add to VolumeViewport3D. * Refactor VolumeViewport3D: Remove debug logs from setSampleDistanceMultiplier method and update updateRenderingPipeline to call _configureRenderingPipeline. * Add sample distance multiplier dropdown to toolbar and update viewport rendering * Remove debug log from setSampleDistanceMultiplier method * Update instructions to include sampling distance selection guidance * Refactor volume mapper: Use sample distance multiplier from configuration in createVolumeMapper function * Refactor createVolumeMapper: Simplify sample distance calculation by removing unnecessary conditional check for sampleDistanceMultiplier * Shorter calculation logic for sample distance --------- Co-authored-by: Bill Wallace --- .../core/examples/volumeViewport3D/index.ts | 14 ++++++- .../src/RenderingEngine/BaseVolumeViewport.ts | 13 +++++-- .../src/RenderingEngine/VolumeViewport3D.ts | 38 ++++++++++++++++++- .../helpers/createVolumeMapper.ts | 6 ++- packages/core/src/init.ts | 4 ++ .../core/src/types/Cornerstone3DConfig.ts | 4 ++ packages/core/src/types/ViewportProperties.ts | 2 + 7 files changed, 74 insertions(+), 7 deletions(-) diff --git a/packages/core/examples/volumeViewport3D/index.ts b/packages/core/examples/volumeViewport3D/index.ts index e18985845d..c66a740339 100644 --- a/packages/core/examples/volumeViewport3D/index.ts +++ b/packages/core/examples/volumeViewport3D/index.ts @@ -60,7 +60,8 @@ viewportGrid.appendChild(element1); content.appendChild(viewportGrid); const instructions = document.createElement('p'); -instructions.innerText = 'Click the image to rotate it.'; +instructions.innerText = + 'Click the image to rotate it. Select the preset and sampling distance from the drop downs'; content.append(instructions); @@ -92,6 +93,17 @@ addDropdownToToolbar({ }, }); +addDropdownToToolbar({ + options: { + values: Array.from({ length: 16 }, (_, i) => i + 1), // [1, 2, ..., 16] + defaultValue: 1, + }, + onSelectedValueChange: (sampleDistanceMultiplier) => { + viewport.setProperties({ sampleDistanceMultiplier }); + viewport.render(); + }, +}); + // ============================= // let viewport; diff --git a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts index e1cc064d04..0b59acf972 100644 --- a/packages/core/src/RenderingEngine/BaseVolumeViewport.ts +++ b/packages/core/src/RenderingEngine/BaseVolumeViewport.ts @@ -77,6 +77,8 @@ import { getCameraVectors } from './helpers/getCameraVectors'; import { isContextPoolRenderingEngine } from './helpers/isContextPoolRenderingEngine'; import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer'; import mprCameraValues from '../constants/mprCameraValues'; +import { setConfiguration, getConfiguration } from '@cornerstonejs/core'; +import type { Types } from '@cornerstonejs/core'; /** * Abstract base class for volume viewports. VolumeViewports are used to render * 3D volumes from which various orientations can be viewed. Since VolumeViewports @@ -978,6 +980,7 @@ abstract class BaseVolumeViewport extends Viewport { preset, interpolationType, slabThickness, + sampleDistanceMultiplier, }: VolumeViewportProperties = {}, volumeId?: string, suppressEvents = false @@ -1031,6 +1034,9 @@ abstract class BaseVolumeViewport extends Viewport { if (slabThickness !== undefined) { this.setSlabThickness(slabThickness); } + if (sampleDistanceMultiplier !== undefined) { + this.setSampleDistanceMultiplier(sampleDistanceMultiplier); + } } /** @@ -1064,14 +1070,13 @@ abstract class BaseVolumeViewport extends Viewport { this.viewportProperties.slabThickness = properties.slabThickness; } - if (properties.preset !== undefined) { - this.setPreset(properties.preset, volumeId, false); + if (properties.sampleDistanceMultiplier !== undefined) { + this.setSampleDistanceMultiplier(properties.sampleDistanceMultiplier); } if (properties.preset !== undefined) { this.setPreset(properties.preset, volumeId, false); } - this.render(); } @@ -1120,6 +1125,8 @@ abstract class BaseVolumeViewport extends Viewport { } } + public setSampleDistanceMultiplier(multiplier: number): void {} + /** * Retrieve the viewport default properties * @param volumeId If given, we retrieve the default properties of a volumeId if it exists diff --git a/packages/core/src/RenderingEngine/VolumeViewport3D.ts b/packages/core/src/RenderingEngine/VolumeViewport3D.ts index da477d981b..6130fcb882 100644 --- a/packages/core/src/RenderingEngine/VolumeViewport3D.ts +++ b/packages/core/src/RenderingEngine/VolumeViewport3D.ts @@ -4,13 +4,13 @@ import { OrientationAxis, Events } from '../enums'; import cache from '../cache/cache'; import setDefaultVolumeVOI from './helpers/setDefaultVolumeVOI'; import triggerEvent from '../utilities/triggerEvent'; -import { isImageActor } from '../utilities/actorCheck'; +import { actorIsA, isImageActor } from '../utilities/actorCheck'; import { setTransferFunctionNodes } from '../utilities/transferFunctionUtils'; import type vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume'; import type { ViewportInput } from '../types/IViewport'; import type { ImageActor } from '../types/IActor'; import BaseVolumeViewport from './BaseVolumeViewport'; - +import type { Types } from '@cornerstonejs/core'; /** * An object representing a 3-dimensional volume viewport. VolumeViewport3Ds are used to render * 3D volumes in their entirety, and not just load a single slice at a time. @@ -35,6 +35,40 @@ class VolumeViewport3D extends BaseVolumeViewport { } } + public setSampleDistanceMultiplier = (multiplier: number): void => { + const actors = this.getActors(); + actors.forEach((actorEntry) => { + if (actorIsA(actorEntry, 'vtkVolume')) { + const actor = actorEntry.actor as Types.VolumeActor; + const mapper = actor.getMapper(); + + if (mapper && mapper.getInputData) { + const imageData = mapper.getInputData(); + + if (imageData) { + const spacing = imageData.getSpacing(); + + //Calculate sample distance + const defaultSampleDistance = + (spacing[0] + spacing[1] + spacing[2]) / 6; + + const sampleDistanceMultiplier = multiplier || 1; + let sampleDistance = + defaultSampleDistance * sampleDistanceMultiplier; + + // Apply sample distance if specified + if (sampleDistance !== undefined && mapper.setSampleDistance) { + const currentSampleDistance = mapper.getSampleDistance(); + mapper.setSampleDistance(sampleDistance); + } + } + } + } + }); + + this.render(); + }; + public getNumberOfSlices = (): number => { return 1; }; diff --git a/packages/core/src/RenderingEngine/helpers/createVolumeMapper.ts b/packages/core/src/RenderingEngine/helpers/createVolumeMapper.ts index b20633977e..9aafb36690 100644 --- a/packages/core/src/RenderingEngine/helpers/createVolumeMapper.ts +++ b/packages/core/src/RenderingEngine/helpers/createVolumeMapper.ts @@ -30,7 +30,11 @@ export default function createVolumeMapper( const spacing = imageData.getSpacing(); // Set the sample distance to half the mean length of one side. This is where the divide by 6 comes from. // https://github.com/Kitware/VTK/blob/6b559c65bb90614fb02eb6d1b9e3f0fca3fe4b0b/Rendering/VolumeOpenGL2/vtkSmartVolumeMapper.cxx#L344 - const sampleDistance = (spacing[0] + spacing[1] + spacing[2]) / 6; + const sampleDistanceMultiplier = + getConfiguration().rendering?.volumeRendering?.sampleDistanceMultiplier || + 1; + const sampleDistance = + (sampleDistanceMultiplier * (spacing[0] + spacing[1] + spacing[2])) / 6; // This is to allow for good pixel level image quality. // Todo: why we are setting this to 4000? Is this a good number? it should be configurable diff --git a/packages/core/src/init.ts b/packages/core/src/init.ts index e1411aa600..22ccce2c74 100644 --- a/packages/core/src/init.ts +++ b/packages/core/src/init.ts @@ -27,6 +27,10 @@ const defaultConfig: Cornerstone3DConfig = { * The default value is 7, which is suitable for mobile/desktop. */ webGlContextCount: 7, + volumeRendering: { + /** Multiplier for the calculated sample distance */ + sampleDistanceMultiplier: 1, + }, }, debug: { diff --git a/packages/core/src/types/Cornerstone3DConfig.ts b/packages/core/src/types/Cornerstone3DConfig.ts index 7080b9174a..ba6934211c 100644 --- a/packages/core/src/types/Cornerstone3DConfig.ts +++ b/packages/core/src/types/Cornerstone3DConfig.ts @@ -45,6 +45,10 @@ interface Cornerstone3DConfig { * The default value is 7, which is suitable for mobile/desktop. */ webGlContextCount?: number; + volumeRendering?: { + /** Multiplier for the calculated sample distance */ + sampleDistanceMultiplier?: number; + }; }; debug: { diff --git a/packages/core/src/types/ViewportProperties.ts b/packages/core/src/types/ViewportProperties.ts index d48b3a8f8a..f6d170c7f7 100644 --- a/packages/core/src/types/ViewportProperties.ts +++ b/packages/core/src/types/ViewportProperties.ts @@ -18,4 +18,6 @@ export interface ViewportProperties { interpolationType?: InterpolationType; preset?: string; + + sampleDistanceMultiplier?: number; } From ccf0210bcf9db4dc3b860cd5eb06ba70a929b96b Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 20 Aug 2025 21:33:49 +0000 Subject: [PATCH 186/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 3c8697422e..2b47716088 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -5bc93d79c65a7dbcf0347cae451a082298b38c79 \ No newline at end of file +0762dc7b2a4653143fb45ef184cafd1f36b62c3c \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index f77bc73f94..2ebfe607b8 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.13", - "@cornerstonejs/tools": "^3.32.13" + "@cornerstonejs/core": "^3.33.0", + "@cornerstonejs/tools": "^3.33.0" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 21b6540234..5c9822d9be 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.13", - "@cornerstonejs/tools": "^3.32.13" + "@cornerstonejs/core": "^3.33.0", + "@cornerstonejs/tools": "^3.33.0" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index bda6158be5..6402b71255 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.13", + "@cornerstonejs/core": "^3.33.0", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 17eefe472b..baff83e446 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.32.13", - "@cornerstonejs/core": "^3.32.13", - "@cornerstonejs/dicom-image-loader": "^3.32.13", - "@cornerstonejs/nifti-volume-loader": "^3.32.13", - "@cornerstonejs/tools": "^3.32.13", + "@cornerstonejs/adapters": "^3.33.0", + "@cornerstonejs/core": "^3.33.0", + "@cornerstonejs/dicom-image-loader": "^3.33.0", + "@cornerstonejs/nifti-volume-loader": "^3.33.0", + "@cornerstonejs/tools": "^3.33.0", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index df38f72d70..12fa6e791b 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.13", - "@cornerstonejs/tools": "^3.32.13", + "@cornerstonejs/core": "^3.33.0", + "@cornerstonejs/tools": "^3.33.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 1a637df3da..10b2dc5680 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.13" + "@cornerstonejs/core": "^3.33.0" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index dbc3a280f5..96ee30e4c1 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.13", - "@cornerstonejs/tools": "^3.32.13", + "@cornerstonejs/core": "^3.33.0", + "@cornerstonejs/tools": "^3.33.0", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 4baae44b01..35d2be74b0 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.32.13", + "@cornerstonejs/core": "^3.33.0", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index cab8399100..4c31238608 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.32.13", - "commit": "5bc93d79c65a7dbcf0347cae451a082298b38c79" + "version": "3.33.0", + "commit": "0762dc7b2a4653143fb45ef184cafd1f36b62c3c" } \ No newline at end of file diff --git a/version.txt b/version.txt index 632d4f692d..42d9670e6e 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.32.13 \ No newline at end of file +3.33.0 \ No newline at end of file From a3b98e0b8c9a87f44e7b89b354c758bc06006e79 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 20 Aug 2025 21:34:04 +0000 Subject: [PATCH 187/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b781a1578c..1fa4074c41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) + +### Features + +- Sampling distance for 3D rendering settings ([#2275](https://github.com/cornerstonejs/cornerstone3D/issues/2275)) ([0762dc7](https://github.com/cornerstonejs/cornerstone3D/commit/0762dc7b2a4653143fb45ef184cafd1f36b62c3c)) + ## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 35e03a3758..b3bfd5b9dc 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.32.13", + "version": "3.33.0", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 8e700154e6..3f962409b3 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) ### Bug Fixes diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 2ebfe607b8..06133e0760 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.32.13", + "version": "3.33.0", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 0a948149b4..8fbfa8a92a 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 5c9822d9be..f9cdae73f9 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.32.13", + "version": "3.33.0", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 7fdf3479d7..eba82c35ce 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) + +### Features + +- Sampling distance for 3D rendering settings ([#2275](https://github.com/cornerstonejs/cornerstone3D/issues/2275)) ([0762dc7](https://github.com/cornerstonejs/cornerstone3D/commit/0762dc7b2a4653143fb45ef184cafd1f36b62c3c)) + ## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 31c96feec5..4e9a5622f0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.32.13", + "version": "3.33.0", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 37bf0ca2cd..62921a03e4 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 6402b71255..042978f303 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.32.13", + "version": "3.33.0", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 860ae718b1..8a5aa35eda 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 12fa6e791b..8d33626605 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.32.13", + "version": "3.33.0", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 6cf1d5b22c..d759e2ddbd 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 10b2dc5680..d2360f5669 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.32.13", + "version": "3.33.0", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index c2fee3a782..1b86f39dac 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 96ee30e4c1..85056e6e8b 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.32.13", + "version": "3.33.0", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 49ee8ec4da..3233d01ff6 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.32.13](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.12...v3.32.13) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 35d2be74b0..2e125604eb 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.32.13", + "version": "3.33.0", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From ddd0cea514cd49ceb614c5417d871894800a9fc5 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Wed, 20 Aug 2025 21:34:15 +0000 Subject: [PATCH 188/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index a56f8f1b33..99ff901eab 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.13'; +export const version = '3.33.0'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index a56f8f1b33..99ff901eab 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.13'; +export const version = '3.33.0'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index a56f8f1b33..99ff901eab 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.13'; +export const version = '3.33.0'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index a56f8f1b33..99ff901eab 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.13'; +export const version = '3.33.0'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index a56f8f1b33..99ff901eab 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.13'; +export const version = '3.33.0'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index a56f8f1b33..99ff901eab 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.13'; +export const version = '3.33.0'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index a56f8f1b33..99ff901eab 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.13'; +export const version = '3.33.0'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index a56f8f1b33..99ff901eab 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.32.13'; +export const version = '3.33.0'; From 26df8d5c91aa8bb7347d8862a3169a4ce5581fd7 Mon Sep 17 00:00:00 2001 From: m00n620 <50647994+m00n620@users.noreply.github.com> Date: Thu, 21 Aug 2025 13:22:04 -0400 Subject: [PATCH 189/212] priority prefetch (#2271) * priority prefetch * fix * remove console.log --- .../stackPrefetch/stackContextPrefetch.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/tools/src/utilities/stackPrefetch/stackContextPrefetch.ts b/packages/tools/src/utilities/stackPrefetch/stackContextPrefetch.ts index a9a57dba8c..14af8af32c 100644 --- a/packages/tools/src/utilities/stackPrefetch/stackContextPrefetch.ts +++ b/packages/tools/src/utilities/stackPrefetch/stackContextPrefetch.ts @@ -11,7 +11,6 @@ import { addToolState, getToolState, type StackPrefetchData } from './state'; import { getStackData, requestType, - priority, clearFromImageIds, getPromiseRemovedHandler, } from './stackPrefetchUtils'; @@ -33,6 +32,8 @@ let resetPrefetchTimeout; // loaded, so a 5 ms prefetch delay is fine const resetPrefetchDelay = 5; +const priorities = {}; + /** * Call this to enable stack context sensitive prefetch. Should be called * before stack data is set in order to start prefetch after load first image. @@ -62,8 +63,9 @@ const resetPrefetchDelay = 5; * * Up to 100 images in the direction of travel will be prefetched * * @param element - to prefetch on + * @param priority - priority to be used for the request manager */ -const enable = (element): void => { +const enable = (element, priority = 0): void => { const stack = getStackData(element); if (!stack) { return; @@ -75,7 +77,9 @@ const enable = (element): void => { updateToolState(element); - prefetch(element); + priorities[element] = priority; + + prefetch(element, priority); element.removeEventListener(Enums.Events.STACK_NEW_IMAGE, onImageUpdated); element.addEventListener(Enums.Events.STACK_NEW_IMAGE, onImageUpdated); @@ -92,7 +96,7 @@ const enable = (element): void => { ); }; -function prefetch(element) { +function prefetch(element, priority = 0) { const stack = getStackData(element); if (!stack) { return; @@ -194,7 +198,7 @@ function prefetch(element) { stats.initialTime = Date.now() - stats.start; stats.initialSize = stats.imageIds.size; updateToolState(element, usage); - prefetch(element); + prefetch(element, priority); } else if (stats.imageIds.size) { stats.fillTime = Date.now() - stats.start; const { size } = stats.imageIds; @@ -268,7 +272,7 @@ function onImageUpdated(e) { // An exception will be thrown because the element will not be enabled anymore try { updateToolState(element); - prefetch(element); + prefetch(element, priorities[element]); } catch (error) { return; } From e359fed7a551ac7bb587ed1d224888bda0c6b72a Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 21 Aug 2025 17:25:50 +0000 Subject: [PATCH 190/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 2b47716088..4848cd44fe 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -0762dc7b2a4653143fb45ef184cafd1f36b62c3c \ No newline at end of file +26df8d5c91aa8bb7347d8862a3169a4ce5581fd7 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 06133e0760..baf166ed8f 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.0", - "@cornerstonejs/tools": "^3.33.0" + "@cornerstonejs/core": "^3.33.1", + "@cornerstonejs/tools": "^3.33.1" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index f9cdae73f9..6e49101ba9 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.0", - "@cornerstonejs/tools": "^3.33.0" + "@cornerstonejs/core": "^3.33.1", + "@cornerstonejs/tools": "^3.33.1" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 042978f303..7e6978c5bf 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.0", + "@cornerstonejs/core": "^3.33.1", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index baff83e446..6a55d3fa73 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.33.0", - "@cornerstonejs/core": "^3.33.0", - "@cornerstonejs/dicom-image-loader": "^3.33.0", - "@cornerstonejs/nifti-volume-loader": "^3.33.0", - "@cornerstonejs/tools": "^3.33.0", + "@cornerstonejs/adapters": "^3.33.1", + "@cornerstonejs/core": "^3.33.1", + "@cornerstonejs/dicom-image-loader": "^3.33.1", + "@cornerstonejs/nifti-volume-loader": "^3.33.1", + "@cornerstonejs/tools": "^3.33.1", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 8d33626605..f8a6738395 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.0", - "@cornerstonejs/tools": "^3.33.0", + "@cornerstonejs/core": "^3.33.1", + "@cornerstonejs/tools": "^3.33.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index d2360f5669..4e8ed016e2 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.0" + "@cornerstonejs/core": "^3.33.1" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 85056e6e8b..965f1ea458 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.0", - "@cornerstonejs/tools": "^3.33.0", + "@cornerstonejs/core": "^3.33.1", + "@cornerstonejs/tools": "^3.33.1", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 2e125604eb..d74aa7fd7c 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.0", + "@cornerstonejs/core": "^3.33.1", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 4c31238608..21096ca19b 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.33.0", - "commit": "0762dc7b2a4653143fb45ef184cafd1f36b62c3c" + "version": "3.33.1", + "commit": "26df8d5c91aa8bb7347d8862a3169a4ce5581fd7" } \ No newline at end of file diff --git a/version.txt b/version.txt index 42d9670e6e..f23e955883 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.33.0 \ No newline at end of file +3.33.1 \ No newline at end of file From b2087ec035393b5c4804e11fdafde095c6e44fa4 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 21 Aug 2025 17:26:04 +0000 Subject: [PATCH 191/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 4 ++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 45 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fa4074c41..2e3dd5f013 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) + +**Note:** Version bump only for package root + # [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) ### Features diff --git a/lerna.json b/lerna.json index b3bfd5b9dc..5b58bb4eb7 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.33.0", + "version": "3.33.1", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 3f962409b3..35e60faaaf 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/adapters + # [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index baf166ed8f..1db76b6a3a 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.33.0", + "version": "3.33.1", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 8fbfa8a92a..5783c2b12f 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/ai + # [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 6e49101ba9..966898c61f 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.33.0", + "version": "3.33.1", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index eba82c35ce..11865b95aa 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/core + # [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) ### Features diff --git a/packages/core/package.json b/packages/core/package.json index 4e9a5622f0..064cfd027a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.33.0", + "version": "3.33.1", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 62921a03e4..8485309c54 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + # [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 7e6978c5bf..c2222904e1 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.33.0", + "version": "3.33.1", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 8a5aa35eda..fa17293ac0 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + # [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index f8a6738395..95387057f7 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.33.0", + "version": "3.33.1", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index d759e2ddbd..bbb666166a 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + # [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 4e8ed016e2..68fdb6c695 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.33.0", + "version": "3.33.1", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 1b86f39dac..9c8f5bf053 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + # [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 965f1ea458..81c3ab800d 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.33.0", + "version": "3.33.1", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 3233d01ff6..a435d3df74 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/tools + # [3.33.0](https://github.com/cornerstonejs/cornerstone3D/compare/v3.32.13...v3.33.0) (2025-08-20) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index d74aa7fd7c..8f43caa379 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.33.0", + "version": "3.33.1", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 785b339bae5cb49b1e843cc3504a5516dfadc84a Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 21 Aug 2025 17:26:13 +0000 Subject: [PATCH 192/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 99ff901eab..53b6f358bb 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.0'; +export const version = '3.33.1'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 99ff901eab..53b6f358bb 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.0'; +export const version = '3.33.1'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 99ff901eab..53b6f358bb 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.0'; +export const version = '3.33.1'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 99ff901eab..53b6f358bb 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.0'; +export const version = '3.33.1'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 99ff901eab..53b6f358bb 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.0'; +export const version = '3.33.1'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 99ff901eab..53b6f358bb 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.0'; +export const version = '3.33.1'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 99ff901eab..53b6f358bb 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.0'; +export const version = '3.33.1'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 99ff901eab..53b6f358bb 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.0'; +export const version = '3.33.1'; From 69cb561f9e2b95fd8756a94e5303879a87e93ba8 Mon Sep 17 00:00:00 2001 From: Ibrahim <93064150+IbrahimCSAE@users.noreply.github.com> Date: Thu, 21 Aug 2025 16:33:15 -0400 Subject: [PATCH 193/212] fix jpeg lossless (#2285) --- .../src/shared/decoders/decodeJPEGLossless.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/dicomImageLoader/src/shared/decoders/decodeJPEGLossless.ts b/packages/dicomImageLoader/src/shared/decoders/decodeJPEGLossless.ts index 2b50974bdd..69fdc88a68 100644 --- a/packages/dicomImageLoader/src/shared/decoders/decodeJPEGLossless.ts +++ b/packages/dicomImageLoader/src/shared/decoders/decodeJPEGLossless.ts @@ -3,7 +3,7 @@ import type { Types } from '@cornerstonejs/core'; import type { WebWorkerDecodeConfig } from '../../types'; const local = { - jpeg: undefined, + DecoderClass: undefined, decodeConfig: {} as WebWorkerDecodeConfig, }; @@ -12,14 +12,13 @@ export function initialize( ): Promise { local.decodeConfig = decodeConfig; - if (local.jpeg) { + if (local.DecoderClass) { return Promise.resolve(); } return new Promise((resolve, reject) => { import('jpeg-lossless-decoder-js').then(({ Decoder }) => { - const decoder = new Decoder(); - local.jpeg = decoder; + local.DecoderClass = Decoder; resolve(); }, reject); }); @@ -32,13 +31,16 @@ async function decodeJPEGLossless( await initialize(); // check to make sure codec is loaded - if (typeof local.jpeg === 'undefined') { + if (typeof local.DecoderClass === 'undefined') { throw new Error('No JPEG Lossless decoder loaded'); } + // Create a new decoder instance for each decode operation to ensure thread safety + const decoder = new local.DecoderClass(); + const byteOutput = imageFrame.bitsAllocated <= 8 ? 1 : 2; const buffer = pixelData.buffer; - const decompressedData = local.jpeg.decode( + const decompressedData = decoder.decode( buffer, pixelData.byteOffset, pixelData.length, From 7678ede8283cc5c4e6a1e1e43af7086aa584e9e0 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 21 Aug 2025 20:37:27 +0000 Subject: [PATCH 194/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 4848cd44fe..e9a44a79ec 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -26df8d5c91aa8bb7347d8862a3169a4ce5581fd7 \ No newline at end of file +69cb561f9e2b95fd8756a94e5303879a87e93ba8 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 1db76b6a3a..b38dce332c 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.1", - "@cornerstonejs/tools": "^3.33.1" + "@cornerstonejs/core": "^3.33.2", + "@cornerstonejs/tools": "^3.33.2" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 966898c61f..7a382fc24a 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.1", - "@cornerstonejs/tools": "^3.33.1" + "@cornerstonejs/core": "^3.33.2", + "@cornerstonejs/tools": "^3.33.2" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index c2222904e1..b88dcddf76 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.1", + "@cornerstonejs/core": "^3.33.2", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 6a55d3fa73..c5ff8c269d 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.33.1", - "@cornerstonejs/core": "^3.33.1", - "@cornerstonejs/dicom-image-loader": "^3.33.1", - "@cornerstonejs/nifti-volume-loader": "^3.33.1", - "@cornerstonejs/tools": "^3.33.1", + "@cornerstonejs/adapters": "^3.33.2", + "@cornerstonejs/core": "^3.33.2", + "@cornerstonejs/dicom-image-loader": "^3.33.2", + "@cornerstonejs/nifti-volume-loader": "^3.33.2", + "@cornerstonejs/tools": "^3.33.2", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 95387057f7..950ccba57b 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.1", - "@cornerstonejs/tools": "^3.33.1", + "@cornerstonejs/core": "^3.33.2", + "@cornerstonejs/tools": "^3.33.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 68fdb6c695..d912a8c4c5 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.1" + "@cornerstonejs/core": "^3.33.2" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 81c3ab800d..b466df55e6 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.1", - "@cornerstonejs/tools": "^3.33.1", + "@cornerstonejs/core": "^3.33.2", + "@cornerstonejs/tools": "^3.33.2", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 8f43caa379..79a3953688 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.1", + "@cornerstonejs/core": "^3.33.2", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 21096ca19b..b7682e32ca 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.33.1", - "commit": "26df8d5c91aa8bb7347d8862a3169a4ce5581fd7" + "version": "3.33.2", + "commit": "69cb561f9e2b95fd8756a94e5303879a87e93ba8" } \ No newline at end of file diff --git a/version.txt b/version.txt index f23e955883..2f6370ced6 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.33.1 \ No newline at end of file +3.33.2 \ No newline at end of file From 3d796c889ebfe2dc5dbd7c3a17c22af047778615 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 21 Aug 2025 20:37:41 +0000 Subject: [PATCH 195/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 4 ++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 45 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e3dd5f013..979081ebbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) + +**Note:** Version bump only for package root + ## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index 5b58bb4eb7..e66074a4b1 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.33.1", + "version": "3.33.2", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 35e60faaaf..f51886c090 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index b38dce332c..1f75b47a16 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.33.1", + "version": "3.33.2", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 5783c2b12f..4b624039f2 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 7a382fc24a..98a42df43c 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.33.1", + "version": "3.33.2", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 11865b95aa..8795d75966 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 064cfd027a..012b0eb0ba 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.33.1", + "version": "3.33.2", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 8485309c54..bfb37f911d 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index b88dcddf76..692c1a71fe 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.33.1", + "version": "3.33.2", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index fa17293ac0..0d547e4169 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 950ccba57b..cf762fdbf7 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.33.1", + "version": "3.33.2", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index bbb666166a..be7e04b757 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index d912a8c4c5..f20389225a 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.33.1", + "version": "3.33.2", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 9c8f5bf053..9dde9296b7 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index b466df55e6..a1cdd425cc 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.33.1", + "version": "3.33.2", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index a435d3df74..47c6e9f9dc 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.33.1](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.0...v3.33.1) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 79a3953688..9485bd2b55 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.33.1", + "version": "3.33.2", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From c0c84706eacc78339c62019ca6870c58e93ba456 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Thu, 21 Aug 2025 20:37:50 +0000 Subject: [PATCH 196/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 53b6f358bb..953a505bc7 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.1'; +export const version = '3.33.2'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 53b6f358bb..953a505bc7 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.1'; +export const version = '3.33.2'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 53b6f358bb..953a505bc7 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.1'; +export const version = '3.33.2'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 53b6f358bb..953a505bc7 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.1'; +export const version = '3.33.2'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 53b6f358bb..953a505bc7 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.1'; +export const version = '3.33.2'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 53b6f358bb..953a505bc7 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.1'; +export const version = '3.33.2'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 53b6f358bb..953a505bc7 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.1'; +export const version = '3.33.2'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 53b6f358bb..953a505bc7 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.1'; +export const version = '3.33.2'; From ca0e3ccf1ee068a03df7c1c97830c6328d701204 Mon Sep 17 00:00:00 2001 From: Salim Kanoun Date: Fri, 22 Aug 2025 15:34:01 +0200 Subject: [PATCH 197/212] test: add tests for circle and rectangle start stop (#2280) * add tests * fix --- packages/tools/test/CircleROIStartEnd_test.js | 208 ++++++++++++++++++ .../tools/test/RectangleROIStartEnd_test.js | 191 ++++++++++++++++ 2 files changed, 399 insertions(+) create mode 100644 packages/tools/test/CircleROIStartEnd_test.js create mode 100644 packages/tools/test/RectangleROIStartEnd_test.js diff --git a/packages/tools/test/CircleROIStartEnd_test.js b/packages/tools/test/CircleROIStartEnd_test.js new file mode 100644 index 0000000000..850b9447d4 --- /dev/null +++ b/packages/tools/test/CircleROIStartEnd_test.js @@ -0,0 +1,208 @@ +import * as cornerstone3D from '@cornerstonejs/core'; +import * as csTools3d from '../src/index'; +import * as testUtils from '../../../utils/test/testUtils'; + +const { + cache, + RenderingEngine, + Enums, + utilities, + imageLoader, + metaData, + eventTarget, + volumeLoader, + setVolumesForViewports, + getEnabledElement, +} = cornerstone3D; + +const { Events, ViewportType } = Enums; +const { registerVolumeLoader, createAndCacheVolume } = volumeLoader; + +const { + CircleROIStartEndThresholdTool, + ToolGroupManager, + cancelActiveManipulations, + annotation, + Enums: csToolsEnums, +} = csTools3d; + +const { Events: csToolsEvents } = csToolsEnums; + +const { + fakeImageLoader, + fakeVolumeLoader, + fakeMetaDataProvider, + createNormalizedMouseEvent, +} = testUtils; + +const renderingEngineId = utilities.uuidv4(); + +const viewportId = 'VIEWPORT'; + +const AXIAL = 'AXIAL'; + +const volumeId = testUtils.encodeVolumeIdInfo({ + loader: 'fakeVolumeLoader', + name: 'volumeURI', + rows: 100, + columns: 100, + slices: 4, + xSpacing: 1, + ySpacing: 1, + zSpacing: 1, +}); + +describe('Circle Start End Tool: ', () => { + let renderingEngine; + let toolGroup; + + beforeEach(function () { + const testEnv = testUtils.setupTestEnvironment({ + renderingEngineId, + toolGroupIds: ['volume'], + viewportIds: [viewportId], + tools: [CircleROIStartEndThresholdTool], + toolConfigurations: { + [CircleROIStartEndThresholdTool.toolName]: { + configuration: { volumeId: volumeId }, + }, + }, + toolActivations: { + [CircleROIStartEndThresholdTool.toolName]: { + bindings: [{ mouseButton: 1 }], + }, + }, + }); + renderingEngine = testEnv.renderingEngine; + toolGroup = testEnv.toolGroups['volume']; + }); + + afterEach(function () { + testUtils.cleanupTestEnvironment({ + renderingEngineId: renderingEngineId, + toolGroupIds: ['volume'], + cleanupDOMElements: true, + }); + }); + + it('Should successfully create a circle start end tool on a canvas with mouse drag - 512 x 128', function (done) { + const element = testUtils.createViewports(renderingEngine, { + viewportId, + viewportType: ViewportType.ORTHOGRAPHIC, + width: 512, + height: 128, + }); + + const volumeId = testUtils.encodeVolumeIdInfo({ + loader: 'fakeVolumeLoader', + name: 'volumeURI', + rows: 100, + columns: 100, + slices: 10, + xSpacing: 1, + ySpacing: 1, + zSpacing: 1, + }); + + const vp = renderingEngine.getViewport(viewportId); + + const addEventListenerForAnnotationRendered = () => { + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const circleAnnotations = annotation.state.getAnnotations( + CircleROIStartEndThresholdTool.toolName, + element + ); + expect(circleAnnotations).toBeDefined(); + expect(circleAnnotations.length).toBe(1); + + const circleAnnotation = circleAnnotations[0]; + //expect(circleAnnotation.metadata.referencedImageId).toBe(imageId1); + expect(circleAnnotation.metadata.toolName).toBe( + CircleROIStartEndThresholdTool.toolName + ); + expect(circleAnnotation.invalidated).toBe(false); + + const data = circleAnnotation.data.cachedStats; + const targets = Array.from(Object.keys(data)); + expect(targets.length).toBe(3); + expect(data.pointsInVolume).toBeInstanceOf(Array); + + // the rectangle is drawn on the strip + expect(data.statistics.mean).toBeCloseTo(28.33); + + annotation.state.removeAnnotation(circleAnnotation.annotationUID); + done(); + }); + }; + + element.addEventListener(Events.IMAGE_RENDERED, () => { + // Since circle draws from center to out, we are picking a very center + // point in the image (strip is 255 from 10-15 in X and from 0-64 in Y) + const index1 = [12, 30, 0]; + const index2 = [14, 30, 0]; + + if (!vp.getImageData()) { + return; + } + + const { imageData } = vp.getImageData(); + + const { + pageX: pageX1, + pageY: pageY1, + clientX: clientX1, + clientY: clientY1, + worldCoord: worldCoord1, + } = testUtils.createNormalizedMouseEvent(imageData, index1, element, vp); + + const { + pageX: pageX2, + pageY: pageY2, + clientX: clientX2, + clientY: clientY2, + worldCoord: worldCoord2, + } = testUtils.createNormalizedMouseEvent(imageData, index2, element, vp); + + // Mouse Down + let evt = new MouseEvent('mousedown', { + target: element, + buttons: 1, + clientX: clientX1, + clientY: clientY1, + pageX: pageX1, + pageY: pageY1, + }); + element.dispatchEvent(evt); + + // Mouse move to put the end somewhere else + evt = new MouseEvent('mousemove', { + target: element, + buttons: 1, + clientX: clientX2, + clientY: clientY2, + pageX: pageX2, + pageY: pageY2, + }); + document.dispatchEvent(evt); + + // Mouse Up instantly after + evt = new MouseEvent('mouseup'); + + addEventListenerForAnnotationRendered(); + document.dispatchEvent(evt); + }); + + try { + createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { + setVolumesForViewports( + renderingEngine, + [{ volumeId: volumeId }], + [viewportId] + ); + vp.render(); + }); + } catch (e) { + done.fail(e); + } + }); +}); diff --git a/packages/tools/test/RectangleROIStartEnd_test.js b/packages/tools/test/RectangleROIStartEnd_test.js new file mode 100644 index 0000000000..7f8275e5af --- /dev/null +++ b/packages/tools/test/RectangleROIStartEnd_test.js @@ -0,0 +1,191 @@ +import * as cornerstone3D from '@cornerstonejs/core'; +import * as csTools3d from '../src/index'; +import * as testUtils from '../../../utils/test/testUtils'; +import { performMouseDownAndUp } from '../../../utils/test/testUtilsMouseEvents'; +import { + encodeImageIdInfo, + createViewports, +} from '../../../utils/test/testUtils'; + +const { + cache, + RenderingEngine, + Enums, + utilities, + imageLoader, + eventTarget, + metaData, + volumeLoader, + setVolumesForViewports, +} = cornerstone3D; + +const { Events, ViewportType } = Enums; + +const { + RectangleROIStartEndThresholdTool, + ToolGroupManager, + Enums: csToolsEnums, + cancelActiveManipulations, + annotation, +} = csTools3d; + +const { Events: csToolsEvents } = csToolsEnums; + +const { + fakeImageLoader, + fakeVolumeLoader, + fakeMetaDataProvider, + createNormalizedMouseEvent, +} = testUtils; + +const renderingEngineId = utilities.uuidv4(); + +const viewportId = 'VIEWPORT'; + +const volumeId = testUtils.encodeVolumeIdInfo({ + loader: 'fakeVolumeLoader', + name: 'volumeURI', + rows: 100, + columns: 100, + slices: 4, + xSpacing: 1, + ySpacing: 1, +}); + +describe('Rectangle ROI StartEnd Tool:', () => { + let testEnv; + let renderingEngine; + + beforeAll(() => { + cornerstone3D.setUseCPURendering(false); + }); + + beforeEach(function () { + testEnv = testUtils.setupTestEnvironment({ + renderingEngineId: renderingEngineId, + toolGroupIds: ['volume'], + tools: [RectangleROIStartEndThresholdTool], + toolActivations: { + [RectangleROIStartEndThresholdTool.toolName]: { + bindings: [{ mouseButton: 1 }], + }, + }, + viewportIds: [viewportId], + }); + + renderingEngine = testEnv.renderingEngine; + }); + + afterEach(function () { + testUtils.cleanupTestEnvironment({ + renderingEngineId: renderingEngineId, + toolGroupIds: ['volume'], + cleanupDOMElements: true, + }); + }); + + it('Should successfully create a rectangle tool on a canvas with mouse drag in a Volume viewport - 512 x 128', function (done) { + const element = createViewports(renderingEngine, { + viewportType: ViewportType.ORTHOGRAPHIC, + width: 512, + height: 128, + viewportId: viewportId, + }); + + const vp = renderingEngine.getViewport(viewportId); + + const addEventListenerForAnnotationRendered = () => { + element.addEventListener(csToolsEvents.ANNOTATION_RENDERED, () => { + const rectangleAnnotations = annotation.state.getAnnotations( + RectangleROIStartEndThresholdTool.toolName, + element + ); + // Can successfully add rectangleROI to annotationManager + expect(rectangleAnnotations).toBeDefined(); + expect(rectangleAnnotations.length).toBe(1); + + const rectangleAnnotation = rectangleAnnotations[0]; + expect(rectangleAnnotation.metadata.toolName).toBe( + RectangleROIStartEndThresholdTool.toolName + ); + expect(rectangleAnnotation.invalidated).toBe(false); + + const data = rectangleAnnotation.data.cachedStats; + const targets = Array.from(Object.keys(data)); + expect(targets.length).toBe(4); + expect(data.statistics.mean).toBe(85); + expect(data.statistics.stdDev).toBeCloseTo(120.208); + + annotation.state.removeAnnotation(rectangleAnnotation.annotationUID); + done(); + }); + }; + + element.addEventListener(Events.IMAGE_RENDERED, () => { + // Inside the strip which is from 50-75 in slice 2 + // volumeURI_100_100_4_1_1_1_0 + // The strip is from + const index1 = [50, 10, 2]; + const index2 = [52, 20, 2]; + + const { imageData } = vp.getImageData(); + + const { + pageX: pageX1, + pageY: pageY1, + clientX: clientX1, + clientY: clientY1, + worldCoord: worldCoord1, + } = createNormalizedMouseEvent(imageData, index1, element, vp); + + const { + pageX: pageX2, + pageY: pageY2, + clientX: clientX2, + clientY: clientY2, + worldCoord: worldCoord2, + } = createNormalizedMouseEvent(imageData, index2, element, vp); + + // Mouse Down + let evt = new MouseEvent('mousedown', { + target: element, + buttons: 1, + clientX: clientX1, + clientY: clientY1, + pageX: pageX1, + pageY: pageY1, + }); + element.dispatchEvent(evt); + + // Mouse move to put the end somewhere else + evt = new MouseEvent('mousemove', { + target: element, + buttons: 1, + clientX: clientX2, + clientY: clientY2, + pageX: pageX2, + pageY: pageY2, + }); + document.dispatchEvent(evt); + + // Mouse Up instantly after + evt = new MouseEvent('mouseup'); + + addEventListenerForAnnotationRendered(); + document.dispatchEvent(evt); + }); + + try { + volumeLoader.createAndCacheVolume(volumeId, { imageIds: [] }).then(() => { + setVolumesForViewports( + renderingEngine, + [{ volumeId: volumeId }], + [viewportId] + ); + vp.render(); + }); + } catch (e) { + done.fail(e); + } + }); +}); From 0dfeefcfe67e1818db3015f1d4081cbf7035e10b Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 22 Aug 2025 13:37:45 +0000 Subject: [PATCH 198/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index e9a44a79ec..70b793debf 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -69cb561f9e2b95fd8756a94e5303879a87e93ba8 \ No newline at end of file +ca0e3ccf1ee068a03df7c1c97830c6328d701204 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 1f75b47a16..dad58b78e3 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.2", - "@cornerstonejs/tools": "^3.33.2" + "@cornerstonejs/core": "^3.33.3", + "@cornerstonejs/tools": "^3.33.3" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 98a42df43c..5779d391fe 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.2", - "@cornerstonejs/tools": "^3.33.2" + "@cornerstonejs/core": "^3.33.3", + "@cornerstonejs/tools": "^3.33.3" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 692c1a71fe..d92f35483a 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.2", + "@cornerstonejs/core": "^3.33.3", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index c5ff8c269d..ebf353e6f2 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.33.2", - "@cornerstonejs/core": "^3.33.2", - "@cornerstonejs/dicom-image-loader": "^3.33.2", - "@cornerstonejs/nifti-volume-loader": "^3.33.2", - "@cornerstonejs/tools": "^3.33.2", + "@cornerstonejs/adapters": "^3.33.3", + "@cornerstonejs/core": "^3.33.3", + "@cornerstonejs/dicom-image-loader": "^3.33.3", + "@cornerstonejs/nifti-volume-loader": "^3.33.3", + "@cornerstonejs/tools": "^3.33.3", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index cf762fdbf7..b71d995882 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.2", - "@cornerstonejs/tools": "^3.33.2", + "@cornerstonejs/core": "^3.33.3", + "@cornerstonejs/tools": "^3.33.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index f20389225a..584c6946d6 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.2" + "@cornerstonejs/core": "^3.33.3" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index a1cdd425cc..47bdd6f7e8 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.2", - "@cornerstonejs/tools": "^3.33.2", + "@cornerstonejs/core": "^3.33.3", + "@cornerstonejs/tools": "^3.33.3", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 9485bd2b55..41ffa40179 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.2", + "@cornerstonejs/core": "^3.33.3", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index b7682e32ca..3c0f516c8b 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.33.2", - "commit": "69cb561f9e2b95fd8756a94e5303879a87e93ba8" + "version": "3.33.3", + "commit": "ca0e3ccf1ee068a03df7c1c97830c6328d701204" } \ No newline at end of file diff --git a/version.txt b/version.txt index 2f6370ced6..6f39fa28bf 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.33.2 \ No newline at end of file +3.33.3 \ No newline at end of file From 80af804bbb7965528ef571c7d2f28c4a42422f74 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 22 Aug 2025 13:37:59 +0000 Subject: [PATCH 199/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 4 ++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 45 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 979081ebbc..bb2d3d5505 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) + +**Note:** Version bump only for package root + ## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index e66074a4b1..8df95a3d7b 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.33.2", + "version": "3.33.3", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index f51886c090..6c6cb0c002 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index dad58b78e3..22efc05195 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.33.2", + "version": "3.33.3", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 4b624039f2..8d7a32f5b5 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 5779d391fe..20f10396c9 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.33.2", + "version": "3.33.3", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 8795d75966..cdce214ddd 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 012b0eb0ba..0b13a45737 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.33.2", + "version": "3.33.3", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index bfb37f911d..444c63c40e 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index d92f35483a..13eb53cdcb 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.33.2", + "version": "3.33.3", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index 0d547e4169..d71cdf9d5d 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index b71d995882..0c1882055b 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.33.2", + "version": "3.33.3", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index be7e04b757..c43faa1a7f 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 584c6946d6..e1d681a809 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.33.2", + "version": "3.33.3", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index 9dde9296b7..ef788bd675 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 47bdd6f7e8..ec945ccaff 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.33.2", + "version": "3.33.3", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 47c6e9f9dc..68c4b57068 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.33.2](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.1...v3.33.2) (2025-08-21) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 41ffa40179..9fa8bc9733 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.33.2", + "version": "3.33.3", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 81ada0d6816171e149f504f9dc73f34f7e03c243 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 22 Aug 2025 13:38:09 +0000 Subject: [PATCH 200/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 953a505bc7..6606400000 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.2'; +export const version = '3.33.3'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 953a505bc7..6606400000 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.2'; +export const version = '3.33.3'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 953a505bc7..6606400000 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.2'; +export const version = '3.33.3'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 953a505bc7..6606400000 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.2'; +export const version = '3.33.3'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 953a505bc7..6606400000 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.2'; +export const version = '3.33.3'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 953a505bc7..6606400000 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.2'; +export const version = '3.33.3'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 953a505bc7..6606400000 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.2'; +export const version = '3.33.3'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 953a505bc7..6606400000 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.2'; +export const version = '3.33.3'; From 14f90bcc166f4f62f37f6f0673ae8516205b2305 Mon Sep 17 00:00:00 2001 From: Alireza Date: Fri, 22 Aug 2025 11:38:09 -0400 Subject: [PATCH 201/212] chore: add manipulation to color (#2279) * chore: add manipulation to color * add invert --- packages/core/examples/webLoader/index.ts | 38 +++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/packages/core/examples/webLoader/index.ts b/packages/core/examples/webLoader/index.ts index 6f6580dbd3..bda596a4be 100644 --- a/packages/core/examples/webLoader/index.ts +++ b/packages/core/examples/webLoader/index.ts @@ -8,10 +8,13 @@ import { setVolumesForViewports, volumeLoader, } from '@cornerstonejs/core'; +import { LengthTool, ToolGroupManager } from '@cornerstonejs/tools'; import { initDemo, setTitleAndDescription, addSliderToToolbar, + addManipulationBindings, + addButtonToToolbar, } from '../../../../utils/demo/helpers'; import hardcodedMetaDataProvider from './hardcodedMetaDataProvider'; import registerWebImageLoader from './registerWebImageLoader'; @@ -23,6 +26,8 @@ console.warn( const { ViewportType } = Enums; +const toolGroupId = 'toolGroup'; + // ======== Set up page ======== // setTitleAndDescription( 'Web Color Images', @@ -67,6 +72,11 @@ content.appendChild(element1); content.appendChild(paraElement); content.appendChild(rowElement); +element1.oncontextmenu = (e) => e.preventDefault(); +element2.oncontextmenu = (e) => e.preventDefault(); +element3.oncontextmenu = (e) => e.preventDefault(); +element4.oncontextmenu = (e) => e.preventDefault(); + const renderingEngineId = 'myRenderingEngine'; const viewportId = 'COLOR_STACK'; @@ -111,12 +121,35 @@ addSliderToToolbar({ viewport.render(); }, }); + +addButtonToToolbar({ + title: 'Invert', + onClick: () => { + // Get the rendering engine + const renderingEngine = getRenderingEngine(renderingEngineId); + + // Get the volume viewport + const viewport = renderingEngine.getViewport( + viewportId + ) as Types.IVolumeViewport; + + const { invert } = viewport.getProperties(); + + viewport.setProperties({ invert: !invert }); + + viewport.render(); + }, +}); + /** * Runs the demo */ async function run() { // Init Cornerstone and related libraries await initDemo(); + // Define tool groups to add the segmentation display tool to + const toolGroup = ToolGroupManager.createToolGroup(toolGroupId); + addManipulationBindings(toolGroup); metaData.addProvider( // @ts-ignore @@ -156,6 +189,11 @@ async function run() { }, ]; + toolGroup.addViewport('COLOR_STACK', renderingEngineId); + toolGroup.addViewport('COLOR_VOLUME_1', renderingEngineId); + toolGroup.addViewport('COLOR_VOLUME_2', renderingEngineId); + toolGroup.addViewport('COLOR_VOLUME_3', renderingEngineId); + const volumeId = 'cornerstoneStreamingImageVolume:COLOR_VOLUME'; const volume = await volumeLoader.createAndCacheVolume(volumeId, { From 83a65be57e3ecdeebaf2a52acd82c19d2c0eb8db Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 22 Aug 2025 15:42:01 +0000 Subject: [PATCH 202/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 70b793debf..2fabb3dee6 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -ca0e3ccf1ee068a03df7c1c97830c6328d701204 \ No newline at end of file +14f90bcc166f4f62f37f6f0673ae8516205b2305 \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 22efc05195..ab2af0c8fe 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.3", - "@cornerstonejs/tools": "^3.33.3" + "@cornerstonejs/core": "^3.33.4", + "@cornerstonejs/tools": "^3.33.4" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index 20f10396c9..c6801667fc 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.3", - "@cornerstonejs/tools": "^3.33.3" + "@cornerstonejs/core": "^3.33.4", + "@cornerstonejs/tools": "^3.33.4" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 13eb53cdcb..c17edb8adb 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.3", + "@cornerstonejs/core": "^3.33.4", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index ebf353e6f2..f43e9fff01 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.33.3", - "@cornerstonejs/core": "^3.33.3", - "@cornerstonejs/dicom-image-loader": "^3.33.3", - "@cornerstonejs/nifti-volume-loader": "^3.33.3", - "@cornerstonejs/tools": "^3.33.3", + "@cornerstonejs/adapters": "^3.33.4", + "@cornerstonejs/core": "^3.33.4", + "@cornerstonejs/dicom-image-loader": "^3.33.4", + "@cornerstonejs/nifti-volume-loader": "^3.33.4", + "@cornerstonejs/tools": "^3.33.4", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 0c1882055b..381993147b 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.3", - "@cornerstonejs/tools": "^3.33.3", + "@cornerstonejs/core": "^3.33.4", + "@cornerstonejs/tools": "^3.33.4", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index e1d681a809..c93e8b1bab 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.3" + "@cornerstonejs/core": "^3.33.4" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index ec945ccaff..c7427fbebf 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.3", - "@cornerstonejs/tools": "^3.33.3", + "@cornerstonejs/core": "^3.33.4", + "@cornerstonejs/tools": "^3.33.4", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index 9fa8bc9733..9da89437af 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.3", + "@cornerstonejs/core": "^3.33.4", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 3c0f516c8b..402fdf1d72 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.33.3", - "commit": "ca0e3ccf1ee068a03df7c1c97830c6328d701204" + "version": "3.33.4", + "commit": "14f90bcc166f4f62f37f6f0673ae8516205b2305" } \ No newline at end of file diff --git a/version.txt b/version.txt index 6f39fa28bf..b7ac2a5991 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.33.3 \ No newline at end of file +3.33.4 \ No newline at end of file From 31c712eb1a5cad3bf5a4f4b04a269582cc45ebc1 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 22 Aug 2025 15:42:14 +0000 Subject: [PATCH 203/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 4 ++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 4 ++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 4 ++++ packages/tools/package.json | 2 +- 18 files changed, 45 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb2d3d5505..0ae2d8f725 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) + +**Note:** Version bump only for package root + ## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index 8df95a3d7b..eb9d8d98c9 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.33.3", + "version": "3.33.4", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index 6c6cb0c002..e49b53c5cd 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index ab2af0c8fe..2f2f73dfa5 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.33.3", + "version": "3.33.4", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 8d7a32f5b5..fd5b765f92 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index c6801667fc..e988be8896 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.33.3", + "version": "3.33.4", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index cdce214ddd..6b80a4d97f 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/core + ## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index 0b13a45737..b2adbe0d8a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.33.3", + "version": "3.33.4", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index 444c63c40e..a3b070cc12 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index c17edb8adb..f7fc1032be 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.33.3", + "version": "3.33.4", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index d71cdf9d5d..b1e88dc0ab 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 381993147b..f30f3a4958 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.33.3", + "version": "3.33.4", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index c43faa1a7f..63542e3e87 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index c93e8b1bab..9195eb2c7d 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.33.3", + "version": "3.33.4", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index ef788bd675..fef62d248a 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index c7427fbebf..df03ed437b 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.33.3", + "version": "3.33.4", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 68c4b57068..f13e6e8a63 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) + +**Note:** Version bump only for package @cornerstonejs/tools + ## [3.33.3](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.2...v3.33.3) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index 9da89437af..c70d919821 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.33.3", + "version": "3.33.4", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From b88b09753745ab843cb89e4232b19c9018ed075f Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Fri, 22 Aug 2025 15:42:23 +0000 Subject: [PATCH 204/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index 6606400000..f81a521b79 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.3'; +export const version = '3.33.4'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 6606400000..f81a521b79 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.3'; +export const version = '3.33.4'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index 6606400000..f81a521b79 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.3'; +export const version = '3.33.4'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index 6606400000..f81a521b79 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.3'; +export const version = '3.33.4'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index 6606400000..f81a521b79 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.3'; +export const version = '3.33.4'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index 6606400000..f81a521b79 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.3'; +export const version = '3.33.4'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index 6606400000..f81a521b79 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.3'; +export const version = '3.33.4'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index 6606400000..f81a521b79 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.3'; +export const version = '3.33.4'; From 5188285b2569d44f485a9591d28add93df73667d Mon Sep 17 00:00:00 2001 From: Celian-abd <101793092+Celian-abd@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:56:22 +0200 Subject: [PATCH 205/212] fix: projection point (#2254) --- .../CircleROIStartEndThresholdTool.ts | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/packages/tools/src/tools/segmentation/CircleROIStartEndThresholdTool.ts b/packages/tools/src/tools/segmentation/CircleROIStartEndThresholdTool.ts index 23cb8d1bc8..f97da395e2 100644 --- a/packages/tools/src/tools/segmentation/CircleROIStartEndThresholdTool.ts +++ b/packages/tools/src/tools/segmentation/CircleROIStartEndThresholdTool.ts @@ -578,7 +578,6 @@ class CircleROIStartEndThresholdTool extends CircleROITool { return renderStatus; }; - //Now works for axial, sagitall and coronal _computeProjectionPoints( annotation: CircleROIStartEndThresholdAnnotation, imageVolume: Types.IImageVolume @@ -588,44 +587,47 @@ class CircleROIStartEndThresholdTool extends CircleROITool { const { startCoordinate, endCoordinate } = data; const { points } = data.handles; - const handlesToStart = csUtils.deepClone(points) as Types.Point3[]; + const projectionAxisIndex = + this._getIndexOfCoordinatesForViewplaneNormal(viewPlaneNormal); const startWorld = vec3.clone(points[0]); + startWorld[projectionAxisIndex] = startCoordinate; + const endWorld = vec3.clone(points[0]); - const indexOfNormal = - this._getIndexOfCoordinatesForViewplaneNormal(viewPlaneNormal); + endWorld[projectionAxisIndex] = endCoordinate; - startWorld[indexOfNormal] = startCoordinate; - endWorld[indexOfNormal] = endCoordinate; + const direction = vec3.create(); + vec3.subtract(direction, endWorld, startWorld); + + const distance = vec3.length(direction); + + if (distance === 0) { + const handlesOnStartPlane = points.map(p => { + const newPoint = vec3.clone(p as vec3); + newPoint[projectionAxisIndex] = startCoordinate; + return Array.from(newPoint) as Types.Point3; + }); + data.cachedStats.projectionPoints = [handlesOnStartPlane]; + return; + } - handlesToStart.forEach((handlePoint) => { - handlePoint[indexOfNormal] = startCoordinate; - }); + vec3.normalize(direction, direction); - // distance between start and end slice in the world coordinate - const distance = vec3.distance(startWorld, endWorld); + const handlesToStart = csUtils.deepClone(points) as typeof points; + handlesToStart[0][projectionAxisIndex] = startCoordinate; + handlesToStart[1][projectionAxisIndex] = startCoordinate; - // for each point inside points, navigate in the direction of the viewPlaneNormal - // with amount of spacingInNormal, and calculate the next slice until we reach the distance const newProjectionPoints = []; - if (distance >= 0) { - newProjectionPoints.push( - handlesToStart.map((p) => Array.from(p as vec3)) - ); - } - for ( - let dist = spacingInNormal; - dist <= distance; - dist += spacingInNormal - ) { + for (let dist = 0; dist <= distance + 1e-6; dist += spacingInNormal) { newProjectionPoints.push( handlesToStart.map((point) => { const newPoint = vec3.create(); - vec3.scaleAndAdd(newPoint, point as vec3, viewPlaneNormal, dist); - return Array.from(newPoint); + vec3.scaleAndAdd(newPoint, point as vec3, direction, dist); + return Array.from(newPoint) as Types.Point3; }) ); } + data.cachedStats.projectionPoints = newProjectionPoints; } @@ -673,8 +675,8 @@ class CircleROIStartEndThresholdTool extends CircleROITool { const aspect = getCalibratedAspect(image); const area = Math.abs( Math.PI * - (worldWidth / measureInfo.scale / 2) * - (worldHeight / aspect / measureInfo.scale / 2) + (worldWidth / measureInfo.scale / 2) * + (worldHeight / aspect / measureInfo.scale / 2) ); const modalityUnitOptions = { From beb9d5b502dabd7e5bd1d2c1bf1a8842bae08ebf Mon Sep 17 00:00:00 2001 From: Celian-abd <101793092+Celian-abd@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:59:14 +0200 Subject: [PATCH 206/212] fix(StartEndThresholdTools): Fix pointInsideVolumes calculation when multiples toolgroups (#2221) * debug threshold tools for tmtv * fix prettier * fix --- packages/core/examples/tmtv/index.ts | 991 ++++++++++++++++++ .../CircleROIStartEndThresholdTool.ts | 26 +- .../RectangleROIStartEndThresholdTool.ts | 20 +- packages/tools/src/types/AnnotationTypes.ts | 3 + 4 files changed, 1033 insertions(+), 7 deletions(-) create mode 100644 packages/core/examples/tmtv/index.ts diff --git a/packages/core/examples/tmtv/index.ts b/packages/core/examples/tmtv/index.ts new file mode 100644 index 0000000000..aa06441d32 --- /dev/null +++ b/packages/core/examples/tmtv/index.ts @@ -0,0 +1,991 @@ +import type { Types } from '@cornerstonejs/core'; +import { + RenderingEngine, + Enums, + setVolumesForViewports, + volumeLoader, + getRenderingEngine, + cache +} from '@cornerstonejs/core'; +import { + initDemo, + createImageIdsAndCacheMetaData, + setTitleAndDescription, + setPetColorMapTransferFunctionForVolumeActor, + setPetTransferFunctionForVolumeActor, + setCtTransferFunctionForVolumeActor, + addDropdownToToolbar, + addButtonToToolbar +} from '../../../../utils/demo/helpers'; +import * as cornerstoneTools from '@cornerstonejs/tools'; + +const { + ToolGroupManager, + Enums: csToolsEnums, + WindowLevelTool, + PanTool, + ZoomTool, + StackScrollTool, + synchronizers, + MIPJumpToClickTool, + CrosshairsTool, + TrackballRotateTool, + VolumeRotateTool, + RectangleROITool, + CircleROIStartEndThresholdTool, + RectangleROIStartEndThresholdTool, + segmentation +} = cornerstoneTools; + +const { MouseBindings } = csToolsEnums; +const { ViewportType, BlendModes } = Enums; + +const { createCameraPositionSynchronizer, createVOISynchronizer } = + synchronizers; + +// Study IDs +const FirstStudyID = `1.3.6.1.4.1.14519.5.2.1.7009.2403.871108593056125491804754960339`; +const SecondStudyID = + '1.3.6.1.4.1.14519.5.2.1.7009.2403.334240657131972136850343327463'; +const ThirdStudyID = `1.3.6.1.4.1.9328.50.17.15423521354819720574322014551955370036`; + +// Common configuration +let renderingEngine; +const wadoRsRoot = 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb'; +const renderingEngineId = 'myRenderingEngine'; +const volumeLoaderScheme = 'cornerstoneStreamingImageVolume'; + +// Define a unique id for the volume +const volumeName = 'labelmap'; // Id of the volume less loader prefix +const volumeId = `${volumeLoaderScheme}:${volumeName}`; // VolumeId with loader id + volume id + +const segmentationId = 'MY_SEGMENTATION_ID'; + +// Volume IDs for each study +const volumeIds = { + study1: { + ct: `${volumeLoaderScheme}:CT_VOLUME_STUDY1`, + pt: `${volumeLoaderScheme}:PT_VOLUME_STUDY1`, + } +}; + +// Tool group IDs for each study +const toolGroupIds = { + study1: { + ct: 'CT_TOOLGROUP_STUDY1', + pt: 'PT_TOOLGROUP_STUDY1', + fusion: 'FUSION_TOOLGROUP_STUDY1', + mip: 'MIP_TOOLGROUP_STUDY1', + } +}; + +// Viewport IDs for each study +const viewportIds = { + study1: { + CT: { + AXIAL: 'CT_AXIAL_S1', + SAGITTAL: 'CT_SAGITTAL_S1', + CORONAL: 'CT_CORONAL_S1', + }, + PT: { + AXIAL: 'PT_AXIAL_S1', + SAGITTAL: 'PT_SAGITTAL_S1', + CORONAL: 'PT_CORONAL_S1', + }, + FUSION: { + AXIAL: 'FUSION_AXIAL_S1', + SAGITTAL: 'FUSION_SAGITTAL_S1', + CORONAL: 'FUSION_CORONAL_S1', + }, + PETMIP: { CORONAL: 'PET_MIP_CORONAL_S1' }, + } +}; + +// Synchronizer IDs for each study +const synchronizerIds = { + study1: { + axialCamera: 'AXIAL_CAMERA_SYNC_S1', + sagittalCamera: 'SAGITTAL_CAMERA_SYNC_S1', + coronalCamera: 'CORONAL_CAMERA_SYNC_S1', + ctVoi: 'CT_VOI_SYNC_S1', + ptVoi: 'PT_VOI_SYNC_S1', + fusionVoi: 'FUSION_VOI_SYNC_S1', + } +}; + +// Store volumes and synchronizers +const volumes = { + study1: { ct: null, pt: null }, + study2: { ct: null, pt: null }, + study3: { ct: null, pt: null }, +}; + +const allSynchronizers = { + study1: {}, + study2: {}, + study3: {}, +}; + +// Study configurations +const studyConfigs = [ + { + studyId: FirstStudyID, + studyKey: 'study1', + ctSeriesUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.367700692008930469189923116409', + ptSeriesUID: + '1.3.6.1.4.1.14519.5.2.1.7009.2403.780462962868572737240023906400', + } +]; + +// Store DOM elements +const elements = {}; + +// Viewport colors +const viewportColors = {}; + +// Initialize viewport colors for all studies +['study1'].forEach((studyKey) => { + const studyViewportIds = viewportIds[studyKey]; + viewportColors[studyViewportIds.CT.AXIAL] = 'rgb(200, 0, 0)'; + viewportColors[studyViewportIds.CT.SAGITTAL] = 'rgb(200, 200, 0)'; + viewportColors[studyViewportIds.CT.CORONAL] = 'rgb(0, 200, 0)'; + viewportColors[studyViewportIds.PT.AXIAL] = 'rgb(200, 0, 0)'; + viewportColors[studyViewportIds.PT.SAGITTAL] = 'rgb(200, 200, 0)'; + viewportColors[studyViewportIds.PT.CORONAL] = 'rgb(0, 200, 0)'; + viewportColors[studyViewportIds.FUSION.AXIAL] = 'rgb(200, 0, 0)'; + viewportColors[studyViewportIds.FUSION.SAGITTAL] = 'rgb(200, 200, 0)'; + viewportColors[studyViewportIds.FUSION.CORONAL] = 'rgb(0, 200, 0)'; +}); + +// ======== Set up page ======== // +setTitleAndDescription( + 'Multi-Monitor PET-CT', + 'Three studies displayed with PET-CT fusion layout, each with separate tool groups but shared rendering engine' +); + +const optionsValues = [ + ZoomTool.toolName, + WindowLevelTool.toolName, + CrosshairsTool.toolName, + RectangleROITool.toolName, + CircleROIStartEndThresholdTool.toolName, + RectangleROIStartEndThresholdTool.toolName, +]; + +addButtonToToolbar({ + title: 'Run Segmentation', + onClick: () => { + const annotations = cornerstoneTools.annotation.state.getAllAnnotations(); + const labelmapVolume = cache.getVolume(segmentationId); + console.debug(annotations); + annotations.map((annotation, i) => { + // @ts-ignore + const pointsInVolume = annotation.data.cachedStats.pointsInVolume; + for (let i = 0; i < pointsInVolume.length; i++) { + for (let j = 0; j < pointsInVolume[i].length; j++) { + if (pointsInVolume[i][j].value > 2) { + labelmapVolume.voxelManager.setAtIndex( + pointsInVolume[i][j].index, + 1 + ); + } + } + } + }); + + cornerstoneTools.segmentation.triggerSegmentationEvents.triggerSegmentationDataModified( + labelmapVolume.volumeId + ); + labelmapVolume.modified(); + }, +}); + +// ============================= // +addDropdownToToolbar({ + options: { values: optionsValues, defaultValue: ZoomTool.toolName }, + onSelectedValueChange: (toolNameAsStringOrNumber) => { + const toolName = String(toolNameAsStringOrNumber); + + ['study1'].forEach((studyKey) => { + const studyToolGroupIds = toolGroupIds[studyKey]; + [ + studyToolGroupIds.ct, + studyToolGroupIds.pt, + studyToolGroupIds.fusion, + ].forEach((toolGroupId) => { + const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); + + if (toolName === ZoomTool.toolName) { + // Check if viewports are initialized before setting tools + if (renderingEngine && renderingEngine.getViewports().length > 0) { + toolGroup.setToolPassive(CrosshairsTool.toolName); + } + toolGroup.setToolDisabled(WindowLevelTool.toolName); + toolGroup.setToolDisabled(RectangleROITool.toolName); + toolGroup.setToolActive(ZoomTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + } else if (toolName === WindowLevelTool.toolName) { + // Check if viewports are initialized before setting tools + if (renderingEngine && renderingEngine.getViewports().length > 0) { + toolGroup.setToolPassive(CrosshairsTool.toolName); + } + toolGroup.setToolDisabled(ZoomTool.toolName); + toolGroup.setToolDisabled(RectangleROITool.toolName); + toolGroup.setToolActive(WindowLevelTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + } else if (toolName === CrosshairsTool.toolName) { + toolGroup.setToolDisabled(ZoomTool.toolName); + toolGroup.setToolDisabled(WindowLevelTool.toolName); + toolGroup.setToolDisabled(RectangleROITool.toolName); + toolGroup.setToolActive(CrosshairsTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + } else if (toolName === CircleROIStartEndThresholdTool.toolName) { + toolGroup.setToolDisabled(ZoomTool.toolName); + toolGroup.setToolDisabled(WindowLevelTool.toolName); + toolGroup.setToolDisabled(CrosshairsTool.toolName); + toolGroup.setToolDisabled(RectangleROITool.toolName); + toolGroup.setToolActive(CircleROIStartEndThresholdTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + } else if (toolName === RectangleROIStartEndThresholdTool.toolName) { + toolGroup.setToolDisabled(ZoomTool.toolName); + toolGroup.setToolDisabled(WindowLevelTool.toolName); + toolGroup.setToolDisabled(CrosshairsTool.toolName); + toolGroup.setToolDisabled(RectangleROITool.toolName); + toolGroup.setToolDisabled(CircleROIStartEndThresholdTool.toolName); + toolGroup.setToolActive(RectangleROIStartEndThresholdTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + } else { + toolGroup.setToolDisabled(ZoomTool.toolName); + toolGroup.setToolDisabled(WindowLevelTool.toolName); + toolGroup.setToolDisabled(CrosshairsTool.toolName); + toolGroup.setToolActive(RectangleROITool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + } + }); + }); + }, +}); + +const resizeObserver = new ResizeObserver(() => { + renderingEngine = getRenderingEngine(renderingEngineId); + + if (renderingEngine) { + renderingEngine.resize(true, false); + } +}); + +// Helper functions for crosshairs +function getReferenceLineColor(viewportId) { + return viewportColors[viewportId]; +} + +function getReferenceLineControllable(viewportId) { + return true; +} + +function getReferenceLineDraggableRotatable(viewportId) { + return true; +} + +function getReferenceLineSlabThicknessControlsOn(viewportId) { + return true; +} + +// Create viewport grid +function createViewportGrid() { + const viewportGrid = document.createElement('div'); + + viewportGrid.style.display = 'grid'; + viewportGrid.style.gridTemplateRows = `repeat(3, 33.33%)`; + viewportGrid.style.gridTemplateColumns = `repeat(12, 8.33%)`; + viewportGrid.style.width = '200vw'; + viewportGrid.style.height = '95vh'; + viewportGrid.style.gap = '2px'; + + const content = document.getElementById('content'); + content.appendChild(viewportGrid); + + // Create elements for each study + studyConfigs.forEach((config, studyIndex) => { + const studyKey = config.studyKey; + elements[studyKey] = {}; + + // Create 3x3 grid elements for each study + for (let row = 0; row < 3; row++) { + for (let col = 0; col < 3; col++) { + const element = document.createElement('div'); + element.style.width = '100%'; + element.style.height = '100%'; + element.style.border = '1px solid #333'; + element.oncontextmenu = (e) => e.preventDefault(); + + // Position in the overall grid - studies side by side + const gridRow = row + 1; + const gridColumn = studyIndex * 4 + col + 1; + element.style.gridRow = String(gridRow); + element.style.gridColumn = String(gridColumn); + + viewportGrid.appendChild(element); + resizeObserver.observe(element); + + // Store element reference + const elementKey = `element_${row + 1}_${col + 1}`; + elements[studyKey][elementKey] = element; + } + } + + // Create MIP element + const mipElement = document.createElement('div'); + mipElement.style.width = '100%'; + mipElement.style.height = '100%'; + mipElement.style.border = '1px solid #333'; + mipElement.oncontextmenu = (e) => e.preventDefault(); + + // Position MIP in the 4th column of each study, spanning 3 rows + mipElement.style.gridRow = `1 / span 3`; + mipElement.style.gridColumn = String(studyIndex * 4 + 4); + + viewportGrid.appendChild(mipElement); + resizeObserver.observe(mipElement); + elements[studyKey].element_mip = mipElement; + }); + + return viewportGrid; +} + +// Set up tool groups for a study +function setUpToolGroupsForStudy(studyKey) { + const studyToolGroupIds = toolGroupIds[studyKey]; + const studyViewportIds = viewportIds[studyKey]; + const studyVolumeIds = volumeIds[studyKey]; + + // Create tool groups + const ctToolGroup = ToolGroupManager.createToolGroup(studyToolGroupIds.ct); + const ptToolGroup = ToolGroupManager.createToolGroup(studyToolGroupIds.pt); + const fusionToolGroup = ToolGroupManager.createToolGroup( + studyToolGroupIds.fusion + ); + const mipToolGroup = ToolGroupManager.createToolGroup(studyToolGroupIds.mip); + + // Add viewports to tool groups + ctToolGroup.addViewport(studyViewportIds.CT.AXIAL, renderingEngineId); + ctToolGroup.addViewport(studyViewportIds.CT.SAGITTAL, renderingEngineId); + ctToolGroup.addViewport(studyViewportIds.CT.CORONAL, renderingEngineId); + + ptToolGroup.addViewport(studyViewportIds.PT.AXIAL, renderingEngineId); + ptToolGroup.addViewport(studyViewportIds.PT.SAGITTAL, renderingEngineId); + ptToolGroup.addViewport(studyViewportIds.PT.CORONAL, renderingEngineId); + + fusionToolGroup.addViewport(studyViewportIds.FUSION.AXIAL, renderingEngineId); + fusionToolGroup.addViewport( + studyViewportIds.FUSION.SAGITTAL, + renderingEngineId + ); + fusionToolGroup.addViewport( + studyViewportIds.FUSION.CORONAL, + renderingEngineId + ); + + // Add tools to CT and PT groups + [ctToolGroup, ptToolGroup].forEach((toolGroup) => { + toolGroup.addTool(WindowLevelTool.toolName); + toolGroup.addTool(PanTool.toolName); + toolGroup.addTool(ZoomTool.toolName); + toolGroup.addTool(StackScrollTool.toolName); + toolGroup.addTool(CrosshairsTool.toolName, { + getReferenceLineColor, + getReferenceLineControllable, + getReferenceLineDraggableRotatable, + getReferenceLineSlabThicknessControlsOn, + }); + toolGroup.addTool(RectangleROITool.toolName); + // if (toolGroup === ptToolGroup) { + toolGroup.addTool(CircleROIStartEndThresholdTool.toolName, + { + calculatePointsInsideVolume: true, + showTextBox: false, + storePointData: true, + /* Set a custom wait time */ + throttleTimeout: 100, + /* Simplified handles */ + simplified: false, + } + ); + toolGroup.addTool(RectangleROIStartEndThresholdTool.toolName, + { + calculatePointsInsideVolume: true, + showTextBox: false, + storePointData: true, + /* Set a custom wait time */ + throttleTimeout: 100, + /* Simplified handles */ + simplified: false, + } + ); + // } + + }); + + // Add tools to fusion group + fusionToolGroup.addTool(WindowLevelTool.toolName); + fusionToolGroup.addTool(PanTool.toolName); + fusionToolGroup.addTool(ZoomTool.toolName); + fusionToolGroup.addTool(StackScrollTool.toolName); + fusionToolGroup.addTool(CrosshairsTool.toolName, { + getReferenceLineColor, + getReferenceLineControllable, + getReferenceLineDraggableRotatable, + getReferenceLineSlabThicknessControlsOn, + filterActorUIDsToSetSlabThickness: [studyVolumeIds.ct], + }); + fusionToolGroup.addTool(RectangleROITool.toolName); + fusionToolGroup.addTool(CircleROIStartEndThresholdTool.toolName, { + calculatePointsInsideVolume: true, + showTextBox: false, + storePointData: true, + /* Set a custom wait time */ + throttleTimeout: 100, + /* Simplified handles */ + simplified: false, + + }); + fusionToolGroup.addTool(RectangleROIStartEndThresholdTool.toolName, { + calculatePointsInsideVolume: true, + showTextBox: false, + storePointData: true, + /* Set a custom wait time */ + throttleTimeout: 100, + /* Simplified handles */ + simplified: false, + }); + + // Set active tools + [ctToolGroup, ptToolGroup, fusionToolGroup].forEach((toolGroup) => { + toolGroup.setToolActive(ZoomTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + toolGroup.setToolActive(PanTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Auxiliary }], + }); + toolGroup.setToolActive(WindowLevelTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Secondary }], + }); + toolGroup.setToolActive(StackScrollTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Wheel }], + }); + // Don't set CrosshairsTool to passive here - do it after viewports are created + }); + + // MIP Tool Group + mipToolGroup.addTool(VolumeRotateTool.toolName); + mipToolGroup.setToolActive(VolumeRotateTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Wheel }], + }); + mipToolGroup.addTool(MIPJumpToClickTool.toolName, { + toolGroupId: studyToolGroupIds.pt, + }); + mipToolGroup.setToolActive(MIPJumpToClickTool.toolName, { + bindings: [{ mouseButton: MouseBindings.Primary }], + }); + mipToolGroup.addViewport(studyViewportIds.PETMIP.CORONAL, renderingEngineId); +} + +// Set up synchronizers for a study +function setUpSynchronizersForStudy(studyKey) { + const studySynchronizerIds = synchronizerIds[studyKey]; + const studyViewportIds = viewportIds[studyKey]; + + // Create synchronizers + const axialCameraSync = createCameraPositionSynchronizer( + studySynchronizerIds.axialCamera + ); + const sagittalCameraSync = createCameraPositionSynchronizer( + studySynchronizerIds.sagittalCamera + ); + const coronalCameraSync = createCameraPositionSynchronizer( + studySynchronizerIds.coronalCamera + ); + const ctVoiSync = createVOISynchronizer(studySynchronizerIds.ctVoi, { + syncInvertState: false, + syncColormap: false, + }); + const ptVoiSync = createVOISynchronizer(studySynchronizerIds.ptVoi, { + syncInvertState: false, + syncColormap: false, + }); + const fusionVoiSync = createVOISynchronizer(studySynchronizerIds.fusionVoi, { + syncInvertState: false, + syncColormap: false, + }); + + // Store synchronizers + allSynchronizers[studyKey] = { + axialCamera: axialCameraSync, + sagittalCamera: sagittalCameraSync, + coronalCamera: coronalCameraSync, + ctVoi: ctVoiSync, + ptVoi: ptVoiSync, + fusionVoi: fusionVoiSync, + }; + + // Add viewports to camera synchronizers + [ + studyViewportIds.CT.AXIAL, + studyViewportIds.PT.AXIAL, + studyViewportIds.FUSION.AXIAL, + ].forEach((viewportId) => { + axialCameraSync.add({ renderingEngineId, viewportId }); + }); + + [ + studyViewportIds.CT.SAGITTAL, + studyViewportIds.PT.SAGITTAL, + studyViewportIds.FUSION.SAGITTAL, + ].forEach((viewportId) => { + sagittalCameraSync.add({ renderingEngineId, viewportId }); + }); + + [ + studyViewportIds.CT.CORONAL, + studyViewportIds.PT.CORONAL, + studyViewportIds.FUSION.CORONAL, + ].forEach((viewportId) => { + coronalCameraSync.add({ renderingEngineId, viewportId }); + }); + + // Add viewports to VOI synchronizers + [ + studyViewportIds.CT.AXIAL, + studyViewportIds.CT.SAGITTAL, + studyViewportIds.CT.CORONAL, + ].forEach((viewportId) => { + ctVoiSync.add({ renderingEngineId, viewportId }); + }); + + [ + studyViewportIds.PT.AXIAL, + studyViewportIds.PT.SAGITTAL, + studyViewportIds.PT.CORONAL, + studyViewportIds.PETMIP.CORONAL, + ].forEach((viewportId) => { + ptVoiSync.add({ renderingEngineId, viewportId }); + }); + + [ + studyViewportIds.FUSION.AXIAL, + studyViewportIds.FUSION.SAGITTAL, + studyViewportIds.FUSION.CORONAL, + ].forEach((viewportId) => { + fusionVoiSync.add({ renderingEngineId, viewportId }); + ctVoiSync.addTarget({ renderingEngineId, viewportId }); + ptVoiSync.addTarget({ renderingEngineId, viewportId }); + }); +} + +// Initialize camera synchronization +function initCameraSynchronization(sViewport, tViewport) { + const camera = sViewport.getCamera(); + tViewport.setCamera(camera); +} + +// Initialize camera sync for a study +function initializeCameraSyncForStudy(studyKey) { + const studyViewportIds = viewportIds[studyKey]; + + const axialCtViewport = renderingEngine.getViewport( + studyViewportIds.CT.AXIAL + ); + const sagittalCtViewport = renderingEngine.getViewport( + studyViewportIds.CT.SAGITTAL + ); + const coronalCtViewport = renderingEngine.getViewport( + studyViewportIds.CT.CORONAL + ); + + const axialPtViewport = renderingEngine.getViewport( + studyViewportIds.PT.AXIAL + ); + const sagittalPtViewport = renderingEngine.getViewport( + studyViewportIds.PT.SAGITTAL + ); + const coronalPtViewport = renderingEngine.getViewport( + studyViewportIds.PT.CORONAL + ); + + const axialFusionViewport = renderingEngine.getViewport( + studyViewportIds.FUSION.AXIAL + ); + const sagittalFusionViewport = renderingEngine.getViewport( + studyViewportIds.FUSION.SAGITTAL + ); + const coronalFusionViewport = renderingEngine.getViewport( + studyViewportIds.FUSION.CORONAL + ); + + initCameraSynchronization(axialFusionViewport, axialCtViewport); + initCameraSynchronization(axialFusionViewport, axialPtViewport); + + initCameraSynchronization(sagittalFusionViewport, sagittalCtViewport); + initCameraSynchronization(sagittalFusionViewport, sagittalPtViewport); + + initCameraSynchronization(coronalFusionViewport, coronalCtViewport); + initCameraSynchronization(coronalFusionViewport, coronalPtViewport); +} + +// Load image IDs for a study +async function getImageIdsForStudy(config) { + const ctImageIds = await createImageIdsAndCacheMetaData({ + StudyInstanceUID: config.studyId, + SeriesInstanceUID: config.ctSeriesUID, + wadoRsRoot, + }); + + const ptImageIds = await createImageIdsAndCacheMetaData({ + StudyInstanceUID: config.studyId, + SeriesInstanceUID: config.ptSeriesUID, + wadoRsRoot, + }); + + return { ctImageIds, ptImageIds }; +} + +// Create viewport input array for a study +function createViewportInputArrayForStudy(config, studyIndex) { + const studyKey = config.studyKey; + const studyElements = elements[studyKey]; + const studyViewportIds = viewportIds[studyKey]; + + // Create viewport input array + const viewportInputArray = [ + { + viewportId: studyViewportIds.CT.AXIAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_1_1, + defaultOptions: { + orientation: Enums.OrientationAxis.AXIAL, + }, + }, + { + viewportId: studyViewportIds.CT.SAGITTAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_1_2, + defaultOptions: { + orientation: Enums.OrientationAxis.SAGITTAL, + }, + }, + { + viewportId: studyViewportIds.CT.CORONAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_1_3, + defaultOptions: { + orientation: Enums.OrientationAxis.CORONAL, + }, + }, + { + viewportId: studyViewportIds.PT.AXIAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_2_1, + defaultOptions: { + orientation: Enums.OrientationAxis.AXIAL, + background: [1, 1, 1], + }, + }, + { + viewportId: studyViewportIds.PT.SAGITTAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_2_2, + defaultOptions: { + orientation: Enums.OrientationAxis.SAGITTAL, + background: [1, 1, 1], + }, + }, + { + viewportId: studyViewportIds.PT.CORONAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_2_3, + defaultOptions: { + orientation: Enums.OrientationAxis.CORONAL, + background: [1, 1, 1], + }, + }, + { + viewportId: studyViewportIds.FUSION.AXIAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_3_1, + defaultOptions: { + orientation: Enums.OrientationAxis.AXIAL, + }, + }, + { + viewportId: studyViewportIds.FUSION.SAGITTAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_3_2, + defaultOptions: { + orientation: Enums.OrientationAxis.SAGITTAL, + }, + }, + { + viewportId: studyViewportIds.FUSION.CORONAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_3_3, + defaultOptions: { + orientation: Enums.OrientationAxis.CORONAL, + }, + }, + { + viewportId: studyViewportIds.PETMIP.CORONAL, + type: ViewportType.ORTHOGRAPHIC, + element: studyElements.element_mip, + defaultOptions: { + orientation: Enums.OrientationAxis.CORONAL, + background: [1, 1, 1], + }, + }, + ]; + + return viewportInputArray; +} + +// Set up display for a study +async function setUpDisplayForStudy(config, studyIndex) { + const studyKey = config.studyKey; + const studyViewportIds = viewportIds[studyKey]; + const studyVolumeIds = volumeIds[studyKey]; + + // Set volumes on the viewports + await setVolumesForViewports( + renderingEngine, + [ + { + volumeId: studyVolumeIds.ct, + callback: setCtTransferFunctionForVolumeActor, + }, + ], + [ + studyViewportIds.CT.AXIAL, + studyViewportIds.CT.SAGITTAL, + studyViewportIds.CT.CORONAL, + ] + ); + + await setVolumesForViewports( + renderingEngine, + [ + { + volumeId: studyVolumeIds.pt, + callback: setPetTransferFunctionForVolumeActor, + }, + ], + [ + studyViewportIds.PT.AXIAL, + studyViewportIds.PT.SAGITTAL, + studyViewportIds.PT.CORONAL, + ] + ); + + await setVolumesForViewports( + renderingEngine, + [ + { + volumeId: studyVolumeIds.ct, + callback: setCtTransferFunctionForVolumeActor, + }, + { + volumeId: studyVolumeIds.pt, + callback: setPetColorMapTransferFunctionForVolumeActor, + }, + ], + [ + studyViewportIds.FUSION.AXIAL, + studyViewportIds.FUSION.SAGITTAL, + studyViewportIds.FUSION.CORONAL, + ] + ); + + // Set up MIP + const ptVolume = volumes[studyKey].pt; + const ptVolumeDimensions = ptVolume.dimensions; + + const slabThickness = Math.sqrt( + ptVolumeDimensions[0] * ptVolumeDimensions[0] + + ptVolumeDimensions[1] * ptVolumeDimensions[1] + + ptVolumeDimensions[2] * ptVolumeDimensions[2] + ); + + await setVolumesForViewports( + renderingEngine, + [ + { + volumeId: studyVolumeIds.pt, + callback: setPetTransferFunctionForVolumeActor, + blendMode: BlendModes.MAXIMUM_INTENSITY_BLEND, + slabThickness, + }, + ], + [studyViewportIds.PETMIP.CORONAL] + ); + + initializeCameraSyncForStudy(studyKey); +} + +// Set crosshairs to passive after viewports are set up +function setCrosshairsToPassive() { + studyConfigs.forEach((config) => { + const studyKey = config.studyKey; + const studyToolGroupIds = toolGroupIds[studyKey]; + + [ + studyToolGroupIds.ct, + studyToolGroupIds.pt, + studyToolGroupIds.fusion, + ].forEach((toolGroupId) => { + const toolGroup = ToolGroupManager.getToolGroup(toolGroupId); + if (toolGroup) { + toolGroup.setToolPassive(CrosshairsTool.toolName); + } + }); + }); +} + +async function addSegmentationsToState() { + // Create a segmentation of the same resolution as the source data + volumeLoader.createAndCacheDerivedLabelmapVolume(volumeIds.study1.pt, { + volumeId: segmentationId, + }); + + // Add the segmentations to state + segmentation.addSegmentations([ + { + segmentationId, + representation: { + // The type of segmentation + type: csToolsEnums.SegmentationRepresentations.Labelmap, + // The actual segmentation data, in the case of labelmap this is a + // reference to the source volume of the segmentation. + data: { + volumeId: segmentationId, + }, + }, + }, + ]); +} + + +/** + * Runs the demo + */ +async function run() { + // Init Cornerstone and related libraries + await initDemo(); + + // Add tools to Cornerstone3D + cornerstoneTools.addTool(WindowLevelTool); + cornerstoneTools.addTool(PanTool); + cornerstoneTools.addTool(ZoomTool); + cornerstoneTools.addTool(StackScrollTool); + cornerstoneTools.addTool(MIPJumpToClickTool); + cornerstoneTools.addTool(CrosshairsTool); + cornerstoneTools.addTool(TrackballRotateTool); + cornerstoneTools.addTool(VolumeRotateTool); + cornerstoneTools.addTool(RectangleROITool); + cornerstoneTools.addTool(CircleROIStartEndThresholdTool); + cornerstoneTools.addTool(RectangleROIStartEndThresholdTool); + + // Instantiate a rendering engine + renderingEngine = new RenderingEngine(renderingEngineId); + + // Create viewport grid + createViewportGrid(); + + // Load all volumes and set up displays + for (const config of studyConfigs) { + const studyKey = config.studyKey; + + // Get image IDs + const { ctImageIds, ptImageIds } = await getImageIdsForStudy(config); + + // Create and cache volumes + volumes[studyKey].ct = await volumeLoader.createAndCacheVolume( + volumeIds[studyKey].ct, + { imageIds: ctImageIds } + ); + volumes[studyKey].pt = await volumeLoader.createAndCacheVolume( + volumeIds[studyKey].pt, + { imageIds: ptImageIds } + ); + + // Load volumes + volumes[studyKey].ct.load(); + volumes[studyKey].pt.load(); + } + + // Add some segmentations based on the source data volume + await addSegmentationsToState(); + + // Set up tool groups and synchronizers for each study + for (const config of studyConfigs) { + const studyKey = config.studyKey; + setUpToolGroupsForStudy(studyKey); + setUpSynchronizersForStudy(studyKey); + } + + // Collect all viewport configurations + const allViewportInputs = []; + for (let i = 0; i < studyConfigs.length; i++) { + const viewportInputs = createViewportInputArrayForStudy(studyConfigs[i], i); + allViewportInputs.push(...viewportInputs); + } + + // Set all viewports at once + renderingEngine.setViewports(allViewportInputs); + + // Set up displays for all studies + for (let i = 0; i < studyConfigs.length; i++) { + await setUpDisplayForStudy(studyConfigs[i], i); + } + + // Set crosshairs to passive after all viewports are initialized + setCrosshairsToPassive(); + + Object.values(viewportIds.study1.PT).map(async (viewportId) => { + // Add the segmentation representation to the toolgroup + await segmentation.addSegmentationRepresentations(viewportId, [ + { + segmentationId, + type: csToolsEnums.SegmentationRepresentations.Labelmap, + }, + ]); + }); + + Object.values(viewportIds.study1.CT).map(async (viewportId) => { + // Add the segmentation representation to the toolgroup + await segmentation.addSegmentationRepresentations(viewportId, [ + { + segmentationId, + type: csToolsEnums.SegmentationRepresentations.Labelmap, + }, + ]); + }); + + Object.values(viewportIds.study1.FUSION).map(async (viewportId) => { + // Add the segmentation representation to the toolgroup + await segmentation.addSegmentationRepresentations(viewportId, [ + { + segmentationId, + type: csToolsEnums.SegmentationRepresentations.Labelmap, + }, + ]); + }); + + // Render all viewports + renderingEngine.render(); +} + +run(); diff --git a/packages/tools/src/tools/segmentation/CircleROIStartEndThresholdTool.ts b/packages/tools/src/tools/segmentation/CircleROIStartEndThresholdTool.ts index f97da395e2..8390c01a80 100644 --- a/packages/tools/src/tools/segmentation/CircleROIStartEndThresholdTool.ts +++ b/packages/tools/src/tools/segmentation/CircleROIStartEndThresholdTool.ts @@ -40,6 +40,7 @@ import type { EventTypes, SVGDrawingHelper, Annotation, + AnnotationMetadata, } from '../../types'; import type { CircleROIStartEndThresholdAnnotation, @@ -284,7 +285,8 @@ class CircleROIStartEndThresholdTool extends CircleROITool { resetElementCursor(element); - const enabledElement = getEnabledElement(element); + const { metadata } = annotation; + const { enabledElement } = metadata; this.editData = null; this.isDrawing = false; @@ -348,9 +350,11 @@ class CircleROIStartEndThresholdTool extends CircleROITool { for (let i = 0; i < annotations.length; i++) { const annotation = annotations[i] as CircleROIStartEndThresholdAnnotation; + const { annotationUID, data, metadata } = annotation; const { startCoordinate, endCoordinate } = data; const { points, activeHandleIndex } = data.handles; + const { enabledElement: annotationEnabledElement } = metadata; styleSpecifier.annotationUID = annotationUID; @@ -434,9 +438,20 @@ class CircleROIStartEndThresholdTool extends CircleROITool { ] = middleCoordinate; // WE HAVE TO CACHE STATS BEFORE FETCHING TEXT - - if (annotation.invalidated) { - this._throttledCalculateCachedStats(annotation, enabledElement); + const iteratorVolumeIDs = + // @ts-ignore + annotationEnabledElement.viewport?.volumeIds.values(); + + for (const volumeId of iteratorVolumeIDs) { + if ( + annotation.invalidated && + annotation.metadata.volumeId === volumeId + ) { + this._throttledCalculateCachedStats( + annotation, + annotationEnabledElement + ); + } } // If rendering engine has been destroyed while rendering @@ -694,6 +709,7 @@ class CircleROIStartEndThresholdTool extends CircleROITool { modalityUnitOptions ); + // console.debug(projectionPoints) for (let i = 0; i < projectionPoints.length; i++) { // If image does not exists for the targetId, skip. This can be due // to various reasons such as if the target was a volumeViewport, and @@ -788,6 +804,7 @@ class CircleROIStartEndThresholdTool extends CircleROITool { pointsInsideVolume.push(pointsInShape); } } + // console.debug(pointsInsideVolume) const stats = this.configuration.statsCalculator.getStatistics(); data.cachedStats.pointsInVolume = pointsInsideVolume; data.cachedStats.statistics = { @@ -804,6 +821,7 @@ class CircleROIStartEndThresholdTool extends CircleROITool { _calculateCachedStatsTool(annotation, enabledElement) { const data = annotation.data; + const { viewport } = enabledElement; const { cachedStats } = data; diff --git a/packages/tools/src/tools/segmentation/RectangleROIStartEndThresholdTool.ts b/packages/tools/src/tools/segmentation/RectangleROIStartEndThresholdTool.ts index 252eacf72c..72155cd609 100644 --- a/packages/tools/src/tools/segmentation/RectangleROIStartEndThresholdTool.ts +++ b/packages/tools/src/tools/segmentation/RectangleROIStartEndThresholdTool.ts @@ -260,7 +260,8 @@ class RectangleROIStartEndThresholdTool extends RectangleROITool { resetElementCursor(element); - const enabledElement = getEnabledElement(element); + const { metadata } = annotation; + const { enabledElement } = metadata; this.editData = null; this.isDrawing = false; @@ -545,6 +546,7 @@ class RectangleROIStartEndThresholdTool extends RectangleROITool { const { annotationUID, data, metadata } = annotation; const { startCoordinate, endCoordinate } = data; const { points, activeHandleIndex } = data.handles; + const { enabledElement: annotationEnabledElement } = metadata; const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p)); @@ -600,8 +602,20 @@ class RectangleROIStartEndThresholdTool extends RectangleROITool { } // WE HAVE TO CACHE STATS BEFORE FETCHING TEXT - if (annotation.invalidated) { - this._throttledCalculateCachedStats(annotation, enabledElement); + const iteratorVolumeIDs = + // @ts-ignore + annotationEnabledElement.viewport?.volumeIds.values(); + + for (const volumeId of iteratorVolumeIDs) { + if ( + annotation.invalidated && + annotation.metadata.volumeId === volumeId + ) { + this._throttledCalculateCachedStats( + annotation, + annotationEnabledElement + ); + } } // if it is inside the start/end slice, but not exactly the first or diff --git a/packages/tools/src/types/AnnotationTypes.ts b/packages/tools/src/types/AnnotationTypes.ts index 5b1c5b79f7..7baa0d9ce3 100644 --- a/packages/tools/src/types/AnnotationTypes.ts +++ b/packages/tools/src/types/AnnotationTypes.ts @@ -16,6 +16,9 @@ export type AnnotationMetadata = Types.ViewReference & { /** The color of the segmentation - really this is annotation data */ segmentColor?; + + /** The enable element of the annotation */ + enabledElement?: Types.IEnabledElement; }; export type AnnotationData = { From f12eaa8525448feaa08bda2aaece07719cc09a9e Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 25 Aug 2025 14:02:41 +0000 Subject: [PATCH 207/212] chore(version): version.json [skip ci] --- commit.txt | 2 +- packages/adapters/package.json | 4 ++-- packages/ai/package.json | 4 ++-- packages/dicomImageLoader/package.json | 2 +- packages/docs/package.json | 10 +++++----- packages/labelmap-interpolation/package.json | 4 ++-- packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/package.json | 4 ++-- packages/tools/package.json | 2 +- version.json | 4 ++-- version.txt | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/commit.txt b/commit.txt index 2fabb3dee6..f2a2c820c0 100644 --- a/commit.txt +++ b/commit.txt @@ -1 +1 @@ -14f90bcc166f4f62f37f6f0673ae8516205b2305 \ No newline at end of file +beb9d5b502dabd7e5bd1d2c1bf1a8842bae08ebf \ No newline at end of file diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 2f2f73dfa5..9fa401ecc5 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -89,7 +89,7 @@ "ndarray": "^1.0.19" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.4", - "@cornerstonejs/tools": "^3.33.4" + "@cornerstonejs/core": "^3.33.5", + "@cornerstonejs/tools": "^3.33.5" } } diff --git a/packages/ai/package.json b/packages/ai/package.json index e988be8896..8c9336a1b4 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -61,7 +61,7 @@ "onnxruntime-web": "1.17.1" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.4", - "@cornerstonejs/tools": "^3.33.4" + "@cornerstonejs/core": "^3.33.5", + "@cornerstonejs/tools": "^3.33.5" } } diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index f7fc1032be..751bd15ade 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -112,7 +112,7 @@ "uuid": "^9.0.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.4", + "@cornerstonejs/core": "^3.33.5", "dicom-parser": "^1.8.9" }, "config": { diff --git a/packages/docs/package.json b/packages/docs/package.json index f43e9fff01..07db295b84 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -38,11 +38,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@cornerstonejs/adapters": "^3.33.4", - "@cornerstonejs/core": "^3.33.4", - "@cornerstonejs/dicom-image-loader": "^3.33.4", - "@cornerstonejs/nifti-volume-loader": "^3.33.4", - "@cornerstonejs/tools": "^3.33.4", + "@cornerstonejs/adapters": "^3.33.5", + "@cornerstonejs/core": "^3.33.5", + "@cornerstonejs/dicom-image-loader": "^3.33.5", + "@cornerstonejs/nifti-volume-loader": "^3.33.5", + "@cornerstonejs/tools": "^3.33.5", "@docusaurus/core": "3.6.3", "@docusaurus/faster": "3.6.3", "@docusaurus/module-type-aliases": "3.6.3", diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index f30f3a4958..386676e724 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -55,8 +55,8 @@ "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.4", - "@cornerstonejs/tools": "^3.33.4", + "@cornerstonejs/core": "^3.33.5", + "@cornerstonejs/tools": "^3.33.5", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 9195eb2c7d..50a3e3a462 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -65,7 +65,7 @@ "nifti-reader-js": "^0.6.8" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.4" + "@cornerstonejs/core": "^3.33.5" }, "contributors": [ { diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index df03ed437b..7e15185104 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -53,8 +53,8 @@ "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.4", - "@cornerstonejs/tools": "^3.33.4", + "@cornerstonejs/core": "^3.33.5", + "@cornerstonejs/tools": "^3.33.5", "@kitware/vtk.js": "32.12.1" } } diff --git a/packages/tools/package.json b/packages/tools/package.json index c70d919821..af7d6a5319 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -108,7 +108,7 @@ "canvas": "^3.1.0" }, "peerDependencies": { - "@cornerstonejs/core": "^3.33.4", + "@cornerstonejs/core": "^3.33.5", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", diff --git a/version.json b/version.json index 402fdf1d72..076ddec855 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "3.33.4", - "commit": "14f90bcc166f4f62f37f6f0673ae8516205b2305" + "version": "3.33.5", + "commit": "beb9d5b502dabd7e5bd1d2c1bf1a8842bae08ebf" } \ No newline at end of file diff --git a/version.txt b/version.txt index b7ac2a5991..0a1d311843 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.33.4 \ No newline at end of file +3.33.5 \ No newline at end of file From 1b27d359aeb447982a5b93ab244def41a577919a Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 25 Aug 2025 14:02:55 +0000 Subject: [PATCH 208/212] chore(version): Update package versions [skip ci] --- CHANGELOG.md | 7 +++++++ lerna.json | 2 +- packages/adapters/CHANGELOG.md | 4 ++++ packages/adapters/package.json | 2 +- packages/ai/CHANGELOG.md | 4 ++++ packages/ai/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/dicomImageLoader/CHANGELOG.md | 4 ++++ packages/dicomImageLoader/package.json | 2 +- packages/labelmap-interpolation/CHANGELOG.md | 4 ++++ packages/labelmap-interpolation/package.json | 2 +- packages/nifti-volume-loader/CHANGELOG.md | 4 ++++ packages/nifti-volume-loader/package.json | 2 +- packages/polymorphic-segmentation/CHANGELOG.md | 4 ++++ packages/polymorphic-segmentation/package.json | 2 +- packages/tools/CHANGELOG.md | 7 +++++++ packages/tools/package.json | 2 +- 18 files changed, 53 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ae2d8f725..44285f2098 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.4...v3.33.5) (2025-08-25) + +### Bug Fixes + +- projection point ([#2254](https://github.com/cornerstonejs/cornerstone3D/issues/2254)) ([5188285](https://github.com/cornerstonejs/cornerstone3D/commit/5188285b2569d44f485a9591d28add93df73667d)) +- **StartEndThresholdTools:** Fix pointInsideVolumes calculation when multiples toolgroups ([#2221](https://github.com/cornerstonejs/cornerstone3D/issues/2221)) ([beb9d5b](https://github.com/cornerstonejs/cornerstone3D/commit/beb9d5b502dabd7e5bd1d2c1bf1a8842bae08ebf)) + ## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) **Note:** Version bump only for package root diff --git a/lerna.json b/lerna.json index eb9d8d98c9..e837130167 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.33.4", + "version": "3.33.5", "packages": [ "packages/core", "packages/tools", diff --git a/packages/adapters/CHANGELOG.md b/packages/adapters/CHANGELOG.md index e49b53c5cd..693b50bd2a 100644 --- a/packages/adapters/CHANGELOG.md +++ b/packages/adapters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.4...v3.33.5) (2025-08-25) + +**Note:** Version bump only for package @cornerstonejs/adapters + ## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/adapters diff --git a/packages/adapters/package.json b/packages/adapters/package.json index 9fa401ecc5..2670719939 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/adapters", - "version": "3.33.4", + "version": "3.33.5", "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index fd5b765f92..57bce3a889 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.4...v3.33.5) (2025-08-25) + +**Note:** Version bump only for package @cornerstonejs/ai + ## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/ai diff --git a/packages/ai/package.json b/packages/ai/package.json index 8c9336a1b4..1df60208dd 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/ai", - "version": "3.33.4", + "version": "3.33.5", "description": "AI and ML Interfaces for Cornerstone3D", "files": [ "dist" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 6b80a4d97f..14843b9b9c 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.4...v3.33.5) (2025-08-25) + +### Bug Fixes + +- **StartEndThresholdTools:** Fix pointInsideVolumes calculation when multiples toolgroups ([#2221](https://github.com/cornerstonejs/cornerstone3D/issues/2221)) ([beb9d5b](https://github.com/cornerstonejs/cornerstone3D/commit/beb9d5b502dabd7e5bd1d2c1bf1a8842bae08ebf)) + ## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/core diff --git a/packages/core/package.json b/packages/core/package.json index b2adbe0d8a..9119a7a5a9 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/core", - "version": "3.33.4", + "version": "3.33.5", "description": "Cornerstone3D Core", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/dicomImageLoader/CHANGELOG.md b/packages/dicomImageLoader/CHANGELOG.md index a3b070cc12..591277c444 100644 --- a/packages/dicomImageLoader/CHANGELOG.md +++ b/packages/dicomImageLoader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.4...v3.33.5) (2025-08-25) + +**Note:** Version bump only for package @cornerstonejs/dicom-image-loader + ## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/dicom-image-loader diff --git a/packages/dicomImageLoader/package.json b/packages/dicomImageLoader/package.json index 751bd15ade..16aa970218 100644 --- a/packages/dicomImageLoader/package.json +++ b/packages/dicomImageLoader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/dicom-image-loader", - "version": "3.33.4", + "version": "3.33.5", "description": "Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file", "keywords": [ "DICOM", diff --git a/packages/labelmap-interpolation/CHANGELOG.md b/packages/labelmap-interpolation/CHANGELOG.md index b1e88dc0ab..878d9e256c 100644 --- a/packages/labelmap-interpolation/CHANGELOG.md +++ b/packages/labelmap-interpolation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.4...v3.33.5) (2025-08-25) + +**Note:** Version bump only for package @cornerstonejs/labelmap-interpolation + ## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/labelmap-interpolation diff --git a/packages/labelmap-interpolation/package.json b/packages/labelmap-interpolation/package.json index 386676e724..8d2fde53a5 100644 --- a/packages/labelmap-interpolation/package.json +++ b/packages/labelmap-interpolation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/labelmap-interpolation", - "version": "3.33.4", + "version": "3.33.5", "description": "Labelmap Interpolation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/nifti-volume-loader/CHANGELOG.md b/packages/nifti-volume-loader/CHANGELOG.md index 63542e3e87..1770fbe00a 100644 --- a/packages/nifti-volume-loader/CHANGELOG.md +++ b/packages/nifti-volume-loader/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.4...v3.33.5) (2025-08-25) + +**Note:** Version bump only for package @cornerstonejs/nifti-volume-loader + ## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/nifti-volume-loader diff --git a/packages/nifti-volume-loader/package.json b/packages/nifti-volume-loader/package.json index 50a3e3a462..78f99f6d52 100644 --- a/packages/nifti-volume-loader/package.json +++ b/packages/nifti-volume-loader/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/nifti-volume-loader", - "version": "3.33.4", + "version": "3.33.5", "description": "Nifti Image Loader for Cornerstone3D", "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", diff --git a/packages/polymorphic-segmentation/CHANGELOG.md b/packages/polymorphic-segmentation/CHANGELOG.md index fef62d248a..36aab5db8a 100644 --- a/packages/polymorphic-segmentation/CHANGELOG.md +++ b/packages/polymorphic-segmentation/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.4...v3.33.5) (2025-08-25) + +**Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation + ## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/polymorphic-segmentation diff --git a/packages/polymorphic-segmentation/package.json b/packages/polymorphic-segmentation/package.json index 7e15185104..90764edfef 100644 --- a/packages/polymorphic-segmentation/package.json +++ b/packages/polymorphic-segmentation/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/polymorphic-segmentation", - "version": "3.33.4", + "version": "3.33.5", "description": "Polymorphic Segmentation utility for Cornerstone3D", "files": [ "dist" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index f13e6e8a63..4b5970252a 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.33.5](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.4...v3.33.5) (2025-08-25) + +### Bug Fixes + +- projection point ([#2254](https://github.com/cornerstonejs/cornerstone3D/issues/2254)) ([5188285](https://github.com/cornerstonejs/cornerstone3D/commit/5188285b2569d44f485a9591d28add93df73667d)) +- **StartEndThresholdTools:** Fix pointInsideVolumes calculation when multiples toolgroups ([#2221](https://github.com/cornerstonejs/cornerstone3D/issues/2221)) ([beb9d5b](https://github.com/cornerstonejs/cornerstone3D/commit/beb9d5b502dabd7e5bd1d2c1bf1a8842bae08ebf)) + ## [3.33.4](https://github.com/cornerstonejs/cornerstone3D/compare/v3.33.3...v3.33.4) (2025-08-22) **Note:** Version bump only for package @cornerstonejs/tools diff --git a/packages/tools/package.json b/packages/tools/package.json index af7d6a5319..8204071f7c 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,6 +1,6 @@ { "name": "@cornerstonejs/tools", - "version": "3.33.4", + "version": "3.33.5", "description": "Cornerstone3D Tools", "types": "./dist/esm/index.d.ts", "module": "./dist/esm/index.js", From 2b17e979df54cdc1fd91df95141feaa273a29de7 Mon Sep 17 00:00:00 2001 From: ohif-bot Date: Mon, 25 Aug 2025 14:03:05 +0000 Subject: [PATCH 209/212] chore: update generated version file [skip ci] --- packages/ai/src/version.ts | 2 +- packages/core/src/version.ts | 2 +- packages/dicomImageLoader/src/version.ts | 2 +- packages/docs/src/version.ts | 2 +- packages/labelmap-interpolation/src/version.ts | 2 +- packages/nifti-volume-loader/src/version.ts | 2 +- packages/polymorphic-segmentation/src/version.ts | 2 +- packages/tools/src/version.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/ai/src/version.ts b/packages/ai/src/version.ts index f81a521b79..8e0c7c0b83 100644 --- a/packages/ai/src/version.ts +++ b/packages/ai/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.4'; +export const version = '3.33.5'; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index f81a521b79..8e0c7c0b83 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.4'; +export const version = '3.33.5'; diff --git a/packages/dicomImageLoader/src/version.ts b/packages/dicomImageLoader/src/version.ts index f81a521b79..8e0c7c0b83 100644 --- a/packages/dicomImageLoader/src/version.ts +++ b/packages/dicomImageLoader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.4'; +export const version = '3.33.5'; diff --git a/packages/docs/src/version.ts b/packages/docs/src/version.ts index f81a521b79..8e0c7c0b83 100644 --- a/packages/docs/src/version.ts +++ b/packages/docs/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.4'; +export const version = '3.33.5'; diff --git a/packages/labelmap-interpolation/src/version.ts b/packages/labelmap-interpolation/src/version.ts index f81a521b79..8e0c7c0b83 100644 --- a/packages/labelmap-interpolation/src/version.ts +++ b/packages/labelmap-interpolation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.4'; +export const version = '3.33.5'; diff --git a/packages/nifti-volume-loader/src/version.ts b/packages/nifti-volume-loader/src/version.ts index f81a521b79..8e0c7c0b83 100644 --- a/packages/nifti-volume-loader/src/version.ts +++ b/packages/nifti-volume-loader/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.4'; +export const version = '3.33.5'; diff --git a/packages/polymorphic-segmentation/src/version.ts b/packages/polymorphic-segmentation/src/version.ts index f81a521b79..8e0c7c0b83 100644 --- a/packages/polymorphic-segmentation/src/version.ts +++ b/packages/polymorphic-segmentation/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.4'; +export const version = '3.33.5'; diff --git a/packages/tools/src/version.ts b/packages/tools/src/version.ts index f81a521b79..8e0c7c0b83 100644 --- a/packages/tools/src/version.ts +++ b/packages/tools/src/version.ts @@ -2,4 +2,4 @@ * Auto-generated from version.json * Do not modify this file directly */ -export const version = '3.33.4'; +export const version = '3.33.5'; From dcf2b60db6e89de74e7a6d9544e12e4605fa0505 Mon Sep 17 00:00:00 2001 From: Ibrahim <93064150+IbrahimCSAE@users.noreply.github.com> Date: Mon, 25 Aug 2025 10:37:32 -0400 Subject: [PATCH 210/212] fix --- packages/core/src/RenderingEngine/Viewport.ts | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/core/src/RenderingEngine/Viewport.ts b/packages/core/src/RenderingEngine/Viewport.ts index 99b72a3e25..308c5aeca2 100644 --- a/packages/core/src/RenderingEngine/Viewport.ts +++ b/packages/core/src/RenderingEngine/Viewport.ts @@ -96,7 +96,7 @@ class Viewport { /** * The amount by which the images are inset in a viewport by default. */ - protected insetImageMultiplier = 1.1; + protected insetImageMultiplier = 1; protected flipHorizontal = false; protected flipVertical = false; @@ -1110,8 +1110,22 @@ class Viewport { imageData.indexToWorld(idx, focalPoint); } - const { widthWorld, heightWorld } = - this._getWorldDistanceViewUpAndViewRight(bounds, viewUp, viewPlaneNormal); + let widthWorld; + let heightWorld; + + if (imageData) { + const extent = imageData.getExtent(); + const spacing = imageData.getSpacing(); + + widthWorld = (extent[1] - extent[0]) * spacing[0]; + heightWorld = (extent[3] - extent[2]) * spacing[1]; + } else { + ({ widthWorld, heightWorld } = this._getWorldDistanceViewUpAndViewRight( + bounds, + viewUp, + viewPlaneNormal + )); + } const canvasSize = [this.sWidth, this.sHeight]; From 188ac9aafe847fff1ff5291680785e125aab5dff Mon Sep 17 00:00:00 2001 From: Alireza Sedghi Date: Mon, 25 Aug 2025 10:52:00 -0400 Subject: [PATCH 211/212] chore: update dependencies and Playwright workflow to include beta branch --- .github/workflows/playwright.yml | 2 +- yarn.lock | 189 ++++++++++--------------------- 2 files changed, 62 insertions(+), 129 deletions(-) diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index f8bf432e2d..434f499c3c 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -1,7 +1,7 @@ name: Playwright Tests on: pull_request: - branches: [main, master] + branches: [main, master, beta] concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/yarn.lock b/yarn.lock index bf09867bf9..f624b407f4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1279,7 +1279,7 @@ resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-libjpeg-turbo-8bit/-/codec-libjpeg-turbo-8bit-1.2.2.tgz#ae384b149d6655e3dd6e18b9891fab479ab5e144" integrity sha512-aAUMK2958YNpOb/7G6e2/aG7hExTiFTASlMt/v90XA0pRHdWiNg5ny4S5SAju0FbIw4zcMnR0qfY+yW3VG2ivg== -"@cornerstonejs/codec-openjpeg@^1.2.2": +"@cornerstonejs/codec-openjpeg@^1.2.2", "@cornerstonejs/codec-openjpeg@^1.2.4": version "1.2.4" resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjpeg/-/codec-openjpeg-1.2.4.tgz#c7cf67a34091eb74a6676abec80a5251c412b551" integrity sha512-UT2su6xZZnCPSuWf2ldzKa/2+guQ7BGgfBSKqxanggwJHh48gZqIAzekmsLyJHMMK5YDK+ti+fzvVJhBS3Xi/g== @@ -2415,25 +2415,6 @@ resolved "https://registry.yarnpkg.com/@lukeed/ms/-/ms-2.0.2.tgz#07f09e59a74c52f4d88c6db5c1054e819538e2a8" integrity sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA== -"@mapbox/jsonlint-lines-primitives@~2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" - integrity sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ== - -"@mapbox/mapbox-gl-style-spec@^13.23.1": - version "13.28.0" - resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.28.0.tgz#2ec226320a0f77856046e000df9b419303a56458" - integrity sha512-B8xM7Fp1nh5kejfIl4SWeY0gtIeewbuRencqO3cJDrCHZpaPg7uY+V8abuR+esMeuOjRl5cLhVTP40v+1ywxbg== - dependencies: - "@mapbox/jsonlint-lines-primitives" "~2.0.2" - "@mapbox/point-geometry" "^0.1.0" - "@mapbox/unitbezier" "^0.0.0" - csscolorparser "~1.0.2" - json-stringify-pretty-compact "^2.0.0" - minimist "^1.2.6" - rw "^1.3.3" - sort-object "^0.3.2" - "@mapbox/node-pre-gyp@^1.0.5": version "1.0.11" resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" @@ -2449,16 +2430,6 @@ semver "^7.3.5" tar "^6.1.11" -"@mapbox/point-geometry@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" - integrity sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ== - -"@mapbox/unitbezier@^0.0.0": - version "0.0.0" - resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" - integrity sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA== - "@microsoft/api-extractor-model@7.30.3": version "7.30.3" resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.3.tgz#d1256b6955c8c2a1115e0cfe99e1e8f9802e52cc" @@ -4551,6 +4522,11 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== +"@types/rbush@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/rbush/-/rbush-4.0.0.tgz#b327bf54952e9c924ea6702c36904c2ce1d47f35" + integrity sha512-+N+2H39P8X+Hy1I5mC6awlTX54k3FhiUmvt7HWzGJZvF+syUAAxP/stwppS8JE84YHqFgRMv6fCy31202CMFxQ== + "@types/react-dom@^17.0.20": version "17.0.25" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.25.tgz#e0e5b3571e1069625b3a3da2b279379aa33a0cb5" @@ -6196,6 +6172,11 @@ caniuse-lite@^1.0.30001700: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001701.tgz#ad9c90301f7153cf6b3314d16cc30757285bf9e7" integrity sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw== +caniuse-lite@^1.0.30001734: + version "1.0.30001737" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz#8292bb7591932ff09e9a765f12fdf5629a241ccc" + integrity sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw== + canvas@2.11.2, canvas@3.1.0, canvas@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/canvas/-/canvas-3.1.0.tgz#6cdf094b859fef8e39b0e2c386728a376f1727b2" @@ -7252,11 +7233,6 @@ css-what@^6.0.1, css-what@^6.1.0: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== -csscolorparser@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" - integrity sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w== - cssdb@^7.6.0: version "7.11.2" resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.11.2.tgz#127a2f5b946ee653361a5af5333ea85a39df5ae5" @@ -7457,16 +7433,16 @@ dateformat@^3.0.3: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -dcmjs@^0.29.8: - version "0.29.13" - resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.29.13.tgz#a74df541bf3948366b25630dbe1e8376f108ea3b" - integrity sha512-Bf9tKzJNWqk4kbV210N5TLEHDqaZvO3S+MH9vezFAU8WKcG4cR6z4/II3TQVqhLI185eNUL+lhfPCVH1Uu2yTA== +dcmjs@^0.41.0: + version "0.41.0" + resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.41.0.tgz#4804099980ab769f8902a948ad330abdf3b577d2" + integrity sha512-kr46REomItFeWz+0ck4Wif4uS5VVDWVlwdh5GGaCtTYHWfNQmrcCSiQOkrShc7Dc5zP8vNKrHEdORlZXenlg3w== dependencies: "@babel/runtime-corejs3" "^7.22.5" adm-zip "^0.5.10" gl-matrix "^3.1.0" lodash.clonedeep "^4.5.0" - loglevelnext "^3.0.1" + loglevel "^1.8.1" ndarray "^1.0.19" pako "^2.0.4" @@ -7879,22 +7855,22 @@ di@^0.0.1: resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== -dicom-microscopy-viewer@^0.46.1: - version "0.46.1" - resolved "https://registry.yarnpkg.com/dicom-microscopy-viewer/-/dicom-microscopy-viewer-0.46.1.tgz#33405d8cbe0e5d51dfe515af9c9742d2efbb1a23" - integrity sha512-QLozX/iM6ZA0TxheHQnTNiLg+RbSVlxYKMNG9qdqV5oNbEDOf+z4/8mDqnAQ8wjlQXE2MbUDX8JRa0LmO9mDTg== +dicom-microscopy-viewer@^0.48.6: + version "0.48.7" + resolved "https://registry.yarnpkg.com/dicom-microscopy-viewer/-/dicom-microscopy-viewer-0.48.7.tgz#f40248f5e5bd0ac7c47235de3e079d5a96b6a9a9" + integrity sha512-Kmt6uQourv5HL29bnPWvy2hm49LL4fvYXhj2BTHtbCHdyLZ3LOWUxNWZR9NzuK7QoiHCA7ZPSFFnkdUfWLzF6g== dependencies: "@cornerstonejs/codec-charls" "^1.2.3" "@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2" - "@cornerstonejs/codec-openjpeg" "^1.2.2" + "@cornerstonejs/codec-openjpeg" "^1.2.4" "@cornerstonejs/codec-openjph" "^2.4.5" colormap "^2.3" - dcmjs "^0.29.8" + dcmjs "^0.41.0" dicomicc "^0.1" - dicomweb-client "^0.8.4" + dicomweb-client "^0.10.3" image-type "^4.1" mathjs "^11.2" - ol "^7.1" + ol "^10.6.0" uuid "^9.0" dicom-parser@^1.8.9: @@ -7907,10 +7883,15 @@ dicomicc@^0.1: resolved "https://registry.yarnpkg.com/dicomicc/-/dicomicc-0.1.0.tgz#c73acc60a8e2d73a20f462c8c7d0e1e0d977c486" integrity sha512-kZejPGjLQ9NsgovSyVsiAuCpq6LofNR9Erc8Tt/vQAYGYCoQnTyWDlg5D0TJJQATKul7cSr9k/q0TF8G9qdDkQ== -dicomweb-client@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.8.4.tgz#3da814cedb9415facb50bc5f43af8d961a991c74" - integrity sha512-/6oY3/Fg9JyAlbTWuJOYbVqici3+nlZt43+Z/Y47RNiqLc028JcxNlY28u4VQqksxfB59f1hhNbsqsHyDT4vhw== +dicomweb-client@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.10.4.tgz#f32f8659e51fbaf3f924c81fe8b7ad80297f2bc5" + integrity sha512-TEt26c0JI37IGmSqoj1k1/Y/ZIyq33/ysVaUwE0/Haosn2IBM55NEIPkT+AnhFss2nFAMVtKKWKWLox4luthVw== + +dicomweb-client@^0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.11.2.tgz#c68f319f24815b7cc9c0cbee25d6cc092f637c84" + integrity sha512-HsjQtmw4XY35ZyrhW5WY7P5ZgGIrY1M1jfLeq2IKANDIqfWoE4QW496VcsbuX4qnTNoeHBauei73vU0WwMYrYg== diff-sequences@^29.6.3: version "29.6.3" @@ -8098,10 +8079,10 @@ duplexer@^0.1.1, duplexer@^0.1.2: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -earcut@^2.2.3: - version "2.2.4" - resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" - integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== +earcut@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-3.0.2.tgz#d478a29aaf99acf418151493048aa197d0512248" + integrity sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ== eastasianwidth@^0.2.0: version "0.2.0" @@ -9422,7 +9403,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -geotiff@^2.0.7: +geotiff@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/geotiff/-/geotiff-2.1.3.tgz#993f40f2aa6aa65fb1e0451d86dd22ca8e66910c" integrity sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA== @@ -10252,7 +10233,7 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -ieee754@^1.1.12, ieee754@^1.1.13, ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -11733,11 +11714,6 @@ json-stringify-nice@^1.1.4: resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== -json-stringify-pretty-compact@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz#e77c419f52ff00c45a31f07f4c820c2433143885" - integrity sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ== - json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -12529,11 +12505,6 @@ loglevel@^1.8.1, loglevel@^1.9.2: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.2.tgz#c2e028d6c757720107df4e64508530db6621ba08" integrity sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg== -loglevelnext@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-3.0.1.tgz#e3e4659c4061c09264f6812c33586dc55a009a04" - integrity sha512-JpjaJhIN1reaSb26SIxDGtE0uc67gPl19OMVHrr+Ggt6b/Vy60jmCtKgQBrygAH0bhRA2nkxgDvM+8QvR8r0YA== - long@^5.0.0, long@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" @@ -12669,11 +12640,6 @@ map-obj@^5.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-5.0.2.tgz#174ad9f7e5e4e777a219126d9a734ff3e14a1c68" integrity sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A== -mapbox-to-css-font@^2.4.1: - version "2.4.5" - resolved "https://registry.yarnpkg.com/mapbox-to-css-font/-/mapbox-to-css-font-2.4.5.tgz#b10a7a33af3e1a9a1369e4d5e8285492a7943c46" - integrity sha512-VJ6nB8emkO9VODI0Fk+TQ/0zKBTqmf/Pkt8Xv0kHstoc0iXRajA00DAid4Kc3K5xeFIOoiZrVxijEzj0GLVO2w== - markdown-it-anchor@^8.4.1: version "8.6.7" resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" @@ -14013,25 +13979,16 @@ ohash@^1.1.3: resolved "https://registry.yarnpkg.com/ohash/-/ohash-1.1.3.tgz#f12c3c50bfe7271ce3fd1097d42568122ccdcf07" integrity sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw== -ol-mapbox-style@^10.1.0: - version "10.7.0" - resolved "https://registry.yarnpkg.com/ol-mapbox-style/-/ol-mapbox-style-10.7.0.tgz#8837912da2a16fbd22992d76cbc4f491c838b973" - integrity sha512-S/UdYBuOjrotcR95Iq9AejGYbifKeZE85D9VtH11ryJLQPTZXZSW1J5bIXcr4AlAH6tyjPPHTK34AdkwB32Myw== - dependencies: - "@mapbox/mapbox-gl-style-spec" "^13.23.1" - mapbox-to-css-font "^2.4.1" - ol "^7.3.0" - -ol@^7.1, ol@^7.3.0: - version "7.5.2" - resolved "https://registry.yarnpkg.com/ol/-/ol-7.5.2.tgz#2e40a16b45331dbee86ca86876fcc7846be0dbb7" - integrity sha512-HJbb3CxXrksM6ct367LsP3N+uh+iBBMdP3DeGGipdV9YAYTP0vTJzqGnoqQ6C2IW4qf8krw9yuyQbc9fjOIaOQ== +ol@^10.6.0: + version "10.6.1" + resolved "https://registry.yarnpkg.com/ol/-/ol-10.6.1.tgz#950f3914b4eec978f087b36aa74ce1e18c41ab09" + integrity sha512-xp174YOwPeLj7c7/8TCIEHQ4d41tgTDDhdv6SqNdySsql5/MaFJEJkjlsYcvOPt7xA6vrum/QG4UdJ0iCGT1cg== dependencies: - earcut "^2.2.3" - geotiff "^2.0.7" - ol-mapbox-style "^10.1.0" - pbf "3.2.1" - rbush "^3.0.1" + "@types/rbush" "4.0.0" + earcut "^3.0.0" + geotiff "^2.1.3" + pbf "4.0.1" + rbush "^4.0.0" omit.js@^2.0.2: version "2.0.2" @@ -14790,12 +14747,11 @@ pathval@^2.0.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== -pbf@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" - integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== +pbf@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-4.0.1.tgz#ad9015e022b235dcdbe05fc468a9acadf483f0d4" + integrity sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA== dependencies: - ieee754 "^1.1.12" resolve-protobuf-schema "^2.1.0" peek-readable@^5.1.3: @@ -15836,10 +15792,10 @@ quick-lru@^6.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-6.1.2.tgz#e9a90524108629be35287d0b864e7ad6ceb3659e" integrity sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ== -quickselect@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" - integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== +quickselect@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-3.0.0.tgz#a37fc953867d56f095a20ac71c6d27063d2de603" + integrity sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g== quote-unquote@^1.0.0: version "1.0.0" @@ -15883,12 +15839,12 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" -rbush@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/rbush/-/rbush-3.0.1.tgz#5fafa8a79b3b9afdfe5008403a720cc1de882ecf" - integrity sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w== +rbush@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rbush/-/rbush-4.0.1.tgz#1f55afa64a978f71bf9e9a99bc14ff84f3cb0d6d" + integrity sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ== dependencies: - quickselect "^2.0.0" + quickselect "^3.0.0" rc@1.2.8, rc@^1.2.7: version "1.2.8" @@ -16455,11 +16411,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rw@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" - integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== - rxjs@^6.4.0, rxjs@^6.6.2: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" @@ -16991,16 +16942,6 @@ sonic-boom@^4.0.1: dependencies: atomic-sleep "^1.0.0" -sort-asc@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/sort-asc/-/sort-asc-0.1.0.tgz#ab799df61fc73ea0956c79c4b531ed1e9e7727e9" - integrity sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw== - -sort-desc@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/sort-desc/-/sort-desc-0.1.1.tgz#198b8c0cdeb095c463341861e3925d4ee359a9ee" - integrity sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw== - sort-keys-length@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" @@ -17022,14 +16963,6 @@ sort-keys@^2.0.0: dependencies: is-plain-obj "^1.0.0" -sort-object@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/sort-object/-/sort-object-0.3.2.tgz#98e0d199ede40e07c61a84403c61d6c3b290f9e2" - integrity sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA== - dependencies: - sort-asc "^0.1.0" - sort-desc "^0.1.1" - source-map-js@^1.0.1, source-map-js@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" From ee47dd11340d9030d71084d5633dab4d5b9418ad Mon Sep 17 00:00:00 2001 From: Alireza Sedghi Date: Mon, 25 Aug 2025 10:52:42 -0400 Subject: [PATCH 212/212] Co-authored-by: Ibrahim --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 246b19b31a..e30d692545 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,7 @@ Cornerstone is a set of JavaScript libraries that can be used to build web-based ## Documentation -You can find the Cornerstone documentation [on the website](https://cornerstonejs.org/). - -The documentation is divided into several sections +You can find the Cornerstone documentation [on the website](https://cornerstonejs.org/). The documentation is divided into several sections - [Tutorial](https://cornerstonejs.org/docs/category/tutorials) - [Main Concepts](https://cornerstonejs.org/docs/category/concepts)

Nq5Ek9Y8%D4rr*&;qH+Wr_a9l&ibktRsT9yUA)~N z1Y=-<)Ho>gv)ZeUy3y9(|B=ymGQ|H7p54Sw-I}h}Lx)8glPv_h_AozPV+t`fnid(F1XH!i^IgiB1KL_3h`{hRG;tkQc+zAbI#W z`xVsZ_SaRLf7p=Pb{Q_kZzQg{zW8$ETb-~INR~Z`NNr2lJM%gJ!sBKCg1 zKBiVrfRQ*<9Cn%f++1;p6NhR5KMW^OO8EWW9F{3u2}E`F@$?kPRS&5a8?`~H_vHD4 zY!HNYKvX~LNf~~>cGtT&#aXna60}tHbAEFJ4(-gYG!MN><`7!ND%T{#X9s$blqnyw zS>XGJ7s^qmsP(=)ZYKRKDYC8ZoS%`Ak)0g_!5z6pH2rk-v+g+CK4V*`mez@w655&X zw1gu0?^leueZ`&eUuLJ9*ZcLHo>L&ly|6j>jLW+d8_oJkrkJDw-htZvwogp3(@=ZNG zZ<+Dieyb9#W1{MVnfFFr#o47ap+%j&DYC%|^(k_s&x8Nj@v0fRVR9f42Xb!ViN`6S z*_V7E%1gH`eMqH-lbiL!oyp&||HHt%6eD(m%Fb#`XRc_&qdp!x7uy&cufE5H?^7>~2 zw0dc?k*qj8cqjGKOx2QQ zlz6xUlootk6MOAY6>}52pb4DAdNTV?3AzctslGF-9dbHNN3#}`8D1AozZT~|dYgoxv3?ou$$v8E$_WVk8| z8&B7und%78v3p)Yvu&?z_$_8v)lwY*Q$RC(A^-!>VRu~m?6EV>TvVCt_6iSuiO_Is zYm3IczP5J4UI0@JBe4;MGeQWZ@k3=Le4>g3viux3ovLKQdXGnCG0XkTyEN8G+0RR2%fB^{r9TRr=kNGHpMI=xD zW+(pw^Rbt!Gl83PvK`94*%u-PITf0x#J}$IifX-xuV5(2Y;J87LAZyoLESz_;MFLp zb=-}%f}kpR3{tc)P5n%S9SP*v-kf%qN8~YGDjiL=4fJ0&_2j}-N{ABr&T;?R&0}9k z58}J?UPfXUi>5NFh~xsyWn^ruuoF6;tcNP!)faaeu3_u$PBNdmja1q(gj=1rgqg0a z3UES(+^*N?V+1cRomCV6ELRIi!XCxeCGI*83Tj8T!G|k_d-KX{2xtz0x^m&5YWM;GHdm}IRhZIH{WdP^`E3DcJ|*z z*D;g9zRCiDQxn)!AQJ@Q#s3w8NDyN1{3KrOO;>@f>Eo~J4UG-7n+lI2F&zJdPXlbl zt5Hvo`kn6kCF!O>%dO>)FpH@Tfw?Zj5N*FM6uTz&$el4NYy@CphPt`qHgI+dOPTfx zF{5=zAmeNdjI(o_AzWx;rPhIeLlxpE{4|sv_{QLPFg8!b=ujjdb8s@fgJif=b*I)- zU4d-oS56HJINzRo^AIaxg&}PshRceNoH%A@W$n6)fcq+c)FKwo<>;M^2)VmGdK*8# zTYT>HLBeYXzw@sq&@B1o(gYf8fNFvtfJK(IGpUK#Y8C@1Ej@arYS>5NPuw)OQ24+@ zZS%e}!dLxh99$e#x)+c*dBT)H%5t4Q@ld2OjL!!FUB>%gXd9u1FO7?Hgc-q;jZ|gh z>O1Jnk7dCez59sXv|%C48hvi=C}MyezsehnVEx8Aoq)b)0HK~~iJM3Vdw|(vtv-`> ztw-lk3}*m%xJR~E{HQsjCju{HLl#$5`6O5LxJk=&uvn1?KcP`6;V@n1#P%qMrq$@d z^l6^;TD_FL#x-v6;eGtXbCqkPLk3)Ci}v`A`{c19U8`1|KL|YbN92W|=o!@YXPenh zuDrumDRq<#(O${38p27DNO(wxIReMSma)M7M<$GC_dcm5Olm`4%rtub>HXAkO20tc z)qzt3DADWn*+?qwWyM`&QM?v3AC-*%`t=I}1j}@aYL#n+dp^jy2eXyv*yC4+`X=}7 zo@dJa%p@~dMx>79YQOz5v5_U8pM1GPA3XDCy1t#t$-Rk}!JEC)MF$u`977>ZonS8gtrrOBR zOX`R{L!^S!gxoDG)&MU!1<}2G5g|TL(aN1`2N!)}cJn{Zj_~MUS8`}+d zNB#2CB=A=v6ZBxBt(XF9oy8qY$-_k@*Kzn3;uJavtC212iti^@w;F?n*T=&nZJdog zV?j#^=kqeeYqF#u8j^S|V0|T)SJrO1nI4a$?hQlI{$5g(LIh*zy$q<*x zR<+f^S^k_BFZPLfe?YJy`F+jv_YKYKEV0T=Ex$gYe06NVcIb>N62WR!hit-n_Gxq( zCK>G`+`@B=*$pBaij8mrQ-u2$iIC=L!(7rw?p*v2EDk%n#oJXbHJu>D6mZ5r^&85b>oQAlUOR$;&RFIsS2k2Q&~IP23OB z56|c*+4)HkZ@c@3pkDq>gDD(ww_kAnaSfJ+vD?koE3*T^K;*}%%k%S4@B4BSb@vU< zAxk-)-xzDIqbu-OwClTodHp(uu)~TeaAgSy3I?IkQlY*okbJ>KWze1*Sw%pLQb?z@ zYDK3HO8+ekB5){lp_rqGnAMLz9MvJm#ROneYVV z8*^_hg)ykQBYN~J@xu4-Uw|kVqkZ*G8H63y-+i`diu3nL5jJ2*gC)Q7^lmGw1Yyx- zWY=TX;AZ|OjyoW6NGUz=Uy&ehyo6$ssa@h&iIOL5B;`}P5VQoJX!Iisu`d&5BQf|m z)pqDUz%c1>fFSdP6YSnC2EaF(HIN1gr6~2kRl%bu&%PTf6ie{zlYz%bv|(OZIV5rL zid$AVq$Fui6QHdd@|w_^ezdx%W%~J`LCex@x`0`wJ@;hsAl}z!+#uiKvZ*oCnFWB; zIRJ>aDF~g@|EC4`-t^G;?wmN1TzgnHvK_UpAVVr92i|g*QiS<^_S$k4ccF5bC`2>G zw)dicRqgHVZKnGlY@o1-3TCSrqW8yCX@CZ>BNtn4FiIjKG_a0F=Q%54Zb<|s&p0tG zTtNLn_SCI-w{*gKH1FVo@(YAws5V+*aGW{7d=GAHxjrCC?vnxLjJ;81NYfA|wCgR& zC?02@KY+$N*@XYL@W$<#Y5`4q5S)pHni$rM5?vma9W^iF4wbXWep<5xZFtl{nUK6#%S>*=kmr^9< zhNrE@rGjx;mLj=Uy(t#@r)#(SL{^r*iHVmCh7ZKX90Fu~a^lXC5@e^K*CT;H$7sMN zj!AEA8VB|@Aeq=bg$$#xLdz9(r4Eq>ueMsp zUoO+fWjd2hP7V&zodn(;`bdj20x=N-sp`-XjcZ?d<{ zBs+U&g@lA;?@`F!n`CA0Eqjk-@9~f=MA<7lTjV|az3kq6+}m1r8(O@K*&SH5M__s1sU21WhD&RWS-=a4_7y&f<^O*>ygP={6G)Ov zW)Oh|Ywty=BEjpOca;93=|rfta@%0=8aq`HH`!Y{X|134`2GN*mNeKiK7e&tp$g7F zF-1WxL<+Gd8b4tksn1nc5|#yAWanuCZC$5rEMXlfu@E6zswchthiqhsSgM6H9qF$E z9*yogzClyy`ozMY^Rg^oyqSYiv~hh(X?rAmM&bm?o7APz*ehTj`}N=R7fMaY-mT<| zVK;>%iqpZ04Cb(sqHo(Uba6)L5}3dEb$Tc#NgOlKrXyr~KwFNaLXv59WDRJe_@VKN zYp?+8#V#jbk$^1$B999-7>)>NYv=cXK?M!8fR3VHEuepD8ya3z&BDgwV~Z8ulug4n zt4WLLO=EbeR)=22>I7Y&Xno9A0*EC7@l4oIs-57U!bd)sp$<+?yvf67w-4-_8Da(` zrLT91x+MBr&D`8B>Y6|MNf*XuvnX9JCW{^d3(NUs%MWdTyHeW=zY1;54|&W5N;MLQ zin}?U3{v$++IpkNBco~MkS&3jCWc>)i!;-E@e!-S{Bh%!mLvOqUKspsrEb+!Bbf09Qs455;d95+qtGedN+yXLfLPcI~6v{?@9m?_V z0G`JS`U6{~XgbNiZHGP(E5wVN)1}r4XZpgH3{U z)n(Q4Zo>f4{I^@2ZsM5(J&5!M30z3)5Yg|WQa|ql(bZov8rncH9j~^%9+p?7Rm-22 z@dhpGbl-fiR~;R+Nbby%?-E6%iZBdQob>L@bO6lqv0zRj4lnv7g$H#mf1FgNfN6vNIEUig8uew zoQDQ_T~OivgueUQn*z}d>BV+UdGii;(;DkZsxxo-qdeyO<P!irTih-PJ-P>C7D- zkzn!XloEVS4@HXw6vDO|l`-{amfRK6h4((^)FRzOY2@|Dm<{;kZ-4GM52lqgF~$%s z3iIeI+flP})&zxW&A1ZQ8Z{FFflkLc7RQ62C{{TO}PEDRxS7K-d~7ju;SJ z%Mon~pE3MSB;4F*sIOLZuJPIY~J}(*<(Q4Y{Kc}^ULX%c!I$Q`G`eEQY9S+<1*MwL2l&p&GHwvmfZfUpwz6c zIu#+m&0PpUgAkpOs*VZ$!i$zC&FFnNfwG5r$P?=*ae5Q9(|lFvA3Z+H=YLdT2{3Xp ztL=k9I6&K@Q{4dD?7?20 z4knuPp+h;yajBft6O;Mp<7b>m%r4bF`@dk#I{q4J4ZzDdd$;jMJ96e&IYvZ{sVmI4 zTt6M(W#GTrLu{lshPX3rjzp`f%(OHjQbL8}(Fh&I^-MJdl~OH^z2e_j-dxG~Pjpw9 zBy#j0y&^_>0m*FIW#l_TRAulwtlMF%i<%1G*CHnR+36NVl^ZExFMs|ITW%8+BGYwo zzdkGp*-q-JRH}>kIWU3`ezyJ5%`WMhd+T$6eX#>`Mn6A5)V<;EX`=hLl&f<*f6j`` z+#*ea@j(U)(>0z|q;J|WZPY8i!~q382A3SX(#H`i?1A}Py5^C{QvMZdAbWmYD|SQO zti^F$uc@#>Kt5)}gj4+;`H62tbH;G)wKCDb%rT{!hD7EdirIo1=FXT)sxL>DBMX{4 zt`XwF8@IHtpSain2D6k;Vy2b5R_6YWlYFQv^MOqL_;gpQCJICMKSeU*$DG?Rr;USy zH{koJ`#Cq4gEF~$#!c?O{yZc97@Ll+&5oQ^t84}YfuO_(5!xGj`+FarH2g|w%aHJ) zRMmo{pV{4N%f)>tjItuB9yBd{8c%i`7U(+Ei~))jY;d7%gCT^E;ZDz2A(%mMHphCX z?+`BLGQM9b;8pj?b`d{Gy1tu-p~ij0XI?cskWHWPADTn2LOB!O!5nh2Z2}R<*Xat% zh`&768Chd}f%{)R;>Ak6Pv|I#dZN5g6KWVAH{WONGH~_>|N1uWzc=ol>BP8&%%J94 zE<@+{(%SYCg{yaJ{5U0HQ9a=A*k7eTaWbwFa*VtZ5AyV@0-qMWDsEddAzV1#Oo=I@ zVNCfL_f9>Wa+Eai!!1GjeQbP14osOv4~b6@8aY2d56Q1U+~p1|w5rKO?;;Z&9A=;*)>um{NL7t`h}MMM{pe3o#XbiBx* zL&|;R7L1YjOC0M5SnI2{r{I9EwaFtyU7}`@5Qc7`??9DK{N;Y_H&hn z+j8EiF&`LMNV@LL{aZ}>T)f^YLHcSugMGoK^F=+_(hYw|U=QVf=(Qv3>)2`tcekih zIH&u4o>P@nh(Rwj(NFGYJt zN0f0G;0b^UF3(7e+nPk|UoTmQM1KN*d()Vdu`SqI4|xFZh|lL@uErGhcYByt?iQi5 zrX4G%fx@J7#_WQRg=G5!z5|Yu&iklK)Ax5){u8op1U$LHJ=Yd^{vLJRmOPTfQxO}# zraoQYL48rE;6ZY>gaDsTbf9o%7QJka?V!gzTS__5Cuerg;Ezd7xP=;@n;Z*_>V_9V z2Myf$B;kz4+}Mv;_tS7AeAVg1nlaX0UKB{<#hQG`p~AU)AS99+uCKF3_~bR^q0lRV z`b;D#;b*S2BvJDyigY`vOkSfFGK36nIa51q-*CDzhfy3RXaaQoMJ0at{{bNt*X!o{ zPkXG3rmRad_s|I5JH3XSSjpZb1bS_S_11@ZweMQMA_WaFeD4Tu8;zr0JVGB+PF9G} z!t+C9q#f{8^-OBWf3$*VfPdWSQ~{ZoXKu2seSDouKM*H<`ERN|di%Dm(efx-+mAO8 zrSccJ`jnl7bT!cuO+8{pE~_a>%*@;q#@gwM_owru4rMfgG}Ta%(1%jA=mIQ-E2j@i)AI*c(R<3=b}k8sECj@6iM+Z8D`mrlLu`7(uNy_wocQenJi@p z3pBk;v^-BA3nmYDEpVG)+D!_i9db*)oK3B;n#xm1#`0ckK zIs8TH>D>5ID=5}>fZw~AXfpwl9m_ZbDo=~CNy%g-||fspCv!g_56un7b8 z)0HHQ%q&m$HSv z6%UCD|M(YMS3zDotHFvpH-Q_5F&ku5Rj5sm9zD9d9FRo&b4kS({o&qk=CxtjrPwx!Pr5Ao#7UO=54#!ypxaY*-bK z`7IL01^TS(P0Cjmb*V#UiX)i}maESmKaxa9^F(mtB>G4c+Hc@o7*~U|OMn3!3?4SEq|2k{`W8}*3kI~t(b;Tl$gvY-K|h#U>~;f|6Y$E;Z>MV5?}F$jcN{OP z>xyIL;t$@ZI8VjCx3yB6!E<1(VMgEb>r#*NRA5v5(k(U~ewg#zja8pd)a`F*^!-Lc z_5J2=a|?y?;SB`ai23^&M2otD1Z~@bDy6&X>gc6M2HpXegWf^kslO|U^7GesbogBy zyheH6!v4uj`(gspa;mif4D8-supCQo;ndIm$SCI!d!JIrUYK8peTlemRU(~VYUZnzsN8ove)>Zy zeVa`x&@NAP)%sO=T^NaGTo)qZa!9=wY)|+pVXB0~9%3ynB7$UZ&u(HK$b;a`&S4a; zIK~lZixc(5U60w`Hm~<3SMo%RDFcK()Z+gZOjrHjm2yI!wMyA9*{3!zVrRhi(ZgvKebriGm zPumOJab)bsHj)|gLEFX~9IdtAI`~#6D}y@D0l%XcLDw*3Hd({4<4oB|!;0*C)Jl^| zP-0%9B_bgquQ_cesAQBViF9D4CFQE(1zB-`!CKjd^;NC_Ki<1XBOVRJ{uIcIA;O{^ z2)0cw7+hVMGs7~K#mZ}w0IAc_gpj7Q_i_VYT3gEr(=$I$zuns0gqI_wW!;@6mU4pd z+B3<G{yQ>}aJ&A1Xjv`fnDmpG54JczPgH6j-Y*NY$Y0Cs*P!__|!%^1%)$%0XG3BM?O;qamA znzN?{S_yvGY3kIS+s?6G*`#-fD~}JKVkdTUr}nphcY${B^e%U@30nzWEj`2-q0@x5qg%Bf}bp+P#jU8FCBr`WHefb*i|%s z$S5AcQYM5x{VRvgdbUG(xfX{r?Q+-9QA9vM0MzmS6CH-=JlSB(pn8Mit@Fca56QGo zMjgcveS$|sq?FycMh9hnMq5LAWqv#^py3_FLBhTsHRjtt&<;2QtFnEscl!H7BghJL zkMu@n(N1-336aFSFOPz~yvQMU7`Gyqfv)(%;nsMHH0Imnq(+gi!=vYHry_?&OBVKr zef_p52Pm}F_jR|iPTjPqOTtX7vdr0^eaU*w8vAgXw$RWYC;WA-d_AZhA2aMS0l?H1H z?T4p)S3fV>-R}PS;2qQxlPW%#d@mk1ODA>J8Rl zMQ|>@8$hcLY#&|zNud`il9U$;wE#`i8jI`gwaY#Fm1^vZH)f0H?F$x4vw61?1#h9o zIaLb$6DyeTih>SNBP@S=Kits(J!emf5miiaVnU($@cegqI=i`J>BrSpImWJ}3_4+N zRO=EtLsNv7jK%rbRwjwAQ~fdCIfhugayj4V&|szqJZO#?h`l1~?(FyX6XbO;i)rI` zM5`A#La0bW&BKz&ts?18-7vKE$`Q7)9p)U6^f9WOT{cvEl%#nQZ;wp#x`oH@+qLN1zvMrjPlud9yd zV%LCU0fq!v*@_f3ML`8iifAXAnbD^i)tYD)_}j_PPm%_6>kiv%CvZp%4(E85mgZ)) z2HOLN*63xm*oTu6|GmXr)gTjZ9BLKXyU_d{iSopkVxBRR7i0P+(WD-`M@<8>LZ!4U zv<((x+GSmH)xHjhFl4=#sKTh(W30fCL7c`Fbc94*lA#FhZYuJJ`P%{3Hlve}ojm`~}G z%#7~>xYrAyh=jtl(-!godwWsH#-w3v4mMedwi{+O-fKzh0|JSWFvyh|w;eYxM_FcH zR>RE1$^3?1omKf7$DWq%dSZ6=F%Qr2(TeOh-$vzVnwP)S_A@Clm!oTaO-+#-Bz|!w zIqXt%CV8_NWkxY6m@;@*WYG5*J>TnmUz~bzdYbW^eMhIYeYw54*%P+)GrOZUjz&ng z2g(O_f%MO3YM-C+NHW+Y&e+_W{wCu;lGeL)i@1(lP{%~SF28uVrc_2UP&2&#Cc?vL zh`myysP7$NXfW?)e?MCJ_3<&!RrzLfcRa=8;sL6LGA)Y(5b(B)W9sf2y;M~YuNEA9 z@0dI?|FuNdb12A)mgQX-ky4??o>!-CJMT~MDKNIFJ!2^sr^fJ&jjrEhn!@XU3>oYv zSFN73c2uV`_HavnjZko~YDg7Dc?n{d60L3_UoWp$ z3Rd;$-dJ(S5}BqkGXr6jWHsHoN+tcB8V zhzSY#Q*5y~P)o4Sf_pz@$V~1^j**9#w|jGKB3}WdA-CuohWy;Ly>B>^ne`CaENWXA z#qZKPuF^HLn?cH4zp(!=G?`xDDH(nYc6v_*Z))Ubn#jVX(e_{YXQ_OBH+6r<5^gUp zF79rZ?%LKm>XMm7_-fK{@C~=|G7i|uPVyctKanrgNX^Q!;H7Q~T95uI^Edgn-1L18 z3xe__vwohtI0mE>D{<)3a*w*$1DP}xg`!wCgRnWJ4C}zvh^Ibg+Q`i<*`B_SzfwWc zbDLf-Sj}HlOvq{@DNxlvGsC|Mvn4vz|B<4yEB;SMn@(|kBZLdEpyLF5nbEUGvi~Kt zQ{&7v0~1mzn}LK!4+j_1;6y?;Gm@z$+%an zEE6T4h2L#IdzsZyz=yDzSy=!1^Tn~TlCd|ST@7_~FuG`H-@80*BYlGyC`v-W*}D9O z814K0t)dglZ_huWR-Zfn3OnPKXYI;l^hQ^^Nci9}L3YGwYHR!S#9#gX0YZ*Lamqo< zdWwI0dzTcB;Mea*Lm;Vh;CS-paeQ*GZ=hz5 z&Q>>X>d3}0Obke#hE!&Zez6cRCj&LWrCNjTR;ar4OiO5RTUi;ls60!Hhyw?8#)m#C zLuPTqQGK)0SvYSfp3$s*0nD_OejLxyn&{sUfu08ig8`@QMMakO_7ysu-|uZuv(cGS zE#>?L4~<)v7z_XatTobTZhA6zdRvk{N|?BzdJ@B>Au~Grcmw_sSEk) zfB#<#&_Us@!LIi;Ady*W@V5!he5M}?V`tGjHuU=ph3KM-BHTI1!dR7$I9NiQlrvKp z$BTzVf=3I~*$|SQC*uz_k%L3312D2)3$S)OIM5LmVT!(&-1c*D@ZZkD0Y}g?6_v#% zM{pB^Mjfnt=??ED!Oe~e=vlzj5m7 zEF*F3-)!y`zr5mbOf(*GlgQrMgwsKUq(N)UA#zamNGh zKV*0~^^qfv_k`-r=Y=C-k!_@Q^`SzI_be)S<}x40ws_d{6X~oFvM%ZCPhxM>R8?zQ ziZn@Fz5M*LiI|^8OXzZx3~%th2nz~AuD15|Z7(bPpv^=|bb#ME@Q_i-EdjmxkYKT4 z03dtNGDgs``63-Gz9SLf&<>b@Z9wTF$^9>PP9sg^uBi_VC1qZslBv+N=#I0et1D?V*R&THL$0no<~?W;Ufb?blP+54 zhENIZbL)wV^l7rBV?(59$&)MV*Rn%=^N7;&z$X`rGl> ze?GLiuLN2~pvV<%;#P9Q{C6 zA*Tj$z!H|{hp%`K~V!dPUJ`ndIzhu|oG0#rrUY+F6t(K+09| z6D!3LLO+ex^UTe2ti~)d66Bw;5G(+m(Z38CKm%5w?1MXVq;PVIP$_Shn4&mexrW}t z9+?gC0(L`Z-`x*sXlQu)s8*N+G(Kw|oh7_rcRMKo2RCE{tgJA|szHYFOxa7i?CAB% z=!aw+lrCkQKaFV#ln**L_&CdaPxI;8&c3}G9v+5h52C*D@$v2LZ3xAKgdjj{XPp`Z z$8nf55M8nE+kz#EC7yzs`ev_gti9*idLq7;?x-m2ATBohW4*j;fsamCbU8G>+XdwcI$znflxbajIrH zi0{#FcHWuxPOU_B)7t#)benM+yc!!Q?9oXPvjoopL{o}#y!iowk$I#T<-+cWGBtS{ zu2cQ|50~k8^jumQI?iK{wvDxG&P~?(47-Mj{cd*+fyoTa^_~}x_f&EF{G{+zAKb6I z{D$;OV?R|T^!mO|d0Ep*qQk2KM+$U>N%^SJm3K14QTwe23z!9uRAQk1^BtWebhd{ zKW=g&P*pDol|ECgtYkJbW5H#uA6IS{%(6-+Y7KBy!yoYaKBPAoxIvr%(Pw&gHu#_# zt-3sOZri+SkLGp22fw(8^JCxs(ByU;BlgP!G<;0!F3g}hVxGs3K_AlO5+V~2UBPE? zwbOv#Dniwt>lry+rjZ2nWl& zmH`8E-@o%_!$GREgG8*pMIccuf#Oym;Lo&t5Ub-Puf@Db&FiQRCVCpWcT*Il*p+mg zVKx?X$UAR)h`L?T1MU_VGd6MW|MirL8|>Mu`;eD0$PvEIpFC_l(caRMu3VV*l|@p~ z3tN}L0q5ZG5Iz;qdp7&s`NCa-)>*rSK>E;?P(Sn;$)v`k&ApF=plR?HAdk)b_+{3n z0k{;wF*~@QOOTpi%i+Kas;sfIm%o+e!9x0t@SfAZ!5kotDIk>qC^9+eP4FT0Lp1nef zt)ruAy^1$)-}*^LMx7FSeWehR9FS zv8Pni0LUhTd$Yn9i>KX@n`v*_`g3Ls#z7H^q)hL`Y01;U;EF9N1VvnJUS+E1==uY| z&jU8~7s2cqHY}oyMC6|tuIf1Sh)kA^T|WS~o|h_%7>F$7g+y)~#sX zIp-7Dv#$wtQ`AvsIP17^qww*YS*v zX}?h7{I`jMb8lHR@MVC$Hma2=nVbJZ3_FO!*d!MBzT}P{0{kTtF*P}PN=8P3Gva=< z;!+r}I)3NJNSL%8KM3+%-K}0qJX`LqN{gru?O)m!_9ptbAo9D~NIp*s`KgdJ{!y%J zIv3sRE7P8!WQWug>Vt)VsZ1Ke#b+@vH=w#xNYkv8)->L=JJiV0 zNcq)))yn`fsz-mZ3`QY+4tCxE+M=&*#xO+a5804NLhAS?os;WVQU%xKywENf)05> zu3X_JDe5#ro8p~CwaPF0Trk0ZOo{t8O{YA)=I*J63Kl+I?d-?M?gy%7W+hWLcfssb z!koxT)tLD;2o%hW&lR-A1%^zLiK7=9C|3$xT#93e9|4~zMc#_>G}7@`$n8H%)jxqL zDDMYclnqJ%`fKdxcQ^c~!~2}iV0k-IaANYg<)&jceAC(F|JN}CvBv(Q#Q~gMZ==15 zV?&G>DjMrZ-mrdDjEsspUMniVY!?+sFGR}3Vd?Bd7yNR5NuN4fCGYt?fXW{-!eA%| zzX%|{>U3?<5KLI&yFQjqSXGlT44dLZa}61+z`MFCawyL!6+L61ueH6mK$Ao~sf0m? zB3K@MN-9i4Fy(56f{WJr`Ip4bPMhm~+TDM@y0v?1);P6JA&?jhdpcrBAv#U`lu-bF zu?s*)L*p`Rw`-1SVpgf7P!F-q_rg%9;BZ~-lHze$mHxG}^AF}*!os)2AJMm}K<886 z*7h)9bMWnFLcI5TJ3H)&%6>qW=vY&FB=7twN13uHZTVlFR2P^f?^Nk)pe=xOxzCd!#dI zhK~x=hkLK#a`@v9;<^iv9>kj3Oq~lg5s#S{Z+5`Jhjic#Qa~{&hpnf^Oyt58`KHU! z+l_oI36=^d7e&2W*?zv@TT7>x;Uo1^v|7F|pHp#9V)bDNPBcye9ql|n0xsg}n^DZl zT&!1~-zTclW~}t2oTBb=|76F&GIko2f*zW~h04S{i4BLtK})d5yt-2AFe9Z)oS&bc zho`2lj*piYDJ|^VgK1j)c06GUDmNOXVy)@bfB{VLFLMp*UpL=2x!^@qSTATbcXWKN@$_RHsnn)bT7@h{W?1G0ocI5}(biVGioidg!iOX34P>i4 zOl`J$1~$zd#$uNLCJ2d$=;`TceD-yB*I^?ux^EN??2-t0`<{FOKM_| z09oCymJ|m#&DQ%B_yK(9GNP2xXdMAnNyS)HmHg^sj|ftqgke<-Pl+{Ny}9wJ$}5E$M6yp$`N zTL07ju53*0@Z)0L5Mzx(nOB%~%;pO~6#b$%xSUQ{u8G3J^hfc}B!t73dLK|^O23K| z#@6~*+e&H*)vGwB{}6F~sJlL$H_UDonU9=?=tgNT^=u{>nivdW^(+K?&$jO$6kide zMC)Y|EUt)9BYeGKD!dMCfzVB|fLUP9C6UH{2>DMHjp6|g4l{}b*)n7SC4$m;dm?{K z;*XuZJ#O_U$tgnr0|dK^mkZGjsI`5V-gq}XpHiy)y`D^djj*C4j-atO04e=ZhnZmc zpL+^ge7v!uBX%rkf-7tnElal`0Q6GKx~ya#SYI8SZQ2LZkv^BC`w_z9EKn1Hp~G3E zt-c=ef;_w!Kf<GtR#qoJc06&3mY zj?b2QY--xl-p-XyN2%e2#no?9aaYQUGukuCXRI10*jJSyrnkiP;wmFKl+((wD)>j- z>#h|cC+&~WCWfv5=*ULOs$DP&ksTZxyx*#O`BG&|R{x#SGSgZ%pO{#rW{PTs4*T|6|6hbd#P3M* z3JMGR=kNnUS{@m~pDy_@1gR3Qu(lG5agas=6y`&pe13r4$59;#mP*XZ5(3fdI!X3= z7tQy(?Oz!QVhGZQXBT^J<;0Q$&o$vq3)04vpK6^8U;g_L*`FnTasfMbrT{h+pCN*tf%AE^uY?`{g%zx)BvIIL%GA=*qprjy>Z0sSrBj(1-67NI!tpsE$_qh z&w7j7XO9z@J?RmXZ^ADFTM?KLe979@WeoiDITElrcaS|+FWgN?*IDeV1MSS$yv%G+ z>y)NR?BNX1zYGb+MZY)EbU(f_L*6{PG{!-T;G13}p0GzxR4Wx~g%5)nXGUmUdPC1N z>(jD@>L~2*%4?cM7ClkR(MD5MqO^5t2f50cji~zX1k?9-c8ujXO6B~C6dT@1M@_dO z**^RwpTw+fF29&tTNDV!S}?4J8*(H<49(GW1NoaWZaPa7lU2|W09u*O=ald#+M=rj z3DF8AX+mVo>_N?%P+75|J(8* zwNDuRBlj!{<6wyw1fOs>@?(s+6h95B7UUD?T7s}8vxm$IGKlxQVBl0!gGfG4@if_Q zuH=y{((&ZfRM4M@{6ihuqnW(mVF4-W*uua@YGthrO1p-wI{JlKm)A355wgyypq-@i zy)K58V%&eLlOE!_`SGG;yGRa>r6wI$LL+{ACkmB-#9C+ z&$k%Sc0NGtwG)JfSzcbAzGY4kQoVXP$Solwum`&fW9QAL&~KQB!BPhHyd7m_wk|FW zkcO47*Hq*EUY~n2fiq)ol5?foCzHqVeW&i=1ap#xt|#-Vby#BqN2u}8Z7W1~0o^A# zclqCIuTZ1Y>bw(I->_WC7@^9q#>stHeFS6L$oeol5TuRz>FDYPs39gGUVtQbpeyqp zs?O(JG-FI^M-ZA95I!KF?-qzHOFRE=_B83gcbMEY@m7NA_n9oVIcQeA$w*26u1WsQ z|0f%+2nj*849V{{YZn|w)85IsAFWp!I=v^Fv3_*KovQK^pi6{E?}Zx$h0rwP%)5nf z^^bNI-?axiu+iJI_>0yP1>J)iF5?;KN&e+AwzpThQDy5npeq3e^{4lV>YF}zqM=Bs z+-4?mtNo^-xHYE!qN%-eu3Ffgqv@YFYSRjP|6uoM%!e9 z_uR4jb0~?wbPWS)pNtNR&UA z!yV=A21j#qDdwSI(_j17ynU?h8D@XY%In!qL;7UM(=%?&cMj%Sr+%*AlYdH3F5u$g zPDuZc8?jY)_ba3??gWpevlnmXrG)>X8ShTNKEYP@{blC{RHYhS)`e~t6cmNhfW<(4 zWFy9tC&qa_4{>miWt(ViD-gsj5Z1d%j54P=wjCVkk$a`lH8>KF@*KIt>znp#)rieH z`Gxwfr2{c(d0xHX{Xxntj;8+jw=z~}!MQtw19g7@cm(A0c?1Rfu}~ysgNV|}lQeqI zC{<*zLV~25Fda-XLSi&INmtA+U3FM5FZbMa&ecdHL3cz-Mt1eHq z@^8UOxEQ`Y0D}_bmwEJ<1ULNZ%Z^K179+!Q@Jh6fik+* z<6oWQH|zf#x8;tes3I-Y=tGK=De;o2w&(aU2N~&`jp6b!s!_F`N=2lAr@SkmNezIV9!ZxnZ z_zi9rX3gzA&o;HE*ulu{EkkBtKT@z4@)Cy!+Nh?do%I_m6YNN8hcUwgm{|O$)t5|S zT85fzaINVov3zBj-2YCpzG5;( zC^z~kD6A{vFPzSa`69!ezC^ytkmy-PTEa6Ag?{$x_r}p{=$-BG%022k@H{ct7)~!P zPO9Eum;1_20QcbqMUEWeYx)kdSYTU=p$>V2oheMg~PKCc(H0#G8@^X+id~YX6OpvgO0DV`O$> zVd29o7(dVk!D{<|X4|V;aEupfblHbKB4Og&Wg9)jttk4jSk2e+ZcD8w>-Hs!BDRPF zBk9}5&Hokm*-{_7r-Cfwmk-9@JA4zo#E3*X*xMYuC4Mg_m~QTdPhdqB*@A&B1<;fC zD+JHGGHnbBH3FD;6Ilv3e%qCzbR!7Fe8PR?`uNN~)F$iT<~aoE12j6EM8(U(OfoL%-M}Y#_eGyKwZQ!S6O5JC zmL%5}9}_N(3hlL3_9G|8$HpXf&-R}gi?2O}kR9Yj-IJ7;(XXhV<`{jw7``v&`cTXN zRR!sru|*q^#zlE}Nb(PHzIgrWA<(T!yLQh=X>jsA-kxA;jG+;l{a49e1xprzj?FTn zHJC#L+t7xi^8!2t^)IX(n==Tso{vqFBd8<089nU8o~CT{agwK|xSB^UnN*m*khxx9 z!{qv!HhT%@$RG{fiN=a*yl=b_gSgnh&&4P}IPQqKK zY{ngdq)3LX2FLb%K}mJ+0hu%3GOu&xN2q=j6yOf{f5qCEuo({9e_a8ww1JU0yW_Yi zMAROSOV~ur(-awOtXmYckVg;)ZiqKTeb1#PM@OThWY&lI7lQ=wkWl0XZCp55-dQ>Z z+92%iA1XWz!b5kke7o`qNJzu zH@sZQz3zzGd;ebx5cnLEDIaM`Rryub?9e9{ZG;Ql5Alr^B0myDbHXBjk#Ik@3!M2~ zSXG7JqL7ZAwnoZQ$%WEIGP_cr>%mkox@nvDq}#wuXk8Qu-n=E4tbgsc z@j+P#>jDsz5o~bwfJ3Qmh$jI%1z|`t$1Q&TH)jxrFBSH%xH?Qk4$_?E9Y@$Lo`RZ-kJ#9~r zSKh)-fLXTCV*Or=gg;-y1uS1NWNRiy|zCRnPky%uUmrl)YueJT_a@e_cp#s zG|KX*d9^Rw{3kC`(h$EujqzK;KH5&2QBP*;kn`ie2nVpM+i;qX!VBe|W~INjZ(Oyx zcgMhPEtpOXUhdCY93LkEYQMj4|Hk(pS#j5EE$XpaxETg(iIc;Jp}huxe^W;F$G0DY zK#HU|fib7fVdUjl#PL(E`)yTtM!oxfwOj zf6n9m(patqkR`fruD;nG8mA!Urze8a0U4PYX$jiq;erU8?@d16L)FHJnoe9C6eVQY z6X7|sd?FnoRjvVEZ;(D%;d+0w`UVXp$lKJ%s`n|$i!q$NdKrrzv1rI}B|2j9KhC^d z-M;@@U7N5;u-`lTxXrNH8B@7bhx7dG%(&H9?1;IuV}o#&D42AsSnF)(j|8eBFDg$f~x=&CC{bYY|5X~kMPPrZzI zp7#^Zlb3B@zF6=6I6ii)&}JGaxKv`qL`QnMR{ZADFg8S^s0ley`XwF_9y8a9I_tcd zkzN{VbN`hG3=H&Rm@2-0%OqVzX@|+#v%Ax0KSx|!;9qaOeA36W*&mu^auc*l62{ZnmBxM(9faNnbz+IOf z!uoU~uAHztvFQYU5`JD@-p7yKY`%VL=Wb``I581Fi-E!t21$oEHwGiiE1+denfMk! zEH1#M|=eyb#}i-etn4pxFE zYu3-pD}5pS0rKF%*h~atD}h^oNhuey7CVGNm1t2?QZ_rTg|c?5WJ|tdd(6N1c)JRI zR!fRnK1s>!Au|GL%=TtvN6Wdwl6YvTK+o6mZ@fPxk@?@lrm&ML)C(cKL!}ACkD^`C z+@xBM?4(5fV^)e;(50q2^A6H6%FON`a`PduQGfRGUNn3*qYnW@5*Pobyg#;9A>du%zuyR z?rJnjKpGlrhv%o-K%_x;& z3w5L7H{ySBd(Jo5(FNxY*hU~An?2WXbMMksO23U9U3K2@&oyDMG+?uDu4SaV0b~_AoA2g1~{&vGW{AQr#nU2mF4C1hK_W| z&nw^dK1PK+qmzEBx9Y>@p_rNd<=?)`a0^*O&`hS9Dc-gF&EJa-nE8EPR}0=Fe)@el zXWTtCpKrMx=1WYo0q_1TQ^%NLx(UPYJvB3Qns%vGncx=zv}*D6smyEGA=EI3hYg&u zG2+LOHR&p`a-LHA@YhF#bCXy>-m#lrbF_k37}g|K8vSOf8t5iV3iHu zHAOCwp&XSkg$?4ncT@5V&Ej63o-mMl`s9l~+URo0CGr5nZ0N4hZ4M;})k|f4I1)Wu z=bnsy7_P+THpH^cB?ArY<^6Bl)0ZtBe_HbMnFJlms|2Irc!VhuNJgpYYv;=;=La6L zz6E(X?~AUu=-$>3w!V`+1VLd(N~z=TBqunVDJU zv4v1%g=3G*?5ymBRGjR+_sYo1ULiz;BU@x;WecHXOURD<^1b)|4fmIOe(I6aBcJhp zzh3X>>p5udt$&Hrr*IX!OK1{S*JmvNI(fhZrp~HAOJp;^`Sd^?!acHeazPQ5rLlK+ z&E*6@M$d!p+{VUJFbHe{H(a1xf5Y+~)hQh#_1g))-1|3_=!rD6o1($fqL z!<239(@s(0o-1(viV`B!!~drAC`U|XwMT=n(Bo*6waDGAB?-;WObbwuyehe`X-Z=O7Hm9rIgTBke{ zW@>+DaG#tR1rhXs`k!8=xaC|N=U^T}WeN<$l)_~&3^)ZwbJ=*%D3~2y(@W}Q|3*hL z*o~m0^RoXgwqRDFFPI*)>mSJ>S_JMzjw7vcGvUeD^rB}zK$3@x#5QZ=N!ZKba)20+ ze?u2%L!eqk4{fu2_{%wpH#=mw`Dlk8N`t5x&S5lSQB=r6(&abyST4C7n+Fb~_^XbZ zJzH<*w!@n4Z@OB`O}PQLck24(^0-oeEqKuC%!HQY#YCPO+L`qvTz3&CZ6|PBc;#O= zv92^K7l4Hkv~N>WYM8<3E6O^-;=pY0tIzwr$bkQt*9Gql5h9lALU)$7tvoX~ukF34E?(PIS`sGB425UXQ_mIJ)Pso* zzc+tQS8*d>2v4UAxniRw8Y)^RJ7Rt`J)XC=_GH%tHO&UAK7|bVaskI9eLlWUmWAo3 zILv^a2oT47!n*#hq<3UCjhN0j@@@GkP3APF*X)hn*-u+F%O=F})3mFj8%ntrZNCY9 zy&6nF?-NG*gL8lj*;EI1NXo6?bPaF6k13bqY6huV@KeLI$I{-L+uKrJ`*uKaUXOHL z#X)u!w~1_blEZ$WB_sYN+V&=|mh`*Lm=~-7gNQ#ugxURlY-q=Zmc9U^ftSeH^_-$n zjM@5N4&|?lJRX>dX&@8U?_~WMd2Ii(d&uvg2Bt?Ro4D>Jq&72{!&G{j*ZdMDMh>A~ zR*C0bFosx-us;6$H1!|eFK%E&^<#7@3tK=j^1r_$REt<)pZ0}6X%@rXCJH(gz z6wKapAQTHmfM2CrJo<$JV2x|nVcxR?&M$yh?>ia+Rc?xs9!nWDAX=(f<$d&K!4HMn z>7q8r*p4?1K=$7|Qq2z3&4S=dC5wl>7QG=S&SM5KoL$g(BzfUyJA!$QNhuQb?s6Kp z_Y%f>HZ_q7qzWXbUUFI39ytE?Iofuo#qpU;B2PdrEmc7N!otD=(q~5OrW!lFdkNRn zsz3JAGB6kCYrnz^HM04D#+;U=v=!R${Vcb{sl!6q_pGCnb{(6~im;U>Vd?L;Lu)qD z6WVPWBte)f8e@35lR9rH>EoZHBQ$kYQ&UW8@eRy0rUM=yl=!38k&xwZQYL7wZt?LM zls%|+H7d6j5EBuhYC!{$FJ~y{?Vo!2G*bG5p!Zns&lC*Oi|^T%P^>S$oYW9!0wRUK zi@Q6RUke_~n&y7`86cr!%$&H*La-X|b~n_ea0O^CU%!5(CD8{X3p$~tI4nXzY2#>m zq`}tH?%sggoN<+e8FXy56DGIue#lNH&nTsFtpp?SW(jiSIE(8ZQQ?2a#gzNb#Bvxf zy>VZ2vTOkYkX~RSkHifv#vWVMeX_z(oS2(?PEiko!s_avI9#XTuCO7-L<21y&3^|_ zA^MkhfrZW_=>5EkR(3iW(y2^x`Dv(60&V{(mw6=0TuC`LVjD|dq%Vm1?k8s!UcT+YiE`MK|j z*Nuhj80}cD49(tgFa>u$NbfBkjf#W(tH%$HXq$a4q(PgNy$Sn&>^=GL9fGi zejF+wpn%uUpW_QEmRS5Uje?P*^|DGirPq{yPQPFH!C=kVdGGw+X-q2UXu+b(B4IQ} z_t&~nkZE-G)1b!N*L=wDI7=gsFx?guK#0as`@e^r;ImZeQ)LEUhP(paG`qusC&Dfg zt@eEx_y)iu%$Y$XXcRLf1=Pm4r1_s%Ru>x8KO9&XKHV>3vSZu4g?<&`YrcIVX1BEdSqwc+64fb0usZ8atTB7Zjt3JG;uYnKoNXr|dz zaVlM*W0qIW5k3aN9^Ta#Gdi~k>~&8@TL_;MIN})6CQdrkPm}SFKBx=-koD3HOu<1s z3a(yI-0EYd)rxc|DJi*E+Z|}QZGWeCJ^eWhX@8CmUj4CMhcqt+At5A#{Z-GFoA=YF z{drR4K4rXJ}sc4#1M7PnKubvkKi#s8ot$B6N0DVk5}{OAYp$#M|~ znQzf)0-~ZGTQjxh|JDs`iQe7(=;ZDAy=AMVJ0Xg0O5E2QG*4jc?kU|v%`N_mP^Io# z?5Eo{0Uab3a!dEa9LNQDGgZkp^c1DV&oT9cA);025NNk&XJ@4g*#kDxM+?}`T7iGV z$cvyFZC7B`uAIzs|5DrKa?yr+=>*{_h1J{WAf^`^03okm#v^E)>CY*~36J`3JUKmw z>~K*0Lm*Hr5jN1NPi}d#Wqo)jB!U+(Hq3yLZ@?2yf*17%WBiFr5%7FKXFtP`bm8DgEzNAp0{H znuxb4y`94=QT`|QlIJG{#cdE*f~nj8SwVjq7PqCWB}ZF57P$AONVG>szL%}hvD^Vf z5cuA2-(Y2c;5S+{>)bnL%oRb|fpG7}5oI3wBcl#slmgrn@~XH^gsDfSV^%TdT4&C9>Py!U7}AlmbRE)eK7r z#Fs#JyBA;0nz}|79+EHfx+x~g^`#5ZT|JR|-hRFB9|QquG3_jvfr$k!CcLQ%H3TB7 zB^|Vn#^69TayB(Zq76g^=yJ zt(dj?hL}VbHMfSVHL^J1>*kk+!3g~A6^f&We|SfMp4%&crvi{2 z&Q6+hr5=t`w(RIekJWm{An!b_05TBa5CwuO{@DOfPgZd(cduj}>N99nKMKi>yxPa) zhFu3t=~A$Sg5xwEDPyke(kH89Eimxtvf_HOKq+gPb&>_Y4ltrBD=NU$`jsH~dw_cw zZ#J&sp73jIG$(xbxTN^xH~7Z#wH#SFJJ$fKVZ$|w75~DudcTfnTMy~+!Rpufn2h;Y zAmtx^1ypNKAl6s%&x9$iZsRNpWW?dD+MPc*V@p{guJCD6K4VP)-_AmE7i;T~E)3zj zrsrBrXTFVd_c$UF_+n6Y6UvJ(JUnPF1X6Aw)fj449=xZ=kBzuqQpLI4tYIIT#W{B+ z8gT6FXV?^oc>Lvw;xnF{CQ#F$BYKm87$A}%Y62Hl?lPlRM^M4 zh8eOf8Pdj=$Iza8zjDs^Iis%5-k6U|OvHSUV)$x*$F$8Px&Lvk%xCb1jBL2lZ*iA% zDS9E9#Db8C(FQO36Pr(75N#94c)xcgl^-K%;nc|kJtg?G)f(4s2_kd|CbhR!;PUk%a?cQU8l?{%x7 z(XFIj=JK(nsU_RSxp^2&>6h8vs5EJ){`fIU36~zf+V8-P@DYalIwo%>Oen!w)ouAL zQ2&I1VQ`o3!)^t1+FdWL-h)v^g@ILC;f5HtH?~ZC>64s%NnHIOcB~AI!F8l8Vq(00 zhFUyy^iw*8*whd1Z+zrs_tFlnd0>?|xIxxN(U)|XF z!80rbn}}t)j37V#HGKi8O9C-fv{0WDnc=wtE4ay6e3=>#Esw*N)Ije?{C;s|RJY*K zt%3uz%P$vO1=zo1;DW#|6KQGtra<(#LEK&Me!Z2faKhL`no_$Xy|JgeJGBX08R&;D zgQ#3y6J~VdRemC5ALG{xu*1q-rLL^x%~2F0Kt4Ox;oDNH!O z;un;kcG{hW}dXq`K}T<>}rH%$r+=&hj4Xr?-en4lgq z_3@W`wz`7x47)P~G&(<_LL5ye9)0r0D5sDW`uDBeny0|XGh*<-Y&r->JUobYn&q}m z^zCk;jG8@FvK@tQzh#=rr$R9*k!&IczAYf!m?>)MfJYhwShVF`?UZ285+(uYLApIAm^u7Bqr}Uz?=9*Nl)2TV#Ze23^}k+F4yuL{ zY;A17p#`!)Uk})n>Mb#=D;Eb7w2+v_^W0^hs`rvGuWTzX#paAkX{}U)%>jC#x^X%# z9rLTc`1?CwulALW1~j(XZVhT{mJR;u)>NU=iYHT&93azc%aUKa5ui+t;{1&4v7&7Lv9h(PFZ zL!4f1VaFy%ccAF z%8}Phbsv9_-%RID?)&mZeM$tT_TE6}P-x|Vv%m-e4)o+ve5FjV-7>Q49a9s`U-6rp;O!nwKrcOL|60t@7|@rht){y)WWt zdI~7kP>SJwARdF17hpacSL_~Ul1F2Wg>Y_Pltu|Hq@9_%HsFluwvK{tCe&+iMtujL z%F4YLc0O0H{y=1R5#ou-iv?Cbdj5P1y20Nqr`wS~MhE)_K%fV_BcI~xd*U*yMSF9M zUnf~RAfuX&Z|EL(&}lJUf;miRD{cp7T%5+oVjASRdD~&B)K`3 zVFaqW)gE)E?4jBFvAOD99ex%TGI%uaE=c{4J`MSw?-l!1r1F`!0Ht;O64*-?aZAVA z2J6glwZ0jTl5zXmR{f797#PIX}~acef?m?Q$tG4tS6?XJ4DPM?F|mr#YU&lOb1%mxyQ=-7~{y5+Q{8<#8ilq&-iu z+&0;YzP%`M?*IfTbXVs)?xQ?#3CeLJtEQ0B(ier5KoD)0ZBL&%?lS(n8My=57Shig z9H^od^%d^kS$rlD)lBj=AFWzIdCdfv*m~S7XfT~KVS0w-(dR04vhJ?=En>C@#6a7l zThiSNk+HC&YX98x48YDdj*=*he2^G&B1fK7&7Dt;=a9y>M~BK$WZiTQ3_{Hdb%z{l zFR`MS=?VlHUx$u&9q?QYNsg%EkH`JNTuI8LM$~bp#|@4T;6OYzAoJ=jT`Z^_-e5=R zdTs9HwTZq-jX$2jWIi2wim)DWsE2@wEZtV3nF5QbqlL6DQxm6~<{JYUcUu8$u&<3W zPN+=&jYY`lvr<#_P#m@zAv*C^wJcg#PEcb(7ytZu?ENs)0S%1$r2+DmE!|@}MF6>C zblFIs;~Y+M0WBJvsb}`OScuB|cZJ;TvZ(bE__r>8iCDpdz)aC&wjmXCXB1|SJjlYb z)xyJwAJCOZg%(7=toOW;9=||T)F+RGRu6lJ>^Ck%r}W^%4a)_;dZrWeVNk? z$?H2mm#V}hyiuLir*KL-m-l6fE4Bao#rYvqj=0*dL99rdu&wBgZOF9&gNquU3g|nS zn3(+cSINC-CZE;uZW3U)bEw>)Aeiv*d19!ov3VV4Z19v^y8s58x{b*}_qJP4+ncICFF)qBG`$aW zDzMN-F(J@uWPBU~P&=1!ghRU905qD98dJt}prX)VFLv~0eRX{;cxa|=10?r8gJpWn=STu;a<&KDGSFVo5@{hm!uK8w6&cf|g%%_Tk+PcABq!<(P_Rp5zC0453} zI_iOkfgLApoHZNyuc|XqT4ZtY8LZu%ogMfcIWW;iBd2fs(-7p$8#9k|NRQQM<2mWG zG|R>Tfrk!}xl!;%VlR6)!C7zVIlQ1hVu&8`0asR6bJh4UDy#zHAU?n2BNk=;e{ zFtL)c>}4QQtISh7t?{n`H3YG+3*oy0%&ZSe6=?&MJeYT#fd~Oi9w|%3hh^i2Ir~>9 zUJv-)q0gRn^QpJptBr`OP?3n&VD%0pZ*P`wmk>$fI~+T6*ebxhhWZ0W)nC!fxHWmF zEpb&>;fMG*wp7nNxRP;uSAd|6ZVcE^8nL{VbE6^I2q?=#3grw5Qb8sz$d*wEi=~a74U8aR z7kXOS#Zk!uvuvpQR%^?4ULRiIp-Lcs(;BC4E66^lwnNezUU0Xd6(hS#~nCHXk)~dmm%1;_` zBiBoQu(EZw5U72t&Eqv~HYfhNeE$pPtOssTNTHMXhU7*UJP1F;cbyQ~Tx~8Y!_*KS z=FKyy)Z&8OdJvemoI8)m{HK>8|I%_XI>z)SJCmoiH5j)|Y`EHZZbV-CW_3`?r3QZ_&Qp1mgdWM>esO5|My_O#yQbRsdiDzkb<(*q@z(SAsJo z9;(W~!2Mq_1#DJM5HZE7c-zxzFczTjxEO=3){JR z=t=%yw;h|QxAtb`m4yr2^zxN70m+#o$=IB7v2DuOc{S}3AQ^pN1)~mFAr{9h*NbRm z8p)c%cadn^=l!{&9Ya`Me?-yptdf6Q0_&h;11MJ-s7D7K{(A&-zfB4YP7eqWrt>4z zIX=n{ptR|7kC~oXBmEL!Qs00 zad?^oOX@$Izu21Z>*_v-N?!l2Rz%^dxa)4;YJzdmZ}=SJ^*UFBzujvO)+X1wM4fKv zRN({LP4VE0w+`>ETX)hYh6YWo2&{Lv;9=?duLC#>I#fQA)Vqm?aFP?xoAfDBxxwf@ z7Wv0Rt7EM#a_V;rN`oWFI~-_zT!QW)igs5@TZXljthmzR^k0vqeK4gZPS)9C*@_K0 zzJaOqWRPe_7AI_B7>3~>1pv?tZLAQ25gv6dQGq-O^IFLj`KKQJ7}fG7Do5oImk8Bp zw%Oa=!C^b(&&PEP%{G+kX_mtHr#=H(t3z|l3LzXc$l%1h-yq#l6l9~?sI zw7gAV2CJsE^&2j1Y}cm+)MWFKFp>pHctB%t{Ht`HC6b$e`JIaqee?s-S>wg?8hn^> zzqyb{zG$1ciDx2#7S4Ncu*$-47jRc94C_Nk9#mzCSyIs2Y-?g2f_)~ytMe_s-f%(x z4!^JbhFJu3Tg-oqh#+!A`pA{}n7ZG-md=S$F2RF&>9FaSL1Rm7jopPtIaqws2j z5(dhGtu1G=s*$q0tAWzBADgS}Xu)AL_KG-i>Cs4}=r_exV(wx8U3^Vpb{&24I0@gg z9F5ND=g1*BeW|sMCW?#Cos^R1M~88YI88CApp8fZ=i=>NofhyV~_R(t9d!)OFKDGiv+r8Vc{^EQ0CKp#>S_5xNY2kQ1_nlE&9scut#(^FBS9jR#l-a^@K zP&O*63z^hZ7btt`zvnV({`XaCLgt14^Ly{_jaG1!E)|sum8QC?kuUYy6hrw7Q!oC* zu3I-hack}9e~kGj=GtQ#=a-SH7b6+e5WvRWKwqCw`uz1y+9QgwqXxcnWyRR(?qEV{ieUt zTE_Fwe{T5CeWOS8o+{Hvvdi56UcXNh^k&lO?*smGJ(-S{eA$m9|2OjA6K4Lj@&b~l ztS_nlea{Q(5T^Drn>Xodl&4c3()>s0H?`kNlFEhu9I6OOF;ZTUPA9$#_!sekkAl!{ zqP_9@-*%X*WM0_5WA6U#3lyB|@ ze@KuxRnx(!Ejj~4UY^4RZ1N6ombAGaTwuPEG~>5KT2R>Fk~k)hptWyLq0Udsf~6E& zHEe)_lvlH3eQn#se((Tc9brUilK1ZzExN$baAwzx{B9()LlQZ>9k?Q+l zrXw>`dn1GNcLZtrQ2S+Q#e+%Yp*3A{z($S3Xco;tV_)zY30q6!S?9f}b!?Wz_PY`L4X$a;Z(=^p}MjZ{gQWl>L|0#;vHifCw5B{jJAgUb?i z#{Sk{+>C8%n*LOY*JuQ))DRjCk3!ge(+%s9uJsH6~Gn)!`7bd*;hGY4PaT`VoU<*-HG`W6-A&zYlM9}Vkq60PI%#x>A9og^15pDIp# ze)ZH(JjgqFH01rr$~<^^+zG8WIJA@FzagJTsN9{ACw`sl-dja;4xYGu#Wy_3EVxxY zUA6ZCS@=(rm8xN}F0Tj%E_gmgEVB9|f@U#5S&!lU-b6Q_{3wlQ%bdz{$#`|_z1L7m zv-8C(Z(_$Wg#1yySn>&c=VdYk;2 zKx%l!ro*3KYa^bibuhU8f(fpF4MZCeBOsV55V9C@x!sO7x?OlSMzi>d2E*f6KU7qZ z%AS>JEmI-eKW-n+7;m>@D;x*hd-q0|Cp1uB&oO6^jo)hMCUeP`4WEh?zAn~$!}u7| zjayV+v@mVJzzsO`=RRNI@zUhwU=2-FvTH@(49r3UxXohw`HrmedO8MCza}a?*G*3M z#jNCp7@{Vo;NL8kOpPV`@3%|hZL7YtwuEGTj1`k!jXFncmR^$$ACLM{xunJK z3r>h_tJ~{OYQ4W5Db+0!Sz6ED}7*u>qTfZJb#@Nwrb|J1-&0-x~C+dxVrO>rh9!tRN>;z=wMAmDAf(rnR!BZSdS+FD(M&0(LVKQv?BdMQ?2zMg*t1dW?*xFfq;v$D*|^#TVQ?D( zG!*vQ0LMma08DCTF~>Vb>lDUS@LUpG1s?uZzS^F$BwD>EB)_M&YbOyfXofeH6l z*hv)ZGgDM%f4NxzQ1UT7O25tcRkD_Ps_Aif2zap69SeM%ZROsq zcWt&jaf{7zutS>+UAhnYd9P^xX5-`5DRAt*I0VPLW#xc+UB;Fe?*0V_w#E>}gus2F^Dxs`*RvuHm z$B;;0K*2%f9%ptH9dvJK?P{~2$DX~r$()^m%i03{df?NJuLEkZhrVEqz0D83%UysK zm6R~=`t~nP`|TZDtr2$`5uvt=3cT8ND6o?4BU8lbvPug7E3shGRX47)`8+u9+0d6HrUTbs_wb(6^lNwi#(+D7fXO!X z*@``#Lr(Zn=iD!^#HCePc)mcOwv|2NtH&S>%cVOck51Nf@9V%#upkFmF2_FJqEsU;l;7O<_^HU@G|ZCkPceY1H{NGXo2$AT)mHtAkUoNaSP!MXuT>wELa8SG59*B(G z4isZN267yLa`zQ|pR%Yb+$>VKEB9fV|0|S#Gk??U{LhlIa$r8H{L43%(J}g6Nw0Nh z#@)kKWS2R4di59v@fd9YEWAbJn+|n>j;!57)v=KFdG{^QvptY6OhHuxOdXQ{`eUt4 zsX??X!egFD_T^g{cA!BZ5QNxC04;k*Y7ZGm>gWN6v{>{r{2}WteU{)#$x<>HM>^Xf z?sSen!KjX5BlGkSNah#h-vttV_qaHPa|cRdh157CLlT{L70hqO`_U&1SRBN51upbo zW$pm|@jQuCE!tY?kJeetX8uU*1`+mzvy|ntLwCgZ-V7$6lO~bqDE4wnw*Y*Y>1M9X z@^DJYhyHM5_1viM?TnT3yoV3CUHrDnRON%$?w=X10Scv|ccl_TXUuxsw^vaF`ewWHX5oF=w+|Y*DtQ?6&FiNJ8}6|lcwLKdlp+&Z+}>{ zhZj7b@LP&fz9DmaIaul0xHs*+Ni^dTERsu z*ti!-90X5*p2E0=eMRG=FTmWBFLDH}#O!8t;@?OYQmth`s|7g{R&GIa5#fQ0&#u%i zEcT8uirBGU`+UhwK8ZxP*sfuU)8?;9@Q_I&fH%HHB6j~kFFw-1NHc@45Wx3t$~5Tm zLzcD1u!e1FjuBQ{?J;knZ9mXDQ$J1hm=k@Jfg&eEaqlFg9Zg{w?I{=19JAD{3fIp* zw*6ucFDi;JG#!fW3MBGwa-FT1HcAJUqsGfAt{F?|1*c7Hu+}>r8z>={7t# ztw2-;TPb@iUxLs+@9j^trLh3WD;aPuKg2o#Uil&r9zQ#BAwl!l4k+3tp6X80e7Q_v z=8Hn^R8$9+?z-lbhrsEe8d=zEVEu#a4^z&QoTiP$noc(T1p;rpQacxs5QDHImFG6q zdXx*DEKAEF``97o_BFPHdLN&wKyjIdvkxTg@trc2m7`C`eBC)?qAu(tn)WQ_C|hZA z%hYTM+pPhjQHxPPF`?3u3+dqbpa$3#j>Ux8Z;9aA{&BiPYYU9ISe|}Y+bS>2*2z4ixrKf9 z1c~O)t1{dCUKz!1Bxj<}qBD=hTee29Ej^40(;sT(8QY>laJOQkj2Kps>1s%=b)wY$<7awS8hwP9qjW!??#_t)n{8&{w!8!&vIBHc4Tt!GC7TQJ-i)Aoy9NF zVD(Gfr(4T0-I5Tp^i1~@1dDAR@X&*!wBe`vIHO?>C9B1VB)mbd$47p1Ft1&^5K<@g zoOQpGT+@Fk?{rD|bY)JvYDTGZw+$imThi-p)#=jW@+pcGZF)_q0af_hO)Iz%J2BE# zBN9VTh2>ugpZ}+I>3RhcD+)8JyN)gb3zeq2!qIMa69!QNX_&5jldbx+bX~ZN#Isv>F{y-n%REP}Y zVAyFn^o2Z%B+cm=&~wE0U^@2ANYi-;KbMjf5_O)dRPo|`%@$Cu{DC6`3irNq_j=H5 z-}MkVQ}?5aq^7{?QtVo;_Sh7=*)}utJOnJyq@T8fzn=JHyc~Gw*vffbFfZe0%VlY7 z;r?=L+dc7kmVdTil*xY%!&;t$p1Ii3J`ZVEwhLEsxfw*u9zw&=zL=eEF@$4prhStg zS<$C-e5H*)IB-xAJ5Yu?C8Jj_(~Nu|qZw#YY%;`O$j?3Bz!*;fZk;4Vtt5w{^PYw< z4Kw^+R9np33*+V?E(u3z7OAXdKWp;8H2ba{1Xg{Ww{^?k=H->29PT|O$#UJh!u<6; zaDJrM^SC^Fd`uavU7qQ>a|JiQm{2XL`;ivEOXoKy#vI>8FZ;1U-gHC8upOf8zMG|I zKPlvl0rvYrfgojwX3ElSZz9Zf9x(vp>HYS4YYGuJb9bpD_LnLG5w1ocfI0|(@7@p$ zxYsBEa9@#VhquY?H8zL)gB(NNuyHyQzIDli+9FD3wH%hLbK(s*hor)T`N0>5K{50dN?yOUX!fn^0jAlJZE2j zgtKEM^#gC$hs)hQ2~*L9M_9udD^x2~S$wqr$YDRlBqU3e;Wg906vJF%s!7= zx^x?c3p;(F#oXw7vyPF2E8g~by2{!74R$MI!RM!KvOua!Bb(toa;mZE0Q_i;(&tnr zJIKPQmO?|g1m51+B_)1;Ha^dHJtY-g<`g%S-j1&!xlP@KozdV!zAq+>p&vrv3KgC($Q%3SKqw8(#mbcBHU7`-oB zoCV#z4$J`nb0a}Ir5@#-b_Po)yU`e0&Qp*rCe?Nr16t<$&@7&|GZ;1$`NobZhB!)TMkt}W*u5bUCS5hG!|A}!0%^5@pt0+a4uy7|k$;tTx zq7j~ts{9-o`{Qf4QYG3l62Lz+zzO(a)28x%hdbFql{ZZkw9eE$6G{4KE5&lXKl zm;_8e4H?Du(^PK;q!sdm{jESbqx^ zc!O3N`@Z{?&o=sQt6^)*TB$Ved{+sH)f_r?w=0%)9Ap<~tgWdi+P_ zX-aML)mQ-iHS#=OlO`e?d-O=|G=;4plu>l~Qrx{kC7E>`<+m#0rNRC;Yk`bJ~T(qZH$SQD6wM*9H+8pg#rA)A5SjsAE`sHHXRmkd&1b+fkM$g|_fD4El$9XG&-0%YQEzk?qZ~1lD%@27@ONw^UDu+)Co3) z$->Qlu-#vNk^{#q8{|euHX`1k`d&tTO3Mc`UJ0dYtX04CvDe`#r%}6O->3(HGEB~f zrDLT(&tNTeJ7Y7SH+pKN40PHKa$MQ#z(R%ho?Qt{7Onk>2OaXw*wzy@e%Xo4T4p3|I^n5k_%?+xD>cY&rqh)O}EOJN{S87hRRu$@E3f zsEk?m6wsJsusnEVw_oJiiHPcu{F!1jmeGP>b|=`Ylq;5S}X$0ciKHlSkj1uZbNumwlmXizl`EVAA|Pfh~|8& zCV)a3_${gZtsBJaAK(`qCD~6hJNIx)PVoAijoB0ane)@uid&;`zje?n-S{MS=Lz7*`K5< z6tWs3Mqyx-#gadmE*tN0>~ZfICpQ^lR_kkZ*N>C196(MWeHy3~1cYfnLveI2vZa7frQ97Y?$rVcxIc{0>=%$4_cflwTm9cf5-0c5fBSTTsS+{r~8{~V@f z%EZ^X$dhKb2L)8&9|x;y3v63XmTfp_;aC#rKxUV_Z{jbL_1+@ZQhbQy94tP8r*BJ( zrpTe%;Bb3ZJy$yNmdjkfE;^nCQW=K_dn7-Uciqs^(aIql`-txQn~mKMQZN9QgbJKFk0L^S&n8> zHey;FL_n4Xqlq&XOz&IY;c2w7A4+9mm@q-M+#8p~mMql(_vV{HMye~1_O7`4*TtsO zK0nQc8Ku@jdXtsxk(%ZdKG*p$_Fitc0tERG=MCu>d;QS|D}|0mtaaM)GMfi-EmYI7 z-%93E`(3;6!9wGxJc>qdK5XMeh!M%^PT}N1bHV~VGaiKAFsj5OH#e?YUbNrprtkBn z@|G(lWq4K0nDLFlb$n842bseU2CE&Ctb)ItO)W=xRn47{UA8GP@*O21 zJW;2=`>ZbWaB-vwby$M9eVn*+T(qFGQ6PQkR=B%9fZ3s~#^W)O70M3egHpPMY7)3Q zW=34r70_h)nj?ET5@nk=@Frn^kI!74BSkMxHjs%^5|+SZyU6v~FxWl_pa3k~@O}vh zz-11Uq@XQ%#a83-d?|aXNf`@-*+e?6GsHyU`EQC0fQbFF((qRkGz` z#&m8cblj$>;m5$mw2S=e6M9^3`>9WXSN*jqR;cwpT7#6t;S43P011Pd^U z^~PEPECA2#_8wtBO9Mr?=&#Vw@iJUTiD``uaU6XU0wfMzLccm$Hpab3m0!4 z{*X{La%I}>Vp&VOuIpkmO-{+XmAv%c^7osqgvdt+T4zR!-#$c%l_cSxHla>IPzX}4 z34oTL%%8JyJ)OjA_JJ@z>ym_#179+G_6sr5#7kb3Pt$YPALD zEAC;+`ZnM@G+G1REX(KUdaIWoidxotf=P>V%*s#DD08~x)vAjMy>H`H0l&4-!kM~Z zjF;YkfTnWWAaNHWnf`i>G`^coeEY};y-h2BinrX07Rq+}f+XDU0mBU7Oj8kBRnz{f z-!DdPsW=?A8W#!teBmCV06{n%Z{-v+ckjK^<<~<&E5MGVI}p>O;fJB6M<1*9L^=OS zdrA1&R?^y%c8PlWV=*e*QNXL-Zl(QWqBbruE59{g6%s@ec1oOPdv%xJ9JvDD3H^Oy zc&~I)QU0C_zzh&$soX1y5u-5W z2{06iegFvQ;B8ZY@bWRwki}leB3-w%4Zf z37MsFO=YXj{`e?4rFs*@Bj>9EZ3S!UH1@jk>FvvSJAHxNzNf>5MRvOOr^KSDE9tdV z{HJ5gWP#HT_1tY^_LI|(BN_D@Uacu!$Kx`Kl+l_nO;DG=u%NbCFbbTjoPWOM9|(R| zwhA6`@tTnA1%^m5U4(c%?VO7@#jr&HE{V<|Uxmvc_rw>zk0xS+ooB()r+_bcr&wBreHSSTaRYk^ zEhr|0d8DWs%NC)7fNa~5u3ZxLc>9=VX(eO2?x6?!hL-sh($0&icU|37BGk7Kra`y& z3?RLWXa?*oB*B#$A17q;kJGR-K!Byk5$U3ReqP--l+sj(M z!wK0%5GOOMV1_yIF5!eN)}LF_N>+r0<=%0qt5t?IFr9y_+>x-?c5?G?v4F@FwV$p{ z8uOR7;j&-MBZ*s63wM+ZO>qY!cN;+fn7V${j)(d<=tl3ORDo2Rwf90T`ut+1H_35{ zv@>3NsZEF=aLMFn4$D2H@n?var(LXfU{zVeyMX>joKYcWBv*fWYLFxkAFOkdrJY^! zR=#oqReq0u*O2?LBzU!}wzRTCz)5j+sx|@w-u8W5n9eyrIFOTu+FOfO=u(m_itiVC zrL?p+@=4{sPq_(ojhlJjlz~|qL(`|TU(@I2@V4s8L8~WyT;RK~Hv=6h!B{Q8``9gz z*wJ9ea+V}tF3yoM3sRL1mN%95_y{m-^o|#Q4of`iR^vDAp@}S__Nb@X`jTWVPuz%x z3SFDzpDG;%xS;~p=4d5>QNx%$had~J4S-p2OpYhaMzqF|8S&m3jqtztKG$rvyuRj6F*VF3Vr+f7I9W)8E8IS=$25J z@l|}G>lL%JD(Gc*xFt|of%^dCF}L)=XH{RpvH$n6*R+r$J?qaE79@!1omNlN7YXeRjC zb`lg7e4j>-gL?IMhxJCe8JeafUX5YK|N6@U3nvAix3p%ehCHRiENPvD0zD_o6zrL! zp@_JB)9)k%p~(d^bg;=EwCk?gVC1LW#CUHWvdT}H+&t#q&bL6ZFCBE{Vx^r$p?Kga ztr9Hc!rZO6dG|rQ{`^awNBn`1>|iV-5C@+75}g<0D78o*{gr>J?ZBd~Q7A9NPUp1V zV|}=ivr@_We64{({D{yyj}||(w4f=jNR3ytU%hhFSXU=GT$H(9S@GaqDRaJ_s5sTi67gj&l%pXA44AUPv8bmwf|H_B^yvX;WekxVT$L8E&9&blt zHA4!%YNYYz%lo?Y^M1>SJk--6ZGb&!@lzA|s+Z5pq|4*MXE}0L-SRR6wS(4+9FMLo zJG5)tAU8wL(DKKPp8(AtI%Mzw`AdSL2w8?gEZzJaeJpxE1{GfREpr%ZE+I)KI-;5J_bAjL{cLsk|U`AP@yG|rLMbZrz2jcoha1b zR#P+XmG}$*>u`D5QP6xMcT>K6p=Xs+LAKM{rnFyTthjG7Os~UId{$quS@N##LHa#~ zd*w`1EhQhyaC?RvF&$P&hFZApmV zV{wszH^_&ASKVmsN38~SPy}SS4vpjRdDR) zq-Y6i~5i7~;UKRBv(^W4& z-lYtx`aUQwK9|iMaj7{lCMU?HIK@w_0jPjCe}(*X{OZ(KHbwgkJg=Ux5bo^S-#>S` z)h7!4z{Qo?U$YBo2Ztl_p2DlXGAr)>-m3exghlp#&7&|lyiu>?)%s%eDmkuZ~IAGinKanaoa#sqY+G*}9iwc!OzXru(r*iuS&E1Vy zKdYJ7P0D~xe}?l(_W8zkMLY$(&tqMO4*SGN))3<6^2>T}*dJ%HjGEIQ8cVL8{*pv( zRV$@|o{nrxkBVEKNAWichq!0{_``H8@-;it1haW#MEE9O+mO zOH|HCOzpYjJo;N~HM0-s(uSf6%WE8IW{gWE1I)XcdlBbz})mlXnFJMKdh3}!+bFiOb4pilr@uXcug`uD8xkRDh`umS(q#o;TGNR zG80r}cV^MEVCBVHr?+kkys8@!rP5^I@OoddAaqM|i2Lk~7vn}@ZG*^T#EozvdSL-4 zsAD|3E%q^h&JUx-XC4>=nvq-#ocyfx3H8}f*YTBXh^-ckt#>#A0r_Wcxk757n9eybF6x zTnI7dKtO6w?hq)Yeoa~~{dTwp(#Q;&readSj3Xa}R{w3LNjt{-xO}B8Z@%3#nApL~Ue$1)J;XF`3 z-nPpzt#>lybE?k%(|xgY_;3JfMk&sR`;pS6z?|c2k^wQ1D$$?A(j#6;tiC#_8cNO`FcCWq3h6;NO`QudR;Rcp zHNtnzGV_WW{XLyst>TXgX2=DxGyD_KW-B^SSt7!jGqw814>e~MS$kDMRZF;ROP02B zDFeN2?%AjW4JSNs%SN)LPws+^YeAhF!HRxAoL97CeRZv5R)>k9vc%Xqg)FMiPaKb9 z&8!&6Yy5&c=kZ!4kJkpBsjQ3nWPbE!qO7>7N4jUEKB4=O)#ZUTGkuaYH1rZ1b~U}H zD3UNP?6MtGdmVkvK`_WVExq5peu$6eKMLM=2&OVP~nIF$@bXAJJpg`m-nr#7enkj zKyGWv*Hyi@hKM1aMuAx^uA^7+7D3ZF98?lbC);!1^9pZFkn#QWx9HofNpED{>z3bS znt6x8;&Gf;Mjxk~bPA{>UFR)%w&70bnfG{o=1WTxybBH9C8d-8Bq`3CRI&kp3arOR z6<~0x-Ar-VKQ>tmnPU~(@ zE(f3GBCH%@tVcuLc$n5^Yof+(`-ou<(|w;r45Qt53-Gt{=v|28t#E0Z!3#|9ro21!m3MEhCGDF;W>1)@%GEW_@tkSl0B+N#R+>ewL z@u!VXsz2eVW8(s1$4rZVmdVY^P8p6PXnx{CAwO)BXw4yBn!%-Uh+!4yoU@hjRku8a z=WQm(?||uF0|sdRF0AT}5=bJ+^1VF)FPr z?n(d%^x-8xd($P+s@cJ)qtvFO)RpNYT56!AAB%*uFHXt%$G27p6W4G}?fVNOIGpn} zuuF-8-|4cw9)l!I32*1@A4lsFV*c9o##>~cqL1bAnMDfcx4@!lb`O~PGoEf*`vAJ$ zefI9$O5o06$Q%ThbQc+&n zj^s%6YdgG1hN~y6S)^)fLAF9bK1d|xYEdvv`K&tTSeiTE_@`F*qg&{Jy48!QMRw$Y0OfWvDl2 zJ|ryD&rO-&t*v}MqZ(mM)&`RLvOUU_Ol@iOE#SwwrQ1`~7whdq6BiUyGp@qi#oEiy z_t2wuY|`#lD*v3e9hf0#0e}d7i1M6C7=bvrbt!j?n^au#uT2qwteTjqwOo^vfB|z zni4lAdfas4>!{7qGQGlo#>R(`uE%AuilMWYcSy4^DCw;e>%=cU!mc4OgH8H0Fzfk9 z=Zr;T^Hgchkp^Y{3^1|jHtaURr_Zz7dAS`M8ucn37O$J1uIt=7F^N?Ngvv4r)a-*U zlH8>M_pDHrdMX^5TVSB7s?>h;45c1q4Xok0m&=qpY5rQQdoJ7tLn^;HnwK>i%Z9`6 zf_Fd;{s}An!LQUR6Y?2P=+V}xH7a$@putmg21IMJjy>%&=bV&%d zI#R@c@Oo3UE==HYD}4*6$;Rzw`bKxm-43zV;YLkmg8kt^2&>1Yv+2Uvju-Iy~HTKS|nKE=??)N8y(>+|(=_sfO89^cofom}Re zBJyRW$$ATd;#9@&vaML{SSIj7mBxB8`g&3(OkzCz+=iDWktVq#?B~+4d4#_uMR^KW&9diQ{8Qk+mp;{kx6+Q z;l^0&_b+yuNe$1en^rB5gjPqQWSvK)hL3Hz^h|8HC+FS`&T;U3jW=}2bEFd1ll2zj zsms9vlvP3Y@`)?zYnnLU-P>&|=%Oerz`mZ4;xmr;rF2=c1)cZYX~wvu^!yvvVzAJ6 zXpFW|DlCi59Ku!Ru?DFAA;dUCm>UqX-y}krVucTS##3>=0cip!OHPH{VY{Ng`JMjG z&^-w8QcC1At9l=tRfsvanEJjw*sqZg)AP>RDB&t!u9Ea>7$gOB)gH3lI|_akV%oc+ z72D?H1@LoAw{~x#d(yC5ljIK~Ol~K(vJZb6rHrJ!A@_Rxv zZdvPf)W)vu#H2~u{x7+U0pbI;=_yV3ax?=LKjJM2C!OL&0PDT)rcqU!JLd`O3{^!9 zdN-w7FQJN=Wl8A7hHOReD<c|yb{ZIAz_75kS zrQzC(^z|jylb}yn;(65`_zA!dAk=oP^X&p8u_Gqh@K@JcW_W6*_)V`4b7ek<-VVYS zsowAlug1Mo#~H3*S<6A)v-H4Zp+l#Ls|2D)r$_1bsNS(rk#wp9Z?=S7j%*N}HJQz_ z438(`&d`;wg;?j_ z?JPD)rqFu+NuT3FN3OJz%%5X|ptddCJKU%F_$XeG0fXZ}(w$To+ero9W1DFArM>?X zpT#dnbe}6$L0Snc+b16`v5GT0L`eG?eR4&mRF$N?ehC*L$15MjZ@DY#X&h~8Tl-$e zKI2Yp<<{_}FRW4cB;JXh>A?H4rt!mQCs$HX{UyiFC^ zSolHMEpfkq`0PYd1$+0B`0rXT2H?UZc|;^;uEjt>OP?~RW(mN}&FiJz_w&Mw4X{lV zXUIbQI*GfbP2hZh0wz#iQrcix6L&p%=K%=$n7_2MOC#fS&7n>0g#$I%x1cD`PPQ-c zZr~{2i?wDxBFT>Ja6W5P3tSmHpxR5BHP**PUYTB~kW^wR5o|#btbVsX39()L{urmoE2+ZX9H$ znmP@FlSwBQwe~<5r-W4OY)8vHqa~n1fhi6#{S?h(v3wx_{6|@KK64J1aqqdDcVyNG zkSTpVQVgiaJk}j8(P1_>u<}nApj}%OsXwe7v?r56%WC`RgG6bUI{*1$TU%>SG~y6_ z`*HDJqUiNC%Cw_>@+EEGA53r8zUi8OBD*Y9W z-}}b2g=7pwpT|oZ+y`2AR!RMh>*n^x7GQTOLdu@(wV00N@LOXGm!8oeu<~ixdUXk= z*R3SQZhIiclc z0?dBpIRC_q&!)uJwU<6J*w3o<{>f32R4Z-W$>$XGWq+qBU%^RtCxp^z9~BRfe4NVQ zhRTii8l*dM3wO%6!MZ$F7*3@WkPZZPlj#GWm#Nkf-xry{ZNOWbJ72Szt-5w;`tWyI zs5yn*TR7-~F-G(5Y~e$DVFAT@irWnSq50P>N*GRLG@SW?{5-K;mhH2-l%e={;Eop{ zP8Mt)lvw6!AZO~-YFQEM0qN2h89YGIJp)=5CpQw7JGm=aCugtcKcjPCfLp;Xnaf_; z7@v*eH^8Nii+V?NSFpz%6jmHi?7^J3!>wVH>gC`Y*QHb;13x7`vvO%KGH#B z0Q`$fWAU^JE`z%zu@z$^(b5_sf*pNA<~WsYn8fuh9(eDS#!vJW6YhkGS+WHDH2)!S z0-CaXhLdm~5*f*9Qg(@~ChNAf-{?=O_s3;9eK$;zP!~aFM{hVvd3Upd9mm>H?s1oS zDl^iH$w}Fy&|JVGxTG|9_EpmgqoEfU4mB>wY#R6uVzrBN9k&e|og0>qow1ZhZDq&b zm+O)GOKy&Wa`uUAFfLf3c#hMmuy|_kVr2ZFtKoRQtK3AkIB)e;ZIM(N9&kN~;eRHB*~-9D?k+Q|)dz53H*fZg1_ zBf0+({ILajrFD2*C`-}HZ}%y1d{8LC@LOj zJUblreB~Zebv<%Hs;lg|*_(tg8A!(;RTHKF=`|wZ{nh1Op5G;JAPBpJj+_2bH`@kW zv7l?!ZJ#Q%B_yX9XSJak5?&c-%1!XNO3mw z!S;U6)NSR$4s0i*|K!W!=Y;l_-|Kcv!B;wKyZ#qb=i$x<7x#TzTdSq5y^7LXZDOx# zQM0Z4u02{bRLsQQv{Ef%tBO@h6)|G3QWaZli5ZP8G$E8&k6zdNUeEI$6LxD$gtn&ZUfJu~wC5y_!cflqItO_gyEJu>}CZb@*`h@JBdYYZC|t z>ftwexx>uWTj(_6K6FXPf?o5wKF$FiA_}e(u(9DA zZyWivLpBo-bVPRqe-C174af>v7Eu%1@!iKKuj{5P1#+=xPzCCt-YXEVV= z3&8F7iR|wb%-|8^EzTUXb>6w0*kiXM5&UMAR<1K-tK9UNnY`JwwM&-NQj;(KXi9v^ zsG6Z|es#x#>qMZX>QT>hGY1XW>PHg)GiZ6l(ZDQ5eOnw5D@VY-ho6ru{>CNk`>E%;sD?>b~ny2Uq6@%)EL2V$F9l$@e z$FU;|2` z?eQ#=Y5k;oy}2zKD@R$`BkI4~NJK}gi+qgoExH$?vfY9mM5dAIM1K7)N|bmGU0|5} zvNa>55F;HU;F;Jh5||;-%Zhm!h3^fEH(6q8y;alqO6B0vK1g6$j<~{ZFU;enwpR zSyGo$T;|M-Mx}v_y8cB-nWZ{gvh_sI)wy_%_RWq0lo z?V3c&zi}Y=-TN6gT2n1%vfy$rEyJ8eb-)C8dlUiS23OZapkD4{K6yPfA3(*Q*Z6K5 ztQC8Px`rdAD;V*2_Kr~Y0WBM!Kj>ev6H|Y>=Pc~wtj^U;d*@!aX$)^R9R?#5`iVJD zQ7pVpSPi4%H#_;IZ{GH>rDbjMJ6Q9PFJNF!;{Y@S+ypK+tO&1G{6Vmg>stnD3v0_( z;FX;o-97jI0Zw4sg#F;IfIF%Obic^vJ|)^_y7}bcqcfPOz=P*LZ}=->EUVvsk?-IO zxcae+8$tLgZ3&YOMtn{{u@XKO2nL7jt7ESY__nMlu&MQ-GPya?r?m`yo8F$ux~i<= zG%16#@%P)Ufh%81UR+N;`;=?IT0O|mL2V=S3QgyF^n;_zy9G*eN-!`d=u5kLh#nC9 zo3(1xHG{TXs=jhGW=-2UILhQJ4YU4zgnDn|O_KiN52Wg?t16w~rmoJ|hk)Wl50L>< z?G69D>4V4LRWKmKuogd8P?{0>b9%oqx59;k*G-#WY>mk;Xm~&N#|FyM!EijP{?U@u zPX)s2H?ul9)oW?n;mQKnWTYMDC7ot2f~HNxJl zC9NDi2IM7XC%)!L({-s;?RQOkjmIIE``><+sr4HvcITxbW@1FR{HlZa1T?Th0YaSW z65an^pE7u#mOgQ#RgA0k?4AU)&X_wNSu&9!FAl346BovBbL83O4>{%>kAIQcf71B; zGxSpC*B|O?hoy&A+$TZHU1W5Bhy=V5JLxnVxXP*F%$96g!?haW7jmMiy|Rwg#l5;hOV_ zBLnoHIpA_)&+iI)%{UZL8c;i7nhT(84q*l$M`qbD@}>`LuG!{WXXNukos-t%cYuUg51VSLvqeJA`WZ+z``iJ z;?!`~gNnw!`yLU4QjN@ihxFX^mW=gdgy2qBm4jM5b8WFM#F${0)uZYuwvjEuy)0re z=5bDKy1XXn{Yv0u{2|NKde(Nnx#CXPW#RvK7;l1tN?`|Qkd0?u;(^_I-Yf)=ceA!o zl=pqnbA3M9JA=W%qF2aoX{G|DGJo2}xYewIW9+KMutYfWcbLC3$Zn4fW9XwdAYrC} z>HZjAQVSOnu$%DyQh6XwdlA;C;>-w>_#coF~HNfr!`S(tfuSe|OKUOv6!g_4ce52ws*=N-`?{Oy-!-@rLH$;|8hi+rb ziM?o>bOZDNJaK6CTkYJRsXz1PRh*-r0;Dg+AyE394Hogl^PTe4-Gl$cUD8}RzRj5g z0dj`Lu^@Qq&#S-Q*198gSIJ{3!*J6I8DR9UC&=JU-H8j5ntbMwv)H-CDGnvjr8$yP z`Af8a^hQEP{bnq5JWngg;v^;G$$+(jwa8iq&Zz2;EG#k>pG8VnkXbE*pRdq`h)2>? z>m(dCiD*w3uClyXJ!T%CPqCt>w_7yNn73St%>mOk^4E31VWIowNYQ$RI+fE%D80z0~=GQVMe$R}V?!Jdp~UM@|zQ<{KAOx$!Jd>x6~ zs^K`n8Nb`b+}|tP<^_5XD!9Yt#djq3-|bcuCMaB+>iw57uSMx&`O9X~veQV6+2!l3 zl5)`0J7|wcdO<6rT2Y(zLR<*>l<+{W8pt7!UGh`IAp}+1FmVo^DT6kjEmUi_$W023 z#+#AoF#~6%9nrt1OcYnzEf9H1>V{2%i_1N_XP*Fyhk<&+2P*xbC%o6p5es)MX7Y-? z0e+B&$`S0xWaU?=o;1o^X+y2lU!$1*DHc1`i87YHpItxX!rhDtrrEUP!-%~f?8gPv zc^H?|l-WGVcS6SVSpj#&XOt;@`eu=q-zljUStV!vt%Rlchocd zZCAF32C(kJxDI~$ZM06sH8)>wc~T;K?eb)OA?QAD{~8LWC;H)+OOdyW*V((>GTLEl zbq7EoY9~tL(QjdpuM<;|N`n*sNp<3(2HUHmbZ5a}%01&Te$AS!a~G_A(w%(2wW8dx z=|_IxXC)%(N;ml-<02`;RX1qW>#ZG#|@OEitr9FnB=g01EoQUlVUBuFdR=3vP|<>60!t)VR^3T z7wq%S93SJvp*xBxv6VkrA449~_`6KjBaI0+hNi%K5A*nfo%BQDa%sTdoQ(hv9{y^Yuc;7 zh{GoW#|JV+HKxx9JiOe-KY+%5TM`q(^vAvHWFP#RAC8G zd4JAkK8n@%c_VmYDEmDBrKuVqHBE%Wq`tgc!;gZ@QPk|ZW1Q4>>3j1Zu|}A|0>X>L zJ@f?qP{~8$evq^YM)y+VfsbQ3jU5W!;TzA;d7)epB zZ>BTOxu0`4M~wHGfyTX@WQ+Pj&wp-WRUrO3=4SfO8g%hGc*y23_7NTw}W@cO^ShEcsCzzOfjbT zzRaxJ+AwA{w;t!by*KoN$3*|pncPdRc`Rdz-%XQMYnd?J>DvNfH~2vUMg>5oz0K~s z14jh*jtEGP1H=P8zcKf$t^M_>0!-yjH>4x>uaz}6Dx%_rS$S5o**6yOBYS>mZP~AX zFQx1wXrOP_0&uE^y@3%u{XByJpe^686gM;<8O&RLc}D02gNb*j@iZ26)Z-UQwJ?XWcePB=4%xEmVtDc6ukXHS4FV*1W|jOjM_7xQ%PScICu`kpk!e| z-dAiMy&{t43m;P>40E)W)115Qx3YQwlW%{>@~(ii}$JdB8}{N!7-l z=?bsA?X5=!UscP2*dO!v+?$hqmjE~bz1Hx1=RCA#q&dQ_?Fmpfxb6T@Sy)M_9mZPr ziSWUWqEwledmVh59pDjS0m8W77 zP9kksWY!jv;O!^JTH$+#;^K>BLpmHsFQf9!9CxPOYSS3)j$#?396!QORijyQmqA(Y zt6Ac>zI4)5{{y%>xAV2H@NkrPxj8vCUoB*ZlI+;%wSc=gx+W0w=Ga!y%hW?JrurN~ zmm|PSjXC1Xo@jSJ>*VT*3#yT^Zt4zuEfYQtV?nZ(ij>-G7w7qV@b@gD9t07j-4$k- zw%^u8I()|+IOm_PNK6QN{KZ4n_XM`iF4;RuH5JF$^SuJt0$_>nKzDdicdu@W2sa0u z_4Rp!>#S*&e*@#VZYd8l@U@ej;>={% zGQkS7-W1GS>6>7g!9c@6AQL}{@Qoi9u=WJKNYuLowL1oJ7Cpw=;&!Ndt)apHd{8BN z4=C9pCi8g_)|$o|r^N1FO8tz3`Wjg3m0!Kit-3)ow+pTuqpCa{yK;()W@Me;of!zmUIDyec{_>cGC-~9<=p&q*oEXq zs(Rkdv9cEulEkh6?&h&vdNQU@CL?nOzW-JbFAjg&Un6iiVck7;0FIXVCOG|PXhh2T z!t#hD(bRoAulkzVz4Bg%n(VMG!_BL()5&bq^R*i}euy!5yOz4;v@8);xK^9WbVclt zab*9;tMdpyFZ_htr7jK{Mi@%{%@I&OrWo z&rt@0$Jya~;Vw)nalv*`p6`~S6k3^(u|94TpW$AFf z_hP31DBEDY{6i;zsS2?;eW-HfH0-P#xjj&0O$L;iCbMKF7AO6H(boH>BZF(ZHt*yl zx=uWf@kS){rPka_ONf@aveUQ}Q3S>b%_9cv`tIN9%IgN-+6bcORJk?@Goa9Wb9Hg& zRZqoXB>Y)36GCF{4s{!=j>tQgi=34lj$kZ!KdEcdlu0hp8HRu9`=|6fNx>1nA=zw< zJC-$ZkUQ4e8dhG?XiyJUB~*8#a63y(JnAZ=6LsNqI3{p|pI=%%wRS)}Kk{yc$cbfW zSXAxL5=wF|B4cCHoR_;HFB2&+4oldBn7)#l%%=DlSC-|6_Zv4vIxW=xbD3#6+~Ue_ zOXV2AR#inc7T#_$y;bUl^vT3t$I2=K7488oUeAaZ%K)o1MKPH4AXN^)E5rO`p_PDo zTNgxnMrq5PM#JWE-7Y3Tj9-k{ynu`ZI0%00y&jWvjWeNl%(s(I>RL&)_+W#}sstcK z-0BtcUQKhr>4pWW$lzI0TH^fVA^B&S$Bg*)jk~A__cKJzLDan0!4&`YW)v+e7i_&G z$BU;bGnek#VwX2zR1g*)<=+XYekthT{#rQ~*RPc_%rDi3k>8Hj;D;=`hW8yHwbHSc zjyKgMf$baSW;q%jy^m=Zf!jZ~OSjC%3s+k|O|xDW-8`T>&acl&Hj}&_q!}|VWe0fa z@EucrcK}m|-#cX8i`tY`7drMF*)tF-BfJ~gU)Qf{O^uPVebakmqIH9gwx86Z*U7Es zrQ!v{F&SK?$Cqi+fs$BiZsmMob*z1cf|>T`&}s!c_e{^ev<o~iXQ=tB@_A=&cw*HZtzn(uzo=48!jyA9Xh?b|ncvbNt4 zEX4y&Q1Rs6Z+EJ9{9gYz)lj=5OhmOz1s+ci>!a3cHay`^03VSXAPvv06?nbAgO^2I zZ5h$8Cw167%kSNNZq_N=I$<*rO1JG#zT0Lmoy3}r;!| zbY}TWK;jN|$>!Z+1zT7=U+`*$rfQzX&b3d{ z=e0%?-zUco>@%4zs}(FC;CY|^PxB|Dz#VrOsC6QDt{ zJ1~6Lz53B!s^@V63)9guW;qI%TCN$!?%ixyYBeG z1?{U#3_?M90U@dmJH9P`A%4uhIN#3{qp~z}DkbH^VU2`!71E84W6*q)?}{z&mP^}H z7GC_Th=J;Y(oNEh>rb%i0pcvmhuv(5fuoh;3iFS6b=8+LXbQO2KpN0n!~}!eX@*pO zsIb+L-#S`J*Mroaogc_=m2T5lIhL2NC|ueFmZN_uSN_f9EjiJ>Q)@$e4K_bj%ZC|K z#e1U7Zn^9E4#0~{MH=N+Y1{z?cJ|u5_V&+`kV6od7b@1KM;`TfO#pcV^_2jv1h;bal z-*M+B4$FyC51^jTp#PhdTD21KV6mn(Q%vaXcf7=<6jcN-XMgZ7)Xr1O&1O0uzzZ^3 zePP=kyZW~3Wp=LyN2~DR!>*enNpb;i6}S(PnS9D~zq%aXn@qC`Xujj)b!|(r7Nn>| z|FBGA-S3>}{RmkWcHLg@7!NnE?71k6;9CpameZfu`rD=QCxzL00;g@?H-g$ztBJ@B z|M$)rb3#}rtlg!VdqUZjTFh(!RY-de*!{%|>8i)ut-t*b-Z-u z3ws^#67b&i<8Yd(N4E>!@7XMJ86?^z+*qsd9Iy$otBrZ;uqGc7!`^KD{lV>b;4oE0 z=_fFe7)KB7?q6ui71SYC@K5{3&?L*xli3^wYT|2EYb`+~Y`uN2h`=g3!ROn3{RHq7@fs-X?J&#z;!7KJm%)JHH^m+M0WFuHmB| z8uEUAv*}_xp;NgX#@l8+GBY#Ek-NzJFD>pFe^V$U9j%m4GyMLOIL?Ug%?Am99Ptm@ zXGnLIRgh6mLKr2vXK*T$#Th^LwyLVd&NgTO>w|T=ih|4%V(3eO_Z=fY`NxbY2#-9C zicx1=f3Hd%_>B|b^G4V@`r0K@#ekJ#Z3|SyY!Kd86Cd%|1^&dHW5_uzLsiw8NBeM4 z?J67V3i+0m!tD;yun2f?K5@qiY?5Tjn@ia)%5xq?By2obb7pQ<<&IS9ueox*wi$46 zCs~P68*}HV#|%Ur3h1<8?dr0r*~RD%w7j#wQ}z8#er-b?o>%gx*I3HIXTf0Sj~~?3 zaSK+PEC&KV+z)ag+Ev&(wJRXx;ns$S)SNEPUK}nvZ}UNw7yY@RMn#^tEACxd5At3K z@7xrtLa% z&$1X^&XL`A_8x79(j7qc7(j4W-=h-Krcelp{eLfA;P{C`DGGMbZe>lZX(G!B9goi` zN@Klb-Fc1=P#FiVRlsV#;BE)w*R1?1)>>^=tYV-f&gl7!Xlnu!&;_Pe#+0wg4<dSlcx(s=__XgO*H%k#LUCQ!XpmH|0MP1RO9e&D+Lu&P4g^uAY4*AGhr0FwhC-7crNB9ZwA^2HNCz!uhJ7NmGE zfBQoiYK3YqpdN6l5^$hmzZxvun}eTQg!iv_ILKakWu`NEhU+o92Jrn9^SKknje5Q% z%Yl2z*4$Bsw4@O_+34=-rxyggqIF@u3^l(Rn6GSn&{I7R0- zub<;f?y)RY!1K<9#mHIjY^850AVL+4&ua$+* zbMu^lLqmiK49*I8tm?UGoUde%uLYUlIPpMRO(!2dfxxyKKzoGR;nwZlrO0o;zbI>h z=^BL3hWzW}c7%LRFZqGg^*FQ?FdlTBY2jA`Q7Y)Fc24YN*C(w45=GfEaCnenaXU&i zyam(*vI$8q#hcN}iwlpvT_asnO>)tQ+6hz9G81QIHrpDZXjYN$9&mm?x&+einUp^LM6UioBS7s+8?xkl1VWh_n;)B;*Koop8xr zD;$~KSLX_y@A%E@95Exe{>dZv#JnhA{r-#3!knJE@ojw*K_N!kK_!+do64%Cp>1@A zZzD#jLMAiQiO&iAf~Q1kH(Y?`QOW+{JD6`M^0Hy&s}fYytBmce&r}+-Ve<;w?X1Us zI*?|-@kaXnLFPKBwN7?fa5LWDD~bh)pS5VU$eLMV*-jzG=F}}~30+-{M+Jgfd6b~f z*_*W~1nPFV)3Ht^)N|4W1=AfFIOiD}DeFLU`XM|NWbV=4PB;Cgt$nDW3lPDOZ}AZ=Y*Qzv)I!-%xgt&r7l%*F=kI6J#yk+}Z0UZ_cxq1{*fo=s z)-EK5yVw7NNqJFvSHZY8y)BhL+mLl-g(PBaOfP?U4|8dYZJFVL7W`+lz}X2-KDK-8{>{@ z(8z}I1-UjK(r81~p)(tb&a2+ngRVZYF@G%y8PJ|eR6uKh$5PLIcmGtkVXT)9N;v`y zOZY(;W+BIbM_G`|^Ob@jnWk4+Jgd|04t;OO4u+ptY~mo!Kp!?-2I_z+?!Xw*b@=YtWE zj$obd&4iy#a$pp(55)_O?FEZ8ENGtM-}^o}TEkpiGsx=vlnj$@)q8pl#P{knO*yha z`-t=a&$mTinF16hd@culh(Dx)^x2?zi8XTf0_1fxuYEy&(Xh9Ja^$_4jt;SRDe(n& zj+!Oqp5s2bzA&NLovFYv!F^IygHw?!rKmv-?oX1kJl*J^JH)^lqcdkmg{hnR>RX!|T;hMiQwfGuO4Sc&JsuR%}om813mqRCj z77silKdhR)7OwUXsi0%IX%!QvXAW_fI!%;BMXNe>#IQxhLc`rG6QU2RJO!8df-Zbc zmwsJ93>;d(_EmHhSC8))pH1JW{$Br^j_%} z7z`Ja1)DV;@vJw|J19~);9N$I3Dk>-sBLi$znjFrv+IWYB_8x`qFHI|9xAHAe~fEFKej4j z`-h&lc48rv4GjnA%-ICFBd=;ug?NIGhG(3-{;oY~H;F&09=rLUrG0(d>Td(@zE4RQ z=;3|mJ>}A3ZO;Zhpj+Lhp`cdyKeMC}hfn1JV#CWHpsEm5hR?9JGU!~eebdzA!Qu$r zNN0qce7;;8D<70@w`CjAuC7l!JCvP$4h!-{K0hT-4R=%XJz4hA zRYY?53Asje+x+Na6cA{oalx+pvDZG>jVUk~btza-nt-D z^G&44J+^kLPf`cBi8-D2-IfZ2&?~Bqqs-;aIj0}R%J3-)*@d5=1oK`lOn;j3)CvP* zlV@iS8E`yE^sxW%92=ja51C|9}Fkk&bva^gmooKh7f z#*w}k*=f^|pnsNrx=u!ceXm8QJq6P^RjA^Poav2~w1%bL;Mqz$%{}w*Zrzrz)*m@1 z;TgrK@nYint~)eWy!z1x=?_KmyD$5h&03;>4peCg^s@b2QhfdJiu4sz%N4upQ{u)R zb*!pIy)f2I6UQg|+uQ#g=A2JWQ&mE}ol!_e&tydF-801CV#0Q#xNm0P_h_W_y zdD-(_Y|nm4Pk&!e(*bmr^o@6oQIBxIAx{%I!ww&uW6eA|jbUpWELvw96Yf1$_zj~v z;wNLY8_`p6?3T#rEJsj)T{mNIV9)o{pB$bZm5u3_*Sqm1=EWF2p`3B=Pn_I^6PMCQ z{+KQWFK1OujN-Y=DP`8@+BY{9+qP>RubWia*T-3Zz)ICh$K&$xhxw*Qk=}vSba!=z*SDR@U~VD0}gY_Mj5>Z z73T)}bW@Eltg`$$fx9z)Q6sF!s)45J=a$;gy;=GT#67hWPbn~BqR`dWNAujpi&stOuwE8M#e)t8x{~R?q~#yG~Bo-7pmnRO0WV^{G#+p@!a1MhpWPvCqPgQ-r6L zTtFrwafpGa#MsMqgsfSd>phrP=~z47D1u2lZ|CobR^MIOS@Cxx80WDZZ(p(KzoC#hG=}}#}3~vsw3Fu_ct=ubDq1>%W#>}0_+f5AO@-KP29`A_NQ}B)cZ$9_GwI z+>(Ye$UXX)o5#zA=HgUZ8vAPrMZ>7&p&jC^UKo*%G=VaIAw#b6tQ2HEUlM5W<(!N7 z)B0z({g1kG?u}>U2NjaFlQ`Kiph%e?TCt-5!RVniB zx(-?u=R;FRK@Ees+Wc7SpAp}(O;)xt6E3=p<#%^6L}@V>7>#{VV@dzu!sFV1x|&|q zDtmi*ryBUHM{LH6h1{ji(*3gtgw0<;xf^TydI% ziBe#myo5X^baP!M=N99@fHbMEx5#c(r(`cFJcT&f@$^^Cfr#_Mt%j`5Y=Yk3dRt>3&7^WGuwUyuv@|8=K8mvU}Cm%MVz$13zE5Io!S!M%QGWg3Edte zDo_u;h>_V`n~~d9(>Nij%H|`*IP*~XlHszkp1C7L6m9CZ(e%pm(UhOBtZ&-cwd(v= zFlMHWN-YDZ;)_N#`FSjUbhEW>=tJ+ ziP2l5yBjH|a#Z+%Q)6#XdiiyuSJ=$uGKKVX%=>Lq4;2}YX5r|R;S_EDFW&p0t84%R zb8>d&sHq~!AXY%IZqwYhUjSF%7~H-wyxirmF4uGskp7)3wD|=w)Qb=q-t2K>tni{D zun&5BYWcb*;t;brl7h>d3w$rZUGd}TO|wqxI$(FzFcHkmN;T=W)jh21r=tWvn$&k5 z3JW8x5c!&QoQBvq2sB4aIc-DqbW$@rAq&`BKfeu6-Bl2?eoY%5{q-1P*g(UxfUk0l zXTz3OK{(8tc7}N{AyC(C+_=*XkC|>cC~xKP`o23Jvac+VS`)(%IrF8$Cyd?Dn@l}_%m88f`Bp2* zuoP8~rQ?5%%m+!d5%fHz_L2NNGN=M~Z4gx*3`4XXX zxky)k36uQIBeZBH8ulmmjWD3IE;)!ytbm-fM=1=HD=Q>e-OK`Ua#%JaUpsCS5=*~)#P6#samrPKS4o&_bL zN@05$)uZW6eO%h1hUUZ_S~KvGH6v!Ct!fr)5fn5;ebZsaO_OS-WeYL<$>(4>N1=qp z?t^9n8qqt0YDu%bKBLVkO6?aIXxEi6L>oejU9GSP5Wih4(xR}YzC)n-V8vdP7vep?<_Qrt2+T%y?9d8Q-;%b+Sdc3{ zyobw&dwCr_o8GHW2eY{?(+2G<*(4Ssy_^SslEp*n&*r@A+$!8F>cz+FgQ?klg2=VP z{H3&njpVk?p~A}6b!-6k_JwkO$NZ!2t`AZ?r6-^)X{@n|TO~E4ODHxuyk1%5=pO== zOb}&ETm9GgT%645$Pwb=5};W3=aR$XyWD!N+DPX>UIbs#kfG_FEXwoMe+1*A7Zu?} z7jgHyUF(b(2DxdR`GmyfdXKi(`S|Xx@82#tyxaL`uxoUi_Cz)b+7Ns}5AQXC|M&7w zhLCO-+bi;*ZqBJpMn`MxZc@Kc_U-CE9a|k?ru`LHlQ|7p{Z~SKN<4d_jl|8T4-WMM zmlSU643{rwtt8w#jQbu{GTG3f6>+r1sj<`3@r~q_|N1D1F_F6w+S#M`T{qu_* zUPZlEZQKe)O1CHTb35TA_=7~o((cj;@93LS>o^FXlz|+pqxN}FeTlkDJSPh<9ZnZ( zf7D{Zcw1hWw$^W9)~L2jd+=Fn)R)R+Tgtn;TB+&1jVo~@GyjRYGUlXe9>1Ot`D$Kz z_|mM>TT>0Wv{vaFj-U0J^wGiljA9riNVaSjh(WDiz>y}c4#FT;r}l~N_eE}*m#Pig ziw`2up^Hci({Y+yd#X17=EP&DGMGFT&EycE10`o9kux@Zc}FO zJIOwW>LEkF828t-wAp%I5hfvSF|@1Gshslmm&Xe?nv)a_wUaf1LS&J34rElgt zMt_+?7gkHEvI7I;(AmA5GCh2KTAv#kJ@NJi;YS;G3IZtmtTPqdnfy0?gDc;3r2o~}w@;alLc^jE6&sO4FD z<(d4`ez{z(8E*$F4kx1mdI=>yNYJ&IjXvWY>CPsqEz8XL+*VtZOgKJAnmEy5);8QI zv$HX|QzfT1nKa!-L-aIL&#NC(bbOLHU2jN76V~uy#J>URnsR`qH+DK#(vSyMK_30- z}5mRfS62S;b>+s;CMQMRW3 zdR6BYmQo#q%&4LMxgZ>sPX6m2nHX!^u|L@jPUUO_dRS^+z)5H6nUzAQE-fR3e=UQU z=>6-aAumi&Yt7E!^hXV2fRk332c}yZ1NFFg8at@JcLz`Qjs%ITPnL?SL?MP&Pq50Z zjO6Dp0*N?WRVBl5ctdOzfbVp>vEcw|d|IE=U3Ct27W~a)esI2ft|jXFyR5>e`tOpf zK@Fdpx4xAhE^0{R@#{;hD1^lgJ^@R3qSRtlSzkzh;-f;)ZTqI(@$mx$ZK&KdVA5V! zsPg%GSdjPU1)J)P7QTk|q0qLQa}HKuDTHdU7?YnU5|P1oAi0u)s3RFR^nWrL-4^#& zVO11!fIz5bV{2GVD}i~Zo43)^-uCsrCjm1owOK*`%A}n{wlLVA_?^*c%uiR#gjKTP zBz$WBgEF*@&h}pGm85=bRJ+H^0D@|cUnRbIw4{Cw^1u<&g?J6*T^p_uQ7Tx+Hg1mE zD@Tw&D9;r*M=^#Dver^NlN3wXc$7;&cGI4*8IUj(Dd)r!R9ce(CAmQxo4GfnE{$E;sw2!Jm++tYQD4+A1OH_9@Ugy1#m$Zg{zB8`U$7BRJ z|7l-~_<**;Q_DapsY+?8m5RM~JH69R9h>sh&v)1eJiCdyoGM@WmS_-f>?oAuY966w z5J9NvHIc!6uWq}{TOC5&OO?hG&+e^AbA`?dtCTR#=v++ePlQZ=tDI(pu#FCD*p&Wm%!dw z_^6QSxIIxm9&I8&vi9LtxJW^kA76|49a{D zdxdO3--+ggsRFaDpbcqJ1^y>j;7ha05A{JN1^;s0XY5ZtNbJ6mEOyOVHP*MujrbDB zCjmsNgW*j4cC3XPlCwU<$>+4&zqo%NeY6Z&sTXqm9BCK3QgYYW&$z_pOLFd|Lvt^x zh+*ZHsAChVsF&?4y+%GSx*r2SxcrnAE#=*ms%{f+Ni-hWq4uU`VYNFc^K>)=^nas12MtQIhnQD7((VRID z&@8Io$TV)zA$%*!QMvm!7MO3pd%Z$3`nJ!`7*|LS&(T|pPGl7UwOkqgs}cjH>GiK$ zIxG{+3r{mX3Cul=D)k?;vec!u^khwhnSX2VT$_Ea(n7a!RtOcCZ9Saz;9N+NvPLIs zj;8!D8^5k@*{NL1PnEhm%^whLV>fEjkM-YCRz+;>nuf zKqK>P@1fv_Uhhiu--;DFy?3-BXb&>C%#7`Ku_` ztgk9|T-R?OP^r`wZ^}l#(Jlxjezg^<%cEi$k_2@+5ZKtRvw4PYs^J=eq4cjIJ4>@V zf(4r)^K#Uub(J2h=22Pox2Wd_6P!#3K5!+Su5Vv{>G2tAQEDbt`v(HGCq2!%!SnxF z0Im&>*fs&-qi>JbhR`hlL{&+o+P`GYLh4^8qz5b;{QSI~92<>V4xqjcOf-r3;}LHV z=xn5B1b@=Tu`Jk8*q=r7;idJcX z(^kgl%Z;R{T(t|w!=)LAt}Z_+jnn@9rTtd*9QunLC#X*(yU8n=wJt5TCWbSt>0o$M za)o)E+CG;})HN`R)h4F0K=MZU#J$B?g;A(n;4w{s(t#ue6|K2V8~Vn1DG0Zq^i_F| zY3zu@@eHACZ3WfnyCu+Z9%>vKy4Nr6Tr+KJ)Cmhv!38ycNTk}M7c<-;t8S-ClP6kj z^1U>o3l&th$X;gD8Gi@0I8Vc+zGFjjJIGKmQ%3GZuSmx6X$e2cjUXtzs=TGay4x8Pv7WBUg_g7fDhD8>5v-&M3pmOH(|8JJR2y z(^+yRLD_9V>SXoaC84J}mu_P^?Z%;QiHnJOJ5!3*#{KYYHW*@=t4JYS4J>YAxjD#} z3?ZS|U`7EwnK&ECxgQ)30D5499De7XjmOzR!Tz9qV`A&d1+Zdnp}F~%+25Xwc~);q zNX#S~eOY+-tCgtOkIuz8tUW;rK26*m03L5G`JlSxPlGkT;-PX)%nP&AdlK(OR*T(q z%{a`%Xf#Hf=bi=#3y1O%#7!sO3hGmdS^60&({o-{wiL_(*RqS#TuL+3+a6Ko!Dz7& zF`5P0%$DIO{mYi@K-duyZ&Iru=2abdSkFhupZ~6s<$jMI*7bdYq#1j1Biv@!8 zZ1e46B=*ue3x0gxji@WG(z@FTS8r636;I(@HMz^`PF_~;XTNJN>5?t|)HQV0#iV4# zgcCw5Sd1qo=0JO2CG=V*a@v-lStC(+PV=x^V8VcgS{qXLu*{P%=j`3cvdHS`crrVa z*-C+;1DM*r`F@g96j|>RYix_e0%we zJ?>2vTj_Yn*2Z#9zHWYz5uF1DOMiW(jhi4T7T(kCFQy$Wj!nCoD+&yn?ay?evI!{_ zj82}P7fU^3l4+~P!FSl2jrySUusYfk!^kc6{WkIKIi}DWnb3a;GyWsG9C;r8o`frv zcjO8zN27cyJp_k6X0n_}!W>SKC_C?q_#g6eXQZPJ^ib(C$BbxTOW%6mlYG!P8?V`P zzaW41L{+L*0`dd7yhI&O(9JhXEMyGYV{_t5l8chjICSFQr`C#Y2rfu;I3ufI78HIB zY|p%be;u)@x_Vsk66=**bKd%5Bhq7uid(t}9qb3N8@|V^Ry0xorh&|&#$MqzRIWO0 zpr&%&5{sS=)!*hj{pBjHg_?EL7@q5vj$RRx`!f;klAf^cAx4|b*MB|PGUNlmu8V_B z?T@3@Yo^aJIR$R~^f0DlZ>fo?+QKt!aBV%J{c+5+cO;=(>spDuw_|H+RQ(QYckG*e zR=7uNKpWou_{i|oXNdNsE|X%{&$WA;TGNhKs`}tHBP1vqN&#Ol;@DYv40U1I=m}Dj zU`VzIiK5Nl#qpq@UxMl5&Of_aXbR`}Ywx>CUgJ^HN-QIx?@mUl9+H0RpJn>4Uu@c2 zEXp~cy&f$%-y8x|aD7vE0qUDQAv%5JyQ9}T!A1L@-(5U+tM7=bnYzQ;*xEb3thCLn z)B5E%Q16jkY-i`f+W`?#WjcAa4H zq*8yQ0hevl+1;olr*m26Kp1|E&QVzU3x5ulhDI6SS-R{O~F zRFq@8OZC2;Z_lm45ccZEv4tBpyg`uj$s-#q;+*`lW8J17mYZA%IBSX6fl$k+|H}&u zT`@IxBaay(AaT&yw8qYsO^#fxoRm|3hT49HisUw?FOtMu!rV4e387L+?oG)3Ztg>oT%$tfQj#w2 z_q(Asa!VL`vArFD75eYoXXRZl}S^@GV|c|U0I z15iak6uXyrez%w-a>jZ;{_jvX(I;V>kK5eYqK|uEWmF@JXa!(Du$sjmVt@G8? zZ-sDq6~0kg`MrvwiA~xBoqCeM^B8n`5XzVs5XbXpp$A$q5iGHY-)P@FvDl@Xv6G&D zY=6UR-zmmrY1r~yqP#08@4F{sX1O+wM7lnb{*qGI=eW6g5}5rW{k&Iu1)_-ht94_j za|&f#C^rcsxJJ%Qrygo8+|%-~S1VMuGp@!abcFXZJ_aaAVs`IH2k)jh42@{Q|8TV$ z;57$qXIHni=Yz+G&$_nu|LyzS>BWsDU1D_|UZJclwqIJ@$OWYld2t}gZfypWdT%I< z=Z@M$_Cf&SUT}I`IO^=|wr-~ebt(K?ev&kJamnD>69O-txm+M_Tr@uVOaQ^P_+*ta z55N2r(CAf0sd-#22N$SWa*Aoa1}Uzp;_w6s>k-VOa`!m~Mi(i*+V`weBF3lLBa|NN zp6As5$0MA+*qW&CpwaT3Gd$B=UF(%fL%&p}k~kZ23-EK}l2BIh%HHWODP-K4q1l#+ z#H2DFchzQ(MlgF#@6a$cQev}2Lc5t_TwFw zzB)B^%f#0;>eqL5UTV3k`gu!ha}SPW9M7%!t9nsA+I*H|Wg0Elm&WdUyqu`;DcpUl zSr%$i`?+XZUZdgNM;=S<#i-rDzt_W-odsTaQ2HBC*$1Tb!NKRHa=(TiWPD0H#&Lw+ zRBs#sxKn?!_QGaAdp)Ug^TM*;pR5@6m3!3eD(naGrEi}FvZ<5vs&Qk5*PDf7mXZ}t zOKS}Mv~lVv_lXWXs~uPmiB^9FD(^_axAsqmwB7YF^jlMLAm!U+b4U3UFEabCh*Ghp z;^1{xNm6!z7qLnTPMg8*{N$qbXjs7~28PK$GN`je)c!6p$@OT`MB3J45?=Q29Vr_i zUNgW#%Y$2thf!(|s#8T&uP55W5qFiu;l?<2Y2%5zy7Hm|Ob;EZuzQtfhCE8}DokKO zkjzvWItmQFIht1yhm35Omi!u&EXQxk`okvMi}%rlNK00eNmJFA5mU4DEO2BUq(Nq_ zVm{apoz}dNRZyeT*XkB#vK3WlwM&+ZYBb{7_@2Lx?1j%}#23dh*2@0+wrw_EY4q^x zI;8%pRv?w_seVJl;;? ztictHbZoz_-uv|p5Tt$ViI+fU4CA|-=%#QiirR)Km`yB%fTM~ele+$mRVi7z(cYUr zimcfE4i|fA+f{wgxsr#usW+WiIdg?nb%*bPW1wteIC4wzYXVLwW}^BmjPxQeDHL$a z=R(;eRte`fTxcnDjb~o|y*BGpG#^xmgU+HZ>!np}aYQnB9W9TUZK3l2sC?6#_wGWs zM4e5@q!KAq(ECKiy1x$t`QmZ*lK`zX7XRNrKK?3If;bik>c^4cF4M+;E^U{vg$-@Y zbjNwmYQv`M)q<$)pA9SfbE9kI)jz%0U}hZ4h6fijK{medCuL_%8|?aJ481?^0N|B7i*w#p=9kq@#!Luaq+*w6Nq`>#L(A{Bkfd>^yb4 zsEWTpj!e5F^Irz#)y8*Lx<|GGNZ#R*xpdVjp1zF_ZKnOh1GlK2!?4Ypn2@yKZN`Sq zK0*)s6D#Ma>Aa3)(J#S`=x&7`N{p{qCHz+ET#!p1X?(_=cRnqnR=-eEiRI>VzYOK+NDCjs02N z@nBG9DBt#0uh)uJ6- zuRgPubo`>9AWB+n^`eZ)m~R?-ssO0poh8eUmsVrg`|tX4AF9M_SN5l%K z+;&95J2_hC0|QO_%nUY*p9HJ_IX>>G0|q0B$)cm%_diLgZ1DT-FUZSiPg+W^85h|1 zFKT9+>wZ@-Mg+&*&37>SMz0TO_C(Tt+l{m?FSM&2yj%u!_3Gti!wrdu6Ni*U%fFkjs`GwFARnPM zd@^tXbP`V4Neh+EnB2&m*);i&npZd@5f466ICCbuYhC0EhvE}&lF6CbcmVUc#0${b zHnS+|WWK{1_sCltN%Mo#ZVX;jP*Kb_Frb z;{=zeo|~3g#C!2K-6)K@omT#Ajvvw*0dl*b#5i0MQ4E(9#NuOlhRn9k68!J%*W@;c z-X#wP{pS@q_hE|PzsY+D5=$SjJ1pbj-;t*z9Yia0^ITqj4#*nOzpB7k=I)ViqBLG_ zXN%n!m`_Cw!+v;wGT`6XoNe&z1#Wq<{yb?(EM(Q|XgGe-p7a3NG8}}m&r`M%RUt)9IVEpZ! zVg#I!6Ub2;?jA&1-f|cn8`%+4Hv|`fTnoLV0Wh5#QKQQzcGMI+uIg2-1DNT0GmdY= zw<8y4M=d9gQm%HJ-C}jU410zuIpw?}W4w^Y^avc<2$gTE{U_D-ev6jYrqbW?*g+ZN z8D`>h?BGsCT#)>)%r)Mfs8O(|ccQlDA4tRrAR`n3*)+S)LRHHib0N@;>XEGO6#LLs zzn$WDYv20L>RjAr^jj1G`oIAD+WfVhV!!Q#;{NTiFBwtOH8JaivRv!@rU?PUC#8w1 z$Fp;>y1_h!Qv~)qlTkmIJd(-FIj#aGFu5E9(~zx794;0Qz3N-;eAjs~n6DX&XC00M zmT4$FJx@x@({Q{&6c{5QK)?`U(4u<`(x+#3f!a9qreLkjEeu$A;+i8$z+AWgCAzQf zzGPu|b9{lx{_=rYoZc{7eVL@tz2xhQdwHV8t4o!2GJe~YV<9cr>8o|hh#5n{#gNa_ zz*cVoz%*%p2bgh#wXLA*{X>C_XE8BnYRoUwrdCzrz056LbrlTN`xor>Z12k1Gg$nm z-u9kx_<;oi)sw8zs_9k~{_I0I8O20z>LF3<`OG>|0*n6I5V~eEW2*iL)c4d32M4u>}dcM zLGXDv=$otRSjA1EgQ zn??k=a_KL)mjKYr=|Hnm@CPzj%qMk$d>ha16Z!0_lb(H4>NH~i*;cI!1T1AGWCOj& z=5+~nPs?sZUsZtC1!7evKFkD}7R0Sw$Laux1%f%dPqJ%Pp=2og>JkfEwlKsIBQ`e? zpOkcXIa`*umDZq5^iPOCXxGlDV1A@FH+5O|KQ^M(eU}v#<%_T-+2@A$cAt;=*g3_} zf0-L@j>?>yl{};~GC0nYsn@>4rXJ%x{Twn5TUA0)NspgmL)Ln~ib|oURW_#E9{?== zU_?nJ-Lm@8MCu7?d+uZl7?ovlVYOUZ9*tt!(cSXG`~)&l~l_0kxq|iQal|F^cYVPU&C#UGH zosL-9C2|~pCYk_adXi(rH2ZRY>WCnIu5bwGDIoeV$lc%QagckSlquK`3c92=a&nNs zi5DArliEvg9a`t6nSSFm=>~r=5S)@Hr4Q`oyo+cz2V|Yn8RHax4~aIi+Hu$&ALOZss5;{5A$J*(F2a0NDS8~t8SRobbP?%YU|I9+BT);XX{UZqgoS4 zEq3?!-ANU;;N0=EO3kpk?XoKsQt3LJ9ha~QtW$PJ=3&z7w+_yV>Jo*2{e1G#$5c(9Y|WD`?bP}3&AWlPhq2uw#|IcjpV3EJ~c&18UKuOl7+H zmr4U$UPF|3-&Y5;T39|V{Myc;%i`F}7pvL}BMRPOg_Xu9+{0k-##rjRq9Z~zyD3I? zTN>P^QtEY|22m~O$!Hwz(=+rx60qUX<3yc+J-{4o|@6lGcnWhda z?*t@oFMvZQliyBOyVk67)2YaJ5XUX3(}T-auCb-2iR#mq_&dHzT17|Pn6hm4Jh;y< zt?H=gJEl<0O@7_I`liNYTj2k(kcBQkfP%!RN!3o=S#B2$A8{~OJOY4tBQPBmjfFT5 z4?jpnD1s8LdCGr#5SB0Ka3tliRz7f`6)#r_F19x`{6sov#IQV^G(-i`PF$#u^Ew-; zPEw51@oDzlWm^p35@(&7tYU0=gtaEUY?1T!3pOhntK;4eLEV@Ff^0UviU5SGj$<&<#mQw&e8KYeb#he`BXx51)K6XMIA8jUw+i+54*2`r-!f zVY!!2D8FdB*T~gTF7jIqCotTL`s3>NGb8kyv0>N=6MpSTEWER#fxiKKEnxIz>hzud z=JmZVk3oHU(+b>biBWw6AT-5F0pKd{+6F=1!+f+XGbNv%8;#p*C>@Ii~KNpp;A zhK#4R3V%zQC>pq~&pp9BF>hQn$*29u>8$^I(6-nSM(5FTTC_?{t&_PJ^srB$G3$-w z>UB`hy-hX=1$>mWmqYB~UW)9<0jGnJ6YS?4Y_g=CjLEsn#BJz2T4tO=bI= z06xGkfR6~^;hez!rfdt*ONlXmZmLqQP5LS1h=HzGw*UEdo)#?lUg1^m6!GqutvQ4=eYDzwoiU-7C5mFKYfDxrbvr`k9V|f} zTHW(ZRg1zdS>-l%hko;uyz8;%!#{P}lX+1Q-;9cuAECF{5PW%Kg7xgQn#} z$$?_}hS5Izq}?y*fqUz)uGpSvoZbR!^eREgiT>@66Bq1=Muf;CM3rsL3YRz3Wax4u zTjWNObZ14>>B~)}MLTOpTW#Bp@oI;)visjon+0O0IcA+x{MY82y>5{fk*r#gsuLmF zqQJ;Ujt*zg-9^5>7xCi&v7#`PTE3$i_)PKv%{Qs18yqM z;a-&}%;Eu-;W)xlWqzUNT_E z4W1dpZ`YSkNzSxrZ4aNX7L9DuI+9;svAVR0x)Q1}%G)77K!2jreLD*l^83g2z=g&# zso>vF3KNd32)pXjhW;|UcQiA)rg;wU_b$Y(zl}|9m75FsIBimj@c{`&1$hS1*uBmn zC2ic@87ygRlvh`iey zYkC#n3<6U_z7q-~x57<1mW{W(JsXt}uDRRU1#*LKeX2S|5=n+#A6Dx;nzO2V-{O8E z6}Bm!gy7O4=`TR9Zi_0iSFaa*C+@S4MWksLwo=;ad7-oyT*J}Kj&SgA#-Kl}*GwFd z>{3r^<1-fH-bl>?3~>~n-sP;|CUeles|e) zHF!w6793IL7vxFhj^$!dZzg<~Y@)pO9r7YRG&nFHoJPlZxxpt?x9^X!Xj!WG*X{#? zup-1+Y1ru%JxY=QD2pv4INLfx&7{(G1%tgRw+^_A6x+>ycf<}HwVN&s9aA{OxL2_j zS-B(6P23#pZh8-Ei}&(l(59Ve$R5q%tAirej&LfY5C3;L+p3XrzsUICw3+0u;`+Oj zz*8j^m;8qRI-m0gfuj*YSI`mr*KJr%F{|;uqD?CJ4A*a-E6bZS z#O=%!=_XyWiC6WtSpOV1q7Ml<(F|Z;^Tf(WX2kYy+Z($1M@40BxJBucx~m`*8$-gvHQ%SE|v<7zVOYI;O@zxlNSw&KinQm|@Cyqfe$=JEY^w8ZsWYla4BSyRfp6vcZR#$Vzo~y!O z(soD7s&idU+m}9WvRU=U}vq0^_q)w1B$PoVvOXBzNbZ?bU&!JoyI;-J0!Ale7uZ%;ohDQFcQ4 z>34`OFY77)eD@TQ$a7OU7w&hh-{hXzcx6x{8L2x<+#_3EIxPI#zFImEj6Cc21nnlH zgy>g29@1jy{#QVAW05v=y5+V?IW2}zSmOp4Gb1L;->^iX!V#NS^rTnTiAh}<8%Mn! zaLotb`I4A^E9oHUfyjEM5Yi)RnDzw|P2@3TihN&D0s+xax`Y1fK2eDJ05Mee24GB2 z`EUZ0Cmjkq^;9*Z03YzUvH3f!MGEG>cVj4#0O_OGN_$`&kGl8` zy1=MmekTBL1ye3FZ}gFv64vOFws8uk7b1uqyC(_1NChcJB+p8EbKx=+VW>eH6D3<2f6g=^m;C{HrjoGzS$VJx~<)`Zf+ zi-DA(d?m}=wm@K5{_Nt>0|f5)efH46 z!NDrLD{3_?D5?&^!r=Qky>)x7`pXqyKE{&8;Z?4ABZ*_dpJV~9)SCV1V{fF_o2I?c zJjJ4q!osEn?bc6R;}U^xJnm?4Z#)_8^+tPm;RmUH+B@mX6B5S}y`^ZsC8tuiU^xe3 zv7w#yh7N$c4k$#&ijNAyTm=-m-peMbXl8 z!)zhQE;;^L6%%5MI1GyUH+vqa>#AcFu&b$6l2?D*v;_(cim9_RR}om*i9U|=&EhRJ z@uh0bp6M9YeUP|Sdf92Yf@fpAGh4_xdDgIVXzUD zl{h0NIChb21MT{ULdJ+oi4!$|`qc;Eem_u=k=qXeNs@+dx^t=;KQg{p7hS4$NI16( za#vQQeAZvtspG=EaE%P!^qnLsS-Lv_lFC@l7qbI&k0-+{C;4V9XZV-?*)B3GIU9oY zG#&y0kAg21ahgGcNjI?RBwH|;C1YVaN9Rx|Jj|7Ui57&D3TvliIkJjYe3_qJif<@I72 zH{*9eL$97*yh##mR4IR~aw;Q)>}jx$&r@FG#uCoYJaal9`}J=S7SozI~Fp-LTEmI96y4RlK9CUdiu7lm)dPIb>zW<(*iG=m?wo`8@{DH#B?tyX!~O*MoQGLm_c*-yoVj zqc;t~5U-DG*_}!rQ@6C77jh4iWY56$u~F`^PkPPqCXh=~G21yDD+#^DPI{>=m_BE5 z{XV8F5|1{NxjLYorOvz0c# z7EB9Rk}F+==QN$pt8y2BUmCdcQ)OvG&golxJ(MCTjJXq5gyAMS%@tk4uC+8Xjk^5N z`*%}L#mZiVe03cp<1%M-yJdlHL%U|-(EVA*ohB!rudhi`9MS2`XNjVvZQ)N}+KU{` zS%0EbhufI1_%ld-?a1!X!RKvS^J5)lZW!k2$(X*;nOR72?^qizm8i;62I;#+P+idm zpDNa4!x)t6Jdwt1%-Z&(pGn&T@Fg~|R2<0$mm*pvnf%9Yf4Ij({9>=$;P0%m0M>h$ zWey#2P&!oaQk=~n>YY+AtluPGPmD@-_R^4!9lsNVxm86SW}=)2p5rBm*HId+B|G`e ztMPU7nnnDv1$x$OY=u2sZp8^h89Y-g25#ER8LtZ0o&$*1J#GqQd8Qp9Nsa|Px+`p@ zUn4iap=Re=mF1)LOZx|_<0d!2!=hgjw*R0=sr^FS!n2rgSHG6oQrSP~?lv&x>Jg;} zKFtAs=O;pG>r3KCbNbB6Zjk+?dWZV^udx*TMDxOfrWijq|Ez6asAq z23}!$vf|#&WmsZTs&aIXC|1Y8M!UJSi>)hBNGOlT?8rg%GVK#5OQc3@<4C*PTtjpW z@2JB3I8h+j#U7u1`zM=vo~Qt!jsFk5a(NKOvfpjPiY!rVmdH^}koM8auxj6kGq_f{ z6$szW8`+57^m4Kjs(6Qyt~Jp&xU}~LE7{?tZrKBw%#YAQl=qScawAg)$4g&ZlJYD2 z?_OFN_r79LCGXQINK-V}@oK&Gh2zF`MHs0`y2EZHS8IVXcsg~R$UDd$RVk*;nX!qh zdFX!_3Zjvc`#a$25xcriu0O{b@+99?@Ktu~|m#5Nno3j}e_2jc2P zt@n3PDBEJhhCr9AcMMho_*Zg~miUnqn)hzw3S>ALERFU!a^X5ArgBK*A39CU90<-> z5`}8pT)mcB{(Z&rHTe^UYfTu%Yrn_SZaqj`?6x4kyg<|L$?;g9!t*owtUl2%=L6J)>ZmArA1@^%Q#flWr5=BNYv3et=$c5mOCWpA@i)dc2LjKZUu87pb5koOfaIV$J<6>hyLf--0^%R?sztZ1UHhnPQr)|)Ukh- zY2g#_M8tnUZH#Fy7^=Q}A#abIKqa}u9r~VEi5J0xkU{>Vc8df0(Mh&4M!nr*{8MDk zWRY|gR&|cGI<0(XNy_)`RL3bx-3NB0UQO5{^PyyR*s=qmoWZ;Cim;6_cgb}x|f zE*YO@A+5~g2ZiekUNb#yt4nSbW{Sb|sb$~@SwBr?*78kC2SS%^WlnrQ!}uU}ip8o( zD!*i8V$>wb-C6KxP{pjzzsLAo} z-ac7dzus~+E&x{s)wl z&@6n5-SVyfQxF#r@Y&xr>>Erk!ubHodq1qE^S7J~CeEqW&taELUM}Y3V4W_3tk34_ z`1D_@J~3y*)QG8pLqZam8 zy%Jq}TRijZkZd!mzkA1h=Iv-bSi^Zx%a1S|(qe7({sx^LIG#Rb*W&x5%fMIvD5|`r zXY5~2KuQ1Rwc8m2?vZZL?h4sz^(6txI*=l_D_Mu541WRrDj{wqXP74IzjAQ}dM`K{ zAb{h&?>vbeFR3y_QLUfFYfFPffRURwLo6SGpB*lRC`N-@)(>xf%vQ7=*SV41b*Yn2 z@?_?C8tQ`hIItkkcyjeAo2CS9?RlphyXmVV_E3~l=p!pqMOV+xHN&2FMbiA)nt9m` zWzL1(^m`b0T=4Cll1S6~Dj8kxe2w%Z9XMrt@?%7=lvDEe*HH}#(8wFLN?K}*;<(8> zB@gvvqP)0h&0JkqX-y{ku`S!3?|11QG(MTPx)`M>MXq@ExLo-W za{xAWD!jf2z5_-6-Q*2ofm|s{*AtscXc!G1o&5XbamAI-ZpLPa&69`jA-v|Vy{}|!{vQ|0xdwxQnonobSdh?5Sh~qu(@*@_ek1j z_{~r_v`}j`;L^$q^iRoxxF)sz>(f#A`b`c$_(Y@15mm8!))?UHs2W#Ck8Q^?-5AQO z5pQKj5w5)1gZ;0{MUcUkEAd|a;!=li?&L$Bx`}#XI!{F>wN2E)Vz3o&E;gO0j8(bD zc2Hw1?2y%P$!1M6cFXWZ%-A1hZ22%LIsLHEkU?3JI!*;197w3>haxPzFfUVoVqmH4 z2Nf9r7;OHLm(m1165%%q>^$D5j7|11tw(aa<#2&Oxf-d0Yw=N`P>fBI^@93B^HC47 z{kG~LO~-inrs~Q$5W7m*GLuA(;VkIcfu;te=j}$8WGDQEe?`{aFYcr77_W1lDht?e z(1KCla!vRx>XgfE0V0?oJ2(Ew+x_8koq6+gZchYCnZ4INhGZ3v*3|$mf(*tDNGby$ z!wiLvP#(j&o+suQlgo4f{SV~NT^4w$g05_&X6!}CSt!Y@j}iP`AJ&n(8ieQTR zDW?!yQbG6XbF>urgkNOs`{f({MzhikqxihZ8CVlX`{OGy%Vt%ET_fUa&sF-SODr=W ztOXcz6B4H_k#;JRb7zJ;#Q%w{L8AC8E_dd&{5q%0VUQ~?viv$^*|bxtlGKfajliW| z{6JNb=EG9f`dxAszl-RRf)HIsTVB?*hwPNaHz~0tO?TUW`j z`|B#$DJ-!mR!Lx3@ zyxZ`_uLAgr#XtnTc21n>Wr@zLxwJCPW57Ry9OaeJ6{Ssc#CY?9Il-FJ{(SF9Od37( ztL5EhRbJYo`+@RS5q*Kkpj-NEz_5NW z7!dZ$|C3DyTObEO#`%+ukOKaq4jbrFH|%=17BI zxuxdC%9N;_px-1hKYdhVjfl#1HffD<$YRMjB?qu})?n1Zs@*I#YfUO_t_BoHS3ZOy zU%uNMF7d1n9!kG&4xcqLDWdh%0P@w`ApV;}?Tu<*3q>v>FSGv*Av&*We})@uJUVJw z;Ln~i>xfA_;G4k^iC%2L)a|niYN-pyQs45#;3hYr+<2B}hMt2Uh1=$R@v7YCjU+}| z++fUvyezp!#v+D z=d`-v{EnUYtWC!Bl_jNNnr$>`;B5IDl|H_$84<0^ex!LH_R!pzoVdM_2_f>eJec{r z;Oh$V_PV9)G5t2A*D7h_Uww#OKATre7qc))F>@j886S78qjgmXOGdFY?J_N2DI)cx zw7ri$Q)zG)-1#419!3q=hI&Uu97s&@;S~N|BSjaQR+c0CwU575Z5%fBnnEPwC{93b zycpUOP^^>2$(My@lQ!83k{|ZfFH6eL4h)v>MBCY6{L3z!6CK?VspotI6|qcR-B_-8 z&x7y77MaIG(mzj!Th<%iX)?>5~p7R)|v4QsK+GFE~qoMJY-;I%a=b#84+zk|jKK3?O`tX}I!{MPQG z4?%oZT6SXPCCjX#W-$YWQ{0ZI&bU3&iw+M-oN)#Ij?Y{nWk=0@<43jNB=w0J(-0Z$ z`!Ah9`X5S%Tt>R89D5$TTd`ZDHg@DEB}4^66;1kC-AtYvnm_hTe~Vdtj4sWIo=FW) zmpgIl@s8SXcm={<)t_y0rB5iRn+-ywewU_jrlWI$xMpa4B(^@Lr)KoWeZOnW0l}-N zEixdfk`!;rj_7~g?(YBe&&84^!dipO`8WG#lDBdR-@&LH3%scfz-{967kOZ0vAI#~ zlTCTNp_w1Wtkc!8R^Bd}`%z#HdM#0fG@G&8zCXVW^SRlIcFLu=4hRc%Cg!w$v5bAd zYS-sBXqS+_iwH&)er1pGxggPCEbeh|2XT~GgBwXbUf8MGiKHumsyH0e-{A(reuZA+ zr43D6wf|C%?1G_J_hg~5UL2Og-6sPxLFuxRkef`T3Y~^vZZ71&Pb)k44K}!oOc>RabZl zXR@CI`Ay3f@Zd_Wta?{vHJ;@OQxnQr@_3m=m8LhM`sXJCrtSqmj{VK%q5x-4s zx})L!<1(4=I>K@UfEMNL=FPIpX50)JskRb8)Xyuu~E(r9a zkatd;Ag_KwDx%vk>5HIq^&-TIQn-RoJEvd9>YNMx0@LlglOd&_aKzTBAU^ zwYYCH0ZF*Bc-cUfn(y)^{?3CTZTa9J_k^;-2+#1(uPw(~dZ|;dN5*X#Wlm2jr?2)e zb}KC^KX0-Om2-P4<-tVD>=FfGI>?yF6VZ| zWUn35Rii9%YEWC&oNIvlc27LA=QvYCJnNBq(UnW0+;O;<)12YGcj`rgC~4aCHtW!& zA5xNY-Z+WiO_?h>C?AZA!q%tF5mxUfLFV|5?da`4U8PU1bQS7nLZ%gBcMBz+KT=<< zBaHqmhtQ6K#Ex6|i^03WN~iJNiz50YSX=c~UVAKO6PIGOcb6;V)po9|tM6|qu_3G33QuZk_g@VY`}cd#jO&smN``oA+VKi4f;0{uoDz zAce-Bg+P=dk68r8s8U91e0CZYL(+&Ivu$JnI|UW9zYK@xMGR?9ULblSxFY^|NFe3D zNpB2D>(l*lTS{6=pbM-{R~Q&>7+EM@K`chEP-UvicwK;Lvw~1ohizThDeIWhP_egG z$@d7>2PX@57(xHN56V0qlRuQuJ}t<2X7B}ae}DMw^ng?^0A{d3=yx#zGV5b&v5ZyP zKf5q7XYIMp(Vly@$#v}C#%?Rp0W;;!V#h>yER7y(J=+lm#E8y~mJY#hI_iOY$pkCdF9YVXQ(^C?nc zt!0!tF-mi|=ATFK&&1iheR+>=B17m|!wi_ndo$iD=@#>6)YFBdcNK#?YJshHN5|n2 z(a@y?F_dToF@G03O5ldy_wq{NuH1aqeO$)1&`Uf_%s8O>g^7DbpZvGDr^x)^ccDXI z$Mg;-ScvEL`+yw!6M`7}yu$JgJ_Uj*`r3oRF}_i<&dauOHl-*)8dpq_d-qV>W*cVi zHG}pFHP#4-!OEXO1$b}rlJm*Yo)CqIEj1u zGpkft7j~sgSn4&t_GHBEh&+J~Llxess-{YL(PUSq@q#SbwIf+37$IR)82lf>)H@hN zJ9wEov}4@g%w8Sv#Hmz|g1MKhzL)}!&`s+78@W+Ypj=&pTw?!$9VGCUgCUdt>&W=s zu^OgqZ(C$Av|gqvHvJA;QVJWcb@|&yln@QvN&DKdDDLzmg4i4x5dqB;R&giDfil?x zPG#2psuzNy7EMJvFZa_==?7j02-q-*vz=j`AY_9YjioS}9(AjlIu*jzJpZVK(@%U- zPMkJ9n#~jKDkC15{c4!wQupf(ZT7#@u9vsWSYdYOo=Ru~2Wx;q!Kbb@2D90qqCML$ za8#ix1gA38taRiMkdvjy$N~yuGWKxNO4vv}OGbXSlW{7`^>Ap1P2pH|aUf&u{VLM{7uoS&V6epcm;Lo zswcNtQNzfenHRziZ%ViuE&(aGeJ<$TSRdg&+dRR(K)t%EVX==|J^48#wYSa&x%J8h zY0IX)fFzo4+g+SFZoLd&_)M;y6L6Y3J_AV*{ogDAHNlK(d9S3p;IG^b^qf|?6xeZz zIgw_*A|I?6FDiR8AUu)&?wM?b=cON&t+26<6h<526psT9<1LVn{v^P2k zMWDYzi_?-_1Nui5{=vKl{UsS&hoZzQ&j*-4$S?mB!&-W>+}Y=JvI5fI7nJ0UbnCpP z3$?XmdD1+((NTNuN1JaN%DoDA_ZJ@OkJ*;E5^K&eV{^&bsF=!e7s5NkX1x$z)#W2+&)9Qa;AJ6nx!^!k09+wkEZW#F?8;-(NA%G?JZewblZp zUa899?xZPFI(ilsst#wW3eF}v+RMrQ3Czrc>roF~{A~0x$4c1Mbd)GLPH*l|hFCjA zq>mVsPp{B~@BB_dG&gp-?EX`Q`;3cRWQ=HK3xEylC&f$O@4XrodhiAq?GgT8eYqzbGMi{)|Hd%JF16EJXyyL&N}GbswCk6bxa&o3=c)8FuO9Q$0#~tpy9JD{tNy+ zCMoVne&P;yq2}1@)jmEHe`@azt#!LbMVOe8fMPjw<60+mW0=3${Akb}R!4T^3O%su z`X1uZ7yRJPPQ z(N-*f<&4z5u&EvWM|(_7a0lp8o3Hwxvlrpct3tl;TA|@G*xtu0?-AfUQoCUp(MJTRVNA5XOWStm zesM)LtZGZ#HGqSvWcnUK&nPT8dt!LwbU2qY(H67F;SW-fW*t>n zzCOPIIl=!2TYJ&B3xu9-Cx6j*<&YaZ2l2e*jv+Wb8*V$(c7Q7}&4Bdhc&|Ob(D#nT zYXNBXt|_SBxVnq+`*V(-T~uG8)ac2WiOi>mW;1q+j0yQM+(<$7p8UgzHPtJA@=gb* zcCm6|kzbv_v0>xCv-!HzkF0aW<&4AnmX|S?SA$Pf2SGRB;M>`XQkkVOLH&)(*WJl9 zaI~0BZ&?uIM*Yi;Gy406b~P$DB$c$pjCWtTAToeQ85v&mp~VA>UZv~*Kuo#R>>mdt znm)a&g}%~ZBd9>%@;6KWPC^_rN*tT7^bf4%~A^#5e^v+v9@+~|<$+WGc zaWR|gh?q1z>;P|JMx0-3-F3(PYlweqUGz6gO2#_SoxeXbYAvI4H)qCw>|D@WlkK(a zgjah6#f_ov;yt{kyWsv8{@C@`8i4H(#BozP`%ITuSf5q8=+Q)xrNiyenIh)nKbxLC zeln{IE;JPjWBaw+n;ZiLC5`)^vs_+A%PPD?E0t+fRul_TbX?POdrNTEH}F%Q%^0Zu zMb5Mp4*y-D>-gaTX_4;v2pYd-_sGHE$VNE2DMdz=zqo%~Gb_h=t&+wJjJ7+{U=7St zJ-ph0H)~v;6Hba(ru)Qm$QV&1zXhr122>~|&!lM0FXg8N-qa%pV5!_my~RlCyHEbe@YEaJuFKpMyKzeoW*}5?tP1A(?b7;a^$q z+C+&kx+PT#v@0v{RaoJ|2OIN539uNXAUbktdHZN{))H)wd5 za&C>03Z?a#z-nnP6oAWIN$|`PE#2bb)%rCK%o~0~ZN```OC3Mszhi(+Fu%#rHf>@f zc5P1I13b~?W=~vC?A(?LrPH7wU77!DXS4j#mq3&|a7xn~*#?#!9d#xI$XO1@@mHfe zE`J)P2YEJw@~uCOi7cCc^XIT{C;Y;U^$aBIbcPpeDcoqbO8{;d*^O1!tAN6uIf9I0 zKPFt3UkeR01+q1(g;m9enpzr$oY+ynV>-I0AR7njbX6T#|DYa-|FZ%)TFWo2sPIGk za{4DJg*h`=EVbBy;IPygSoQ+vyp){HpT8{zu`av8MqSg*t|Z19G&41=R~EqnHjo(* zs;W7-n}4vk>xH1t9WO3Kqh{~l4r7nK6CrYvl~wUH$H`Q~%m?ji@m$0*o^IOZ)Z`Dz z%J)V&gsxaTRsQhk^u?2QZ?PERu@9$8&pkbPg^_lO{}xB--#Auan%x&8 zsW7hs_u)akx{24C$J2Eavrd6A+F6<=?kjxWU|5%)P9*tE?RT>Z-zIA0 ze&FY0Tgib{*x#1Uj-z?WIKIBWOoI5Q{k$c@cV-JS-=I9GbibCS+>U!$u`+UuQXP`bkxjy} z_dI6DIL0xLbvXQv}w{@wi|2YtTz_L&EO}YhW8ETRWs?3P=1ux7=J%$p?LR&gV4{pBP*%&bM+ zBBtDVbbA-yr6~Jgn*nBj|BOeW8gaF>XKlSoesApHk@4^c_{%2#VIza4l`Dns=^@v! z+m>~s8dDQ9f-scg?p(!vUEZ&-{s-Ym;$}X9zI+ospj%mun*GBhy=uKYUCW*m?-~XDd8>MhW z`GYZS|FdxMD~iw}trmtO!lu2xzkb@&=4<8#(mHd+Yt~W%RGGDSqhDX@@oS;CkS-=B z7WtH>{(Z=1ZXE`C;W3#PKljtv4q`*K{qR+zIyzvhl_5 zBVBm%rt^!_%-zB|jd9$p{1#8>`CrC!!ETM5Tex)w)HJV< zsuFCOc+ZP0Z6WNhEnZRPi_fLJ(e}g&Q?gMiJ`DqM!}ZNx3GDJCrmvtYgCh2nr2!j8#u;*ET zQp-?^p6|tj<`iB#j=mqwRq+ULTaF(3&P>o8&)okjwhQY!cxEwu`^U+u$=H|o8Ue{I zITywE&f-E7USHd*sN2a8FdgF_$S8+#+B8bpvtr|?--B5H&>L?dX3!q4HqBU-@3;j| zu5?$b*1iMAyapo5hp&lSDQWT5!soh6H|^D*P^ZEv3U_I;fi+NP?Y4ZJhd>H!sFDaA z)vLv@3RB}O1#EVKgap&T9|Dd})0*jtW8Y2V#2ch0C8JT!qi3WLrp1oNQH{mKr6!(9 zqX~DrCc^VzWP{SjP;ltzsNqE_M@}@1zu>0tgpfRIaaXPorb~uL82{RW{%<-K;flUF z^VUt0lhq_Tt~8n>yim9Rju&=px}VvzAEw6xftgVvxA~H|rF`K(d0JeRM@^PGy3g^D z&b)UO=@DF!cI$jWwW1fUm)k)IC4H;io2phdnCbRbw*s}9uC&;+Lg;d!2N8R;pn zUE8PDd0U*D>BV1Ccn4mq3~AvgeMyQ}6MEMFvY;#7J}TNLf=uU#!U?>;k8}qk!Vgiu zj!U}vhgbdFwfP+hMwLs-n}0ckUmdtU$fDVDJ@02!U7c0?bUTkEsa|Nu^llsb!SP*G z+(6M8j;oMWiHA%*_pm_`T=^t00}~Y3PAqgALgoPi6@Ib%QW%p>dyFx3Ov2rA{-G`a ziZ|Z$>Z*H!l$St$npXtKRa4A?NFhh2H#u7u;!9A;Ki z2bXt7z0N-;nYD3#;9F!z`=f>UE{E@}6A7)!D?Lr}nAI?mg`OCnfKtMxlf{vkF_g=!XlA?5diZQ7|rh!OoB- zz1rW4Je$kAPP-61*>N5`F{HjQrZOm-Wl~SDJto=3_(sQpHOP8rqHY>=*>(CH7 z%@P{6*1dvb5b|nsRYWIeyVcNe+rBSz3!v#Xak=cMf_LjtJ``v{AfGrY(V&BD{J3Eu zwT&*RYamx0JeAFjzjV8th|vSIk{9hP)&r2uq-pxXC2jMM+|bp3xSP-1XC$ zm7Tvyz2H&{`gV|jn{}&jyu;xx!@WFX2K)TG%CojP=OvTm-Czzir%0I z6QS%36(3q_n2v*5+Zd+v3%4=NwzI%M#Thj*+e)FgjUjZCXX!z`^xUvRBvF*0ed#@| zye@~MD}TLDqsDCnZGl;} zcTgrIO4+^9RIRl~zRFDz4`$8_S+&o%_C?<+*}_JtD_&b!@GD^ln6?bNht(lhHv70)uIdKRWz z5x$c?MRS{v8{S`|)bk1x5-hH>*|z@O-@?DZy1jM?NtOXG_ZosOKq&MPFt@2Dz8+^H+@rCI_5X14|^^C z`TVKJ@L=}7Hq)cY342=qmTB+rf)WBAwfb{G_;<6_#h%A( zBaZ8_q!scJum2Xf2zrwK0L&A>j>uS|@8Q<+dsrA1rXrnD8AXX(h)}(|vW6Q6Lm0 z<@%x4p+WWWf(IrYvCJv)vX}nhNd0yi_d;5J2^2F~W7CTA-;jAh%V9}|Y9QQ4nNUZL zU4_L}Wp9*P+Rc<2>EthQkG4})ID%rhrN)Ux1~e5%0pWoL?e1SX_3HbM>BL6E--N=q zvz@SlmEX*(uy8_cam>!2U8r^IqUy;(M&YpzYp~+I3_jiMk1J`@M>c_%_nH^(n2&Sf zPs#;?C0b(XaNI99ICHGxTD9Ia^;B9F$1~TVkq?c``hXMiTb*&(Sqv9e_^gxs z?*l|0c_qo+b?~W!OGK%`7hUaAVQMK}9?fRE`u3THMS@Jn5=L8y2a~6|H9piq7cY8q zKLLgnm8Tb1Y)j+ub6?@7Gqin8PENnR{pOh1;MD2h$^D1>!uwX{*Q-p!l!lcLm(Cl+ zd3z0{O${o{9=0gd^_gd;fAqZWLE#9RP29w%zCmr~C9F1B7s#5gMubhIh!VP-uARSh z6s`Z2gSm&NHXhQ8oWA;cAv!{_-q?G5C(e6dL7~Z!)LzVB{Jlpj;R$Zsmh=JdE;u&u~Oh>Suu79Lm-R+V-S$<=s_y%d&&%>Jwm+j(W;HhQ*aS zLwJ~sOwkuG4#owNBo}$~IkOUUBziztIOXM0d^WQOh(F>1KPHI3uTe_jHiVg|m?NA5 z`d%c{9nVZz9Gt`MG(-AZuTz~<(6NdTD6N_LA9m^1nzEo?p7O*%_hM82)gPg2(VEJ> zmTA14uzs2nwT2g1=FETJdvu<0bNw3Rj*_Li|I9x3A|A2RvgQz^lJsqZ$gwuJqapT2 zf%no=>7|kV8S#-lR{WysJo3+yM`}Y&LRge=i;`KhihutnUJ1paye3uNkoD3`>Z%I! zHj_ocGvWh>;X zrNAdg$CoZneZ7KGqno>;O5b4>?746O$AzUk$-(wY*)avAfQ6X)gytRo{TjS!zc^YZ z%rs4tT$T;a#kpO$WEPn~a0Wl^j^HSf92@So3v(KcD+x_dtcRS3HG%3I!jc_X;$lG0 zLCn>-Vj1}AAQDxReP=|4SF~CVVP^%R%m^%f4b8Ukz5T^NR!Tix<4(q?I=$HrgKkJT zPZ_yT1wOt*AWQJQj8(`eqjS=I@lnYZWtgS!XEpc9 zwo1!8OAn1|EuuGmRtQ_SHl?1k{3;F$a7e^0^*CvG-wF|~Jdz@2zJqDR>Sbj<>T%{h zw6HKE-5yQqEO!ySO6)*5Sc(hT(x0h!Vdmhrl)H}AUKZIpAPp2guGm~M&zQc8-i8WC zNtY}zs)oQFo+aUIj^Fr>JCwFzU0d={J88;16-V!PtBd7!zDxVtdA)sZ*2wTo&8(55 z=+`7P#D!}^di)-~T=I?X*dGm}Sk6Mtwzlg=o$a%w@J-i`4~?Gkw|+6pdhG8t=yC?l zKz}{U<)zCthp!Q(LQQ?KjrM8jl=(CBR_y+l_&i*)$UikeSNY(`0@LlePKYDI`EwI3 z{Sn1BqD~)_B6~E-1058s5|y>ueCVLolHG;%IXmXHnpo7l51Bg-ui=cA6QjsoFKKD6 zEBjv9nHvzY$T8mf;9ilon!G$l0iI@wCtu4(OHl?2i;L2kSG(3j9R22E=rT8%ZnVs{ zTt7lQdy}cMfo}^r$J5Ci()R4zbZ2&PscF#@dbzE!K1Y%g|uCd8Wgt7%4u#pWMKQ%P_Jb;nj zzfl^>R~az(a9Zl-{dylDd~cDqHkpeKEi zB|Tl$^mf5{oLxfnm|tQ)R0cs%^MjPI9-PLlpH+;cbDv4)VS?+2HBXzdt0-V%O4^w_l|1?%PwNe!@ zs*KA#$z_kI*`)=a;@rR6#cj1|yuo?fHo5tlrNm28yelU-fQ8QbwRpm!yHG+iQjEG3 z@e6L<9rPH@rVP4D|5poo7su_YW(C%Q(R+y?-?P9$-|LnPdm>@U*_P_JMhYyQTCQWn zf(@Z*(P#Ubbk%uLThH#JTHVp-bz*~fzM|4yek>0O?k-1Ngg({dPu;j$4=lV|EBxsE zB|crH`xxPo*tB1?4Aed+rS^p;u${fbhfqG?$_QuN@3)Www>u z%EQmfOH-ZjoZj0066vYIWs1Y6x zWHj?}Gfmw?4d|o5x4OG&47>k~v@8kuJ3q7{Jlhd_;u>uQPWT2Em34Q1qgx+8e;@Zx zG;f{QqHPGeCYEV2&Qn6Q@?Dt#I*y6$lky^l zK5nt@76~5fjy^u(>rAz$8nE-(UH{AHUuu2pqknhM9B%X_`JA*XRuoHbQ02gL?x_=B zw0>aG(0OU7V7qgCSsX8x=|>|IYbP$=($ZO;&#yRdy@qO;SvOA(SM_fnT53Hyq&f_( z*5<-9dmTl7t+c4SuFdc5zHsYlDS3O1;dkQ#AIuZpmp{o#7=j18osZW{YhV+*)@oUt z4L0izjn+)3E7VDCdZPP;L7K{`0{NDqBqr?a=GE>6eyvF6F-1rCAR|lN{{HC(y^c)) z3s!9;jPR?#y&z4wj^~$Se9oK@trUD|Iba6Py%j2Qx<5k+Mex-a!h6_;%-ZYd7-O{{ z;dnwaQN#IteZXd^@Es8Nh$TcOqm#!B+sobR#FuSe?Nha*j^Ra(J_hDypS!@)Zq*fY zOjf6#Y;VzKF^lumFkWr47t?Y^81Ns{-z#>xW#pCu{nI7h?!-8is$D5V&m;d+V^v7F zVW|V_-KLM7e$#^Dmu~+YO4lh{N4_$#qs{lg;gOL!R*vf+zwaDjw6Ku)0+U}+(KT<= zh3&znX9b=RVZ~Rv^l5Ji^z=oh<{F8io$u}a2ao6$9rkrr=!OLh^B( zyR$lhXd!R)fjCx7cU@|{L9O?i(ey)e%0;urdpxjQGg)0oyF5O9yu8ay{+f1+%>+5u zQo)405`Kr;uSM@?38Uzl`$t3_H{yP0CrkOIikFa=U=2EFLir^^?;dXSYMAjDiP-8b zM@LG@dd-s`Iy^XF{)>Q^?NHQ0>O0P?sn{k9zh&e^+$L|U;lNV0u0GO`)CTl7>%`3%F*NzYsUqWt`ikJ`S-rP}z1Z5d9)7gYfSISU^{}8!F%5 ze7=P7O>r7;v2ogcv)Y+|Wp8yO`@3=n?ml*KxpR}@Z*f1r@feU%<>(sm9ro8Nky;YA zoHKYisSTnxM~jVAxicwceM?0BUb*v#BHokuIff_3UgRb-#nCfj{cM!=(Ix!{z3)e>f&#uQ0+tH%e_pG{oc0I;9HREM>Us)KiA zSFD#&I}iZ`3QJ*K8Bem}H&r()W~Cb5F4eDNN61~TSA7#OpsYEOnQdoG9PfQa5@x8t zLJJh&-EZ;OCz%tDv6Ur~!}jAsbwB47?!w-ww~pZ;F@sB;G$_lN-ZGclu5hbF$eEkS z^bD}9pUeGy{c+;IQMj83=o#_}xg&LEHt5m^ViOAYc0>Ux;sK!ex&$$SKHo->h9y9U zgoa4Z6zw(t<%oe{TkPij%mA|11LaApx&0xn579pO{ZAYW*{qz)qqJgG_sGQ>MPD@_ zbDF|MRw!&VRLS96l&;%@2$fL*Yd;z^Y38dQHqJJA%emlWCc?0NUyh#JlhT{vQmk3~ z*Rc&uRL6#LCaYcQ<(Ckob{5+m-~D5W^Wlr*=5K}|*H8jc^^X)H(JH*GuJQ-q=X%cGy}n?WUJ zex8iN&Z}&_Hf^%(6*DC_Jcf91AI2;GX>ugApcGumMXmBBlH444S-tU%`&06hUNM^E zIq*XKoS84V?{iek8K6*Sd0R{F?j}wcwW=CFW3S2TsNiEd5rVgd$4!rc8k*89eH`2# z8&}vTt(4IPco_e#s0i~%xCJRlUU=)G21>O0B8=3?iguepZ@6A?`3OpZHzt}a)7c-n zJahjW+{?Qt1JgDmZOjbQv{7Hn#i4E5UET!v+m=JSA z@vGi6<)SJTaMP;-p?XgrP~>_TP;kYK-WZ{5opdF_Py_-I2V)GPdF1}nmdPw}`YLp( z38OPT_QUwz_+UpU)W0zl&3nd&_+Wo1j!|B_I}JPYQ+hkmg%;|jZn!Z}(1ma=iWxnx zcjVrdoh)hPKp62{2nIR49-ej{-p9UEN-HlvjxO~3UTw{e^%vW5(mgd#UA>-j3Tsj3 zM{mSPHQU`(xpp((x5ZQa1u!XxsN;!+8^dp-e7g`aYsIAS&zN$$qan_V;Ak*SluBgw zL!O8R8E0CCdRh92Ou5+);prC^L&bD;EW}{8=xF&!iPjq<3&e0UD<11KUCiPe16P(u z+@csBmj*Pqkq^--O7Z5=5|erR?3Yk~Y<6-1j>nMlRa&v_W}a;M1t2;S6KLI;&Uah z@ze5^Sym7V1C~nPZvSz7Jz|!r5_L^`$U$hv_%AZUA2s@KQ6%6nUb_l!JOj1w(>DZh z(+7jcUt_Y<-DcRrL!+v|;!1Onj19L3efb%F=%f-w3hiqoQX_ujTcH2Umk5%Jjf?XZ zIWI=(DJ+Q~%ZDE)i=%2}C$+}-5Z}nwpsna&dWL&aaf?aaXIKVrpNX(hsn zi88d%`WPY)%aqqZ1e!(Gy*&b6&Kz~b_eR=`AS16tc~mep+F$Q;^kp=0`jfmoEzDm4 z8b3}>e~${-A#2aY7U%SgZfF%(+P?bRdfl%joW7Bv81>kFi35wBtoaU4e=+rA30%Dd z&N8j4%G)gp}wi^dRh|Ew$s*?(ME%=Qk<&6?>9`a(%B zq2^y1_$E3t50yhEd2GQ9D@Jw~+qtrbI|goEoCbB{Rv78DVwf?Y9unkh5Wq~Yl` zDCnW z%&!gHHO*HIGF`-5%@jM`=Gp}1Z@^erhuXHmF9Q`k5(2G^EBKwD*6YX1hQ4DI1x4Bi zS7KKZcZdrP-S#Rgze*LI4tx$e%%=jkcfWDwAmA7kJ$TaeZ{jr@^a~Iz{U5uWMcklU z4(P(ifydsX>~W$T5kUFD{T*sMlE74N@>N>*qk&MwzsnH^L`yyQTY1}^(wL>UFjaD& zb_Cq|=5BB5rhN~#?$c6p;o}ICkf`i*V*AylA*ohj6j~M!_VX9qqRa%v7(HEls7j4x zk98a5^xf?1Vj)~KqxAh?)$*qpBoReA9{B7;;cj&ZC&&;+Do7T3;VMVtPSP zTi;dLOuuA0(cq^%Ie8jajXx|39OK->cCjC2NxJJwBSYL~B<7YytRs zf5aDmgGa!f;Cp^vLY6#zIv6EgacYNfPo$8)^S5{`xEz<@@=gI0vNRa}k8QI^!+#Z7 zOU9f;Ps^Jrxm!WyFG7vBu$v`ganJY5zmR#-$6C1l^}<&)ASo@5m5TC@R^#(vR@tG- zl;LoC8^%Zbo!n+{3J=R;cL2^#*2<7_om)!2*Z83>nme=PTZXQGZgS#w+OuKg29qvD z(@K;Y*VLLp=Js!FdO4_>)MYhVsN%EHdc9_Oj6DFpFLz!EJA`qv#>NTeq3bqnO_s+b z&U8>8jHVhaP(j$~ZcdU!BOS?`GJ;0D^3)hGyfejcg+`sQR6HJf5 zRIIf3z)=Gxla4HvC6FpG1B(EQ7zFd>S4`9FhbLZeH+dI7y8%A2`+*=1`sDXqtY(Z$ zQBqpzpg>TuY`^?Og%9>0%q0XZWVEx4E7BAY%09s@8S_jA`43K<@ZVO6YPNPs)fCKjwO@XQDhE3k#P zj;uwWUJQd89XPAH#~Q-q!8a3Fe^5rkrLoJQDpqFcXXB!ysQa~jopQV4<-G06cxSYe^x3EUeh3y{cVLxt=G*_+p=UK{|uYc!A)-G_8~}h!Mw(|117m`-Nnk28!zjy(0CY(%yrKH zim}S{-(51BM8+Dzb^m=tOvYPk{R2Tzu@vwX56}~|@fMh$iM`yQa`HpCO+ z9P*NJ5)hm2R5QEL7p~*PUOmcJW45lB17fvg7*~Mxj=Nw@u{b1SRBbPQ*FN+)1*PlJ zm#Yg+r`+ZO)@H3;sm=prG8%5h1Dp(S1EAa{td)tKUOibzu}OoqorUgjBbODW_zmgM zk|U)!AJ>#{Ad)82AOX#Ah$p|c)nH4~-mhgD+UxGq_>7z$cW!cwk+%(WUCy1A!0Wgo|xY^nFW#YDJ=bA!QSz@K|Uc@JSh{Wq{i2cp`3Z_`d{OC7H z3hv?ZhGxB@V#LZuZ}4cUJbwJiYOF1&FIUgcT|AF<{zh+{KIN`iO&`Yr(LlO5Ec$Y7 zyOm|OlI0~f+F;sSiXl1j|~_zTH;;TqM=Z&3erU43ItCN%ML@oO)jjQ3eZYxP>)o_-M%j?)q0a-x7zmx7RzZKexWZ!PBd9E4YV9q_ z6YFl6R~;4lu6wQ^Y0c4N&)F;H1ert$LRPdr#HQ_$4$?-Jd1YWNvo25DX_Cwy6ZQUn&p0a=pcP4tyLqqYR*AeIC-@3f!8-y zgq6vd3~+ENz#kyHFRHXG7vMu@sh--Y33Tk^ zwlTR=$uM|xr7azQMOGFwH2jVwLf9zp`wsr*I;@O~%VDCBJb$9+dS5EbcP!W<0OhJ(p&;gI?>19Wu5{Myt;mRy`MMfGiEx{6 z6=KfVEa;ZO$N>80gEai;X2>OmjF>9hYag%2IaB6v&VSuI+VV!ax${uzR&+UFCl-Du z^lyX})D^p<4xchx{?d{#5ue|e)1CM}Eb8{ZI6S~^!q8vVs8yF7=DXzde!dlC&j z3-MUWRJI~s-0?4~iYRl*9~vLA!;`Ww(jf`8wqs&$}=k}+$Y`|YM5%`KD+mo3*TQv?Tb*g{K7izj4xsyxA?C7 z`*+fcahF;860@gSOB_&8f211VS}WP5Ya9Q<&Lgj4V%@b|zBR9cl=g~$1WS&R&*=C( zu|$dGIxscRb=LJK%~e>cz~06}&WJsRmbYB> zH>A$@RTjq_{{)EesB5Wk5KVXovT^GVsjfP{>?dA0vCO;4#QtYA^s@n}$*5xpvbKcs zr;UE$7-#uJYzF_pzjEG-Z(_Bkx=q_Zt1*a^?yFgN-SA0hS{Jd~hCZNV970uBGyWUZ z(@j$sai?Y2%8{*p+d<9L@1-|bJLv&)CWRSC=IUJ~vq zAi5n^49#hh4%FLQK3vM_%Cxv{=jKggO&`hv=dOn6IU_Hc;^h5v_-#u?m8@RaAtna4 z@UQrhj|^KnGFmVW3u|v1H+Pc?-c66x6(~Cno^Xy9-N>H`u%)gSzg;amSN!w@XmGa8kF!ZEXdces&(bRn61$u1mjg&};Z@WmbXz&~U59 zt232(OIH|%-!`tUalRaOZ-v`)T&0Z}dKE|>(7`m!-r7pnS%0Jx@Coa$m%wpjBcX}w z`1qq+g0+1hXuKUETUKqC!}zy{5FSASk^bu z3IkQ#*d)Um04^2|O)Vzul9_g6=uI@LT878&R4zHOI*^ooCRfrH2<0!rMT(GE<0UW+6J*XEDs4V~;CkvAgM)#W1&-NPkOJ*Ojkr^8<21_@0V@Ku@+x zhpz;mq$>=PHtghNy^YSdbsBOi>w7@u9d+2blwgik_+30Qx#*op3`ZEcoPhNShP$A< z8A{=0HLV8JD>Q@;z(cs8%NffdJ;}Pn4NjgHG@ndn?up;Jx`NL(xwK_1c+ zzLW5b#Rk$d!A88eAf0<8MsL_}`0a(@`S6BMq%iL6uPZgPaCXSQI_XQD8ryalDa!&s zS2p0C6XcTb#{W+YGN*vpt9oXsX8$L=+YsPPG6P-tE3T7+*6-n$96(stS%Fesf&%95 zS4P;(aY3%`{)W9*Si@hTCkh@qtAoQ03$iq87ZGB`X|WTg4*1F8wFhQ>a|JdEkGklL zlN31DI28gs?W@!9*>8(BJ|tJyOINR!%)_7VD4+lYw-V}lb-1D@+sxeJa$JG!hedJ5 zKi(Ia&jUl<+*rd}3qM{6);~p9!D5`3q)!!hs=pt>fN1T4o=N;q-(d|o01jU1-Fxl8 z|MU-he4F`HBH34diU1snWDN5@9|4qi`R5;vb&8Gj)(xPdDz4t&{r5QWF9P#i9Qa8Zh zz2-Z8Xr|CEJsfS-^2qLgx4SQNd!1%WODuhm1Yn&fh4~L~y3WT-dV%BA!}=57+F)Cu zz^S`A|J|vD9^fHsA2U9+!t5^d9U#Ha2?oKULW=bmj@qO&``y zugH&CB{%}~^lS2Xhth6XuXGjh>)L1gg48na{LTNZifC?{?OOtYn^ESgdisZclRxtc z#_6rBrTYSVe5d4W3=9|kw^$xuI{o5dNR)jGCNsdNViJM(;BhEY-}?Yl`f6Ncp}v>W zs`LZ8h<2+YAfW}-Ga*dZ?U45WPZyR!4K;o;xP>&QscAcEYv57qq>jSmpsCN&_er0X z{E=zmyqwos!|@-ky54k;VI#}iVb*W{6B8jaNX!f|?Z1cALpb%EP^V8k*0v!4a(j^+ z^kC;rtT%UT{WcJ376wvR4y*I2Y*Kam{~YtnhnLTlWZN_z3>!OF}9melZ?u4eW zMS6R`M^{!aX86{(9L|KYt|1`{DQk9mzOVMg0=L8_b)lp||C7V%^#!44|+>_>#&E0~h)XB-e(FEMx9cLcaje=?Y(f%irbX(Zbc%9Kex#s2xuO0zEEk z+c2r#v`+~jC35WN!@82oaJM|4Q>kT?bPp<0luwSfp%_dbAfJpM>QZdl z#8d986H5w^Ys~IYWZoxMVj$JAg6R+-eF`r{mo9k9n@UP_l^}khX;X*sLl~m!5 z@|_@1gv~JDlpR0rP6wVGr?c`YTuID4CS&&K6|Y1GhE3O~SX0Frs?^o6q&pp~0UM!r zCT-VR=XTNnOyeuh<|~F1VorDeTMW0C7&amtJGTbg^@dd)Kx^lTG^J#m$^i zL(<;4&c!W|-!eZ9hOfkO=^z|86t{4~)yV+Sqa20tcgxXxF{LllOh;slsA<4^zFcN#uwG^l^DjjVmS1kk-_Bnk33{+@kf%fX*hnEt|6*y?AH(mm&h=hF61 zesqMcNqaRiQ3hn!B#!o5RaGW5KQW!|pjVA)CsNA$9`NkI{>b@v6_uhgpbrSwqQ_K# zU#~kY)2!V-kS|$WptV`A*qxYoyadd7SgS97>^PvKK+1d_Fxtd7obJCnM)fVT{aLvG z-!)&xG5lUwu}jP=sQL-r?v&#%x*2#_5s2>qi0qCD=Z0n4LIBwD$1#5b&op?SlEB|< zP8~AWX}r7rGeU*@g(`V6^|aJ^_Rm_Y>hWghr^NgJSxd*+vppA17MzZ40-b?u93!JdE)1E0Okkgv;zh%E+9Q0L7HEvr{e1;D}0j64SG*@%umWMucaC?b!UV= z$mpxy9k;hF_$KmyJG>@sje3XMAHK65p~C>{HduUosWWcpH@#&Lu*HAMZ0<~)^Kt#A z6tP+sW6)o!C063H!^_&3hw4 zwPxEDxgM}rEzGkDQ>FAZn}sdORV29gJmwWdtzzVqnH(R{gme-vdj!4V?Aqi0IjO6 zTjjhi+?P9YfT(%u{ZH6tBGBs908@nG^wo@I-u`SgYXF$PqI9X5KU`OF>D%#VvS0)# z{%2%|xWK)OkIc`UxdPR?ul}s3@8-^M>a3@^^m_JuuEi$0G|cE3pyq_gptSR(559i= zxx}RaHe30=eM}$)v-Z5uXGm@SbYjZd>0B8L-*_ef)UdG%G?DAoj#QiYJO9%*r}SSa zAI}xfOfK77zSa+Tj$wc5in;k0`R9wk!)`RNj{-X(1tzT=;yr9+tL&`VApr0}9wJT- zGEX4AGap8~-fTzS5lQp`wbc&8!CFoET!n}XA-}7`!$zB}uk?S$JWu)x-%oas5`J!ywYAD#?2B)N4D%jU49(9$ZUiJ$QeZs`d;-VW%ZuG*@m z8E9;Gmh9=VX2t_-r?u6mVo5bXNI6*o34zmJ+b^o-F%*CoK(5!l8?xxW_Lnb$eva<# zwBnU4r^@-HV}|kVo(=;0$FmmCfpC`LY;shM&q%Jh?N_OqjXw~o)!#1>eB)H0dA-Zx zd>!DuB@wYQZ&M<|fD>$`CC7%1o2{{huz5MF+_aU-#vqE`rmm@@x|bm((yu^3_#Q=& zNiudEcmCYY=SH*!Kn;tvg#=w-AN604^#g?(R4x5TqwtK?{Q8TL0Kyq9^#+Q6i(E!u z=FTh6Ne`&G-L^y#msMwZngS;3;4}_UZ7;(+Rx{r>BY)-cICZY{_~-j~fzz76nC8)B zq|z3yn=AX?DaEcL|9XbVEBpL%#r0kfUZ3n3`DIno0u|3?>aKrs>0D;2#4XyEvuCAe zoR`P8kB|YTCmzyag~d95p!2o9CqSUppesVpVr_jEBJLZ&f*Ik8&$F-eudSE6mo_QY73g&G8@6zAmZpo$y?u&$T{QGL2fR|zh zjIgom&f3~;faAz-un}xfS5ooouHutM%D*V-HS>4>teG?uVuDcOzb|fm6I0IhofGCC ztG8-evVr|x+ug&8?@9i?JjdXrlE52?$sy$kKr4!FeTD!xv_+1+d{hI(EhJ#M7X_1c z7nJ$#MvfGo4@HNCKu1kaw2KyUMAc0!cF&7o=0#w`x}hUn#WrX6=d=E#A0iq|`Ztv7 z*Mrjxr^m~M7bGHi;%ZF0b@RE#E=wXC;uYfS2)ygW(|}K+`4x|7`19^&cp>a<~PE zc&f`@vm+eHMXj5hB)*fHeew+7sst=ZSn^xfwcpAkW1yrnm52D9WoCtmB38Ca{P5&7 zGRJg!Z#1ga)b+DT7F$E@IlsDul_MJa0%}uFx$)lFxg5^AkUysbUHRlN$;#F<`a+mb zq^pb#z@36dc76Pva8Z%r=3%LncH7f3N2;Yf`z4ycp7n>5Do?D`q`lj;tFn=bx6(dI zi_t3mm|uAr62(db{_I93HM4cU6VV$pEUSssX^5+~5qqm0Qe}^h7m(&6&xiDH1srwg zMy9jDzIXF6WW>+h%K7Q(K2OO$6J`F$+2iw7RFDI#SwFv&d1}T+DV~>$Abw4f2Kmw7 zrJ&#nie>QvF1raKamUwrdNTHlPoHmW3chm28uMra;WNDC+II8)Su?f-rjTX2H^C;Z zm+g2^Gm9O@1!)(K+G(sF3OqwivjnBnz{uF41Vg0mSp)u69P(aBZaRJNfYBL$aQqdM zp*G&G_?w@78N3|&OaFeUs3pNCUu*1r`&PGQtpQj-$*cl<|J0|I9lxeI?|YuQoL7M0 z>`1f0cOC_#Q~?;N8>8Oh*O>onfb$5vvwinc{?w{j%ol#l; zmz#5Lq31#i;lLPhV&U7^?QW=NAQ={Tr|9UkK`@Ya3rOB6Sp^qPgN-o;ug;z>r>5i* z6UxT@2Yp^bz$v5BV*WOk*S8Uac73D@kPxAr|1eHQs2Lio>!u5-(qC8v(rfQyX^S&*0i?+gYlhge9)bStFUF~QMS^f?@ zY!W?9UG-`jAGh)K?bd(gCeo_x{1#?nbahRA!@hWq|EKGT z`!lCw{i;q21fdp3K=S#k{)I`Smt*&c!>i{oTxsM2Xm~zKdTRNK>$OAAfJINri13es zEg&O$>B68yveR4fyWVHmc8||~i*fjCWtbYTU{C(RRjB=GCb>4&6R_K`CZ>AOMumPf zKO7%nS^jxiZS3GbyUykb-v@>Wv4CD=J&Oaujjvp_Ij51+NZ?(G+Trql0y3W4KzCcUn;asE^qYX3oTg4r zGp|m;D<&yD=YW?xp8cQEDbo7IbhHYn{D0kD*IN@<7RSIy6bmjgAQEE4F<1s%Kw2P- z6d6$ihzg2GlO{!4Xi-B16r4cZQJN4K2Nfa;grP}qf=bD{!BCX|N{J8x0fQho_d?_k z*l(XU5Ba`4oSSpby{G-oEni+)ZMiWWkIl62x@{r-#ojBwC9~P}zQ@2zh)$4qED828 zt*-HGml%KbOg+yhyeBg0P1sJ=uHb=EDiDd<%5{nfvWid%A^HSMCQXVPS(fY%PJrvUGZS1LdL$~NZ;FG43d)_Z_%0l4V=hYwx^FP^@YGni1~#6fu0H41yC+Cu*(n%3)b3sn&-qrfRk#u6KRE*K$v3aUfH zzzJm{d^}79u!@?3O7QslLiP|abFJ7@n8Fj#%j}&WDJx7tm3w~#wy{%U8r)k{O*Z6# z%g4r`S=8;>#VslF?~DW}r=eov=x5#jfX4bzz?C~xR?#1JMMemSmx%!S7!Y-{B|E=- z=r$j&HfbWL4VvXCC7knl!Ly&zUu-3HH!ir$>&4LD4C?kJe42mFe;y6u?Q<;!H@{Z^ z)+Env;oY+(jJFI5gQm#e7Ax-(3>YLq^e0ap&RrZW!B|iyxk!7qX)2&*aPyThCoLS! zh4Fxfq|Dq?MTFKonG5fPmu4&0Ozyl=#T@PiE+O!U^C&%xUlqInHq9zuE$BXQ2_=sP zklU~(wJ5j^!sQ-vI$K6+MAcK1pi-nStDpW1Vd82xp;{c9Y#v*8;b@(llxIfZQMezE zk_I0bu@jkZ;^sEQLGs@VvZ8_XWh5_yoi0 zre$R0$0R#G?ePj?0^IeK;poA45u@~XMxuVUBgl^F-26nh5F@3mU1VUPb2+ke50)Uv z-dD?L9HD88eJRfa5RyFAZ%8d$*QhCnaD4AY_-am@vxOV5xytXp*kFUw}hIuA1mf8vQV;DoK#y&yB{V{@dBO(*d69o3$Uie>n}aA#|A>i z(FHo)Z`yS}TQW@nnD1oVy+iXRm8POICkHmC=u)FM~PfJE_ z&tP)v(smQFvds}v7Ond{(`}QjZ&)hpdMck%sOda|C(8!x?r`-6sJ z|KcI9TocTi50s(UV7O}P7RM1~^mRDtM2-{@w>1bS89x0%t*wKCqD+|GF)c-H`~7ZE z=Lv;#lR>x*y}s<98LGee;x;z#?60PE&Md!)J(A4Qn2yLDt@y? zu_yH{6`~5j+q}!UnTaQLdLGu=v=ZIWg!qo@g>wb6zBJCU7^ob03JvkKq)f$U#^KhXYVe=_jvtNp-E;9pb@H$19c{k`JuVc~R&xz<+9 zhIK~nHuWWt^ufR%Tc-_eYV)1jFdJI|78PL){NMJfT=%UGq9%1T0eBi4)e8$N&?+3; zdl$$lm3GM=U;Ss0bzTO`fu=P0A1BBOWaxw>sPx$q4Eq&MAQ9-Ct&8YHrYx^XsRX3V zT>tBfQ{RcGN`UBpp&I8$HX(v?eqgq>gTWft@o*afHuSQOvsh)rF+i}u`_GC>#A1y z(y+FJyN{Rxv?|v{xaO3uKf5aRAp)H1oSyv-Vn+A=2q@%mC5H>eiVB2zj9&ZMp6|^z zCe&Lu;~53i6j0YxIWW&H-leZOVhSKBVy21UxB019unf2~2!EXcSk3C}90U~qr>gjd YZk$oh^*x|EEdf5q%n4@sCeAnh1}g+AX#fBK literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Safari/labelmapRenderingTiled.spec.ts/axial.png b/tests/screenshots/Mobile-Safari/labelmapRenderingTiled.spec.ts/axial.png new file mode 100644 index 0000000000000000000000000000000000000000..04b0969fdcbfef4b5f16af1f6d048b438932d41b GIT binary patch literal 5723 zcmeHL>0gpr8^)z_no%SxD>Dq2dTY|k#Bk3TOwFw{%LUECB>^WLDK)jm8O78V*9^C6 zS{y}C6cV5AXXgydPdaoZo#v&pG#fpXZ$Gy3X%Bncki* z+M9Q61^@usuBYH}M(Wa+kXz)f9a#(wppnTRr*!f33VMZ; zZkW5Sv(tcylP(UeM<9RAIk&VBNJ`Y+KPTaIT!QgAr_cyeCtP+∋)>Q-w~k()~ga(aA!iUt1oZ355zsd1P^ zeB9P{efaK9*38pBP;F5Q?6&Yn$eqz~*_kQ(h6=;}2bE`^7k+J5ww-=(_)&_XEe@?n z8KEa6TQn;chl)@=g$12i`b7;qB(0jtzk5MM&IRS97fPEJ7YY;aa0DWs#e8HyZ03xq7FPpx5~JF zbX6dYzAEjplGe~>59IChGG7r>ykJYiaXqzNdjhu~3h)i*lm*wcF7jhnB#lKeZOhM2 zmmIG}*L9ouiLMEg8zp`T$HNng+p7H!XD55)87!l>2Gw15P55+c6LW^tjs&uBk?qUlgqauL z1=oar#gYhyAn{v(C1fp(k^ir=%)}X@zbRi;y60&TGGLrt8t7>=_19;4pZ>LvJ}w2S znAYLzUvgx>#ylQs=OL4bF<_2$>wXAjyijcjP4U=vdARAS%#MSwwXMeG&Mj=1C>R%d zLj=i70;?j!K8*7v(xoTk<}~q9-v=K#B9{&iYeD^XxDeVGPYZ7B z+ICQ!*lk*r?~hD)YNuHEfD**>4u#zK_KRXeB-`3wYlkQkxf}F!-$B}JOLW1j@Ym(3 zYYDLVcb1#-dyPZCcar$46scX?R_nRntF?y8*xSUF2hM* zTeA*v27X@b0;m4`l|JtYTl@ZHrDaI#;}U$x8Z3~9FMk4)ijFAPsOY)jU8p?$u0~1i zDr0RKU5FVS%DtBv`J*stws}IT7Iyct3*6wAcr)H(H(LE-^bHm_AD zSipxT7owh*p5tg^F4AB@L)%Ilg(5n&%DG*2N3v9+}je zl%|X*|3nL7X%cGHL{kjmF#9+MzaMQ^+FFfBhfi8G%#rrp*Wgk9l5i(JyGO>a|RN?@Ng#V z7_k47ijBzPliK9dvG(P0V~ieqY-;Ehe)yB(@6AfJT3_gEeHKo!9ovhjo zvK;G?rV(YN75~MHde_XznRw`^SS2SYm4K1944AyqH0*{_tv;0YZi%RiJHZc^oXaS! z;+rC>IBb2%YW!bTIU+^%?eqTv5vQPg2hbGOfoQ^sz2z$l)o!qSwd1IfM>8K^g?yQS} zZ9X3&{Y5|6SHPP963RQVKj_WBGFTiy;_abPf4D zvcba*9$h04g*tl@pv2)gj{Vr`Jcs1IpAohCm`haRE=dTyAj^`uFdiL~D;>CWw;+xU zdtL?|Si%Vg3*+*kFpy-+LzbI|b97U1RIS%AF`?i8aG!(Z`h(``!Vj=v~{n+NZg9mY1bdqV`JjXF4qOWw9(6z>_ zji5kxPu#Jc-5*hM6=Cl|PTCry0&rs4blt(4k-|CAAMo z$3tP{_q{bUe9br83o%g>3P<+WNycbu^7&_Uo7xh)u|||)`3v)VgpJS>x@b{er~$Mi zBduy3{lnDxe{^pr-&L`xjn-k?b{#ltlpKkbN0moV?`|G=8(G9fYjZRQ6<;k0!HCs( z_SdhK8OS7UTa%&0@HpV;=L|5ihAw5+ggns)vhc^9RwVZ@6L+9h4L-5&67n__WfHYh}g=O5?3aa`oQmo^2$sqw+JZ>&wzD~?Oi z$-*oM(_HwI%WYh%46=R^nSH}En7Ksr=E5y5(1o{|WgsiyEppg;;}avAh~ z-sk;k)*xN>UW1l3T!`CBEdzrHX8hy~R-tVB!4+LU%Aj!E=YH=9<)bu*_&FzioDZI@ zZ||}n;AT<6i$S$(-1vkC25kOFXkWc!>Pxjv^^W~Z-|6#fO8uyeTyo6Bo)yFuxL8R0 zoPCG7KlxjyJ}*!%X?vqOeHtyEmVPMx_4N<3nmsfurZFJ_>Sf=09KyUkdEX>9gtmdT z7Wi`+QU4e5@`X5S?Zs?_Ks19Z_mi~>T%K!iX literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Safari/labelmapRenderingTiled.spec.ts/coronal.png b/tests/screenshots/Mobile-Safari/labelmapRenderingTiled.spec.ts/coronal.png new file mode 100644 index 0000000000000000000000000000000000000000..15d9b65e41572292a704014146853c73faf14883 GIT binary patch literal 5812 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 Mk9AbbA6dWt52Vw)lmGw# literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Safari/labelmapRenderingTiled.spec.ts/sagittal.png b/tests/screenshots/Mobile-Safari/labelmapRenderingTiled.spec.ts/sagittal.png new file mode 100644 index 0000000000000000000000000000000000000000..843c7666cb99923b3812acaf6f02bdf94c5aa13a GIT binary patch literal 7094 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 z z#caX2xq)rYY-uY;lzdoMs;#lV(9k23SEG_j_4V$EJSM!7_nyz@R<+eBNw9pzU8*AU z@^u2~BU^HYqd)%mq&G`vUrA4tFgH8nLQUq&ni=ryo9~W~i`*UTUuULYs%rPSecJx^wEeL zDTkN7CAxNV^Cx33g*lQ_crya6{g!<6sZ>OE&IdK#W!6mCF z%tK~rB&@rHYNowAbMUwN(cba>Je#FO=FvMr_Z{9Bg5xF3XXo^Ugg%z-hq^gV8{wpZ ze`cOe^(a8|l>;-~0}P8L{L$U-W{;*f>CbUiG~RP|V>TD8uny?@=9ED~0qP5%P2HG! z#ml(F>k+tfCu(9zKFHUUC08Hz@&3(;3wHQv<~&U2_MoNK*sHefRtQr647&8eL^w+4 z<&ey?i#AjUwP+DH3=b8~+-TOB?&AbJQpqXhPL4?QK2`QIo9(_ScX*H14tf>}o}xhV z02T-0o;)lX%mv7z#PQ%XfNYKvVNLOA++-)BU;b&F;&~P7@yo?JL8Dp%h<{-gcpz@h sGLQc&?N>>DvE*0d{1S!#r#iVK(}wQMOSBOt|NLiWY63AP-+A!-zadCE761SM literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Safari/stackAnnotation.spec.ts/lengthTool.png b/tests/screenshots/Mobile-Safari/stackAnnotation.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..72e16b4413548f9e36680001c0da1958ef3589f3 GIT binary patch literal 55313 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 Yv$WhP&`*YC{1kX--@Jt`Q@4ruAF>6mZ2$lO literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Safari/stackAnnotationTiled.spec.ts/lengthTool.png b/tests/screenshots/Mobile-Safari/stackAnnotationTiled.spec.ts/lengthTool.png new file mode 100644 index 0000000000000000000000000000000000000000..72e16b4413548f9e36680001c0da1958ef3589f3 GIT binary patch literal 55313 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 Yv$WhP&`*YC{1kX--@Jt`Q@4ruAF>6mZ2$lO literal 0 HcmV?d00001 diff --git a/tests/screenshots/Mobile-Safari/stackBasicTiled.spec.ts/viewport.png b/tests/screenshots/Mobile-Safari/stackBasicTiled.spec.ts/viewport.png new file mode 100644 index 0000000000000000000000000000000000000000..15c15c84e64b04757d994445a3ddb60ab74b7214 GIT binary patch literal 77686 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