From db0dbc402b7a3af624452297f67054182b3e1ffe Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 15 Jul 2024 12:18:57 -0400 Subject: [PATCH 001/337] feat: Temporary workaround to fix an ephemeral vite bug --- package-lock.json | 5106 +++++++++++++++++++++++++++++---------------- package.json | 39 +- vite.config.ts | 1 + 3 files changed, 3363 insertions(+), 1783 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9af9e4151..915fb9753 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,21 +8,21 @@ "name": "chrisui", "version": "0.0.0", "dependencies": { - "@cornerstonejs/core": "^1.81.2", - "@cornerstonejs/dicom-image-loader": "^1.81.2", - "@cornerstonejs/streaming-image-volume-loader": "^1.81.2", - "@cornerstonejs/tools": "^1.81.2", + "@cornerstonejs/core": "^1.82.4", + "@cornerstonejs/dicom-image-loader": "^1.82.4", + "@cornerstonejs/streaming-image-volume-loader": "^1.82.4", + "@cornerstonejs/tools": "^1.82.4", "@fnndsc/chrisapi": "^1.15.0", "@niivue/niivue": "^0.41.1", "@patternfly/react-catalog-view-extension": "^5.0.0", "@patternfly/react-charts": "^7.3.0", - "@patternfly/react-core": "^5.3.3", + "@patternfly/react-core": "^5.3.4", "@patternfly/react-log-viewer": "^5.2.0", - "@patternfly/react-table": "^5.3.3", + "@patternfly/react-table": "^5.3.4", "@react-hook/resize-observer": "^2.0.1", - "@tanstack/react-query": "^5.49.2", - "antd": "^5.19.0", - "axios": "^1.6.5", + "@tanstack/react-query": "^5.51.1", + "antd": "^5.19.2", + "axios": "^1.7.2", "chris-utility": "^1.1.6", "d3-hierarchy": "^1.1.9", "d3-selection": "^1.4.2", @@ -31,16 +31,16 @@ "date-fns": "^3.6.0", "dicom-parser": "^1.8.21", "email-validator": "^2.0.4", - "fp-ts": "^2.16.2", + "fp-ts": "^2.16.8", "hammerjs": "^2.0.8", - "immer": "^10.0.3", + "immer": "^10.1.1", "keymirror": "^0.1.1", "lodash": "^4.17.21", - "marked": "^11.1.1", + "marked": "^13.0.2", "micromark": "^4.0.0", "micromark-extension-gfm": "^3.0.0", "niivue-react": "github:niivue/niivue-react", - "npm": "^10.6.0", + "npm": "^10.8.2", "pako": "^1.0.11", "preval.macro": "^5.0.0", "query-string": "^9.0.0", @@ -72,7 +72,7 @@ "vite-plugin-babel-macros": "^1.0.6" }, "devDependencies": { - "@biomejs/biome": "1.5.3", + "@biomejs/biome": "1.8.3", "@faker-js/faker": "^8.4.0", "@playwright/test": "^1.41.2", "@types/d3-hierarchy": "^1.1.7", @@ -87,33 +87,36 @@ "@types/uuid": "^9.0.6", "@vitejs/plugin-react-swc": "^3.5.0", "@vitest/coverage-v8": "^1.2.2", - "happy-dom": "^13.3.8", + "happy-dom": "^14.12.3", "lefthook": "^1.6.1", - "nyc": "^15.1.0", - "playwright": "^1.41.2", + "nyc": "^17.0.0", + "playwright": "^1.45.1", "redux-devtools-extension": "^2.13.9", "redux-logger": "^3.0.6", - "vite": "^5.3.2", + "rollup-plugin-node-builtins": "^2.1.2", + "vite": "^5.3.3", "vite-plugin-istanbul": "^5.0.0", - "vitest": "^1.2.2" + "vitest": "^2.0.3" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@ant-design/colors": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.2.tgz", - "integrity": "sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.1.0.tgz", + "integrity": "sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==", + "license": "MIT", "dependencies": { "@ctrl/tinycolor": "^3.6.1" } @@ -122,6 +125,7 @@ "version": "1.21.0", "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.21.0.tgz", "integrity": "sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", "@emotion/hash": "^0.8.0", @@ -140,6 +144,7 @@ "version": "5.3.7", "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.3.7.tgz", "integrity": "sha512-bCPXTAg66f5bdccM4TT21SQBDO1Ek2gho9h3nO9DAKXJP4sq+5VBjrQMSxMVXSB3HyEz+cUbHQ5+6ogxCOpaew==", + "license": "MIT", "dependencies": { "@ant-design/colors": "^7.0.0", "@ant-design/icons-svg": "^4.4.0", @@ -158,12 +163,14 @@ "node_modules/@ant-design/icons-svg": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", - "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" }, "node_modules/@ant-design/react-slick": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.4", "classnames": "^2.2.5", @@ -176,104 +183,43 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", + "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", + "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.9", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.9", + "@babel/helpers": "^7.24.8", + "@babel/parser": "^7.24.8", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -291,24 +237,27 @@ "node_modules/@babel/core/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.9.tgz", + "integrity": "sha512-G8v3jRg+z8IwY1jHFxvCNhOPYPterE4XljNgdGTYfSTtzzwjIswIzIaSPSLs3R7yFuqnqNeay5rjICfqVr+/6A==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -316,13 +265,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -334,62 +284,72 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -399,153 +359,99 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -554,11 +460,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -568,11 +475,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -582,9 +490,10 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", + "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -593,53 +502,48 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", + "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -650,167 +554,178 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@biomejs/biome": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.5.3.tgz", - "integrity": "sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.8.3.tgz", + "integrity": "sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==", "dev": true, "hasInstallScript": true, + "license": "MIT OR Apache-2.0", "bin": { "biome": "bin/biome" }, "engines": { - "node": ">=14.*" + "node": ">=14.21.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "1.5.3", - "@biomejs/cli-darwin-x64": "1.5.3", - "@biomejs/cli-linux-arm64": "1.5.3", - "@biomejs/cli-linux-arm64-musl": "1.5.3", - "@biomejs/cli-linux-x64": "1.5.3", - "@biomejs/cli-linux-x64-musl": "1.5.3", - "@biomejs/cli-win32-arm64": "1.5.3", - "@biomejs/cli-win32-x64": "1.5.3" + "@biomejs/cli-darwin-arm64": "1.8.3", + "@biomejs/cli-darwin-x64": "1.8.3", + "@biomejs/cli-linux-arm64": "1.8.3", + "@biomejs/cli-linux-arm64-musl": "1.8.3", + "@biomejs/cli-linux-x64": "1.8.3", + "@biomejs/cli-linux-x64-musl": "1.8.3", + "@biomejs/cli-win32-arm64": "1.8.3", + "@biomejs/cli-win32-x64": "1.8.3" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.5.3.tgz", - "integrity": "sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.3.tgz", + "integrity": "sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT OR Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=14.*" + "node": ">=14.21.3" } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.5.3.tgz", - "integrity": "sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.3.tgz", + "integrity": "sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT OR Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=14.*" + "node": ">=14.21.3" } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.5.3.tgz", - "integrity": "sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.3.tgz", + "integrity": "sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT OR Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.*" + "node": ">=14.21.3" } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.3.tgz", - "integrity": "sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.3.tgz", + "integrity": "sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT OR Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.*" + "node": ">=14.21.3" } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.5.3.tgz", - "integrity": "sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.3.tgz", + "integrity": "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT OR Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.*" + "node": ">=14.21.3" } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.3.tgz", - "integrity": "sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", + "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT OR Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.*" + "node": ">=14.21.3" } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.5.3.tgz", - "integrity": "sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", + "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT OR Apache-2.0", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=14.*" + "node": ">=14.21.3" } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.5.3.tgz", - "integrity": "sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", + "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT OR Apache-2.0", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=14.*" + "node": ">=14.21.3" } }, "node_modules/@cornerstonejs/codec-charls": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-charls/-/codec-charls-1.2.3.tgz", "integrity": "sha512-qKUe6DN0dnGzhhfZLYhH9UZacMcudjxcaLXCrpxJImT/M/PQvZCT2rllu6VGJbWKJWG+dMVV2zmmleZcdJ7/cA==", + "license": "MIT", "engines": { "node": ">=0.14" } @@ -819,6 +734,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-libjpeg-turbo-8bit/-/codec-libjpeg-turbo-8bit-1.2.2.tgz", "integrity": "sha512-aAUMK2958YNpOb/7G6e2/aG7hExTiFTASlMt/v90XA0pRHdWiNg5ny4S5SAju0FbIw4zcMnR0qfY+yW3VG2ivg==", + "license": "ISC", "engines": { "node": ">=0.14" } @@ -827,6 +743,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-openjpeg/-/codec-openjpeg-1.2.4.tgz", "integrity": "sha512-UT2su6xZZnCPSuWf2ldzKa/2+guQ7BGgfBSKqxanggwJHh48gZqIAzekmsLyJHMMK5YDK+ti+fzvVJhBS3Xi/g==", + "license": "MIT", "engines": { "node": ">=0.14" } @@ -835,14 +752,16 @@ "version": "2.4.5", "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz", "integrity": "sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==", + "license": "MIT", "engines": { "node": ">=0.14" } }, "node_modules/@cornerstonejs/core": { - "version": "1.81.2", - "resolved": "https://registry.npmjs.org/@cornerstonejs/core/-/core-1.81.2.tgz", - "integrity": "sha512-Q0ZiksDiT9Fut9+nfcFTV1CPe/kXbBuPRfuR4zMmH6HFtbkiNw4isWCs0OxY84Hbpi2+sZRnfRYZKneaNGFpLw==", + "version": "1.82.4", + "resolved": "https://registry.npmjs.org/@cornerstonejs/core/-/core-1.82.4.tgz", + "integrity": "sha512-ihRGD9rixNbxs9DzODXKbOJk9I422f0Dx2DWIUIhV1oPLiBJLJPAX9NuWnkiHZq8weDfka7B9JZRXbVMTcB+zw==", + "license": "MIT", "dependencies": { "@kitware/vtk.js": "30.4.1", "comlink": "^4.4.1", @@ -856,15 +775,16 @@ } }, "node_modules/@cornerstonejs/dicom-image-loader": { - "version": "1.81.2", - "resolved": "https://registry.npmjs.org/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.81.2.tgz", - "integrity": "sha512-VMow5bjr+4mVcqAbp+blZOiuXrR+F5VVnYIUAq0NaBBXnou9HD30tjAB46favSk6IiPMKlDMie+NfZmLJUI8Wg==", + "version": "1.82.4", + "resolved": "https://registry.npmjs.org/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.82.4.tgz", + "integrity": "sha512-uDX0ynccM6NNZGbyqhElB7yLtUjwer1vQb9P37d2U65OaC27bQRzEg1xvD2gMM1zm2BrOcK6AFC4tBplsZINsQ==", + "license": "MIT", "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", - "@cornerstonejs/core": "^1.81.2", + "@cornerstonejs/core": "^1.82.4", "dicom-parser": "^1.8.9", "pako": "^2.0.4", "uuid": "^9.0.0" @@ -873,14 +793,16 @@ "node_modules/@cornerstonejs/dicom-image-loader/node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" }, "node_modules/@cornerstonejs/streaming-image-volume-loader": { - "version": "1.81.2", - "resolved": "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-1.81.2.tgz", - "integrity": "sha512-GWHAPugmOU1d/X8fr9EsmHF6ABYxZLNVeS9DW+uXz0I5Bfgj9J/jwbzo++wbCpPHcDQPBkLAKyeuDUn71vn7Hg==", + "version": "1.82.4", + "resolved": "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-1.82.4.tgz", + "integrity": "sha512-T+ElS6u52Ny6SaKbd4Z87/ieEIAoe0eixHytk2XGWSvtkGSNxDdCNPVJkUZTONFQ33g7doq0zCuNT/lZ2ejcZw==", + "license": "MIT", "dependencies": { - "@cornerstonejs/core": "^1.81.2", + "@cornerstonejs/core": "^1.82.4", "comlink": "^4.4.1" }, "funding": { @@ -889,11 +811,12 @@ } }, "node_modules/@cornerstonejs/tools": { - "version": "1.81.2", - "resolved": "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-1.81.2.tgz", - "integrity": "sha512-6sSxrnW2us3mmRYQaqzHHlYtdSlF1kFlGeWZzsjsYCDSr8txj+7Pa77Lq8p7J/soj1zlQCnEyp5WcpAcEs5r0A==", + "version": "1.82.4", + "resolved": "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-1.82.4.tgz", + "integrity": "sha512-+46qdHcksXNtAgvzfkMAsLG4/9mKS5FZZybxVfOMRJwdyjZW68PMT7c4mb4kHok3uZ3NoFNtnqqR1RSkrR+rMA==", + "license": "MIT", "dependencies": { - "@cornerstonejs/core": "^1.81.2", + "@cornerstonejs/core": "^1.82.4", "@icr/polyseg-wasm": "0.4.0", "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -918,6 +841,7 @@ "version": "3.6.1", "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", "engines": { "node": ">=10" } @@ -925,12 +849,14 @@ "node_modules/@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" }, "node_modules/@emotion/unitless": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", @@ -940,6 +866,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -956,6 +883,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -972,6 +900,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -988,6 +917,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1004,6 +934,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1020,6 +951,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1036,6 +968,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1052,6 +985,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1068,6 +1002,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1084,6 +1019,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1100,6 +1036,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1116,6 +1053,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1132,6 +1070,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1148,6 +1087,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1164,6 +1104,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1180,6 +1121,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1196,6 +1138,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1212,6 +1155,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -1228,6 +1172,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -1244,6 +1189,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -1260,6 +1206,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1276,6 +1223,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1292,6 +1240,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1301,9 +1250,9 @@ } }, "node_modules/@faker-js/faker": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.0.tgz", - "integrity": "sha512-htW87352wzUCdX1jyUQocUcmAaFqcR/w082EC8iP/gtkF0K+aKcBp0hR5Arb7dzR8tQ1TrhE9DNa5EbJELm84w==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", + "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", "dev": true, "funding": [ { @@ -1311,25 +1260,27 @@ "url": "https://opencollective.com/fakerjs" } ], + "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", "npm": ">=6.14.13" } }, "node_modules/@fnndsc/chrisapi": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@fnndsc/chrisapi/-/chrisapi-1.15.0.tgz", - "integrity": "sha512-HWnKBEtzqGtozqJx2yCMoNNXDFozAMtY+Z2QjUFbf8bhcbievJMxk2mP15Qwwg7P0Qt+T3wbaCHQmqUR/8Ztbg==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@fnndsc/chrisapi/-/chrisapi-1.21.0.tgz", + "integrity": "sha512-JNi6EFJn3mZTuYQqnocRDEb8mxSue3nszoKH8W6001njPt+3pEpWBxbfvhyy0FJlOevKx/gByxDVvVsG8hEqEQ==", + "license": "MIT", "dependencies": { - "axios": "^1.4.0", - "core-js": "^3.26.0", - "webpack-merge": "^4.2.2" + "axios": "^1.6.8", + "core-js": "^3.36.1" } }, "node_modules/@icr/polyseg-wasm": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@icr/polyseg-wasm/-/polyseg-wasm-0.4.0.tgz", "integrity": "sha512-3sZmiwG8I0NaqPle0L7+V/ZexiR7IjIUFkUsaOoFI9rNuBGyyMMmxAxnCmqcDFtBDk9h+JEYJf6e3NnqlHi/HQ==", + "license": "MIT", "engines": { "node": ">=0.14" } @@ -1339,6 +1290,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -1350,74 +1302,59 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1426,12 +1363,14 @@ "node_modules/@juggle/resize-observer": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "license": "Apache-2.0" }, "node_modules/@kitware/vtk.js": { "version": "30.4.1", "resolved": "https://registry.npmjs.org/@kitware/vtk.js/-/vtk.js-30.4.1.tgz", "integrity": "sha512-jBJFm8AyWpJjNFFBadXyvBwegdD9M6WRdxmIb+x/MVpCyA5lEZSMemhiMn71oKsznaEe5Pjv2VDVJWmwK0vhUg==", + "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "7.22.11", "@types/webxr": "^0.5.5", @@ -1460,34 +1399,11 @@ "wslink": ">=1.1.0 || ^2.0.0" } }, - "node_modules/@kitware/vtk.js/node_modules/@babel/runtime": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", - "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@kitware/vtk.js/node_modules/commander": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", - "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/@kitware/vtk.js/node_modules/fflate": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz", - "integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==" - }, "node_modules/@lukeed/csprng": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "license": "MIT", "engines": { "node": ">=8" } @@ -1496,6 +1412,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz", "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==", + "license": "MIT", "dependencies": { "@lukeed/csprng": "^1.1.0" }, @@ -1508,6 +1425,7 @@ "resolved": "https://registry.npmjs.org/@mattiasbuelens/web-streams-polyfill/-/web-streams-polyfill-0.2.1.tgz", "integrity": "sha512-oKuFCQFa3W7Hj7zKn0+4ypI8JFm4ZKIoncwAC6wd5WwFW2sL7O1hpPoJdSWpynQ4DJ4lQ6MvFoVDmCLilonDFg==", "deprecated": "moved to web-streams-polyfill@2.0.0", + "license": "MIT", "dependencies": { "@types/whatwg-streams": "^0.0.7" }, @@ -1519,6 +1437,7 @@ "version": "0.41.1", "resolved": "https://registry.npmjs.org/@niivue/niivue/-/niivue-0.41.1.tgz", "integrity": "sha512-A1Nfqx/8RYTzCoA7x8AUfC8dPTw7jou6NXAJzXILY6tw22NzF/Qx/XXeJ3mMEg1J7xvGXa83REyvyNEkEvF3bQ==", + "license": "BSD-2-Clause", "dependencies": { "@lukeed/uuid": "^2.0.1", "@ungap/structured-clone": "^1.2.0", @@ -1533,18 +1452,17 @@ "@rollup/rollup-linux-x64-gnu": "^4.13.2" } }, - "node_modules/@niivue/niivue/node_modules/nifti-reader-js": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/nifti-reader-js/-/nifti-reader-js-0.6.8.tgz", - "integrity": "sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==", - "dependencies": { - "fflate": "*" - } + "node_modules/@niivue/niivue/node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" }, "node_modules/@oozcitak/dom": { "version": "1.15.10", "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", + "license": "MIT", "dependencies": { "@oozcitak/infra": "1.0.8", "@oozcitak/url": "1.0.4", @@ -1558,6 +1476,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", + "license": "MIT", "dependencies": { "@oozcitak/util": "8.3.8" }, @@ -1569,6 +1488,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", + "license": "MIT", "dependencies": { "@oozcitak/infra": "1.0.8", "@oozcitak/util": "8.3.8" @@ -1581,6 +1501,7 @@ "version": "8.3.8", "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", + "license": "MIT", "engines": { "node": ">=8.0" } @@ -1589,6 +1510,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@patternfly/react-catalog-view-extension/-/react-catalog-view-extension-5.0.0.tgz", "integrity": "sha512-Sg0iLAVhE7wAwBJERNdYp6peMO4THG7ez3xvMXEWh2biXghIv9XVj5BEy0TssihMxZa/pRMdROzcv3QZ9m24Yg==", + "license": "MIT", "dependencies": { "@patternfly/react-core": "^5.0.0", "@patternfly/react-styles": "^5.0.0" @@ -1602,6 +1524,7 @@ "version": "7.3.0", "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-7.3.0.tgz", "integrity": "sha512-J6d/bFolI3zUOvJoK4lEveNeXZeJNfBq+iXgQ/mImESyW0H7MSebMcVB4d+NC6JX0QykuaOEn/7YMJMU9K73tw==", + "license": "MIT", "dependencies": { "@patternfly/react-styles": "^5.3.0", "@patternfly/react-tokens": "^5.3.0", @@ -1632,9 +1555,10 @@ } }, "node_modules/@patternfly/react-core": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.3.3.tgz", - "integrity": "sha512-qq3j0M+Vi+Xmd+a/MhRhGgjdRh9Hnm79iA+L935HwMIVDcIWRYp6Isib/Ha4+Jk+f3Qdl0RT3dBDvr/4m6OpVQ==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.3.4.tgz", + "integrity": "sha512-zr2yeilIoFp8MFOo0vNgI8XuM+P2466zHvy4smyRNRH2/but2WObqx7Wu4ftd/eBMYdNqmTeuXe6JeqqRqnPMQ==", + "license": "MIT", "dependencies": { "@patternfly/react-icons": "^5.3.2", "@patternfly/react-styles": "^5.3.1", @@ -1652,6 +1576,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.3.2.tgz", "integrity": "sha512-GEygYbl0H4zD8nZuTQy2dayKIrV2bMMeWKSOEZ16Y3EYNgYVUOUnN+J0naAEuEGH39Xb1DE9n+XUbE1PC4CxPA==", + "license": "MIT", "peerDependencies": { "react": "^17 || ^18", "react-dom": "^17 || ^18" @@ -1661,6 +1586,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@patternfly/react-log-viewer/-/react-log-viewer-5.2.0.tgz", "integrity": "sha512-+9v4d49ImSMWACJVBbvl5OjIAbEl4QWDuJJQpi2r+tP3ZzAHDZOohOGBeMmT780i0sOeny83qnbNpNbMBVeLCA==", + "license": "MIT", "dependencies": { "@patternfly/react-core": "^5.0.0", "@patternfly/react-icons": "^5.0.0", @@ -1675,14 +1601,16 @@ "node_modules/@patternfly/react-styles": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.3.1.tgz", - "integrity": "sha512-H6uBoFH3bJjD6PP75qZ4k+2TtF59vxf9sIVerPpwrGJcRgBZbvbMZCniSC3+S2LQ8DgXLnDvieq78jJzHz0hiA==" + "integrity": "sha512-H6uBoFH3bJjD6PP75qZ4k+2TtF59vxf9sIVerPpwrGJcRgBZbvbMZCniSC3+S2LQ8DgXLnDvieq78jJzHz0hiA==", + "license": "MIT" }, "node_modules/@patternfly/react-table": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.3.3.tgz", - "integrity": "sha512-uaRmsJABvVPH8gYTh+EUcDz61knIxe9qor/VGUYDLONYBL5G3IaltwG42IsJ9jShxiwFmIPy+QARPpaadTpv5w==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.3.4.tgz", + "integrity": "sha512-jGaiuo02scaC1HdGNHuYVRjtQCOB+vtvfbgS7nl1Y8ZcJ08wyUGhGSrEpNHfGAQ1XDSSoELAxj0cjOQwAAQw1A==", + "license": "MIT", "dependencies": { - "@patternfly/react-core": "^5.3.3", + "@patternfly/react-core": "^5.3.4", "@patternfly/react-icons": "^5.3.2", "@patternfly/react-styles": "^5.3.1", "@patternfly/react-tokens": "^5.3.1", @@ -1697,32 +1625,36 @@ "node_modules/@patternfly/react-tokens": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.3.1.tgz", - "integrity": "sha512-VYK0uVP2/2RJ7ZshJCCLeq0Boih5I1bv+9Z/Bg6h12dCkLs85XsxAX9Ve+BGIo5DF54/mzcRHE1RKYap4ISXuw==" + "integrity": "sha512-VYK0uVP2/2RJ7ZshJCCLeq0Boih5I1bv+9Z/Bg6h12dCkLs85XsxAX9Ve+BGIo5DF54/mzcRHE1RKYap4ISXuw==", + "license": "MIT" }, "node_modules/@playwright/test": { - "version": "1.41.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.41.2.tgz", - "integrity": "sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg==", + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.1.tgz", + "integrity": "sha512-Wo1bWTzQvGA7LyKGIZc8nFSTFf2TkthGIFBR+QVNilvwouGzFd4PYukZe3rvf5PSqjHi1+1NyKSDZKcQWETzaA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "playwright": "1.41.2" + "playwright": "1.45.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@polka/url": { - "version": "1.0.0-next.24", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", - "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==" + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "license": "MIT" }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -1732,6 +1664,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.4" }, @@ -1739,10 +1672,23 @@ "node": ">=14.x" } }, + "node_modules/@rc-component/async-validator/node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@rc-component/color-picker": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.5.3.tgz", "integrity": "sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.6", "@ctrl/tinycolor": "^3.6.1", @@ -1754,10 +1700,23 @@ "react-dom": ">=16.9.0" } }, + "node_modules/@rc-component/color-picker/node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@rc-component/context": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "rc-util": "^5.27.0" @@ -1771,6 +1730,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0" }, @@ -1782,6 +1742,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", "classnames": "^2.3.2", @@ -1799,6 +1760,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", "classnames": "^2.3.2", @@ -1816,6 +1778,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", "classnames": "^2.3.2", @@ -1829,10 +1792,23 @@ "react-dom": ">=16.9.0" } }, + "node_modules/@rc-component/qrcode/node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@rc-component/tour": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.0.tgz", "integrity": "sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", "@rc-component/portal": "^1.0.0-9", @@ -1852,6 +1828,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.0.tgz", "integrity": "sha512-QarBCji02YE9aRFhZgRZmOpXBj0IZutRippsVBv85sxvG4FGk/vRxwAlkn3MS9zK5mwbETd86mAVg2tKqTkdJA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2", "@rc-component/portal": "^1.1.0", @@ -1868,10 +1845,23 @@ "react-dom": ">=16.9.0" } }, + "node_modules/@rc-component/trigger/node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@react-hook/latest": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", + "license": "MIT", "peerDependencies": { "react": ">=16.8" } @@ -1880,6 +1870,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", + "license": "MIT", "peerDependencies": { "react": ">=16.8" } @@ -1888,6 +1879,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@react-hook/resize-observer/-/resize-observer-2.0.1.tgz", "integrity": "sha512-9PCX9grWfxdPizY8ohr+X4IkV1JhGMWr2Nm4ngbg6IcAIv0WBs7YoJcNBqYl22OqPHr5eOMItGcStZrmj2mbmQ==", + "license": "MIT", "dependencies": { "@juggle/resize-observer": "^3.3.1", "@react-hook/latest": "^1.0.2", @@ -1901,6 +1893,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.3.0.tgz", "integrity": "sha512-L+i+qIGuyWn7CIg7k1MteHGfttKPmxwZR5E7OsGikCL2LzYA0RERlaUY00Y3P3ZV2EYgrsYlBrGs6cJP5OKKqA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.3", "@redux-saga/deferred": "^1.2.1", @@ -1918,12 +1911,14 @@ "node_modules/@redux-saga/deferred": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.2.1.tgz", - "integrity": "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==" + "integrity": "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==", + "license": "MIT" }, "node_modules/@redux-saga/delay-p": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.2.1.tgz", "integrity": "sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==", + "license": "MIT", "dependencies": { "@redux-saga/symbols": "^1.1.3" } @@ -1932,6 +1927,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.3.tgz", "integrity": "sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==", + "license": "MIT", "dependencies": { "@redux-saga/symbols": "^1.1.3", "@redux-saga/types": "^1.2.1" @@ -1940,25 +1936,29 @@ "node_modules/@redux-saga/symbols": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.3.tgz", - "integrity": "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==" + "integrity": "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==", + "license": "MIT" }, "node_modules/@redux-saga/types": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz", - "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==" + "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==", + "license": "MIT" }, "node_modules/@remix-run/router": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.0.tgz", - "integrity": "sha512-2D6XaHEVvkCn682XBnipbJjgZUU7xjLtA4dGJRBVUKpEaDYOZMENZoZjAOSb7qirxt5RupjzZxz4fK2FO+EFPw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.1.tgz", + "integrity": "sha512-mCOMec4BKd6BRGBZeSnGiIgwsbLGp3yhVqAD8H+PxiRNEHgDpZb8J1TnrSDlg97t0ySKMQJTHCWBCmBpSmkF6Q==", + "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/@restart/hooks": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.11.tgz", - "integrity": "sha512-Ft/ncTULZN6ldGHiF/k5qt72O8JyRMOeg0tApvCni8LkoiEahO+z3TNxfXIVGy890YtWVDvJAl662dVJSJXvMw==", + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", + "license": "MIT", "dependencies": { "dequal": "^2.0.3" }, @@ -1967,214 +1967,238 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", - "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", + "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", - "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", + "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", - "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", + "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", - "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", + "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", - "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", + "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", + "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", - "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", + "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", - "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", + "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", - "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", + "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", "cpu": [ - "ppc64le" + "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", - "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", + "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", - "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", + "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", - "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", + "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", - "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", + "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", - "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", + "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", - "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", + "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", - "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", + "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, "node_modules/@swc/core": { - "version": "1.3.104", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.104.tgz", - "integrity": "sha512-9LWH/qzR/Pmyco+XwPiPfz59T1sryI7o5dmqb593MfCkaX5Fzl9KhwQTI47i21/bXYuCdfa9ySZuVkzXMirYxA==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.6.13.tgz", + "integrity": "sha512-eailUYex6fkfaQTev4Oa3mwn0/e3mQU4H8y1WPuImYQESOQDtVrowwUGDSc19evpBbHpKtwM+hw8nLlhIsF+Tw==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@swc/counter": "^0.1.1", - "@swc/types": "^0.1.5" + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.9" }, "engines": { "node": ">=10" @@ -2184,19 +2208,19 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.104", - "@swc/core-darwin-x64": "1.3.104", - "@swc/core-linux-arm-gnueabihf": "1.3.104", - "@swc/core-linux-arm64-gnu": "1.3.104", - "@swc/core-linux-arm64-musl": "1.3.104", - "@swc/core-linux-x64-gnu": "1.3.104", - "@swc/core-linux-x64-musl": "1.3.104", - "@swc/core-win32-arm64-msvc": "1.3.104", - "@swc/core-win32-ia32-msvc": "1.3.104", - "@swc/core-win32-x64-msvc": "1.3.104" + "@swc/core-darwin-arm64": "1.6.13", + "@swc/core-darwin-x64": "1.6.13", + "@swc/core-linux-arm-gnueabihf": "1.6.13", + "@swc/core-linux-arm64-gnu": "1.6.13", + "@swc/core-linux-arm64-musl": "1.6.13", + "@swc/core-linux-x64-gnu": "1.6.13", + "@swc/core-linux-x64-musl": "1.6.13", + "@swc/core-win32-arm64-msvc": "1.6.13", + "@swc/core-win32-ia32-msvc": "1.6.13", + "@swc/core-win32-x64-msvc": "1.6.13" }, "peerDependencies": { - "@swc/helpers": "^0.5.0" + "@swc/helpers": "*" }, "peerDependenciesMeta": { "@swc/helpers": { @@ -2205,13 +2229,14 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.104", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.104.tgz", - "integrity": "sha512-rCnVj8x3kn6s914Adddu+zROHUn6mUEMkNKUckofs3W9OthNlZXJA3C5bS2MMTRFXCWamJ0Zmh6INFpz+f4Tfg==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.13.tgz", + "integrity": "sha512-SOF4buAis72K22BGJ3N8y88mLNfxLNprTuJUpzikyMGrvkuBFNcxYtMhmomO0XHsgLDzOJ+hWzcgjRNzjMsUcQ==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -2221,13 +2246,14 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.3.104", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.104.tgz", - "integrity": "sha512-LBCWGTYkn1UjyxrmcLS3vZgtCDVhwxsQMV7jz5duc7Gas8SRWh6ZYqvUkjlXMDX1yx0uvzHrkaRw445+zDRj7Q==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.6.13.tgz", + "integrity": "sha512-AW8akFSC+tmPE6YQQvK9S2A1B8pjnXEINg+gGgw0KRUUXunvu1/OEOeC5L2Co1wAwhD7bhnaefi06Qi9AiwOag==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -2237,13 +2263,14 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.104", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.104.tgz", - "integrity": "sha512-iFbsWcx0TKHWnFBNCuUstYqRtfkyBx7FKv5To1Hx14EMuvvoCD/qUoJEiNfDQN5n/xU9g5xq4RdbjEWCFLhAbA==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.13.tgz", + "integrity": "sha512-f4gxxvDXVUm2HLYXRd311mSrmbpQF2MZ4Ja6XCQz1hWAxXdhRl1gpnZ+LH/xIfGSwQChrtLLVrkxdYUCVuIjFg==", "cpu": [ "arm" ], "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -2253,13 +2280,14 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.104", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.104.tgz", - "integrity": "sha512-1BIIp+nUPrRHHaJ35YJqrwXPwYSITp5robqqjyTwoKGw2kq0x+A964kpWul6v0d7A9Ial8fyH4m13eSWBodD2A==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.13.tgz", + "integrity": "sha512-Nf/eoW2CbG8s+9JoLtjl9FByBXyQ5cjdBsA4efO7Zw4p+YSuXDgc8HRPC+E2+ns0praDpKNZtLvDtmF2lL+2Gg==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -2269,13 +2297,14 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.104", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.104.tgz", - "integrity": "sha512-IyDNkzpKwvLqmRwTW+s8f8OsOSSj1N6juZKbvNHpZRfWZkz3T70q3vJlDBWQwy8z8cm7ckd7YUT3eKcSBPPowg==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.13.tgz", + "integrity": "sha512-2OysYSYtdw79prJYuKIiux/Gj0iaGEbpS2QZWCIY4X9sGoETJ5iMg+lY+YCrIxdkkNYd7OhIbXdYFyGs/w5LDg==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -2285,13 +2314,14 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.104", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.104.tgz", - "integrity": "sha512-MfX/wiRdTjE5uXHTDnaX69xI4UBfxIhcxbVlMj//N+7AX/G2pl2UFityfVMU2HpM12BRckrCxVI8F/Zy3DZkYQ==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.13.tgz", + "integrity": "sha512-PkR4CZYJNk5hcd2+tMWBpnisnmYsUzazI1O5X7VkIGFcGePTqJ/bWlfUIVVExWxvAI33PQFzLbzmN5scyIUyGQ==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -2301,13 +2331,14 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.104", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.104.tgz", - "integrity": "sha512-5yeILaxA31gGEmquErO8yxlq1xu0XVt+fz5mbbKXKZMRRILxYxNzAGb5mzV41r0oHz6Vhv4AXX/WMCmeWl+HkQ==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.13.tgz", + "integrity": "sha512-OdsY7wryTxCKwGQcwW9jwWg3cxaHBkTTHi91+5nm7hFPpmZMz1HivJrWAMwVE7iXFw+M4l6ugB/wCvpYrUAAjA==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -2317,13 +2348,14 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.104", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.104.tgz", - "integrity": "sha512-rwcImsYnWDWGmeESG0XdGGOql5s3cG5wA8C4hHHKdH76zamPfDKKQFBsjmoNi0f1IsxaI9AJPeOmD4bAhT1ZoQ==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.13.tgz", + "integrity": "sha512-ap6uNmYjwk9M/+bFEuWRNl3hq4VqgQ/Lk+ID/F5WGqczNr0L7vEf+pOsRAn0F6EV+o/nyb3ePt8rLhE/wjHpPg==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -2333,13 +2365,14 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.104", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.104.tgz", - "integrity": "sha512-ICDA+CJLYC7NkePnrbh/MvXwDQfy3rZSFgrVdrqRosv9DKHdFjYDnA9++7ozjrIdFdBrFW2NR7pyUcidlwhNzA==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.13.tgz", + "integrity": "sha512-IJ8KH4yIUHTnS/U1jwQmtbfQals7zWPG0a9hbEfIr4zI0yKzjd83lmtS09lm2Q24QBWOCFGEEbuZxR4tIlvfzA==", "cpu": [ "ia32" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -2349,13 +2382,14 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.104", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.104.tgz", - "integrity": "sha512-fZJ1Ju62U4lMZVU+nHxLkFNcu0hG5Y0Yj/5zjrlbuX5N8J5eDndWAFsVnQhxRTZqKhZB53pvWRQs5FItSDqgXg==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.13.tgz", + "integrity": "sha512-f6/sx6LMuEnbuxtiSL/EkR0Y6qUHFw1XVrh6rwzKXptTipUdOY+nXpKoh+1UsBm/r7H0/5DtOdrn3q5ZHbFZjQ==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -2365,32 +2399,39 @@ } }, "node_modules/@swc/counter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", - "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", - "dev": true + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/@swc/types": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", - "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", - "dev": true + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.9.tgz", + "integrity": "sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } }, "node_modules/@tanstack/query-core": { - "version": "5.49.1", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.49.1.tgz", - "integrity": "sha512-JnC9ndmD1KKS01Rt/ovRUB1tmwO7zkyXAyIxN9mznuJrcNtOrkmOnQqdJF2ib9oHzc2VxHomnEG7xyfo54Npkw==", + "version": "5.51.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.1.tgz", + "integrity": "sha512-fJBMQMpo8/KSsWW5ratJR5+IFr7YNJ3K2kfP9l5XObYHsgfVy1w3FJUWU4FT2fj7+JMaEg33zOcNDBo0LMwHnw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/react-query": { - "version": "5.49.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.49.2.tgz", - "integrity": "sha512-6rfwXDK9BvmHISbNFuGd+wY3P44lyW7lWiA9vIFGT/T0P9aHD1VkjTvcM4SDAIbAQ9ygEZZoLt7dlU1o3NjMVA==", + "version": "5.51.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.1.tgz", + "integrity": "sha512-s47HKFnQ4HOJAHoIiXcpna/roMMPZJPy6fJ6p4ZNVn8+/onlLBEDd1+xc8OnDuwgvecqkZD7Z2mnSRbcWefrKw==", + "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.49.1" + "@tanstack/query-core": "5.51.1" }, "funding": { "type": "github", @@ -2401,14 +2442,16 @@ } }, "node_modules/@tweenjs/tween.js": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-21.1.1.tgz", - "integrity": "sha512-O2GetAwEC/0MOiRb3lxCLIt/eeugoDPX0nu+1SFWLqGKf835ZdWsfM9RzDpjF+aKkpYMhvOnEhO+SxMnHHjpfw==" + "version": "23.1.2", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.2.tgz", + "integrity": "sha512-kMCNaZCJugWI86xiEHaY338CU5JpD0B97p1j1IKNn/Zto8PgACjQx0UxbHjmOcLl/dDOBnItwD07KmCs75pxtQ==", + "license": "MIT" }, "node_modules/@types/babel__core": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", - "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -2418,9 +2461,10 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -2429,15 +2473,17 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } @@ -2445,34 +2491,40 @@ "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" }, "node_modules/@types/d3-array": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" }, "node_modules/@types/d3-color": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.5.tgz", - "integrity": "sha512-5sNP3DmtSnSozxcjqmzQKsDOuVJXZkceo1KJScDc1982kk/TS9mTPc6lpli1gTu1MIBF1YWutpHpjucNWcIj5g==" + "integrity": "sha512-5sNP3DmtSnSozxcjqmzQKsDOuVJXZkceo1KJScDc1982kk/TS9mTPc6lpli1gTu1MIBF1YWutpHpjucNWcIj5g==", + "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" }, "node_modules/@types/d3-hierarchy": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.11.tgz", "integrity": "sha512-lnQiU7jV+Gyk9oQYk0GGYccuexmQPTp08E0+4BidgFdiJivjEvf+esPSdZqCZ2C7UwTWejWpqetVaU8A+eX3FA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.4.5.tgz", "integrity": "sha512-k9L18hXXv7OvK4PqW1kSFYIzasGOvfhPUWmHFkoZ8/ci99EAmY4HoF6zMefrHl0SGV7XYc7Qq2MNh8dK3edg5A==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-color": "^1" } @@ -2480,12 +2532,14 @@ "node_modules/@types/d3-path": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-2.0.4.tgz", - "integrity": "sha512-jjZVLBjEX4q6xneKMmv62UocaFJFOTQSb/1aTzs3m3ICTOFoVaqGBHpNLm/4dVi0/FTltfBKgmOK1ECj3/gGjA==" + "integrity": "sha512-jjZVLBjEX4q6xneKMmv62UocaFJFOTQSb/1aTzs3m3ICTOFoVaqGBHpNLm/4dVi0/FTltfBKgmOK1ECj3/gGjA==", + "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "license": "MIT", "dependencies": { "@types/d3-time": "*" } @@ -2494,13 +2548,15 @@ "version": "1.4.6", "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.6.tgz", "integrity": "sha512-0MhJ/LzJe6/vQVxiYJnvNq5CD/MF6Qy0dLp4BEQ6Dz8oOaB0EMXfx1GGeBFSW+3VzgjaUrxK6uECDQj9VLa/Mg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-shape": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-2.1.6.tgz", - "integrity": "sha512-UvUXi3uJk7i9gstNlyh/+lidKy96AVp6lG6it586lYVIHjS2oRKkOSfaWdON6+Ziu+EqB8kbN3onxk+eP2wSmw==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-2.1.7.tgz", + "integrity": "sha512-HedHlfGHdwzKqX9+PiQVXZrdmGlwo7naoefJP7kCNk4Y7qcpQt1tUaoRa6qn0kbTdlaIHGO7111qLtb/6J8uuw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-path": "^2" } @@ -2508,18 +2564,21 @@ "node_modules/@types/d3-time": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", + "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" }, "node_modules/@types/d3-zoom": { "version": "1.8.7", "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.8.7.tgz", "integrity": "sha512-HJWci3jXwFIuFKDqGn5PmuwrhZvuFdrnUmtSKCLXFAWyf2lAIUKMKh1/lHOkWBl/f4KVupGricJiqkQy+cVTog==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-interpolate": "^1", "@types/d3-selection": "^1" @@ -2529,6 +2588,7 @@ "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", "dependencies": { "@types/ms": "*" } @@ -2537,43 +2597,43 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "license": "MIT", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.6.tgz", + "integrity": "sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", - "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } @@ -2581,22 +2641,26 @@ "node_modules/@types/offscreencanvas": { "version": "2019.7.3", "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.10", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", - "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==" + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz", - "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -2607,189 +2671,181 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@types/redux-logger": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/redux-logger/-/redux-logger-3.0.12.tgz", - "integrity": "sha512-5vAlwokZi/Unb1eGoZfVVzIBTPNDflwXiDzPLT1SynP6hdJfsOEf+w6ZOySOyboLWciCRYeE5DGYUnwVCq+Uyg==", - "dev": true, - "dependencies": { - "redux": "^4.0.0" - } - }, - "node_modules/@types/redux-logger/node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@types/redux-logger/-/redux-logger-3.0.13.tgz", + "integrity": "sha512-jylqZXQfMxahkuPcO8J12AKSSCQngdEWQrw7UiLUJzMBcv1r4Qg77P6mjGLjM27e5gFQDPD8vwUMJ9AyVxFSsg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.9.2" + "redux": "^5.0.0" } }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", + "license": "MIT" }, "node_modules/@types/uuid": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz", - "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==", - "dev": true + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/warning": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", - "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", + "license": "MIT" }, "node_modules/@types/webxr": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", - "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==" + "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==", + "license": "MIT" }, "node_modules/@types/whatwg-streams": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@types/whatwg-streams/-/whatwg-streams-0.0.7.tgz", - "integrity": "sha512-6sDiSEP6DWcY2ZolsJ2s39ZmsoGQ7KVwBDI3sESQsEm9P2dHTcqnDIHRZFRNtLCzWp7hCFGqYbw5GyfpQnJ01A==" + "integrity": "sha512-6sDiSEP6DWcY2ZolsJ2s39ZmsoGQ7KVwBDI3sESQsEm9P2dHTcqnDIHRZFRNtLCzWp7hCFGqYbw5GyfpQnJ01A==", + "license": "MIT" }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "license": "ISC" }, "node_modules/@vitejs/plugin-react-swc": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.5.0.tgz", - "integrity": "sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz", + "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==", "dev": true, + "license": "MIT", "dependencies": { - "@swc/core": "^1.3.96" + "@swc/core": "^1.5.7" }, "peerDependencies": { "vite": "^4 || ^5" } }, "node_modules/@vitest/coverage-v8": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.2.2.tgz", - "integrity": "sha512-IHyKnDz18SFclIEEAHb9Y4Uxx0sPKC2VO1kdDCs1BF6Ip4S8rQprs971zIsooLUn7Afs71GRxWMWpkCGZpRMhw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", + "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.1", "@bcoe/v8-coverage": "^0.2.3", "debug": "^4.3.4", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^4.0.1", + "istanbul-lib-source-maps": "^5.0.4", "istanbul-reports": "^3.1.6", "magic-string": "^0.30.5", "magicast": "^0.3.3", "picocolors": "^1.0.0", "std-env": "^3.5.0", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.2.0" + "strip-literal": "^2.0.0", + "test-exclude": "^6.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "^1.0.0" + "vitest": "1.6.0" } }, "node_modules/@vitest/expect": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.2.2.tgz", - "integrity": "sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.3.tgz", + "integrity": "sha512-X6AepoOYePM0lDNUPsGXTxgXZAl3EXd0GYe/MZyVE4HzkUqyUVC6S3PrY5mClDJ6/7/7vALLMV3+xD/Ko60Hqg==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/spy": "1.2.2", - "@vitest/utils": "1.2.2", - "chai": "^4.3.10" + "@vitest/spy": "2.0.3", + "@vitest/utils": "2.0.3", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.2.2.tgz", - "integrity": "sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==", + "node_modules/@vitest/pretty-format": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.3.tgz", + "integrity": "sha512-URM4GLsB2xD37nnTyvf6kfObFafxmycCL8un3OC9gaCs5cti2u+5rJdIflZ2fUJUen4NbvF6jCufwViAFLvz1g==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/utils": "1.2.2", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "node_modules/@vitest/runner": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.3.tgz", + "integrity": "sha512-EmSP4mcjYhAcuBWwqgpjR3FYVeiA4ROzRunqKltWjBfLNs1tnMLtF+qtgd5ClTwkDP6/DGlKJTNa6WxNK0bNYQ==", "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" + "@vitest/utils": "2.0.3", + "pathe": "^1.1.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "node_modules/@vitest/snapshot": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.3.tgz", + "integrity": "sha512-6OyA6v65Oe3tTzoSuRPcU6kh9m+mPL1vQ2jDlPdn9IQoUxl8rXhBnfICNOC+vwxWY684Vt5UPgtcA2aPFBb6wg==", "dev": true, - "engines": { - "node": ">=12.20" + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.3", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.2.2.tgz", - "integrity": "sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.2.2.tgz", - "integrity": "sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.3.tgz", + "integrity": "sha512-sfqyAw/ypOXlaj4S+w8689qKM1OyPOqnonqOc9T91DsoHbfN5mU7FdifWWv3MtQFf0lEUstEwR9L/q/M390C+A==", "dev": true, + "license": "MIT", "dependencies": { - "tinyspy": "^2.2.0" + "tinyspy": "^3.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.2.2.tgz", - "integrity": "sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-c/UdELMuHitQbbc/EVctlBaxoYAwQPQdSNwv7z/vHyBKy2edYZaFgptE27BRueZB7eW8po+cllotMNTDpL3HWg==", "dev": true, + "license": "MIT", "dependencies": { - "diff-sequences": "^29.6.3", + "@vitest/pretty-format": "2.0.3", "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -2799,14 +2855,35 @@ "version": "1.0.4-opt.1", "resolved": "https://registry.npmjs.org/@wearemothership/dicom-character-set/-/dicom-character-set-1.0.4-opt.1.tgz", "integrity": "sha512-stqhnpawYHY2UZKj4RHTF71ab3q3z8S1SO9ToQKjsHQwowUdFVo6YFea93psFux3yqNbRlQjwoCdPjHcD0YQzw==", + "license": "MIT", "engines": { "node": ">=10" } }, + "node_modules/abstract-leveldown": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", + "integrity": "sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "~3.0.0" + } + }, + "node_modules/abstract-leveldown/node_modules/xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, "node_modules/accessor-fn": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.0.tgz", "integrity": "sha512-dml7D96DY/K5lt4Ra2jMnpL9Bhw5HEGws4p1OAIxFFj9Utd/RxNfEO3T3f0QIWFNwQU7gNxH9snUfqF/zNkP/w==", + "license": "MIT", "engines": { "node": ">=12" } @@ -2815,15 +2892,17 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ackee-tracker/-/ackee-tracker-5.1.0.tgz", "integrity": "sha512-A7iKkGyUnEXuOzxultQB7hnm4bStYCo1c38MYRRihBfqUP8AImhtZOODb00t9xrXs/BTsg06bz1MKpXeMs9sYw==", + "license": "MIT", "dependencies": { "platform": "^1.3.6" } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2836,24 +2915,17 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -2866,6 +2938,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2881,6 +2954,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -2890,31 +2964,30 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/antd": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.19.0.tgz", - "integrity": "sha512-+w+3zJUKqwU1GSXUxnKhzSGuWUqwwpHQm/voJr2X0JBdYxr9gkLhKR0HBhQjVSSJzSb86rB48fUbByHKrN05Xg==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.19.2.tgz", + "integrity": "sha512-377Sqqbr5PQj1rwLXqjSSAB23sNO6KCsFm0LKjU6OdpHktdDk7MYcqep3q/Azo7tHrqgE+EntxaTk4lY0dx8eA==", + "license": "MIT", "dependencies": { - "@ant-design/colors": "^7.0.2", + "@ant-design/colors": "^7.1.0", "@ant-design/cssinjs": "^1.21.0", "@ant-design/icons": "^5.3.7", "@ant-design/react-slick": "~1.1.2", @@ -2943,7 +3016,7 @@ "rc-motion": "^2.9.2", "rc-notification": "~5.6.0", "rc-pagination": "~4.2.0", - "rc-picker": "~4.6.6", + "rc-picker": "~4.6.9", "rc-progress": "~4.0.0", "rc-rate": "~2.13.0", "rc-resize-observer": "^1.4.0", @@ -2958,7 +3031,7 @@ "rc-tooltip": "~6.2.0", "rc-tree": "~5.8.8", "rc-tree-select": "~5.22.1", - "rc-upload": "~4.5.2", + "rc-upload": "~4.6.0", "rc-util": "^5.43.0", "scroll-into-view-if-needed": "^3.1.0", "throttle-debounce": "^5.0.0" @@ -2972,11 +3045,24 @@ "react-dom": ">=16.9.0" } }, + "node_modules/antd/node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/append-transform": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, + "license": "MIT", "dependencies": { "default-require-extensions": "^3.0.0" }, @@ -2988,12 +3074,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -3002,6 +3090,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -3009,41 +3098,66 @@ "node_modules/array-tree-filter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", + "license": "MIT" }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, + "license": "MIT" }, "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">=12" } }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/attr-accept": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -3052,6 +3166,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -3066,6 +3181,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-preval/-/babel-plugin-preval-5.1.0.tgz", "integrity": "sha512-G5R+xmo5LS41A4UyZjOjV0mp9AvkuCyUOAJ6TOv/jTZS+VKh7L7HUDRcCSOb0YCM/u0fFarh7Diz0wjY8rFNFg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "@types/babel__core": "^7.1.12", @@ -3080,17 +3196,20 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, "node_modules/base16": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==", + "license": "MIT" }, "node_modules/bezier-js": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz", "integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==", + "license": "MIT", "funding": { "type": "individual", "url": "https://github.com/Pomax/bezierjs/blob/master/FUNDING.md" @@ -3100,23 +3219,200 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", "engines": { "node": "*" } }, + "node_modules/bl": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", + "integrity": "sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~1.0.26" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true, + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", + "integrity": "sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==", + "dev": true, + "dependencies": { + "level-filesystem": "^1.0.1", + "level-js": "^2.1.3", + "levelup": "^0.18.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "dev": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-sign/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", "funding": [ { "type": "opencollective", @@ -3131,11 +3427,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -3144,11 +3441,33 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-es6": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz", + "integrity": "sha512-Ibt+oXxhmeYJSsCkODPqNpPmyegefiD8rfutH1NYGhMZQhSp95Rz7haemgnJ6dxa6LT+JLLbtgOMORRluwKktw==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3158,6 +3477,7 @@ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, + "license": "MIT", "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", @@ -3173,6 +3493,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -3188,6 +3509,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -3196,6 +3518,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -3205,14 +3528,15 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001561", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", - "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "version": "1.0.30001642", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", + "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", "funding": [ { "type": "opencollective", @@ -3226,12 +3550,14 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/canvas-color-tracker": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.2.1.tgz", "integrity": "sha512-i5clg2pEdaWqHuEM/B74NZNLkHh5+OkXbA/T4iaBiaNDagkOCXkLNrhqUfdUugsRwuaNRU20e/OygzxWRor3yg==", + "license": "MIT", "dependencies": { "tinycolor2": "^1.6.0" }, @@ -3240,18 +3566,52 @@ } }, "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "has-flag": "^3.0.0" }, "engines": { "node": ">=4" @@ -3261,43 +3621,56 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 16" } }, "node_modules/chris-utility": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/chris-utility/-/chris-utility-1.1.6.tgz", "integrity": "sha512-FH3cJ82yWF+ugUH6Gb9HUj3Uy6GBurULZUuHopO65Z43Zzm39kyTpQiHNez3sj+MiCfqHcPA485jOtYPsofq6g==", + "license": "ISC", "dependencies": { "@fnndsc/chrisapi": "^1.9.7", "file-saver": "^2.0.5", "webpack-merge": "^4.2.2" } }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3307,42 +3680,52 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, + "node_modules/clone": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", + "integrity": "sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -3353,33 +3736,98 @@ "node_modules/comlink": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.1.tgz", - "integrity": "sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==" + "integrity": "sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==", + "license": "Apache-2.0" }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", + "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compute-scroll-into-view": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", - "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==" + "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==", + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } }, "node_modules/console-clear": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", + "license": "MIT", "engines": { "node": ">=4" } @@ -3388,12 +3836,14 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3402,24 +3852,34 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", "dependencies": { "toggle-selection": "^1.0.6" } }, "node_modules/core-js": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", - "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -3431,10 +3891,58 @@ "node": ">=10" } }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "node_modules/cross-fetch": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "license": "MIT", "dependencies": { "node-fetch": "^2.6.12" } @@ -3444,6 +3952,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3453,20 +3962,46 @@ "node": ">= 8" } }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, "node_modules/cssfilter": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", + "license": "MIT" }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" }, "node_modules/d3-array": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", "dependencies": { "internmap": "1 - 2" }, @@ -3477,12 +4012,14 @@ "node_modules/d3-binarytree": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", - "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==" + "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==", + "license": "MIT" }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -3490,40 +4027,30 @@ "node_modules/d3-dispatch": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", + "license": "BSD-3-Clause" }, "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "license": "BSD-3-Clause", "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag/node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" + "d3-dispatch": "1", + "d3-selection": "1" } }, "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-force-3d": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.5.tgz", "integrity": "sha512-tdwhAhoTYZY/a6eo9nR7HP3xSW/C6XvJTbeRpR92nlPzH6OiE+4MliN9feuSFd0tPtEUo+191qOhCTWx3NYifg==", + "license": "MIT", "dependencies": { "d3-binarytree": "1", "d3-dispatch": "1 - 3", @@ -3539,6 +4066,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -3546,12 +4074,14 @@ "node_modules/d3-hierarchy": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -3562,17 +4092,20 @@ "node_modules/d3-octree": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.0.2.tgz", - "integrity": "sha512-Qxg4oirJrNXauiuC94uKMbgxwnhdda9xRLl9ihq45srlJ4Ga3CSgqGcAL8iW7N5CIv4Oz8x3E734ulxyvHPvwA==" + "integrity": "sha512-Qxg4oirJrNXauiuC94uKMbgxwnhdda9xRLl9ihq45srlJ4Ga3CSgqGcAL8iW7N5CIv4Oz8x3E734ulxyvHPvwA==", + "license": "MIT" }, "node_modules/d3-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz", - "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" + "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==", + "license": "BSD-3-Clause" }, "node_modules/d3-quadtree": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -3581,6 +4114,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -3593,9 +4127,10 @@ } }, "node_modules/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -3607,12 +4142,14 @@ "node_modules/d3-selection": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==", + "license": "BSD-3-Clause" }, "node_modules/d3-shape": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz", "integrity": "sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==", + "license": "BSD-3-Clause", "dependencies": { "d3-path": "1 - 2" } @@ -3621,6 +4158,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", "dependencies": { "d3-array": "2 - 3" }, @@ -3632,6 +4170,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", "dependencies": { "d3-time": "1 - 3" }, @@ -3642,12 +4181,14 @@ "node_modules/d3-timer": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", + "license": "BSD-3-Clause" }, "node_modules/d3-transition": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "license": "BSD-3-Clause", "dependencies": { "d3-color": "1", "d3-dispatch": "1", @@ -3660,17 +4201,14 @@ "node_modules/d3-transition/node_modules/d3-color": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - }, - "node_modules/d3-transition/node_modules/d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==", + "license": "BSD-3-Clause" }, "node_modules/d3-transition/node_modules/d3-interpolate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "license": "BSD-3-Clause", "dependencies": { "d3-color": "1" } @@ -3679,6 +4217,7 @@ "version": "1.8.3", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "license": "BSD-3-Clause", "dependencies": { "d3-dispatch": "1", "d3-drag": "1", @@ -3690,21 +4229,14 @@ "node_modules/d3-zoom/node_modules/d3-color": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - }, - "node_modules/d3-zoom/node_modules/d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", - "dependencies": { - "d3-dispatch": "1", - "d3-selection": "1" - } + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==", + "license": "BSD-3-Clause" }, "node_modules/d3-zoom/node_modules/d3-interpolate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "license": "BSD-3-Clause", "dependencies": { "d3-color": "1" } @@ -3713,6 +4245,7 @@ "version": "1.2.46", "resolved": "https://registry.npmjs.org/daikon/-/daikon-1.2.46.tgz", "integrity": "sha512-S8dTTlsWYTH3LQztjTW9KnNvxDeL2mr2cau0auLdYMJe4TrocYP1PmidHizO3rXUs+gXpBWI1PQ2qvB4b21QFw==", + "license": "MIT", "dependencies": { "@wearemothership/dicom-character-set": "^1.0.4-opt.1", "fflate": "*", @@ -3724,12 +4257,14 @@ "node_modules/daikon/node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" }, "node_modules/date-fns": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -3738,12 +4273,14 @@ "node_modules/dayjs": { "version": "1.11.11", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", - "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" + "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==", + "license": "MIT" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -3761,6 +4298,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3769,6 +4307,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "license": "MIT", "dependencies": { "character-entities": "^2.0.0" }, @@ -3781,6 +4320,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", + "license": "MIT", "engines": { "node": ">=14.16" } @@ -3789,16 +4329,15 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, + "license": "MIT", "engines": { "node": ">=6" } @@ -3807,6 +4346,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3816,6 +4356,7 @@ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, + "license": "MIT", "dependencies": { "strip-bom": "^4.0.0" }, @@ -3826,10 +4367,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/deferred-leveldown": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", + "integrity": "sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==", + "dev": true, + "license": "MIT", + "dependencies": { + "abstract-leveldown": "~0.12.1" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -3846,6 +4398,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -3861,12 +4414,14 @@ "node_modules/delaunator": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", - "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" + "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==", + "license": "ISC" }, "node_modules/delaunay-find": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/delaunay-find/-/delaunay-find-0.0.6.tgz", "integrity": "sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==", + "license": "ISC", "dependencies": { "delaunator": "^4.0.0" } @@ -3875,6 +4430,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -3883,14 +4439,27 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "node_modules/detect-gpu": { "version": "5.0.38", "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.38.tgz", "integrity": "sha512-36QeGHSXYcJ/RfrnPEScR8GDprbXFG4ZhXsfVNVHztZr38+fRxgHnJl3CjYXXjbeRUhu3ZZBJh6Lg0A9v0Qd8A==", + "license": "MIT", "dependencies": { "webgl-constants": "^1.1.1" } @@ -3899,6 +4468,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", "dependencies": { "dequal": "^2.0.0" }, @@ -3910,21 +4480,33 @@ "node_modules/dicom-parser": { "version": "1.8.21", "resolved": "https://registry.npmjs.org/dicom-parser/-/dicom-parser-1.8.21.tgz", - "integrity": "sha512-lYCweHQDsC8UFpXErPlg86Px2A8bay0HiUY+wzoG3xv5GzgqVHU3lziwSc/Gzn7VV7y2KeP072SzCviuOoU02w==" + "integrity": "sha512-lYCweHQDsC8UFpXErPlg86Px2A8bay0HiUY+wzoG3xv5GzgqVHU3lziwSc/Gzn7VV7y2KeP072SzCviuOoU02w==", + "license": "MIT" }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, + "license": "MIT" + }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -3934,6 +4516,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -3952,12 +4535,14 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -3972,6 +4557,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -3982,9 +4568,33 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.580", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.580.tgz", - "integrity": "sha512-T5q3pjQon853xxxHUq3ZP68ZpvJHuSMY2+BZaW3QzjS4HvNuvsMmZ/+lU+nCrftre1jFZ+OSlExynXWBihnXzw==" + "version": "1.4.827", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.827.tgz", + "integrity": "sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==", + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, + "license": "MIT" }, "node_modules/email-validator": { "version": "2.0.4", @@ -3998,12 +4608,14 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -4012,6 +4624,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -4019,10 +4632,24 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -4031,6 +4658,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -4042,6 +4670,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -4050,7 +4679,8 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esbuild": { "version": "0.21.5", @@ -4058,6 +4688,7 @@ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -4091,22 +4722,21 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, "node_modules/eslint-visitor-keys": { @@ -4114,6 +4744,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4126,6 +4757,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -4142,6 +4774,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -4155,15 +4788,28 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", @@ -4182,20 +4828,49 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" }, "node_modules/fbemitter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "license": "BSD-3-Clause", "dependencies": { "fbjs": "^3.0.0" } @@ -4204,6 +4879,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "license": "MIT", "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", @@ -4217,27 +4893,32 @@ "node_modules/fbjs-css-vars": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "license": "MIT" }, "node_modules/fetch-readablestream": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/fetch-readablestream/-/fetch-readablestream-0.2.0.tgz", - "integrity": "sha512-qu4mXWf4wus4idBIN/kVH+XSer8IZ9CwHP+Pd7DL7TuKNC1hP7ykon4kkBjwJF3EMX2WsFp4hH7gU7CyL7ucXw==" + "integrity": "sha512-qu4mXWf4wus4idBIN/kVH+XSer8IZ9CwHP+Pd7DL7TuKNC1hP7ykon4kkBjwJF3EMX2WsFp4hH7gU7CyL7ucXw==", + "license": "MIT" }, "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz", + "integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==", + "license": "MIT" }, "node_modules/file-saver": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", + "license": "MIT" }, "node_modules/file-selector": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "license": "MIT", "dependencies": { "tslib": "^2.4.0" }, @@ -4249,6 +4930,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -4261,6 +4943,7 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -4278,6 +4961,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -4293,6 +4977,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -4302,6 +4987,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -4314,6 +5000,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", + "license": "BSD-3-Clause", "dependencies": { "fbemitter": "^3.0.0", "fbjs": "^3.0.1" @@ -4326,6 +5013,7 @@ "version": "7.5.2", "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz", "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==", + "license": "MIT", "dependencies": { "tabbable": "^6.2.0" } @@ -4340,6 +5028,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -4350,11 +5039,12 @@ } }, "node_modules/force-graph": { - "version": "1.43.4", - "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.43.4.tgz", - "integrity": "sha512-xIKcxTpUN12tq8+2ptbWUV68qbCufprNyJEkONzR6R2rmD8E7GljLa5zWqgavXcSQ+GxQOJ21rV8SDQMBB3uGg==", + "version": "1.43.5", + "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.43.5.tgz", + "integrity": "sha512-HveLELh9yhZXO/QOfaFS38vlwJZ/3sKu+jarfXzRmbmihSOH/BbRWnUvmg8wLFiYy6h4HlH4lkRfZRccHYmXgA==", + "license": "MIT", "dependencies": { - "@tweenjs/tween.js": "18 - 21", + "@tweenjs/tween.js": "18 - 23", "accessor-fn": "1", "bezier-js": "3 - 6", "canvas-color-tracker": "1", @@ -4373,10 +5063,24 @@ "node": ">=12" } }, + "node_modules/force-graph/node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/force-graph/node_modules/d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -4385,6 +5089,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -4403,6 +5108,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -4414,11 +5120,19 @@ "node": ">=12" } }, + "node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "dev": true, + "license": "MIT" + }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" @@ -4427,16 +5141,11 @@ "node": ">=8.0.0" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4447,9 +5156,10 @@ } }, "node_modules/fp-ts": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.2.tgz", - "integrity": "sha512-CkqAjnIKFqvo3sCyoBTqgJvF+bHrSik584S9nhTjtBESLx26cbtVMR/T9a6ApChOcSDAaM3JydDmWDUn4EEXng==" + "version": "2.16.8", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.8.tgz", + "integrity": "sha512-nmDtNqmMZkOxu0M5hkrS9YA15/KPkYkILb6Axg9XBAoUoYEtzg+LFmVWqZrl9FNttsW0qIUpx9RCA9INbv+Bxw==", + "license": "MIT" }, "node_modules/fromentries": { "version": "1.3.2", @@ -4468,19 +5178,22 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" }, "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4493,14 +5206,45 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fwd-stream": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", + "integrity": "sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==", + "dev": true, + "dependencies": { + "readable-stream": "~1.0.26-4" + } + }, + "node_modules/fwd-stream/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/fwd-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -4510,6 +5254,7 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -4519,6 +5264,7 @@ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -4527,6 +5273,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -4546,6 +5293,7 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -4554,6 +5302,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "license": "MIT", "engines": { "node": ">=4" } @@ -4563,6 +5312,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -4573,12 +5323,15 @@ "node_modules/gl-matrix": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", - "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==", + "license": "MIT" }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4594,10 +5347,20 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "license": "MIT", "dependencies": { "define-properties": "^1.1.3" }, @@ -4612,6 +5375,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -4623,21 +5387,24 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/hammerjs": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/happy-dom": { - "version": "13.3.8", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-13.3.8.tgz", - "integrity": "sha512-RAbq4oYfJNkVan1m1F3jfA4YEyRY0/ASoNvZsNJbuX85jIypidmsz9jQZD7Tqz0VXA2MhAGfcsh5oshwmwNYSg==", + "version": "14.12.3", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-14.12.3.tgz", + "integrity": "sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.5.0", "webidl-conversions": "^7.0.0", @@ -4647,20 +5414,12 @@ "node": ">=16.0.0" } }, - "node_modules/happy-dom/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4669,6 +5428,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -4680,6 +5440,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4691,6 +5452,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4698,11 +5460,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, + "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" @@ -4714,22 +5502,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hasha/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -4737,10 +5514,23 @@ "node": ">= 0.4" } }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } @@ -4749,7 +5539,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/htmlparser2": { "version": "8.0.2", @@ -4762,6 +5553,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -4774,14 +5566,23 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=16.17.0" } }, + "node_modules/idb-wrapper": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", + "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==", + "dev": true, + "license": "MIT" + }, "node_modules/immer": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.3.tgz", - "integrity": "sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -4791,6 +5592,7 @@ "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4799,6 +5601,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4810,11 +5613,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -4824,6 +5637,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4832,14 +5646,23 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.1.tgz", "integrity": "sha512-Zu6THdrxQdyTuT2uA5FjUoBEsFHPzHcPIj18FszN6yXKHxSfGcR4TPLabfuT//E25q1Igyx9xta2WMvD/x9P/g==", + "license": "MIT", "engines": { "node": ">=12" } }, + "node_modules/indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", + "dev": true + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4848,12 +5671,14 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", "engines": { "node": ">=12" } @@ -4862,6 +5687,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -4870,21 +5696,36 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } }, + "node_modules/is": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", + "integrity": "sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4895,25 +5736,34 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/is-object": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", + "integrity": "sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==", + "dev": true + }, "node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4923,28 +5773,46 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isbuffer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", + "integrity": "sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -4954,6 +5822,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "append-transform": "^2.0.0" }, @@ -4962,27 +5831,20 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/istanbul-lib-processinfo": { @@ -4990,6 +5852,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, + "license": "ISC", "dependencies": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", @@ -5007,6 +5870,7 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -5016,6 +5880,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -5026,24 +5891,26 @@ } }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "istanbul-lib-coverage": "^3.0.0" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -5056,6 +5923,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.1.tgz", "integrity": "sha512-XTtedPYEyVp4t6hJrXuRKr/jHj8SC4z+4K0b396PMkov6muL+i8IIamJIvZWe3jUspgIJak0P+BaWKawMYNBLg==", + "license": "MIT", "engines": { "node": ">=12" } @@ -5063,18 +5931,21 @@ "node_modules/jpeg-lossless-decoder-js": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/jpeg-lossless-decoder-js/-/jpeg-lossless-decoder-js-2.0.7.tgz", - "integrity": "sha512-tbZlhFkKmx+JaqVMkq47SKWGuXLkIaV8fTbnhO39dYEnQrSShLGuLCGb0n6ntXjtmk6oAWGiIriWOLwj9od0yQ==" + "integrity": "sha512-tbZlhFkKmx+JaqVMkq47SKWGuXLkIaV8fTbnhO39dYEnQrSShLGuLCGb0n6ntXjtmk6oAWGiIriWOLwj9od0yQ==", + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -5087,6 +5958,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -5097,22 +5969,26 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" }, "node_modules/json2mq": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "license": "MIT", "dependencies": { "string-convert": "^0.2.0" } @@ -5121,6 +5997,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -5128,16 +6005,11 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, "node_modules/kapsule": { "version": "1.14.5", "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.14.5.tgz", "integrity": "sha512-H0iSpTynUzZw3tgraDmReprpFRmH5oP5GPmaNsurSwLx2H5iCpOMIkp5q+sfhB4Tz/UJd1E1IbEE9Z6ksnJ6RA==", + "license": "MIT", "dependencies": { "lodash-es": "4" }, @@ -5154,143 +6026,405 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/lefthook": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.6.1.tgz", - "integrity": "sha512-1T+tk0V6ubZgiZJGi39QlLMAcgEw+lhoDeSpT3L8Y/f8nUpJW9ntcMOmt+uvMfQ3TVjNcR1r/Lhtm7gTqgdcPg==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.7.2.tgz", + "integrity": "sha512-QCCq6KyVAVYBuxWf338TjMAjjGesyNRtfxJhjYV+kpUkd5ST2yr8ZUJrcEKe+0cUfziPOQ9Hz+1JZniXJx+JqA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "lefthook": "bin/index.js" }, "optionalDependencies": { - "lefthook-darwin-arm64": "1.6.1", - "lefthook-darwin-x64": "1.6.1", - "lefthook-freebsd-arm64": "1.6.1", - "lefthook-freebsd-x64": "1.6.1", - "lefthook-linux-arm64": "1.6.1", - "lefthook-linux-x64": "1.6.1", - "lefthook-windows-arm64": "1.6.1", - "lefthook-windows-x64": "1.6.1" + "lefthook-darwin-arm64": "1.7.2", + "lefthook-darwin-x64": "1.7.2", + "lefthook-freebsd-arm64": "1.7.2", + "lefthook-freebsd-x64": "1.7.2", + "lefthook-linux-arm64": "1.7.2", + "lefthook-linux-x64": "1.7.2", + "lefthook-windows-arm64": "1.7.2", + "lefthook-windows-x64": "1.7.2" } }, "node_modules/lefthook-darwin-arm64": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.6.1.tgz", - "integrity": "sha512-q6+sYr2Dpt6YnBGXRjMFcXZUnVB97nH+s7EP/tX8m9ewvQxLPqIiUPyAumfyJ2Siomkc5WgAinG+kT63VjUN3A==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.2.tgz", + "integrity": "sha512-E3Ouk04/yeD8IBLGJkyzL0NMYIrjADQvaDbf4yNSq6HWGnUC0R2KpYxrZno2yahZnvQ0vYTDta7Egw6cqcYGlQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" - ] + ], + "bin": { + "lefthook": "bin/lefthook" + } }, "node_modules/lefthook-darwin-x64": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.6.1.tgz", - "integrity": "sha512-utm7FwtbW8SxGMALIw5/iG4loYS2FI0crDKp/YIamrZgQr6M4pS2C3rxGj5OwiHFIm3arVU+3VZywdvRLJAw0w==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.2.tgz", + "integrity": "sha512-Am6ZNmjItQSqKbK8/spFIj5GDWNHJ47PM0vpT1PnBHrgWanjz0iLw6adwpMu8u7+CkZlHjp08lbvjBPGHIu3dg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" - ] + ], + "bin": { + "lefthook": "bin/lefthook" + } }, "node_modules/lefthook-freebsd-arm64": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.6.1.tgz", - "integrity": "sha512-F2BoDnGznkJyn6lyhmXpu62yq7SMCeHAl3Bl8c+P6mXfmatjjxEpVmrzRuzKMPd/MRGpy2B/glkuyO4wZZazow==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.2.tgz", + "integrity": "sha512-o1LBgHhwnUOLs9iVbi1GhvXMQlzYSKnyFcc061iADxHMJk1xWMD6RUyyohmLbfEU0gTWxkRfkdAFvbvwNqQiww==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" - ] + ], + "bin": { + "lefthook": "bin/lefthook" + } }, "node_modules/lefthook-freebsd-x64": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.6.1.tgz", - "integrity": "sha512-/NBjMUtnwvdc/p821sfPnZCbWZ6FQkAvnvjoaQu6tkajKZbZYSKsl7UtAicO0nT+79BQFt7TbaZjpua2T9tM5w==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.2.tgz", + "integrity": "sha512-vxB3FeeFYDfk4vAahaZdGJ7gbViGOkOyL5JRBDWlFjUfZJLGwVauf6GhtysdO1dgxs9K3ECdEtXgW+uOB872rQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "bin": { + "lefthook": "bin/lefthook" + } + }, + "node_modules/lefthook-linux-arm64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.2.tgz", + "integrity": "sha512-4dbVj5Jjy12flAyOcVWvWQ6gJoQ6X7HJ3qfsrM8/GIfLQBlkw+YRcLuWHUI3H9qsQFpkpYZsLcmUXoVM77z5mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "lefthook": "bin/lefthook" + } + }, + "node_modules/lefthook-linux-x64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.7.2.tgz", + "integrity": "sha512-lT0IRp1pGtbua8IWVeIVCSAxKex9fOyAexHaEmBZytfqr/94lpjzWWEQdLFQAlpZthuyCkuaJp5kLgMj6/IySQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "lefthook": "bin/lefthook" + } + }, + "node_modules/lefthook-windows-arm64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.2.tgz", + "integrity": "sha512-DxWLmcNI3NICd4rFqTPgXf+G/97ztl+ONvYuNE/ELAxVp338xAUFvzZCQvDZDzeTLrT1C4hZZ4zDvEhnOOECXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "bin": { + "lefthook": "bin/lefthook" + } + }, + "node_modules/lefthook-windows-x64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.2.tgz", + "integrity": "sha512-fL4F8/XXoYUJJ6GSYCwFL+bRufzbkeMSGYZKUDr6ZKOI4KafIEcgFNwlnQF03gY6vkUrYKksXQofOVlOfv3vPA==", "cpu": [ "x64" ], "dev": true, - "optional": true, - "os": [ - "freebsd" - ] + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "bin": { + "lefthook": "bin/lefthook" + } + }, + "node_modules/level-blobs": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", + "integrity": "sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==", + "dev": true, + "dependencies": { + "level-peek": "1.0.6", + "once": "^1.3.0", + "readable-stream": "^1.0.26-4" + } + }, + "node_modules/level-blobs/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/level-blobs/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/level-filesystem": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", + "integrity": "sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==", + "dev": true, + "dependencies": { + "concat-stream": "^1.4.4", + "errno": "^0.1.1", + "fwd-stream": "^1.0.4", + "level-blobs": "^0.1.7", + "level-peek": "^1.0.6", + "level-sublevel": "^5.2.0", + "octal": "^1.0.0", + "once": "^1.3.0", + "xtend": "^2.2.0" + } + }, + "node_modules/level-fix-range": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", + "integrity": "sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/level-hooks": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", + "integrity": "sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==", + "dev": true, + "dependencies": { + "string-range": "~1.2" + } + }, + "node_modules/level-js": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", + "integrity": "sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "abstract-leveldown": "~0.12.0", + "idb-wrapper": "^1.5.0", + "isbuffer": "~0.0.0", + "ltgt": "^2.1.2", + "typedarray-to-buffer": "~1.0.0", + "xtend": "~2.1.2" + } + }, + "node_modules/level-js/node_modules/object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", + "dev": true, + "license": "MIT" + }, + "node_modules/level-js/node_modules/typedarray-to-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", + "integrity": "sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/level-js/node_modules/xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", + "dev": true, + "dependencies": { + "object-keys": "~0.4.0" + }, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/level-peek": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", + "integrity": "sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "level-fix-range": "~1.0.2" + } + }, + "node_modules/level-sublevel": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", + "integrity": "sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "level-fix-range": "2.0", + "level-hooks": ">=4.4.0 <5", + "string-range": "~1.2.1", + "xtend": "~2.0.4" + } + }, + "node_modules/level-sublevel/node_modules/level-fix-range": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", + "integrity": "sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "~0.1.9" + } + }, + "node_modules/level-sublevel/node_modules/object-keys": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", + "integrity": "sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==", + "deprecated": "Please update to the latest object-keys", + "dev": true, + "license": "MIT", + "dependencies": { + "foreach": "~2.0.1", + "indexof": "~0.0.1", + "is": "~0.2.6" + } + }, + "node_modules/level-sublevel/node_modules/xtend": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", + "integrity": "sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==", + "dev": true, + "dependencies": { + "is-object": "~0.1.2", + "object-keys": "~0.2.0" + }, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/levelup": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", + "integrity": "sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "~0.8.1", + "deferred-leveldown": "~0.2.0", + "errno": "~0.1.1", + "prr": "~0.0.0", + "readable-stream": "~1.0.26", + "semver": "~2.3.1", + "xtend": "~3.0.0" + } + }, + "node_modules/levelup/node_modules/prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==", + "dev": true, + "license": "MIT" }, - "node_modules/lefthook-linux-arm64": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.6.1.tgz", - "integrity": "sha512-ke+2ni/bmxgYJSRsH+uIYYfTLj2It7WP+mcF4rfJHRbzn5yDYIjFgylUMC2CgW5urS4DSbxcRIbAqLY3OXAHnw==", - "cpu": [ - "arm64" - ], + "node_modules/levelup/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } }, - "node_modules/lefthook-linux-x64": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.6.1.tgz", - "integrity": "sha512-/HLkl9jt3XRjT0RPaLpAgUQmvp4zV/KKZ/8x6xslPl89krv3ZkHKKrqeaHdhiengq3hzx3N+KbOfFcxBRzdT6A==", - "cpu": [ - "x64" - ], + "node_modules/levelup/node_modules/semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "BSD", + "bin": { + "semver": "bin/semver" + } }, - "node_modules/lefthook-windows-arm64": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.6.1.tgz", - "integrity": "sha512-RyQ8S4/45BpJpRPy7KsOuJeXQ5FOa7MASoPtOYvrXt4A8kayCv1jlGs7MTv3XJbUosCJhfNpw3ReeHVGfw1KIw==", - "cpu": [ - "arm64" - ], + "node_modules/levelup/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT" }, - "node_modules/lefthook-windows-x64": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.6.1.tgz", - "integrity": "sha512-poYLk2tfg1Ncr4aZeFuhHjv1qH6f9hX3tV1FOK2MfWkXkRTYPl6MF5h/ONMIv71BsLjGbAA7LNXM5Mj4/B//lQ==", - "cpu": [ - "x64" - ], + "node_modules/levelup/node_modules/xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=0.4" + } }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/loader-utils": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -5304,6 +6438,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -5315,31 +6450,17 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz", "integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dev": true, - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -5350,48 +6471,57 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" }, "node_modules/lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==", + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.flow": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==", + "license": "MIT" }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -5400,10 +6530,11 @@ } }, "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.1" } @@ -5412,31 +6543,38 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, + "node_modules/ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", + "dev": true, + "license": "MIT" + }, "node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" } }, "node_modules/magicast": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.3.tgz", - "integrity": "sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", + "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "source-map-js": "^1.0.2" + "@babel/parser": "^7.24.4", + "@babel/types": "^7.24.0", + "source-map-js": "^1.2.0" } }, "node_modules/make-dir": { @@ -5444,6 +6582,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -5455,9 +6594,10 @@ } }, "node_modules/marked": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz", - "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.2.tgz", + "integrity": "sha512-J6CPjP8pS5sgrRqxVRvkCIkZ6MFdRIjDkwUwgJ9nL2fbmM6qGQeB2C16hi8Cc9BOzj6xXzy0jyi0iPIfnMHYzA==", + "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -5465,16 +6605,30 @@ "node": ">= 18" } }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/micromark": { "version": "4.0.0", @@ -5490,6 +6644,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -5511,9 +6666,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", "funding": [ { "type": "GitHub Sponsors", @@ -5524,6 +6679,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", @@ -5547,6 +6703,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", @@ -5563,9 +6720,10 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", @@ -5578,9 +6736,10 @@ } }, "node_modules/micromark-extension-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", @@ -5597,9 +6756,10 @@ } }, "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -5614,9 +6774,10 @@ } }, "node_modules/micromark-extension-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", - "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -5633,6 +6794,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, @@ -5642,9 +6804,10 @@ } }, "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", - "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -5671,6 +6834,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -5691,6 +6855,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -5712,6 +6877,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -5731,6 +6897,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -5752,6 +6919,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -5773,6 +6941,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -5792,6 +6961,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -5810,6 +6980,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -5830,6 +7001,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -5849,6 +7021,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -5866,7 +7039,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.0", @@ -5881,7 +7055,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.0", @@ -5897,6 +7072,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -5915,6 +7091,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" } @@ -5933,6 +7110,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", @@ -5940,9 +7118,9 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -5953,6 +7131,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -5973,7 +7152,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-types": { "version": "2.0.0", @@ -5988,12 +7168,35 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, + "license": "MIT" }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6002,6 +7205,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -6014,6 +7218,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6021,10 +7226,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true, + "license": "MIT" + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6036,6 +7256,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6043,32 +7264,23 @@ "node_modules/mitt": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==" - }, - "node_modules/mlly": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", - "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", - "dev": true, - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" - } + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "license": "MIT", "engines": { "node": ">=10" } @@ -6076,7 +7288,8 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.7", @@ -6088,6 +7301,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -6095,6 +7309,15 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/nifti-reader-js": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/nifti-reader-js/-/nifti-reader-js-0.6.8.tgz", + "integrity": "sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==", + "license": "MIT", + "dependencies": { + "fflate": "*" + } + }, "node_modules/niivue-react": { "resolved": "git+ssh://git@github.com/niivue/niivue-react.git#1efaf77310eac2d752a62f68824eef1808856421", "dependencies": { @@ -6110,6 +7333,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -6130,6 +7354,7 @@ "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, + "license": "MIT", "dependencies": { "process-on-spawn": "^1.0.0" }, @@ -6138,14 +7363,15 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "license": "MIT" }, "node_modules/npm": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.6.0.tgz", - "integrity": "sha512-KC70Su2ZnO9v4i2t+M0sQcsRERk++XcYbK9fy4bLWzUCV2nELhSN7UAkoe42P4HQTg2LyQxcfntgYS89OEaOsA==", + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.2.tgz", + "integrity": "sha512-x/AIjFIKRllrhcb48dqUNAAZl0ig9+qMuN91RpZo3Cb2+zuibfh+KISl6+kVVyktDz230JKc208UkQwwMqyB+w==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -6202,7 +7428,6 @@ "pacote", "parse-conflict-json", "proc-log", - "proggy", "qrcode-terminal", "read", "semver", @@ -6217,74 +7442,81 @@ "which", "write-file-atomic" ], + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^7.2.1", - "@npmcli/config": "^8.0.2", - "@npmcli/fs": "^3.1.0", + "@npmcli/arborist": "^7.5.4", + "@npmcli/config": "^8.3.4", + "@npmcli/fs": "^3.1.1", "@npmcli/map-workspaces": "^3.0.6", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.1", - "@npmcli/redact": "^1.1.0", - "@npmcli/run-script": "^8.0.0", - "@sigstore/tuf": "^2.3.2", + "@npmcli/package-json": "^5.2.0", + "@npmcli/promise-spawn": "^7.0.2", + "@npmcli/redact": "^2.0.1", + "@npmcli/run-script": "^8.1.0", + "@sigstore/tuf": "^2.3.4", "abbrev": "^2.0.0", "archy": "~1.0.0", - "cacache": "^18.0.2", + "cacache": "^18.0.3", "chalk": "^5.3.0", "ci-info": "^4.0.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^10.3.12", + "glob": "^10.4.2", "graceful-fs": "^4.2.11", - "hosted-git-info": "^7.0.1", - "ini": "^4.1.2", - "init-package-json": "^6.0.2", - "is-cidr": "^5.0.5", - "json-parse-even-better-errors": "^3.0.1", - "libnpmaccess": "^8.0.1", - "libnpmdiff": "^6.0.3", - "libnpmexec": "^7.0.4", - "libnpmfund": "^5.0.1", - "libnpmhook": "^10.0.0", - "libnpmorg": "^6.0.1", - "libnpmpack": "^6.0.3", - "libnpmpublish": "^9.0.2", - "libnpmsearch": "^7.0.0", - "libnpmteam": "^6.0.0", - "libnpmversion": "^5.0.1", - "make-fetch-happen": "^13.0.0", - "minimatch": "^9.0.4", - "minipass": "^7.0.4", + "hosted-git-info": "^7.0.2", + "ini": "^4.1.3", + "init-package-json": "^6.0.3", + "is-cidr": "^5.1.0", + "json-parse-even-better-errors": "^3.0.2", + "libnpmaccess": "^8.0.6", + "libnpmdiff": "^6.1.4", + "libnpmexec": "^8.1.3", + "libnpmfund": "^5.0.12", + "libnpmhook": "^10.0.5", + "libnpmorg": "^6.0.6", + "libnpmpack": "^7.0.4", + "libnpmpublish": "^9.0.9", + "libnpmsearch": "^7.0.6", + "libnpmteam": "^6.0.5", + "libnpmversion": "^6.0.3", + "make-fetch-happen": "^13.0.1", + "minimatch": "^9.0.5", + "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", "node-gyp": "^10.1.0", - "nopt": "^7.2.0", - "normalize-package-data": "^6.0.0", + "nopt": "^7.2.1", + "normalize-package-data": "^6.0.2", "npm-audit-report": "^5.0.0", "npm-install-checks": "^6.3.0", "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.0", - "npm-profile": "^9.0.1", - "npm-registry-fetch": "^16.2.1", - "npm-user-validate": "^2.0.0", + "npm-pick-manifest": "^9.1.0", + "npm-profile": "^10.0.0", + "npm-registry-fetch": "^17.1.0", + "npm-user-validate": "^2.0.1", "p-map": "^4.0.0", - "pacote": "^18.0.2", + "pacote": "^18.0.6", "parse-conflict-json": "^3.0.1", "proc-log": "^4.2.0", - "proggy": "^2.0.0", "qrcode-terminal": "^0.12.0", "read": "^3.0.1", - "semver": "^7.6.0", + "semver": "^7.6.2", "spdx-expression-parse": "^4.0.0", - "ssri": "^10.0.5", + "ssri": "^10.0.6", "supports-color": "^9.4.0", "tar": "^6.2.1", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", + "validate-npm-package-name": "^5.0.1", "which": "^4.0.0", "write-file-atomic": "^5.0.1" }, @@ -6297,10 +7529,11 @@ } }, "node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -6316,6 +7549,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6406,34 +7640,35 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.5.0", + "version": "7.5.4", "inBundle": true, "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.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.0", + "@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": "^1.1.0", - "@npmcli/run-script": "^8.0.0", - "bin-links": "^4.0.1", - "cacache": "^18.0.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.1", - "json-parse-even-better-errors": "^3.0.0", + "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.0.0", + "nopt": "^7.2.1", "npm-install-checks": "^6.2.0", "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.2.1", - "pacote": "^18.0.1", + "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", @@ -6441,7 +7676,7 @@ "promise-call-limit": "^3.0.1", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", - "ssri": "^10.0.5", + "ssri": "^10.0.6", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" }, @@ -6453,16 +7688,16 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.3.0", + "version": "8.3.4", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/package-json": "^5.1.1", "ci-info": "^4.0.0", "ini": "^4.1.2", - "nopt": "^7.0.0", + "nopt": "^7.2.1", "proc-log": "^4.2.0", - "read-package-json-fast": "^3.0.2", "semver": "^7.3.5", "walk-up-path": "^3.0.1" }, @@ -6471,7 +7706,7 @@ } }, "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.0", + "version": "3.1.1", "inBundle": true, "license": "ISC", "dependencies": { @@ -6482,11 +7717,12 @@ } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.6", + "version": "5.0.8", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^4.0.0", @@ -6529,7 +7765,7 @@ } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "7.1.0", + "version": "7.1.1", "inBundle": true, "license": "ISC", "dependencies": { @@ -6560,7 +7796,7 @@ } }, "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "5.1.0", + "version": "5.2.0", "inBundle": true, "license": "ISC", "dependencies": { @@ -6577,7 +7813,7 @@ } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.1", + "version": "7.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -6599,7 +7835,7 @@ } }, "node_modules/npm/node_modules/@npmcli/redact": { - "version": "1.1.0", + "version": "2.0.1", "inBundle": true, "license": "ISC", "engines": { @@ -6607,7 +7843,7 @@ } }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "8.0.0", + "version": "8.1.0", "inBundle": true, "license": "ISC", "dependencies": { @@ -6632,11 +7868,11 @@ } }, "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "2.3.1", + "version": "2.3.2", "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.1" + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -6651,7 +7887,7 @@ } }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.3.1", + "version": "0.3.2", "inBundle": true, "license": "Apache-2.0", "engines": { @@ -6659,39 +7895,41 @@ } }, "node_modules/npm/node_modules/@sigstore/sign": { - "version": "2.3.0", + "version": "2.3.2", "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.0", + "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.1", - "make-fetch-happen": "^13.0.0" + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "2.3.2", + "version": "2.3.4", "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.0", - "tuf-js": "^2.2.0" + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@sigstore/verify": { - "version": "1.2.0", + "version": "1.2.1", "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.1", + "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.1" + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -6706,12 +7944,12 @@ } }, "node_modules/npm/node_modules/@tufjs/models": { - "version": "2.0.0", + "version": "2.0.1", "inBundle": true, "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.3" + "minimatch": "^9.0.4" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -6783,7 +8021,7 @@ "license": "MIT" }, "node_modules/npm/node_modules/bin-links": { - "version": "4.0.3", + "version": "4.0.4", "inBundle": true, "license": "ISC", "dependencies": { @@ -6815,16 +8053,8 @@ "balanced-match": "^1.0.0" } }, - "node_modules/npm/node_modules/builtins": { - "version": "5.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, "node_modules/npm/node_modules/cacache": { - "version": "18.0.2", + "version": "18.0.3", "inBundle": true, "license": "ISC", "dependencies": { @@ -6879,7 +8109,7 @@ } }, "node_modules/npm/node_modules/cidr-regex": { - "version": "4.0.5", + "version": "4.1.1", "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -6910,7 +8140,7 @@ } }, "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.2", + "version": "6.0.3", "inBundle": true, "license": "ISC", "engines": { @@ -6977,7 +8207,7 @@ } }, "node_modules/npm/node_modules/debug": { - "version": "4.3.4", + "version": "4.3.5", "inBundle": true, "license": "MIT", "dependencies": { @@ -7051,7 +8281,7 @@ } }, "node_modules/npm/node_modules/foreground-child": { - "version": "3.1.1", + "version": "3.2.1", "inBundle": true, "license": "ISC", "dependencies": { @@ -7076,30 +8306,23 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/npm/node_modules/glob": { - "version": "10.3.12", + "version": "10.4.2", "inBundle": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "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" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -7110,19 +8333,8 @@ "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/hasown": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "7.0.1", + "version": "7.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -7150,7 +8362,7 @@ } }, "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.4", + "version": "7.0.5", "inBundle": true, "license": "MIT", "dependencies": { @@ -7174,7 +8386,7 @@ } }, "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.4", + "version": "6.0.5", "inBundle": true, "license": "ISC", "dependencies": { @@ -7201,7 +8413,7 @@ } }, "node_modules/npm/node_modules/ini": { - "version": "4.1.2", + "version": "4.1.3", "inBundle": true, "license": "ISC", "engines": { @@ -7209,7 +8421,7 @@ } }, "node_modules/npm/node_modules/init-package-json": { - "version": "6.0.2", + "version": "6.0.3", "inBundle": true, "license": "ISC", "dependencies": { @@ -7237,11 +8449,6 @@ "node": ">= 12" } }, - "node_modules/npm/node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "inBundle": true, - "license": "BSD-3-Clause" - }, "node_modules/npm/node_modules/ip-regex": { "version": "5.0.0", "inBundle": true, @@ -7254,27 +8461,16 @@ } }, "node_modules/npm/node_modules/is-cidr": { - "version": "5.0.5", + "version": "5.1.0", "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "cidr-regex": "^4.0.4" + "cidr-regex": "^4.1.1" }, "engines": { "node": ">=14" } }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.13.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/npm/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "inBundle": true, @@ -7294,7 +8490,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/jackspeak": { - "version": "2.3.6", + "version": "3.4.0", "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -7316,7 +8512,7 @@ "license": "MIT" }, "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", + "version": "3.0.2", "inBundle": true, "license": "MIT", "engines": { @@ -7350,29 +8546,29 @@ "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.4", + "version": "8.0.6", "inBundle": true, "license": "ISC", "dependencies": { "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^16.2.1" + "npm-registry-fetch": "^17.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.1.0", + "version": "6.1.4", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.2.1", + "@npmcli/arborist": "^7.5.4", "@npmcli/installed-package-contents": "^2.1.0", "binary-extensions": "^2.3.0", "diff": "^5.1.0", "minimatch": "^9.0.4", "npm-package-arg": "^11.0.2", - "pacote": "^18.0.1", + "pacote": "^18.0.6", "tar": "^6.2.1" }, "engines": { @@ -7380,15 +8576,15 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "8.0.0", + "version": "8.1.3", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/run-script": "^8.0.0", + "@npmcli/arborist": "^7.5.4", + "@npmcli/run-script": "^8.1.0", "ci-info": "^4.0.0", "npm-package-arg": "^11.0.2", - "pacote": "^18.0.1", + "pacote": "^18.0.6", "proc-log": "^4.2.0", "read": "^3.0.1", "read-package-json-fast": "^3.0.2", @@ -7400,103 +8596,103 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.8", + "version": "5.0.12", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.2.1" + "@npmcli/arborist": "^7.5.4" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.3", + "version": "10.0.5", "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^16.2.1" + "npm-registry-fetch": "^17.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.4", + "version": "6.0.6", "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^16.2.1" + "npm-registry-fetch": "^17.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "7.0.0", + "version": "7.0.4", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/run-script": "^8.0.0", + "@npmcli/arborist": "^7.5.4", + "@npmcli/run-script": "^8.1.0", "npm-package-arg": "^11.0.2", - "pacote": "^18.0.1" + "pacote": "^18.0.6" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.6", + "version": "9.0.9", "inBundle": true, "license": "ISC", "dependencies": { "ci-info": "^4.0.0", - "normalize-package-data": "^6.0.0", + "normalize-package-data": "^6.0.1", "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^16.2.1", + "npm-registry-fetch": "^17.0.1", "proc-log": "^4.2.0", "semver": "^7.3.7", "sigstore": "^2.2.0", - "ssri": "^10.0.5" + "ssri": "^10.0.6" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.3", + "version": "7.0.6", "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^16.2.1" + "npm-registry-fetch": "^17.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.3", + "version": "6.0.5", "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^16.2.1" + "npm-registry-fetch": "^17.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "6.0.0", + "version": "6.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.6", - "@npmcli/run-script": "^8.0.0", - "json-parse-even-better-errors": "^3.0.0", + "@npmcli/git": "^5.0.7", + "@npmcli/run-script": "^8.1.0", + "json-parse-even-better-errors": "^3.0.2", "proc-log": "^4.2.0", "semver": "^7.3.7" }, @@ -7505,7 +8701,7 @@ } }, "node_modules/npm/node_modules/lru-cache": { - "version": "10.2.0", + "version": "10.2.2", "inBundle": true, "license": "ISC", "engines": { @@ -7513,7 +8709,7 @@ } }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "13.0.0", + "version": "13.0.1", "inBundle": true, "license": "ISC", "dependencies": { @@ -7526,6 +8722,7 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", + "proc-log": "^4.2.0", "promise-retry": "^2.0.1", "ssri": "^10.0.0" }, @@ -7534,7 +8731,7 @@ } }, "node_modules/npm/node_modules/minimatch": { - "version": "9.0.4", + "version": "9.0.5", "inBundle": true, "license": "ISC", "dependencies": { @@ -7548,7 +8745,7 @@ } }, "node_modules/npm/node_modules/minipass": { - "version": "7.0.4", + "version": "7.1.2", "inBundle": true, "license": "ISC", "engines": { @@ -7567,7 +8764,7 @@ } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.4", + "version": "3.0.5", "inBundle": true, "license": "MIT", "dependencies": { @@ -7604,26 +8801,6 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/minipass-pipeline": { "version": "1.2.4", "inBundle": true, @@ -7755,7 +8932,7 @@ } }, "node_modules/npm/node_modules/nopt": { - "version": "7.2.0", + "version": "7.2.1", "inBundle": true, "license": "ISC", "dependencies": { @@ -7769,12 +8946,11 @@ } }, "node_modules/npm/node_modules/normalize-package-data": { - "version": "6.0.0", + "version": "6.0.2", "inBundle": true, "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, @@ -7791,7 +8967,7 @@ } }, "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.0", + "version": "3.0.1", "inBundle": true, "license": "ISC", "dependencies": { @@ -7846,7 +9022,7 @@ } }, "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "9.0.0", + "version": "9.1.0", "inBundle": true, "license": "ISC", "dependencies": { @@ -7860,27 +9036,27 @@ } }, "node_modules/npm/node_modules/npm-profile": { - "version": "9.0.1", + "version": "10.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^16.0.0", + "npm-registry-fetch": "^17.0.1", "proc-log": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=18.0.0" } }, "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "16.2.1", + "version": "17.1.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/redact": "^1.1.0", + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", "proc-log": "^4.0.0" @@ -7890,7 +9066,7 @@ } }, "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.0", + "version": "2.0.1", "inBundle": true, "license": "BSD-2-Clause", "engines": { @@ -7911,8 +9087,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm/node_modules/package-json-from-dist": { + "version": "1.0.0", + "inBundle": true, + "license": "BlueOak-1.0.0" + }, "node_modules/npm/node_modules/pacote": { - "version": "18.0.2", + "version": "18.0.6", "inBundle": true, "license": "ISC", "dependencies": { @@ -7927,7 +9108,7 @@ "npm-package-arg": "^11.0.0", "npm-packlist": "^8.0.0", "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.0.0", + "npm-registry-fetch": "^17.0.0", "proc-log": "^4.0.0", "promise-retry": "^2.0.1", "sigstore": "^2.2.0", @@ -7935,7 +9116,7 @@ "tar": "^6.1.11" }, "bin": { - "pacote": "lib/bin.js" + "pacote": "bin/index.js" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -7963,7 +9144,7 @@ } }, "node_modules/npm/node_modules/path-scurry": { - "version": "1.10.2", + "version": "1.11.1", "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -7971,14 +9152,14 @@ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.16", + "version": "6.1.0", "inBundle": true, "license": "MIT", "dependencies": { @@ -8039,7 +9220,7 @@ } }, "node_modules/npm/node_modules/promzard": { - "version": "1.0.1", + "version": "1.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -8102,12 +9283,9 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.6.0", + "version": "7.6.2", "inBundle": true, "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -8115,17 +9293,6 @@ "node": ">=10" } }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm/node_modules/shebang-command": { "version": "2.0.0", "inBundle": true, @@ -8157,16 +9324,16 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "2.3.0", + "version": "2.3.1", "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.1", + "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.1", - "@sigstore/sign": "^2.3.0", - "@sigstore/tuf": "^2.3.1", - "@sigstore/verify": "^1.2.0" + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -8195,13 +9362,13 @@ } }, "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.3", + "version": "8.0.4", "inBundle": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" @@ -8240,12 +9407,17 @@ } }, "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.17", + "version": "3.0.18", "inBundle": true, "license": "CC0-1.0" }, + "node_modules/npm/node_modules/sprintf-js": { + "version": "1.1.3", + "inBundle": true, + "license": "BSD-3-Clause" + }, "node_modules/npm/node_modules/ssri": { - "version": "10.0.5", + "version": "10.0.6", "inBundle": true, "license": "ISC", "dependencies": { @@ -8381,13 +9553,13 @@ } }, "node_modules/npm/node_modules/tuf-js": { - "version": "2.2.0", + "version": "2.2.1", "inBundle": true, "license": "MIT", "dependencies": { - "@tufjs/models": "2.0.0", + "@tufjs/models": "2.0.1", "debug": "^4.3.4", - "make-fetch-happen": "^13.0.0" + "make-fetch-happen": "^13.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -8439,12 +9611,9 @@ } }, "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.0", + "version": "5.0.1", "inBundle": true, "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -8587,10 +9756,11 @@ "license": "ISC" }, "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.0.0.tgz", + "integrity": "sha512-ISp44nqNCaPugLLGGfknzQwSwt10SSS5IMoPR7GLoMAyS18Iw5js8U7ga2VF9lYuMZ42gOHr3UddZw4WZltxKg==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", @@ -8604,7 +9774,7 @@ "glob": "^7.1.6", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^6.0.2", "istanbul-lib-processinfo": "^2.0.2", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", @@ -8624,7 +9794,22 @@ "nyc": "bin/nyc.js" }, "engines": { - "node": ">=8.9" + "node": ">=18" + } + }, + "node_modules/nyc/node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/nyc/node_modules/make-dir": { @@ -8632,6 +9817,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -8642,34 +9828,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/nyc/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8678,14 +9851,23 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, + "node_modules/octal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", + "integrity": "sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==", + "dev": true, + "license": "MIT" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -8695,6 +9877,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -8710,6 +9893,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -8725,6 +9909,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -8737,6 +9922,7 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -8749,6 +9935,7 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -8758,6 +9945,7 @@ "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, + "license": "ISC", "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", @@ -8771,12 +9959,14 @@ "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -8784,10 +9974,29 @@ "node": ">=6" } }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "dev": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -8804,13 +10013,15 @@ "node_modules/parse-srcset": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", - "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", + "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8819,6 +10030,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8828,6 +10040,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8835,12 +10048,14 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } @@ -8849,27 +10064,48 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 14.16" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "license": "ISC" }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -8877,70 +10113,48 @@ "node": ">=8" } }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, "node_modules/platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "license": "MIT" }, "node_modules/playwright": { - "version": "1.41.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.41.2.tgz", - "integrity": "sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==", + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.1.tgz", + "integrity": "sha512-Hjrgae4kpSQBr98nhCj3IScxVeVUixqj+5oyif8TdIn2opTCPEzqAqNMeK42i3cWDCVu9MI+ZsGWw+gVR4ISBg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.41.2" + "playwright-core": "1.45.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.41.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.41.2.tgz", - "integrity": "sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==", + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.1.tgz", + "integrity": "sha512-LF4CUUtrUu2TCpDw4mcrAIuYrEjVDfT1cHbJMfwnE2+1b8PZcFzPNgvZCvq2JfQ4aTjRCCHw5EJ2tmr2NSzdPg==", "dev": true, + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=16" - } - }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=18" } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "funding": [ { "type": "opencollective", @@ -8955,51 +10169,21 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, "node_modules/preval.macro": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/preval.macro/-/preval.macro-5.0.0.tgz", "integrity": "sha512-+OZRqZYx1pjZ7H5Jis8bPFXkiT7lwA46UzAT4IjuzFVKwkJK+TwIx1TCqrqNCf8U3e5O12mEJEz1BXslkCLWfQ==", + "license": "MIT", "dependencies": { "babel-plugin-preval": "^5.0.0" }, @@ -9007,11 +10191,26 @@ "node": ">=10" } }, + "node_modules/process-es6": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/process-es6/-/process-es6-0.11.6.tgz", + "integrity": "sha512-GYBRQtL4v3wgigq10Pv58jmTbFXlIiTbSfgnNqZLY0ldUPqy1rRxDI5fCjoCpnM6TqmHQI8ydzTBXW86OYc0gA==", + "dev": true, + "license": "MIT" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, + "license": "MIT", "dependencies": { "fromentries": "^1.2.0" }, @@ -9023,6 +10222,7 @@ "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "license": "MIT", "dependencies": { "asap": "~2.0.3" } @@ -9031,6 +10231,7 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -9040,12 +10241,43 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -9053,12 +10285,14 @@ "node_modules/pure-color": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==", + "license": "MIT" }, "node_modules/query-string": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.0.0.tgz", "integrity": "sha512-4EWwcRGsO2H+yzq6ddHcVqkCQ2EFUSfDMEjF8ryp8ReymyZhIuaFRGLomeOQLkrzacMHoyky2HW0Qe30UbzkKw==", + "license": "MIT", "dependencies": { "decode-uri-component": "^0.4.1", "filter-obj": "^5.1.0", @@ -9071,10 +10305,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, "node_modules/rc-cascader": { "version": "3.27.0", "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.27.0.tgz", "integrity": "sha512-z5uq8VvQadFUBiuZJ7YF5UAUGNkZtdEtcEYiIA94N/Kc2MIKr6lEbN5HyVddvYSgwWlKqnL6pH5bFXFuIK3MNg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "array-tree-filter": "^2.1.0", @@ -9092,6 +10348,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.3.0.tgz", "integrity": "sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.3.2", @@ -9106,6 +10363,7 @@ "version": "3.7.3", "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.3.tgz", "integrity": "sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -9121,6 +10379,7 @@ "version": "9.5.2", "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.5.2.tgz", "integrity": "sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/portal": "^1.0.0-8", @@ -9137,6 +10396,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.2.0.tgz", "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", "@rc-component/portal": "^1.1.1", @@ -9149,10 +10409,23 @@ "react-dom": ">=16.9.0" } }, + "node_modules/rc-drawer/node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/rc-dropdown": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.0.tgz", "integrity": "sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@rc-component/trigger": "^2.0.0", @@ -9168,6 +10441,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.2.1.tgz", "integrity": "sha512-uoNqDoR7A4tn4QTSqoWPAzrR7ZwOK5I+vuZ/qdcHtbKx+ZjEsTg7QXm2wk/jalDiSksAQmATxL0T5LJkRREdIA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", "@rc-component/async-validator": "^5.0.3", @@ -9185,6 +10459,7 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.9.0.tgz", "integrity": "sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", "@rc-component/portal": "^1.0.2", @@ -9202,6 +10477,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.5.1.tgz", "integrity": "sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -9216,6 +10492,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.1.0.tgz", "integrity": "sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/mini-decimal": "^1.0.1", @@ -9232,6 +10509,7 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.14.0.tgz", "integrity": "sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.22.5", "@rc-component/trigger": "^2.0.0", @@ -9250,6 +10528,7 @@ "version": "9.14.1", "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.14.1.tgz", "integrity": "sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/trigger": "^2.0.0", @@ -9267,6 +10546,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.2.tgz", "integrity": "sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -9281,6 +10561,7 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.0.tgz", "integrity": "sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -9299,6 +10580,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -9314,6 +10596,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-4.2.0.tgz", "integrity": "sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.3.2", @@ -9325,9 +10608,10 @@ } }, "node_modules/rc-picker": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.6.tgz", - "integrity": "sha512-sEWARCNlodubP7/IM6nXHDDIuKZ3gYd5CpS2cYcNORa2telX3nAfllqnGSGjGEFvdtyW+IqGAVatLOmFT0lKYg==", + "version": "4.6.9", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.9.tgz", + "integrity": "sha512-kwQq5xDNJ1VcX7pauLlVBiuQorpZGUwA/YczVJTO1e33YsTyDuVjaQkYAiAupXbEPUBCU3doGZo0J25HGq2ZOQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", "@rc-component/trigger": "^2.0.0", @@ -9362,10 +10646,23 @@ } } }, + "node_modules/rc-picker/node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/rc-progress": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.6", @@ -9380,6 +10677,7 @@ "version": "2.13.0", "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.0.tgz", "integrity": "sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -9397,6 +10695,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.7", "classnames": "^2.2.1", @@ -9412,6 +10711,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.3.0.tgz", "integrity": "sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -9427,6 +10727,7 @@ "version": "14.15.0", "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.15.0.tgz", "integrity": "sha512-BDqnDLhhm/8VyyyDlX7ju06S75k6ObJvbsN86zqZ4SY1Fu2ANQxeSWPo7pnwx5nwA5JgG+HcQevtddAgsdeBVQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/trigger": "^2.1.1", @@ -9448,6 +10749,7 @@ "version": "10.6.2", "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.6.2.tgz", "integrity": "sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -9465,6 +10767,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.16.7", "classnames": "^2.2.3", @@ -9482,6 +10785,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.21.0", "classnames": "^2.2.1", @@ -9496,6 +10800,7 @@ "version": "7.45.7", "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.45.7.tgz", "integrity": "sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/context": "^1.4.0", @@ -9516,6 +10821,7 @@ "version": "15.1.1", "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.1.1.tgz", "integrity": "sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", "classnames": "2.x", @@ -9537,6 +10843,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.7.0.tgz", "integrity": "sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", @@ -9553,6 +10860,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.0.tgz", "integrity": "sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", "@rc-component/trigger": "^2.0.0", @@ -9567,6 +10875,7 @@ "version": "5.8.8", "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.8.tgz", "integrity": "sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -9586,6 +10895,7 @@ "version": "5.22.1", "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.22.1.tgz", "integrity": "sha512-b8mAK52xEpRgS+b2PTapCt29GoIrO5cO8jB7AfHttFsIJfcnynY9FCtnYzURsKXJkGHbFY6UzSEB2I3TETtdWg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -9599,9 +10909,10 @@ } }, "node_modules/rc-upload": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.5.2.tgz", - "integrity": "sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.6.0.tgz", + "integrity": "sha512-Zr0DT1NHw/ApxrP7UAoxOtGaVYuzarrrCVr0ld7RiEFsKX07uFhE1EpCBxwL11ruFn89GMcshOKWp+s6FLyAlA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "classnames": "^2.2.5", @@ -9616,6 +10927,7 @@ "version": "5.43.0", "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.43.0.tgz", "integrity": "sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "react-is": "^18.2.0" @@ -9626,14 +10938,16 @@ } }, "node_modules/rc-util/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" }, "node_modules/rc-virtual-list": { "version": "3.14.5", "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.14.5.tgz", "integrity": "sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", "classnames": "^2.2.6", @@ -9652,6 +10966,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -9663,6 +10978,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/react-activity/-/react-activity-2.1.3.tgz", "integrity": "sha512-BdZuwZ4frK+tkjjERtzT0HxbHUN5/hIe9BBL9Ac/kgVOJ0bXjJpz417cQ7XxGSA27I+fsHCNRrFQ1cux61vHDQ==", + "license": "MIT", "peerDependencies": { "react": ">= 15.0.0", "react-dom": ">= 15.0.0" @@ -9672,6 +10988,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", + "license": "MIT", "dependencies": { "base16": "^1.0.0", "lodash.curry": "^4.0.1", @@ -9683,6 +11000,7 @@ "version": "6.3.2", "resolved": "https://registry.npmjs.org/react-bootstrap-typeahead/-/react-bootstrap-typeahead-6.3.2.tgz", "integrity": "sha512-N5Mb0WlSSMcD7Z0pcCypILgIuECybev0hl4lsnCa5lbXTnN4QdkuHLGuTLSlXBwm1ZMFpOc2SnsdSRgeFiF+Ow==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.14.6", "@popperjs/core": "^2.10.2", @@ -9709,6 +11027,7 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.1.4.tgz", "integrity": "sha512-wDxxa/HYaSXSMlyWJvJ5uZTzIVtQTPf1gMksFgwAz/2/W3lCtY8r4OChCXMPE7wax0PAdMY97UkNJedGv7KnDw==", + "license": "MIT", "dependencies": { "@types/hoist-non-react-statics": "^3.3.5", "hoist-non-react-statics": "^3.3.2", @@ -9722,6 +11041,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -9734,6 +11054,7 @@ "version": "14.2.3", "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", + "license": "MIT", "dependencies": { "attr-accept": "^2.2.2", "file-selector": "^0.6.0", @@ -9750,6 +11071,7 @@ "version": "4.0.13", "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz", "integrity": "sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -9760,12 +11082,14 @@ "node_modules/react-fast-compare": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" }, "node_modules/react-force-graph-2d": { - "version": "1.25.3", - "resolved": "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.25.3.tgz", - "integrity": "sha512-BFgZ8Mbq03fEO3Xss9hi1LAReu0LatEVpqJlrm9023p6rJMaUIrGWfVPQUx7ObjMfVBfuq0JXvCcCEpo+FmO1Q==", + "version": "1.25.5", + "resolved": "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.25.5.tgz", + "integrity": "sha512-3u8WjZZorpwZSDs3n3QeOS9ZoxFPM+IR9SStYJVQ/qKECydMHarxnf7ynV/MKJbC6kUsc60soD0V+Uq/r2vz7Q==", + "license": "MIT", "dependencies": { "force-graph": "1", "prop-types": "15", @@ -9781,12 +11105,14 @@ "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/react-json-view": { "version": "1.21.3", "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "license": "MIT", "dependencies": { "flux": "^4.0.1", "react-base16-styling": "^0.6.0", @@ -9802,6 +11128,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.4.0.tgz", "integrity": "sha512-w4Yv9CgWdj8kWGQEPNWFGJJ08dYEZHZpiaFR/DgZjCMBNqv9wus2Gy1qvHVJmJbzvAZbq6jdvFC+NYzEqAlNhQ==", + "license": "MIT", "dependencies": { "fromentries": "^1.3.2", "jerrypick": "^1.1.1" @@ -9817,6 +11144,7 @@ "version": "4.5.3", "resolved": "https://registry.npmjs.org/react-lazylog/-/react-lazylog-4.5.3.tgz", "integrity": "sha512-lyov32A/4BqihgXgtNXTHCajXSXkYHPlIEmV8RbYjHIMxCFSnmtdg4kDCI3vATz7dURtiFTvrw5yonHnrS+NNg==", + "license": "MPL-2.0", "dependencies": { "@mattiasbuelens/web-streams-polyfill": "^0.2.0", "fetch-readablestream": "^0.2.0", @@ -9835,12 +11163,14 @@ "node_modules/react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" }, "node_modules/react-overlays": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.8", "@popperjs/core": "^2.11.6", @@ -9860,6 +11190,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "license": "MIT", "dependencies": { "react-fast-compare": "^3.0.1", "warning": "^4.0.2" @@ -9871,9 +11202,10 @@ } }, "node_modules/react-redux": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz", - "integrity": "sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", + "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" @@ -9881,27 +11213,24 @@ "peerDependencies": { "@types/react": "^18.2.25", "react": "^18.0", - "react-native": ">=0.69", "redux": "^5.0.0" }, "peerDependenciesMeta": { "@types/react": { "optional": true }, - "react-native": { - "optional": true - }, "redux": { "optional": true } } }, "node_modules/react-router": { - "version": "6.24.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.0.tgz", - "integrity": "sha512-sQrgJ5bXk7vbcC4BxQxeNa5UmboFm35we1AFK0VvQaz9g0LzxEIuLOhHIoZ8rnu9BO21ishGeL9no1WB76W/eg==", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.1.tgz", + "integrity": "sha512-PTXFXGK2pyXpHzVo3rR9H7ip4lSPZZc0bHG5CARmj65fTT6qG7sTngmb6lcYu1gf3y/8KxORoy9yn59pGpCnpg==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.17.0" + "@remix-run/router": "1.17.1" }, "engines": { "node": ">=14.0.0" @@ -9911,12 +11240,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.24.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.0.tgz", - "integrity": "sha512-960sKuau6/yEwS8e+NVEidYQb1hNjAYM327gjEyXlc6r3Skf2vtwuJ2l7lssdegD2YjoKG5l8MsVyeTDlVeY8g==", + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.1.tgz", + "integrity": "sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.17.0", - "react-router": "6.24.0" + "@remix-run/router": "1.17.1", + "react-router": "6.24.1" }, "engines": { "node": ">=14.0.0" @@ -9930,6 +11260,7 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/react-string-replace/-/react-string-replace-0.4.4.tgz", "integrity": "sha512-FAMkhxmDpCsGTwTZg7p/2v+/GTmxAp73so3fbSvlAcBBX36ujiGRNEaM/1u+jiYQrArhns+7eE92g2pi5E5FUA==", + "license": "MIT", "dependencies": { "lodash": "^4.17.4" }, @@ -9941,6 +11272,7 @@ "version": "8.5.3", "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz", "integrity": "sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", @@ -9957,6 +11289,7 @@ "version": "9.22.5", "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.5.tgz", "integrity": "sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.7.2", "clsx": "^1.0.4", @@ -9974,6 +11307,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9997,7 +11331,8 @@ "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" }, "node_modules/redux-devtools-extension": { "version": "2.13.9", @@ -10005,6 +11340,7 @@ "integrity": "sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A==", "deprecated": "Package moved to @redux-devtools/extension.", "dev": true, + "license": "MIT", "peerDependencies": { "redux": "^3.1.0 || ^4.0.0" } @@ -10014,6 +11350,7 @@ "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", "integrity": "sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==", "dev": true, + "license": "MIT", "dependencies": { "deep-diff": "^0.3.5" } @@ -10022,20 +11359,23 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.3.0.tgz", "integrity": "sha512-J9RvCeAZXSTAibFY0kGw6Iy4EdyDNW7k6Q+liwX+bsck7QVsU78zz8vpBRweEfANxnnlG/xGGeOvf6r8UXzNJQ==", + "license": "MIT", "dependencies": { "@redux-saga/core": "^1.3.0" } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, + "license": "ISC", "dependencies": { "es6-error": "^4.0.1" }, @@ -10048,6 +11388,7 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10056,6 +11397,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10064,17 +11406,20 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -10088,18 +11433,22 @@ } }, "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -10110,11 +11459,23 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, "node_modules/rollup": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", - "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", + "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.5" }, @@ -10126,33 +11487,49 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.2", - "@rollup/rollup-android-arm64": "4.13.2", - "@rollup/rollup-darwin-arm64": "4.13.2", - "@rollup/rollup-darwin-x64": "4.13.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", - "@rollup/rollup-linux-arm64-gnu": "4.13.2", - "@rollup/rollup-linux-arm64-musl": "4.13.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", - "@rollup/rollup-linux-riscv64-gnu": "4.13.2", - "@rollup/rollup-linux-s390x-gnu": "4.13.2", - "@rollup/rollup-linux-x64-gnu": "4.13.2", - "@rollup/rollup-linux-x64-musl": "4.13.2", - "@rollup/rollup-win32-arm64-msvc": "4.13.2", - "@rollup/rollup-win32-ia32-msvc": "4.13.2", - "@rollup/rollup-win32-x64-msvc": "4.13.2", + "@rollup/rollup-android-arm-eabi": "4.18.1", + "@rollup/rollup-android-arm64": "4.18.1", + "@rollup/rollup-darwin-arm64": "4.18.1", + "@rollup/rollup-darwin-x64": "4.18.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", + "@rollup/rollup-linux-arm-musleabihf": "4.18.1", + "@rollup/rollup-linux-arm64-gnu": "4.18.1", + "@rollup/rollup-linux-arm64-musl": "4.18.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", + "@rollup/rollup-linux-riscv64-gnu": "4.18.1", + "@rollup/rollup-linux-s390x-gnu": "4.18.1", + "@rollup/rollup-linux-x64-gnu": "4.18.1", + "@rollup/rollup-linux-x64-musl": "4.18.1", + "@rollup/rollup-win32-arm64-msvc": "4.18.1", + "@rollup/rollup-win32-ia32-msvc": "4.18.1", + "@rollup/rollup-win32-x64-msvc": "4.18.1", "fsevents": "~2.3.2" } }, + "node_modules/rollup-plugin-node-builtins": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz", + "integrity": "sha512-bxdnJw8jIivr2yEyt8IZSGqZkygIJOGAWypXvHXnwKAbUcN4Q/dGTx7K0oAJryC/m6aq6tKutltSeXtuogU6sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "browserify-fs": "^1.0.0", + "buffer-es6": "^4.9.2", + "crypto-browserify": "^3.11.0", + "process-es6": "^0.11.2" + } + }, "node_modules/rusha": { "version": "0.8.14", "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.14.tgz", - "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==" + "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==", + "license": "MIT" }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } @@ -10161,6 +11538,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "license": "MIT", "dependencies": { "mri": "^1.1.0" }, @@ -10185,12 +11563,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/sanitize-html": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.13.0.tgz", "integrity": "sha512-Xff91Z+4Mz5QiNSLdLWwjgBDm5b1RU6xBT0+12rapjiaR7SwfRdjw8f+6Rir2MXKLrDicRFHdb51hGOAxmsUIA==", + "license": "MIT", "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", @@ -10200,10 +11580,23 @@ "postcss": "^8.3.11" } }, + "node_modules/sanitize-html/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } @@ -10212,6 +11605,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -10229,6 +11623,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", "dependencies": { "compute-scroll-into-view": "^3.0.2" } @@ -10236,24 +11631,24 @@ "node_modules/seedrandom": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "license": "MIT" }, "node_modules/semiver": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -10261,39 +11656,38 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } }, "node_modules/shader-loader": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/shader-loader/-/shader-loader-1.3.1.tgz", "integrity": "sha512-dt8F9K0x4rjmaFyHh7rNDfpt4LUiR64zhNIEwp2WbE99B3z4ALuvvmhftkElg93dUD6sTmv/aXa/z9SJiEddcA==", + "license": "MIT", "dependencies": { "loader-utils": "^1.1.0" } @@ -10303,6 +11697,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -10315,6 +11710,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -10323,6 +11719,7 @@ "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -10338,33 +11735,31 @@ "node_modules/shlex": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/shlex/-/shlex-2.1.2.tgz", - "integrity": "sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==" + "integrity": "sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==", + "license": "MIT" }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "ISC" }, "node_modules/sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", "totalist": "^3.0.0" }, "engines": { @@ -10375,6 +11770,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-2.0.2.tgz", "integrity": "sha512-OtSJDwxsF1NWHc7ps3Sa0s+dPtP15iQNJzfKVz+MxkEo3z72mCD+yu30ct79rPr0CaV1HXSOBp+MIY5uIhHZ1A==", + "license": "MIT", "dependencies": { "console-clear": "^1.1.0", "get-port": "^3.2.0", @@ -10397,6 +11793,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -10405,6 +11802,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -10412,13 +11810,15 @@ "node_modules/spark-md5": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", - "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==" + "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==", + "license": "(WTFPL OR MIT)" }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", @@ -10436,6 +11836,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -10451,20 +11852,16 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/spawn-wrap/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/split-on-first": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -10475,24 +11872,28 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/std-env": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "license": "MIT", "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" @@ -10502,6 +11903,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -10509,13 +11911,22 @@ "node_modules/string-convert": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", + "license": "MIT" + }, + "node_modules/string-range": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", + "integrity": "sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==", + "dev": true, + "license": "MIT" }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10530,6 +11941,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10542,6 +11954,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -10551,6 +11964,7 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -10559,27 +11973,37 @@ } }, "node_modules/strip-literal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", - "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^8.10.0" + "js-tokens": "^9.0.0" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", + "dev": true, + "license": "MIT" + }, "node_modules/stylis": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "license": "MIT" }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10591,6 +12015,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10601,13 +12026,15 @@ "node_modules/tabbable": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -10626,43 +12053,59 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", "engines": { "node": ">=12.22" } }, "node_modules/tinybench": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", - "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", - "dev": true + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", + "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", + "dev": true, + "license": "MIT" }, "node_modules/tinycolor2": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" }, "node_modules/tinydate": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tinypool": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz", - "integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", + "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/tinyspy": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", - "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", + "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -10671,6 +12114,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", "engines": { "node": ">=4" } @@ -10678,12 +12122,14 @@ "node_modules/toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -10691,36 +12137,38 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "license": "0BSD" }, "node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "license": "MIT" + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, + "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } @@ -10729,6 +12177,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/typesafe-actions/-/typesafe-actions-5.1.0.tgz", "integrity": "sha512-bna6Yi1pRznoo6Bz1cE6btB/Yy8Xywytyfrzu/wc+NFW3ZF0I+2iCGImhBsoYYCOWuICtRO4yHcnDlzgo1AdNg==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -10737,6 +12186,7 @@ "version": "5.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10749,6 +12199,7 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", + "license": "MIT", "dependencies": { "typescript-logic": "^0.0.0" } @@ -10756,20 +12207,22 @@ "node_modules/typescript-logic": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", - "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==" + "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==", + "license": "MIT" }, "node_modules/typescript-tuple": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", + "license": "MIT", "dependencies": { "typescript-compare": "^0.0.2" } }, "node_modules/ua-parser-js": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", - "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz", + "integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==", "funding": [ { "type": "opencollective", @@ -10784,20 +12237,16 @@ "url": "https://github.com/sponsors/faisalman" } ], + "license": "MIT", "engines": { "node": "*" } }, - "node_modules/ufo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", - "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", - "dev": true - }, "node_modules/uncontrollable": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.3", "@types/react": ">=16.9.11", @@ -10811,21 +12260,23 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" }, "node_modules/universal-cookie": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.1.4.tgz", "integrity": "sha512-Q+DVJsdykStWRMtXr2Pdj3EF98qZHUH/fXv/gwFz/unyToy1Ek1w5GsWt53Pf38tT8Gbcy5QNsj61Xe9TggP4g==", + "license": "MIT", "dependencies": { "@types/cookie": "^0.6.0", "cookie": "^0.6.0" } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -10840,9 +12291,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -10855,25 +12307,31 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/use-ackee": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/use-ackee/-/use-ackee-3.0.1.tgz", - "integrity": "sha512-c3PJweMI1mpkYXCzCfzz+sUfjH2BhfwhhiqPzBol0giZDzP0h279XpJLg2VtS4XeIaCACIqEW8Z3yJD7iRdcMQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use-ackee/-/use-ackee-3.1.0.tgz", + "integrity": "sha512-RPX51I/Ak6dtNW0aXY6GM/LJ899OU4qoKes/CTGj9+4Qoz9PO7I14BX8Rw6vmlbVvQzZ6WIb01sg7vU/kYEQOw==", + "license": "MIT", "dependencies": { - "ackee-tracker": "^5.0.1" + "ackee-tracker": "^5.1.0" + }, + "engines": { + "node": ">= 14" }, "peerDependencies": { - "react": "^17.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/use-composed-ref": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -10882,6 +12340,7 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/use-immer/-/use-immer-0.9.0.tgz", "integrity": "sha512-/L+enLi0nvuZ6j4WlyK0US9/ECUtV5v9RUbtxnn5+WbtaXYUaOBoKHDNL9I5AETdurQ4rIFIj/s+Z5X80ATyKw==", + "license": "MIT", "peerDependencies": { "immer": ">=2.0.0", "react": "^16.8.0 || ^17.0.1 || ^18.0.0" @@ -10891,6 +12350,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" }, @@ -10904,6 +12364,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "license": "MIT", "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" }, @@ -10917,9 +12378,10 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -10927,7 +12389,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/uuid": { "version": "9.0.1", @@ -10937,34 +12400,16 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, "node_modules/victory-area": { "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-36.9.2.tgz", "integrity": "sha512-32aharvPf2RgdQB+/u1j3/ajYFNH/7ugLX9ZRpdd65gP6QEbtXL+58gS6CxvFw6gr/y8a0xMlkMKkpDVacXLpw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2", @@ -10978,6 +12423,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-36.9.2.tgz", "integrity": "sha512-4Odws+IAjprJtBg2b2ZCxEPgrQ6LgIOa22cFkGghzOSfTyNayN4M3AauNB44RZyn2O/hDiM1gdBkEg1g9YDevQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2" @@ -10990,6 +12436,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-36.9.2.tgz", "integrity": "sha512-R3LFoR91FzwWcnyGK2P8DHNVv9gsaWhl5pSr2KdeNtvLbZVEIvUkTeVN9RMBMzterSFPw0mbWhS1Asb3sV6PPw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2", @@ -11003,6 +12450,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-36.9.2.tgz", "integrity": "sha512-nUD45V/YHDkAKZyak7YDsz+Vk1F9N0ica3jWQe0AY0JqD9DleHa8RY/olSVws26kLyEj1I+fQqva6GodcLaIqQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2", @@ -11016,6 +12464,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-36.9.2.tgz", "integrity": "sha512-KcQjzFeo40tn52cJf1A02l5MqeR9GKkk3loDqM3T2hfi1PCyUrZXEUjGN5HNlLizDRvtcemaAHNAWlb70HbG/g==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", @@ -11029,6 +12478,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-36.9.2.tgz", "integrity": "sha512-dMNcS0BpqL3YiGvI4BSEmPR76FCksCgf3K4CSZ7C/MGyrElqB6wWwzk7afnlB1Qr71YIHXDmdwsPNAl/iEwTtA==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", @@ -11045,6 +12495,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", @@ -11058,6 +12509,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-36.9.2.tgz", "integrity": "sha512-uA0dh1R0YDzuXyE/7StZvq4qshet+WYceY7R1UR5mR/F9079xy+iQsa2Ca4h97/GtVZoLO6r1eKLWBt9TN+U7A==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-brush-container": "^36.9.2", @@ -11075,6 +12527,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-36.9.2.tgz", "integrity": "sha512-jidab4j3MaciF3fGX70jTj4H9rrLcY8o2LUrhJ67ZLvEFGGmnPtph+p8Fe97Umrag7E/DszjNxQZolpwlgUh3g==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2" @@ -11087,6 +12540,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-36.9.2.tgz", "integrity": "sha512-wBmpsjBTKva8mxHvHNY3b8RE58KtnpLLItEyyAHaYkmExwt3Uj8Cld3sF3vmeuijn2iR64NPKeMbgMbfZJzycw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", @@ -11101,6 +12555,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-36.9.2.tgz", "integrity": "sha512-cucFJpv6fty+yXp5pElQFQnHBk1TqA4guGUMI+XF/wLlnuM4bhdAtASobRIIBkz0mHGBaCAAV4PzL9azPU/9dg==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2" @@ -11113,6 +12568,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-36.9.2.tgz", "integrity": "sha512-kmYFZUo0o2xC8cXRsmt/oUBRQSZJVT2IJnAkboUepypoj09e6CY5tRH4TSdfEDGkBk23xQkn7d4IFgl4kAGnSA==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2", @@ -11126,6 +12582,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-36.9.2.tgz", "integrity": "sha512-i3zWezvy5wQEkhXKt4rS9ILGH7Vr9Q5eF9fKO4GMwDPBdYOTE3Dh2tVaSrfDC8g9zFIc0DKzOtVoJRTb+0AkPg==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2", @@ -11139,6 +12596,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-36.9.2.tgz", "integrity": "sha512-HBR90FF4M56yf/atXjSmy3DMps1vSAaLXmdVXLM/A5g+0pUS7HO719r5x6dsR3I6Rm+8x6Kk8xJs0qgpnGQIEw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2" @@ -11151,6 +12609,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-36.9.2.tgz", "integrity": "sha512-hK9AtbJQfaW05i8BH7Lf1HK7vWMAfQofj23039HEQJqTKbCL77YT+Q0LhZw1a1BRCpC/5aSg9EuqblhfIYw2wg==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2" @@ -11163,6 +12622,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-36.9.2.tgz", "integrity": "sha512-chboroEwqqVlMB60kveXM2WznJ33ZM00PWkFVCoJDzHHlYs7TCADxzhqet2S67SbZGSyvSprY2YztSxX8kZ+XQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2" @@ -11175,6 +12635,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-36.9.2.tgz", "integrity": "sha512-W/atiw3Or6MnpBuhluFv6007YrixIRh5NtiRvtFLGxNuQJLYjaSh6koRAih5xJer5Pj7YUx0tL9x67jTRcJ6Dg==", + "license": "MIT", "dependencies": { "json-stringify-safe": "^5.0.1", "lodash": "^4.17.19", @@ -11189,6 +12650,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-36.9.2.tgz", "integrity": "sha512-imR6FniVlDFlBa/B3Est8kTryNhWj2ZNpivmVOebVDxkKcVlLaDg3LotCUOI7NzOhBQaro0UzeE9KmZV93JcYA==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", @@ -11203,6 +12665,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-36.9.2.tgz", "integrity": "sha512-76seo4TWD1WfZHJQH87IP3tlawv38DuwrUxpnTn8+uW6/CUex82poQiVevYdmJzhataS9jjyCWv3w7pOmLBCLg==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2" @@ -11215,6 +12678,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", @@ -11236,6 +12700,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", "dependencies": { "@types/d3-color": "*" } @@ -11244,14 +12709,25 @@ "version": "3.1.6", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "license": "MIT", "dependencies": { "@types/d3-path": "*" } }, + "node_modules/victory-vendor/node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, "node_modules/victory-vendor/node_modules/d3-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -11260,6 +12736,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", "dependencies": { "d3-path": "^3.1.0" }, @@ -11271,6 +12748,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -11279,6 +12757,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-36.9.2.tgz", "integrity": "sha512-NIVYqck9N4OQnEz9mgQ4wILsci3OBWWK7RLuITGHyoD7Ne/+WH1i0Pv2y9eIx+f55rc928FUTugPPhkHvXyH3A==", + "license": "MIT", "dependencies": { "delaunay-find": "0.0.6", "lodash": "^4.17.19", @@ -11294,6 +12773,7 @@ "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-36.9.2.tgz", "integrity": "sha512-pXa2Ji6EX/pIarKT6Hcmmu2n7IG/x8Vs0D2eACQ/nbpvZa+DXWIxCRW4hcg2Va35fmXcDIEpGaX3/soXzZ+pbw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "victory-core": "^36.9.2" @@ -11303,13 +12783,14 @@ } }, "node_modules/vite": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", - "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", + "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.38", + "postcss": "^8.4.39", "rollup": "^4.13.0" }, "bin": { @@ -11358,15 +12839,16 @@ } }, "node_modules/vite-node": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.2.2.tgz", - "integrity": "sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.3.tgz", + "integrity": "sha512-14jzwMx7XTcMB+9BhGQyoEAmSl0eOr3nrnn+Z12WNERtOvLN+d2scbRUvyni05rT3997Bg+rZb47NyP4IQPKXg==", "dev": true, + "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", + "debug": "^4.3.5", + "pathe": "^1.1.2", + "tinyrainbow": "^1.2.0", "vite": "^5.0.0" }, "bin": { @@ -11383,6 +12865,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/vite-plugin-babel-macros/-/vite-plugin-babel-macros-1.0.6.tgz", "integrity": "sha512-7cCT8jtu5UjpE46pH7RyVltWw5FbhDAtQliZ6QGqRNR5RUZKdAsB0CDjuF+VBoDpnl0KuESPu22SoNqXRYYWyQ==", + "license": "MIT", "dependencies": { "@babel/core": "^7.17.7", "@babel/plugin-syntax-jsx": "^7.16.7", @@ -11402,6 +12885,7 @@ "resolved": "https://registry.npmjs.org/vite-plugin-istanbul/-/vite-plugin-istanbul-5.0.0.tgz", "integrity": "sha512-Tg9zDmm/u4SdEDFbEWHBz7mmFe7jhLRmArA2XCmw5yydEFCARU9r4TxqFFnBFWCL63D9A7XA7VELulOO5T5o/g==", "dev": true, + "license": "MIT", "dependencies": { "@istanbuljs/load-nyc-config": "^1.1.0", "espree": "^9.6.1", @@ -11418,6 +12902,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -11434,36 +12919,51 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/vitest": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.2.2.tgz", - "integrity": "sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.3.tgz", + "integrity": "sha512-o3HRvU93q6qZK4rI2JrhKyZMMuxg/JRt30E6qeQs6ueaiz5hr1cPj+Sk2kATgQzMMqsa2DiNI0TIK++1ULx8Jw==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/expect": "1.2.2", - "@vitest/runner": "1.2.2", - "@vitest/snapshot": "1.2.2", - "@vitest/spy": "1.2.2", - "@vitest/utils": "1.2.2", - "acorn-walk": "^8.3.2", - "cac": "^6.7.14", - "chai": "^4.3.10", - "debug": "^4.3.4", + "@ampproject/remapping": "^2.3.0", + "@vitest/expect": "2.0.3", + "@vitest/pretty-format": "^2.0.3", + "@vitest/runner": "2.0.3", + "@vitest/snapshot": "2.0.3", + "@vitest/spy": "2.0.3", + "@vitest/utils": "2.0.3", + "chai": "^5.1.1", + "debug": "^4.3.5", "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^1.3.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.2", + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.8.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "1.2.2", + "vite-node": "2.0.3", "why-is-node-running": "^2.2.2" }, "bin": { @@ -11478,8 +12978,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "^1.0.0", - "@vitest/ui": "^1.0.0", + "@vitest/browser": "2.0.3", + "@vitest/ui": "2.0.3", "happy-dom": "*", "jsdom": "*" }, @@ -11508,6 +13008,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } @@ -11518,14 +13019,20 @@ "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" }, "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } }, "node_modules/webpack-merge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "license": "MIT", "dependencies": { "lodash": "^4.17.15" } @@ -11533,18 +13040,21 @@ "node_modules/webworker-promise": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/webworker-promise/-/webworker-promise-0.5.0.tgz", - "integrity": "sha512-14iR79jHAV7ozwvbfif+3wCaApT3I1g8Lo0rJZrwAu6wxZGx/08Y8KXz6as6ZLNUEEufeiEBBYrqyDBClXOsEw==" + "integrity": "sha512-14iR79jHAV7ozwvbfif+3wCaApT3I1g8Lo0rJZrwAu6wxZGx/08Y8KXz6as6ZLNUEEufeiEBBYrqyDBClXOsEw==", + "license": "MIT" }, "node_modules/whatwg-fetch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", + "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } @@ -11553,16 +13063,24 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -11577,13 +13095,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, + "license": "MIT", "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" @@ -11599,6 +13119,7 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz", "integrity": "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==", + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -11618,6 +13139,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -11632,6 +13154,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11641,16 +13164,54 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -11658,16 +13219,11 @@ "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/xmlbuilder2": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.0.2.tgz", "integrity": "sha512-h4MUawGY21CTdhV4xm3DG9dgsqyhDkZvVJBx88beqX8wJs3VgyGQgAn5VreHuae6unTQxh115aMK5InCVmOIKw==", + "license": "MIT", "dependencies": { "@oozcitak/dom": "1.15.10", "@oozcitak/infra": "1.0.8", @@ -11683,6 +13239,7 @@ "version": "3.14.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -11695,6 +13252,7 @@ "version": "1.0.14", "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", + "license": "MIT", "dependencies": { "commander": "^2.20.3", "cssfilter": "0.0.10" @@ -11706,21 +13264,39 @@ "node": ">= 0.10.0" } }, + "node_modules/xss/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", "engines": { "node": ">= 6" } @@ -11730,6 +13306,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -11752,6 +13329,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/package.json b/package.json index b6711c654..bab856489 100644 --- a/package.json +++ b/package.json @@ -24,21 +24,21 @@ "print-version": "./print_version.sh" }, "dependencies": { - "@cornerstonejs/core": "^1.81.2", - "@cornerstonejs/dicom-image-loader": "^1.81.2", - "@cornerstonejs/streaming-image-volume-loader": "^1.81.2", - "@cornerstonejs/tools": "^1.81.2", + "@cornerstonejs/core": "^1.82.4", + "@cornerstonejs/dicom-image-loader": "^1.82.4", + "@cornerstonejs/streaming-image-volume-loader": "^1.82.4", + "@cornerstonejs/tools": "^1.82.4", "@fnndsc/chrisapi": "^1.15.0", "@niivue/niivue": "^0.41.1", "@patternfly/react-catalog-view-extension": "^5.0.0", "@patternfly/react-charts": "^7.3.0", - "@patternfly/react-core": "^5.3.3", + "@patternfly/react-core": "^5.3.4", "@patternfly/react-log-viewer": "^5.2.0", - "@patternfly/react-table": "^5.3.3", + "@patternfly/react-table": "^5.3.4", "@react-hook/resize-observer": "^2.0.1", - "@tanstack/react-query": "^5.49.2", - "antd": "^5.19.0", - "axios": "^1.6.5", + "@tanstack/react-query": "^5.51.1", + "antd": "^5.19.2", + "axios": "^1.7.2", "chris-utility": "^1.1.6", "d3-hierarchy": "^1.1.9", "d3-selection": "^1.4.2", @@ -47,16 +47,16 @@ "date-fns": "^3.6.0", "dicom-parser": "^1.8.21", "email-validator": "^2.0.4", - "fp-ts": "^2.16.2", + "fp-ts": "^2.16.8", "hammerjs": "^2.0.8", - "immer": "^10.0.3", + "immer": "^10.1.1", "keymirror": "^0.1.1", "lodash": "^4.17.21", - "marked": "^11.1.1", + "marked": "^13.0.2", "micromark": "^4.0.0", "micromark-extension-gfm": "^3.0.0", "niivue-react": "github:niivue/niivue-react", - "npm": "^10.6.0", + "npm": "^10.8.2", "pako": "^1.0.11", "preval.macro": "^5.0.0", "query-string": "^9.0.0", @@ -88,7 +88,7 @@ "vite-plugin-babel-macros": "^1.0.6" }, "devDependencies": { - "@biomejs/biome": "1.5.3", + "@biomejs/biome": "1.8.3", "@faker-js/faker": "^8.4.0", "@playwright/test": "^1.41.2", "@types/d3-hierarchy": "^1.1.7", @@ -103,14 +103,15 @@ "@types/uuid": "^9.0.6", "@vitejs/plugin-react-swc": "^3.5.0", "@vitest/coverage-v8": "^1.2.2", - "happy-dom": "^13.3.8", + "happy-dom": "^14.12.3", "lefthook": "^1.6.1", - "nyc": "^15.1.0", - "playwright": "^1.41.2", + "nyc": "^17.0.0", + "playwright": "^1.45.1", "redux-devtools-extension": "^2.13.9", "redux-logger": "^3.0.6", - "vite": "^5.3.2", + "rollup-plugin-node-builtins": "^2.1.2", + "vite": "^5.3.3", "vite-plugin-istanbul": "^5.0.0", - "vitest": "^1.2.2" + "vitest": "^2.0.3" } } diff --git a/vite.config.ts b/vite.config.ts index 3dc74396d..81bc8c50b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -26,6 +26,7 @@ export default defineConfig({ // workaround for "Cornerstone3D tools does not build with vite" // https://github.com/cornerstonejs/cornerstone3D/issues/1071 "@cornerstonejs/tools": "@cornerstonejs/tools/dist/umd/index.js", + "fs": require.resolve("rollup-plugin-node-builtins") }, }, }); From b0a7c87814d010d6da2e33f845250a5b42900768 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 15 Jul 2024 12:36:00 -0400 Subject: [PATCH 002/337] feat: Update @fnndsc/chrisapi --- package-lock.json | 521 +--------------------------------------------- package.json | 4 +- 2 files changed, 10 insertions(+), 515 deletions(-) diff --git a/package-lock.json b/package-lock.json index 915fb9753..c4c355df6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@cornerstonejs/dicom-image-loader": "^1.82.4", "@cornerstonejs/streaming-image-volume-loader": "^1.82.4", "@cornerstonejs/tools": "^1.82.4", - "@fnndsc/chrisapi": "^1.15.0", + "@fnndsc/chrisapi": "^1.21.0", "@niivue/niivue": "^0.41.1", "@patternfly/react-catalog-view-extension": "^5.0.0", "@patternfly/react-charts": "^7.3.0", @@ -93,7 +93,7 @@ "playwright": "^1.45.1", "redux-devtools-extension": "^2.13.9", "redux-logger": "^3.0.6", - "rollup-plugin-node-builtins": "^2.1.2", + "rollup-plugin-node-builtins": "^2.0.0", "vite": "^5.3.3", "vite-plugin-istanbul": "^5.0.0", "vitest": "^2.0.3" @@ -2860,25 +2860,6 @@ "node": ">=10" } }, - "node_modules/abstract-leveldown": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~3.0.0" - } - }, - "node_modules/abstract-leveldown/node_modules/xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/accessor-fn": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.0.tgz", @@ -3224,36 +3205,6 @@ "node": "*" } }, - "node_modules/bl": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~1.0.26" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true, - "license": "MIT" - }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -3318,17 +3269,6 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/browserify-fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", - "integrity": "sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==", - "dev": true, - "dependencies": { - "level-filesystem": "^1.0.1", - "level-js": "^2.1.3", - "levelup": "^0.18.2" - } - }, "node_modules/browserify-rsa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", @@ -3362,13 +3302,6 @@ "node": ">= 0.12" } }, - "node_modules/browserify-sign/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, "node_modules/browserify-sign/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -3448,13 +3381,6 @@ "dev": true, "license": "MIT" }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -3687,16 +3613,6 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/clone": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", @@ -3767,62 +3683,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "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" - } - }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/console-clear": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", @@ -4367,16 +4227,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deferred-leveldown": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~0.12.1" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -4632,19 +4482,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -5120,13 +4957,6 @@ "node": ">=12" } }, - "node_modules/foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", - "dev": true, - "license": "MIT" - }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -5211,35 +5041,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fwd-stream": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==", - "dev": true, - "dependencies": { - "readable-stream": "~1.0.26-4" - } - }, - "node_modules/fwd-stream/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/fwd-stream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true, - "license": "MIT" - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5571,13 +5372,6 @@ "node": ">=16.17.0" } }, - "node_modules/idb-wrapper": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", - "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==", - "dev": true, - "license": "MIT" - }, "node_modules/immer": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", @@ -5651,12 +5445,6 @@ "node": ">=12" } }, - "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", - "dev": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5701,15 +5489,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/is": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -5741,12 +5520,6 @@ "node": ">=8" } }, - "node_modules/is-object": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==", - "dev": true - }, "node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -5787,16 +5560,9 @@ } }, "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/isbuffer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", - "integrity": "sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, @@ -6188,232 +5954,6 @@ "lefthook": "bin/lefthook" } }, - "node_modules/level-blobs": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "integrity": "sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==", - "dev": true, - "dependencies": { - "level-peek": "1.0.6", - "once": "^1.3.0", - "readable-stream": "^1.0.26-4" - } - }, - "node_modules/level-blobs/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/level-blobs/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/level-filesystem": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "integrity": "sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==", - "dev": true, - "dependencies": { - "concat-stream": "^1.4.4", - "errno": "^0.1.1", - "fwd-stream": "^1.0.4", - "level-blobs": "^0.1.7", - "level-peek": "^1.0.6", - "level-sublevel": "^5.2.0", - "octal": "^1.0.0", - "once": "^1.3.0", - "xtend": "^2.2.0" - } - }, - "node_modules/level-fix-range": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", - "integrity": "sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/level-hooks": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "integrity": "sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==", - "dev": true, - "dependencies": { - "string-range": "~1.2" - } - }, - "node_modules/level-js": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "integrity": "sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "abstract-leveldown": "~0.12.0", - "idb-wrapper": "^1.5.0", - "isbuffer": "~0.0.0", - "ltgt": "^2.1.2", - "typedarray-to-buffer": "~1.0.0", - "xtend": "~2.1.2" - } - }, - "node_modules/level-js/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", - "dev": true, - "license": "MIT" - }, - "node_modules/level-js/node_modules/typedarray-to-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", - "integrity": "sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==", - "dev": true, - "license": "MIT" - }, - "node_modules/level-js/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/level-peek": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "integrity": "sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "level-fix-range": "~1.0.2" - } - }, - "node_modules/level-sublevel": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "integrity": "sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "level-fix-range": "2.0", - "level-hooks": ">=4.4.0 <5", - "string-range": "~1.2.1", - "xtend": "~2.0.4" - } - }, - "node_modules/level-sublevel/node_modules/level-fix-range": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "integrity": "sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "~0.1.9" - } - }, - "node_modules/level-sublevel/node_modules/object-keys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==", - "deprecated": "Please update to the latest object-keys", - "dev": true, - "license": "MIT", - "dependencies": { - "foreach": "~2.0.1", - "indexof": "~0.0.1", - "is": "~0.2.6" - } - }, - "node_modules/level-sublevel/node_modules/xtend": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==", - "dev": true, - "dependencies": { - "is-object": "~0.1.2", - "object-keys": "~0.2.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/levelup": { - "version": "0.18.6", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", - "integrity": "sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "~0.8.1", - "deferred-leveldown": "~0.2.0", - "errno": "~0.1.1", - "prr": "~0.0.0", - "readable-stream": "~1.0.26", - "semver": "~2.3.1", - "xtend": "~3.0.0" - } - }, - "node_modules/levelup/node_modules/prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/levelup/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/levelup/node_modules/semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", - "dev": true, - "license": "BSD", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/levelup/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/levelup/node_modules/xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -6548,13 +6088,6 @@ "yallist": "^3.0.2" } }, - "node_modules/ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "dev": true, - "license": "MIT" - }, "node_modules/magic-string": { "version": "0.30.10", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", @@ -9856,13 +9389,6 @@ "node": ">= 0.4" } }, - "node_modules/octal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "integrity": "sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==", - "dev": true, - "license": "MIT" - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -10244,13 +9770,6 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "license": "MIT" - }, "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -11507,13 +11026,12 @@ } }, "node_modules/rollup-plugin-node-builtins": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz", - "integrity": "sha512-bxdnJw8jIivr2yEyt8IZSGqZkygIJOGAWypXvHXnwKAbUcN4Q/dGTx7K0oAJryC/m6aq6tKutltSeXtuogU6sw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.0.0.tgz", + "integrity": "sha512-jvsEYNf5U95YttEQbs5c6H7YSMYGs3SWA8/MfnlQ9ddijsgYbq8uKx4WQ1J8Zyrq+tgPF0Quu48PURrlcMZWoQ==", "dev": true, "license": "ISC", "dependencies": { - "browserify-fs": "^1.0.0", "buffer-es6": "^4.9.2", "crypto-browserify": "^3.11.0", "process-es6": "^0.11.2" @@ -11914,13 +11432,6 @@ "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", "license": "MIT" }, - "node_modules/string-range": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "integrity": "sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==", - "dev": true, - "license": "MIT" - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -12156,13 +11667,6 @@ "node": ">=8" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true, - "license": "MIT" - }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -13270,15 +12774,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, - "node_modules/xtend": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", diff --git a/package.json b/package.json index bab856489..560abecb8 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@cornerstonejs/dicom-image-loader": "^1.82.4", "@cornerstonejs/streaming-image-volume-loader": "^1.82.4", "@cornerstonejs/tools": "^1.82.4", - "@fnndsc/chrisapi": "^1.15.0", + "@fnndsc/chrisapi": "^1.21.0", "@niivue/niivue": "^0.41.1", "@patternfly/react-catalog-view-extension": "^5.0.0", "@patternfly/react-charts": "^7.3.0", @@ -109,7 +109,7 @@ "playwright": "^1.45.1", "redux-devtools-extension": "^2.13.9", "redux-logger": "^3.0.6", - "rollup-plugin-node-builtins": "^2.1.2", + "rollup-plugin-node-builtins": "^2.0.0", "vite": "^5.3.3", "vite-plugin-istanbul": "^5.0.0", "vitest": "^2.0.3" From 1fbecc918784bc66ca37645e31ffa46911317598 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 15 Jul 2024 13:27:42 -0400 Subject: [PATCH 003/337] feat: Update the path to upload files and create a feed --- src/api/common.ts | 15 +-- src/components/CreateFeed/CreateFeed.tsx | 37 ++++--- src/components/CreateFeed/createFeedHelper.ts | 96 ++++++++++--------- 3 files changed, 75 insertions(+), 73 deletions(-) diff --git a/src/api/common.ts b/src/api/common.ts index e265507ef..6f6daef8b 100644 --- a/src/api/common.ts +++ b/src/api/common.ts @@ -1,9 +1,9 @@ import * as React from "react"; -import axios, { AxiosProgressEvent } from "axios"; +import axios, { type AxiosProgressEvent } from "axios"; import ChrisAPIClient from "./chrisapiclient"; -import { +import type { Pipeline, - type PipelineList, + PipelineList, PluginPiping, Feed, Plugin, @@ -61,7 +61,7 @@ function useAsync(initialState?: any) { (promise: any) => { if (!promise || !promise.then) { throw new Error( - `The argument passed to useAsync().run must be a promise`, + "The argument passed to useAsync().run must be a promise", ); } safeSetState({ status: "pending" }); @@ -247,8 +247,9 @@ export const generatePipelineWithName = async (pipelineName: string) => { name: pipelineName, }); const pipelineInstanceId = pipelineInstanceList.data[0].id; - const pipelineInstance: Pipeline = - await client.getPipeline(pipelineInstanceId); + const pipelineInstance: Pipeline = (await client.getPipeline( + pipelineInstanceId, + )) as Pipeline; const resources = await fetchResources(pipelineInstance); return { resources, @@ -400,7 +401,7 @@ export const uploadWrapper = ( token: string, onUploadProgress?: (file: any, progressEvent: AxiosProgressEvent) => void, ) => { - const url = `${import.meta.env.VITE_CHRIS_UI_URL}uploadedfiles/`; + const url = `${import.meta.env.VITE_CHRIS_UI_URL}userfiles/`; return localFiles.map((file) => { const onUploadProgressWrap = (progressEvent: AxiosProgressEvent) => { onUploadProgress?.(file, progressEvent); diff --git a/src/components/CreateFeed/CreateFeed.tsx b/src/components/CreateFeed/CreateFeed.tsx index f67f6bb97..24d02177d 100644 --- a/src/components/CreateFeed/CreateFeed.tsx +++ b/src/components/CreateFeed/CreateFeed.tsx @@ -1,4 +1,4 @@ -import { Feed } from "@fnndsc/chrisapi"; +import type { Feed } from "@fnndsc/chrisapi"; import { Button, Modal, @@ -71,14 +71,13 @@ export default function CreateFeed() { router.actions.clearFeedData(); }; - const enableSave = + const enableSave = !!( data.chrisFiles.length > 0 || data.localFiles.length > 0 || Object.keys(requiredInput).length > 0 || Object.keys(dropdownInput).length > 0 || pluginMeta !== undefined - ? true - : false; + ); const handleSave = async () => { setFeedProcessing(true); @@ -120,10 +119,16 @@ export default function CreateFeed() { name: state.data.feedName, }); - // Set analysis tags - for (const tag of state.data.tags) { + /** + * @deprecated + * The following code is deprecated and should not be used. + * It sets analysis tags on the feed. + + + for (const tag of state.data.tags) { feed.tagFeed(tag.data.id); - } + } + */ // Set analysis description const note = await feed.getNote(); @@ -200,11 +205,8 @@ export default function CreateFeed() { [handleDispatch], ); - const allRequiredFieldsNotEmpty: boolean = selectedConfig.includes( - "fs_plugin", - ) - ? true - : false; + const allRequiredFieldsNotEmpty: boolean = + !!selectedConfig.includes("fs_plugin"); const filesChoosen = data.chrisFiles.length > 0 || data.localFiles.length > 0; @@ -256,7 +258,7 @@ export default function CreateFeed() { id={1} name="Basic-Information" footer={{ - isNextDisabled: data.feedName ? false : true, + isNextDisabled: !data.feedName, isBackDisabled: true, }} > @@ -266,17 +268,14 @@ export default function CreateFeed() { id={2} name="Analysis Data Selection" footer={{ - isNextDisabled: - filesChoosen || allRequiredFieldsNotEmpty ? false : true, + isNextDisabled: !(filesChoosen || allRequiredFieldsNotEmpty), }} > {withSelectionAlert( , )} @@ -289,7 +288,7 @@ export default function CreateFeed() { footer={{ onNext: handleSave, nextButtonText: "Create Analysis", - isNextDisabled: !enableSave || feedProcessing ? true : false, + isNextDisabled: !!(!enableSave || feedProcessing), }} > diff --git a/src/components/CreateFeed/createFeedHelper.ts b/src/components/CreateFeed/createFeedHelper.ts index 24452e198..2ae9f5641 100644 --- a/src/components/CreateFeed/createFeedHelper.ts +++ b/src/components/CreateFeed/createFeedHelper.ts @@ -1,4 +1,4 @@ -import { +import type { Feed, Plugin, PluginInstance, @@ -10,10 +10,10 @@ import { limitConcurrency, uploadWrapper, } from "../../api/common"; -import { InputType } from "../AddNode/types"; +import type { InputType } from "../AddNode/types"; import { unpackParametersIntoObject } from "../AddNode/utils"; -import { PipelineState } from "../PipelinesCopy/context"; -import { CreateFeedData } from "./types/feed"; +import type { PipelineState } from "../PipelinesCopy/context"; +import type { CreateFeedData } from "./types/feed"; export const createFeed = async ( data: CreateFeedData, @@ -24,16 +24,16 @@ export const createFeed = async ( ) => { const { chrisFiles, localFiles } = data; - let dirpath: string[] = []; + const dirpath: string[] = []; let feed: Feed; if (selectedConfig.includes("swift_storage")) { - dirpath = chrisFiles.map((path: string) => path); + dirpath.push(...chrisFiles); } if (selectedConfig.includes("local_select")) { const generateUnique = generatePathForLocalFile(data); - const path = `${username}/uploads/${generateUnique}`; + const path = `home/${username}/uploads/${generateUnique}`; dirpath.push(path); try { @@ -46,53 +46,55 @@ export const createFeed = async ( try { const client = ChrisAPIClient.getClient(); + const dircopy = await getPlugin("pl-dircopy"); - if (dircopy) { - const createdInstance = await client.createPluginInstance( - dircopy.data.id, - { - //@ts-ignore - dir: dirpath.join(","), - }, - ); - const { pipelineToAdd, computeInfo, titleInfo, selectedPipeline } = state; - const id = pipelineToAdd?.data.id; - const resources = selectedPipeline?.[id]; - if (createdInstance) { - if (resources) { - const { parameters } = resources; - - const nodes_info = client.computeWorkflowNodesInfo(parameters.data); - - for (const node of nodes_info) { - // Set compute info - const activeNode = computeInfo?.[id][node.piping_id]; - // Set Title - const titleSet = titleInfo?.[id][node.piping_id]; - - if (activeNode) { - const compute_node = activeNode.currentlySelected; - node.compute_resource_name = compute_node; - } - - if (titleSet) { - node.title = titleSet; - } - } + if (!dircopy) { + throw new Error("Failed to find pl-dircopy. Is pl-dircopy installed? "); + } + + const createdInstance = await client.createPluginInstance(dircopy.data.id, { + //@ts-ignore + dir: dirpath.join(","), + }); + + if (!createdInstance) { + throw new Error("Failed to create a dircopy instance"); + } - await client.createWorkflow(id, { - previous_plugin_inst_id: createdInstance.data.id, - nodes_info: JSON.stringify(nodes_info), - }); + const { pipelineToAdd, computeInfo, titleInfo, selectedPipeline } = state; + const id = pipelineToAdd?.data.id; + const resources = selectedPipeline?.[id]; + + if (resources) { + const { parameters } = resources; + + const nodes_info = client.computeWorkflowNodesInfo(parameters.data); + + for (const node of nodes_info) { + // Set compute info + const activeNode = computeInfo?.[id][node.piping_id]; + // Set Title + const titleSet = titleInfo?.[id][node.piping_id]; + + if (activeNode) { + const compute_node = activeNode.currentlySelected; + node.compute_resource_name = compute_node; } - feed = (await createdInstance.getFeed()) as Feed; - return feed; + if (titleSet) { + node.title = titleSet; + } } - throw new Error("Failed to create a dircopy instance"); + + await client.createWorkflow(id, { + previous_plugin_inst_id: createdInstance.data.id, + nodes_info: JSON.stringify(nodes_info), + }); } - return undefined; + + feed = (await createdInstance.getFeed()) as Feed; + return feed; } catch (e: any) { // biome-ignore lint/complexity/noUselessCatch: throw e; From f989bb337be1f03ec8c0459ecdf84184356294df Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 15 Jul 2024 15:35:37 -0400 Subject: [PATCH 004/337] feat: Update File Browser to use the new api --- .../FeedOutputBrowser/FeedOutputBrowser.tsx | 1 - .../FeedOutputBrowser/FileBrowser.tsx | 371 +++++++----------- src/components/FeedOutputBrowser/types.ts | 13 +- src/store/hooks.ts | 69 +++- src/store/resources/actions.ts | 10 +- src/store/resources/reducer.ts | 15 +- src/store/resources/saga.ts | 117 +++--- src/store/resources/types.ts | 18 +- 8 files changed, 309 insertions(+), 305 deletions(-) diff --git a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx index 72e00d265..8b9873289 100644 --- a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx +++ b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx @@ -4,7 +4,6 @@ import { EmptyStateVariant, Title, } from "@patternfly/react-core"; -import React from "react"; import type { PluginInstance } from "@fnndsc/chrisapi"; import FileBrowser from "./FileBrowser"; import { SpinContainer } from "../Common"; diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index f7ec1870a..3957a7223 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -1,4 +1,3 @@ -import type { FeedFile } from "@fnndsc/chrisapi"; import { Breadcrumb, BreadcrumbItem, @@ -9,18 +8,18 @@ import { DrawerPanelBody, DrawerPanelContent, Grid, + Tooltip, } from "@patternfly/react-core"; import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; -import { useMutation } from "@tanstack/react-query"; import { notification } from "antd"; -import React, { useContext } from "react"; +import { useContext, useEffect } from "react"; import { useDispatch } from "react-redux"; import { setFilePreviewPanel } from "../../store/drawer/actions"; import { clearSelectedFile, setSelectedFile, } from "../../store/explorer/actions"; -import { useTypedSelector } from "../../store/hooks"; +import useDownload, { useTypedSelector } from "../../store/hooks"; import { ClipboardCopyContainer, SpinContainer } from "../Common"; import { ThemeContext } from "../DarkTheme/useTheme"; import { DrawerActionButton } from "../Feeds/DrawerUtils"; @@ -29,156 +28,67 @@ import { DownloadIcon, FileIcon, FileImageIcon, - FileTxtIcon, FilePdfIcon, + FileTxtIcon, FolderIcon, + HomeIcon, } from "../Icons"; import FileDetailView from "../Preview/FileDetailView"; import XtkViewer from "../XtkViewer/XtkViewer"; -import { EmptyStateLoader } from "./FeedOutputBrowser"; import type { FileBrowserProps } from "./types"; import { bytesToSize } from "./utilities"; -const getFileName = (name: string) => { +export const getFileName = (name: string) => { return name.split("/").slice(-1).join(""); }; -let isDownloadInitiated = false; +const previewAnimation = [{ opacity: "0.0" }, { opacity: "1.0" }]; + +const previewAnimationTiming = { + duration: 1000, + iterations: 1, +}; const FileBrowser = (props: FileBrowserProps) => { + const dispatch = useDispatch(); + const feed = useTypedSelector((state) => state.feed.currentFeed.data); + const handleDownloadMutation = useDownload(feed); + const [api, contextHolder] = notification.useNotification(); + const { isSuccess, isError, error: downloadError } = handleDownloadMutation; const { isDarkTheme } = useContext(ThemeContext); const { pluginFilesPayload, handleFileClick, selected, filesLoading } = props; const selectedFile = useTypedSelector((state) => state.explorer.selectedFile); const drawerState = useTypedSelector((state) => state.drawers); - const feed = useTypedSelector((state) => state.feed.currentFeed.data); - - const dispatch = useDispatch(); - const [currentRowIndex, setCurrentRowIndex] = React.useState(0); - const { files, folders, path } = pluginFilesPayload; + const username = useTypedSelector((state) => state.user.username); + const { folderFiles, linkFiles, children, path } = pluginFilesPayload; const columnNames = { name: "Name", size: "Size", download: "", }; - const items = files && folders ? [...files, ...folders] : []; - const { id, plugin_name } = selected.data; - const pathSplit = path?.split(`/${plugin_name}_${id}/`); - const breadcrumb = path ? pathSplit[1].split("/") : []; - - const makeDataSourcePublic = async () => { - // Implement logic to make the data source public - await feed?.put({ - //@ts-ignore - public: true, - }); - }; - - const makeDataSourcePrivate = async () => { - // Implement logic to make the data source private again - await feed?.put({ - //@ts-ignore - public: false, - }); - }; - - const handleDownloadClick = async (item: FeedFile) => { - if (item) { - const privateFeed = feed?.data.public === false ? true : false; - try { - const fileName = getFileName(item.data.fname); - const link = document.createElement("a"); - - const url = item.collection.items[0].links[0].href; - if (!url) { - throw new Error("Failed to construct the url"); - } - - // This is highly inconsistent and needs to be investigated further - const authorizedUrl = `${url}`; // Add token as a query parameter - - // Make the data source public - privateFeed && (await makeDataSourcePublic()); - - // Create an anchor element - - link.href = authorizedUrl; - link.download = fileName; // Set the download attribute to specify the filename - // Append the anchor element to the document body - // Listen for the load event on the anchor element - - document.body.appendChild(link); - // Programmatically trigger the download - - isDownloadInitiated = true; - - link.click(); - // Remove the anchor element from the document body after the download is initiated - document.body.removeChild(link); - - // Wait for a short delay to ensure download initiation - await new Promise((resolve) => setTimeout(resolve, 100)); - - // If download is initiated, make the data source private - if (isDownloadInitiated && privateFeed) { - await makeDataSourcePrivate(); - } - privateFeed && (await makeDataSourcePrivate()); - - return item; - } catch (e) { - throw e; - } - } - }; - - const downloadMutation = useMutation({ - mutationFn: (item: FeedFile) => handleDownloadClick(item), - }); - - const { - isSuccess, - isPending, - isError, - error: downloadError, - data, - } = downloadMutation; - const [api, contextHolder] = notification.useNotification(); - - React.useEffect(() => { - if (isPending) { - api.info({ - message: "Processing download...", + const breadcrumb = path.split("/"); + const currentPath = `home/${username}/feeds/feed_${feed?.data.id}/${selected?.data.plugin_name}_${selected?.data.id}/data`; + + useEffect(() => { + if (isSuccess) { + api.success({ + message: "Successfully Triggered the Download", + duration: 1, }); - } - - if (data) { - const fileName = getFileName(data.data.fname); - if (isSuccess) { - api.success({ - message: `Triggered the Download for ${fileName}`, - }); - } - - if (isError) { - api.error({ - message: `Download Error: ${fileName}`, - //@ts-ignore - description: downloadError.message, - }); - } setTimeout(() => { - downloadMutation.reset(); + handleDownloadMutation.reset(); }, 1000); } - }, [isSuccess, isError, isPending, downloadError]); - - const previewAnimation = [{ opacity: "0.0" }, { opacity: "1.0" }]; - const previewAnimationTiming = { - duration: 1000, - iterations: 1, - }; + if (isError) { + api.error({ + message: "Download Error", + //@ts-ignore + description: downloadError.message, + }); + } + }, [isSuccess, isError, downloadError]); const generateBreadcrumb = (value: string, index: number) => { const onClick = () => { @@ -189,20 +99,27 @@ const FileBrowser = (props: FileBrowserProps) => { const findIndex = breadcrumb.findIndex((path) => path === value); if (findIndex !== -1) { const newPathList = breadcrumb.slice(0, findIndex + 1); - const combinedPathList = [ - ...pathSplit[0].split("/"), - `${plugin_name}_${id}`, - ...newPathList, - ]; - handleFileClick(combinedPathList.join("/")); + handleFileClick(newPathList.join("/")); } }; + // This is somewhat tricky. do not allow the user to click paths before the selected plugin. + const disabledIndex = breadcrumb.findIndex( + (path) => path === `${selected.data.plugin_name}_${selected.data.id}`, + ); + // If this selected plugin is of the type fs, assume that this is the first node of the tree and could have link files. All the paths + // that the user navigates to should not be clickable + const shouldNotClick = + (disabledIndex > 1 && index <= disabledIndex) || + selected.data.plugin_type === "fs"; + return ( { + shouldNotClick ? undefined : onClick(); + }} to={index === breadcrumb.length - 1 ? undefined : "#"} > {value} @@ -219,31 +136,18 @@ const FileBrowser = (props: FileBrowserProps) => { ?.animate(previewAnimation, previewAnimationTiming); }; - const handleItem = (item: string | FeedFile) => { - if (typeof item === "string") { - handleFileClick(`${path}/${item}`); - } else { + const handleItem = (item: any, type: string) => { + if (type === "link" || type === "folder") { + handleFileClick(item.data.path); + } + + if (type === "file") { toggleAnimation(); dispatch(setSelectedFile(item)); !drawerState.preview.open && dispatch(setFilePreviewPanel()); } }; - const handleNext = () => { - if (currentRowIndex + 1 < items.length) { - const item = items[currentRowIndex + 1]; - setCurrentRowIndex(currentRowIndex + 1); - handleItem(item); - } - }; - const handlePrevious = () => { - if (currentRowIndex - 1 >= 0) { - const item = items[currentRowIndex - 1]; - setCurrentRowIndex(currentRowIndex - 1); - handleItem(item); - } - }; - const previewPanel = ( { {drawerState.preview.currentlyActive === "preview" && selectedFile && ( { ); + const tableRowItem = (item: any, type: string) => { + let iconType: string; + let icon: React.ReactNode = null; + let fsize = " "; + let fileName = ""; + iconType = "UNKNOWN FORMAT"; + const pathList = + type === "folder" || type === "link" + ? item.data.path.split("/") + : item.data.fname.split("/"); + + fileName = pathList[pathList.length - 1]; + if (type === "file" && fileName.indexOf(".") > -1) { + iconType = getFileName(fileName)[0].toUpperCase(); + fsize = bytesToSize(item.data.fsize); + } else { + iconType = type; + } + const isPreviewing = selectedFile === item; + const backgroundColor = isDarkTheme ? "#002952" : "#E7F1FA"; + + icon = getIcon(iconType); + const fileNameComponent = ( +
+ {icon} + {fileName} +
+ ); + const downloadComponent = + type !== "file" ? undefined : ( + + + ); -} +}; -function LoadingTable() { +const LoadingTable = () => { return ( -
- -
+ ); -} +}; + +const FeedInfoColumn = ({ + feed, + onClick, +}: { feed: Feed; onClick: (feed: Feed) => void }) => ( + +); diff --git a/src/components/IconContainer/index.tsx b/src/components/IconContainer/index.tsx index 3386a85ec..e69de29bb 100644 --- a/src/components/IconContainer/index.tsx +++ b/src/components/IconContainer/index.tsx @@ -1,469 +0,0 @@ -import type { Feed } from "@fnndsc/chrisapi"; -import { - Button, - Checkbox, - Form, - FormGroup, - Modal, - ModalVariant, - TextInput, - ToggleGroup, - ToggleGroupItem, - Tooltip, -} from "@patternfly/react-core"; -import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { Alert, Spin } from "antd"; -import { cujs } from "chris-utility"; -import React, { type ReactElement } from "react"; -import { useDispatch } from "react-redux"; -import ChrisAPIClient from "../../api/chrisapiclient"; -import { setBulkSelect } from "../../store/feed/actions"; -import { useTypedSelector } from "../../store/hooks"; -import { - ArchiveIcon, - DeleteIcon, - DuplicateIcon, - MergeIcon, - ShareIcon, -} from "../Icons"; - -function capitalizeFirstLetter(stringLetter: string) { - return stringLetter.charAt(0).toUpperCase() + stringLetter.slice(1); -} - -interface ModalState { - isOpen: boolean; - feedName: string; - currentAction: string; - modalDescription: string; - errorHandling: string; - sharePublically: boolean; -} - -const getInitialState = () => { - return { - isOpen: false, - feedName: "", - currentAction: "", - modalDescription: "", - errorHandling: "", - sharePublically: false, - }; -}; - -const IconContainer = () => { - return
Icon Container
; -}; - -export default IconContainer; - -/* - const queryClient = useQueryClient(); - const { bulkSelect } = useTypedSelector((state) => { - return state.feed; - }); - const dispatch = useDispatch(); - const [modalState, setModalState] = - React.useState(getInitialState); - - const { currentAction, isOpen, errorHandling, sharePublically, feedName } = - modalState; - - const getDefaultName = (bulkSelect: Feed[], action: string) => { - if (bulkSelect.length > 0) { - const description = - action === "delete" - ? "Deleting a feed is a permanent action. Click on confirm if you're sure" - : "Enter a name for your new feed (optional)"; - - let prefix = ""; - if (action === "merge") { - prefix = "Merge of "; - } else if (action === "") { - prefix = "archive-"; - } else { - prefix = ""; - } - - let newFeedName = ""; - if (action !== "share") { - const feedNames = bulkSelect.map((select: Feed) => select.data.name); - // truncate name of the merged feed(limit=100) - newFeedName = feedNames.toString().replace(/[, ]+/g, "_"); - newFeedName = prefix + newFeedName; - newFeedName = newFeedName.substring(0, 100); - if (action === "duplicate") { - if (bulkSelect.length > 1) { - newFeedName = "duplicate-"; - } else { - newFeedName = `duplicate-${bulkSelect[0].data.name}`; - } - } - } - - setModalState({ - ...modalState, - modalDescription: description, - feedName: newFeedName, - currentAction: action, - isOpen: true, - }); - } - }; - - const handleModalToggle = (value: boolean) => { - if (value === false) { - const newState = getInitialState(); - setModalState({ - ...newState, - }); - } else { - setModalState({ - ...modalState, - errorHandling: "Please select a feed for this operation", - isOpen: value, - }); - } - }; - - const handleNameInputChange = ( - _event: React.FormEvent, - value: string, - ) => { - setModalState({ - ...modalState, - feedName: value, - }); - }; - - function invalidateQueries() { - queryClient.invalidateQueries({ - queryKey: ["feeds"], - }); - - queryClient.invalidateQueries({ - queryKey: ["publicFeeds"], - }); - } - - const deleteFeedMutation = useMutation({ - mutationFn: async (bulkSelect: Feed[]) => { - for (const feed of bulkSelect) { - try { - await feed.delete(); - } catch (e: any) { - throw new Error(e.message); - } - } - }, - onSuccess: () => { - dispatch(setBulkSelect([], false)); - invalidateQueries(); - handleModalToggle(false); - }, - onError: (error: { message: string }) => { - handleError(error.message); - }, - }); - - const shareFeedMutation = useMutation({ - mutationFn: async (data: { - bulkSelect: Feed[]; - sharePublically: boolean; - feedName: string; - }) => { - const { bulkSelect, sharePublically, feedName } = data; - for (const feed of bulkSelect) { - try { - if (sharePublically) { - const currentState = feed.data.public; - - await feed.put({ - //@ts-ignore - public: !currentState, - }); - } else { - await feed.put({ - owner: feedName, - }); - } - } catch (error: any) { - throw new Error(error); - } - } - }, - onSuccess: () => { - dispatch(setBulkSelect([], false)); - invalidateQueries(); - handleModalToggle(false); - }, - onError: (error) => { - handleError(error.message); - }, - }); - - const handleDownloadMutation = useMutation({ - mutationFn: async (data: { - feedList: Feed[]; - feedName: string; - operation: string; - }) => { - const { feedList, feedName, operation } = data; - - const client = ChrisAPIClient.getClient(); - cujs.setClient(client); - const feedIdList = []; - const feedNames = []; - for (let i = 0; i < feedList.length; i++) { - const data = feedList[i].data; - feedIdList.push(data.id); - feedNames.push(data.name); - } - - // Truncate the name of the merged feed (limit=100) - let newFeedName = feedNames.toString().replace(/[, ]+/g, "_"); - let createdFeed: Feed | null = null; - - if (operation === "archive") { - newFeedName = `archive-${newFeedName}`; - newFeedName = newFeedName.substring(0, 100); - newFeedName = feedName === "" ? newFeedName : feedName; - - try { - createdFeed = await cujs.downloadMultipleFeeds( - feedIdList, - newFeedName, - ); - } catch (e: any) { - throw new Error(e); - // Not throwing the error here to allow handling in the onError callback - } - } - - if (operation === "merge") { - newFeedName = `merge-${newFeedName}`; - newFeedName = newFeedName.substring(0, 100); - newFeedName = feedName === "" ? newFeedName : feedName; - - try { - createdFeed = await cujs.mergeMultipleFeeds(feedIdList, newFeedName); - } catch (e: any) { - throw new Error(e); - } - } - - return createdFeed; // Return null if operation is neither "download" nor "merge" - }, - onSuccess: () => { - // Handle success actions if needed - invalidateQueries(); - handleModalToggle(false); - }, - onError: (error: Error) => { - handleError(error.message); - }, - }); - const handleDuplicateFeedMutation = useMutation({ - mutationFn: async (data: { feedList: Feed[]; feedName: string }) => { - const { feedList, feedName } = data; - const client = ChrisAPIClient.getClient(); - cujs.setClient(client); - for (let i = 0; i < feedList.length; i++) { - const feedIdList = []; - const data = feedList[i].data; - const newFeedName = feedName - ? `${feedName}-${data.name}` - : `duplicate-${data.name}`; - feedIdList.push(data.id); - try { - await cujs.mergeMultipleFeeds(feedIdList, newFeedName); - } catch (error: any) { - throw new Error(error); - } - } - }, - onSuccess: () => { - invalidateQueries(); - handleModalToggle(false); - }, - onError: (error) => { - handleError(error.message); - }, - }); - - const handleError = (errorMessage: string) => { - setModalState({ - ...modalState, - errorHandling: errorMessage, - }); - }; - - const handleSubmit = () => { - currentAction === "share" && - shareFeedMutation.mutate({ bulkSelect, sharePublically, feedName }); - currentAction === "delete" && deleteFeedMutation.mutate(bulkSelect); - currentAction === "archive" && - handleDownloadMutation.mutate({ - feedList: bulkSelect, - feedName, - operation: "archive", - }); - currentAction === "merge" && - handleDownloadMutation.mutate({ - feedList: bulkSelect, - feedName, - operation: "merge", - }); - currentAction === "duplicate" && - handleDuplicateFeedMutation.mutate({ feedList: bulkSelect, feedName }); - }; - - const isPending = - shareFeedMutation.isPending || - handleDownloadMutation.isPending || - handleDuplicateFeedMutation.isPending || - deleteFeedMutation.isPending; - - return ( - - {["archive", "merge", "duplicate", "share", "delete"].map((action) => { - return ( - - { - bulkSelect.length === 0 - ? handleModalToggle(true) - : getDefaultName(bulkSelect, action); - }} - /> - - ); - })} - - { - handleModalToggle(false); - }} - onSubmit={handleSubmit} - actions={[ - , - , - ]} - > - {!(modalState.currentAction === "delete") ? ( - - ) : ( - - )} - - - ); -}; - -export default IconContainer; - -const actionMap: { - [key: string]: ReactElement; -} = { - archive: , - merge: , - duplicate: , - share: , - delete: , -}; - -const ToolGroupContainer = ({ - action, - onChangeHandler, - icon, -}: { - action: string; - onChangeHandler: () => void; - icon: ReactElement; -}) => { - return ( - {capitalizeFirstLetter(action)} selected feeds} - > - {icon} - - } - onChange={onChangeHandler} - /> - ); -}; -*/ diff --git a/src/components/NewLibrary/components/Cart.tsx b/src/components/NewLibrary/components/Cart.tsx index 9fdd274c3..5bbb474f1 100644 --- a/src/components/NewLibrary/components/Cart.tsx +++ b/src/components/NewLibrary/components/Cart.tsx @@ -165,7 +165,7 @@ const Cart = () => { title={ } /> @@ -237,7 +237,7 @@ const Cart = () => { > } - title={} + title={} /> )} diff --git a/src/components/NewLibrary/components/ContextMenu.tsx b/src/components/NewLibrary/components/ContextMenu.tsx index dbf851de4..ea1cceafa 100644 --- a/src/components/NewLibrary/components/ContextMenu.tsx +++ b/src/components/NewLibrary/components/ContextMenu.tsx @@ -12,11 +12,11 @@ import { AddModal } from "./Operations"; export const FolderContextMenu = ({ children, - folderPath, + inValidateFolders, folderList, }: { children: React.ReactElement; - folderPath: string; + inValidateFolders: () => void; folderList?: FileBrowserFolderList; }) => { const { @@ -27,7 +27,7 @@ export const FolderContextMenu = ({ contextHolder, setUserErrors, setModalInfo, - } = useFolderOperations(folderPath, folderList); + } = useFolderOperations(inValidateFolders, "", folderList); const items: MenuProps["items"] = [ { key: "createFeed", label: "Create Feed", icon: }, diff --git a/src/components/NewLibrary/components/FileCard.tsx b/src/components/NewLibrary/components/FileCard.tsx index 58ee8f07c..2d19a8fe4 100644 --- a/src/components/NewLibrary/components/FileCard.tsx +++ b/src/components/NewLibrary/components/FileCard.tsx @@ -30,6 +30,7 @@ import useLongPress, { getBackgroundRowColor, } from "../utils/longpress"; import { FolderContextMenu } from "./ContextMenu"; +import { useQueryClient } from "@tanstack/react-query"; type Pagination = { totalCount: number; @@ -42,6 +43,7 @@ type ComponentProps = { date: string; onClick?: (e: React.MouseEvent) => void; onMouseDown?: () => void; + inValidateFolders?: () => void; onCheckboxChange?: (e: React.FormEvent) => void; onContextMenuClick?: (e: React.MouseEvent) => void; onNavigate: () => void; @@ -52,7 +54,7 @@ type ComponentProps = { const PresentationComponent: React.FC = ({ name, - computedPath, + inValidateFolders, date, onClick, onNavigate, @@ -64,7 +66,7 @@ const PresentationComponent: React.FC = ({ bgRow, }) => ( - + inValidateFolders?.()}> = ({ file, computedPath, }) => { + const queryClient = useQueryClient(); const { isDarkTheme } = useContext(ThemeContext); const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const handleDownloadMutation = useDownload(); @@ -225,6 +228,11 @@ export const SubFileCard: React.FC = ({ {contextHolder} { + queryClient.invalidateQueries({ + queryKey: ["library_folders", computedPath], + }); + }} onMouseDown={handlers.handleOnMouseDown} onCheckboxChange={handleCheckboxChange} onContextMenuClick={handleClick} diff --git a/src/components/NewLibrary/components/FolderCard.tsx b/src/components/NewLibrary/components/FolderCard.tsx index 0f3a666fb..494356a1d 100644 --- a/src/components/NewLibrary/components/FolderCard.tsx +++ b/src/components/NewLibrary/components/FolderCard.tsx @@ -16,6 +16,7 @@ import { ThemeContext } from "../../DarkTheme/useTheme"; import { FolderIcon } from "../../Icons"; import useLongPress, { getBackgroundRowColor } from "../utils/longpress"; import { FolderContextMenu } from "./ContextMenu"; +import { useQueryClient } from "@tanstack/react-query"; type Pagination = { totalCount: number; @@ -57,6 +58,7 @@ export const SubFolderCard = ({ computedPath: string; handleFolderClick: (path: string) => void; }) => { + const queryClient = useQueryClient(); const isDarkTheme = useContext(ThemeContext).isDarkTheme; const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { handlers } = useLongPress(); @@ -73,7 +75,13 @@ export const SubFolderCard = ({ return ( - + { + queryClient.invalidateQueries({ + queryKey: ["library_folders", computedPath], + }); + }} + > { - console.log("E", e.detail); handleOnClick(e, folder, folder.data.path, "folder"); }} onContextMenu={(e) => { diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index 7a57155e9..a943939e8 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -26,6 +26,8 @@ import { CodeBranchIcon, DeleteIcon, DownloadIcon, + DuplicateIcon, + MergeIcon, } from "../../Icons"; import { useFolderOperations } from "../utils/useOperations"; @@ -100,15 +102,19 @@ const items = [ { key: "newFolder", label: "New Folder" }, { key: "fileUpload", label: "File Upload" }, { key: "folderUpload", label: "Folder Upload" }, - { key: "createGroup", label: "Create a Group" }, ]; const Operations = React.forwardRef( ( { - folderList, + inValidateFolders, computedPath, - }: { folderList?: FileBrowserFolderList; computedPath: string }, + folderList, + }: { + inValidateFolders: () => void; + computedPath?: string; + folderList?: FileBrowserFolderList; + }, ref, ) => { const dispatch = useDispatch(); @@ -124,7 +130,7 @@ const Operations = React.forwardRef( contextHolder, setUserErrors, setModalInfo, - } = useFolderOperations(computedPath, folderList); + } = useFolderOperations(inValidateFolders, computedPath, folderList); useImperativeHandle(ref, () => ({ triggerFileUpload: () => { @@ -201,6 +207,26 @@ const Operations = React.forwardRef( Anonymize + + + + + + )} - { - // This code needs to be revisited -
- } +
) : ( diff --git a/src/components/NewLibrary/utils/useDeletePayload.tsx b/src/components/NewLibrary/utils/useDeletePayload.tsx index 529c86ba7..2485f129f 100644 --- a/src/components/NewLibrary/utils/useDeletePayload.tsx +++ b/src/components/NewLibrary/utils/useDeletePayload.tsx @@ -9,18 +9,10 @@ import { ErrorAlert } from "../../Common"; type DeletionErrors = { path: string; message: string }[]; -const useDeletePayload = (computedPath: string, api: any) => { - const queryClient = useQueryClient(); +const useDeletePayload = (inValidateFolders: () => void, api: any) => { const dispatch = useDispatch(); const [deletionErrors, setDeletionErrors] = useState([]); const [notificationKey, setNotificationKey] = useState(null); - - const invalidateFolders = async () => { - await queryClient.invalidateQueries({ - queryKey: ["library_folders", computedPath], - }); - }; - const handleDelete = async (paths: SelectionPayload[]) => { const errors: DeletionErrors = []; const successfulPaths: string[] = []; @@ -47,7 +39,7 @@ const useDeletePayload = (computedPath: string, api: any) => { }), ); - await invalidateFolders(); + inValidateFolders(); successfulPaths.forEach((path) => dispatch(clearSelectFolder(path))); return errors.length > 0 ? errors : null; diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index 56ed7987b..22ca118b3 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -7,6 +7,7 @@ import { useDispatch } from "react-redux"; import ChrisAPIClient from "../../../api/chrisapiclient"; import { MainRouterContext } from "../../../routes"; import { + createFeed, setToggleCart, startAnonymize, startDownload, @@ -16,10 +17,10 @@ import { useTypedSelector } from "../../../store/hooks"; import useDeletePayload from "../utils/useDeletePayload"; export const useFolderOperations = ( - computedPath: string, + inValidateFolders: () => void, + computedPath?: string, // This path is passed to for file upload and folder uploads in the library folderList?: FileBrowserFolderList, ) => { - const queryClient = useQueryClient(); const router = useContext(MainRouterContext); const { selectedPaths } = useTypedSelector((state) => state.cart); const username = useTypedSelector((state) => state.user.username); @@ -30,13 +31,7 @@ export const useFolderOperations = ( const fileInput = useRef(null); const [api, contextHolder] = notification.useNotification(); - const deleteMutation = useDeletePayload(computedPath, api); - - const invalidateFolders = async () => { - await queryClient.invalidateQueries({ - queryKey: ["library_folders", computedPath], - }); - }; + const deleteMutation = useDeletePayload(inValidateFolders, api); const handleFileChange = async (e: React.ChangeEvent) => { const fileList = e.target.files || []; @@ -47,17 +42,23 @@ export const useFolderOperations = ( if (fileInput.current) { fileInput.current.value = ""; } - await invalidateFolders(); + inValidateFolders(); }; const handleFolderChange = async (e: React.ChangeEvent) => { const fileList = e.target.files || []; const files = Array.from(fileList); - dispatch(startUpload({ files, isFolder: true, currentPath: computedPath })); + dispatch( + startUpload({ + files, + isFolder: true, + currentPath: computedPath as string, + }), + ); if (folderInput.current) { folderInput.current.value = ""; } - await invalidateFolders(); + inValidateFolders(); }; const handleModalSubmit = async (inputValue: string) => { @@ -69,7 +70,7 @@ export const useFolderOperations = ( const finalPath = `${computedPath}/${inputValue}`; try { await folderList?.post({ path: finalPath }); - await invalidateFolders(); + inValidateFolders(); } catch (error: any) { const path = error?.response?.data?.path; const message = !isEmpty(path) ? path[0] : "Failed to create a folder."; @@ -83,6 +84,14 @@ export const useFolderOperations = ( mutationFn: (inputValue: string) => handleModalSubmit(inputValue), }); + const handleMerge = () => { + dispatch(createFeed({ payload: selectedPaths, type: "Merge Feed" })); + }; + + const handleDuplicate = () => { + dispatch(createFeed({ payload: selectedPaths, type: "Duplicate Feed" })); + }; + const handleOperations = (key: string) => { switch (key) { case "createFeed": { @@ -99,6 +108,7 @@ export const useFolderOperations = ( username: username as string, }), ); + inValidateFolders(); break; case "anonymize": dispatch(setToggleCart()); @@ -124,6 +134,14 @@ export const useFolderOperations = ( case "createGroup": setModalInfo({ isOpen: true, type: "group" }); break; + case "merge": { + handleMerge(); + break; + } + case "duplicate": { + handleDuplicate(); + break; + } } }; diff --git a/src/store/cart/actions.ts b/src/store/cart/actions.ts index e4379f072..def5a9c15 100644 --- a/src/store/cart/actions.ts +++ b/src/store/cart/actions.ts @@ -51,6 +51,11 @@ export const startUpload = (payload: UploadPayload) => export const startAnonymize = (payload: OperationPayload) => action(ICartActionTypes.START_ANONYMIZE, payload); +export const createFeed = (payload: { + payload: SelectionPayload[]; + type: string; +}) => action(ICartActionTypes.CREATE_FEED, payload); + export const setFileUploadStatus = (payload: { step: string; fileName: string; diff --git a/src/store/cart/saga.ts b/src/store/cart/saga.ts index 7a98a5bc4..46321f7d5 100644 --- a/src/store/cart/saga.ts +++ b/src/store/cart/saga.ts @@ -62,6 +62,30 @@ const isFileBrowserFolder = (payload: any): payload is FileBrowserFolder => { return (payload as FileBrowserFolder).data?.path !== undefined; }; +function* createFeed(path: string[], feedName: string) { + const client = ChrisAPIClient.getClient(); + const dircopy: Plugin | undefined = yield getPlugin("pl-dircopy") as Promise< + Plugin | undefined + >; + if (!dircopy) { + throw new Error("pl-dircopy was not registered"); + } + const createdInstance: PluginInstance = yield client.createPluginInstance( + dircopy.data.id, + //@ts-ignore + { dir: path.length > 0 ? path.join(",") : path[0] }, + ) as Promise; + if (!createdInstance) { + throw new Error("Failed to create an instance of pl-dircopy"); + } + const feed = (yield createdInstance.getFeed()) as Feed; + if (!feed) { + throw new Error("Failed to create a Feed"); + } + yield feed.put({ name: feedName }); + return { createdInstance, feed }; +} + function* downloadFolder( payload: FileBrowserFolder | FileBrowserFolderFile, username: string, @@ -88,108 +112,80 @@ function* downloadFolder( `Failed to find the pipeline. Is this '${pipelineName}' registered?`, ); } - yield setStatus(type, id, "processing", path); - const pipelines = pipelineList.getItems() as unknown as Pipeline[]; const currentPipeline = pipelines[0]; + try { + const feedName = + pipelineType === "Download Pipeline" + ? `Library Download for ${folderNameForFeed}` + : `Library Anonymize for ${folderNameForFeed}`; + const { feed, createdInstance } = yield call(createFeed, [path], feedName); + // Set Status + yield setStatus(type, id, "processing", path, "", feed); + // Add a workflow + const workflow: Workflow = yield client.createWorkflow( + currentPipeline.data.id, + //@ts-ignore + { + previous_plugin_inst_id: createdInstance.data.id, + }, + ); - const dircopy: Plugin | undefined = yield getPlugin("pl-dircopy") as Promise< - Plugin | undefined - >; - - if (!dircopy) { - throw new Error("pl-dircopy was not registered"); - } - - const createdInstance: PluginInstance = yield client.createPluginInstance( - dircopy.data.id, - //@ts-ignore - { dir: path }, - ) as Promise; - - if (!createdInstance) { - throw new Error("Failed to create an instance of pl-dircopy"); - } - - const feed = (yield createdInstance.getFeed()) as Feed; - - if (!feed) { - throw new Error("Failed to create a Feed"); - } - - const feedName = - pipelineType === "Download Pipeline" - ? `Library Download for ${folderNameForFeed}` - : `Library Anonymize for ${folderNameForFeed}`; - - yield feed.put({ name: feedName }); - - // Set Status - yield setStatus(type, id, "processing", path, "", feed); - - // Add a workflow - const workflow: Workflow = yield client.createWorkflow( - currentPipeline.data.id, - //@ts-ignore - { - previous_plugin_inst_id: createdInstance.data.id, - }, - ); - - if (!workflow) { - throw new Error("Failed to create a workflow"); - } - - const pluginInstancesList: PluginInstanceList = - yield workflow.getPluginInstances(); - const pluginInstances = pluginInstancesList.getItems() as PluginInstance[]; - if (pluginInstances.length > 0) { - const zipInstance = pluginInstances[0]; - let filePath = ""; - if (pipelineType === "Download Pipeline") { - filePath = `home/${username}/feeds/feed_${feed.data.id}/pl-dircopy_${createdInstance.data.id}/pl-pfdorun_${zipInstance.data.id}/data`; - } else { - const headerEditInstance = pluginInstances[1]; - filePath = `home/${username}/feeds/feed_${feed.data.id}/pl-dircopy_${createdInstance.data.id}/pl-dicom_headeredit_${headerEditInstance.data.id}/pl-pfdorun_${zipInstance.data.id}/data`; + if (!workflow) { + throw new Error("Failed to create a workflow"); } - - const statusResource: ItemResource = yield zipInstance.get(); - let status = statusResource.data.status; - - while (status !== "finishedSuccessfully") { - yield new Promise((resolve) => setTimeout(resolve, 5000)); // Polling every 5 seconds - const statusReq: ItemResource = yield zipInstance.get(); - status = statusReq.data.status; - - if (status === "finishedWithError" || status === "cancelled") { - throw new Error("Download failed. Please try again..."); + const pluginInstancesList: PluginInstanceList = + yield workflow.getPluginInstances(); + const pluginInstances = pluginInstancesList.getItems() as PluginInstance[]; + if (pluginInstances.length > 0) { + const zipInstance = pluginInstances[0]; + let filePath = ""; + if (pipelineType === "Download Pipeline") { + filePath = `home/${username}/feeds/feed_${feed.data.id}/pl-dircopy_${createdInstance.data.id}/pl-pfdorun_${zipInstance.data.id}/data`; + } else { + const headerEditInstance = pluginInstances[1]; + filePath = `home/${username}/feeds/feed_${feed.data.id}/pl-dircopy_${createdInstance.data.id}/pl-dicom_headeredit_${headerEditInstance.data.id}/pl-pfdorun_${zipInstance.data.id}/data`; } - } - - if (status === "finishedSuccessfully") { - const folderList: FileBrowserFolderFileList = - yield client.getFileBrowserFolders({ path: filePath }); - if (!folderList) { - throw new Error(`Failed to find the files under this path ${filePath}`); + const statusResource: ItemResource = yield zipInstance.get(); + let status = statusResource.data.status; + while (status !== "finishedSuccessfully") { + yield new Promise((resolve) => setTimeout(resolve, 5000)); // Polling every 5 seconds + const statusReq: ItemResource = yield zipInstance.get(); + status = statusReq.data.status; + if (status === "finishedWithError" || status === "cancelled") { + throw new Error("Download failed. Please try again..."); + } } + if (status === "finishedSuccessfully") { + const folderList: FileBrowserFolderFileList = + yield client.getFileBrowserFolders({ path: filePath }); + if (!folderList) { + throw new Error( + `Failed to find the files under this path ${filePath}`, + ); + } - const folders = folderList.getItems(); - - if (folders && folders.length > 0) { - const folder = folders[0]; - const files: FileBrowserFolderFileList = yield folder.getFiles(); - const fileItems = files.getItems() as FileBrowserFolderFile[]; - if (!fileItems) { - throw new Error("Failed to find the zip file"); + const folders = folderList.getItems(); + if (folders && folders.length > 0) { + const folder = folders[0]; + const files: FileBrowserFolderFileList = yield folder.getFiles(); + const fileItems = files.getItems() as FileBrowserFolderFile[]; + if (!fileItems) { + throw new Error("Failed to find the zip file"); + } + const fileToZip = fileItems[0]; + yield downloadFile(fileToZip); + } else { + throw new Error(`Failed to find a folder for this path: ${filePath}`); } - const fileToZip = fileItems[0]; - yield downloadFile(fileToZip); - } else { - throw new Error(`Failed to find a folder for this path: ${filePath}`); } } + } catch (e) { + if (e instanceof Error) { + throw new Error(e.message); + } } } @@ -358,7 +354,6 @@ function* uploadFileBatch( // We need to cancel the folder upload manually since it will upload other files in the list. // If it's an upload path error, all the files in the list are going to be errored so it's safe to cancel the entire upload. isFolder && folderController.abort(); - if (!isFolder) { // No need to manually cancel the upload for a single file as the request will fail. yield put( @@ -372,7 +367,6 @@ function* uploadFileBatch( }), ); } - break; } } @@ -444,6 +438,15 @@ function* handleAnonymize(action: IActionTypeParam) { } } +function* handleCreateFeed(action: IActionTypeParam) { + const { payload, type } = action.payload as { + payload: SelectionPayload[]; + type: string; + }; + const paths = payload.map((data) => data.path); + yield call(createFeed, paths, type); +} + function* watchDownload() { yield takeEvery(ICartActionTypes.START_DOWNLOAD, handleDownload); } @@ -456,6 +459,10 @@ function* watchAnonymize() { yield takeEvery(ICartActionTypes.START_ANONYMIZE, handleAnonymize); } +function* watchCreateFeed() { + yield takeEvery(ICartActionTypes.CREATE_FEED, handleCreateFeed); +} + function* watchCancelUpload() { yield takeEvery(ICartActionTypes.CANCEL_UPLOAD, function* (action: any) { const { id: fileName, type } = action.payload; @@ -484,5 +491,6 @@ export function* cartSaga() { fork(watchUpload), fork(watchAnonymize), fork(watchCancelUpload), + fork(watchCreateFeed), ]); } diff --git a/src/store/cart/types.ts b/src/store/cart/types.ts index b8ab20c18..0d721e16e 100644 --- a/src/store/cart/types.ts +++ b/src/store/cart/types.ts @@ -75,6 +75,7 @@ export const ICartActionTypes = keyMirror({ CLEAR_UPLOAD_STATE: null, SET_TOGGLE_CART: null, START_DOWNLOAD: null, + CREATE_FEED: null, SET_FILE_DOWNLOAD_STATUS: null, SET_FOLDER_DOWNLOAD_STATUS: null, START_UPLOAD: null, From 041daa764cb4cf7246973d64c1b829d13ee8510b Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Thu, 8 Aug 2024 16:12:15 -0400 Subject: [PATCH 094/337] feat: Cleanup --- src/components/IconContainer/index.tsx | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/components/IconContainer/index.tsx diff --git a/src/components/IconContainer/index.tsx b/src/components/IconContainer/index.tsx deleted file mode 100644 index e69de29bb..000000000 From a652a75386f6ab733ef6d2626ea35301055e0493 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Fri, 9 Aug 2024 15:15:17 -0400 Subject: [PATCH 095/337] feat: Implement copy and merge for folders and feeds. Remove the cujs dependency --- package-lock.json | 27 -- package.json | 1 - src/components/Common/index.tsx | 7 +- src/components/Feeds/FeedListView.tsx | 30 +- src/components/Feeds/utilties.ts | 129 +++++- src/components/Icons/index.tsx | 8 +- .../NewLibrary/components/ContextMenu.tsx | 18 +- .../NewLibrary/components/FolderCard.tsx | 87 ++-- .../NewLibrary/components/Operations.tsx | 375 +++++++++--------- .../NewLibrary/utils/useFeedOperations.tsx | 119 ++++++ .../NewLibrary/utils/useOperations.tsx | 12 +- src/store/cart/actions.ts | 7 +- src/store/cart/saga.ts | 32 +- src/store/cart/types.ts | 8 + src/types/index.d.ts | 1 - 15 files changed, 545 insertions(+), 316 deletions(-) create mode 100644 src/components/NewLibrary/utils/useFeedOperations.tsx diff --git a/package-lock.json b/package-lock.json index a7da9872d..fedd0e788 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,6 @@ "@types/d3-zoom": "^3.0.8", "antd": "^5.19.2", "axios": "^1.7.2", - "chris-utility": "^1.1.6", "d3-hierarchy": "^1.1.9", "d3-selection": "^3.0.0", "d3-shape": "^3.2.0", @@ -3578,17 +3577,6 @@ "node": ">= 16" } }, - "node_modules/chris-utility": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/chris-utility/-/chris-utility-1.1.6.tgz", - "integrity": "sha512-FH3cJ82yWF+ugUH6Gb9HUj3Uy6GBurULZUuHopO65Z43Zzm39kyTpQiHNez3sj+MiCfqHcPA485jOtYPsofq6g==", - "license": "ISC", - "dependencies": { - "@fnndsc/chrisapi": "^1.9.7", - "file-saver": "^2.0.5", - "webpack-merge": "^4.2.2" - } - }, "node_modules/cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -4814,12 +4802,6 @@ "integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==", "license": "MIT" }, - "node_modules/file-saver": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", - "license": "MIT" - }, "node_modules/file-selector": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", @@ -12872,15 +12854,6 @@ "node": ">=12" } }, - "node_modules/webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.15" - } - }, "node_modules/webworker-promise": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/webworker-promise/-/webworker-promise-0.5.0.tgz", diff --git a/package.json b/package.json index a34b9b518..71485d1ac 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "@types/d3-zoom": "^3.0.8", "antd": "^5.19.2", "axios": "^1.7.2", - "chris-utility": "^1.1.6", "d3-hierarchy": "^1.1.9", "d3-selection": "^3.0.0", "d3-shape": "^3.2.0", diff --git a/src/components/Common/index.tsx b/src/components/Common/index.tsx index 9edf14287..7f6241372 100644 --- a/src/components/Common/index.tsx +++ b/src/components/Common/index.tsx @@ -179,6 +179,7 @@ type AllProps = { onSearch: (search: string, searchType: string) => void; search?: string; searchType?: string; + customStyle?: React.CSSProperties; }; const FeedsQueryTypes: any = { @@ -208,7 +209,7 @@ const FeedsQueryTypes: any = { export const DataTableToolbar: React.FunctionComponent = ( props: AllProps, ) => { - const { searchType, search } = props; + const { searchType, search, customStyle } = props; const [value, setValue] = useState(search ? search : ""); const [dropdownValue, setDropdownValue] = React.useState( searchType?.toUpperCase() && FeedsQueryTypes[searchType] @@ -254,7 +255,7 @@ export const DataTableToolbar: React.FunctionComponent = ( style={{ display: "flex", justifyContent: "space-between", - padding: "0.8rem 0rem", + ...customStyle, }} >
@@ -279,7 +280,7 @@ export const DataTableToolbar: React.FunctionComponent = ( } aria-label="search" onChange={(_event, value: string) => { diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 346af808b..ee17a49bf 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -18,7 +18,6 @@ import { import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { Tooltip, Typography } from "antd"; -import { cujs } from "chris-utility"; import { format } from "date-fns"; import type React from "react"; import { useContext, useEffect, useState } from "react"; @@ -37,7 +36,11 @@ import useLongPress from "../NewLibrary/utils/longpress"; import { PipelineProvider } from "../PipelinesCopy/context"; import WrapperConnect from "../Wrapper"; import { useSearchQueryParams } from "./usePaginate"; -import { fetchFeeds, fetchPublicFeeds } from "./utilties"; +import { + fetchFeeds, + fetchPublicFeeds, + getPluginInstanceDetails, +} from "./utilties"; const { Paragraph } = Typography; @@ -76,7 +79,6 @@ const TableSelectable: React.FC = () => { enabled: type === "public", refetchOnMount: true, }); - const feedsToDisplay = type === "private" ? data?.feeds || [] : publicFeeds?.feeds || []; @@ -204,14 +206,21 @@ const TableSelectable: React.FC = () => { isSelected={type === "public"} onChange={onExampleTypeChange} /> + - - {loadingFeedState ? ( ) : feedsToDisplay.length > 0 ? ( @@ -282,8 +291,7 @@ const TableRow: React.FC = ({ queryKey: ["feedResources", feed], queryFn: async () => { try { - const res = await cujs.getPluginInstanceDetails(feed); - + const res = await getPluginInstanceDetails(feed); if (res.progress === 100 || res.error === true) { setIntervalMs(0); } diff --git a/src/components/Feeds/utilties.ts b/src/components/Feeds/utilties.ts index f47559ce7..0ab8672ac 100644 --- a/src/components/Feeds/utilties.ts +++ b/src/components/Feeds/utilties.ts @@ -2,7 +2,13 @@ import type { DrawerPayloadType, IDrawerState } from "../../store/drawer/types"; import { setDrawerState } from "../../store/drawer/actions"; import type { Dispatch } from "redux"; import ChrisAPIClient from "../../api/chrisapiclient"; -import type { Feed, PublicFeedList, FeedList } from "@fnndsc/chrisapi"; +import type { + Feed, + PublicFeedList, + FeedList, + PluginInstance, +} from "@fnndsc/chrisapi"; +import { fetchResource } from "../../api/common"; export const handleDrawerActions = ( actionType: string, @@ -114,6 +120,7 @@ export async function fetchAuthenticatedFeed(id?: string) { } return feed; } catch (error) { + // biome-ignore lint/complexity/noUselessCatch: throw error; } } @@ -131,6 +138,126 @@ export async function fetchPublicFeed(id?: string) { } throw new Error("Failed to fetch this feed..."); } catch (error) { + // biome-ignore lint/complexity/noUselessCatch: throw error; } } + +type PluginInstanceStatus = + | "cancelled" + | "finishedWithError" + | "waiting" + | "scheduled" + | "started" + | "registeringFiles" + | "finishedSuccessfully"; + +interface PluginInstanceDetails { + size: string; + progress: number; + time: string; + error: boolean; + feedProgressText: string; +} + +const LOOKUP: Record = { + cancelled: 0, + finishedWithError: 0, + waiting: 1, + scheduled: 2, + started: 3, + registeringFiles: 4, + finishedSuccessfully: 5, +}; + +export const getPluginInstanceDetails = async ( + feed: Feed, +): Promise => { + const details: PluginInstanceDetails = { + size: "", + progress: 0, + time: "", + error: false, + feedProgressText: "", + }; + + let totalSize = 0; + let totalRunTime = 0; + let error = false; + let finishedCount = 0; + let errorCount = 0; + + const params = { limit: 10000, offset: 0 }; + const fn = feed.getPluginInstances; + const boundFn = fn.bind(feed); + const { resource: pluginInstances }: { resource: PluginInstance[] } = + await fetchResource(params, boundFn); + + const totalMilestones = pluginInstances.length * LOOKUP.finishedSuccessfully; + let completedMilestones = 0; + + for (const pluginInstance of pluginInstances) { + const startTime = new Date(pluginInstance.data.start_date).getTime(); + const endTime = new Date(pluginInstance.data.end_date).getTime(); + + totalRunTime += endTime - startTime; + totalSize += pluginInstance.data.size; + + const statusMilestone = + LOOKUP[pluginInstance.data.status as PluginInstanceStatus]; + completedMilestones += statusMilestone; + + if ( + statusMilestone === LOOKUP.cancelled || + statusMilestone === LOOKUP.finishedWithError + ) { + error = true; + errorCount += 1; + continue; // Skip further checks for this instance + } + + if (pluginInstance.data.status === "finishedSuccessfully") { + finishedCount += 1; + } + } + + const feedProgressText = error + ? `${errorCount}/${pluginInstances.length} jobs failed` + : `${finishedCount}/${pluginInstances.length} jobs completed`; + + const progressPercentage = (completedMilestones / totalMilestones) * 100; + + details.size = formatBytes(totalSize, 0); + details.progress = Math.floor(progressPercentage); + details.time = convertMsToHM(totalRunTime); + details.error = error; + details.feedProgressText = feedProgressText; + + return details; +}; +export const convertMsToHM = (milliseconds: number): string => { + let seconds = Math.floor(milliseconds / 1000); + let minutes = Math.floor(seconds / 60); + const hours = Math.floor(minutes / 60); + + seconds = seconds % 60; + minutes = minutes % 60; + + return `${padTo2Digits(hours)}:${padTo2Digits(minutes)}:${padTo2Digits(seconds)}`; +}; + +export const padTo2Digits = (num: number): string => { + return num.toString().padStart(2, "0"); +}; + +export const formatBytes = (bytes: number, decimals = 2): string => { + if (bytes === 0) return "0 B"; + + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; + + const i = Math.floor(Math.log(bytes) / Math.log(k)); + + return `${Number.parseFloat((bytes / k ** i).toFixed(dm))} ${sizes[i]}`; +}; diff --git a/src/components/Icons/index.tsx b/src/components/Icons/index.tsx index 58e7e9a17..644aa52c7 100644 --- a/src/components/Icons/index.tsx +++ b/src/components/Icons/index.tsx @@ -50,11 +50,11 @@ const CartIcon = ({ ); }; -const MergeIcon = () => { +const MergeIcon = ({ className }: { className?: string }) => { return ( @@ -92,11 +92,11 @@ const ShareIcon = () => { ); }; -const DuplicateIcon = () => { +const DuplicateIcon = ({ className }: { className?: string }) => { return ( diff --git a/src/components/NewLibrary/components/ContextMenu.tsx b/src/components/NewLibrary/components/ContextMenu.tsx index ea1cceafa..76168d147 100644 --- a/src/components/NewLibrary/components/ContextMenu.tsx +++ b/src/components/NewLibrary/components/ContextMenu.tsx @@ -6,19 +6,21 @@ import { CodeBranchIcon, DeleteIcon, DownloadIcon, + DuplicateIcon, + MergeIcon, } from "../../Icons"; import { useFolderOperations } from "../utils/useOperations"; import { AddModal } from "./Operations"; -export const FolderContextMenu = ({ - children, - inValidateFolders, - folderList, -}: { +interface ContextMenuProps { children: React.ReactElement; + computedPath?: string; inValidateFolders: () => void; folderList?: FileBrowserFolderList; -}) => { +} + +export const FolderContextMenu = (props: ContextMenuProps) => { + const { children, inValidateFolders, folderList, computedPath } = props; const { modalInfo, userError, @@ -27,12 +29,14 @@ export const FolderContextMenu = ({ contextHolder, setUserErrors, setModalInfo, - } = useFolderOperations(inValidateFolders, "", folderList); + } = useFolderOperations(inValidateFolders, computedPath, folderList); const items: MenuProps["items"] = [ { key: "createFeed", label: "Create Feed", icon: }, { key: "download", label: "Download", icon: }, { key: "anonymize", label: "Anonymize", icon: }, + { key: "merge", label: "Merge", icon: }, + { key: "duplicate", label: "Copy", icon: }, { key: "delete", label: "Delete", icon: }, ]; diff --git a/src/components/NewLibrary/components/FolderCard.tsx b/src/components/NewLibrary/components/FolderCard.tsx index 494356a1d..d243ddcf5 100644 --- a/src/components/NewLibrary/components/FolderCard.tsx +++ b/src/components/NewLibrary/components/FolderCard.tsx @@ -8,15 +8,16 @@ import { Split, SplitItem, } from "@patternfly/react-core"; +import { useQuery, useQueryClient } from "@tanstack/react-query"; import { useContext } from "react"; import { Fragment } from "react/jsx-runtime"; +import ChrisAPIClient from "../../../api/chrisapiclient"; import { elipses } from "../../../api/common"; import { useTypedSelector } from "../../../store/hooks"; import { ThemeContext } from "../../DarkTheme/useTheme"; import { FolderIcon } from "../../Icons"; import useLongPress, { getBackgroundRowColor } from "../utils/longpress"; import { FolderContextMenu } from "./ContextMenu"; -import { useQueryClient } from "@tanstack/react-query"; type Pagination = { totalCount: number; @@ -49,32 +50,53 @@ export const FolderCard = ({ ); }; -export const SubFolderCard = ({ - folder, - computedPath, - handleFolderClick, -}: { +interface SubFolderCardProps { folder: FileBrowserFolder; computedPath: string; handleFolderClick: (path: string) => void; -}) => { +} + +export const SubFolderCard: React.FC = (props) => { + const { folder, computedPath, handleFolderClick } = props; const queryClient = useQueryClient(); const isDarkTheme = useContext(ThemeContext).isDarkTheme; const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { handlers } = useLongPress(); const { handleOnClick, handleOnMouseDown, handleCheckboxChange } = handlers; - const folderSplitList = folder.data.path.split("/"); - const pathName = folderSplitList[folderSplitList.length - 1]; + + const folderPathParts = folder.data.path.split("/"); + const pathName = folderPathParts[folderPathParts.length - 1]; const folderName = computedPath === "/" ? folder.data.path : pathName; - const creation_date = folder.data.creation_date; - const isSelected = - selectedPaths.length > 0 && - selectedPaths.some((payload) => payload.path === folder.data.path); + const creationDate = folder.data.creation_date; + const isSelected = selectedPaths.some( + (payload) => payload.path === folder.data.path, + ); const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); + // When users create an analysis, they have a specific name in mind. Showing the user the underlying + // folder path (e.g., feed_98) can be confusing if the analysis is titled 'Freesurfer Analysis'. + // Therefore, we perform an additional fetch to display the feed folders with their analysis titles. + + const feedMatches = folderName.match(/feed_(\d+)/); + const { data, isLoading } = useQuery({ + queryKey: ["AssociatedFeed", folder.data.path], + queryFn: async () => { + const id = feedMatches ? feedMatches[1] : null; + + if (id) { + const client = ChrisAPIClient.getClient(); + const feed = await client.getFeed(Number(id)); + if (!feed) throw new Error("Failed to fetch the feed"); + return feed.data.name; + } + return null; + }, + enabled: feedMatches?.length > 0, + }); + return ( - + { queryClient.invalidateQueries({ @@ -83,24 +105,17 @@ export const SubFolderCard = ({ }} > { - handleOnClick(e, folder, folder.data.path, "folder"); - }} - onContextMenu={(e) => { - handleOnClick(e, folder, folder.data.path, "folder"); - }} - onMouseDown={() => { - handleOnMouseDown(); - }} + onClick={(e) => handleOnClick(e, folder, folder.data.path, "folder")} + onContextMenu={(e) => + handleOnClick(e, folder, folder.data.path, "folder") + } + onMouseDown={handleOnMouseDown} isRounded > { - e.stopPropagation(); - }} - onChange={(e) => { - handleCheckboxChange(e, folder.data.path, folder, "folder"); - }} + onClick={(e) => e.stopPropagation()} + onChange={(e) => + handleCheckboxChange(e, folder.data.path, folder, "folder") + } /> ), }} @@ -133,9 +146,13 @@ export const SubFolderCard = ({ variant="link" style={{ padding: 0 }} > - {elipses(folderName, 40)} + {!data && !isLoading + ? elipses(folderName, 40) + : data + ? elipses(data, 40) + : "Fetching..."} -
{new Date(creation_date).toDateString()}
+
{new Date(creationDate).toDateString()}
diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index a943939e8..50d4e12e7 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -30,15 +30,9 @@ import { MergeIcon, } from "../../Icons"; import { useFolderOperations } from "../utils/useOperations"; +import useFeedOperations from "../utils/useFeedOperations"; -export const AddModal = ({ - isOpen, - onClose, - onSubmit, - modalTitle, - inputLabel, - indicators, -}: { +interface AddModalProps { isOpen: boolean; onClose: () => void; onSubmit: (inputValue: string) => void; @@ -49,7 +43,18 @@ export const AddModal = ({ isError: boolean; error: DefaultError | null; }; -}) => { +} + +interface OperationProps { + inValidateFolders: () => void; + computedPath?: string; + folderList?: FileBrowserFolderList; + customStyle?: React.CSSProperties; +} + +export const AddModal = (props: AddModalProps) => { + const { isOpen, onClose, onSubmit, modalTitle, inputLabel, indicators } = + props; const [inputValue, setInputValue] = useState(""); const handleClose = () => { @@ -104,200 +109,178 @@ const items = [ { key: "folderUpload", label: "Folder Upload" }, ]; -const Operations = React.forwardRef( - ( - { - inValidateFolders, - computedPath, - folderList, - }: { - inValidateFolders: () => void; - computedPath?: string; - folderList?: FileBrowserFolderList; - }, - ref, - ) => { - const dispatch = useDispatch(); - const { - modalInfo, - userError, - folderInput, - fileInput, - handleFileChange, - handleFolderChange, - handleModalSubmitMutation, - handleOperations, - contextHolder, - setUserErrors, - setModalInfo, - } = useFolderOperations(inValidateFolders, computedPath, folderList); +const Operations = React.forwardRef((props: OperationProps, ref) => { + const { inValidateFolders, computedPath, folderList, customStyle } = props; + const dispatch = useDispatch(); + const { + modalInfo, + userError, + folderInput, + fileInput, + handleFileChange, + handleFolderChange, + handleModalSubmitMutation, + handleOperations, + contextHolder, + setUserErrors, + setModalInfo, + } = useFolderOperations(inValidateFolders, computedPath, folderList); - useImperativeHandle(ref, () => ({ - triggerFileUpload: () => { - fileInput.current?.click(); - }, - triggerFolderUpload: () => { - folderInput.current?.click(); - }, - })); + useImperativeHandle(ref, () => ({ + triggerFileUpload: () => { + fileInput.current?.click(); + }, + triggerFolderUpload: () => { + folderInput.current?.click(); + }, + })); - const { selectedPaths } = useTypedSelector((state) => state.cart); - const selectedPathsCount = selectedPaths.length; + const { selectedPaths } = useTypedSelector((state) => state.cart); + const selectedPathsCount = selectedPaths.length; - const toolbarItems = ( - - {contextHolder} - - { - handleOperations(info.key); - }, - }} + const toolbarItems = ( + + {contextHolder} + + { + handleOperations(info.key); + }, + }} + > + + + {userError && ( + setUserErrors("")} + /> + )} + + {selectedPathsCount > 0 && ( + <> + - - {userError && ( - setUserErrors("")} + onClick={() => handleOperations("createFeed")} + variant="tertiary" /> - )} - - {selectedPathsCount > 0 && ( - <> - - - - - - - - - - - - - - - - - - - - - {selectedPaths.map((selection) => ( - - dispatch(removeIndividualSelection(selection)) - } - > - {getFileName(selection.path)} - - ))} - - - - )} - - ); + + + - - + + + + + + + + + + + + + + + + + +
IDAnalysisCreatedCreatorRun TimeSizeStatus
+ + + } + titleText="No results found" + headingLevel="h2" + /> + + +
); -}; +} const LoadingTable = () => { return ( diff --git a/src/components/NewLibrary/components/Cart.tsx b/src/components/NewLibrary/components/Cart.tsx index 5bbb474f1..179cef4d6 100644 --- a/src/components/NewLibrary/components/Cart.tsx +++ b/src/components/NewLibrary/components/Cart.tsx @@ -246,65 +246,67 @@ const Cart = () => { ( - {status.currentStep}
, - status.done === status.total || - status.currentStep === "UploadComplete" ? ( - - ) : status.currentStep.includes("Cancelled") || - status.currentStep.startsWith("Error") ? ( - - ) : ( -
- {status.done}/{status.total} -
- ), - , - , - ]} - > - } - title={} - /> - - )} + renderItem={([name, status]) => { + return ( + {status.currentStep}
, + status.done === status.total || + status.currentStep === "UploadComplete" ? ( + + ) : status.currentStep.includes("Cancelled") || + status.currentStep.startsWith("Error") ? ( + + ) : ( +
+ {status.done}/{status.total} +
+ ), + , + , + ]} + > + } + title={} + /> + + ); + }} /> {isEmpty(folderUploadStatus) && isEmpty(fileUploadStatus) && diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index 50d4e12e7..cc3864baa 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -11,15 +11,20 @@ import { Toolbar, ToolbarContent, ToolbarItem, + Tooltip, } from "@patternfly/react-core"; import type { DefaultError } from "@tanstack/react-query"; import { Alert, Dropdown, Spin } from "antd"; -import React, { Fragment, useImperativeHandle, useState } from "react"; +import React, { + Fragment, + useImperativeHandle, + useState, + useEffect, +} from "react"; import { useDispatch } from "react-redux"; import { getFileName } from "../../../api/common"; import { removeIndividualSelection } from "../../../store/cart/actions"; import { useTypedSelector } from "../../../store/hooks"; - import { AddIcon, ArchiveIcon, @@ -30,7 +35,6 @@ import { MergeIcon, } from "../../Icons"; import { useFolderOperations } from "../utils/useOperations"; -import useFeedOperations from "../utils/useFeedOperations"; interface AddModalProps { isOpen: boolean; @@ -135,9 +139,41 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { }, })); - const { selectedPaths } = useTypedSelector((state) => state.cart); + const { selectedPaths, fileUploadStatus, folderUploadStatus } = + useTypedSelector((state) => state.cart); const selectedPathsCount = selectedPaths.length; + useEffect(() => { + // Check if any file or folder upload has completed + const isUploadComplete = (status: any) => + status.currentStep === "Upload Complete"; + + const hasFileUploadCompleted = + Object.values(fileUploadStatus).some(isUploadComplete); + const hasFolderUploadCompleted = + Object.values(folderUploadStatus).some(isUploadComplete); + + if (hasFileUploadCompleted || hasFolderUploadCompleted) { + inValidateFolders(); + } + }, [fileUploadStatus, folderUploadStatus, inValidateFolders]); + + const renderOperationButton = ( + icon: React.ReactNode, + operationKey: string, + ariaLabel: string, + ) => ( + + - - {userError && ( - setUserErrors("")} - /> + + + {userError && ( + setUserErrors("")} + /> + )} + + {selectedPathsCount > 0 && ( + <> + + {renderOperationButton( + , + "createFeed", + "Create a new feed", + )} + + + {renderOperationButton( + , + "download", + "Download selected items", + )} + + + {renderOperationButton( + , + "anonymize", + "Anonymize selected items", + )} + + + {renderOperationButton( + , + "merge", + "Merge selected items", + )} + + + {renderOperationButton( + , + "duplicate", + "Copy selected items", + )} + + + {renderOperationButton( + , + "delete", + "Delete selected items", + )} + + + + {selectedPaths.map((selection) => ( + + dispatch(removeIndividualSelection(selection)) + } + > + {getFileName(selection.path)} + + ))} + + + )} - - {selectedPathsCount > 0 && ( - <> - - {renderOperationButton( - , - "createFeed", - "Create a new feed", - )} - - - {renderOperationButton( - , - "download", - "Download selected items", - )} - - - {renderOperationButton( - , - "anonymize", - "Anonymize selected items", - )} - - - {renderOperationButton( - , - "merge", - "Merge selected items", - )} - - - {renderOperationButton( - , - "duplicate", - "Copy selected items", - )} - - - {renderOperationButton( - , - "delete", - "Delete selected items", - )} - - - - {selectedPaths.map((selection) => ( - dispatch(removeIndividualSelection(selection))} - > - {getFileName(selection.path)} - - ))} - - - - )} - + + ), + [ + contextHolder, + userError, + selectedPaths, + selectedPathsCount, + dispatch, + handleOperations, + setUserErrors, + ], ); return ( diff --git a/src/components/NewLibrary/utils/useDeletePayload.tsx b/src/components/NewLibrary/utils/useDeletePayload.tsx index 2485f129f..9714a2829 100644 --- a/src/components/NewLibrary/utils/useDeletePayload.tsx +++ b/src/components/NewLibrary/utils/useDeletePayload.tsx @@ -54,7 +54,6 @@ const useDeletePayload = (inValidateFolders: () => void, api: any) => { message: "Deletion in progress...", key, type: "info", - description: "Testing", onClose: () => { if (mutation.isSuccess) return true; }, diff --git a/src/components/NewLibrary/utils/useFeedOperations.tsx b/src/components/NewLibrary/utils/useFeedOperations.tsx index 40c0f810c..7b3f99219 100644 --- a/src/components/NewLibrary/utils/useFeedOperations.tsx +++ b/src/components/NewLibrary/utils/useFeedOperations.tsx @@ -2,7 +2,7 @@ import { useMutation } from "@tanstack/react-query"; import { useMemo } from "react"; import ChrisAPIClient from "../../../api/chrisapiclient"; import { getFileName } from "../../../api/common"; -import { createFeed } from "../../../store/cart/saga"; +import { createFeed } from "../../../store/cart/downloadSaga"; import type { SelectionPayload } from "../../../store/cart/types"; import { useTypedSelector } from "../../../store/hooks"; diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index 60b27de36..e161600b7 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -46,7 +46,6 @@ export const useFolderOperations = ( if (fileInput.current) { fileInput.current.value = ""; } - //inValidateFolders(); }; const handleFolderChange = async (e: React.ChangeEvent) => { @@ -62,7 +61,6 @@ export const useFolderOperations = ( if (folderInput.current) { folderInput.current.value = ""; } - // inValidateFolders(); }; const handleModalSubmit = async (inputValue: string) => { diff --git a/src/store/cart/downloadSaga.ts b/src/store/cart/downloadSaga.ts new file mode 100644 index 000000000..57428115e --- /dev/null +++ b/src/store/cart/downloadSaga.ts @@ -0,0 +1,214 @@ +import type { + Feed, + FileBrowserFolder, + FileBrowserFolderFile, + FileBrowserFolderFileList, + ItemResource, + Pipeline, + PipelineList, + Plugin, + PluginInstance, + PluginInstanceList, + Workflow, +} from "@fnndsc/chrisapi"; +import { call, fork, put, takeEvery } from "redux-saga/effects"; +import ChrisAPIClient from "../../api/chrisapiclient"; +import { getFileName } from "../../api/common"; +import type { IActionTypeParam } from "../../api/model"; +import { getPlugin } from "../../components/CreateFeed/createFeedHelper"; +import { downloadFile } from "../hooks"; +import { setFileDownloadStatus, setFolderDownloadStatus } from "./actions"; +import { ICartActionTypes, type SelectionPayload } from "./types"; + +export function* setStatus( + type: string, + id: number, + step: "started" | "processing" | "finished" | "cancelled", + fileName: string, + error?: string, + feed?: Feed, +) { + if (type === "file") { + yield put(setFileDownloadStatus({ id, step, fileName, error })); + } else { + yield put(setFolderDownloadStatus({ id, step, fileName, error, feed })); + } +} + +const isFileBrowserFolder = (payload: any): payload is FileBrowserFolder => { + return (payload as FileBrowserFolder).data?.path !== undefined; +}; + +export async function createFeed(path: string[], feedName: string) { + const client = ChrisAPIClient.getClient(); + const dircopy: Plugin | undefined = (await getPlugin("pl-dircopy")) as + | Plugin + | undefined; + + if (!dircopy) { + throw new Error("pl-dircopy was not registered"); + } + const createdInstance: PluginInstance = (await client.createPluginInstance( + dircopy.data.id, + //@ts-ignore + { dir: path.length > 0 ? path.join(",") : path[0] }, + )) as PluginInstance; + + if (!createdInstance) { + throw new Error("Failed to create an instance of pl-dircopy"); + } + const feed = (await createdInstance.getFeed()) as Feed; + if (!feed) { + throw new Error("Failed to create a Feed"); + } + await feed.put({ name: feedName }); + return { createdInstance, feed }; +} + +function* downloadFolder( + payload: FileBrowserFolder | FileBrowserFolderFile, + username: string, + pipelineType: string, +) { + const { id } = payload.data; + const isFolder = isFileBrowserFolder(payload); + const path = isFolder ? payload.data.path : payload.data.fname; + const type = isFolder ? "folder" : "file"; + const folderNameForFeed = getFileName(path); + const client = ChrisAPIClient.getClient(); + + const pipelineName = + pipelineType === "Download Pipeline" + ? "zip v20240311" + : "DICOM anonymization simple v20230926"; + + const pipelineList: PipelineList = yield client.getPipelines({ + name: pipelineName, + }); + + if (!pipelineList || !pipelineList.data) { + throw new Error( + `Failed to find the pipeline. Is this '${pipelineName}' registered?`, + ); + } + yield setStatus(type, id, "processing", path); + const pipelines = pipelineList.getItems() as unknown as Pipeline[]; + const currentPipeline = pipelines[0]; + try { + const feedName = + pipelineType === "Download Pipeline" + ? `Library Download for ${folderNameForFeed}` + : `Library Anonymize for ${folderNameForFeed}`; + const { feed, createdInstance } = yield call(createFeed, [path], feedName); + // Set Status + yield setStatus(type, id, "processing", path, "", feed); + // Add a workflow + const workflow: Workflow = yield client.createWorkflow( + currentPipeline.data.id, + //@ts-ignore + { + previous_plugin_inst_id: createdInstance.data.id, + }, + ); + + if (!workflow) { + throw new Error("Failed to create a workflow"); + } + const pluginInstancesList: PluginInstanceList = + yield workflow.getPluginInstances(); + const pluginInstances = pluginInstancesList.getItems() as PluginInstance[]; + if (pluginInstances.length > 0) { + const zipInstance = pluginInstances[0]; + let filePath = ""; + if (pipelineType === "Download Pipeline") { + filePath = `home/${username}/feeds/feed_${feed.data.id}/pl-dircopy_${createdInstance.data.id}/pl-pfdorun_${zipInstance.data.id}/data`; + } else { + const headerEditInstance = pluginInstances[1]; + filePath = `home/${username}/feeds/feed_${feed.data.id}/pl-dircopy_${createdInstance.data.id}/pl-dicom_headeredit_${headerEditInstance.data.id}/pl-pfdorun_${zipInstance.data.id}/data`; + } + + const statusResource: ItemResource = yield zipInstance.get(); + let status = statusResource.data.status; + while (status !== "finishedSuccessfully") { + yield new Promise((resolve) => setTimeout(resolve, 5000)); // Polling every 5 seconds + const statusReq: ItemResource = yield zipInstance.get(); + status = statusReq.data.status; + if (status === "finishedWithError" || status === "cancelled") { + throw new Error("Download failed. Please try again..."); + } + } + if (status === "finishedSuccessfully") { + const folderList: FileBrowserFolderFileList = + yield client.getFileBrowserFolders({ path: filePath }); + if (!folderList) { + throw new Error( + `Failed to find the files under this path ${filePath}`, + ); + } + + const folders = folderList.getItems(); + if (folders && folders.length > 0) { + const folder = folders[0]; + const files: FileBrowserFolderFileList = yield folder.getFiles(); + const fileItems = files.getItems() as FileBrowserFolderFile[]; + if (!fileItems) { + throw new Error("Failed to find the zip file"); + } + const fileToZip = fileItems[0]; + yield downloadFile(fileToZip); + } else { + throw new Error(`Failed to find a folder for this path: ${filePath}`); + } + } + } + } catch (e) { + if (e instanceof Error) { + throw new Error(e.message); + } + } +} + +function* handleIndividualDownload( + path: SelectionPayload, + username: string, + pipelineType: string, +) { + const { type, payload } = path; + const { id } = payload.data; + const pathForState = type === "file" ? payload.data.fname : payload.data.path; + + try { + yield call(setStatus, type, id, "started", pathForState); + if (type === "file" && pipelineType === "Download Pipeline") { + yield call(downloadFile, payload as FileBrowserFolderFile); + } else { + yield call(downloadFolder, payload, username, pipelineType); + } + yield call(setStatus, type, id, "finished", pathForState); + } catch (error) { + const errMsg = error instanceof Error ? error.message : "Unknown error"; + yield call(setStatus, type, id, "cancelled", pathForState, errMsg); + } +} + +function* handleDownload(action: IActionTypeParam) { + const { paths, username } = action.payload; + for (const path of paths) { + yield fork(handleIndividualDownload, path, username, "Download Pipeline"); + } +} + +function* handleAnonymize(action: IActionTypeParam) { + const { paths, username } = action.payload; + for (const path of paths) { + yield fork(handleIndividualDownload, path, username, "Anonymize Pipeline"); + } +} + +export function* watchAnonymize() { + yield takeEvery(ICartActionTypes.START_ANONYMIZE, handleAnonymize); +} + +export function* watchDownload() { + yield takeEvery(ICartActionTypes.START_DOWNLOAD, handleDownload); +} diff --git a/src/store/cart/saga.ts b/src/store/cart/saga.ts index a56ebc7cd..40318fada 100644 --- a/src/store/cart/saga.ts +++ b/src/store/cart/saga.ts @@ -1,478 +1,6 @@ -import type { - Feed, - FileBrowserFolder, - FileBrowserFolderFile, - FileBrowserFolderFileList, - ItemResource, - Pipeline, - PipelineList, - Plugin, - PluginInstance, - PluginInstanceList, - Workflow, -} from "@fnndsc/chrisapi"; -import type Client from "@fnndsc/chrisapi"; -import axios, { type AxiosProgressEvent } from "axios"; -import { chunk, isEmpty } from "lodash"; -import { END, type EventChannel, eventChannel } from "redux-saga"; -import { - all, - call, - fork, - put, - take, - takeEvery, - select, -} from "redux-saga/effects"; -import ChrisAPIClient from "../../api/chrisapiclient"; -import { getFileName } from "../../api/common"; -import type { IActionTypeParam } from "../../api/model"; -import { getPlugin } from "../../components/CreateFeed/createFeedHelper"; -import { downloadFile } from "../hooks"; -import { - setFileDownloadStatus, - setFileUploadStatus, - setFolderDownloadStatus, - setFolderUploadStatus, -} from "./actions"; -import { - type FileUploadObject, - type FolderUploadObject, - ICartActionTypes, - type SelectionPayload, - type UploadPayload, -} from "./types"; - -function* setStatus( - type: string, - id: number, - step: "started" | "processing" | "finished" | "cancelled", - fileName: string, - error?: string, - feed?: Feed, -) { - if (type === "file") { - yield put(setFileDownloadStatus({ id, step, fileName, error })); - } else { - yield put(setFolderDownloadStatus({ id, step, fileName, error, feed })); - } -} - -const isFileBrowserFolder = (payload: any): payload is FileBrowserFolder => { - return (payload as FileBrowserFolder).data?.path !== undefined; -}; - -export async function createFeed(path: string[], feedName: string) { - const client = ChrisAPIClient.getClient(); - const dircopy: Plugin | undefined = (await getPlugin("pl-dircopy")) as - | Plugin - | undefined; - - if (!dircopy) { - throw new Error("pl-dircopy was not registered"); - } - const createdInstance: PluginInstance = (await client.createPluginInstance( - dircopy.data.id, - //@ts-ignore - { dir: path.length > 0 ? path.join(",") : path[0] }, - )) as PluginInstance; - - if (!createdInstance) { - throw new Error("Failed to create an instance of pl-dircopy"); - } - const feed = (await createdInstance.getFeed()) as Feed; - if (!feed) { - throw new Error("Failed to create a Feed"); - } - await feed.put({ name: feedName }); - return { createdInstance, feed }; -} - -function* downloadFolder( - payload: FileBrowserFolder | FileBrowserFolderFile, - username: string, - pipelineType: string, -) { - const { id } = payload.data; - const isFolder = isFileBrowserFolder(payload); - const path = isFolder ? payload.data.path : payload.data.fname; - const type = isFolder ? "folder" : "file"; - const folderNameForFeed = getFileName(path); - const client = ChrisAPIClient.getClient(); - - const pipelineName = - pipelineType === "Download Pipeline" - ? "zip v20240311" - : "DICOM anonymization simple v20230926"; - - const pipelineList: PipelineList = yield client.getPipelines({ - name: pipelineName, - }); - - if (!pipelineList || !pipelineList.data) { - throw new Error( - `Failed to find the pipeline. Is this '${pipelineName}' registered?`, - ); - } - yield setStatus(type, id, "processing", path); - const pipelines = pipelineList.getItems() as unknown as Pipeline[]; - const currentPipeline = pipelines[0]; - try { - const feedName = - pipelineType === "Download Pipeline" - ? `Library Download for ${folderNameForFeed}` - : `Library Anonymize for ${folderNameForFeed}`; - const { feed, createdInstance } = yield call(createFeed, [path], feedName); - // Set Status - yield setStatus(type, id, "processing", path, "", feed); - // Add a workflow - const workflow: Workflow = yield client.createWorkflow( - currentPipeline.data.id, - //@ts-ignore - { - previous_plugin_inst_id: createdInstance.data.id, - }, - ); - - if (!workflow) { - throw new Error("Failed to create a workflow"); - } - const pluginInstancesList: PluginInstanceList = - yield workflow.getPluginInstances(); - const pluginInstances = pluginInstancesList.getItems() as PluginInstance[]; - if (pluginInstances.length > 0) { - const zipInstance = pluginInstances[0]; - let filePath = ""; - if (pipelineType === "Download Pipeline") { - filePath = `home/${username}/feeds/feed_${feed.data.id}/pl-dircopy_${createdInstance.data.id}/pl-pfdorun_${zipInstance.data.id}/data`; - } else { - const headerEditInstance = pluginInstances[1]; - filePath = `home/${username}/feeds/feed_${feed.data.id}/pl-dircopy_${createdInstance.data.id}/pl-dicom_headeredit_${headerEditInstance.data.id}/pl-pfdorun_${zipInstance.data.id}/data`; - } - - const statusResource: ItemResource = yield zipInstance.get(); - let status = statusResource.data.status; - while (status !== "finishedSuccessfully") { - yield new Promise((resolve) => setTimeout(resolve, 5000)); // Polling every 5 seconds - const statusReq: ItemResource = yield zipInstance.get(); - status = statusReq.data.status; - if (status === "finishedWithError" || status === "cancelled") { - throw new Error("Download failed. Please try again..."); - } - } - if (status === "finishedSuccessfully") { - const folderList: FileBrowserFolderFileList = - yield client.getFileBrowserFolders({ path: filePath }); - if (!folderList) { - throw new Error( - `Failed to find the files under this path ${filePath}`, - ); - } - - const folders = folderList.getItems(); - if (folders && folders.length > 0) { - const folder = folders[0]; - const files: FileBrowserFolderFileList = yield folder.getFiles(); - const fileItems = files.getItems() as FileBrowserFolderFile[]; - if (!fileItems) { - throw new Error("Failed to find the zip file"); - } - const fileToZip = fileItems[0]; - yield downloadFile(fileToZip); - } else { - throw new Error(`Failed to find a folder for this path: ${filePath}`); - } - } - } - } catch (e) { - if (e instanceof Error) { - throw new Error(e.message); - } - } -} - -function* handleIndividualDownload( - path: SelectionPayload, - username: string, - pipelineType: string, -) { - const { type, payload } = path; - const { id } = payload.data; - - const pathForState = type === "file" ? payload.data.fname : payload.data.path; - - try { - yield setStatus(type, id, "started", pathForState); - if (type === "file" && pipelineType === "Download Pipeline") { - yield downloadFile(payload as FileBrowserFolderFile); - } else { - yield downloadFolder( - payload as FileBrowserFolder, - username, - pipelineType, - ); - } - yield setStatus(type, id, "finished", pathForState); - } catch (error) { - const errMsg = error instanceof Error ? error.message : "Uknown error"; - yield setStatus(type, id, "cancelled", pathForState, errMsg); - } -} - -function* handleDownload(action: IActionTypeParam) { - const { paths, username } = action.payload; - - for (const path of paths) { - yield fork(handleIndividualDownload, path, username, "Download Pipeline"); - } -} - -function createUploadChannel(config: any) { - return eventChannel((emitter) => { - const onUploadProgress = (progressEvent: AxiosProgressEvent) => { - if (progressEvent.progress) { - const progress = Math.round(progressEvent.progress * 100); - emitter({ progress }); - } - }; - - const source = axios.CancelToken.source(); - - const axiosConfig = { - headers: config.headers, - onUploadProgress, - cancelToken: source.token, - ...config, - }; - - const cancelHandler = () => { - source.cancel("Operation canceled by the user."); - }; - axiosConfig.signal.addEventListener("abort", cancelHandler); - - axios - .post(config.url, config.data, axiosConfig) - .then((response) => { - const progress = 100; - emitter({ progress, response }); - emitter(END); - }) - .catch((error) => { - let message = "Unexpected Error while uploading the file"; - - if (axios.isCancel(error)) { - emitter({ cancelled: true }); - } else if (axios.isAxiosError(error)) { - message = !isEmpty(error.response?.data.upload_path) - ? error.response?.data.upload_path[0] - : error.message; - } - emitter({ error: message }); - emitter(END); - }); - - return () => { - axiosConfig.signal.removeEventListener("abort", cancelHandler); - }; - }); -} - -function* uploadFileBatch( - client: Client, - files: File[], - currentPath: string, - isFolder: boolean, - batchSize: number, -) { - const url = `${import.meta.env.VITE_CHRIS_UI_URL}userfiles/`; - const batches = chunk(files, batchSize); - const totalFiles = files.length; - let uploadedFilesCount = 0; - let cancelledUploads = false; - let errorOccurred = false; - let lastError = ""; - - const folderController = new AbortController(); - for (const batch of batches) { - yield all( - batch.map((file) => { - const formData = new FormData(); - const name = isFolder ? file.webkitRelativePath : file.name; - const path = `${currentPath}/${name}`; - - formData.append("upload_path", path); - formData.append("fname", file, name); - - const controller = new AbortController(); - const config = { - headers: { Authorization: `Token ${client.auth.token}` }, - signal: isFolder ? folderController.signal : controller.signal, - url, - data: formData, - }; - - const uploadChannel: EventChannel = createUploadChannel(config); - - return call(function* () { - try { - while (true) { - const { progress, response, error, cancelled } = - yield take(uploadChannel); - - if (cancelled) { - cancelledUploads = true; - yield put( - isFolder - ? setFolderUploadStatus({ - step: errorOccurred - ? `Error: ${lastError}` - : "Upload Cancelled", - fileName: name.split("/")[0], - totalCount: totalFiles, - currentCount: uploadedFilesCount, - controller: null, - path: currentPath, - type: "folder", - }) - : setFileUploadStatus({ - step: errorOccurred - ? `Error: ${lastError}` - : "Upload Cancelled", - fileName: name, - progress: progress || 0, - controller: null, - path: currentPath, - type: "file", - }), - ); - break; - } - - if (error) { - if (error.includes("Invalid path.")) { - errorOccurred = true; - lastError = error; // Store the last error message - - // We need to cancel the folder upload manually since it will upload other files in the list. - // If it's an upload path error, all the files in the list are going to be errored so it's safe to cancel the entire upload. - isFolder && folderController.abort(); - if (!isFolder) { - // No need to manually cancel the upload for a single file as the request will fail. - yield put( - setFileUploadStatus({ - step: `Error: ${lastError}`, - fileName: name, - progress: progress || 0, - controller: null, - path: currentPath, - type: "file", - }), - ); - } - break; - } - } - - if (progress !== undefined && !isFolder && !cancelled && !error) { - yield put( - setFileUploadStatus({ - step: - progress === 100 && response - ? "Upload Complete" - : "Uploading...", - fileName: name, - progress: progress, - controller, - path: currentPath, - type: "file", - }), - ); - } - - if (response || error) { - break; - } - } - } finally { - uploadChannel.close(); - } - }); - }), - ); - - if (!cancelledUploads) { - uploadedFilesCount += batch.length; - - if (isFolder) { - const name = files[0].webkitRelativePath; - const fileName = name.split("/")[0]; - yield put( - setFolderUploadStatus({ - step: - uploadedFilesCount === totalFiles - ? "Upload Complete" - : "Uploading...", - fileName: fileName, - totalCount: totalFiles, - currentCount: uploadedFilesCount, - controller: folderController, - path: currentPath, - type: "folder", - }), - ); - } - } - } -} - -function* handleUpload(action: IActionTypeParam) { - const { files, isFolder, currentPath }: UploadPayload = action.payload; - const client = ChrisAPIClient.getClient(); - const batchSize = files.length > 500 ? 100 : 50; // Adjust the batch size as needed - - yield call(uploadFileBatch, client, files, currentPath, isFolder, batchSize); -} - -function* handleAnonymize(action: IActionTypeParam) { - const { paths, username } = action.payload; - for (const path of paths) { - yield fork(handleIndividualDownload, path, username, "Anonymize Pipeline"); - } -} - -function* watchDownload() { - yield takeEvery(ICartActionTypes.START_DOWNLOAD, handleDownload); -} - -function* watchUpload() { - yield takeEvery(ICartActionTypes.START_UPLOAD, handleUpload); -} - -function* watchAnonymize() { - yield takeEvery(ICartActionTypes.START_ANONYMIZE, handleAnonymize); -} - -function* watchCancelUpload() { - yield takeEvery(ICartActionTypes.CANCEL_UPLOAD, function* (action: any) { - const { id: fileName, type } = action.payload; - - if (type === "folder") { - const folderStatus: FolderUploadObject = yield select( - (state) => state.cart.folderUploadStatus[fileName], - ); - if (folderStatus?.controller) { - folderStatus.controller.abort(); - } - } else { - const fileStatus: FileUploadObject = yield select( - (state) => state.cart.fileUploadStatus[fileName], - ); - if (fileStatus?.controller) { - fileStatus.controller.abort(); - } - } - }); -} +import { all, fork } from "redux-saga/effects"; +import { watchAnonymize, watchDownload } from "./downloadSaga"; +import { watchCancelUpload, watchUpload } from "./uploadSaga"; export function* cartSaga() { yield all([ diff --git a/src/store/cart/uploadSaga.ts b/src/store/cart/uploadSaga.ts new file mode 100644 index 000000000..1da43596b --- /dev/null +++ b/src/store/cart/uploadSaga.ts @@ -0,0 +1,246 @@ +import type Client from "@fnndsc/chrisapi"; +import axios, { type AxiosProgressEvent } from "axios"; +import { chunk, isEmpty } from "lodash"; +import { END, type EventChannel, eventChannel } from "redux-saga"; +import { all, call, put, select, take, takeEvery } from "redux-saga/effects"; +import ChrisAPIClient from "../../api/chrisapiclient"; +import type { IActionTypeParam } from "../../api/model"; +import { setFileUploadStatus, setFolderUploadStatus } from "./actions"; +import { + type FileUploadObject, + type FolderUploadObject, + ICartActionTypes, + type UploadPayload, +} from "./types"; + +function createUploadChannel(config: any) { + return eventChannel((emitter) => { + const onUploadProgress = (progressEvent: AxiosProgressEvent) => { + if (progressEvent.progress) { + const progress = Math.round(progressEvent.progress * 100); + emitter({ progress }); + } + }; + + const source = axios.CancelToken.source(); + + const axiosConfig = { + headers: config.headers, + onUploadProgress, + cancelToken: source.token, + ...config, + }; + + const cancelHandler = () => { + source.cancel("Operation canceled by the user."); + }; + axiosConfig.signal.addEventListener("abort", cancelHandler); + + axios + .post(config.url, config.data, axiosConfig) + .then((response) => { + const progress = 100; + emitter({ progress, response }); + emitter(END); + }) + .catch((error) => { + let message = "Unexpected Error while uploading the file"; + + if (axios.isCancel(error)) { + emitter({ cancelled: true }); + } else if (axios.isAxiosError(error)) { + message = !isEmpty(error.response?.data.upload_path) + ? error.response?.data.upload_path[0] + : error.message; + } + emitter({ error: message }); + emitter(END); + }); + + return () => { + axiosConfig.signal.removeEventListener("abort", cancelHandler); + }; + }); +} + +function* uploadFileBatch( + client: Client, + files: File[], + currentPath: string, + isFolder: boolean, + batchSize: number, +) { + const url = `${import.meta.env.VITE_CHRIS_UI_URL}userfiles/`; + const batches = chunk(files, batchSize); + const totalFiles = files.length; + let uploadedFilesCount = 0; + let cancelledUploads = false; + let errorOccurred = false; + let lastError = ""; + + const folderController = new AbortController(); + for (const batch of batches) { + yield all( + batch.map((file) => { + const formData = new FormData(); + const name = isFolder ? file.webkitRelativePath : file.name; + const path = `${currentPath}/${name}`; + + formData.append("upload_path", path); + formData.append("fname", file, name); + + const controller = new AbortController(); + const config = { + headers: { Authorization: `Token ${client.auth.token}` }, + signal: isFolder ? folderController.signal : controller.signal, + url, + data: formData, + }; + + const uploadChannel: EventChannel = createUploadChannel(config); + + return call(function* () { + try { + while (true) { + const { progress, response, error, cancelled } = + yield take(uploadChannel); + + if (cancelled) { + cancelledUploads = true; + yield put( + isFolder + ? setFolderUploadStatus({ + step: errorOccurred + ? `Error: ${lastError}` + : "Upload Cancelled", + fileName: name.split("/")[0], + totalCount: totalFiles, + currentCount: uploadedFilesCount, + controller: null, + path: currentPath, + type: "folder", + }) + : setFileUploadStatus({ + step: errorOccurred + ? `Error: ${lastError}` + : "Upload Cancelled", + fileName: name, + progress: progress || 0, + controller: null, + path: currentPath, + type: "file", + }), + ); + break; + } + + if (error) { + if (error.includes("Invalid path.")) { + errorOccurred = true; + lastError = error; // Store the last error message + + // We need to cancel the folder upload manually since it will upload other files in the list. + // If it's an upload path error, all the files in the list are going to be errored so it's safe to cancel the entire upload. + isFolder && folderController.abort(); + if (!isFolder) { + // No need to manually cancel the upload for a single file as the request will fail. + yield put( + setFileUploadStatus({ + step: `Error: ${lastError}`, + fileName: name, + progress: progress || 0, + controller: null, + path: currentPath, + type: "file", + }), + ); + } + break; + } + } + + if (progress !== undefined && !isFolder && !cancelled && !error) { + yield put( + setFileUploadStatus({ + step: + progress === 100 && response + ? "Upload Complete" + : "Uploading...", + fileName: name, + progress: progress, + controller, + path: currentPath, + type: "file", + }), + ); + } + + if (response || error) { + break; + } + } + } finally { + uploadChannel.close(); + } + }); + }), + ); + + if (!cancelledUploads) { + uploadedFilesCount += batch.length; + + if (isFolder) { + const name = files[0].webkitRelativePath; + const fileName = name.split("/")[0]; + yield put( + setFolderUploadStatus({ + step: + uploadedFilesCount === totalFiles + ? "Upload Complete" + : "Uploading...", + fileName: fileName, + totalCount: totalFiles, + currentCount: uploadedFilesCount, + controller: folderController, + path: currentPath, + type: "folder", + }), + ); + } + } + } +} + +function* handleUpload(action: IActionTypeParam) { + const { files, isFolder, currentPath }: UploadPayload = action.payload; + const client = ChrisAPIClient.getClient(); + const batchSize = files.length > 500 ? 100 : 50; // Adjust the batch size as needed + + yield call(uploadFileBatch, client, files, currentPath, isFolder, batchSize); +} + +export function* watchUpload() { + yield takeEvery(ICartActionTypes.START_UPLOAD, handleUpload); +} + +export function* watchCancelUpload() { + yield takeEvery(ICartActionTypes.CANCEL_UPLOAD, function* (action: any) { + const { id: fileName, type } = action.payload; + + if (type === "folder") { + const folderStatus: FolderUploadObject = yield select( + (state) => state.cart.folderUploadStatus[fileName], + ); + if (folderStatus?.controller) { + folderStatus.controller.abort(); + } + } else { + const fileStatus: FileUploadObject = yield select( + (state) => state.cart.fileUploadStatus[fileName], + ); + if (fileStatus?.controller) { + fileStatus.controller.abort(); + } + } + }); +} From 44cac328d72b9e9a99d4539bd3622ee494a675d1 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 12 Aug 2024 10:15:14 -0400 Subject: [PATCH 099/337] feat: Update the progress tracking for folder uploads --- src/components/Feeds/FeedListView.tsx | 2 -- src/store/cart/uploadSaga.ts | 7 ++++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 85b6f5cd6..21878b0a5 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -67,7 +67,6 @@ const TableSelectable: React.FC = () => { queryKey: ["feeds", perPage, page, type, search, searchType], queryFn: () => fetchFeeds(searchFolderData), enabled: type === "private", - refetchOnMount: true, }); const { @@ -78,7 +77,6 @@ const TableSelectable: React.FC = () => { queryKey: ["publicFeeds", perPage, page, type, search, searchType], queryFn: () => fetchPublicFeeds(searchFolderData), enabled: type === "public", - refetchOnMount: true, }); const feedsToDisplay = type === "private" ? data?.feeds || [] : publicFeeds?.feeds || []; diff --git a/src/store/cart/uploadSaga.ts b/src/store/cart/uploadSaga.ts index 1da43596b..13872c2ff 100644 --- a/src/store/cart/uploadSaga.ts +++ b/src/store/cart/uploadSaga.ts @@ -71,7 +71,9 @@ function* uploadFileBatch( batchSize: number, ) { const url = `${import.meta.env.VITE_CHRIS_UI_URL}userfiles/`; - const batches = chunk(files, batchSize); + const firstBatch = files.slice(0, 1); // First batch with 1 file + const remainingBatches = chunk(files.slice(1), batchSize); // Remaining batches + const batches = [firstBatch, ...remainingBatches]; const totalFiles = files.length; let uploadedFilesCount = 0; let cancelledUploads = false; @@ -139,8 +141,7 @@ function* uploadFileBatch( errorOccurred = true; lastError = error; // Store the last error message - // We need to cancel the folder upload manually since it will upload other files in the list. - // If it's an upload path error, all the files in the list are going to be errored so it's safe to cancel the entire upload. + // We need to cancel the folder upload manually since it will upload other files in the list and they will all error out due to the path being invalid path isFolder && folderController.abort(); if (!isFolder) { // No need to manually cancel the upload for a single file as the request will fail. From 7d02a0072394bb833a9ba5a9b3aaed16044a5581 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 12 Aug 2024 11:52:02 -0400 Subject: [PATCH 100/337] feat: Organize antd imports for easy replacement in the future --- src/components/AddNode/AddNode.tsx | 4 +- src/components/AddNode/BasicConfiguration.tsx | 2 +- src/components/AddNode/ComputeEnvironment.tsx | 6 +- src/components/AddNode/GuidedConfig.tsx | 2 +- src/components/AddPipeline/AddPipeline.tsx | 20 +- src/components/AddTsNode/ChooseConfig.tsx | 41 --- src/components/AddTsNode/ConfigureJoin.tsx | 106 ------- src/components/AddTsNode/Footer.tsx | 67 ----- src/components/AddTsNode/ParentContainer.tsx | 263 ------------------ src/components/AddTsNode/Review.tsx | 62 ----- src/components/AddTsNode/Split.tsx | 36 --- src/components/AddTsNode/graph-node.css | 11 - src/components/AddTsNode/index.tsx | 70 ----- src/components/AddTsNode/utils.ts | 21 -- src/components/Antd/index.tsx | 21 ++ src/components/ComputePage/index.tsx | 10 +- src/components/CreateFeed/ChooseConfig.tsx | 2 +- src/components/CreateFeed/ChrisFileSelect.tsx | 2 +- src/components/CreateFeed/CreateFeed.tsx | 2 +- src/components/CreateFeed/DataPacks.tsx | 18 +- src/components/CreateFeed/HelperComponent.tsx | 2 +- src/components/CreateFeed/LocalFileUpload.tsx | 2 +- src/components/Dashboard/index.tsx | 2 +- src/components/DeleteNode/index.tsx | 4 +- src/components/FeedDetails/index.tsx | 6 +- .../FeedOutputBrowser/FileBrowser.tsx | 4 +- src/components/FeedTree/DropdownMenu.tsx | 2 +- src/components/FeedTree/FeedTree.tsx | 23 +- src/components/FeedTree/Node.tsx | 24 +- src/components/FeedTree/ParentComponent.tsx | 12 +- src/components/FeedTree/data.ts | 6 +- src/components/Feeds/FeedListView.tsx | 9 +- src/components/Feeds/FeedView.tsx | 15 +- src/components/NewLibrary/components/Cart.tsx | 2 +- .../NewLibrary/components/ContextMenu.tsx | 2 +- .../NewLibrary/components/FileCard.tsx | 2 +- .../NewLibrary/components/Operations.tsx | 2 +- src/components/NewLibrary/index.tsx | 2 +- .../NewLibrary/utils/useOperations.tsx | 2 +- .../content/infoForPageHeader.tsx | 4 +- src/components/NodeDetails/PluginTitle.tsx | 3 +- src/components/NodeDetails/Status.tsx | 2 +- .../Pacs/components/PatientCard.tsx | 2 +- src/components/Pacs/components/SeriesCard.tsx | 2 +- .../Pacs/components/SettingsComponents.tsx | 2 +- src/components/Pacs/index.tsx | 2 +- .../PipelinesCopy/CodeBlockComponent.tsx | 4 +- .../ComputeListForSingleCompute.tsx | 4 +- src/components/PipelinesCopy/ListCompute.tsx | 5 +- src/components/PipelinesCopy/NodeData.tsx | 6 +- .../PipelinesCopy/PipelineUpload.tsx | 2 +- .../PipelinesCopy/SelectAllCompute.tsx | 6 +- src/components/PipelinesCopy/TitleChange.tsx | 12 +- src/components/PipelinesCopy/index.tsx | 2 +- src/components/PluginCatalog/index.tsx | 2 +- src/components/PluginInstall/index.tsx | 2 +- src/components/Preview/FileDetailView.tsx | 2 +- src/components/Preview/HelperComponent.tsx | 8 +- .../Preview/displays/CatchallDisplay.tsx | 2 +- .../SinglePlugin/PluginCatalogComponents.tsx | 2 +- src/components/SinglePlugin/index.tsx | 2 +- src/components/Store/index.tsx | 2 +- src/components/Wrapper/CartNotify.tsx | 2 +- src/store/root/applicationState.ts | 3 +- src/store/root/rootReducer.ts | 2 - src/store/tsplugins/actions.ts | 13 - src/store/tsplugins/reducer.ts | 56 ---- src/store/tsplugins/types.ts | 16 -- tsconfig.app.json | 26 ++ tsconfig.json | 28 +- tsconfig.node.json | 19 +- 71 files changed, 179 insertions(+), 955 deletions(-) delete mode 100644 src/components/AddTsNode/ChooseConfig.tsx delete mode 100644 src/components/AddTsNode/ConfigureJoin.tsx delete mode 100644 src/components/AddTsNode/Footer.tsx delete mode 100644 src/components/AddTsNode/ParentContainer.tsx delete mode 100644 src/components/AddTsNode/Review.tsx delete mode 100644 src/components/AddTsNode/Split.tsx delete mode 100644 src/components/AddTsNode/graph-node.css delete mode 100644 src/components/AddTsNode/index.tsx delete mode 100644 src/components/AddTsNode/utils.ts create mode 100644 src/components/Antd/index.tsx delete mode 100644 src/store/tsplugins/actions.ts delete mode 100644 src/store/tsplugins/reducer.ts delete mode 100644 src/store/tsplugins/types.ts create mode 100644 tsconfig.app.json diff --git a/src/components/AddNode/AddNode.tsx b/src/components/AddNode/AddNode.tsx index 2fe478615..6db204540 100644 --- a/src/components/AddNode/AddNode.tsx +++ b/src/components/AddNode/AddNode.tsx @@ -16,10 +16,10 @@ import { getRequiredObject } from "../CreateFeed/createFeedHelper"; import BasicConfiguration from "./BasicConfiguration"; import GuidedConfig from "./GuidedConfig"; import "./add-node.css"; -import { Alert } from "antd"; +import { useTypedSelector } from "../../store/hooks"; +import { Alert } from "../Antd"; import { AddNodeContext } from "./context"; import { Types } from "./types"; -import { useTypedSelector } from "../../store/hooks"; const AddNode: React.FC = () => { const dispatch = useDispatch(); diff --git a/src/components/AddNode/BasicConfiguration.tsx b/src/components/AddNode/BasicConfiguration.tsx index 46179ec82..57ae6d783 100644 --- a/src/components/AddNode/BasicConfiguration.tsx +++ b/src/components/AddNode/BasicConfiguration.tsx @@ -9,11 +9,11 @@ import { Title, } from "@patternfly/react-core"; import { useQuery } from "@tanstack/react-query"; -import { Alert } from "antd"; import type React from "react"; import { useCallback, useContext, useRef, useState } from "react"; import ChrisAPIClient from "../../api/chrisapiclient"; import { fetchResource } from "../../api/common"; +import { Alert } from "../Antd"; import { EmptyStateComponent, SpinContainer } from "../Common"; import { ThemeContext } from "../DarkTheme/useTheme"; import { AddNodeContext } from "./context"; diff --git a/src/components/AddNode/ComputeEnvironment.tsx b/src/components/AddNode/ComputeEnvironment.tsx index baf2494f3..ae81e2b46 100644 --- a/src/components/AddNode/ComputeEnvironment.tsx +++ b/src/components/AddNode/ComputeEnvironment.tsx @@ -1,14 +1,14 @@ -import React, { useContext, useCallback, useState, useEffect } from "react"; import { MenuToggle, Select, SelectList, SelectOption, } from "@patternfly/react-core"; -import { AddNodeContext } from "./context"; +import React, { useContext, useCallback, useState, useEffect } from "react"; import { useTypedSelector } from "../../store/hooks"; +import { Alert } from "../Antd"; +import { AddNodeContext } from "./context"; import { Types } from "./types"; -import { Alert } from "antd"; const ComputeEnvironment: React.FC = () => { const { computeEnv: computeEnvs, resourceError } = useTypedSelector( diff --git a/src/components/AddNode/GuidedConfig.tsx b/src/components/AddNode/GuidedConfig.tsx index 38f5dd3bd..6dc2856f0 100644 --- a/src/components/AddNode/GuidedConfig.tsx +++ b/src/components/AddNode/GuidedConfig.tsx @@ -27,7 +27,7 @@ import { Tooltip, } from "@patternfly/react-core"; import { useMutation } from "@tanstack/react-query"; -import { Alert, Spin } from "antd"; +import { Alert, Spin } from "../Antd"; import { isEmpty } from "lodash"; import React, { useContext, useEffect, useState } from "react"; import { useDispatch } from "react-redux"; diff --git a/src/components/AddPipeline/AddPipeline.tsx b/src/components/AddPipeline/AddPipeline.tsx index b3dac5452..5b808ad4e 100644 --- a/src/components/AddPipeline/AddPipeline.tsx +++ b/src/components/AddPipeline/AddPipeline.tsx @@ -1,10 +1,10 @@ import type { PluginInstance } from "@fnndsc/chrisapi"; import { Button, Modal, ModalVariant } from "@patternfly/react-core"; import { useMutation } from "@tanstack/react-query"; -import { Alert } from "antd"; -import React, { useContext } from "react"; +import React, { useContext, Fragment } from "react"; import { useDispatch } from "react-redux"; import ChrisAPIClient from "../../api/chrisapiclient"; +import { fetchResource } from "../../api/common"; import { useTypedSelector } from "../../store/hooks"; import { getNodeOperations } from "../../store/plugin/actions"; import { @@ -12,9 +12,8 @@ import { getSelectedPlugin, } from "../../store/pluginInstance/actions"; import { getPluginInstanceStatusRequest } from "../../store/resources/actions"; +import { Alert, Form, Tag } from "../Antd"; import { SpinContainer } from "../Common"; -import { Form, Tag } from "antd"; -import { fetchResource } from "../../api/common"; import Pipelines from "../PipelinesCopy"; import { PipelineContext, Types } from "../PipelinesCopy/context"; @@ -121,10 +120,11 @@ const AddPipeline = () => { } }); - const isButtonDisabled = - pipelineToAdd && computeInfo?.[pipelineToAdd.data.id] && !mutation.isPending - ? false - : true; + const isButtonDisabled = !( + pipelineToAdd && + computeInfo?.[pipelineToAdd.data.id] && + !mutation.isPending + ); return ( { , - <> + {state.pipelineToAdd && (
{
)} - , +
, ]} > diff --git a/src/components/AddTsNode/ChooseConfig.tsx b/src/components/AddTsNode/ChooseConfig.tsx deleted file mode 100644 index 1f41bfe44..000000000 --- a/src/components/AddTsNode/ChooseConfig.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React from "react"; -import { Radio } from "@patternfly/react-core"; - -type ChooseConfig = { - selectedConfig: string; - handleConfig: (value: string) => void; -}; - -const ChooseConfig: React.FC = ({ - selectedConfig, - handleConfig, -}: ChooseConfig) => { - return ( -
- { - handleConfig(event.currentTarget.value); - }} - isChecked={selectedConfig === "join-node"} - value="join-node" - name="join-node" - id="radio" - label="Join Nodes" - description="The allows you to join nodes" - /> - { - handleConfig(event.currentTarget.value); - }} - isChecked={selectedConfig === "split-node"} - value="split-node" - name="split-node" - id="split" - label="Split Nodes" - description="This allows you to split nodes" - /> -
- ); -}; - -export default ChooseConfig; diff --git a/src/components/AddTsNode/ConfigureJoin.tsx b/src/components/AddTsNode/ConfigureJoin.tsx deleted file mode 100644 index 22831e6ce..000000000 --- a/src/components/AddTsNode/ConfigureJoin.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import React from "react"; -import { Button, List, Form, Input, Checkbox } from "antd"; -import { useDispatch } from "react-redux"; -import type { Plugin, PluginParameter } from "@fnndsc/chrisapi"; -import { deleteTsNode } from "../../store/tsplugins/actions"; -import { useSafeDispatch } from "../../api/common"; -import { useTypedSelector } from "../../store/hooks"; -import { CloseIcon } from "../Icons"; -import { InputType } from "./ParentContainer"; - -type ConfigureJoinProps = { - selectedTsPlugin?: Plugin; - joinInput: InputType; - handleValueChange: (value: string, name: string) => void; - handleCheckboxChange: (value: boolean, name: string) => void; -}; - -const ConfigureJoin = ({ - selectedTsPlugin, - handleCheckboxChange, - handleValueChange, - joinInput, -}: ConfigureJoinProps) => { - const [tsParams, setTsParams] = React.useState([]); - const tsNodes = useTypedSelector((state) => state.tsPlugins.tsNodes); - const dispatch = useDispatch(); - const safeDispatch = useSafeDispatch(dispatch); - - React.useEffect(() => { - async function fetchTsParameters() { - if (selectedTsPlugin) { - const parametersList = await selectedTsPlugin.getPluginParameters({ - limit: 20, - }); - - const parameters = parametersList.getItems(); - if (parameters) setTsParams(parameters as PluginParameter[]); - } - } - fetchTsParameters(); - }, [selectedTsPlugin]); - - return ( -
- {tsNodes && tsNodes.length > 0 && ( - ( - <> - - {item.data.title || item.data.plugin_name} -
- ); -}; - -export default ConfigureJoin; diff --git a/src/components/AddTsNode/Footer.tsx b/src/components/AddTsNode/Footer.tsx deleted file mode 100644 index 86d93cbf4..000000000 --- a/src/components/AddTsNode/Footer.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { Button } from "@patternfly/react-core"; -import { Plugin } from "@fnndsc/chrisapi"; -import { Space } from "antd"; -import { useTypedSelector } from "../../store/hooks"; - -export type InputType = { - [key: string]: string | boolean; -}; -type FooterProps = { - currentStep: number; - onBack: () => void; - onNext: () => void; - onCancel: () => void; - selectedTsPlugin?: Plugin; - selectedConfig?: string; - splitInput: InputType; -}; - -const Footer = ({ - currentStep, - onBack, - onNext, - onCancel, - selectedTsPlugin, - selectedConfig, - splitInput, -}: FooterProps) => { - const { tsNodes } = useTypedSelector((state) => state.tsPlugins); - - return ( - - - - - - - ); -}; - -export default Footer; diff --git a/src/components/AddTsNode/ParentContainer.tsx b/src/components/AddTsNode/ParentContainer.tsx deleted file mode 100644 index 6d44256d0..000000000 --- a/src/components/AddTsNode/ParentContainer.tsx +++ /dev/null @@ -1,263 +0,0 @@ -import React from "react"; -import { useDispatch } from "react-redux"; -import { Title } from "@patternfly/react-core"; -import ChooseConfig from "./ChooseConfig"; -import Footer from "./Footer"; -import Split from "./Split"; -import ConfigureJoin from "./ConfigureJoin"; -import Review from "./Review"; -import { getJoinInput } from "./utils"; -import { useTypedSelector } from "../../store/hooks"; - -import Client from "../../api/chrisapiclient"; -import { switchTreeMode } from "../../store/tsplugins/actions"; -import { - addNodeRequest, - addSplitNodes, -} from "../../store/pluginInstance/actions"; -import type { Plugin } from "@fnndsc/chrisapi"; - -function getNodeState() { - return { - selectedConfig: "join-node", - selectedTsPlugin: undefined, - joinInput: {}, - splitInput: {}, - stepNumber: 0, - error: {}, - }; -} - -export type InputType = { - [key: string]: string | boolean; -}; - -export type NodeState = { - selectedConfig: string; - joinInput: InputType; - splitInput: InputType; - stepNumber: number; - error: any; -}; - -export type GraphNodeProps = { - onVisibleChange: (visible: boolean) => void; - visible: boolean; - selectedTsPlugin?: Plugin; -}; - -const GraphNode = (props: GraphNodeProps) => { - const { onVisibleChange, visible, selectedTsPlugin } = props; - const selectedPlugin = useTypedSelector( - (state) => state.instance.selectedPlugin, - ); - const { tsNodes, treeMode } = useTypedSelector((state) => state.tsPlugins); - const nodes = useTypedSelector((state) => state.instance.pluginInstances); - const dispatch = useDispatch(); - - const handleKeyDown = (event: any) => { - if (event.code === "ArrowRight") { - event.preventDefault(); - onNext(); - } - if (event.code === "ArrowLeft") { - event.preventDefault(); - onBack(); - } - if (event.key === "Enter") { - if (stepNumber === 2) { - handleAdd(); - } - } - }; - - React.useEffect(() => { - window.addEventListener("keydown", handleKeyDown); - return () => { - window.removeEventListener("keydown", handleKeyDown); - }; - }); - - const [nodeState, setNodeState] = React.useState(getNodeState); - const { selectedConfig, joinInput, splitInput, stepNumber } = nodeState; - - const handleConfig = (value: string) => { - setNodeState({ - ...nodeState, - selectedConfig: value, - }); - }; - - const onBack = () => { - stepNumber > 0 && - setNodeState({ - ...nodeState, - stepNumber: stepNumber - 1, - }); - }; - - const onNext = () => { - if (stepNumber === 2) { - handleAdd(); - } else - stepNumber < 2 && - setNodeState({ - ...nodeState, - stepNumber: stepNumber + 1, - }); - }; - - const onCancel = () => { - handleResets(); - onVisibleChange(!visible); - dispatch(switchTreeMode(!treeMode)); - }; - - const handleResets = () => { - setNodeState(getNodeState); - }; - - const handleAdd = async () => { - const { joinInput, selectedConfig } = nodeState; - const input = getJoinInput(joinInput, tsNodes); - - if (tsNodes && tsNodes?.length > 0) { - if (selectedConfig === "join-node") { - const finalParameterList = { - ...input, - ["previous_id"]: tsNodes[0].data.id, - }; - - const pluginInstance = await selectedTsPlugin?.getPluginInstances(); - try { - await pluginInstance?.post(finalParameterList); - const pluginInstanceItems = pluginInstance?.getItems(); - if (pluginInstanceItems) { - const node = pluginInstanceItems[0]; - dispatch(addNodeRequest({ pluginItem: node, nodes: nodes.data })); - } - dispatch(switchTreeMode(!treeMode)); - handleResets(); - onVisibleChange(!visible); - } catch (error) { - console.warn("ERROR", error); - } - } else if ( - selectedPlugin && - splitInput && - splitInput["filter"] && - splitInput["compute_resource"] - ) { - try { - const client = Client.getClient(); - const node = await client.createPluginInstanceSplit( - selectedPlugin.data.id, - splitInput["filter"] as string, - splitInput["compute_resource"] as string, - ); - const instanceIds = node.data.created_plugin_inst_ids.split(","); - const splitNodes = []; - for (const i in instanceIds) { - const id = instanceIds[i]; - const pluginInstance = await client.getPluginInstance(+id); - splitNodes.push(pluginInstance); - } - dispatch( - addSplitNodes({ splitNodes, nodes: nodes.data, selectedPlugin }), - ); - handleResets(); - onVisibleChange(!visible); - } catch (error) { - console.warn("ERROR", error); - } - } - } - }; - - const handleSplitChange = (value: string, name: string) => { - setNodeState({ - ...nodeState, - splitInput: { - ...nodeState.splitInput, - [name]: value, - }, - }); - }; - - const handleValueChange = (value: string, name: string) => { - setNodeState({ - ...nodeState, - joinInput: { - ...nodeState.joinInput, - [name]: value, - }, - }); - }; - - const handleCheckboxChange = (value: boolean, name: string) => { - setNodeState({ - ...nodeState, - joinInput: { - ...nodeState.joinInput, - [name]: value, - }, - }); - }; - - const steps = [ - { - step: 1, - component: ( - - ), - }, - { - step: 2, - component: - selectedConfig === "join-node" ? ( - - ) : ( - - ), - }, - { - step: 3, - component: , - }, - ]; - - const title = [ - "Configure a Graph Node :", - `Configure ${selectedTsPlugin?.data.name}`, - "Review", - ]; - - return ( - <> - {title[stepNumber]} - {steps[stepNumber].component} -
- - ); -}; - -export default GraphNode; diff --git a/src/components/AddTsNode/Review.tsx b/src/components/AddTsNode/Review.tsx deleted file mode 100644 index c279b5fec..000000000 --- a/src/components/AddTsNode/Review.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { InputType, NodeState } from "./ParentContainer"; -import { Grid, GridItem } from "@patternfly/react-core"; -import { useTypedSelector } from "../../store/hooks"; -import { getJoinInput } from "./utils"; - -const Review = ({ nodeState }: { nodeState: NodeState }) => { - const tsNodes = useTypedSelector((state) => state.tsPlugins.tsNodes); - const selectedPlugin = useTypedSelector( - (state) => state.instance.selectedPlugin, - ); - const { joinInput, splitInput, selectedConfig } = nodeState; - let generatedString = ""; - - const getInput = (input: InputType) => { - let string = ""; - for (const parameter in input) { - string += ` --${parameter} ${input[parameter]}`; - } - return string; - }; - - if (selectedConfig === "join-node") { - const input = getJoinInput(joinInput, tsNodes); - generatedString = getInput(input); - } else if (selectedConfig === "split-node") { - generatedString = getInput(splitInput); - } - - return ( -
- - - Operation Mode: - - - - - {selectedConfig === "join-node" ? "Join Node" : "Split Node"} - - - - ParentNode: - - - - - {selectedPlugin?.data.title || selectedPlugin?.data.plugin_name} - - - - Plugin Configuration - - - - {generatedString} - - -
- ); -}; - -export default Review; diff --git a/src/components/AddTsNode/Split.tsx b/src/components/AddTsNode/Split.tsx deleted file mode 100644 index c9edc745f..000000000 --- a/src/components/AddTsNode/Split.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from "react"; -import { Form, Input } from "antd"; -import { InputType } from "./ParentContainer"; - -type SplitProps = { - handleSplitChange: (value: string, name: string) => void; - splitInput: InputType; -}; - -const Split = ({ splitInput, handleSplitChange }: SplitProps) => { - return ( -
-
- - ) => { - handleSplitChange(e.target.value, "filter"); - }} - /> - - - ) => { - handleSplitChange(e.target.value, "compute_resource"); - }} - /> - -
-
- ); -}; - -export default Split; diff --git a/src/components/AddTsNode/graph-node.css b/src/components/AddTsNode/graph-node.css deleted file mode 100644 index a44b255d1..000000000 --- a/src/components/AddTsNode/graph-node.css +++ /dev/null @@ -1,11 +0,0 @@ -.list-container { - width: 100%; - height: 20vh; - padding-top: 1rem; - padding-bottom: 1rem; -} - -.computedValue, -.input { - font-family: monospace; -} \ No newline at end of file diff --git a/src/components/AddTsNode/index.tsx b/src/components/AddTsNode/index.tsx deleted file mode 100644 index bdcd47315..000000000 --- a/src/components/AddTsNode/index.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import type { Plugin } from "@fnndsc/chrisapi"; -import { Button } from "@patternfly/react-core"; -import { Popover } from "antd"; -import React from "react"; -import { useDispatch } from "react-redux"; -import ChrisAPIClient from "../../api/chrisapiclient"; -import { useTypedSelector } from "../../store/hooks"; -import { getNodeOperations } from "../../store/plugin/actions"; -import { switchTreeMode } from "../../store/tsplugins/actions"; -import { CodeBranchIcon } from "../Icons"; -import GraphNode from "./ParentContainer"; -import "./graph-node.css"; - -const GraphNodeContainer = () => { - const dispatch = useDispatch(); - const { childGraph } = useTypedSelector( - (state) => state.plugin.nodeOperations, - ); - const [selectedTsPlugin, setTsPlugin] = React.useState(); - const { treeMode } = useTypedSelector((state) => state.tsPlugins); - const handleVisibleChange = React.useCallback(() => { - if (treeMode === true) { - dispatch(switchTreeMode(false)); - } else { - dispatch(switchTreeMode(true)); - } - dispatch(getNodeOperations("childGraph")); - }, [dispatch, treeMode]); - - React.useEffect(() => { - const fetchTsPlugin = async () => { - const client = ChrisAPIClient.getClient(); - const pluginList = await client.getPlugins({ - limit: 1000, - }); - const pluginListItems = pluginList.getItems(); - if (pluginListItems) { - const tsPlugins: Plugin[] = pluginListItems.filter((item) => { - if (item.data.type === "ts") return item; - }); - setTsPlugin(() => { - return tsPlugins[0]; - }); - } - }; - fetchTsPlugin(); - }, []); - - return ( - - } - placement="bottom" - open={childGraph} - onOpenChange={handleVisibleChange} - trigger="click" - > - - - ); -}; -export default GraphNodeContainer; diff --git a/src/components/AddTsNode/utils.ts b/src/components/AddTsNode/utils.ts deleted file mode 100644 index bf0c59646..000000000 --- a/src/components/AddTsNode/utils.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { PluginInstance } from "@fnndsc/chrisapi"; -import { InputType } from "./ParentContainer"; - -export const getJoinInput = ( - joinInput: InputType, - tsNodes?: PluginInstance[], -) => { - const instanceIds = tsNodes?.map((node) => { - return `${node.data.id}`; - }); - - let input: InputType = {}; - - if (instanceIds) { - input = { - ...joinInput, - ["plugininstances"]: instanceIds.join(","), - }; - } - return input || {}; -}; diff --git a/src/components/Antd/index.tsx b/src/components/Antd/index.tsx new file mode 100644 index 000000000..784625b47 --- /dev/null +++ b/src/components/Antd/index.tsx @@ -0,0 +1,21 @@ +export { + Alert, + Avatar, + Badge, + Checkbox, + Collapse, + Drawer, + Dropdown, + Form, + List, + Popconfirm, + Popover, + Space, + Spin, + Steps, + Tag, + Tree, + Typography, + notification, + type MenuProps, +} from "antd"; diff --git a/src/components/ComputePage/index.tsx b/src/components/ComputePage/index.tsx index 697502b08..a45b644c6 100644 --- a/src/components/ComputePage/index.tsx +++ b/src/components/ComputePage/index.tsx @@ -1,11 +1,11 @@ -import React from "react"; -import { Typography } from "antd"; import { PageSection } from "@patternfly/react-core"; -import ComputeCatalog from "./ComputeCatalog"; -import { InfoIcon } from "../Common"; -import { setSidebarActive } from "../../store/ui/actions"; +import React from "react"; import { useDispatch } from "react-redux"; +import { setSidebarActive } from "../../store/ui/actions"; +import { Typography } from "../Antd"; +import { InfoIcon } from "../Common"; import WrapperConnect from "../Wrapper"; +import ComputeCatalog from "./ComputeCatalog"; const { Paragraph } = Typography; diff --git a/src/components/CreateFeed/ChooseConfig.tsx b/src/components/CreateFeed/ChooseConfig.tsx index f8aa6e358..7eb306a9d 100644 --- a/src/components/CreateFeed/ChooseConfig.tsx +++ b/src/components/CreateFeed/ChooseConfig.tsx @@ -18,7 +18,7 @@ import { Tooltip, useWizardContext, } from "@patternfly/react-core"; -import { Alert, Steps, notification } from "antd"; +import { Alert, Steps, notification } from "../Antd"; import React, { useCallback, useContext, useEffect, useState } from "react"; import { useTypedSelector } from "../../store/hooks"; import GuidedConfig from "../AddNode/GuidedConfig"; diff --git a/src/components/CreateFeed/ChrisFileSelect.tsx b/src/components/CreateFeed/ChrisFileSelect.tsx index 115b21d8f..6e779ea28 100644 --- a/src/components/CreateFeed/ChrisFileSelect.tsx +++ b/src/components/CreateFeed/ChrisFileSelect.tsx @@ -2,7 +2,7 @@ import React, { useState, useContext, useCallback, useEffect } from "react"; import { CreateFeedContext } from "./context"; import { useWizardContext } from "@patternfly/react-core"; import type { EventDataNode, Key } from "rc-tree/lib/interface"; -import { Tree, notification } from "antd"; +import { Tree, notification } from "../Antd"; import { Types, diff --git a/src/components/CreateFeed/CreateFeed.tsx b/src/components/CreateFeed/CreateFeed.tsx index 24d02177d..5e51f49a1 100644 --- a/src/components/CreateFeed/CreateFeed.tsx +++ b/src/components/CreateFeed/CreateFeed.tsx @@ -8,7 +8,7 @@ import { WizardStep, } from "@patternfly/react-core"; import { useQueryClient } from "@tanstack/react-query"; -import { notification } from "antd"; +import { notification } from "../Antd"; import * as React from "react"; import { useContext } from "react"; import { catchError } from "../../api/common"; diff --git a/src/components/CreateFeed/DataPacks.tsx b/src/components/CreateFeed/DataPacks.tsx index a96fee6ab..7134fd66b 100644 --- a/src/components/CreateFeed/DataPacks.tsx +++ b/src/components/CreateFeed/DataPacks.tsx @@ -1,23 +1,23 @@ -import { useEffect, useState, useContext, useRef, useCallback } from "react"; import type { PluginMeta } from "@fnndsc/chrisapi"; import { - Pagination, - ToolbarItem, - Radio, Button, ButtonVariant, InputGroup, + Pagination, + Radio, TextInput, + ToolbarItem, useWizardContext, } from "@patternfly/react-core"; -import { SearchIcon } from "../Icons"; -import { Types as AddNodeTypes } from "../AddNode/types"; -import { Types } from "./types/feed"; -import { notification } from "antd"; import debounce from "lodash/debounce"; -import { getPlugins } from "./utils"; +import { useCallback, useContext, useEffect, useRef, useState } from "react"; import { AddNodeContext } from "../AddNode/context"; +import { Types as AddNodeTypes } from "../AddNode/types"; +import { notification } from "../Antd"; +import { SearchIcon } from "../Icons"; import { CreateFeedContext } from "./context"; +import { Types } from "./types/feed"; +import { getPlugins } from "./utils"; interface FilterProps { perPage: number; diff --git a/src/components/CreateFeed/HelperComponent.tsx b/src/components/CreateFeed/HelperComponent.tsx index bc6354d02..df2e1e4d1 100644 --- a/src/components/CreateFeed/HelperComponent.tsx +++ b/src/components/CreateFeed/HelperComponent.tsx @@ -5,7 +5,7 @@ import { Flex, FlexItem, } from "@patternfly/react-core"; -import { notification } from "antd"; +import { notification } from "../Antd"; import { DeleteIcon as TrashIcon, FileIcon, FolderIcon } from "../Icons"; import { CreateFeedContext } from "./context"; import { Types } from "./types/feed"; diff --git a/src/components/CreateFeed/LocalFileUpload.tsx b/src/components/CreateFeed/LocalFileUpload.tsx index 6661f377f..12eafa36c 100644 --- a/src/components/CreateFeed/LocalFileUpload.tsx +++ b/src/components/CreateFeed/LocalFileUpload.tsx @@ -3,7 +3,7 @@ import { WizardContext } from "@patternfly/react-core"; import { CreateFeedContext } from "./context"; import { Types } from "./types/feed"; import { LocalFileList } from "./HelperComponent"; -import { notification } from "antd"; +import { notification } from "../Antd"; const LocalFileUpload = () => { const { state, dispatch } = useContext(CreateFeedContext); diff --git a/src/components/Dashboard/index.tsx b/src/components/Dashboard/index.tsx index 51474d5d1..66bb31fad 100644 --- a/src/components/Dashboard/index.tsx +++ b/src/components/Dashboard/index.tsx @@ -3,7 +3,7 @@ import BUILD_VERSION from "../../getBuildVersion"; import { useDispatch } from "react-redux"; import WrapperConnect from "../Wrapper"; import { PageSection, Grid, GridItem } from "@patternfly/react-core"; -import { Typography } from "antd"; +import { Typography } from "../Antd"; import { setSidebarActive } from "../../store/ui/actions"; import { InfoIcon } from "../Common"; import { CatalogTile } from "@patternfly/react-catalog-view-extension"; diff --git a/src/components/DeleteNode/index.tsx b/src/components/DeleteNode/index.tsx index 238cb6911..727980936 100644 --- a/src/components/DeleteNode/index.tsx +++ b/src/components/DeleteNode/index.tsx @@ -1,7 +1,7 @@ -import { PluginInstance } from "@fnndsc/chrisapi"; +import type { PluginInstance } from "@fnndsc/chrisapi"; import { Button, Modal, ModalVariant } from "@patternfly/react-core"; import { useMutation } from "@tanstack/react-query"; -import { Alert } from "antd"; +import { Alert } from "../Antd"; import { useEffect, Fragment } from "react"; import { useDispatch } from "react-redux"; import { fetchResource } from "../../api/common"; diff --git a/src/components/FeedDetails/index.tsx b/src/components/FeedDetails/index.tsx index ae029c575..4482e7848 100644 --- a/src/components/FeedDetails/index.tsx +++ b/src/components/FeedDetails/index.tsx @@ -1,10 +1,10 @@ import { ToolbarItem } from "@patternfly/react-core"; -import { Badge } from "antd"; -import React, { ReactNode, useState } from "react"; +import { Badge } from "../Antd"; +import React, { type ReactNode, useState } from "react"; import { useDispatch } from "react-redux"; import { fetchNote } from "../../api/common"; import { setDrawerCurrentlyActive } from "../../store/drawer/actions"; -import { IDrawerState } from "../../store/drawer/types"; +import type { IDrawerState } from "../../store/drawer/types"; import { useTypedSelector } from "../../store/hooks"; import { ButtonWithTooltip } from "../Feeds/DrawerUtils"; import { handleToggle } from "../Feeds/utilties"; diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index b56fdd1e9..d10f292fe 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -11,15 +11,16 @@ import { Tooltip, } from "@patternfly/react-core"; import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; -import { notification } from "antd"; import { useContext, useEffect } from "react"; import { useDispatch } from "react-redux"; +import { getFileExtension } from "../../api/model"; import { setFilePreviewPanel } from "../../store/drawer/actions"; import { clearSelectedFile, setSelectedFile, } from "../../store/explorer/actions"; import useDownload, { useTypedSelector } from "../../store/hooks"; +import { notification } from "../Antd"; import { ClipboardCopyContainer, SpinContainer, getIcon } from "../Common"; import { ThemeContext } from "../DarkTheme/useTheme"; import { DrawerActionButton } from "../Feeds/DrawerUtils"; @@ -29,7 +30,6 @@ import FileDetailView from "../Preview/FileDetailView"; import XtkViewer from "../XtkViewer/XtkViewer"; import type { FileBrowserProps } from "./types"; import { bytesToSize } from "./utilities"; -import { getFileExtension } from "../../api/model"; const previewAnimation = [{ opacity: "0.0" }, { opacity: "1.0" }]; diff --git a/src/components/FeedTree/DropdownMenu.tsx b/src/components/FeedTree/DropdownMenu.tsx index efa820ed1..e1d51951c 100644 --- a/src/components/FeedTree/DropdownMenu.tsx +++ b/src/components/FeedTree/DropdownMenu.tsx @@ -1,4 +1,4 @@ -import { Dropdown, type MenuProps } from "antd"; +import { Dropdown, type MenuProps } from "../Antd"; import { useDispatch } from "react-redux"; import { useTypedSelector } from "../../store/hooks"; import { getNodeOperations } from "../../store/plugin/actions"; diff --git a/src/components/FeedTree/FeedTree.tsx b/src/components/FeedTree/FeedTree.tsx index 9e104a920..04ca3f21b 100644 --- a/src/components/FeedTree/FeedTree.tsx +++ b/src/components/FeedTree/FeedTree.tsx @@ -1,4 +1,3 @@ -import type { PluginInstance } from "@fnndsc/chrisapi"; import { Alert, Switch, TextInput } from "@patternfly/react-core"; import { type HierarchyPointLink, @@ -209,7 +208,6 @@ const FeedTree = (props: OwnProps) => { } }, [size, orientation, dispatch]); - const mode = useTypedSelector((state) => state.tsPlugins.treeMode); const [feedState, setFeedState] = React.useState( getInitialState(props, feedTreeProp), ); @@ -288,19 +286,10 @@ const FeedTree = (props: OwnProps) => { props.onNodeClick(item); }; - const handleNodeClickTs = (item: PluginInstance) => { - props.onNodeClickTs(item); - }; - const { nodes, links } = feedTree; return ( -
+
{/* Suppressing this for now as we don't know how which key events to hook for changing orientations */} @@ -385,15 +374,6 @@ const FeedTree = (props: OwnProps) => { /> )}
- - {mode === false && ( -
- -
- )}
@@ -429,7 +409,6 @@ const FeedTree = (props: OwnProps) => { position={{ x, y }} parent={parent} onNodeClick={handleNodeClick} - onNodeClickTs={handleNodeClickTs} orientation={orientation} toggleLabel={feedState.toggleLabel} overlayScale={ diff --git a/src/components/FeedTree/Node.tsx b/src/components/FeedTree/Node.tsx index 8dbd26961..be2d25eae 100644 --- a/src/components/FeedTree/Node.tsx +++ b/src/components/FeedTree/Node.tsx @@ -30,8 +30,6 @@ type NodeWrapperProps = { position: Point; parent: HierarchyPointNode | null; onNodeClick: (node: any) => void; - onNodeClickTs: (node: PluginInstance) => void; - orientation: "horizontal" | "vertical"; overlayScale?: FeedTreeScaleType; toggleLabel: boolean; @@ -63,7 +61,6 @@ const Node = (props: NodeProps) => { position, data, onNodeClick, - onNodeClickTs, toggleLabel, status, currentId, @@ -72,8 +69,7 @@ const Node = (props: NodeProps) => { const [api, contextHolder] = notification.useNotification(); const dispatch = useDispatch(); - const tsNodes = useTypedSelector((state) => state.tsPlugins.tsNodes); - const mode = useTypedSelector((state) => state.tsPlugins.treeMode); + const pluginInstances = useTypedSelector( (state) => state.instance.pluginInstances.data, ); @@ -127,15 +123,6 @@ const Node = (props: NodeProps) => { statusClass = "search"; } - if (mode === false && tsNodes && tsNodes.length > 0) { - if (data.item?.data.id) { - const node = tsNodes.find((node) => node.data.id === data.item?.data.id); - if (node) { - tsClass = "graphSelected"; - } - } - } - const previous_id = data.item?.data?.previous_id; if (previous_id) { const parentNode = pluginInstances?.find( @@ -206,6 +193,7 @@ const Node = (props: NodeProps) => { } return pipelines; } catch (error) { + // biome-ignore lint/complexity/noUselessCatch: throw error; } } @@ -269,13 +257,7 @@ const Node = (props: NodeProps) => { id={`${data.id}`} ref={nodeRef} onClick={() => { - if (data.item) { - if (mode === false) { - onNodeClickTs(data.item); - } else { - onNodeClick(data); - } - } + onNodeClick(data); }} > void; onNodeClick: (node: any) => void; } @@ -19,7 +18,7 @@ export type TSID = { }; const ParentComponent = (props: ParentComponentProps) => { - const { onNodeClick, onNodeClickTs } = props; + const { onNodeClick } = props; const pluginInstances = useTypedSelector( (state) => state.instance.pluginInstances, ); @@ -46,7 +45,6 @@ const ParentComponent = (props: ParentComponentProps) => { return data && data.length > 0 ? ( void; - onNodeClickTs: (node: PluginInstance) => void; translate?: Point; scaleExtent: { min: number; diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 21878b0a5..6cbe8b8f0 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -14,10 +14,11 @@ import { ToggleGroup, ToggleGroupItem, type ToggleGroupItemProps, + Tooltip, } from "@patternfly/react-core"; import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; import { useQuery, useQueryClient } from "@tanstack/react-query"; -import { Tooltip, Typography } from "antd"; +import { Typography } from "../Antd"; import { format } from "date-fns"; import type React from "react"; import { useContext, useEffect, useState } from "react"; @@ -454,11 +455,7 @@ const DonutUtilization = (props: { const mode = isDarkTheme ? "dark" : "light"; return ( - +
{ - dispatch(addTSNodes(node)); - }; - const handleDrawerAction = (mode: string) => { return ( {!currentLayout ? ( - + ) : ( )} diff --git a/src/components/NewLibrary/components/Cart.tsx b/src/components/NewLibrary/components/Cart.tsx index 179cef4d6..ffc6b9553 100644 --- a/src/components/NewLibrary/components/Cart.tsx +++ b/src/components/NewLibrary/components/Cart.tsx @@ -1,5 +1,5 @@ import { Button, Text, Tooltip } from "@patternfly/react-core"; -import { Drawer, List, Popconfirm, Space } from "antd"; +import { Drawer, List, Popconfirm, Space } from "../../Antd"; import { isEmpty } from "lodash"; import { useDispatch } from "react-redux"; import { Link } from "react-router-dom"; diff --git a/src/components/NewLibrary/components/ContextMenu.tsx b/src/components/NewLibrary/components/ContextMenu.tsx index 76168d147..5a2fb8ac9 100644 --- a/src/components/NewLibrary/components/ContextMenu.tsx +++ b/src/components/NewLibrary/components/ContextMenu.tsx @@ -1,6 +1,6 @@ import type { FileBrowserFolderList } from "@fnndsc/chrisapi"; import type { DefaultError } from "@tanstack/react-query"; -import { Alert, Dropdown, type MenuProps } from "antd"; +import { Alert, Dropdown, type MenuProps } from "../../Antd"; import { ArchiveIcon, CodeBranchIcon, diff --git a/src/components/NewLibrary/components/FileCard.tsx b/src/components/NewLibrary/components/FileCard.tsx index 2d19a8fe4..56d118b60 100644 --- a/src/components/NewLibrary/components/FileCard.tsx +++ b/src/components/NewLibrary/components/FileCard.tsx @@ -14,7 +14,7 @@ import { SplitItem, Tooltip, } from "@patternfly/react-core"; -import { notification } from "antd"; +import { notification } from "../../Antd"; import { isEmpty } from "lodash"; import type React from "react"; import { useContext, useEffect, useState } from "react"; diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index d31df0712..43f5bfad1 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -14,7 +14,7 @@ import { Tooltip, } from "@patternfly/react-core"; import type { DefaultError } from "@tanstack/react-query"; -import { Alert, Dropdown, Spin } from "antd"; +import { Alert, Dropdown, Spin } from "../../Antd"; import React, { Fragment, useEffect, diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index 6ecde4082..dee761285 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -9,7 +9,7 @@ import { useQuery, useQueryClient, } from "@tanstack/react-query"; -import { Alert, Typography } from "antd"; +import { Alert, Typography } from "../Antd"; import { debounce } from "lodash"; import { useEffect, useRef, useState } from "react"; import { useLocation, useNavigate } from "react-router"; diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index e161600b7..17823d4f8 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -1,6 +1,6 @@ import type { FileBrowserFolderList } from "@fnndsc/chrisapi"; import { useMutation } from "@tanstack/react-query"; -import { notification } from "antd"; +import { notification } from "../../Antd"; import { isEmpty } from "lodash"; import { useContext, useRef, useState } from "react"; import { useDispatch } from "react-redux"; diff --git a/src/components/NiivueDatasetViewer/content/infoForPageHeader.tsx b/src/components/NiivueDatasetViewer/content/infoForPageHeader.tsx index bb593e1b6..98ceffb4a 100644 --- a/src/components/NiivueDatasetViewer/content/infoForPageHeader.tsx +++ b/src/components/NiivueDatasetViewer/content/infoForPageHeader.tsx @@ -1,6 +1,6 @@ import { InfoIcon } from "../../Common"; -import { Typography } from "antd"; -import React from "react"; +import { Typography } from "../../Antd"; +import type React from "react"; const InfoForPageHeader: React.FC = () => ( { if (!pluginItem) throw new Error("Failed to set title..."); dispatch(setPluginTitle(pluginItem)); } catch (e) { + // biome-ignore lint/complexity/noUselessCatch: throw e; } }; diff --git a/src/components/NodeDetails/Status.tsx b/src/components/NodeDetails/Status.tsx index a39b0c3f9..061c927d9 100644 --- a/src/components/NodeDetails/Status.tsx +++ b/src/components/NodeDetails/Status.tsx @@ -1,4 +1,4 @@ -import { Steps, Spin } from "antd"; +import { Steps, Spin } from "../Antd"; import usePluginInstanceResource from "./usePluginInstanceResource"; const Status = () => { diff --git a/src/components/Pacs/components/PatientCard.tsx b/src/components/Pacs/components/PatientCard.tsx index 43c49d547..66e9b4855 100644 --- a/src/components/Pacs/components/PatientCard.tsx +++ b/src/components/Pacs/components/PatientCard.tsx @@ -6,7 +6,7 @@ import { Skeleton, Tooltip, } from "@patternfly/react-core"; -import { notification } from "antd"; +import { notification } from "../../Antd"; import { format, parse } from "date-fns"; import { useContext, useEffect, useState } from "react"; import { PacsQueryContext } from "../context"; diff --git a/src/components/Pacs/components/SeriesCard.tsx b/src/components/Pacs/components/SeriesCard.tsx index 6b925ed4a..7e5d72bab 100644 --- a/src/components/Pacs/components/SeriesCard.tsx +++ b/src/components/Pacs/components/SeriesCard.tsx @@ -18,7 +18,7 @@ import { pluralize, } from "@patternfly/react-core"; import { useMutation, useQuery } from "@tanstack/react-query"; -import { Alert } from "antd"; +import { Alert } from "../../Antd"; import axios from "axios"; import PQueue from "p-queue"; import { useContext, useEffect, useState } from "react"; diff --git a/src/components/Pacs/components/SettingsComponents.tsx b/src/components/Pacs/components/SettingsComponents.tsx index 23f8b394d..0ed27e8ae 100644 --- a/src/components/Pacs/components/SettingsComponents.tsx +++ b/src/components/Pacs/components/SettingsComponents.tsx @@ -1,6 +1,6 @@ import { Button, Checkbox } from "@patternfly/react-core"; import { useQueryClient } from "@tanstack/react-query"; -import { Popover } from "antd"; +import { Popover } from "../../Antd"; import axios from "axios"; import { useState } from "react"; import ChrisApiClient from "../../../api/chrisapiclient"; diff --git a/src/components/Pacs/index.tsx b/src/components/Pacs/index.tsx index 04bc6c70f..63f16cb2d 100644 --- a/src/components/Pacs/index.tsx +++ b/src/components/Pacs/index.tsx @@ -12,7 +12,7 @@ import { TextInput, } from "@patternfly/react-core"; import SearchIcon from "@patternfly/react-icons/dist/esm/icons/search-icon"; -import { Alert, Spin } from "antd"; +import { Alert, Spin } from "../Antd"; import * as React from "react"; import { useDispatch } from "react-redux"; import { useNavigate } from "react-router"; diff --git a/src/components/PipelinesCopy/CodeBlockComponent.tsx b/src/components/PipelinesCopy/CodeBlockComponent.tsx index 25f79b6ea..9983b58d7 100644 --- a/src/components/PipelinesCopy/CodeBlockComponent.tsx +++ b/src/components/PipelinesCopy/CodeBlockComponent.tsx @@ -1,4 +1,4 @@ -import { Pipeline } from "@fnndsc/chrisapi"; +import type { Pipeline } from "@fnndsc/chrisapi"; import { ClipboardCopyButton, CodeBlock, @@ -7,7 +7,7 @@ import { clipboardCopyFunc, } from "@patternfly/react-core"; import { useQuery } from "@tanstack/react-query"; -import { Alert, Form } from "antd"; +import { Alert, Form } from "../Antd"; import { useContext, useState } from "react"; import { EmptyStateComponent, SpinContainer } from "../Common"; import { PipelineContext } from "./context"; diff --git a/src/components/PipelinesCopy/ComputeListForSingleCompute.tsx b/src/components/PipelinesCopy/ComputeListForSingleCompute.tsx index b5ee4a2f9..71d686018 100644 --- a/src/components/PipelinesCopy/ComputeListForSingleCompute.tsx +++ b/src/components/PipelinesCopy/ComputeListForSingleCompute.tsx @@ -1,5 +1,5 @@ -import { Pipeline } from "@fnndsc/chrisapi"; -import { Form } from "antd"; +import type { Pipeline } from "@fnndsc/chrisapi"; +import { Form } from "../Antd"; import { useContext } from "react"; import { EmptyStateComponent } from "../Common"; import ListCompute from "./ListCompute"; diff --git a/src/components/PipelinesCopy/ListCompute.tsx b/src/components/PipelinesCopy/ListCompute.tsx index 3670b14e0..03ce07eb8 100644 --- a/src/components/PipelinesCopy/ListCompute.tsx +++ b/src/components/PipelinesCopy/ListCompute.tsx @@ -1,6 +1,5 @@ -import { ComputeResource } from "@fnndsc/chrisapi"; -import { Avatar, Checkbox, List } from "antd"; - +import type { ComputeResource } from "@fnndsc/chrisapi"; +import { Avatar, Checkbox, List } from "../Antd"; import { stringToColour } from "../CreateFeed/utils"; type OwnProps = { diff --git a/src/components/PipelinesCopy/NodeData.tsx b/src/components/PipelinesCopy/NodeData.tsx index 7d536f9b2..ec07e5678 100644 --- a/src/components/PipelinesCopy/NodeData.tsx +++ b/src/components/PipelinesCopy/NodeData.tsx @@ -1,9 +1,9 @@ import { useQuery } from "@tanstack/react-query"; -import { Alert } from "antd"; -import { HierarchyPointNode } from "d3-hierarchy"; +import { Alert } from "../Antd"; +import type { HierarchyPointNode } from "d3-hierarchy"; import { select } from "d3-selection"; import React, { useContext, useEffect, useRef } from "react"; -import { TreeNode, fetchComputeInfo } from "../../api/common"; +import { type TreeNode, fetchComputeInfo } from "../../api/common"; import { stringToColour } from "../CreateFeed/utils"; import { ThemeContext } from "../DarkTheme/useTheme"; import { PipelineContext, Types, type ComputeInfoPayload } from "./context"; diff --git a/src/components/PipelinesCopy/PipelineUpload.tsx b/src/components/PipelinesCopy/PipelineUpload.tsx index 62f63336b..6be197c44 100644 --- a/src/components/PipelinesCopy/PipelineUpload.tsx +++ b/src/components/PipelinesCopy/PipelineUpload.tsx @@ -1,6 +1,6 @@ import Client from "@fnndsc/chrisapi"; import { Button } from "@patternfly/react-core"; -import { Alert } from "antd"; +import { Alert } from "../Antd"; import axios from "axios"; import { isEmpty } from "lodash"; import { useRef, useState } from "react"; diff --git a/src/components/PipelinesCopy/SelectAllCompute.tsx b/src/components/PipelinesCopy/SelectAllCompute.tsx index 62262fe37..488e25d23 100644 --- a/src/components/PipelinesCopy/SelectAllCompute.tsx +++ b/src/components/PipelinesCopy/SelectAllCompute.tsx @@ -1,13 +1,13 @@ -import { ComputeResource, Pipeline } from "@fnndsc/chrisapi"; +import type { ComputeResource, Pipeline } from "@fnndsc/chrisapi"; import { MenuToggle, - MenuToggleElement, + type MenuToggleElement, Select, SelectList, SelectOption, } from "@patternfly/react-core"; import { useQuery } from "@tanstack/react-query"; -import { Avatar } from "antd"; +import { Avatar } from "../Antd"; import React, { useContext } from "react"; import ChrisAPIClient from "../../api/chrisapiclient"; import { fetchResource } from "../../api/common"; diff --git a/src/components/PipelinesCopy/TitleChange.tsx b/src/components/PipelinesCopy/TitleChange.tsx index 855dab364..76f6049b3 100644 --- a/src/components/PipelinesCopy/TitleChange.tsx +++ b/src/components/PipelinesCopy/TitleChange.tsx @@ -1,7 +1,8 @@ -import { Pipeline, PluginPiping } from "@fnndsc/chrisapi"; -import { Alert, Button, Form, Input, Space } from "antd"; +import type { Pipeline, PluginPiping } from "@fnndsc/chrisapi"; +import { Alert, Form, Space } from "../Antd"; import { useContext, useEffect, useState } from "react"; import { PipelineContext, Types } from "./context"; +import { TextInput, Button } from "@patternfly/react-core"; type OwnProps = { currentPipeline: Pipeline; @@ -61,8 +62,11 @@ function TitleChange({ currentPipeline }: OwnProps) {
- setValue(e.target.value)} value={value} /> - diff --git a/src/components/PipelinesCopy/index.tsx b/src/components/PipelinesCopy/index.tsx index 5f5194ce5..a7da63cea 100644 --- a/src/components/PipelinesCopy/index.tsx +++ b/src/components/PipelinesCopy/index.tsx @@ -8,7 +8,7 @@ import { } from "@patternfly/react-core"; import SearchIcon from "@patternfly/react-icons/dist/esm/icons/search-icon"; import { useQuery, useQueryClient } from "@tanstack/react-query"; -import { Alert, Collapse } from "antd"; +import { Alert, Collapse } from "../Antd"; import { useContext, useState } from "react"; import { fetchPipelines, fetchResources } from "../../api/common"; import { EmptyStateComponent, SpinContainer } from "../Common"; diff --git a/src/components/PluginCatalog/index.tsx b/src/components/PluginCatalog/index.tsx index f61d45c52..ad618d7fb 100644 --- a/src/components/PluginCatalog/index.tsx +++ b/src/components/PluginCatalog/index.tsx @@ -1,6 +1,6 @@ import React from "react"; import { useDispatch } from "react-redux"; -import { Typography } from "antd"; +import { Typography } from "../Antd"; import WrapperConnect from "../Wrapper"; import PluginCatalog from "./PluginCatalog"; import { InfoIcon } from "../Common/"; diff --git a/src/components/PluginInstall/index.tsx b/src/components/PluginInstall/index.tsx index 016b04b86..dbca251e2 100644 --- a/src/components/PluginInstall/index.tsx +++ b/src/components/PluginInstall/index.tsx @@ -6,7 +6,7 @@ import { LoginPage, } from "@patternfly/react-core"; import { useMutation } from "@tanstack/react-query"; -import { Alert } from "antd"; +import { Alert } from "../Antd"; import React from "react"; import { Cookies, useCookies } from "react-cookie"; import { useNavigate } from "react-router"; diff --git a/src/components/Preview/FileDetailView.tsx b/src/components/Preview/FileDetailView.tsx index 27ce38b9a..894faa080 100644 --- a/src/components/Preview/FileDetailView.tsx +++ b/src/components/Preview/FileDetailView.tsx @@ -9,7 +9,7 @@ import { } from "@patternfly/react-core"; import ResetIcon from "@patternfly/react-icons/dist/esm/icons/history-icon"; import { useMutation, useQuery } from "@tanstack/react-query"; -import { Alert } from "antd"; +import { Alert } from "../Antd"; import * as dicomParser from "dicom-parser"; import React, { Fragment, diff --git a/src/components/Preview/HelperComponent.tsx b/src/components/Preview/HelperComponent.tsx index 29772a307..513b5494c 100644 --- a/src/components/Preview/HelperComponent.tsx +++ b/src/components/Preview/HelperComponent.tsx @@ -1,9 +1,9 @@ -import { ReactNode } from "react"; import { Button, Modal, ModalVariant, Tooltip } from "@patternfly/react-core"; -import { FeedFile } from "@fnndsc/chrisapi"; +import type { ReactNode } from "react"; +import type { FileBrowserFolderFile } from "@fnndsc/chrisapi"; import ReactJson from "react-json-view"; +import { Alert } from "../Antd"; import { SpinContainer } from "../Common"; -import { Alert } from "antd"; export const GalleryButtonContainer = ({ handleClick, @@ -54,7 +54,7 @@ export const TagInfoModal = ({ handleModalToggle: (event: string, value: boolean) => void; parsingError: string; output?: any[]; - file?: FeedFile; + file?: FileBrowserFolderFile; }) => { return ( - action(TSPluginTypes.ADD_TS_NODE, node); -export const deleteTsNode = (node: PluginInstance) => - action(TSPluginTypes.DELETE_TS_NODE, node); - -export const switchTreeMode = (mode: boolean) => - action(TSPluginTypes.SWITCH_TREE_MODE, mode); - -export const resetTsNodes = () => action(TSPluginTypes.RESET_TS_NODES); diff --git a/src/store/tsplugins/reducer.ts b/src/store/tsplugins/reducer.ts deleted file mode 100644 index fa4dfe923..000000000 --- a/src/store/tsplugins/reducer.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { produce } from "immer"; -import type { Reducer } from "redux"; -import { type ITSPluginState, TSPluginTypes } from "./types"; - -export const initialState: ITSPluginState = { - treeMode: true, - tsNodes: undefined, -}; - -const reducer: Reducer = produce( - (draft: ITSPluginState, action: typeof TSPluginTypes) => { - switch (action.type) { - case TSPluginTypes.ADD_TS_NODE: { - if (!draft.tsNodes) { - draft.tsNodes = [action.payload]; - } else { - const nodeIndex = draft.tsNodes.findIndex( - (node) => node.data.id === action.payload.data.id, - ); - - if (nodeIndex !== -1) { - draft.tsNodes.splice(nodeIndex, 1); - } else { - draft.tsNodes.push(action.payload); - } - } - break; - } - - case TSPluginTypes.DELETE_TS_NODE: { - if (draft.tsNodes) { - draft.tsNodes = draft.tsNodes.filter( - (node) => node.data.id !== action.payload.data.id, - ); - } - break; - } - - case TSPluginTypes.SWITCH_TREE_MODE: { - draft.treeMode = action.payload; - draft.tsNodes = []; - break; - } - - case TSPluginTypes.RESET_TS_NODES: { - return initialState; - } - - default: - return draft; - } - }, - initialState, -); - -export { reducer as tsPluginsReducer }; diff --git a/src/store/tsplugins/types.ts b/src/store/tsplugins/types.ts deleted file mode 100644 index 61d4e53ef..000000000 --- a/src/store/tsplugins/types.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { PluginInstance } from "@fnndsc/chrisapi"; -import keyMirror from "keymirror"; - -export interface ITSPluginState { - tsNodes?: PluginInstance[]; - treeMode: boolean; -} - -export const TSPluginTypes = keyMirror({ - GET_FEED_TREE_PROP: null, - SWITCH_TREE_MODE: null, - ADD_TS_NODE: null, - DELETE_TS_NODE: null, - SET_LAYOUT: null, - RESET_TS_NODES: null, -}); diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 000000000..326b830f3 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny":true, + }, + "include": ["src"] + } + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 28c51cf9f..1ffef600d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,25 +1,7 @@ { - "compilerOptions": { - "target": "ES2021", - "useDefineForClassFields": true, - "lib": ["ES2021", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny":true, - }, - "references": [{ "path": "./tsconfig.node.json" }] + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] } diff --git a/tsconfig.node.json b/tsconfig.node.json index e5dab3327..0d3d71446 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -1,11 +1,22 @@ { "compilerOptions": { - "composite": true, - "skipLibCheck": true, + "target": "ES2022", + "lib": ["ES2023"], "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ "moduleResolution": "bundler", - "noImplicitAny":true, - "allowSyntheticDefaultImports": true + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true }, "include": ["vite.config.ts"] } From 680226fc2b64b56d08aed42b75182cce26e5ea96 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 12 Aug 2024 13:17:45 -0400 Subject: [PATCH 101/337] feat: Cleanup --- package-lock.json | 586 +++++++++--------- package.json | 2 +- src/components/Feeds/FeedListView.tsx | 2 + .../NewLibrary/utils/useDeletePayload.tsx | 1 + .../Preview/displays/DcmDisplay.tsx | 29 +- .../Preview/displays/IframeDisplay.tsx | 2 +- .../Preview/displays/ImageDisplay.tsx | 2 +- .../Preview/displays/JsonDisplay.tsx | 4 +- .../Preview/displays/PdfDisplay.tsx | 4 +- .../Preview/displays/TextDisplay.tsx | 2 +- .../Preview/displays/VideoDisplay.tsx | 2 +- .../Preview/displays/XtkDisplay.tsx | 9 +- .../Preview/displays/dicomUtils/utils.ts | 24 +- 13 files changed, 343 insertions(+), 326 deletions(-) diff --git a/package-lock.json b/package-lock.json index fedd0e788..2adf0c3e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", "@types/d3-zoom": "^3.0.8", - "antd": "^5.19.2", + "antd": "^5.20.1", "axios": "^1.7.2", "d3-hierarchy": "^1.1.9", "d3-selection": "^3.0.0", @@ -168,6 +168,30 @@ "node": ">=6.9.0" } }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/fast-color/node_modules/@babel/runtime": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@ant-design/icons": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.4.0.tgz", @@ -748,9 +772,9 @@ } }, "node_modules/@cornerstonejs/core": { - "version": "1.83.1", - "resolved": "https://registry.npmjs.org/@cornerstonejs/core/-/core-1.83.1.tgz", - "integrity": "sha512-VuLjcBZ+qPeUh+8RDrma7SvDGMEA/kXb1nsf+1yQTJQsqJmNiSyV+Pb7q/bn4X270KtGrEiyCJSNkb7b2zvfhQ==", + "version": "1.84.0", + "resolved": "https://registry.npmjs.org/@cornerstonejs/core/-/core-1.84.0.tgz", + "integrity": "sha512-fggteqI08EMl561UF+jvN2ba8Xz4aZEo6jQqLSfI4v5sTdKimI/CZ5IZo2MgumsKbuzKR7wTIB6yLp4mGtxKEw==", "license": "MIT", "dependencies": { "@kitware/vtk.js": "30.4.1", @@ -765,16 +789,16 @@ } }, "node_modules/@cornerstonejs/dicom-image-loader": { - "version": "1.83.1", - "resolved": "https://registry.npmjs.org/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.83.1.tgz", - "integrity": "sha512-kT8kPikzDBkHGPE/Cr3ryUhpAbOVXUYW4y83nWPdwTlq6DzHnhX1aEWn2WkzYqzL7fsyfcaUA9AN+HEYjCN5jw==", + "version": "1.84.0", + "resolved": "https://registry.npmjs.org/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.84.0.tgz", + "integrity": "sha512-iNOZvqyZrK7Xq3U5er0Su9z9bBY57ZUylAsHvzk2AnkiheO7JnZDE+FFLddlHIDMZgfgkPS55zdiiA01d4VzBg==", "license": "MIT", "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", - "@cornerstonejs/core": "^1.83.1", + "@cornerstonejs/core": "^1.84.0", "dicom-parser": "^1.8.9", "pako": "^2.0.4", "uuid": "^9.0.0" @@ -787,12 +811,12 @@ "license": "(MIT AND Zlib)" }, "node_modules/@cornerstonejs/streaming-image-volume-loader": { - "version": "1.83.1", - "resolved": "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-1.83.1.tgz", - "integrity": "sha512-LcrrS1v5OOF2CkhcITAMKcoV/W3jQcCMzOl4oQHGtw6fJSSWpbQZjsIU94YnSUyhr/I0St3uTedNk5sNNzY66A==", + "version": "1.84.0", + "resolved": "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-1.84.0.tgz", + "integrity": "sha512-IKuotqBtHSVAYRZ1LkRG08eC/LEcGgvwRGq/0MPYkwSMSawOvVFRGzeTmFkHuQ09U8RDxhX/QMeIxIcbQfRfWA==", "license": "MIT", "dependencies": { - "@cornerstonejs/core": "^1.83.1", + "@cornerstonejs/core": "^1.84.0", "comlink": "^4.4.1" }, "funding": { @@ -801,12 +825,12 @@ } }, "node_modules/@cornerstonejs/tools": { - "version": "1.83.1", - "resolved": "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-1.83.1.tgz", - "integrity": "sha512-KbMIFgXhuMp2zl5ORLkbJY6SwioyGlDw91cU3Hu02WR2KNTbm2b8oIzTY09F4/UzI0n19064mmP5TsPMRPsjMw==", + "version": "1.84.0", + "resolved": "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-1.84.0.tgz", + "integrity": "sha512-k5ncLUxQa7GXRJLUJwkWKCSg6YLrDnIIgrd4VHOvbkjOdjhZ5rrk3fradaBIy/aMl2h5lzK8yCvwxySHm5OSsg==", "license": "MIT", "dependencies": { - "@cornerstonejs/core": "^1.83.1", + "@cornerstonejs/core": "^1.84.0", "@icr/polyseg-wasm": "0.4.0", "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -1613,13 +1637,13 @@ "license": "MIT" }, "node_modules/@playwright/test": { - "version": "1.45.3", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.3.tgz", - "integrity": "sha512-UKF4XsBfy+u3MFWEH44hva1Q8Da28G6RFtR2+5saw+jgAFQV5yYnB1fu68Mz7fO+5GJF3wgwAIs0UelU8TxFrA==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.0.tgz", + "integrity": "sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.45.3" + "playwright": "1.46.0" }, "bin": { "playwright": "cli.js" @@ -1669,13 +1693,13 @@ } }, "node_modules/@rc-component/color-picker": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.5.3.tgz", - "integrity": "sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", "license": "MIT", "dependencies": { + "@ant-design/fast-color": "^2.0.6", "@babel/runtime": "^7.23.6", - "@ctrl/tinycolor": "^3.6.1", "classnames": "^2.2.6", "rc-util": "^5.38.1" }, @@ -1809,9 +1833,9 @@ } }, "node_modules/@rc-component/trigger": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.0.tgz", - "integrity": "sha512-QarBCji02YE9aRFhZgRZmOpXBj0IZutRippsVBv85sxvG4FGk/vRxwAlkn3MS9zK5mwbETd86mAVg2tKqTkdJA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.1.tgz", + "integrity": "sha512-fuU11J8pOt6+U/tU6/CAv8wjCwGaNeRk9f5k8HQth7JBbJ6MMH62WhGycVW75VnXfBZgL/7kO+wbiO2Xc9U9sQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2", @@ -1929,9 +1953,9 @@ "license": "MIT" }, "node_modules/@remix-run/router": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz", - "integrity": "sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.0.tgz", + "integrity": "sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -1950,9 +1974,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz", - "integrity": "sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", "cpu": [ "arm" ], @@ -1964,9 +1988,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz", - "integrity": "sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", "cpu": [ "arm64" ], @@ -1978,9 +2002,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz", - "integrity": "sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", "cpu": [ "arm64" ], @@ -1992,9 +2016,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz", - "integrity": "sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", "cpu": [ "x64" ], @@ -2006,9 +2030,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz", - "integrity": "sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", "cpu": [ "arm" ], @@ -2020,9 +2044,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz", - "integrity": "sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", "cpu": [ "arm" ], @@ -2034,9 +2058,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz", - "integrity": "sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", "cpu": [ "arm64" ], @@ -2048,9 +2072,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz", - "integrity": "sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", "cpu": [ "arm64" ], @@ -2062,9 +2086,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz", - "integrity": "sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", "cpu": [ "ppc64" ], @@ -2076,9 +2100,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz", - "integrity": "sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", "cpu": [ "riscv64" ], @@ -2090,9 +2114,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz", - "integrity": "sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", "cpu": [ "s390x" ], @@ -2104,9 +2128,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz", - "integrity": "sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", "cpu": [ "x64" ], @@ -2117,9 +2141,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz", - "integrity": "sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", "cpu": [ "x64" ], @@ -2131,9 +2155,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz", - "integrity": "sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", "cpu": [ "arm64" ], @@ -2145,9 +2169,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz", - "integrity": "sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", "cpu": [ "ia32" ], @@ -2159,9 +2183,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz", - "integrity": "sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", "cpu": [ "x64" ], @@ -2173,9 +2197,9 @@ ] }, "node_modules/@swc/core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.4.tgz", - "integrity": "sha512-+wSycNxOw9QQz81AJAZlNS34EtOIifwUXMPACg05PWjECsjOKDTXLCVPx6J0lRaxhHSGBU2OYs9mRfIvxGt3CA==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.10.tgz", + "integrity": "sha512-l0xrFwBQ9atizhmV94yC2nwcecTk/oftofwMNPiFMGe56dqdmi2ArHaTV3PCtMlgaUH6rGCehoRMt5OrCI1ktg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -2191,16 +2215,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.4", - "@swc/core-darwin-x64": "1.7.4", - "@swc/core-linux-arm-gnueabihf": "1.7.4", - "@swc/core-linux-arm64-gnu": "1.7.4", - "@swc/core-linux-arm64-musl": "1.7.4", - "@swc/core-linux-x64-gnu": "1.7.4", - "@swc/core-linux-x64-musl": "1.7.4", - "@swc/core-win32-arm64-msvc": "1.7.4", - "@swc/core-win32-ia32-msvc": "1.7.4", - "@swc/core-win32-x64-msvc": "1.7.4" + "@swc/core-darwin-arm64": "1.7.10", + "@swc/core-darwin-x64": "1.7.10", + "@swc/core-linux-arm-gnueabihf": "1.7.10", + "@swc/core-linux-arm64-gnu": "1.7.10", + "@swc/core-linux-arm64-musl": "1.7.10", + "@swc/core-linux-x64-gnu": "1.7.10", + "@swc/core-linux-x64-musl": "1.7.10", + "@swc/core-win32-arm64-msvc": "1.7.10", + "@swc/core-win32-ia32-msvc": "1.7.10", + "@swc/core-win32-x64-msvc": "1.7.10" }, "peerDependencies": { "@swc/helpers": "*" @@ -2212,9 +2236,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.4.tgz", - "integrity": "sha512-RbWrdGh+x9xKFUA9/kPZRR8OPxUsDUuPyLjPIGLYZMO+ftht2vhVH7QsUq6lg+jAP34eIya72UA1isiZe+BRaA==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.10.tgz", + "integrity": "sha512-TYp4x/9w/C/yMU1olK5hTKq/Hi7BjG71UJ4V1U1WxI1JA3uokjQ/GoktDfmH5V5pX4dgGSOJwUe2RjoN8Z/XnA==", "cpu": [ "arm64" ], @@ -2229,9 +2253,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.4.tgz", - "integrity": "sha512-TxCWMJs4OrqApjFuT8cUiqMz0zg97F0JsXBEeZ7zjkyv9XJ/rN2pdwqMlZv0Wv2C2rivOPo6FsWYlZ3V8ZHhyA==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.10.tgz", + "integrity": "sha512-P3LJjAWh5yLc6p5IUwV5LgRfA3R1oDCZDMabYyb2BVQuJTD4MfegW9DhBcUUF5dhBLwq3191KpLVzE+dLTbiXw==", "cpu": [ "x64" ], @@ -2246,9 +2270,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.4.tgz", - "integrity": "sha512-5IhwIJZAgkkfI6PqgQ3xk0/2hTAVsAczIPLiR2Epp30EgsNo1KIFL0ZHzrnvJPy5BZ3jy3T1dEbDE/memBOEmA==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.10.tgz", + "integrity": "sha512-yGOFjE7w/akRTmqGY3FvWYrqbxO7OB2N2FHj2LO5HtzXflfoABb5RyRvdEquX+17J6mEpu4EwjYNraTD/WHIEQ==", "cpu": [ "arm" ], @@ -2263,9 +2287,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.4.tgz", - "integrity": "sha512-0787jri83jigf26mF8FndWehh7jqMaHwAm/OV6VdToyNo/g+d1AxVpkEizrywZK46el+AObnHUIHIHwZgO21LA==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.10.tgz", + "integrity": "sha512-SPWsgWHfdWKKjLrYlvhxcdBJ7Ruy6crJbPoE9NfD95eJEjMnS2yZTqj2ChFsY737WeyhWYlHzgYhYOVCp83YwQ==", "cpu": [ "arm64" ], @@ -2280,9 +2304,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.4.tgz", - "integrity": "sha512-A45hGKWAGcjU5Ol0uQUoK0tHerwEKxfprYUZbmPLpD2yrpMZr+dTrwY2n075sixs7RuZEccBkgGNpehEe5BPBQ==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.10.tgz", + "integrity": "sha512-PUi50bkNqnBL3Z/Zq6jSfwgN9A/taA6u2Zou0tjDJi7oVdpjdr7SxNgCGzMJ/nNg5D/IQn1opM1jktMvpsPAuQ==", "cpu": [ "arm64" ], @@ -2297,9 +2321,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.4.tgz", - "integrity": "sha512-bcO1MpAm39TXqqHuYW4ox4vDvhB7jkguwMwxvmL+cKBGsUHrIoUTfGt9NM9N4D4CvOwULlxqbyt19veUJ7CVPw==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.10.tgz", + "integrity": "sha512-Sc+pY55gknCAmBQBR6DhlA7jZSxHaLSDb5Sevzi6DOFMXR79NpA6zWTNKwp1GK2AnRIkbAfvYLgOxS5uWTFVpg==", "cpu": [ "x64" ], @@ -2314,9 +2338,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.4.tgz", - "integrity": "sha512-N6nXuHyDO/q5kPN2xQxz5BEvhFpgnFSkP+9wxg5xWq+qIQL5bv37jk8dkKvMLx/8fHzTqrIjPDSRzVbcL7sqXg==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.10.tgz", + "integrity": "sha512-g5NKx2LXaGd0K26hmEts1Cvb7ptIvq3MHSgr6/D1tRPcDZw1Sp0dYsmyOv0ho4F5GOJyiCooG3oE9FXdb7jIpQ==", "cpu": [ "x64" ], @@ -2331,9 +2355,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.4.tgz", - "integrity": "sha512-7W1owqCNR1cG+mpS55juiZlR/lrAdxB1pH32egeOipNKOLGwyqmlzQ0g9tkQTNgzwgfpCUg8z606+GqqXvajZw==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.10.tgz", + "integrity": "sha512-plRIsOcfy9t9Q/ivm5DA7I0HaIvfAWPbI+bvVRrr3C/1K2CSqnqZJjEWOAmx2LiyipijNnEaFYuLBp0IkGuJpg==", "cpu": [ "arm64" ], @@ -2348,9 +2372,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.4.tgz", - "integrity": "sha512-saLkY+q7zNPk4gYiUBCc93FYPo4ECXMjHcSPtLVHoPZBIxRrklgaAf6aDpblBo30nVdoBE2V3YPd0Y/cPiY6RQ==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.10.tgz", + "integrity": "sha512-GntrVNT23viHtbfzmlK8lfBiKeajH24GzbDT7qXhnoO20suUPcyYZxyvCb4gWM2zu8ZBTPHNlqfrNsriQCZ+lQ==", "cpu": [ "ia32" ], @@ -2365,9 +2389,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.4.tgz", - "integrity": "sha512-zKF6jpRBNuVKgOf2W5dMcPyjwcNCp21syjl9lvLRbCeIg+1U+zjdoQCAmMWWoPNE7fLg+yfvohnnOJG2AdzQ9Q==", + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.10.tgz", + "integrity": "sha512-uXIF8GuSappe1imm6Lf7pHGepfCBjDQlS+qTqvEGE0wZAsL1IVATK9P/cH/OCLfJXeQDTLeSYmrpwjtXNt46tQ==", "cpu": [ "x64" ], @@ -2399,9 +2423,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.51.16", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.16.tgz", - "integrity": "sha512-zfV+WAtBGm1dUIbL0w/x8qTqVLKU1/Bo1p19J9LF02MmIc4FxzMImMXhFzYJQl5Hx8Wit6RiQ4tB/DvN8y9zaQ==", + "version": "5.51.21", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.21.tgz", + "integrity": "sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw==", "license": "MIT", "funding": { "type": "github", @@ -2409,12 +2433,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.51.16", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.16.tgz", - "integrity": "sha512-NZnpJ30zkwaA2ZPhxJLs/qoMbd0yNAj6yyb3JTADJx9HjSdtvnNzOY1bDa3bU1B9CZTBBb7W9E1PpWlNXdgESg==", + "version": "5.51.23", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.23.tgz", + "integrity": "sha512-CfJCfX45nnVIZjQBRYYtvVMIsGgWLKLYC4xcUiYEey671n1alvTZoCBaU9B85O8mF/tx9LPyrI04A6Bs2THv4A==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.51.16" + "@tanstack/query-core": "5.51.21" }, "funding": { "type": "github", @@ -2609,9 +2633,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.13.tgz", - "integrity": "sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==", + "version": "20.14.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", + "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -2903,7 +2927,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -2961,9 +2984,9 @@ } }, "node_modules/antd": { - "version": "5.19.4", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.19.4.tgz", - "integrity": "sha512-bhSNzeScfaeN85LrQXZh5fD26y6uB+6c5cgoPUmW7lkC5oDN4mnT04yYcpqHpZD8p227AmycE+ZrcnilJH9log==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.20.1.tgz", + "integrity": "sha512-YjVCYAfBjrTyNKsg+heAOR0Gm4qJNJoBZQcV1h1BX/ufwoLx0PC5RGs75g6gQFy/1nv8OrJH7DXUGdtwPMB3Vg==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.1.0", @@ -2973,11 +2996,11 @@ "@ant-design/react-slick": "~1.1.2", "@babel/runtime": "^7.24.8", "@ctrl/tinycolor": "^3.6.1", - "@rc-component/color-picker": "~1.5.3", + "@rc-component/color-picker": "~2.0.1", "@rc-component/mutate-observer": "^1.1.0", "@rc-component/qrcode": "~1.0.0", "@rc-component/tour": "~1.15.0", - "@rc-component/trigger": "^2.2.0", + "@rc-component/trigger": "^2.2.1", "classnames": "^2.5.1", "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.11", @@ -2987,27 +3010,27 @@ "rc-dialog": "~9.5.2", "rc-drawer": "~7.2.0", "rc-dropdown": "~4.2.0", - "rc-field-form": "~2.2.1", + "rc-field-form": "~2.3.0", "rc-image": "~7.9.0", - "rc-input": "~1.5.1", - "rc-input-number": "~9.1.0", - "rc-mentions": "~2.14.0", + "rc-input": "~1.6.3", + "rc-input-number": "~9.2.0", + "rc-mentions": "~2.15.0", "rc-menu": "~9.14.1", "rc-motion": "^2.9.2", "rc-notification": "~5.6.0", "rc-pagination": "~4.2.0", - "rc-picker": "~4.6.9", + "rc-picker": "~4.6.12", "rc-progress": "~4.0.0", "rc-rate": "~2.13.0", "rc-resize-observer": "^1.4.0", "rc-segmented": "~2.3.0", "rc-select": "~14.15.1", - "rc-slider": "~10.6.2", + "rc-slider": "~11.1.5", "rc-steps": "~6.0.1", "rc-switch": "~4.1.0", "rc-table": "~7.45.7", "rc-tabs": "~15.1.1", - "rc-textarea": "~1.7.0", + "rc-textarea": "~1.8.1", "rc-tooltip": "~6.2.0", "rc-tree": "~5.8.8", "rc-tree-select": "~5.22.1", @@ -3054,7 +3077,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true, "license": "MIT" }, "node_modules/argparse": { @@ -3132,9 +3154,9 @@ } }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", + "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -3350,9 +3372,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", - "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -3369,9 +3391,9 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001640", - "electron-to-chromium": "^1.4.820", - "node-releases": "^2.0.14", + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, "bin": { @@ -3474,9 +3496,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001645", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001645.tgz", - "integrity": "sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==", + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", "funding": [ { "type": "opencollective", @@ -3598,7 +3620,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -3747,9 +3768,9 @@ } }, "node_modules/core-js": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", - "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.0.tgz", + "integrity": "sha512-XPpwqEodRljce9KswjZShh95qJ1URisBeKCjUdq27YdenkslVe7OO0ZJhlYXAChW7OhXaRLl8AAba7IBfoIHug==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -4344,9 +4365,9 @@ } }, "node_modules/detect-gpu": { - "version": "5.0.41", - "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.41.tgz", - "integrity": "sha512-0avjQwm8zyDPLmmp2PlaUxOWp/CNLbOU4t61x1IOTmBvC7UO+NMWDlEJcIjtbRBSnulC2ote81Xyillssam0CA==", + "version": "5.0.43", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.43.tgz", + "integrity": "sha512-KVcUS/YzsZIBIACz6p2xpuBpAjaY4wiELImJ7M8rb9i16NE6frnVpSV/UBpkK6DYj4Wd3NJeE4sghcaypuM8bg==", "license": "MIT", "dependencies": { "webgl-constants": "^1.1.1" @@ -4456,9 +4477,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", - "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==", + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.6.tgz", + "integrity": "sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==", "license": "ISC" }, "node_modules/elliptic": { @@ -5225,7 +5246,6 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, "license": "ISC" }, "node_modules/hammerjs": { @@ -5256,7 +5276,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5464,7 +5483,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -5474,7 +5492,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5611,7 +5628,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, "license": "MIT" }, "node_modules/is-windows": { @@ -5642,7 +5658,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { @@ -5870,9 +5885,9 @@ } }, "node_modules/lefthook": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.7.11.tgz", - "integrity": "sha512-IJ9KSk3+dkjTmKEsH2XJC4elocdgXzIznAHfbgr+5N/dJoB3fj8xNWfNx5fDhjT6so4eCJgdOrF9NJ7cS4wRvw==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.7.12.tgz", + "integrity": "sha512-kZQQAeL4JZbsADqzK5YMP7M0aadGVDha7oo+4exA5FeQbgpmnDq+ejbkdfLOdo9uy7FSY82akmbxAiXq+V4fbg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5880,20 +5895,20 @@ "lefthook": "bin/index.js" }, "optionalDependencies": { - "lefthook-darwin-arm64": "1.7.11", - "lefthook-darwin-x64": "1.7.11", - "lefthook-freebsd-arm64": "1.7.11", - "lefthook-freebsd-x64": "1.7.11", - "lefthook-linux-arm64": "1.7.11", - "lefthook-linux-x64": "1.7.11", - "lefthook-windows-arm64": "1.7.11", - "lefthook-windows-x64": "1.7.11" + "lefthook-darwin-arm64": "1.7.12", + "lefthook-darwin-x64": "1.7.12", + "lefthook-freebsd-arm64": "1.7.12", + "lefthook-freebsd-x64": "1.7.12", + "lefthook-linux-arm64": "1.7.12", + "lefthook-linux-x64": "1.7.12", + "lefthook-windows-arm64": "1.7.12", + "lefthook-windows-x64": "1.7.12" } }, "node_modules/lefthook-darwin-arm64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.11.tgz", - "integrity": "sha512-JQtGTM2uZF/3MGKmqb3jg8KG0B/V+2IU+H2jLvRtJULjHQxgiAQGsCJZKCYr8Uvq2/sbjaa+YdiKHROlqt7O6w==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.12.tgz", + "integrity": "sha512-CjbV968FMFJWBe/5UA4H3DiKH5TFCh0449pfr9NTt14r05FIg6YzLf5h97CYlDz3b0Bx8Iz8ZqoguE1dFrYpsg==", "cpu": [ "arm64" ], @@ -5905,9 +5920,9 @@ ] }, "node_modules/lefthook-darwin-x64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.11.tgz", - "integrity": "sha512-sfHzHklBh/xEiRGbCkIWZfkyf6gxg4nSryKuA7M6VgwooauXYN+0aXxNbK4CjXBPSMhSCSHh6uHXsqXWaVrTCQ==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.12.tgz", + "integrity": "sha512-EEwh5zU65MwfwkGOpBW7rd0Ldg7Ef17VoFUQ/pr408acLq7BvNOrrFga/RNUvB5Hsaa7eNjBbv0AG02qE3X/ZA==", "cpu": [ "x64" ], @@ -5919,9 +5934,9 @@ ] }, "node_modules/lefthook-freebsd-arm64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.11.tgz", - "integrity": "sha512-UsEHI2xB0c+k3DfTNhl9STBuxZMkgMCUdOS2r6OkVoUY5Uf1PVUH+OTq7dvSAnsueSl6r+3xyCBz2tn48uVwbA==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.12.tgz", + "integrity": "sha512-BznKfuFw9lWhqJFrI+ci2EyS5vvfEWTcsISTq0o4a/kR058stK/6B+i+XnTHrHsiOjQbLJ42wcFgvUEFmio6yw==", "cpu": [ "arm64" ], @@ -5933,9 +5948,9 @@ ] }, "node_modules/lefthook-freebsd-x64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.11.tgz", - "integrity": "sha512-WJznUCrP8kb0nlxWvlvfWJm/SAW0TOJOv2VFeFLInYM1ylFVUVeV2fEvEHOjGIKyt96+uAnbiHOkqIYbhfc03g==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.12.tgz", + "integrity": "sha512-9+I0xakvqpAIxhPb5ON6a5v/Iyl+gahJi+ogoEDNqlg3zj4otZspOvdiAsLWBAaXI+yFQftOHBM8940Ki5RB0A==", "cpu": [ "x64" ], @@ -5947,9 +5962,9 @@ ] }, "node_modules/lefthook-linux-arm64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.11.tgz", - "integrity": "sha512-4S+Gdr5jWmwrfHGokcuRQm/A92KLRwYotBgOMwf0etQa4n9B6FGXEi59IOuFNHeZXY4DpxA9A8AvplVdN5KSOA==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.12.tgz", + "integrity": "sha512-FC+4cyz2CUBVL4BnDwnAzQPdBHM80O2TM53qoT1R3sn9LbWwcpnwdXi86NhVD0I7+vKg6rGUKgOQMTZfSe+sDg==", "cpu": [ "arm64" ], @@ -5961,9 +5976,9 @@ ] }, "node_modules/lefthook-linux-x64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.7.11.tgz", - "integrity": "sha512-3CwNNpRa1fHlymgtxjHQ0BqYMvvj3WXvX4eq1BT+w5NF7h5ZjVaK+nilpgEWUUTQyF66FLai+CGx6wfKvcPOag==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.7.12.tgz", + "integrity": "sha512-BH9peuKjx2ikOxjnohdAH4ocRfC2NZQTXrJXsAdPOFja1iNHzBwpZe+/x+g8fO8a3WVrmBWad3814Hb/oGCICA==", "cpu": [ "x64" ], @@ -5975,9 +5990,9 @@ ] }, "node_modules/lefthook-windows-arm64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.11.tgz", - "integrity": "sha512-DfLVQ4F1iQcudTDnX/Ru1WNSN2OBPrHwwcWVVdQ/KDYWSru6dd4f18M7g98TZ2X9nYHA5IWrX8w2DaBR6P0/bw==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.12.tgz", + "integrity": "sha512-GlCNSpXAiBcCQ8jtcFGxkxGzqnsPzGWbx9HTYO7Xz1QjW56de311rdntyVIRl48nQ+Q76fVyEKAtsyQczvRN6w==", "cpu": [ "arm64" ], @@ -5989,9 +6004,9 @@ ] }, "node_modules/lefthook-windows-x64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.11.tgz", - "integrity": "sha512-xAZP4tQr/6YKbKKvp0qMf6UnToXxo9RulzpKq+v5SiGWE5rz3G12XpyaNVslfrb1N30Yp8wUdZdlXBqhUvltYw==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.12.tgz", + "integrity": "sha512-9GeeQVUX7R8irJ5mf0Zzxn74ZTpy1LHqIGPRAmn9ELtkVdne/DGpCcGyKGVoJFbMInEaeDHGOnVjeQ9kgWB8Fw==", "cpu": [ "x64" ], @@ -7140,12 +7155,12 @@ } }, "node_modules/niivue-react": { - "resolved": "git+ssh://git@github.com/niivue/niivue-react.git#1efaf77310eac2d752a62f68824eef1808856421", + "resolved": "git+ssh://git@github.com/niivue/niivue-react.git#d7734b88359b61356fec5bfa302e02536e0a1134", "dependencies": { "dequal": "^2.0.3" }, "peerDependencies": { - "@niivue/niivue": "^0.39.0", + "@niivue/niivue": "^0.44.2", "react": "^17 || ^18", "typescript": "^5.0.0" } @@ -9742,7 +9757,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -9976,13 +9990,13 @@ "license": "MIT" }, "node_modules/playwright": { - "version": "1.45.3", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.3.tgz", - "integrity": "sha512-QhVaS+lpluxCaioejDZ95l4Y4jSFCsBvl2UZkpeXlzxmqS+aABr5c82YmfMHrL6x27nvrvykJAFpkzT2eWdJww==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.0.tgz", + "integrity": "sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.45.3" + "playwright-core": "1.46.0" }, "bin": { "playwright": "cli.js" @@ -9995,9 +10009,9 @@ } }, "node_modules/playwright-core": { - "version": "1.45.3", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.3.tgz", - "integrity": "sha512-+ym0jNbcjikaOwwSZycFbwkWgfruWvYlJfThKYAlImbxUgdWFO2oW70ojPm4OpE4t6TAo2FY/smM+hpVTtkhDA==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.0.tgz", + "integrity": "sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==", "dev": true, "license": "Apache-2.0", "bin": { @@ -10008,9 +10022,9 @@ } }, "node_modules/postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "funding": [ { "type": "opencollective", @@ -10294,9 +10308,9 @@ } }, "node_modules/rc-field-form": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.2.1.tgz", - "integrity": "sha512-uoNqDoR7A4tn4QTSqoWPAzrR7ZwOK5I+vuZ/qdcHtbKx+ZjEsTg7QXm2wk/jalDiSksAQmATxL0T5LJkRREdIA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.3.0.tgz", + "integrity": "sha512-QyiYrE3uweGGi21MJpxHFmDW+Tb1yt5hitM1k0EbWc5hKDiSf5imOBc6NLLHrYk+sdelrw2Ju/fD4uRQdhSqNg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -10330,9 +10344,9 @@ } }, "node_modules/rc-input": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.5.1.tgz", - "integrity": "sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.6.3.tgz", + "integrity": "sha512-wI4NzuqBS8vvKr8cljsvnTUqItMfG1QbJoxovCgL+DX4eVUcHIjVwharwevIxyy7H/jbLryh+K7ysnJr23aWIA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -10345,15 +10359,15 @@ } }, "node_modules/rc-input-number": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.1.0.tgz", - "integrity": "sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.2.0.tgz", + "integrity": "sha512-5XZFhBCV5f9UQ62AZ2hFbEY8iZT/dm23Q1kAg0H8EvOgD3UDbYYJAayoVIkM3lQaCqYAW5gV0yV3vjw1XtzWHg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/mini-decimal": "^1.0.1", "classnames": "^2.2.5", - "rc-input": "~1.5.0", + "rc-input": "~1.6.0", "rc-util": "^5.40.1" }, "peerDependencies": { @@ -10362,17 +10376,17 @@ } }, "node_modules/rc-mentions": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.14.0.tgz", - "integrity": "sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.15.0.tgz", + "integrity": "sha512-f5v5i7VdqvBDXbphoqcQWmXDif2Msd2arritVoWybrVDuHE6nQ7XCYsybHbV//WylooK52BFDouFvyaRDtXZEw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.22.5", "@rc-component/trigger": "^2.0.0", "classnames": "^2.2.6", - "rc-input": "~1.5.0", + "rc-input": "~1.6.0", "rc-menu": "~9.14.0", - "rc-textarea": "~1.7.0", + "rc-textarea": "~1.8.0", "rc-util": "^5.34.1" }, "peerDependencies": { @@ -10464,9 +10478,9 @@ } }, "node_modules/rc-picker": { - "version": "4.6.11", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.11.tgz", - "integrity": "sha512-PEVH5MMTUrdvTTxCmPndsXiJL7TFLSu8q0cDdZrhdcjn8en3NbuhOFacWqKTvdnfG53RPPhiBssXCUHYyc3R/Q==", + "version": "4.6.12", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.12.tgz", + "integrity": "sha512-wZhBf/L1JV/yCnhuVol42nBpZqxV+Nam1/tnsYm5ZWq0QvMLtX1lQEWceu3FyBESzOPEBIAZixiCnISHcbHsgw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", @@ -10602,9 +10616,9 @@ } }, "node_modules/rc-slider": { - "version": "10.6.2", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.6.2.tgz", - "integrity": "sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw==", + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.5.tgz", + "integrity": "sha512-b77H5PbjMKsvkYXAYIkn50QuFX6ICQmCTibDinI9q+BHx65/TV4TeU25+oadhSRzykxs0/vBWeKBwRyySOeWlg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10696,14 +10710,14 @@ } }, "node_modules/rc-textarea": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.7.0.tgz", - "integrity": "sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.8.1.tgz", + "integrity": "sha512-bm36N2ZqwZAP60ZQg2OY9mPdqWC+m6UTjHc+CqEZOxb3Ia29BGHazY/s5bI8M4113CkqTzhtFUDNA078ZiOx3Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", - "rc-input": "~1.5.0", + "rc-input": "~1.6.0", "rc-resize-observer": "^1.0.0", "rc-util": "^5.27.0" }, @@ -11081,12 +11095,12 @@ } }, "node_modules/react-router": { - "version": "6.25.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.25.1.tgz", - "integrity": "sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.0.tgz", + "integrity": "sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.18.0" + "@remix-run/router": "1.19.0" }, "engines": { "node": ">=14.0.0" @@ -11096,13 +11110,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.25.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.25.1.tgz", - "integrity": "sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.0.tgz", + "integrity": "sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.18.0", - "react-router": "6.25.1" + "@remix-run/router": "1.19.0", + "react-router": "6.26.0" }, "engines": { "node": ">=14.0.0" @@ -11336,9 +11350,9 @@ } }, "node_modules/rollup": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.1.tgz", - "integrity": "sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", "dev": true, "license": "MIT", "dependencies": { @@ -11352,22 +11366,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.19.1", - "@rollup/rollup-android-arm64": "4.19.1", - "@rollup/rollup-darwin-arm64": "4.19.1", - "@rollup/rollup-darwin-x64": "4.19.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.19.1", - "@rollup/rollup-linux-arm-musleabihf": "4.19.1", - "@rollup/rollup-linux-arm64-gnu": "4.19.1", - "@rollup/rollup-linux-arm64-musl": "4.19.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.19.1", - "@rollup/rollup-linux-riscv64-gnu": "4.19.1", - "@rollup/rollup-linux-s390x-gnu": "4.19.1", - "@rollup/rollup-linux-x64-gnu": "4.19.1", - "@rollup/rollup-linux-x64-musl": "4.19.1", - "@rollup/rollup-win32-arm64-msvc": "4.19.1", - "@rollup/rollup-win32-ia32-msvc": "4.19.1", - "@rollup/rollup-win32-x64-msvc": "4.19.1", + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", "fsevents": "~2.3.2" } }, @@ -11513,7 +11527,6 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -11615,7 +11628,6 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, "license": "ISC" }, "node_modules/sirv": { @@ -11888,7 +11900,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -11945,9 +11956,9 @@ } }, "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, @@ -12609,14 +12620,14 @@ } }, "node_modules/vite": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", - "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", + "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", + "postcss": "^8.4.40", "rollup": "^4.13.0" }, "bin": { @@ -12636,6 +12647,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -12653,6 +12665,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -12896,7 +12911,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -13027,7 +13041,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -13040,7 +13053,6 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" diff --git a/package.json b/package.json index 71485d1ac..e0921ff14 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", "@types/d3-zoom": "^3.0.8", - "antd": "^5.19.2", + "antd": "^5.20.1", "axios": "^1.7.2", "d3-hierarchy": "^1.1.9", "d3-selection": "^3.0.0", diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 6cbe8b8f0..71d48f3d0 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -68,6 +68,7 @@ const TableSelectable: React.FC = () => { queryKey: ["feeds", perPage, page, type, search, searchType], queryFn: () => fetchFeeds(searchFolderData), enabled: type === "private", + refetchOnMount: true, }); const { @@ -78,6 +79,7 @@ const TableSelectable: React.FC = () => { queryKey: ["publicFeeds", perPage, page, type, search, searchType], queryFn: () => fetchPublicFeeds(searchFolderData), enabled: type === "public", + refetchOnMount: true, }); const feedsToDisplay = type === "private" ? data?.feeds || [] : publicFeeds?.feeds || []; diff --git a/src/components/NewLibrary/utils/useDeletePayload.tsx b/src/components/NewLibrary/utils/useDeletePayload.tsx index 9714a2829..ad1aac809 100644 --- a/src/components/NewLibrary/utils/useDeletePayload.tsx +++ b/src/components/NewLibrary/utils/useDeletePayload.tsx @@ -81,6 +81,7 @@ const useDeletePayload = (inValidateFolders: () => void, api: any) => { if (notificationKey) { api.destroy(notificationKey); } + api.success({ message: "Deletion Successful", description: "Selected files and folders were successfully deleted.", diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 5bd39cde4..ca9b30767 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -1,27 +1,28 @@ -import { useEffect, useState, useRef } from "react"; +import type { RenderingEngine } from "@cornerstonejs/core"; +import type { FileBrowserFolderFile } from "@fnndsc/chrisapi"; +import { useQuery } from "@tanstack/react-query"; +import { useEffect, useRef, useState } from "react"; +import { v4 } from "uuid"; import { FileViewerModel, - IFileBlob, + type IFileBlob, getFileExtension, } from "../../../api/model"; +import { SpinContainer } from "../../Common"; +import useSize from "../../FeedTree/useSize"; +import type { ActionState } from "../FileDetailView"; import { - displayDicomImage, - loadDicomImage, - basicInit, - handleEvents, type IStackViewport, - setUpTooling, + basicInit, cleanupCornerstoneTooling, + displayDicomImage, + handleEvents, + loadDicomImage, registerToolingOnce, removeTools, + setUpTooling, } from "./dicomUtils/utils"; -import useSize from "../../FeedTree/useSize"; -import { type ActionState } from "../FileDetailView"; import { _loadImageIntoBuffer } from "./dicomUtils/webImageLoader"; -import { RenderingEngine } from "@cornerstonejs/core"; -import { v4 } from "uuid"; -import { useQuery } from "@tanstack/react-query"; -import { SpinContainer } from "../../Common"; export type DcmImageProps = { fileItem: IFileBlob; @@ -88,7 +89,7 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { imageID = await loadDicomImage(blob); } else { const fileviewer = new FileViewerModel(); - const fileName = fileviewer.getFileName(file); + const fileName = fileviewer.getFileName(file as FileBrowserFolderFile); imageID = `web:${file.url}${fileName}`; } const { viewport, renderingEngine: newRenderingEngine } = diff --git a/src/components/Preview/displays/IframeDisplay.tsx b/src/components/Preview/displays/IframeDisplay.tsx index 3c930a2e4..49744342e 100644 --- a/src/components/Preview/displays/IframeDisplay.tsx +++ b/src/components/Preview/displays/IframeDisplay.tsx @@ -1,5 +1,5 @@ import React, { Fragment } from "react"; -import { IFileBlob } from "../../../api/model"; +import type { IFileBlob } from "../../../api/model"; type AllProps = { fileItem: IFileBlob; }; diff --git a/src/components/Preview/displays/ImageDisplay.tsx b/src/components/Preview/displays/ImageDisplay.tsx index ea97f3de4..a028298ba 100644 --- a/src/components/Preview/displays/ImageDisplay.tsx +++ b/src/components/Preview/displays/ImageDisplay.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { IFileBlob } from "../../../api/model"; +import type { IFileBlob } from "../../../api/model"; type AllProps = { fileItem: IFileBlob; diff --git a/src/components/Preview/displays/JsonDisplay.tsx b/src/components/Preview/displays/JsonDisplay.tsx index fb6b7cd31..37eab7d37 100644 --- a/src/components/Preview/displays/JsonDisplay.tsx +++ b/src/components/Preview/displays/JsonDisplay.tsx @@ -1,7 +1,7 @@ +import { Text } from "@patternfly/react-core"; import React, { useState, useContext, useEffect, useRef } from "react"; import ReactJSON from "react-json-view"; -import { IFileBlob } from "../../../api/model"; -import { Text } from "@patternfly/react-core"; +import type { IFileBlob } from "../../../api/model"; import { ThemeContext } from "../../DarkTheme/useTheme"; type AllProps = { diff --git a/src/components/Preview/displays/PdfDisplay.tsx b/src/components/Preview/displays/PdfDisplay.tsx index 7a3148273..e2e4615bc 100644 --- a/src/components/Preview/displays/PdfDisplay.tsx +++ b/src/components/Preview/displays/PdfDisplay.tsx @@ -1,5 +1,5 @@ -import React from "react"; -import { IFileBlob } from "../../../api/model"; +import type React from "react"; +import type { IFileBlob } from "../../../api/model"; type AllProps = { fileItem: IFileBlob; diff --git a/src/components/Preview/displays/TextDisplay.tsx b/src/components/Preview/displays/TextDisplay.tsx index f388bac77..7dbf53a53 100644 --- a/src/components/Preview/displays/TextDisplay.tsx +++ b/src/components/Preview/displays/TextDisplay.tsx @@ -1,5 +1,5 @@ import React, { Fragment } from "react"; -import { IFileBlob } from "../../../api/model"; +import type { IFileBlob } from "../../../api/model"; import useSize from "../../FeedTree/useSize"; type AllProps = { diff --git a/src/components/Preview/displays/VideoDisplay.tsx b/src/components/Preview/displays/VideoDisplay.tsx index 52c9359f1..15994332f 100644 --- a/src/components/Preview/displays/VideoDisplay.tsx +++ b/src/components/Preview/displays/VideoDisplay.tsx @@ -1,4 +1,4 @@ -import { IFileBlob } from "../../../api/model"; +import type { IFileBlob } from "../../../api/model"; type AllProps = { fileItem: IFileBlob; diff --git a/src/components/Preview/displays/XtkDisplay.tsx b/src/components/Preview/displays/XtkDisplay.tsx index 78c377230..48dc5c056 100644 --- a/src/components/Preview/displays/XtkDisplay.tsx +++ b/src/components/Preview/displays/XtkDisplay.tsx @@ -1,5 +1,6 @@ -import React, { useEffect, useRef } from "react"; -import { IFileBlob } from "../../../api/model"; +import type React from "react"; +import { useEffect, useRef } from "react"; +import type { IFileBlob } from "../../../api/model"; import { getXtkFileMode } from "../../XtkViewer/XtkViewer"; type AllProps = { @@ -17,7 +18,7 @@ const XtkDisplay: React.FC = ({ fileItem }: AllProps) => { async function renderFileData() { const fileData = await fileItem.blob?.arrayBuffer(); const fileName = fileItem.file?.data.fname; - let object; + let object: any = {}; if (mode === "volume") { r = new X.renderer2D(); @@ -73,7 +74,7 @@ const XtkDisplay: React.FC = ({ fileItem }: AllProps) => {
+ /> )}
); diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index 60bbb9117..e0d1be416 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -1,27 +1,27 @@ import { - RenderingEngine, - init, - Types, Enums, + RenderingEngine, + type Types, imageLoader, + init, metaData, volumeLoader, } from "@cornerstonejs/core"; -import registerWebImageLoader from "./webImageLoader"; -import { - init as csToolsInit, - Types as CornerstoneToolTypes, -} from "@cornerstonejs/tools"; -import dicomParser from "dicom-parser"; import * as cornerstone from "@cornerstonejs/core"; -import * as cornerstoneTools from "@cornerstonejs/tools"; +import cornerstonejsDICOMImageLoader from "@cornerstonejs/dicom-image-loader"; import { - cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, + cornerstoneStreamingImageVolumeLoader, } from "@cornerstonejs/streaming-image-volume-loader"; +import { + type Types as CornerstoneToolTypes, + init as csToolsInit, +} from "@cornerstonejs/tools"; +import * as cornerstoneTools from "@cornerstonejs/tools"; +import dicomParser from "dicom-parser"; import hardcodedMetaDataProvider from "./hardcodedMetaDataProvider"; -import cornerstonejsDICOMImageLoader from "@cornerstonejs/dicom-image-loader"; import ptScalingMetaDataProvider from "./ptScalingMetaDataProvider"; +import registerWebImageLoader from "./webImageLoader"; //@ts-ignore window.cornerstone = cornerstone; From e20dc684bcde59b28d12e1e692edab6664bc4346 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 12 Aug 2024 17:12:49 -0400 Subject: [PATCH 102/337] feat: Cleanup Feed Table Layout --- src/components/Common/common.css | 8 - src/components/Feeds/FeedListView.tsx | 220 +++++++++++++++----------- src/components/Feeds/Feeds.css | 4 +- src/components/Feeds/usePaginate.tsx | 2 +- 4 files changed, 130 insertions(+), 104 deletions(-) diff --git a/src/components/Common/common.css b/src/components/Common/common.css index 19a41ff90..9f56d4f54 100644 --- a/src/components/Common/common.css +++ b/src/components/Common/common.css @@ -6,11 +6,3 @@ width: 100%; } -.datatable-toolbar { - margin: 0 0.5rem 0.2rem 0; - .pf-v5-c-input-group .toolbar-label, - input { - font-size: 0.875rem; - font-weight: 500; - } -} diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 71d48f3d0..07c92829d 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -6,6 +6,7 @@ import { Checkbox, EmptyState, EmptyStateHeader, + Title, EmptyStateIcon, EmptyStateVariant, PageSection, @@ -18,7 +19,6 @@ import { } from "@patternfly/react-core"; import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; import { useQuery, useQueryClient } from "@tanstack/react-query"; -import { Typography } from "../Antd"; import { format } from "date-fns"; import type React from "react"; import { useContext, useEffect, useState } from "react"; @@ -27,7 +27,8 @@ import { useNavigate } from "react-router"; import { useTypedSelector } from "../../store/hooks"; import { setSidebarActive } from "../../store/ui/actions"; import { AddNodeProvider } from "../AddNode/context"; -import { DataTableToolbar, InfoIcon } from "../Common"; +import { Typography } from "../Antd"; +import { InfoIcon } from "../Common"; import CreateFeed from "../CreateFeed/CreateFeed"; import { CreateFeedProvider } from "../CreateFeed/context"; import { ThemeContext } from "../DarkTheme/useTheme"; @@ -50,7 +51,7 @@ const useSearchQuery = (query: URLSearchParams) => ({ page: query.get("page") || "1", search: query.get("search") || "", searchType: query.get("searchType") || "name", - perPage: query.get("perPage") || "14", + perPage: query.get("perPage") || "15", type: query.get("type") || "public", }); @@ -156,6 +157,9 @@ const TableSelectable: React.FC = () => { return ( { return ( - - Analyses (aka ChRIS feeds) are computational experiments where - data are organized and processed by ChRIS plugins. In this view - you may view your analyses and also the ones shared with you. - - } - /> - - - - - - - - - - - - + + Analyses (aka ChRIS feeds) are computational experiments where + data are organized and processed by ChRIS plugins. In this view + you may view your analyses and also the ones shared with you. + + } /> - - - +
+ {generatePagination(feedCount)} +
+ + + + + + + + + + + +
+ + { ) : ( )} - {generatePagination(feedCount)} ); @@ -472,32 +479,55 @@ const DonutUtilization = (props: { ); }; +const FeedInfoColumn = ({ + feed, + onClick, +}: { feed: Feed; onClick: (feed: Feed) => void }) => ( + +); + +const COLUMN_ORDER = [ + { id: "id", label: "ID" }, + { id: "analysis", label: "Analysis" }, + { id: "created", label: "Created" }, + { id: "creator", label: "Creator" }, + { id: "runtime", label: "Run Time" }, + { id: "size", label: "Size" }, + { id: "status", label: "Status" }, +]; + function EmptyStateTable() { return ( - - - - - - - + + ))} - @@ -505,27 +535,31 @@ function EmptyStateTable() { ); } -const LoadingTable = () => { +function LoadingTable() { return ( - +
IDAnalysisCreatedCreatorRun TimeSizeStatus + {COLUMN_ORDER.map(({ label }) => ( + {label}
- - - } - titleText="No results found" - headingLevel="h2" - /> - - + + + + + No Data Available + + + There are no analyses to display at this time. Please check back + later or adjust your filters. + +
+ + + + ))} + + + + {Array.from({ length: 15 }).map((_, index) => ( + + + {COLUMN_ORDER.map(({ id }) => ( + + ))} + + ))} + +
+ {COLUMN_ORDER.map(({ label }) => ( + {label}
+ + + +
); -}; - -const FeedInfoColumn = ({ - feed, - onClick, -}: { feed: Feed; onClick: (feed: Feed) => void }) => ( - -); +} diff --git a/src/components/Feeds/Feeds.css b/src/components/Feeds/Feeds.css index 1ce9128f3..a98b70b4d 100644 --- a/src/components/Feeds/Feeds.css +++ b/src/components/Feeds/Feeds.css @@ -26,8 +26,8 @@ .chart { text-align: right; - height: 50px; - width: 50px; + height: 40px; + width: 40px; display: block; } diff --git a/src/components/Feeds/usePaginate.tsx b/src/components/Feeds/usePaginate.tsx index ca5d2ea5e..ed9e0c548 100644 --- a/src/components/Feeds/usePaginate.tsx +++ b/src/components/Feeds/usePaginate.tsx @@ -12,7 +12,7 @@ export interface FilterState { export const usePaginate = () => { const [filterState, setFilterState] = useState({ - perPage: 14, + perPage: 15, page: 1, search: "", searchType: "name", From 5ff6db81ff68441f050ecfe5c433c686b218e9f5 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Tue, 13 Aug 2024 14:37:34 -0400 Subject: [PATCH 103/337] feat: Replace redux with redux toolkit --- package-lock.json | 73 ++++++-- package.json | 4 +- src/App.tsx | 6 +- src/components/AddNode/AddNode.tsx | 8 +- src/components/AddNode/GuidedConfig.tsx | 2 +- src/components/AddNode/SimpleDropdown.tsx | 63 +++---- src/components/AddPipeline/AddPipeline.tsx | 6 +- src/components/ComputePage/index.tsx | 2 +- src/components/Dashboard/index.tsx | 2 +- src/components/DeleteNode/index.tsx | 10 +- src/components/FeedDetails/index.tsx | 4 +- .../FeedOutputBrowser/FileBrowser.tsx | 4 +- .../FeedOutputBrowser/useFeedBrowser.tsx | 2 +- src/components/FeedTree/DropdownMenu.tsx | 6 +- src/components/FeedTree/FeedGraph.tsx | 12 +- src/components/FeedTree/FeedTree.tsx | 2 +- src/components/FeedTree/Node.tsx | 4 +- src/components/FeedTree/ParentComponent.tsx | 2 +- src/components/Feeds/FeedListView.tsx | 4 +- src/components/Feeds/FeedView.tsx | 11 +- src/components/Feeds/utilties.ts | 31 +-- src/components/Login/index.tsx | 2 +- src/components/NewLibrary/components/Cart.tsx | 6 +- .../NewLibrary/components/Operations.tsx | 6 +- src/components/NewLibrary/utils/longpress.tsx | 14 +- .../NewLibrary/utils/useDeletePayload.tsx | 6 +- .../NewLibrary/utils/useOperations.tsx | 2 +- .../NiivueDatasetViewer.tsx | 23 +-- src/components/NodeDetails/PluginTitle.tsx | 2 +- src/components/Pacs/index.tsx | 2 +- src/components/PipelinesPage/index.tsx | 2 +- src/components/PluginCatalog/index.tsx | 2 +- src/components/Signup/SignUpForm.tsx | 59 +++--- src/components/Store/index.tsx | 4 +- src/components/Wrapper/CartNotify.tsx | 2 +- src/components/Wrapper/Header.tsx | 3 +- src/components/Wrapper/Sidebar.tsx | 47 ++--- src/components/Wrapper/Toolbar.tsx | 55 ++---- src/components/Wrapper/index.tsx | 57 ++---- src/store/cart/actions.ts | 93 --------- src/store/cart/cartSlice.ts | 177 ++++++++++++++++++ src/store/cart/downloadSaga.ts | 32 +++- src/store/cart/reducer.ts | 129 ------------- src/store/cart/types.ts | 32 +--- src/store/cart/uploadSaga.ts | 18 +- src/store/configureStore.ts | 66 ++++--- src/store/drawer/actions.ts | 25 --- src/store/drawer/drawerSlice.ts | 122 ++++++++++++ src/store/drawer/reducer.ts | 103 ---------- src/store/drawer/types.ts | 22 --- src/store/explorer/actions.ts | 9 - src/store/explorer/explorerSlice.ts | 26 +++ src/store/explorer/reducer.ts | 30 --- src/store/explorer/types.ts | 6 - src/store/feed/actions.ts | 48 ----- src/store/feed/feedSlice.ts | 73 ++++++++ src/store/feed/reducer.ts | 104 ---------- src/store/feed/types.ts | 20 +- src/store/plugin/actions.ts | 24 --- src/store/plugin/pluginSlice.ts | 80 ++++++++ src/store/plugin/reducer.ts | 55 ------ src/store/plugin/saga.ts | 8 +- src/store/plugin/types.ts | 29 --- src/store/pluginInstance/actions.ts | 31 --- .../pluginInstance/pluginInstanceSlice.ts | 90 +++++++++ src/store/pluginInstance/reducer.ts | 95 ---------- src/store/pluginInstance/saga.ts | 44 +---- src/store/pluginInstance/types.ts | 18 -- src/store/resources/actions.ts | 38 ---- src/store/resources/reducer.ts | 82 -------- src/store/resources/resourceSlice.ts | 127 +++++++++++++ src/store/resources/saga.ts | 34 ++-- src/store/resources/types.ts | 15 -- src/store/root/applicationState.ts | 14 +- src/store/root/constants.ts | 11 -- src/store/root/rootReducer.ts | 30 --- src/store/ui/actions.ts | 14 -- src/store/ui/reducer.ts | 47 ----- src/store/ui/types.ts | 25 --- src/store/ui/uiSlice.ts | 46 +++++ src/store/user/actions.ts | 14 -- src/store/user/reducer.ts | 51 ----- src/store/user/types.ts | 28 --- src/store/user/userSlice.ts | 72 +++++++ 84 files changed, 1181 insertions(+), 1628 deletions(-) delete mode 100644 src/store/cart/actions.ts create mode 100644 src/store/cart/cartSlice.ts delete mode 100644 src/store/cart/reducer.ts delete mode 100644 src/store/drawer/actions.ts create mode 100644 src/store/drawer/drawerSlice.ts delete mode 100644 src/store/drawer/reducer.ts delete mode 100644 src/store/drawer/types.ts delete mode 100644 src/store/explorer/actions.ts create mode 100644 src/store/explorer/explorerSlice.ts delete mode 100644 src/store/explorer/reducer.ts delete mode 100644 src/store/feed/actions.ts create mode 100644 src/store/feed/feedSlice.ts delete mode 100644 src/store/feed/reducer.ts delete mode 100644 src/store/plugin/actions.ts create mode 100644 src/store/plugin/pluginSlice.ts delete mode 100644 src/store/plugin/reducer.ts delete mode 100644 src/store/plugin/types.ts delete mode 100644 src/store/pluginInstance/actions.ts create mode 100644 src/store/pluginInstance/pluginInstanceSlice.ts delete mode 100644 src/store/pluginInstance/reducer.ts delete mode 100644 src/store/resources/actions.ts delete mode 100644 src/store/resources/reducer.ts create mode 100644 src/store/resources/resourceSlice.ts delete mode 100644 src/store/root/constants.ts delete mode 100644 src/store/root/rootReducer.ts delete mode 100644 src/store/ui/actions.ts delete mode 100644 src/store/ui/reducer.ts delete mode 100644 src/store/ui/types.ts create mode 100644 src/store/ui/uiSlice.ts delete mode 100644 src/store/user/actions.ts delete mode 100644 src/store/user/reducer.ts delete mode 100644 src/store/user/types.ts create mode 100644 src/store/user/userSlice.ts diff --git a/package-lock.json b/package-lock.json index 2adf0c3e3..442a5f930 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "@patternfly/react-log-viewer": "^5.2.0", "@patternfly/react-table": "^5.3.4", "@react-hook/resize-observer": "^2.0.1", + "@reduxjs/toolkit": "^2.2.7", "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", "@types/d3-zoom": "^3.0.8", @@ -35,7 +36,6 @@ "fp-ts": "^2.16.8", "hammerjs": "^2.0.8", "immer": "^10.1.1", - "keymirror": "^0.1.1", "lodash": "^4.17.21", "marked": "^13.0.2", "micromark": "^4.0.0", @@ -61,13 +61,11 @@ "react-redux": "^9.1.0", "react-router": "^6.21.3", "react-router-dom": "^6.24.0", - "redux": "^5.0.1", "redux-saga": "^1.3.0", "rusha": "^0.8.14", "sanitize-html": "^2.11.0", "shlex": "^2.1.2", "sirv-cli": "^2.0.2", - "typesafe-actions": "^5.1.0", "typescript": "^5.5.3", "use-ackee": "^3.0.1", "use-immer": "^0.9.0", @@ -1952,6 +1950,30 @@ "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==", "license": "MIT" }, + "node_modules/@reduxjs/toolkit": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.7.tgz", + "integrity": "sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==", + "license": "MIT", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@remix-run/router": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.0.tgz", @@ -2927,6 +2949,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -3077,6 +3100,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, "license": "MIT" }, "node_modules/argparse": { @@ -3620,6 +3644,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5246,6 +5271,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/hammerjs": { @@ -5276,6 +5302,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5483,6 +5510,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -5492,6 +5520,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5628,6 +5657,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, "license": "MIT" }, "node_modules/is-windows": { @@ -5658,6 +5688,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { @@ -5870,11 +5901,6 @@ "node": ">=12" } }, - "node_modules/keymirror": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/keymirror/-/keymirror-0.1.1.tgz", - "integrity": "sha512-vIkZAFWoDijgQT/Nvl2AHCMmnegN2ehgTPYuyy2hWQkQSntI0S7ESYqdLkoSe1HyEBFHHkCgSIvVdSEiWwKvCg==" - }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -9757,6 +9783,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -11243,6 +11270,15 @@ "@redux-saga/core": "^1.3.0" } }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", @@ -11288,6 +11324,12 @@ "dev": true, "license": "ISC" }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -11527,6 +11569,7 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -11628,6 +11671,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, "license": "ISC" }, "node_modules/sirv": { @@ -11900,6 +11944,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -12067,15 +12112,6 @@ "dev": true, "license": "MIT" }, - "node_modules/typesafe-actions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/typesafe-actions/-/typesafe-actions-5.1.0.tgz", - "integrity": "sha512-bna6Yi1pRznoo6Bz1cE6btB/Yy8Xywytyfrzu/wc+NFW3ZF0I+2iCGImhBsoYYCOWuICtRO4yHcnDlzgo1AdNg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/typescript": { "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", @@ -12911,6 +12947,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -13041,6 +13078,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -13053,6 +13091,7 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" diff --git a/package.json b/package.json index e0921ff14..a6dc357d4 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@patternfly/react-log-viewer": "^5.2.0", "@patternfly/react-table": "^5.3.4", "@react-hook/resize-observer": "^2.0.1", + "@reduxjs/toolkit": "^2.2.7", "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", "@types/d3-zoom": "^3.0.8", @@ -51,7 +52,6 @@ "fp-ts": "^2.16.8", "hammerjs": "^2.0.8", "immer": "^10.1.1", - "keymirror": "^0.1.1", "lodash": "^4.17.21", "marked": "^13.0.2", "micromark": "^4.0.0", @@ -77,13 +77,11 @@ "react-redux": "^9.1.0", "react-router": "^6.21.3", "react-router-dom": "^6.24.0", - "redux": "^5.0.1", "redux-saga": "^1.3.0", "rusha": "^0.8.14", "sanitize-html": "^2.11.0", "shlex": "^2.1.2", "sirv-cli": "^2.0.2", - "typesafe-actions": "^5.1.0", "typescript": "^5.5.3", "use-ackee": "^3.0.1", "use-immer": "^0.9.0", diff --git a/src/App.tsx b/src/App.tsx index 2c7a63377..0f98b3133 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,18 +5,18 @@ import { useContext } from "react"; import { CookiesProvider } from "react-cookie"; import { Provider } from "react-redux"; import { BrowserRouter } from "react-router-dom"; -import type { Store } from "redux"; //@ts-ignore import useAckee from "use-ackee"; import "./app.css"; import { ThemeContext } from "./components/DarkTheme/useTheme"; import "./components/Feeds/Feeds.css"; +import type { EnhancedStore } from "@reduxjs/toolkit"; +import Cart from "./components/NewLibrary/components/Cart"; import Routes from "./routes"; import type { RootState } from "./store/root/applicationState"; -import Cart from "./components/NewLibrary/components/Cart"; interface AllProps { - store: Store; + store: EnhancedStore; } const queryClient = new QueryClient({ diff --git a/src/components/AddNode/AddNode.tsx b/src/components/AddNode/AddNode.tsx index 6db204540..6b21a4b9c 100644 --- a/src/components/AddNode/AddNode.tsx +++ b/src/components/AddNode/AddNode.tsx @@ -9,15 +9,15 @@ import type React from "react"; import { useCallback, useContext } from "react"; import { useDispatch, useSelector } from "react-redux"; import { catchError } from "../../api/common"; -import { getNodeOperations } from "../../store/plugin/actions"; -import { addNodeRequest } from "../../store/pluginInstance/actions"; +import { useTypedSelector } from "../../store/hooks"; +import { getNodeOperations } from "../../store/plugin/pluginSlice"; +import { addNodeRequest } from "../../store/pluginInstance/pluginInstanceSlice"; import type { ApplicationState } from "../../store/root/applicationState"; +import { Alert } from "../Antd"; import { getRequiredObject } from "../CreateFeed/createFeedHelper"; import BasicConfiguration from "./BasicConfiguration"; import GuidedConfig from "./GuidedConfig"; import "./add-node.css"; -import { useTypedSelector } from "../../store/hooks"; -import { Alert } from "../Antd"; import { AddNodeContext } from "./context"; import { Types } from "./types"; diff --git a/src/components/AddNode/GuidedConfig.tsx b/src/components/AddNode/GuidedConfig.tsx index 6dc2856f0..870a472ce 100644 --- a/src/components/AddNode/GuidedConfig.tsx +++ b/src/components/AddNode/GuidedConfig.tsx @@ -35,7 +35,7 @@ import { quote } from "shlex"; import { v4 } from "uuid"; import { catchError, fetchResource, needsQuoting } from "../../api/common"; import { useTypedSelector } from "../../store/hooks"; -import { getParams } from "../../store/plugin/actions"; +import { getParams } from "../../store/plugin/pluginSlice"; import { ClipboardCopyFixed, ErrorAlert } from "../Common"; import ComputeEnvironments from "./ComputeEnvironment"; import RequiredParam from "./RequiredParam"; diff --git a/src/components/AddNode/SimpleDropdown.tsx b/src/components/AddNode/SimpleDropdown.tsx index e0a730c4e..ca39d4b18 100644 --- a/src/components/AddNode/SimpleDropdown.tsx +++ b/src/components/AddNode/SimpleDropdown.tsx @@ -1,19 +1,20 @@ -import React, { useContext, useEffect } from "react"; +import type { PluginParameter } from "@fnndsc/chrisapi"; import { + Button, Dropdown, - MenuToggle, DropdownItem, DropdownList, + MenuToggle, TextInput, } from "@patternfly/react-core"; +import React, { useContext, useEffect } from "react"; import { CloseIcon } from "../Icons"; -import { SimpleDropdownProps, SimpleDropdownState } from "./types"; +import type { SimpleDropdownProps, SimpleDropdownState } from "./types"; import { unPackForKeyValue } from "./utils"; -import { PluginParameter } from "@fnndsc/chrisapi"; +import { v4 } from "uuid"; import { AddNodeContext } from "./context"; import { Types } from "./types"; -import { v4 } from "uuid"; function getInitialState() { return { @@ -68,7 +69,7 @@ const SimpleDropdown = ({ id, params }: SimpleDropdownProps) => { const placeholder = param.data.help; const type = param.data.type; - if (params && params["dropdown"].length > 0) { + if (params && params.dropdown.length > 0) { dispatch({ type: Types.SetComponentList, payload: { @@ -121,27 +122,25 @@ const SimpleDropdown = ({ id, params }: SimpleDropdownProps) => { const dropdownItems = () => { const useParam = findUsedParam(); - const parameters = - params && - params["dropdown"] - .filter( - (param) => - param.data.optional === true && !useParam.has(param.data.flag), - ) - .map((param) => { - return ( - handleClick(param)} - className="plugin-configuration__parameter" - value={param.data.flag} - name={param.data.help} - style={{ fontFamily: "monospace" }} - > - {param.data.flag} - - ); - }); + const parameters = params?.dropdown + .filter( + (param) => + param.data.optional === true && !useParam.has(param.data.flag), + ) + .map((param) => { + return ( + handleClick(param)} + className="plugin-configuration__parameter" + value={param.data.flag} + name={param.data.help} + style={{ fontFamily: "monospace" }} + > + {param.data.flag} + + ); + }); return parameters; }; @@ -156,12 +155,12 @@ const SimpleDropdown = ({ id, params }: SimpleDropdownProps) => { ref={toggleRef} id="toggle-id" onClick={onToggle} - isDisabled={params && params["dropdown"].length == 0} + isDisabled={params && params.dropdown.length === 0} >
{paramFlag ? `${paramFlag}` - : params && params["dropdown"].length == 0 + : params && params.dropdown.length === 0 ? "No Parameters" : "Choose a Parameter"}
@@ -182,13 +181,11 @@ const SimpleDropdown = ({ id, params }: SimpleDropdownProps) => { placeholder={placeholder} value={value} isDisabled={ - type === "boolean" || (params && params["dropdown"].length == 0) + type === "boolean" || (params && params.dropdown.length === 0) } /> -
- -
+
); diff --git a/src/components/AddPipeline/AddPipeline.tsx b/src/components/AddPipeline/AddPipeline.tsx index 5b808ad4e..e7187b7fc 100644 --- a/src/components/AddPipeline/AddPipeline.tsx +++ b/src/components/AddPipeline/AddPipeline.tsx @@ -6,12 +6,12 @@ import { useDispatch } from "react-redux"; import ChrisAPIClient from "../../api/chrisapiclient"; import { fetchResource } from "../../api/common"; import { useTypedSelector } from "../../store/hooks"; -import { getNodeOperations } from "../../store/plugin/actions"; +import { getNodeOperations } from "../../store/plugin/pluginSlice"; import { getPluginInstancesSuccess, getSelectedPlugin, -} from "../../store/pluginInstance/actions"; -import { getPluginInstanceStatusRequest } from "../../store/resources/actions"; +} from "../../store/pluginInstance/pluginInstanceSlice"; +import { getPluginInstanceStatusRequest } from "../../store/resources/resourceSlice"; import { Alert, Form, Tag } from "../Antd"; import { SpinContainer } from "../Common"; import Pipelines from "../PipelinesCopy"; diff --git a/src/components/ComputePage/index.tsx b/src/components/ComputePage/index.tsx index a45b644c6..22e43b4c1 100644 --- a/src/components/ComputePage/index.tsx +++ b/src/components/ComputePage/index.tsx @@ -1,7 +1,7 @@ import { PageSection } from "@patternfly/react-core"; import React from "react"; import { useDispatch } from "react-redux"; -import { setSidebarActive } from "../../store/ui/actions"; +import { setSidebarActive } from "../../store/ui/uiSlice"; import { Typography } from "../Antd"; import { InfoIcon } from "../Common"; import WrapperConnect from "../Wrapper"; diff --git a/src/components/Dashboard/index.tsx b/src/components/Dashboard/index.tsx index 66bb31fad..0f4e1ab80 100644 --- a/src/components/Dashboard/index.tsx +++ b/src/components/Dashboard/index.tsx @@ -4,7 +4,7 @@ import { useDispatch } from "react-redux"; import WrapperConnect from "../Wrapper"; import { PageSection, Grid, GridItem } from "@patternfly/react-core"; import { Typography } from "../Antd"; -import { setSidebarActive } from "../../store/ui/actions"; +import { setSidebarActive } from "../../store/ui/uiSlice"; import { InfoIcon } from "../Common"; import { CatalogTile } from "@patternfly/react-catalog-view-extension"; import "./dashboard.css"; diff --git a/src/components/DeleteNode/index.tsx b/src/components/DeleteNode/index.tsx index 727980936..fb5bbcf86 100644 --- a/src/components/DeleteNode/index.tsx +++ b/src/components/DeleteNode/index.tsx @@ -1,17 +1,17 @@ import type { PluginInstance } from "@fnndsc/chrisapi"; import { Button, Modal, ModalVariant } from "@patternfly/react-core"; import { useMutation } from "@tanstack/react-query"; -import { Alert } from "../Antd"; -import { useEffect, Fragment } from "react"; +import { Fragment, useEffect } from "react"; import { useDispatch } from "react-redux"; import { fetchResource } from "../../api/common"; import { useTypedSelector } from "../../store/hooks"; -import { getNodeOperations } from "../../store/plugin/actions"; +import { getNodeOperations } from "../../store/plugin/pluginSlice"; import { getPluginInstancesSuccess, getSelectedPlugin, -} from "../../store/pluginInstance/actions"; -import { getPluginInstanceStatusRequest } from "../../store/resources/actions"; +} from "../../store/pluginInstance/pluginInstanceSlice"; +import { getPluginInstanceStatusRequest } from "../../store/resources/resourceSlice"; +import { Alert } from "../Antd"; import { SpinContainer } from "../Common"; const DeleteNode = () => { diff --git a/src/components/FeedDetails/index.tsx b/src/components/FeedDetails/index.tsx index 4482e7848..5a61f5fb0 100644 --- a/src/components/FeedDetails/index.tsx +++ b/src/components/FeedDetails/index.tsx @@ -3,8 +3,8 @@ import { Badge } from "../Antd"; import React, { type ReactNode, useState } from "react"; import { useDispatch } from "react-redux"; import { fetchNote } from "../../api/common"; -import { setDrawerCurrentlyActive } from "../../store/drawer/actions"; -import type { IDrawerState } from "../../store/drawer/types"; +import { setDrawerCurrentlyActive } from "../../store/drawer/drawerSlice"; +import type { IDrawerState } from "../../store/drawer/drawerSlice"; import { useTypedSelector } from "../../store/hooks"; import { ButtonWithTooltip } from "../Feeds/DrawerUtils"; import { handleToggle } from "../Feeds/utilties"; diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index d10f292fe..285008b16 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -14,11 +14,11 @@ import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; import { useContext, useEffect } from "react"; import { useDispatch } from "react-redux"; import { getFileExtension } from "../../api/model"; -import { setFilePreviewPanel } from "../../store/drawer/actions"; +import { setFilePreviewPanel } from "../../store/drawer/drawerSlice"; import { clearSelectedFile, setSelectedFile, -} from "../../store/explorer/actions"; +} from "../../store/explorer/explorerSlice"; import useDownload, { useTypedSelector } from "../../store/hooks"; import { notification } from "../Antd"; import { ClipboardCopyContainer, SpinContainer, getIcon } from "../Common"; diff --git a/src/components/FeedOutputBrowser/useFeedBrowser.tsx b/src/components/FeedOutputBrowser/useFeedBrowser.tsx index 5a2a02c51..4b3158873 100644 --- a/src/components/FeedOutputBrowser/useFeedBrowser.tsx +++ b/src/components/FeedOutputBrowser/useFeedBrowser.tsx @@ -1,6 +1,6 @@ import React from "react"; import { useDispatch } from "react-redux"; -import { getPluginFilesRequest } from "../../store/resources/actions"; +import { getPluginFilesRequest } from "../../store/resources/resourceSlice"; import { useTypedSelector } from "../../store/hooks"; const status = ["finishedSuccessfully", "finishedWithError", "cancelled"]; diff --git a/src/components/FeedTree/DropdownMenu.tsx b/src/components/FeedTree/DropdownMenu.tsx index e1d51951c..733eaac2f 100644 --- a/src/components/FeedTree/DropdownMenu.tsx +++ b/src/components/FeedTree/DropdownMenu.tsx @@ -1,9 +1,9 @@ -import { Dropdown, type MenuProps } from "../Antd"; +import type React from "react"; import { useDispatch } from "react-redux"; import { useTypedSelector } from "../../store/hooks"; -import { getNodeOperations } from "../../store/plugin/actions"; +import { getNodeOperations } from "../../store/plugin/pluginSlice"; +import { Dropdown, type MenuProps } from "../Antd"; import { AddIcon, DeleteIcon, PatternflyArchiveIcon } from "../Icons"; -import type React from "react"; const DropdownMenu = ({ children, diff --git a/src/components/FeedTree/FeedGraph.tsx b/src/components/FeedTree/FeedGraph.tsx index 0ed0c5919..18efee88d 100644 --- a/src/components/FeedTree/FeedGraph.tsx +++ b/src/components/FeedTree/FeedGraph.tsx @@ -1,18 +1,18 @@ -import { PluginInstance } from "@fnndsc/chrisapi"; +import type { PluginInstance } from "@fnndsc/chrisapi"; import { Switch, Text } from "@patternfly/react-core"; import React from "react"; import { ErrorBoundary } from "react-error-boundary"; import ForceGraph2D, { - ForceGraphMethods, - NodeObject, + type ForceGraphMethods, + type NodeObject, } from "react-force-graph-2d"; import { connect, useDispatch } from "react-redux"; import { TreeModel } from "../../api/model"; -import { setFeedLayout } from "../../store/feed/actions"; +import { setFeedLayout } from "../../store/feed/feedSlice"; import { useTypedSelector } from "../../store/hooks"; import type { PluginInstancePayload } from "../../store/pluginInstance/types"; -import { ApplicationState } from "../../store/root/applicationState"; -import { FeedTreeScaleType, NodeScaleDropdown } from "./Controls"; +import type { ApplicationState } from "../../store/root/applicationState"; +import { type FeedTreeScaleType, NodeScaleDropdown } from "./Controls"; import "./FeedTree.css"; import useSize from "./useSize"; diff --git a/src/components/FeedTree/FeedTree.tsx b/src/components/FeedTree/FeedTree.tsx index 04ca3f21b..2dfeebadf 100644 --- a/src/components/FeedTree/FeedTree.tsx +++ b/src/components/FeedTree/FeedTree.tsx @@ -14,7 +14,7 @@ import { setFeedLayout, setSearchFilter, setTranslate, -} from "../../store/feed/actions"; +} from "../../store/feed/feedSlice"; import type { FeedTreeProp } from "../../store/feed/types"; import { useTypedSelector } from "../../store/hooks"; import { ThemeContext } from "../DarkTheme/useTheme"; diff --git a/src/components/FeedTree/Node.tsx b/src/components/FeedTree/Node.tsx index be2d25eae..12ae95372 100644 --- a/src/components/FeedTree/Node.tsx +++ b/src/components/FeedTree/Node.tsx @@ -11,8 +11,8 @@ import { getPluginInstancesSuccess, getSelectedD3Node, getSelectedPlugin, -} from "../../store/pluginInstance/actions"; -import { getPluginInstanceStatusRequest } from "../../store/resources/actions"; +} from "../../store/pluginInstance/pluginInstanceSlice"; +import { getPluginInstanceStatusRequest } from "../../store/resources/resourceSlice"; import AddNodeConnect from "../AddNode/AddNode"; import { AddNodeProvider } from "../AddNode/context"; import AddPipeline from "../AddPipeline/AddPipeline"; diff --git a/src/components/FeedTree/ParentComponent.tsx b/src/components/FeedTree/ParentComponent.tsx index cfd670e50..ccd934bd6 100644 --- a/src/components/FeedTree/ParentComponent.tsx +++ b/src/components/FeedTree/ParentComponent.tsx @@ -1,6 +1,6 @@ import React from "react"; import { useDispatch } from "react-redux"; -import { setFeedTreeProp } from "../../store/feed/actions"; +import { setFeedTreeProp } from "../../store/feed/feedSlice"; import { useTypedSelector } from "../../store/hooks"; import { Alert } from "../Antd"; import { SpinContainer } from "../Common"; diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 07c92829d..2609b4d6e 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -1,11 +1,9 @@ import type { Feed, FileBrowserFolder } from "@fnndsc/chrisapi"; import { ChartDonutUtilization } from "@patternfly/react-charts"; import { - Bullseye, Button, Checkbox, EmptyState, - EmptyStateHeader, Title, EmptyStateIcon, EmptyStateVariant, @@ -25,7 +23,7 @@ import { useContext, useEffect, useState } from "react"; import { useDispatch } from "react-redux"; import { useNavigate } from "react-router"; import { useTypedSelector } from "../../store/hooks"; -import { setSidebarActive } from "../../store/ui/actions"; +import { setSidebarActive } from "../../store/ui/uiSlice"; import { AddNodeProvider } from "../AddNode/context"; import { Typography } from "../Antd"; import { InfoIcon } from "../Common"; diff --git a/src/components/Feeds/FeedView.tsx b/src/components/Feeds/FeedView.tsx index 2967c6edd..12f2e6763 100644 --- a/src/components/Feeds/FeedView.tsx +++ b/src/components/Feeds/FeedView.tsx @@ -9,22 +9,22 @@ import { useQuery } from "@tanstack/react-query"; import React from "react"; import { useDispatch } from "react-redux"; import { useLocation, useNavigate, useParams } from "react-router"; -import { clearSelectedFile } from "../../store/explorer/actions"; +import { clearSelectedFile } from "../../store/explorer/explorerSlice"; import { getFeedSuccess, resetFeed, setShowToolbar, -} from "../../store/feed/actions"; +} from "../../store/feed/feedSlice"; import { useTypedSelector } from "../../store/hooks"; import { getPluginInstancesRequest, getSelectedD3Node, getSelectedPlugin, resetPluginInstances, -} from "../../store/pluginInstance/actions"; -import { resetActiveResources } from "../../store/resources/actions"; +} from "../../store/pluginInstance/pluginInstanceSlice"; +import { resetActiveResources } from "../../store/resources/resourceSlice"; import type { DestroyActiveResources } from "../../store/resources/types"; -import { setIsNavOpen, setSidebarActive } from "../../store/ui/actions"; +import { setSidebarActive } from "../../store/ui/uiSlice"; import { notification } from "../Antd"; import FeedOutputBrowser from "../FeedOutputBrowser/FeedOutputBrowser"; import FeedGraph from "../FeedTree/FeedGraph"; @@ -129,7 +129,6 @@ export default function FeedView() { }, [dispatch]); React.useEffect(() => { - dispatch(setIsNavOpen(false)); dispatch(setShowToolbar(true)); }, [dispatch]); diff --git a/src/components/Feeds/utilties.ts b/src/components/Feeds/utilties.ts index 0ab8672ac..4ab07db01 100644 --- a/src/components/Feeds/utilties.ts +++ b/src/components/Feeds/utilties.ts @@ -1,6 +1,9 @@ -import type { DrawerPayloadType, IDrawerState } from "../../store/drawer/types"; -import { setDrawerState } from "../../store/drawer/actions"; -import type { Dispatch } from "redux"; +import type { + DrawerPayloadType, + IDrawerState, +} from "../../store/drawer/drawerSlice"; +import { setDrawerState } from "../../store/drawer/drawerSlice"; + import ChrisAPIClient from "../../api/chrisapiclient"; import type { Feed, @@ -11,15 +14,15 @@ import type { import { fetchResource } from "../../api/common"; export const handleDrawerActions = ( - actionType: string, + actionType: keyof IDrawerState, open: boolean, maximized: boolean, minimized: boolean, - dispatch: Dispatch, + dispatch: any, action: (action: DrawerPayloadType) => { type: any; payload: { - actionType: string; + actionType: keyof IDrawerState; open: boolean; maximized: boolean; minimized: boolean; @@ -36,22 +39,28 @@ export const handleDrawerActions = ( ); }; -export const handleMaximize = (actionType: string, dispatch: Dispatch) => { +export const handleMaximize = ( + actionType: keyof IDrawerState, + dispatch: any, +) => { handleDrawerActions(actionType, true, true, false, dispatch, setDrawerState); }; -export const handleMinimize = (actionType: string, dispatch: Dispatch) => { +export const handleMinimize = ( + actionType: keyof IDrawerState, + dispatch: any, +) => { handleDrawerActions(actionType, true, false, true, dispatch, setDrawerState); }; -export const handleOpen = (actionType: string, dispatch: Dispatch) => { +export const handleOpen = (actionType: keyof IDrawerState, dispatch: any) => { handleDrawerActions(actionType, true, false, false, dispatch, setDrawerState); }; export const handleToggle = ( - actionType: string, + actionType: keyof IDrawerState, drawerState: IDrawerState, - dispatch: Dispatch, + dispatch: any, ) => { handleDrawerActions( actionType, diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 2d23d0f0e..73b3ac094 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -18,7 +18,7 @@ import { Link, useLocation, useNavigate } from "react-router-dom"; import ChrisAPIClient from "../../api/chrisapiclient"; import ChRIS_Logo_Inline from "../../assets/chris-logo-inline.png"; import ChRIS_Logo from "../../assets/chris-logo.png"; -import { setAuthTokenSuccess } from "../../store/user/actions"; +import { setAuthTokenSuccess } from "../../store/user/userSlice"; import "./Login.css"; export const SimpleLoginPage: React.FunctionComponent = () => { diff --git a/src/components/NewLibrary/components/Cart.tsx b/src/components/NewLibrary/components/Cart.tsx index ffc6b9553..cdabd0996 100644 --- a/src/components/NewLibrary/components/Cart.tsx +++ b/src/components/NewLibrary/components/Cart.tsx @@ -9,7 +9,7 @@ import { clearDownloadStatus, clearUploadState, setToggleCart, -} from "../../../store/cart/actions"; +} from "../../../store/cart/cartSlice"; import { DownloadTypes } from "../../../store/cart/types"; import { useTypedSelector } from "../../../store/hooks"; import { DotsIndicator, EmptyStateComponent } from "../../Common"; @@ -81,7 +81,9 @@ const Cart = () => { avatar={} title={ } diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index 43f5bfad1..e0bd15c36 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -24,7 +24,7 @@ import React, { } from "react"; import { useDispatch } from "react-redux"; import { getFileName } from "../../../api/common"; -import { removeIndividualSelection } from "../../../store/cart/actions"; +import { removeSelectedPayload } from "../../../store/cart/cartSlice"; import { useTypedSelector } from "../../../store/hooks"; import { AddIcon, @@ -259,9 +259,7 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { {selectedPaths.map((selection) => ( - dispatch(removeIndividualSelection(selection)) - } + onClick={() => dispatch(removeSelectedPayload(selection))} > {getFileName(selection.path)} diff --git a/src/components/NewLibrary/utils/longpress.tsx b/src/components/NewLibrary/utils/longpress.tsx index 0fdeafba9..1b1fbc6cb 100644 --- a/src/components/NewLibrary/utils/longpress.tsx +++ b/src/components/NewLibrary/utils/longpress.tsx @@ -7,10 +7,10 @@ import { useRef, useState } from "react"; import { useDispatch } from "react-redux"; import { useNavigate } from "react-router"; import { - clearSelectFolder, - setSelectFolder, + clearSelectedPaths, + setSelectedPaths, setToggleCart, -} from "../../../store/cart/actions"; +} from "../../../store/cart/cartSlice"; import { useTypedSelector } from "../../../store/hooks"; import { FolderIcon } from "../../Icons"; @@ -43,11 +43,11 @@ export default function useLongPress() { } function selectFolder(pathForCart: string, type: string, payload: any) { - dispatch(setSelectFolder({ path: pathForCart, type, payload })); + dispatch(setSelectedPaths({ path: pathForCart, type, payload })); } function deselectFolder(pathForCart: string) { - dispatch(clearSelectFolder(pathForCart)); + dispatch(clearSelectedPaths(pathForCart)); } function handleOnClick( @@ -82,14 +82,14 @@ export default function useLongPress() { e.stopPropagation(); if (e.currentTarget.checked) { dispatch( - setSelectFolder({ + setSelectedPaths({ path, type, payload, }), ); } else { - dispatch(clearSelectFolder(path)); + dispatch(clearSelectedPaths(path)); } }; diff --git a/src/components/NewLibrary/utils/useDeletePayload.tsx b/src/components/NewLibrary/utils/useDeletePayload.tsx index ad1aac809..a20a8c04c 100644 --- a/src/components/NewLibrary/utils/useDeletePayload.tsx +++ b/src/components/NewLibrary/utils/useDeletePayload.tsx @@ -1,9 +1,9 @@ -import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { useMutation } from "@tanstack/react-query"; import axios from "axios"; import { useState } from "react"; import { useDispatch } from "react-redux"; import ChrisAPIClient from "../../../api/chrisapiclient"; -import { clearSelectFolder } from "../../../store/cart/actions"; +import { clearSelectedPaths } from "../../../store/cart/cartSlice"; import type { SelectionPayload } from "../../../store/cart/types"; import { ErrorAlert } from "../../Common"; @@ -40,7 +40,7 @@ const useDeletePayload = (inValidateFolders: () => void, api: any) => { ); inValidateFolders(); - successfulPaths.forEach((path) => dispatch(clearSelectFolder(path))); + successfulPaths.forEach((path) => dispatch(clearSelectedPaths(path))); return errors.length > 0 ? errors : null; }; diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index 17823d4f8..a1cd3d01d 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -11,7 +11,7 @@ import { startAnonymize, startDownload, startUpload, -} from "../../../store/cart/actions"; +} from "../../../store/cart/cartSlice"; import { useTypedSelector } from "../../../store/hooks"; import useDeletePayload from "../utils/useDeletePayload"; import useFeedOperations from "./useFeedOperations"; diff --git a/src/components/NiivueDatasetViewer/NiivueDatasetViewer.tsx b/src/components/NiivueDatasetViewer/NiivueDatasetViewer.tsx index 0ef4e935b..78c70ae32 100644 --- a/src/components/NiivueDatasetViewer/NiivueDatasetViewer.tsx +++ b/src/components/NiivueDatasetViewer/NiivueDatasetViewer.tsx @@ -4,17 +4,18 @@ import { useDispatch } from "react-redux"; import { PageSection } from "@patternfly/react-core"; import WrapperConnect from "../Wrapper"; import ChrisAPIClient from "../../api/chrisapiclient"; -import { setIsNavOpen, setSidebarActive } from "../../store/ui/actions"; - -import { ChNVROptions, ChNVRVolume } from "./models"; +import { setIsNavOpen, setSidebarActive } from "../../store/ui/uiSlice"; +import type { ChNVROptions, ChNVRVolume } from "./models"; import { DEFAULT_OPTIONS } from "./defaults"; import HeaderOptionBar from "./components/HeaderOptionBar"; -import SizedNiivueCanvas, { CrosshairLocation } from "../SizedNiivueCanvas"; -import { Problem, TagsDictionary, VisualDataset } from "./types"; +import SizedNiivueCanvas, { + type CrosshairLocation, +} from "../SizedNiivueCanvas"; +import type { Problem, TagsDictionary, VisualDataset } from "./types"; import { - DatasetFile, - DatasetFilesClient, - DatasetPreClient, + type DatasetFile, + type DatasetFilesClient, + type DatasetPreClient, getDataset, getPreClient, } from "./client"; @@ -31,10 +32,10 @@ import { } from "./content"; import { parsePluginInstanceId } from "./client/helpers"; import { getFeedOf } from "./client/getDataset"; -import { Feed } from "@fnndsc/chrisapi"; +import type { Feed } from "@fnndsc/chrisapi"; import { - DatasetFileState, - DatasetVolume, + type DatasetFileState, + type DatasetVolume, files2states, volumeIsLoaded, } from "./statefulTypes"; diff --git a/src/components/NodeDetails/PluginTitle.tsx b/src/components/NodeDetails/PluginTitle.tsx index b531393f5..c48d9d653 100644 --- a/src/components/NodeDetails/PluginTitle.tsx +++ b/src/components/NodeDetails/PluginTitle.tsx @@ -11,7 +11,7 @@ import { Alert } from "../Antd"; import { useEffect, useState } from "react"; import { useDispatch } from "react-redux"; import { useTypedSelector } from "../../store/hooks"; -import { setPluginTitle } from "../../store/pluginInstance/actions"; +import { setPluginTitle } from "../../store/pluginInstance/pluginInstanceSlice"; import { SpinContainer } from "../Common"; const PluginTitle = () => { diff --git a/src/components/Pacs/index.tsx b/src/components/Pacs/index.tsx index 63f16cb2d..e39fcd262 100644 --- a/src/components/Pacs/index.tsx +++ b/src/components/Pacs/index.tsx @@ -18,7 +18,7 @@ import { useDispatch } from "react-redux"; import { useNavigate } from "react-router"; import { useSearchParams } from "react-router-dom"; import { pluralize } from "../../api/common"; -import { setSidebarActive } from "../../store/ui/actions"; +import { setSidebarActive } from "../../store/ui/uiSlice"; import { EmptyStateComponent, SpinContainer } from "../Common"; import WrapperConnect from "../Wrapper"; import PatientCard from "./components/PatientCard"; diff --git a/src/components/PipelinesPage/index.tsx b/src/components/PipelinesPage/index.tsx index de84078bb..35d1ea48c 100644 --- a/src/components/PipelinesPage/index.tsx +++ b/src/components/PipelinesPage/index.tsx @@ -3,7 +3,7 @@ import { useDispatch } from "react-redux"; import { PipelineProvider } from "../PipelinesCopy/context"; import Pipelines from "../PipelinesCopy"; import WrapperConnect from "../Wrapper"; -import { setSidebarActive } from "../../store/ui/actions"; +import { setSidebarActive } from "../../store/ui/uiSlice"; import { PageSection } from "@patternfly/react-core"; const PipelinePage = () => { diff --git a/src/components/PluginCatalog/index.tsx b/src/components/PluginCatalog/index.tsx index ad618d7fb..1a0a8ee0f 100644 --- a/src/components/PluginCatalog/index.tsx +++ b/src/components/PluginCatalog/index.tsx @@ -4,7 +4,7 @@ import { Typography } from "../Antd"; import WrapperConnect from "../Wrapper"; import PluginCatalog from "./PluginCatalog"; import { InfoIcon } from "../Common/"; -import { setSidebarActive } from "../../store/ui/actions"; +import { setSidebarActive } from "../../store/ui/uiSlice"; import { PageSection } from "@patternfly/react-core"; import "./plugin-catalog.css"; diff --git a/src/components/Signup/SignUpForm.tsx b/src/components/Signup/SignUpForm.tsx index 30401c0b8..532dd427f 100644 --- a/src/components/Signup/SignUpForm.tsx +++ b/src/components/Signup/SignUpForm.tsx @@ -1,49 +1,42 @@ -import React from "react"; -import { connect } from "react-redux"; -import { Dispatch } from "redux"; -import { useNavigate } from "react-router-dom"; +import ChrisApiClient, { type User } from "@fnndsc/chrisapi"; import { - Form, - FormGroup, - TextInput, - Button, ActionGroup, - FormAlert, Alert, - InputGroup, + Button, + Form, + FormAlert, + FormGroup, HelperText, HelperTextItem, + InputGroup, + TextInput, } from "@patternfly/react-core"; -import ChrisApiClient, { User } from "@fnndsc/chrisapi"; -import { Link } from "react-router-dom"; -import { has } from "lodash"; +import { EyeIcon, EyeSlashIcon } from "@patternfly/react-icons"; import { validate } from "email-validator"; -import { setAuthTokenSuccess } from "../../store/user/actions"; -import { EyeSlashIcon, EyeIcon } from "@patternfly/react-icons"; +import { has } from "lodash"; +import React from "react"; import { useCookies } from "react-cookie"; +import { useDispatch } from "react-redux"; +import { useNavigate } from "react-router-dom"; +import { Link } from "react-router-dom"; +import { setAuthTokenSuccess } from "../../store/user/userSlice"; type Validated = { error: undefined | "error" | "default" | "success" | "warning"; }; interface SignUpFormProps { - setAuthTokenSuccess: (auth: { - token: string; - username: string; - isStaff: boolean; - }) => void; isShowPasswordEnabled?: boolean; showPasswordAriaLabel?: string; hidePasswordAriaLabel?: string; } const SignUpForm: React.FC = ({ - setAuthTokenSuccess, isShowPasswordEnabled = true, hidePasswordAriaLabel = "Hide password", showPasswordAriaLabel = "Show password", }: SignUpFormProps) => { - /* eslint-disable */ + const dispatch = useDispatch(); const [_cookies, setCookie] = useCookies([""]); const [userState, setUserState] = React.useState<{ username: string; @@ -140,11 +133,13 @@ const SignUpForm: React.FC = ({ path: "/", maxAge: oneDayToSeconds, }); - setAuthTokenSuccess({ - token, - username: user.data.username, - isStaff: user.data.is_staff, - }); + dispatch( + setAuthTokenSuccess({ + token, + username: user.data.username, + isStaff: user.data.is_staff, + }), + ); const then = new URLSearchParams(location.search).get("then"); if (then) navigate(then); else navigate("/"); @@ -310,12 +305,4 @@ const SignUpForm: React.FC = ({ ); }; -const mapDispatchToProps = (dispatch: Dispatch) => ({ - setAuthTokenSuccess: (auth: { - token: string; - username: string; - isStaff: boolean; - }) => dispatch(setAuthTokenSuccess(auth)), -}); - -export default connect(null, mapDispatchToProps)(SignUpForm); +export default SignUpForm; diff --git a/src/components/Store/index.tsx b/src/components/Store/index.tsx index 64e4c812a..305a35a19 100644 --- a/src/components/Store/index.tsx +++ b/src/components/Store/index.tsx @@ -1,4 +1,4 @@ -import Client, { type Plugin, type PluginMeta } from "@fnndsc/chrisapi"; +import Client, { type Plugin } from "@fnndsc/chrisapi"; import { ActionGroup, Badge, @@ -35,7 +35,7 @@ import { Cookies, useCookies } from "react-cookie"; import { useDispatch } from "react-redux"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useTypedSelector } from "../../store/hooks"; -import { setSidebarActive } from "../../store/ui/actions"; +import { setSidebarActive } from "../../store/ui/uiSlice"; import { InfoIcon, SpinContainer } from "../Common"; import { CheckCircleIcon, SearchIcon } from "../Icons"; import "../SinglePlugin/singlePlugin.css"; diff --git a/src/components/Wrapper/CartNotify.tsx b/src/components/Wrapper/CartNotify.tsx index ae4081623..f174a7aa6 100644 --- a/src/components/Wrapper/CartNotify.tsx +++ b/src/components/Wrapper/CartNotify.tsx @@ -3,7 +3,7 @@ import { Badge } from "../Antd"; import { isEmpty } from "lodash"; import { useEffect, useState } from "react"; import { useDispatch } from "react-redux"; -import { setToggleCart } from "../../store/cart/actions"; +import { setToggleCart } from "../../store/cart/cartSlice"; import { useTypedSelector } from "../../store/hooks"; import { BrainIcon } from "../Icons"; diff --git a/src/components/Wrapper/Header.tsx b/src/components/Wrapper/Header.tsx index b773d260e..ffc47c0f9 100644 --- a/src/components/Wrapper/Header.tsx +++ b/src/components/Wrapper/Header.tsx @@ -8,11 +8,10 @@ import { PageToggleButton, Brand, } from "@patternfly/react-core"; - import brandImg from "../../assets/logo_chris_dashboard.png"; import BarsIcon from "@patternfly/react-icons/dist/esm/icons/bars-icon"; import ToolbarComponent from "./Toolbar"; -import type { IUserState } from "../../store/user/types"; +import type { IUserState } from "../../store/user/userSlice"; import { useTypedSelector } from "../../store/hooks"; const brand = ( diff --git a/src/components/Wrapper/Sidebar.tsx b/src/components/Wrapper/Sidebar.tsx index 73bb4a182..de9bde0a8 100644 --- a/src/components/Wrapper/Sidebar.tsx +++ b/src/components/Wrapper/Sidebar.tsx @@ -8,32 +8,26 @@ import { } from "@patternfly/react-core"; import { isEmpty } from "lodash"; import type * as React from "react"; -import { connect } from "react-redux"; import { Link } from "react-router-dom"; -import type { Dispatch } from "redux"; import { useTypedSelector } from "../../store/hooks"; -import type { ApplicationState } from "../../store/root/applicationState"; -import { setSidebarActive } from "../../store/ui/actions"; -import type { IUiState } from "../../store/ui/types"; -import type { IUserState } from "../../store/user/types"; +import type { IUiState } from "../../store/ui/uiSlice"; +import { setSidebarActive } from "../../store/ui/uiSlice"; +import type { IUserState } from "../../store/user/userSlice"; +import { useDispatch } from "react-redux"; -type ReduxProp = { - setSidebarActive: (active: { activeItem: string }) => void; -}; - -type AllProps = IUiState & IUserState & ReduxProp; +type AllProps = IUiState & IUserState; -const Sidebar: React.FC = ({ - isNavOpen, - sidebarActiveItem, - setSidebarActive, -}) => { +const Sidebar: React.FC = () => { + const { sidebarActiveItem, isNavOpen } = useTypedSelector( + (state) => state.ui, + ); const isLoggedIn = useTypedSelector((state) => state.user.isLoggedIn); + const dispatch = useDispatch(); const onSelect = (selectedItem: any) => { const { itemId } = selectedItem; if (sidebarActiveItem !== itemId) { - setSidebarActive({ activeItem: itemId }); + dispatch(setSidebarActive({ activeItem: itemId })); } }; @@ -146,21 +140,6 @@ const AnonSidebarImpl: React.FC = ({ ); }; -const mapStateToProps = ({ user, ui }: ApplicationState) => ({ - isLoggedIn: user.isLoggedIn, - sidebarActiveItem: ui.sidebarActiveItem, -}); - -const mapDispatchToProps = (dispatch: Dispatch) => ({ - setSidebarActive: (active: { activeItem: string }) => - dispatch(setSidebarActive(active)), -}); - -const AnonSidebar = connect( - mapStateToProps, - mapDispatchToProps, -)(AnonSidebarImpl); -export { AnonSidebar }; +export { AnonSidebarImpl as AnonSidebar }; -const SidebarConnect = connect(mapStateToProps, mapDispatchToProps)(Sidebar); -export default SidebarConnect; +export default Sidebar; diff --git a/src/components/Wrapper/Toolbar.tsx b/src/components/Wrapper/Toolbar.tsx index efaa4c9b7..337314e48 100644 --- a/src/components/Wrapper/Toolbar.tsx +++ b/src/components/Wrapper/Toolbar.tsx @@ -12,51 +12,43 @@ import { import { useQueryClient } from "@tanstack/react-query"; import * as React from "react"; import { useCookies } from "react-cookie"; -import { connect } from "react-redux"; +import { useDispatch } from "react-redux"; import { useLocation, useNavigate } from "react-router"; -import type { Dispatch } from "redux"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useTypedSelector } from "../../store/hooks"; -import type { ApplicationState } from "../../store/root/applicationState"; -import { onDropdownSelect } from "../../store/ui/actions"; -import type { IUiState } from "../../store/ui/types"; -import { setLogoutSuccess } from "../../store/user/actions"; -import type { IUserState } from "../../store/user/types"; +import { onDropdownSelect } from "../../store/ui/uiSlice"; +import { setLogoutSuccess } from "../../store/user/userSlice"; import { ThemeContext } from "../DarkTheme/useTheme"; import FeedDetails from "../FeedDetails"; import CartNotify from "./CartNotify"; -interface IPropsFromDispatch { - onDropdownSelect: typeof onDropdownSelect; - setLogoutSuccess: typeof setLogoutSuccess; - token?: string | null; -} - -interface ComponentProps { +type ToolbarComponentProps = { showToolbar: boolean; -} -type AllProps = IUserState & IUiState & IPropsFromDispatch & ComponentProps; + token: string; +}; -const ToolbarComponent: React.FC = (props: AllProps) => { +const ToolbarComponent: React.FC = ( + props: ToolbarComponentProps, +) => { + const { token } = props; + const dispatch = useDispatch(); const drawerState = useTypedSelector((state) => state.drawers); - const fullScreen = drawerState?.preview.open && drawerState.preview.maximized; const navigate = useNavigate(); const location = useLocation(); const [_, _setCookie, removeCookie] = useCookies(); const { isDarkTheme, toggleTheme } = React.useContext(ThemeContext); const queryClient = useQueryClient(); - const { setLogoutSuccess, token }: IPropsFromDispatch = props; - const { username, isDropdownOpen }: AllProps = props; + const username = useTypedSelector((state) => state.user.username); + const isDropdownOpen = useTypedSelector((state) => state.ui.isDropdownOpen); + const onDropdownToggle = () => { - const { onDropdownSelect } = props; - onDropdownSelect(!props.isDropdownOpen); + dispatch(onDropdownSelect(!isDropdownOpen)); }; const handleChange = () => { toggleTheme(); }; - // Description: Logout user const onLogout = () => { queryClient.clear(); @@ -64,16 +56,13 @@ const ToolbarComponent: React.FC = (props: AllProps) => { removeCookie("username", { path: "/", }); - removeCookie(`${username}_token`, { path: "/", }); - removeCookie("isStaff", { path: "/", }); - - setLogoutSuccess(); + dispatch(setLogoutSuccess()); }; const copyLoginCommand = () => { @@ -161,14 +150,4 @@ const ToolbarComponent: React.FC = (props: AllProps) => { ); }; -const mapDispatchToProps = (dispatch: Dispatch) => ({ - onDropdownSelect: (isOpened: boolean) => dispatch(onDropdownSelect(isOpened)), - setLogoutSuccess: () => dispatch(setLogoutSuccess()), -}); - -const mapStateToProps = ({ ui, user }: ApplicationState) => ({ - isDropdownOpen: ui.isDropdownOpen, - username: user.username, -}); - -export default connect(mapStateToProps, mapDispatchToProps)(ToolbarComponent); +export default ToolbarComponent; diff --git a/src/components/Wrapper/index.tsx b/src/components/Wrapper/index.tsx index e7cf1521b..e44c5db76 100644 --- a/src/components/Wrapper/index.tsx +++ b/src/components/Wrapper/index.tsx @@ -1,31 +1,26 @@ import { Page } from "@patternfly/react-core"; import type * as React from "react"; -import { connect } from "react-redux"; -import type { Dispatch } from "redux"; import { useTypedSelector } from "../../store/hooks"; -import type { ApplicationState } from "../../store/root/applicationState"; -import { onSidebarToggle, setIsNavOpen } from "../../store/ui/actions"; -import type { IUiState } from "../../store/ui/types"; -import type { IUserState } from "../../store/user/types"; +import { useDispatch } from "react-redux"; import Header from "./Header"; import Sidebar, { AnonSidebar } from "./Sidebar"; import "./wrapper.css"; +import { setIsNavOpen } from "../../store/ui/uiSlice"; -interface IOtherProps { - children: any; - user: IUserState; - niivueActive: boolean; -} -interface IPropsFromDispatch { - onSidebarToggle: typeof onSidebarToggle; - setIsNavOpen: typeof setIsNavOpen; -} -type AllProps = IUiState & IOtherProps & IPropsFromDispatch; +type WrapperProps = { + children: React.ReactElement[]; +}; -const Wrapper: React.FC = (props: AllProps) => { - const { children, user, niivueActive }: IOtherProps = props; +const Wrapper = (props: WrapperProps) => { + const { children } = props; + const dispatch = useDispatch(); + const { isNavOpen, sidebarActiveItem } = useTypedSelector( + (state) => state.ui, + ); + const user = useTypedSelector((state) => state.user); + const niivueActive = sidebarActiveItem === "niivue"; const onNavToggle = () => { - props.setIsNavOpen(!props.isNavOpen); + dispatch(setIsNavOpen(!isNavOpen)); }; const onPageResize = ( @@ -33,20 +28,20 @@ const Wrapper: React.FC = (props: AllProps) => { data: { mobileView: boolean; windowSize: number }, ) => { if (data.mobileView) { - props.setIsNavOpen(false); + dispatch(setIsNavOpen(false)); } // The default setting of the niivue viewer is without a sidebar active. It explicitly set's it to false in it's component. if (!data.mobileView && !niivueActive) { - props.setIsNavOpen(true); + dispatch(setIsNavOpen(true)); } }; const isLoggedIn = useTypedSelector(({ user }) => user.isLoggedIn); const sidebar = isLoggedIn ? ( - + ) : ( - + ); return ( @@ -61,18 +56,4 @@ const Wrapper: React.FC = (props: AllProps) => { ); }; -const mapDispatchToProps = (dispatch: Dispatch) => ({ - onSidebarToggle: (isOpened: boolean) => dispatch(onSidebarToggle(isOpened)), - setIsNavOpen: (isOpened: boolean) => dispatch(setIsNavOpen(isOpened)), -}); - -const mapStateToProps = ({ ui, user }: ApplicationState) => ({ - isNavOpen: ui.isNavOpen, - loading: ui.loading, - niivueActive: ui.sidebarActiveItem === "niivue", - user, -}); - -const WrapperConnect = connect(mapStateToProps, mapDispatchToProps)(Wrapper); - -export default WrapperConnect; +export default Wrapper; diff --git a/src/store/cart/actions.ts b/src/store/cart/actions.ts deleted file mode 100644 index f5a478e40..000000000 --- a/src/store/cart/actions.ts +++ /dev/null @@ -1,93 +0,0 @@ -import type { - Feed, - FileBrowserFolder, - FileBrowserFolderFile, -} from "@fnndsc/chrisapi"; -import { action } from "typesafe-actions"; -import { - type FeedCreationStatus, - ICartActionTypes, - type SelectionPayload, - type UploadPayload, -} from "./types"; - -type OperationPayload = { - paths: SelectionPayload[]; - username: string; -}; - -//Type to be determined -export const setSelectFolder = (selectPayload: { - path: string; - type: string; - payload: FileBrowserFolder | FileBrowserFolderFile; -}) => action(ICartActionTypes.SET_SELECTED_PATHS, selectPayload); - -export const clearSelectFolder = (path: string) => - action(ICartActionTypes.CLEAR_SELECTED_PATHS, path); - -export const setToggleCart = () => action(ICartActionTypes.SET_TOGGLE_CART); - -export const startDownload = (payload: OperationPayload) => - action(ICartActionTypes.START_DOWNLOAD, payload); - -export const setFileDownloadStatus = (payload: { - id: number; - step: string; - fileName: string; - error?: string; -}) => action(ICartActionTypes.SET_FILE_DOWNLOAD_STATUS, payload); - -export const setFolderDownloadStatus = (payload: { - id: number; - step: string; - fileName?: string; - error?: string; - feed?: Feed; -}) => action(ICartActionTypes.SET_FOLDER_DOWNLOAD_STATUS, payload); - -export const startUpload = (payload: UploadPayload) => - action(ICartActionTypes.START_UPLOAD, payload); - -export const startAnonymize = (payload: OperationPayload) => - action(ICartActionTypes.START_ANONYMIZE, payload); - -export const clearFeedCreationStatus = () => - action(ICartActionTypes.CLEAR_FEED_STATE); - -export const setFileUploadStatus = (payload: { - step: string; - fileName: string; - progress: number; - controller: AbortController | null; - path: string; - type: string; -}) => action(ICartActionTypes.SET_FILE_UPLOAD_STATUS, payload); - -export const setFolderUploadStatus = (payload: { - step: string; - fileName: string; - totalCount: number; - currentCount: number; - controller: AbortController | null; - path: string; - type: string; -}) => action(ICartActionTypes.SET_FOLDER_UPLOAD_STATUS, payload); - -export const setBulkSelectPaths = (payload: SelectionPayload[]) => - action(ICartActionTypes.SET_BULK_SELECTED_PATHS, payload); - -export const clearDownloadStatus = (payload: { - path: string; - type: string; -}) => action(ICartActionTypes.CLEAR_DOWNLOAD_STATUS, payload); - -export const removeIndividualSelection = (payload: SelectionPayload) => - action(ICartActionTypes.REMOVE_SELECTED_PAYLOAD, payload); - -export const clearUploadState = (payload: { type: string; id: string }) => - action(ICartActionTypes.CLEAR_UPLOAD_STATE, payload); - -export const cancelUpload = (payload: { type: string; id: string }) => - action(ICartActionTypes.CANCEL_UPLOAD, payload); -export const clearCart = () => action(ICartActionTypes.CLEAR_CART); diff --git a/src/store/cart/cartSlice.ts b/src/store/cart/cartSlice.ts new file mode 100644 index 000000000..a4ad7d0d5 --- /dev/null +++ b/src/store/cart/cartSlice.ts @@ -0,0 +1,177 @@ +// cartSlice.ts +import { createSlice, type PayloadAction } from "@reduxjs/toolkit"; +import type { + DownloadTypes, + ICartState, + SelectionPayload, + OperationPayload, + UploadPayload, +} from "./types"; + +const initialState: ICartState = { + selectedPaths: [], + openCart: false, + folderDownloadStatus: {}, + fileDownloadStatus: {}, + folderUploadStatus: {}, + fileUploadStatus: {}, +}; + +const cartSlice = createSlice({ + name: "cart", + initialState, + reducers: { + startUpload(state, _action: PayloadAction) { + state.openCart = true; + }, + setSelectedPaths(state, action: PayloadAction) { + state.selectedPaths.push(action.payload); + }, + setBulkSelectedPaths(state, action: PayloadAction) { + state.selectedPaths.push(...action.payload); + }, + clearSelectedPaths(state, action: PayloadAction) { + state.selectedPaths = state.selectedPaths.filter( + (pathObj) => pathObj.path !== action.payload, + ); + }, + clearDownloadStatus( + state, + action: PayloadAction<{ path: string; type: string }>, + ) { + const { path, type } = action.payload; + if (type === "folder") { + delete state.folderDownloadStatus[path]; + } else if (type === "file") { + delete state.fileDownloadStatus[path]; + } + }, + setToggleCart(state) { + state.openCart = !state.openCart; + }, + setFileDownloadStatus( + state, + action: PayloadAction<{ + id: number; + step: DownloadTypes; + fileName: string; + error?: string; + }>, + ) { + const { id, step, fileName, error } = action.payload; + state.fileDownloadStatus[id] = { step, fileName, error }; + }, + setFolderDownloadStatus( + state, + action: PayloadAction<{ + id: number; + step: DownloadTypes; + fileName?: string; + error?: string; + feed?: any; + }>, + ) { + const { id, step, fileName, error, feed } = action.payload; + state.folderDownloadStatus[id] = { step, error, fileName, feed }; + }, + setFileUploadStatus( + state, + action: PayloadAction<{ + step: string; + fileName: string; + progress: number; + controller: AbortController | null; + path: string; + type: string; + }>, + ) { + const { step, fileName, progress, controller, path, type } = + action.payload; + state.fileUploadStatus[fileName] = { + currentStep: step, + progress, + controller, + path, + type, + }; + }, + setFolderUploadStatus( + state, + action: PayloadAction<{ + step: string; + fileName: string; + totalCount: number; + currentCount: number; + controller: AbortController | null; + path: string; + type: string; + }>, + ) { + const { + step, + fileName, + totalCount, + currentCount, + controller, + path, + type, + } = action.payload; + state.folderUploadStatus[fileName] = { + currentStep: step, + done: currentCount, + total: totalCount, + controller, + path, + type, + }; + }, + removeSelectedPayload(state, action: PayloadAction) { + state.selectedPaths = state.selectedPaths.filter( + (currentPayload) => currentPayload.path !== action.payload.path, + ); + }, + clearUploadState( + state, + action: PayloadAction<{ id: string; type: string }>, + ) { + const { id, type } = action.payload; + if (type === "folder") { + delete state.folderUploadStatus[id]; + } else { + delete state.fileUploadStatus[id]; + } + }, + clearCart(state) { + state.selectedPaths = []; + }, + cancelUpload( + _state, + _action: PayloadAction<{ type: string; id: string }>, + ) {}, + clearFeedCreationStatus(_state) {}, + startDownload(_state, _action: PayloadAction) {}, + startAnonymize(_state, _action: PayloadAction) {}, + }, +}); + +export const { + startUpload, + setSelectedPaths, + setBulkSelectedPaths, + clearSelectedPaths, + clearDownloadStatus, + setToggleCart, + setFileDownloadStatus, + setFolderDownloadStatus, + setFileUploadStatus, + setFolderUploadStatus, + removeSelectedPayload, + clearUploadState, + clearCart, + cancelUpload, + clearFeedCreationStatus, + startDownload, + startAnonymize, +} = cartSlice.actions; + +export default cartSlice.reducer; diff --git a/src/store/cart/downloadSaga.ts b/src/store/cart/downloadSaga.ts index 57428115e..7bbcedebe 100644 --- a/src/store/cart/downloadSaga.ts +++ b/src/store/cart/downloadSaga.ts @@ -17,13 +17,18 @@ import { getFileName } from "../../api/common"; import type { IActionTypeParam } from "../../api/model"; import { getPlugin } from "../../components/CreateFeed/createFeedHelper"; import { downloadFile } from "../hooks"; -import { setFileDownloadStatus, setFolderDownloadStatus } from "./actions"; -import { ICartActionTypes, type SelectionPayload } from "./types"; +import { + setFileDownloadStatus, + setFolderDownloadStatus, + startDownload, + startAnonymize, +} from "./cartSlice"; +import { DownloadTypes, type SelectionPayload } from "./types"; export function* setStatus( type: string, id: number, - step: "started" | "processing" | "finished" | "cancelled", + step: DownloadTypes, fileName: string, error?: string, feed?: Feed, @@ -91,7 +96,7 @@ function* downloadFolder( `Failed to find the pipeline. Is this '${pipelineName}' registered?`, ); } - yield setStatus(type, id, "processing", path); + yield setStatus(type, id, DownloadTypes.progress, path); const pipelines = pipelineList.getItems() as unknown as Pipeline[]; const currentPipeline = pipelines[0]; try { @@ -101,7 +106,7 @@ function* downloadFolder( : `Library Anonymize for ${folderNameForFeed}`; const { feed, createdInstance } = yield call(createFeed, [path], feedName); // Set Status - yield setStatus(type, id, "processing", path, "", feed); + yield setStatus(type, id, DownloadTypes.progress, path, "", feed); // Add a workflow const workflow: Workflow = yield client.createWorkflow( currentPipeline.data.id, @@ -178,16 +183,23 @@ function* handleIndividualDownload( const pathForState = type === "file" ? payload.data.fname : payload.data.path; try { - yield call(setStatus, type, id, "started", pathForState); + yield call(setStatus, type, id, DownloadTypes.started, pathForState); if (type === "file" && pipelineType === "Download Pipeline") { yield call(downloadFile, payload as FileBrowserFolderFile); } else { yield call(downloadFolder, payload, username, pipelineType); } - yield call(setStatus, type, id, "finished", pathForState); + yield call(setStatus, type, id, DownloadTypes.finished, pathForState); } catch (error) { const errMsg = error instanceof Error ? error.message : "Unknown error"; - yield call(setStatus, type, id, "cancelled", pathForState, errMsg); + yield call( + setStatus, + type, + id, + DownloadTypes.cancelled, + pathForState, + errMsg, + ); } } @@ -206,9 +218,9 @@ function* handleAnonymize(action: IActionTypeParam) { } export function* watchAnonymize() { - yield takeEvery(ICartActionTypes.START_ANONYMIZE, handleAnonymize); + yield takeEvery(startAnonymize.type, handleAnonymize); } export function* watchDownload() { - yield takeEvery(ICartActionTypes.START_DOWNLOAD, handleDownload); + yield takeEvery(startDownload.type, handleDownload); } diff --git a/src/store/cart/reducer.ts b/src/store/cart/reducer.ts deleted file mode 100644 index 017408b21..000000000 --- a/src/store/cart/reducer.ts +++ /dev/null @@ -1,129 +0,0 @@ -import type { Reducer } from "redux"; -import { produce } from "immer"; -import { type ICartState, ICartActionTypes } from "./types"; - -const initialState: ICartState = { - selectedPaths: [], - openCart: false, - folderDownloadStatus: {}, - fileDownloadStatus: {}, - folderUploadStatus: {}, - fileUploadStatus: {}, -}; - -const reducer: Reducer = produce( - (draft: ICartState, action: typeof ICartActionTypes) => { - switch (action.type) { - case ICartActionTypes.START_UPLOAD: { - draft.openCart = true; - break; - } - - case ICartActionTypes.SET_SELECTED_PATHS: { - draft.selectedPaths.push(action.payload); - break; - } - - case ICartActionTypes.SET_BULK_SELECTED_PATHS: { - draft.selectedPaths.push(...action.payload); - break; - } - - case ICartActionTypes.CLEAR_SELECTED_PATHS: { - draft.selectedPaths = draft.selectedPaths.filter( - (pathObj) => pathObj.path !== action.payload, - ); - break; - } - - case ICartActionTypes.CLEAR_DOWNLOAD_STATUS: { - const { path, type } = action.payload; - type === "folder" && delete draft.folderDownloadStatus[path]; - type === "file" && delete draft.fileDownloadStatus[path]; - break; - } - - case ICartActionTypes.SET_TOGGLE_CART: { - draft.openCart = !draft.openCart; - break; - } - - case ICartActionTypes.SET_FILE_DOWNLOAD_STATUS: { - const { id, step, error, fileName } = action.payload; - draft.fileDownloadStatus[id] = { step, fileName, error }; - break; - } - - case ICartActionTypes.SET_FOLDER_DOWNLOAD_STATUS: { - const { id, step, error, fileName, feed } = action.payload; - - draft.folderDownloadStatus[id] = { step, fileName, error, feed }; - break; - } - - case ICartActionTypes.SET_FILE_UPLOAD_STATUS: { - const { step, fileName, progress, controller, path, type } = - action.payload; - draft.fileUploadStatus[fileName] = { - currentStep: step, - progress, - controller, - path, - type, - }; - break; - } - - case ICartActionTypes.SET_FOLDER_UPLOAD_STATUS: { - const { - step, - fileName, - totalCount, - currentCount, - controller, - path, - type, - } = action.payload; - draft.folderUploadStatus[fileName] = { - currentStep: step, - done: currentCount, - total: totalCount, - controller, - path, - type, - }; - break; - } - - case ICartActionTypes.REMOVE_SELECTED_PAYLOAD: { - draft.selectedPaths = draft.selectedPaths.filter((currentPayload) => { - return currentPayload.path !== action.payload.path; - }); - break; - } - - case ICartActionTypes.CLEAR_UPLOAD_STATE: { - const { id, type } = action.payload; - - if (type === "folder") { - delete draft.folderUploadStatus[id]; - } else { - delete draft.fileUploadStatus[id]; - } - break; - } - - case ICartActionTypes.CLEAR_CART: { - draft.selectedPaths = []; - break; - } - - default: { - return draft; - } - } - }, - initialState, -); - -export { reducer as cartReducer }; diff --git a/src/store/cart/types.ts b/src/store/cart/types.ts index 8335e8818..3d1b78cfa 100644 --- a/src/store/cart/types.ts +++ b/src/store/cart/types.ts @@ -1,4 +1,3 @@ -import keyMirror from "keymirror"; import type { Feed, FileBrowserFolder, @@ -15,7 +14,7 @@ export type FolderUploadObject = { currentStep: string; done: number; total: number; - controller: AbortController; + controller: AbortController | null; path: string; type: string; }; @@ -23,7 +22,7 @@ export type FolderUploadObject = { export type FileUploadObject = { currentStep: string; progress: number; - controller: AbortController; + controller: AbortController | null; path: string; type: string; }; @@ -47,7 +46,7 @@ export type DownloadStatus = { [key: string]: { step: DownloadTypes; error?: string; - fileName: string; + fileName?: string; feed?: Feed; }; }; @@ -73,24 +72,7 @@ export interface UploadPayload { currentPath: string; } -export const ICartActionTypes = keyMirror({ - SET_SELECTED_PATHS: null, - SET_BULK_SELECTED_PATHS: null, - CLEAR_SELECTED_PATHS: null, - CLEAR_CART: null, - CLEAR_UPLOAD_STATE: null, - SET_TOGGLE_CART: null, - START_DOWNLOAD: null, - CREATE_FEED: null, - CREATE_FEED_SUCCESS: null, - SET_FILE_DOWNLOAD_STATUS: null, - SET_FOLDER_DOWNLOAD_STATUS: null, - START_UPLOAD: null, - START_ANONYMIZE: null, - SET_FILE_UPLOAD_STATUS: null, - SET_FOLDER_UPLOAD_STATUS: null, - CLEAR_DOWNLOAD_STATUS: null, - REMOVE_SELECTED_PAYLOAD: null, - CANCEL_UPLOAD: null, - CLEAR_FEED_STATE: null, -}); +export type OperationPayload = { + paths: SelectionPayload[]; + username: string; +}; diff --git a/src/store/cart/uploadSaga.ts b/src/store/cart/uploadSaga.ts index 13872c2ff..7c9cb99f8 100644 --- a/src/store/cart/uploadSaga.ts +++ b/src/store/cart/uploadSaga.ts @@ -5,12 +5,16 @@ import { END, type EventChannel, eventChannel } from "redux-saga"; import { all, call, put, select, take, takeEvery } from "redux-saga/effects"; import ChrisAPIClient from "../../api/chrisapiclient"; import type { IActionTypeParam } from "../../api/model"; -import { setFileUploadStatus, setFolderUploadStatus } from "./actions"; import { - type FileUploadObject, - type FolderUploadObject, - ICartActionTypes, - type UploadPayload, + cancelUpload, + setFileUploadStatus, + setFolderUploadStatus, + startUpload, +} from "./cartSlice"; +import type { + FileUploadObject, + FolderUploadObject, + UploadPayload, } from "./types"; function createUploadChannel(config: any) { @@ -221,11 +225,11 @@ function* handleUpload(action: IActionTypeParam) { } export function* watchUpload() { - yield takeEvery(ICartActionTypes.START_UPLOAD, handleUpload); + yield takeEvery(startUpload.type, handleUpload); } export function* watchCancelUpload() { - yield takeEvery(ICartActionTypes.CANCEL_UPLOAD, function* (action: any) { + yield takeEvery(cancelUpload.type, function* (action: any) { const { id: fileName, type } = action.payload; if (type === "folder") { diff --git a/src/store/configureStore.ts b/src/store/configureStore.ts index 3a8add27b..fc745d0c4 100644 --- a/src/store/configureStore.ts +++ b/src/store/configureStore.ts @@ -1,47 +1,55 @@ /* * File: configureStore.ts * Description: this is where the store comes together: - * It contains the createStore() => store, rootReducers, rootSagas, logger and other middleware + * It contains the configureStore() => store, rootReducers, rootSagas, logger, and other middleware * Author: ChRIS UI */ -import { - type Store, - legacy_createStore as createStore, - applyMiddleware, -} from "redux"; -import { createLogger } from "redux-logger"; +import { configureStore } from "@reduxjs/toolkit"; import createSagaMiddleware from "redux-saga"; -import type { RootState } from "./root/applicationState"; -import rootReducer from "./root/rootReducer"; +import cartReducer from "./cart/cartSlice"; +import drawerReducer from "./drawer/drawerSlice"; +import explorerReducer from "./explorer/explorerSlice"; +import feedReducer from "./feed/feedSlice"; +import pluginReducer from "./plugin/pluginSlice"; +import pluginInstanceReducer from "./pluginInstance/pluginInstanceSlice"; +import resourceReducer from "./resources/resourceSlice"; import { rootSaga } from "./root/rootSaga"; -import { composeWithDevTools } from "redux-devtools-extension"; +import uiReducer from "./ui/uiSlice"; +import userReducer from "./user/userSlice"; -export const store = configureStore(); - -function configureStore(): Store { - // Custom redux logger - const logger = createLogger({ - collapsed: true, - }); +export const store = configureAppStore(); +function configureAppStore() { // Build Saga middleware const sagaMiddleware = createSagaMiddleware(); - // Build ALL Middleware - let middleware; - if (import.meta.env.NODE_ENV !== "production") { - //@ts-ignore - middleware = applyMiddleware(sagaMiddleware, logger); - } else { - middleware = applyMiddleware(sagaMiddleware); - } - - // Create store - const store = createStore(rootReducer, {}, composeWithDevTools(middleware)); + // Create store with Redux Toolkit's configureStore + const store = configureStore({ + reducer: { + user: userReducer, + cart: cartReducer, + drawers: drawerReducer, + explorer: explorerReducer, + feed: feedReducer, + plugin: pluginReducer, + instance: pluginInstanceReducer, + resource: resourceReducer, + ui: uiReducer, + }, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware({ + thunk: false, // Disabling thunk since we're using sagas + serializableCheck: false, // Disable serializable check if necessary + }).concat(sagaMiddleware), + devTools: import.meta.env.NODE_ENV !== "production", + }); // Run the root saga sagaMiddleware.run(rootSaga); - // Return the store object. return store; } + +// Export RootState type if needed elsewhere +export type AppDispatch = typeof store.dispatch; +export type AppStore = ReturnType; diff --git a/src/store/drawer/actions.ts b/src/store/drawer/actions.ts deleted file mode 100644 index 08d0b4a17..000000000 --- a/src/store/drawer/actions.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { action } from "typesafe-actions"; -import { DrawerActionTypes } from "./types"; - -export const setDrawerState = (drawerState: { - actionType: string; - open: boolean; - maximized: boolean; - minimized: boolean; -}) => { - return action(DrawerActionTypes.SET_DRAWER_STATE, drawerState); -}; - -export const setFilePreviewPanel = () => { - return action(DrawerActionTypes.SET_PREVIEW_PANEL); -}; - -export const setDrawerCurrentlyActive = ( - panel: string, - currentlyActive: string, -) => { - return action(DrawerActionTypes.SET_CURRENTLY_ACTIVE, { - panel, - currentlyActive, - }); -}; diff --git a/src/store/drawer/drawerSlice.ts b/src/store/drawer/drawerSlice.ts new file mode 100644 index 000000000..a38991b59 --- /dev/null +++ b/src/store/drawer/drawerSlice.ts @@ -0,0 +1,122 @@ +import { createSlice, type PayloadAction } from "@reduxjs/toolkit"; + +interface DrawerState { + open: boolean; + maximized: boolean; + minimized: boolean; + currentlyActive: string; +} + +export interface IDrawerState { + graph: DrawerState; + node: DrawerState; + files: DrawerState; + preview: DrawerState; +} + +export interface DrawerPayloadType { + actionType: keyof IDrawerState; // Adjusted to be more type-safe + open: boolean; + maximized: boolean; + minimized: boolean; +} + +const initialState: IDrawerState = { + graph: { + open: true, + maximized: false, + minimized: false, + currentlyActive: "graph", + }, + node: { + open: true, + maximized: false, + minimized: false, + currentlyActive: "node", + }, + files: { + open: true, + maximized: false, + minimized: false, + currentlyActive: "files", + }, + preview: { + open: false, + maximized: false, + minimized: false, + currentlyActive: "preview", + }, +}; + +const drawerSlice = createSlice({ + name: "drawer", + initialState, + reducers: { + setDrawerState: (state, action: PayloadAction) => { + const { actionType, open, maximized, minimized } = action.payload; + if (maximized) { + getMaximizedObject(state, action.payload); + } else if (minimized) { + getMinimizedObject(state, action.payload); + } else { + state[actionType] = { + ...state[actionType], + open, + maximized, + }; + } + }, + setFilePreviewPanel: (state) => { + state.preview = { + open: true, + maximized: false, + minimized: false, + currentlyActive: "preview", + }; + }, + setDrawerCurrentlyActive: ( + state, + action: PayloadAction<{ + panel: keyof IDrawerState; + currentlyActive: string; + }>, + ) => { + const { panel, currentlyActive } = action.payload; + state[panel].currentlyActive = currentlyActive; + }, + }, +}); + +export const { setDrawerState, setFilePreviewPanel, setDrawerCurrentlyActive } = + drawerSlice.actions; +export default drawerSlice.reducer; + +export const getMaximizedObject = ( + draft: IDrawerState, + payload: DrawerPayloadType, +) => { + for (const key in draft) { + if (key !== payload.actionType) { + draft[key as keyof IDrawerState].open = false; + draft[key as keyof IDrawerState].maximized = false; + } else { + draft[key].open = payload.open; + draft[key].maximized = payload.maximized; + } + } +}; + +export const getMinimizedObject = ( + draft: IDrawerState, + payload: DrawerPayloadType, +) => { + for (const key in draft) { + if (key !== payload.actionType) { + draft[key as keyof IDrawerState].open = true; + draft[key as keyof IDrawerState].maximized = false; + } else { + draft[key].open = payload.open; + draft[key].maximized = payload.maximized; + } + } +}; diff --git a/src/store/drawer/reducer.ts b/src/store/drawer/reducer.ts deleted file mode 100644 index 2e3aaf0c2..000000000 --- a/src/store/drawer/reducer.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { produce } from "immer"; -import type { Reducer } from "redux"; -import { - DrawerActionTypes, - type DrawerPayloadType, - type IDrawerState, -} from "./types"; - -const initialState: IDrawerState = { - graph: { - open: true, - maximized: false, - currentlyActive: "graph", - }, - node: { - open: true, - maximized: false, - currentlyActive: "node", - }, - files: { - open: true, - maximized: false, - currentlyActive: "files", - }, - preview: { - open: false, - maximized: false, - currentlyActive: "preview", - }, -}; - -const reducer: Reducer = produce( - (draft: IDrawerState, action: typeof DrawerActionTypes) => { - switch (action.type) { - case DrawerActionTypes.SET_DRAWER_STATE: { - if (action.payload.maximized === true) { - getMaximizedObject(draft, action.payload); - } else if (action.payload.minimized === true) { - getMinimizedObject(draft, action.payload); - } else { - draft[action.payload.actionType] = { - ...draft[action.payload.actionType], - open: action.payload.open, - maximized: action.payload.maximized, - }; - } - break; - } - - case DrawerActionTypes.SET_PREVIEW_PANEL: { - draft.preview = { - open: true, - maximized: false, - currentlyActive: "preview", - }; - break; - } - - case DrawerActionTypes.SET_CURRENTLY_ACTIVE: { - draft[action.payload.panel].currentlyActive = - action.payload.currentlyActive; - break; - } - - default: { - return draft; - } - } - }, - initialState, -); - -export { reducer as drawerReducer }; - -export const getMaximizedObject = ( - draft: IDrawerState, - payload: DrawerPayloadType, -) => { - for (const property in draft) { - if (property !== payload.actionType) { - draft[property].open = false; - draft[property].maximized = false; - } else { - draft[property].open = payload.open; - draft[property].maximized = payload.maximized; - } - } -}; - -export const getMinimizedObject = ( - draft: IDrawerState, - payload: DrawerPayloadType, -) => { - for (const property in draft) { - if (property !== payload.actionType) { - draft[property].open = true; - draft[property].maximized = false; - } else { - draft[property].open = payload.open; - draft[property].maximized = payload.maximized; - } - } -}; diff --git a/src/store/drawer/types.ts b/src/store/drawer/types.ts deleted file mode 100644 index 5f60153bd..000000000 --- a/src/store/drawer/types.ts +++ /dev/null @@ -1,22 +0,0 @@ -import keyMirror from "keymirror"; - -export interface IDrawerState { - [key: string]: { - open: boolean; - maximized: boolean; - currentlyActive: string; - }; -} - -export interface DrawerPayloadType { - actionType: string; - open: boolean; - maximized: boolean; - minimized: boolean; -} - -export const DrawerActionTypes = keyMirror({ - SET_DRAWER_STATE: null, - SET_PREVIEW_PANEL: null, - SET_CURRENTLY_ACTIVE: null, -}); diff --git a/src/store/explorer/actions.ts b/src/store/explorer/actions.ts deleted file mode 100644 index 82dcf8601..000000000 --- a/src/store/explorer/actions.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { action } from "typesafe-actions"; -import { ExplorerActionTypes } from "./types"; - -//Type to be determined -export const setSelectedFile = (selectedFile: any) => - action(ExplorerActionTypes.SET_SELECTED_FILE, selectedFile); - -export const clearSelectedFile = () => - action(ExplorerActionTypes.CLEAR_SELECTED_FILE); diff --git a/src/store/explorer/explorerSlice.ts b/src/store/explorer/explorerSlice.ts new file mode 100644 index 000000000..29e6ae019 --- /dev/null +++ b/src/store/explorer/explorerSlice.ts @@ -0,0 +1,26 @@ +import { createSlice, type PayloadAction } from "@reduxjs/toolkit"; +import type { IExplorerState } from "./types"; +import type { FileBrowserFolderFile } from "@fnndsc/chrisapi"; + +const initialState: IExplorerState = { + selectedFile: undefined, +}; + +const explorerSlice = createSlice({ + name: "explorer", + initialState, + reducers: { + setSelectedFile( + state, + action: PayloadAction, + ) { + state.selectedFile = action.payload; + }, + clearSelectedFile(state) { + state.selectedFile = undefined; + }, + }, +}); + +export const { setSelectedFile, clearSelectedFile } = explorerSlice.actions; +export default explorerSlice.reducer; diff --git a/src/store/explorer/reducer.ts b/src/store/explorer/reducer.ts deleted file mode 100644 index 62411d19b..000000000 --- a/src/store/explorer/reducer.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { produce } from "immer"; -import type { Reducer } from "redux"; -import { ExplorerActionTypes, type IExplorerState } from "./types"; - -const initialState: IExplorerState = { - selectedFile: undefined, -}; - -const reducer: Reducer = produce( - (draft: IExplorerState, action: typeof ExplorerActionTypes) => { - switch (action.type) { - case ExplorerActionTypes.SET_SELECTED_FILE: { - draft.selectedFile = action.payload; - break; - } - - case ExplorerActionTypes.CLEAR_SELECTED_FILE: { - draft.selectedFile = undefined; - break; - } - - default: { - return draft; - } - } - }, - initialState, -); - -export { reducer as explorerReducer }; diff --git a/src/store/explorer/types.ts b/src/store/explorer/types.ts index 54071ff60..7ef267e42 100644 --- a/src/store/explorer/types.ts +++ b/src/store/explorer/types.ts @@ -9,7 +9,6 @@ import type { FileBrowserFolder, FileBrowserFolderFile, } from "@fnndsc/chrisapi"; -import keyMirror from "keymirror"; export type Key = string | number; @@ -71,8 +70,3 @@ export type CheckInfo = { export interface IExplorerState { selectedFile?: FileBrowserFolderFile; } - -export const ExplorerActionTypes = keyMirror({ - SET_SELECTED_FILE: null, - CLEAR_SELECTED_FILE: null, -}); diff --git a/src/store/feed/actions.ts b/src/store/feed/actions.ts deleted file mode 100644 index 8d531017f..000000000 --- a/src/store/feed/actions.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { action } from "typesafe-actions"; -import type { Feed } from "@fnndsc/chrisapi"; -import { FeedActionTypes } from "./types"; - -export const getFeedSuccess = (item: Feed) => - action(FeedActionTypes.GET_FEED_SUCCESS, item); - -export const setFeedTreeProp = (orientation: string) => - action(FeedActionTypes.GET_FEED_TREE_PROP, orientation); - -export const setTranslate = (translate: { x: number; y: number }) => - action(FeedActionTypes.TRANSLATE_PROP, translate); - -export const setFeedLayout = () => action(FeedActionTypes.SET_LAYOUT); -export const resetFeed = () => action(FeedActionTypes.RESET_FEED); - -export const setBulkSelect = (feeds: Feed[], selectAllToggle: boolean) => - action(FeedActionTypes.BULK_SELECT, { - feeds, - selectAllToggle, - }); - -export const toggleSelectAll = (flag: boolean) => - action(FeedActionTypes.TOGGLE_SELECT_ALL, flag); - -export const setAllSelect = (feeds: Feed[]) => - action(FeedActionTypes.SET_ALL_SELECT, feeds); - -export const removeAllSelect = (feeds: Feed[]) => - action(FeedActionTypes.REMOVE_ALL_SELECT, feeds); - -export const removeBulkSelect = (feeds: Feed[], selectAllToggle: boolean) => - action(FeedActionTypes.REMOVE_BULK_SELECT, { - feeds, - selectAllToggle, - }); - -export const stopFetchingFeedResources = (feed: Feed) => - action(FeedActionTypes.STOP_FETCH_FEED_RESOURCES, feed); - -export const cleanupFeedResources = (feed: Feed) => - action(FeedActionTypes.CLEANUP_FEED_RESOURCES, feed); - -export const setSearchFilter = (value: string) => - action(FeedActionTypes.SET_SEARCH_FILTER, value); - -export const setShowToolbar = (toolbar: boolean) => - action(FeedActionTypes.SHOW_TOOLBAR, toolbar); diff --git a/src/store/feed/feedSlice.ts b/src/store/feed/feedSlice.ts new file mode 100644 index 000000000..e7c9eecbe --- /dev/null +++ b/src/store/feed/feedSlice.ts @@ -0,0 +1,73 @@ +import { createSlice, type PayloadAction } from "@reduxjs/toolkit"; +import type { IFeedState } from "./types"; +import type { Feed } from "@fnndsc/chrisapi"; + +// Define the initial state +const initialState: IFeedState = { + currentFeed: { + data: undefined, + error: "", + loading: false, + }, + currentLayout: false, + feedTreeProp: { + orientation: "vertical", + translate: { + x: 0, + y: 0, + }, + }, + searchFilter: { + value: "", + status: false, + }, + showToolbar: false, +}; + +// Create a slice +const feedSlice = createSlice({ + name: "feed", + initialState, + reducers: { + getFeedSuccess(state, action: PayloadAction) { + state.currentFeed.data = action.payload; + state.currentFeed.error = ""; + state.currentFeed.loading = false; + }, + setFeedTreeProp(state, action: PayloadAction) { + const currentOrientation = action.payload; + state.feedTreeProp.orientation = + currentOrientation === "horizontal" ? "vertical" : "horizontal"; + }, + setTranslate(state, action: PayloadAction<{ x: number; y: number }>) { + state.feedTreeProp.translate = action.payload; + }, + setFeedLayout(state) { + state.currentLayout = !state.currentLayout; + }, + resetFeed(_state) { + return initialState; + }, + setSearchFilter(state, action: PayloadAction) { + state.searchFilter.value = action.payload; + state.searchFilter.status = !state.searchFilter.status; + }, + setShowToolbar(state, action: PayloadAction) { + state.showToolbar = action.payload; + }, + }, +}); + +// Export the actions +export const { + getFeedSuccess, + setFeedTreeProp, + setTranslate, + setFeedLayout, + resetFeed, + setSearchFilter, + setShowToolbar, +} = feedSlice.actions; + +// Export the reducer +export default feedSlice.reducer; diff --git a/src/store/feed/reducer.ts b/src/store/feed/reducer.ts deleted file mode 100644 index dc2fed1d2..000000000 --- a/src/store/feed/reducer.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { produce } from "immer"; -import type { Reducer } from "redux"; -import { type IFeedState, FeedActionTypes } from "./types"; - -export const initialState: IFeedState = { - currentFeed: { - data: undefined, - error: "", - loading: false, - }, - currentLayout: false, - feedTreeProp: { - orientation: "vertical", - translate: { - x: 0, - y: 0, - }, - }, - bulkSelect: [], - selectAllToggle: false, - searchFilter: { - value: "", - status: false, - }, - showToolbar: false, -}; - -const reducer: Reducer = produce( - (draft: IFeedState, action: typeof FeedActionTypes) => { - switch (action.type) { - case FeedActionTypes.GET_FEED_SUCCESS: { - draft.currentFeed.data = action.payload; - draft.currentFeed.error = ""; - draft.currentFeed.loading = false; - break; - } - - case FeedActionTypes.SET_LAYOUT: { - draft.currentLayout = !draft.currentLayout; - break; - } - - case FeedActionTypes.TRANSLATE_PROP: { - draft.feedTreeProp.translate = action.payload; - break; - } - - case FeedActionTypes.GET_FEED_TREE_PROP: { - const currentOrientation = action.payload; - draft.feedTreeProp.orientation = - currentOrientation === "horizontal" ? "vertical" : "horizontal"; - break; - } - - case FeedActionTypes.SET_ALL_SELECT: { - draft.bulkSelect = [...action.payload]; - break; - } - - case FeedActionTypes.BULK_SELECT: { - draft.bulkSelect = action.payload.feeds; - draft.selectAllToggle = action.payload.selectAllToggle; - break; - } - - case FeedActionTypes.REMOVE_BULK_SELECT: { - draft.bulkSelect = action.payload.feeds; - draft.selectAllToggle = action.payload.selectAllToggle; - break; - } - - case FeedActionTypes.SET_SEARCH_FILTER: { - draft.searchFilter.value = action.payload; - draft.searchFilter.status = !draft.searchFilter.status; - break; - } - - case FeedActionTypes.TOGGLE_SELECT_ALL: { - draft.selectAllToggle = action.payload; - break; - } - - case FeedActionTypes.REMOVE_ALL_SELECT: { - draft.bulkSelect = []; - break; - } - - case FeedActionTypes.SHOW_TOOLBAR: { - draft.showToolbar = action.payload; - break; - } - - case FeedActionTypes.RESET_FEED: { - return initialState; - } - - default: - return draft; - } - }, - initialState, -); - -export { reducer as feedsReducer }; diff --git a/src/store/feed/types.ts b/src/store/feed/types.ts index 062eb511b..0350921bd 100644 --- a/src/store/feed/types.ts +++ b/src/store/feed/types.ts @@ -4,7 +4,7 @@ * Author: ChRIS UI * Notes: Work in progres ... */ -import keyMirror from "keymirror"; + import type { Feed } from "@fnndsc/chrisapi"; export interface FeedPayload { @@ -34,26 +34,10 @@ export interface IFeedState { currentFeed: FeedPayload; feedTreeProp: FeedTreeProp; currentLayout: boolean; - bulkSelect: Feed[]; - selectAllToggle: boolean; + searchFilter: { status: boolean; value: string; }; showToolbar: boolean; } - -export const FeedActionTypes = keyMirror({ - GET_FEED_SUCCESS: null, - GET_FEED_TREE_PROP: null, - RESET_FEED: null, - SET_LAYOUT: null, - BULK_SELECT: null, - REMOVE_BULK_SELECT: null, - SET_ALL_SELECT: null, - REMOVE_ALL_SELECT: null, - TOGGLE_SELECT_ALL: null, - TRANSLATE_PROP: null, - SET_SEARCH_FILTER: null, - SHOW_TOOLBAR: null, -}); diff --git a/src/store/plugin/actions.ts b/src/store/plugin/actions.ts deleted file mode 100644 index ba608ccc5..000000000 --- a/src/store/plugin/actions.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { action } from "typesafe-actions"; -import { PluginActionTypes } from "./types"; - -import type { PluginParameter, Plugin } from "@fnndsc/chrisapi"; - -export const getParams = (plugin: Plugin) => - action(PluginActionTypes.GET_PARAMS, plugin); - -export const getParamsSuccess = (params: { - required: PluginParameter[]; - dropdown: PluginParameter[]; -}) => action(PluginActionTypes.GET_PARAMS_SUCCESS, params); - -export const getComputeEnv = (plugin: Plugin) => - action(PluginActionTypes.GET_COMPUTE_ENV, plugin); - -export const getComputeEnvSuccess = (computeEnvs: any[]) => - action(PluginActionTypes.GET_COMPUTE_ENV_SUCCESS, computeEnvs); - -export const getComputeEnvError = (error: any) => - action(PluginActionTypes.GET_RESOURCE_ERROR, error); - -export const getNodeOperations = (opType: string) => - action(PluginActionTypes.GET_NODE_OPERATIONS, opType); diff --git a/src/store/plugin/pluginSlice.ts b/src/store/plugin/pluginSlice.ts new file mode 100644 index 000000000..a5e536fb6 --- /dev/null +++ b/src/store/plugin/pluginSlice.ts @@ -0,0 +1,80 @@ +import { type PayloadAction, createSlice } from "@reduxjs/toolkit"; +import type { Plugin, PluginParameter } from "@fnndsc/chrisapi"; + +export interface IPluginState { + parameters: { + required: PluginParameter[]; + dropdown: PluginParameter[]; + }; + computeEnv?: any[]; + resourceError: string; + nodeOperations: { + [key: string]: boolean; + }; +} + +// Define the initial state +const initialState: IPluginState = { + parameters: { + dropdown: [], + required: [], + }, + computeEnv: undefined, + resourceError: "", + nodeOperations: { + terminal: false, + childNode: false, + childPipeline: false, + childGraph: false, + deleteNode: false, + }, +}; + +// Create a slice +const pluginSlice = createSlice({ + name: "plugin", + initialState, + reducers: { + getParams(_state, _action: PayloadAction) { + // This action might be redundant if parameters are fetched in another way + }, + getParamsSuccess( + state, + action: PayloadAction<{ + required: PluginParameter[]; + dropdown: PluginParameter[]; + }>, + ) { + state.parameters.required = action.payload.required; + state.parameters.dropdown = action.payload.dropdown; + }, + getComputeEnv(_state, _action: PayloadAction) { + // This action might be redundant if computeEnv is fetched in another way + }, + getComputeEnvSuccess(state, action: PayloadAction) { + state.computeEnv = action.payload; + }, + getComputeEnvError(state, action: PayloadAction) { + state.resourceError = action.payload; + }, + getNodeOperations(state, action: PayloadAction) { + const key = action.payload; + if (key in state.nodeOperations) { + state.nodeOperations[key] = !state.nodeOperations[key]; + } + }, + }, +}); + +// Export the actions +export const { + getParams, + getParamsSuccess, + getComputeEnv, + getComputeEnvSuccess, + getComputeEnvError, + getNodeOperations, +} = pluginSlice.actions; + +// Export the reducer +export default pluginSlice.reducer; diff --git a/src/store/plugin/reducer.ts b/src/store/plugin/reducer.ts deleted file mode 100644 index dc2dba2e0..000000000 --- a/src/store/plugin/reducer.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { produce } from "immer"; -import type { Reducer } from "redux"; -import { PluginActionTypes, type IPluginState } from "./types"; - -// Type-safe initialState -const initialState: IPluginState = { - parameters: { - dropdown: [], - required: [], - }, - computeEnv: undefined, - resourceError: "", - nodeOperations: { - terminal: false, - childNode: false, - childPipeline: false, - childGraph: false, - deleteNode: false, - }, -}; - -const reducer: Reducer = produce( - (draft: IPluginState, action: typeof PluginActionTypes) => { - switch (action.type) { - case PluginActionTypes.GET_NODE_OPERATIONS: { - draft.nodeOperations[action.payload] = - !draft.nodeOperations[action.payload]; - break; - } - - case PluginActionTypes.GET_PARAMS_SUCCESS: { - draft.parameters.required = action.payload.required; - draft.parameters.dropdown = action.payload.dropdown; - break; - } - - case PluginActionTypes.GET_COMPUTE_ENV_SUCCESS: { - draft.computeEnv = action.payload; - break; - } - - case PluginActionTypes.GET_RESOURCE_ERROR: { - draft.resourceError = action.payload; - break; - } - - default: { - return draft; - } - } - }, - initialState, -); - -export { reducer as pluginReducer }; diff --git a/src/store/plugin/saga.ts b/src/store/plugin/saga.ts index 6818f2af5..bd5031676 100644 --- a/src/store/plugin/saga.ts +++ b/src/store/plugin/saga.ts @@ -1,13 +1,13 @@ import { all, fork, put, takeEvery } from "redux-saga/effects"; import type { IActionTypeParam } from "../../api/model"; -import { PluginActionTypes } from "./types"; import type { PluginParameter } from "@fnndsc/chrisapi"; -import { catchError, fetchResource } from "../../api/common"; +import { fetchResource } from "../../api/common"; import { getComputeEnvError, getComputeEnvSuccess, getParamsSuccess, -} from "./actions"; +} from "./pluginSlice"; +import { getParams } from "./pluginSlice"; // ------------------------------------------------------------------------ // Description: Get Plugin Descendants, files and parameters on change @@ -56,7 +56,7 @@ function* handleGetParams(action: IActionTypeParam) { } } function* watchGetParams() { - yield takeEvery(PluginActionTypes.GET_PARAMS, handleGetParams); + yield takeEvery(getParams.type, handleGetParams); } // ------------------------------------------------------------------------ diff --git a/src/store/plugin/types.ts b/src/store/plugin/types.ts deleted file mode 100644 index 7d45948f8..000000000 --- a/src/store/plugin/types.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * File: plugin/types.ts - * Description: Holds types and constants for managing Chris API plugin calls - * Author: ChRIS UI - * Notes: . - */ -import keyMirror from "keymirror"; -import type { PluginParameter } from "@fnndsc/chrisapi"; - -export interface IPluginState { - parameters: { - required: PluginParameter[]; - dropdown: PluginParameter[]; - }; - computeEnv?: any[]; - resourceError: string; - nodeOperations: { - [key: string]: boolean; - }; -} - -export const PluginActionTypes = keyMirror({ - GET_PARAMS: null, - GET_PARAMS_SUCCESS: null, - GET_COMPUTE_ENV: null, - GET_COMPUTE_ENV_SUCCESS: null, - GET_RESOURCE_ERROR: null, - GET_NODE_OPERATIONS: null, -}); diff --git a/src/store/pluginInstance/actions.ts b/src/store/pluginInstance/actions.ts deleted file mode 100644 index c08f1bd0f..000000000 --- a/src/store/pluginInstance/actions.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { Feed, PluginInstance } from "@fnndsc/chrisapi"; -import { action } from "typesafe-actions"; -import { - type AddNodePayload, - type PluginInstanceObj, - PluginInstanceTypes, - type SplitNodesPayload, -} from "./types"; - -export const getSelectedPlugin = (item: PluginInstance) => - action(PluginInstanceTypes.GET_SELECTED_PLUGIN, item); -export const getSelectedD3Node = (item: any) => - action(PluginInstanceTypes.GET_SELECTED_D3_NODE, item); -export const getPluginInstancesRequest = (feed: Feed) => - action(PluginInstanceTypes.GET_PLUGIN_INSTANCES_REQUEST, feed); -export const getPluginInstancesSuccess = (items: PluginInstanceObj) => - action(PluginInstanceTypes.GET_PLUGIN_INSTANCES_SUCCESS, items); -export const getPluginInstancesError = (error: any) => - action(PluginInstanceTypes.GET_PLUGIN_INSTANCES_ERROR, error); -export const addNodeRequest = (item: AddNodePayload) => - action(PluginInstanceTypes.ADD_NODE_REQUEST, item); -export const addNodeSuccess = (pluginItem: PluginInstance) => - action(PluginInstanceTypes.ADD_NODE_SUCCESS, pluginItem); -export const setPluginTitle = (pluginItem: PluginInstance) => - action(PluginInstanceTypes.SET_PLUGIN_TITLE, pluginItem); -export const addSplitNodes = (splitNodesPayload: SplitNodesPayload) => - action(PluginInstanceTypes.ADD_SPLIT_NODES, splitNodesPayload); -export const addSplitNodesSuccess = (splitNodes: PluginInstance[]) => - action(PluginInstanceTypes.ADD_SPLIT_NODES_SUCCESS, splitNodes); -export const resetPluginInstances = () => - action(PluginInstanceTypes.RESET_PLUGIN_INSTANCES); diff --git a/src/store/pluginInstance/pluginInstanceSlice.ts b/src/store/pluginInstance/pluginInstanceSlice.ts new file mode 100644 index 000000000..85973b495 --- /dev/null +++ b/src/store/pluginInstance/pluginInstanceSlice.ts @@ -0,0 +1,90 @@ +import { createSlice, type PayloadAction } from "@reduxjs/toolkit"; +import type { + IPluginInstanceState, + AddNodePayload, + PluginInstanceObj, +} from "./types"; +import type { Feed, PluginInstance } from "@fnndsc/chrisapi"; + +// Define the initial state +const initialState: IPluginInstanceState = { + selectedPlugin: undefined, + pluginInstances: { + data: undefined, + error: "", + loading: false, + }, + selectedD3Node: undefined, +}; + +// Create a slice +const pluginInstanceSlice = createSlice({ + name: "pluginInstance", + initialState, + reducers: { + getSelectedPlugin(state, action: PayloadAction) { + state.selectedPlugin = action.payload; + }, + getSelectedD3Node(state, action: PayloadAction) { + state.selectedD3Node = action.payload; + }, + getPluginInstancesRequest(state, _action: PayloadAction) { + state.pluginInstances.loading = true; + }, + getPluginInstancesSuccess(state, action: PayloadAction) { + state.selectedPlugin = action.payload.selected; + state.pluginInstances = { + data: action.payload.pluginInstances, + error: "", + loading: false, + }; + }, + getPluginInstancesError(state, action: PayloadAction) { + state.pluginInstances = { + data: undefined, + error: action.payload, + loading: false, + }; + }, + addNodeRequest(_state, _action: PayloadAction) { + // This action might be redundant if node adding is handled in saga + }, + addNodeSuccess(state, action: PayloadAction) { + if (state.pluginInstances.data) { + state.pluginInstances.data.push(action.payload); + } else { + state.pluginInstances.data = [action.payload]; + } + }, + setPluginTitle(state, action: PayloadAction) { + if (state.pluginInstances.data) { + const foundIndex = state.pluginInstances.data.findIndex( + (instance) => instance.data.id === action.payload.data.id, + ); + if (foundIndex !== -1) { + state.pluginInstances.data[foundIndex] = action.payload; + state.selectedPlugin = action.payload; + } + } + }, + resetPluginInstances(_state) { + return initialState; + }, + }, +}); + +// Export the actions +export const { + getSelectedPlugin, + getSelectedD3Node, + getPluginInstancesRequest, + getPluginInstancesSuccess, + getPluginInstancesError, + addNodeRequest, + addNodeSuccess, + setPluginTitle, + resetPluginInstances, +} = pluginInstanceSlice.actions; + +// Export the reducer +export default pluginInstanceSlice.reducer; diff --git a/src/store/pluginInstance/reducer.ts b/src/store/pluginInstance/reducer.ts deleted file mode 100644 index eb036d822..000000000 --- a/src/store/pluginInstance/reducer.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { produce } from "immer"; -import type { Reducer } from "redux"; -import { type IPluginInstanceState, PluginInstanceTypes } from "./types"; - -export const initialState: IPluginInstanceState = { - selectedPlugin: undefined, - pluginInstances: { - data: undefined, - error: "", - loading: false, - }, - selectedD3Node: undefined, -}; - -const reducer: Reducer = produce( - ( - draft: IPluginInstanceState, - action: { type: keyof typeof PluginInstanceTypes; payload?: any }, - ) => { - switch (action.type) { - case PluginInstanceTypes.GET_SELECTED_D3_NODE: { - draft.selectedD3Node = action.payload; - break; - } - - case PluginInstanceTypes.GET_PLUGIN_INSTANCES_REQUEST: { - draft.pluginInstances.loading = true; - break; - } - - case PluginInstanceTypes.GET_PLUGIN_INSTANCES_SUCCESS: { - draft.selectedPlugin = action.payload.selected; - draft.pluginInstances = { - data: action.payload.pluginInstances, - error: "", - loading: false, - }; - break; - } - - case PluginInstanceTypes.GET_PLUGIN_INSTANCES_ERROR: { - draft.pluginInstances = { - data: undefined, - error: action.payload, - loading: false, - }; - break; - } - - case PluginInstanceTypes.GET_SELECTED_PLUGIN: { - draft.selectedPlugin = action.payload; - break; - } - - case PluginInstanceTypes.SET_PLUGIN_TITLE: { - if (draft.pluginInstances.data) { - const foundIndex = draft.pluginInstances.data.findIndex( - (instance) => instance.data.id === action.payload.data.id, - ); - if (foundIndex !== -1) { - draft.pluginInstances.data[foundIndex] = action.payload; - draft.selectedPlugin = action.payload; - } - } - break; - } - - case PluginInstanceTypes.ADD_NODE_SUCCESS: { - if (draft.pluginInstances.data) { - draft.pluginInstances.data.push(action.payload); - } else { - draft.pluginInstances.data = [action.payload]; - } - break; - } - - case PluginInstanceTypes.ADD_SPLIT_NODES_SUCCESS: { - if (draft.pluginInstances.data) { - draft.pluginInstances.data.push(...action.payload); - } - break; - } - - case PluginInstanceTypes.RESET_PLUGIN_INSTANCES: { - return initialState; - } - - default: - return draft; // Ensure draft is returned in default case - } - }, - initialState, -); - -export { reducer as pluginInstanceReducer }; diff --git a/src/store/pluginInstance/saga.ts b/src/store/pluginInstance/saga.ts index f7ad01e53..533a3fb11 100644 --- a/src/store/pluginInstance/saga.ts +++ b/src/store/pluginInstance/saga.ts @@ -2,15 +2,15 @@ import type { Feed, PluginInstance } from "@fnndsc/chrisapi"; import { all, fork, put, takeEvery } from "@redux-saga/core/effects"; import { catchError, fetchResource } from "../../api/common"; import type { IActionTypeParam } from "../../api/model"; -import { getPluginInstanceStatusRequest } from "../resources/actions"; +import { getPluginInstanceStatusRequest } from "../resources/resourceSlice"; import { + addNodeRequest, addNodeSuccess, - addSplitNodesSuccess, getPluginInstancesError, + getPluginInstancesRequest, getPluginInstancesSuccess, getSelectedPlugin, -} from "./actions"; -import { PluginInstanceTypes } from "./types"; +} from "./pluginInstanceSlice"; function* setPluginInstances(feed: Feed) { try { @@ -34,7 +34,7 @@ function* setPluginInstances(feed: Feed) { put(getPluginInstanceStatusRequest(pluginInstanceObj)), ]); } catch (error: any) { - const errObj = catchError(error); + const errObj = catchError(error).error_message; yield put(getPluginInstancesError(errObj)); } } @@ -59,46 +59,18 @@ function* handleAddNode(action: IActionTypeParam) { } } -function* handleSplitNode(action: IActionTypeParam) { - const items: PluginInstance[] = action.payload.nodes; - const splitNodes: PluginInstance[] = action.payload.splitNodes; - const selected: PluginInstance = action.payload.selectedPlugin; - - const newList: PluginInstance[] = [...items, ...splitNodes]; - yield all([ - put(addSplitNodesSuccess(splitNodes)), - put( - getPluginInstanceStatusRequest({ - selected, - pluginInstances: newList, - }), - ), - ]); -} - // ------------------------------------------------------------------------ // Description: Delete a node // ------------------------------------------------------------------------ function* watchGetPluginInstanceRequest() { - yield takeEvery( - PluginInstanceTypes.GET_PLUGIN_INSTANCES_REQUEST, - handleGetPluginInstances, - ); + yield takeEvery(getPluginInstancesRequest.type, handleGetPluginInstances); } function* watchAddNode() { - yield takeEvery(PluginInstanceTypes.ADD_NODE_REQUEST, handleAddNode); -} - -function* watchAddSplitNode() { - yield takeEvery(PluginInstanceTypes.ADD_SPLIT_NODES, handleSplitNode); + yield takeEvery(addNodeRequest.type, handleAddNode); } export function* pluginInstanceSaga() { - yield all([ - fork(watchGetPluginInstanceRequest), - fork(watchAddNode), - fork(watchAddSplitNode), - ]); + yield all([fork(watchGetPluginInstanceRequest), fork(watchAddNode)]); } diff --git a/src/store/pluginInstance/types.ts b/src/store/pluginInstance/types.ts index b1b714339..170a76a73 100644 --- a/src/store/pluginInstance/types.ts +++ b/src/store/pluginInstance/types.ts @@ -5,7 +5,6 @@ * */ -import keyMirror from "keymirror"; import type { PluginInstance } from "@fnndsc/chrisapi"; export interface PluginInstanceObj { @@ -35,20 +34,3 @@ export interface IPluginInstanceState { selectedPlugin?: PluginInstance; selectedD3Node?: any; } - -export const PluginInstanceTypes = keyMirror({ - GET_SELECTED_D3_NODE: null, - GET_SELECTED_PLUGIN: null, - GET_PLUGIN_INSTANCES_REQUEST: null, - GET_PLUGIN_INSTANCES_SUCCESS: null, - GET_PLUGIN_INSTANCES_ERROR: null, - ADD_NODE_REQUEST: null, - ADD_NODE_SUCCESS: null, - SET_PLUGIN_TITLE: null, - SWITCH_TREE_MODE: null, - ADD_TS_NODE: null, - DELETE_TS_NODE: null, - ADD_SPLIT_NODES: null, - ADD_SPLIT_NODES_SUCCESS: null, - RESET_PLUGIN_INSTANCES: null, -}); diff --git a/src/store/resources/actions.ts b/src/store/resources/actions.ts deleted file mode 100644 index 1ff817542..000000000 --- a/src/store/resources/actions.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { action } from "typesafe-actions"; -import { - ResourceTypes, - type PluginInstanceObj, - type DestroyActiveResources, -} from "./types"; -import type { PluginInstance } from "@fnndsc/chrisapi"; - -export const getPluginInstanceResources = (pluginInstances: PluginInstance[]) => - action(ResourceTypes.GET_PLUGIN_INSTANCE_RESOURCE_REQUEST, pluginInstances); -export const getPluginInstanceResourceSuccess = (resource: any) => - action(ResourceTypes.GET_PLUGIN_INSTANCE_RESOURCE_SUCCESS, resource); -export const stopFetchingPluginResources = (id: number) => - action(ResourceTypes.STOP_FETCHING_PLUGIN_RESOURCES, id); - -export const getPluginInstanceStatusRequest = (items: PluginInstanceObj) => - action(ResourceTypes.GET_PLUGIN_STATUS_REQUEST, items); -export const getPluginInstanceStatusSuccess = (statusPayload: { - selected: PluginInstance; - status: string; -}) => action(ResourceTypes.GET_PLUGIN_STATUS_SUCCESS, statusPayload); -export const stopFetchingStatusResources = (id: number) => - action(ResourceTypes.STOP_FETCHING_STATUS_RESOURCES, id); - -export const getPluginFilesRequest = (payload: { id: number; path: string }) => - action(ResourceTypes.GET_PLUGIN_FILES_REQUEST, payload); -export const getPluginFilesSuccess = (filesPayload: { - id: string; - path: string; -}) => action(ResourceTypes.GET_PLUGIN_FILES_SUCCESS, filesPayload); -export const getPluginFilesError = (payload: { id: number; error: any }) => - action(ResourceTypes.GET_PLUGIN_FILES_ERROR, payload); - -export const resetActiveResources = (data: DestroyActiveResources) => - action(ResourceTypes.RESET_ACTIVE_RESOURCES, data); - -export const setCurrentUrl = (url: string) => - action(ResourceTypes.SET_CURRENT_URL, url); diff --git a/src/store/resources/reducer.ts b/src/store/resources/reducer.ts deleted file mode 100644 index 253b33c56..000000000 --- a/src/store/resources/reducer.ts +++ /dev/null @@ -1,82 +0,0 @@ -import type { Reducer } from "redux"; -import { produce } from "immer"; -import { type IResourceState, ResourceTypes } from "./types"; -import { getStatusLabels } from "./utils"; - -export const initialState: IResourceState = { - pluginInstanceStatus: {}, - pluginInstanceResource: {}, - pluginFiles: {}, - url: "", - loading: false, -}; - -const reducer: Reducer = produce( - (draft: IResourceState, action: typeof ResourceTypes) => { - switch (action.type) { - case ResourceTypes.GET_PLUGIN_STATUS_SUCCESS: { - const { selected, status } = action.payload; - draft.pluginInstanceStatus[selected.data.id] = { status }; - break; - } - - case ResourceTypes.GET_PLUGIN_FILES_REQUEST: { - draft.loading = true; - break; - } - - case ResourceTypes.GET_PLUGIN_INSTANCE_RESOURCE_SUCCESS: { - const { id, pluginStatus, pluginLog, pluginDetails, previousStatus } = - action.payload; - const pluginStatusLabels = getStatusLabels( - pluginStatus, - pluginDetails, - previousStatus, - ); - draft.pluginInstanceResource[id] = { - pluginStatus: pluginStatusLabels, - pluginLog, - }; - break; - } - - case ResourceTypes.GET_PLUGIN_FILES_SUCCESS: { - const { id, folderFiles, linkFiles, children, path } = action.payload; - draft.loading = false; - draft.pluginFiles[id] = { - folderFiles, - children, - linkFiles, - error: "", - path, - }; - break; - } - - case ResourceTypes.GET_PLUGIN_FILES_ERROR: { - const { id, error } = action.payload; - draft.loading = false; - draft.pluginFiles[id] = { - ...draft.pluginFiles[id], - error, - }; - break; - } - - case ResourceTypes.RESET_ACTIVE_RESOURCES: { - return initialState; - } - - case ResourceTypes.SET_CURRENT_URL: { - draft.url = action.payload; - break; - } - - default: - return draft; - } - }, - initialState, -); - -export { reducer as resourceReducer }; diff --git a/src/store/resources/resourceSlice.ts b/src/store/resources/resourceSlice.ts new file mode 100644 index 000000000..1af98709e --- /dev/null +++ b/src/store/resources/resourceSlice.ts @@ -0,0 +1,127 @@ +import { createSlice, type PayloadAction } from "@reduxjs/toolkit"; +import type { + IResourceState, + PluginInstanceObj, + DestroyActiveResources, +} from "./types"; +import { getStatusLabels } from "./utils"; +import type { + PluginInstance, + FileBrowserFolderFile, + FileBrowserFolderLinkFile, +} from "@fnndsc/chrisapi"; + +const initialState: IResourceState = { + pluginInstanceStatus: {}, + pluginInstanceResource: {}, + pluginFiles: {}, + url: "", + loading: false, +}; + +const resourceSlice = createSlice({ + name: "resources", + initialState, + reducers: { + getPluginInstanceResources( + _state, + _action: PayloadAction, + ) { + // No state mutation needed for this action + }, + getPluginInstanceResourceSuccess(state, action: PayloadAction) { + const { id, pluginStatus, pluginLog, pluginDetails, previousStatus } = + action.payload; + const pluginStatusLabels = getStatusLabels( + pluginStatus, + pluginDetails, + previousStatus, + ); + state.pluginInstanceResource[id] = { + pluginStatus: pluginStatusLabels, + pluginLog, + }; + }, + stopFetchingPluginResources(_state, _action: PayloadAction) { + // No state mutation needed for this action + }, + getPluginInstanceStatusRequest( + _state, + _action: PayloadAction, + ) { + // No state mutation needed for this action + }, + getPluginInstanceStatusSuccess( + state, + action: PayloadAction<{ selected: PluginInstance; status: string }>, + ) { + const { selected, status } = action.payload; + state.pluginInstanceStatus[selected.data.id] = { status }; + }, + stopFetchingStatusResources(_state, _action: PayloadAction) { + // No state mutation needed for this action + }, + getPluginFilesRequest( + state, + _action: PayloadAction<{ id: number; path: string }>, + ) { + state.loading = true; + }, + getPluginFilesSuccess( + state, + action: PayloadAction<{ + id: string; + folderFiles: FileBrowserFolderFile[]; + linkFiles: FileBrowserFolderLinkFile[]; + children: any[]; + path: string; + }>, + ) { + const { id, folderFiles, linkFiles, children, path } = action.payload; + state.loading = false; + state.pluginFiles[id] = { + folderFiles, + children, + linkFiles, + error: "", + path, + }; + }, + getPluginFilesError( + state, + action: PayloadAction<{ id: number; error: any }>, + ) { + const { id, error } = action.payload; + state.loading = false; + state.pluginFiles[id] = { + ...state.pluginFiles[id], + error, + }; + }, + resetActiveResources( + _state, + _action: PayloadAction, + ) { + return initialState; + }, + setCurrentUrl(state, action: PayloadAction) { + state.url = action.payload; + }, + }, +}); + +export const { + getPluginInstanceResources, + getPluginInstanceResourceSuccess, + stopFetchingPluginResources, + getPluginInstanceStatusRequest, + getPluginInstanceStatusSuccess, + stopFetchingStatusResources, + getPluginFilesRequest, + getPluginFilesSuccess, + getPluginFilesError, + resetActiveResources, + setCurrentUrl, +} = resourceSlice.actions; + +export default resourceSlice.reducer; diff --git a/src/store/resources/saga.ts b/src/store/resources/saga.ts index d0cffb381..e60e9bde4 100644 --- a/src/store/resources/saga.ts +++ b/src/store/resources/saga.ts @@ -9,20 +9,19 @@ import type { Task } from "redux-saga"; import ChrisAPIClient from "../../api/chrisapiclient"; import { catchError, fetchResource } from "../../api/common"; import type { IActionTypeParam } from "../../api/model"; -import { PluginInstanceTypes } from "../pluginInstance/types"; import { getPluginFilesError, + getPluginFilesRequest, getPluginFilesSuccess, getPluginInstanceResourceSuccess, getPluginInstanceStatusSuccess, + resetActiveResources, stopFetchingPluginResources, stopFetchingStatusResources, -} from "./actions"; -import { - type FetchFileResult, - type PluginStatusLabels, - ResourceTypes, -} from "./types"; + getPluginInstanceStatusRequest, +} from "./resourceSlice"; +import type { FetchFileResult, PluginStatusLabels } from "./types"; +import { getSelectedPlugin } from "../pluginInstance/pluginInstanceSlice"; export const fetchFilesFromAPath = async ( path: string, @@ -212,14 +211,14 @@ function cancelStatusPolling(task: Task) { } function* watchCancelPoll(pollTask: Task) { - yield takeEvery(ResourceTypes.STOP_FETCHING_PLUGIN_RESOURCES, () => { + yield takeEvery(stopFetchingPluginResources.type, () => { cancelPolling(pollTask); }); } function* watchStatusCancelPoll(pollTask: PollTask) { yield takeEvery( - ResourceTypes.STOP_FETCHING_STATUS_RESOURCES, + stopFetchingStatusResources.type, (action: IActionTypeParam) => { const id = action.payload; const taskToCancel = pollTask[id]; @@ -253,28 +252,19 @@ function* pollInstanceEndpoints(action: IActionTypeParam) { } function* watchGetPluginFilesRequest() { - yield takeEvery(ResourceTypes.GET_PLUGIN_FILES_REQUEST, fetchPluginFiles); + yield takeEvery(getPluginFilesRequest.type, fetchPluginFiles); } function* watchGetPluginStatusRequest() { - yield takeEvery( - ResourceTypes.GET_PLUGIN_STATUS_REQUEST, - pollInstanceEndpoints, - ); + yield takeEvery(getPluginInstanceStatusRequest.type, pollInstanceEndpoints); } function* watchResetActiveResources() { - yield takeEvery( - ResourceTypes.RESET_ACTIVE_RESOURCES, - handleResetActiveResources, - ); + yield takeEvery(resetActiveResources.type, handleResetActiveResources); } function* watchSelectedPlugin() { - yield takeEvery( - PluginInstanceTypes.GET_SELECTED_PLUGIN, - pollorCancelEndpoints, - ); + yield takeEvery(getSelectedPlugin.type, pollorCancelEndpoints); } export function* resourceSaga() { diff --git a/src/store/resources/types.ts b/src/store/resources/types.ts index 4a0c4ab84..f0f67d86f 100644 --- a/src/store/resources/types.ts +++ b/src/store/resources/types.ts @@ -4,7 +4,6 @@ * Author: ChRIS UI * Notes: Work in progres ... */ -import keyMirror from "keymirror"; import type { PluginInstance, @@ -101,17 +100,3 @@ export interface IResourceState { url: string; loading: boolean; } - -export const ResourceTypes = keyMirror({ - GET_PLUGIN_INSTANCE_RESOURCE_REQUEST: null, - GET_PLUGIN_INSTANCE_RESOURCE_SUCCESS: null, - GET_PLUGIN_STATUS_REQUEST: null, - GET_PLUGIN_STATUS_SUCCESS: null, - STOP_FETCHING_STATUS_RESOURCES: null, - STOP_FETCHING_PLUGIN_RESOURCES: null, - GET_PLUGIN_FILES_REQUEST: null, - GET_PLUGIN_FILES_SUCCESS: null, - GET_PLUGIN_FILES_ERROR: null, - RESET_ACTIVE_RESOURCES: null, - SET_CURRENT_URL: null, -}); diff --git a/src/store/root/applicationState.ts b/src/store/root/applicationState.ts index e10a9e118..e83eb9381 100644 --- a/src/store/root/applicationState.ts +++ b/src/store/root/applicationState.ts @@ -4,16 +4,14 @@ import type { ICartState } from "../cart/types"; * Description: this is where the ApplicationState and supporting interfaces comes together: * Author: ChRIS UI */ -import type { IDrawerState } from "../drawer/types"; +import type { IDrawerState } from "../drawer/drawerSlice"; import type { IExplorerState } from "../explorer/types"; import type { IFeedState } from "../feed/types"; -import type { IPluginState } from "../plugin/types"; +import type { IPluginState } from "../plugin/pluginSlice"; import type { IPluginInstanceState } from "../pluginInstance/types"; import type { IResourceState } from "../resources/types"; - -import type { IUiState } from "../ui/types"; -import type { IUserState } from "../user/types"; -import type rootReducer from "./rootReducer"; +import type { IUiState } from "../ui/uiSlice"; +import type { IUserState } from "../user/userSlice"; export interface ApplicationState { ui: IUiState; @@ -22,9 +20,9 @@ export interface ApplicationState { plugin: IPluginState; instance: IPluginInstanceState; resource: IResourceState; - drawerState: IDrawerState; + drawers: IDrawerState; explorer: IExplorerState; cart: ICartState; } -export type RootState = ReturnType; +export type RootState = ApplicationState; diff --git a/src/store/root/constants.ts b/src/store/root/constants.ts deleted file mode 100644 index f7a26e875..000000000 --- a/src/store/root/constants.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * File: constants.ts - * Description: This is where the constant files to hold all global action types - * Author: ChRIS UI - */ - -import keyMirror from "keymirror"; - -export const ActionTypes = keyMirror({ - INIT_STORE: null, -}); diff --git a/src/store/root/rootReducer.ts b/src/store/root/rootReducer.ts deleted file mode 100644 index 0393caf0e..000000000 --- a/src/store/root/rootReducer.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * File: rootReducer.ts - * Description: this is where the Reducers comes together - * Author: ChRIS UI - */ -import { combineReducers } from "redux"; - -import { userReducer } from "../user/reducer"; -import { uiReducer } from "../ui/reducer"; -import { feedsReducer } from "../feed/reducer"; -import { pluginReducer } from "../plugin/reducer"; -import { pluginInstanceReducer } from "../pluginInstance/reducer"; -import { resourceReducer } from "../resources/reducer"; -import { drawerReducer } from "../drawer/reducer"; -import { explorerReducer } from "../explorer/reducer"; -import { cartReducer } from "../cart/reducer"; - -const rootReducer = combineReducers({ - ui: uiReducer, - feed: feedsReducer, - user: userReducer, - plugin: pluginReducer, - explorer: explorerReducer, - instance: pluginInstanceReducer, - resource: resourceReducer, - drawers: drawerReducer, - cart: cartReducer, -}); - -export default rootReducer; diff --git a/src/store/ui/actions.ts b/src/store/ui/actions.ts deleted file mode 100644 index b84738488..000000000 --- a/src/store/ui/actions.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { action } from "typesafe-actions"; -import { UiActionTypes } from "./types"; - -// Toggle menus, sidebar and nav items -export const onDropdownSelect = (isOpened: boolean) => - action(UiActionTypes.TOGGLE_TOOLBAR_DROPDOWN, isOpened); -export const onSidebarToggle = (isOpened: boolean) => - action(UiActionTypes.TOGGLE_SIDEBAR, isOpened); - -// Set active sidebar item and group -export const setIsNavOpen = (isOpened: boolean) => - action(UiActionTypes.TOGGLE_NAV, isOpened); -export const setSidebarActive = (active: { activeItem: string }) => - action(UiActionTypes.SET_SIDEBAR_ACTIVE_ITEM, active); diff --git a/src/store/ui/reducer.ts b/src/store/ui/reducer.ts deleted file mode 100644 index 3b140ee35..000000000 --- a/src/store/ui/reducer.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { produce } from "immer"; -import type { Reducer } from "redux"; -import { UserActionTypes } from "../user/types"; -import { UiActionTypes, type IUiState } from "./types"; - -// Type-safe initialState -const initialState: IUiState = { - loading: false, - progress: 0, - isDropdownOpen: false, - sidebarActiveItem: "overview", - isNavOpen: true, -}; - -const reducer: Reducer = produce( - (draft: IUiState, action) => { - switch (action.type) { - case UiActionTypes.TOGGLE_TOOLBAR_DROPDOWN: { - draft.isDropdownOpen = action.payload; - break; - } - - case UiActionTypes.TOGGLE_NAV: { - draft.isNavOpen = action.payload; - break; - } - - case UiActionTypes.SET_SIDEBAR_ACTIVE_ITEM: { - draft.sidebarActiveItem = action.payload.activeItem; - break; - } - - case UserActionTypes.LOGOUT_USER: { - draft.isDropdownOpen = false; - draft.sidebarActiveItem = "overview"; - break; - } - - default: { - return draft; - } - } - }, - initialState, -); - -export { reducer as uiReducer }; diff --git a/src/store/ui/types.ts b/src/store/ui/types.ts deleted file mode 100644 index a88c6757c..000000000 --- a/src/store/ui/types.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * File: ui/types.ts - * Description: Holds types and constants for managing global UI states - * Author: ChRIS UI - */ - -import keyMirror from "keymirror"; - -// Description: state for UI Manager -export interface IUiState { - loading?: boolean; - progress?: number; - isDropdownOpen?: boolean; - isNavOpen?: boolean; - sidebarActiveItem?: string; -} - -export const UiActionTypes = keyMirror({ - TOGGLE_MOBILE_VIEW: null, - TOGGLE_NAV: null, - TOGGLE_MOBILE_NAV: null, - TOGGLE_TOOLBAR_DROPDOWN: null, - TOGGLE_SIDEBAR: null, - SET_SIDEBAR_ACTIVE_ITEM: null, -}); diff --git a/src/store/ui/uiSlice.ts b/src/store/ui/uiSlice.ts new file mode 100644 index 000000000..7db31f5eb --- /dev/null +++ b/src/store/ui/uiSlice.ts @@ -0,0 +1,46 @@ +import { createSlice, type PayloadAction } from "@reduxjs/toolkit"; + +// Description: state for UI Manager +export interface IUiState { + loading?: boolean; + progress?: number; + isDropdownOpen?: boolean; + isNavOpen?: boolean; + sidebarActiveItem?: string; +} + +const initialState: IUiState = { + loading: false, + progress: 0, + isDropdownOpen: false, + sidebarActiveItem: "overview", + isNavOpen: true, +}; + +const uiSlice = createSlice({ + name: "ui", + initialState, + reducers: { + onSidebarToggle(state, action: PayloadAction) { + state.isDropdownOpen = action.payload; + }, + setIsNavOpen(state, action: PayloadAction) { + state.isNavOpen = action.payload; + }, + setSidebarActive(state, action: PayloadAction<{ activeItem: string }>) { + state.sidebarActiveItem = action.payload.activeItem; + }, + onDropdownSelect(state, action: PayloadAction) { + state.isDropdownOpen = action.payload; + }, + }, +}); + +export const { + onSidebarToggle, + setIsNavOpen, + setSidebarActive, + onDropdownSelect, +} = uiSlice.actions; + +export default uiSlice.reducer; diff --git a/src/store/user/actions.ts b/src/store/user/actions.ts deleted file mode 100644 index b1b0bc3ca..000000000 --- a/src/store/user/actions.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { action } from "typesafe-actions"; -import { UserActionTypes } from "./types"; - -export const setAuthTokenSuccess = (auth: { - token: string; - username: string; - isStaff: boolean; -}) => action(UserActionTypes.SET_TOKEN_SUCCESS, auth); // NOTE: To be done: Save user token to cookie or session -export const setUserLogout = (username: string) => - action(UserActionTypes.LOGOUT_USER, username); - -export const setLogoutSuccess = () => - action(UserActionTypes.SET_LOGOUT_USER_SUCCESS); -export const setAuthError = () => action(UserActionTypes.SET_TOKEN_ERROR); diff --git a/src/store/user/reducer.ts b/src/store/user/reducer.ts deleted file mode 100644 index 276c0823a..000000000 --- a/src/store/user/reducer.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { produce } from "immer"; -import { Cookies } from "react-cookie"; -import type { Reducer } from "redux"; -import { type IUserState, UserActionTypes } from "./types"; - -const cookie = new Cookies(); -const user = cookie.get("username"); -const token = cookie.get(`${user}_token`); -const isStaff = cookie.get("isStaff"); - -// Type-safe initialState -const initialState: IUserState = { - username: user, - token: token, - isRememberMe: false, - isLoggedIn: !!token, - isStaff: !!isStaff, -}; - -const reducer: Reducer = produce( - (draft: IUserState, action) => { - switch (action.type) { - case UserActionTypes.SET_TOKEN_SUCCESS: { - draft.username = action.payload.username; - draft.token = action.payload.token; - draft.isLoggedIn = true; - draft.isStaff = action.payload.isStaff; - break; - } - case UserActionTypes.SET_TOKEN_ERROR: { - draft.username = null; - draft.token = null; - draft.isLoggedIn = false; - draft.isStaff = false; - break; - } - case UserActionTypes.SET_LOGOUT_USER_SUCCESS: { - draft.username = null; - draft.token = null; - draft.isLoggedIn = false; - draft.isStaff = false; - break; - } - default: - return draft; - } - }, - initialState, -); - -export { reducer as userReducer }; diff --git a/src/store/user/types.ts b/src/store/user/types.ts deleted file mode 100644 index 0e57ef249..000000000 --- a/src/store/user/types.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * File: message/types.ts - * Description: Holds types and constants for managing Chris API feed calls - * Author: ChRIS UI - * Notes: Work in progres ... - */ -import keyMirror from "keymirror"; - -// Description state for main user items[] and item -export interface IUserState { - username?: string | null; - password?: string; - email?: string; - token?: string | null; - isRememberMe?: boolean; - isLoggedIn?: boolean; - isStaff?: boolean; -} - -export const UserActionTypes = keyMirror({ - SET_TOKEN: null, // before request - SET_TOKEN_ERROR: null, // request failed - SET_TOKEN_SUCCESS: null, // request is successful - LOGOUT_USER: null, - SET_LOGOUT_USER_SUCCESS: null, - GET_AUTH_TOKEN: null, - GET_AUTH_TOKEN_SUCCESS: null, -}); diff --git a/src/store/user/userSlice.ts b/src/store/user/userSlice.ts new file mode 100644 index 000000000..46429df8b --- /dev/null +++ b/src/store/user/userSlice.ts @@ -0,0 +1,72 @@ +import { createSlice, type PayloadAction } from "@reduxjs/toolkit"; +import { Cookies } from "react-cookie"; + +export interface IUserState { + username?: string | null; + password?: string; + email?: string; + token?: string | null; + isRememberMe?: boolean; + isLoggedIn?: boolean; + isStaff?: boolean; +} + +const cookie = new Cookies(); +const user = cookie.get("username"); +const token = cookie.get(`${user}_token`); +const isStaff = cookie.get("isStaff"); + +const initialState: IUserState = { + username: user, + token: token, + isRememberMe: false, + isLoggedIn: !!token, + isStaff: !!isStaff, +}; + +const userSlice = createSlice({ + name: "user", + initialState, + reducers: { + setAuthTokenSuccess: ( + state, + action: PayloadAction<{ + token: string; + username: string; + isStaff: boolean; + }>, + ) => { + state.username = action.payload.username; + state.token = action.payload.token; + state.isLoggedIn = true; + state.isStaff = action.payload.isStaff; + }, + setUserLogout: (state) => { + state.username = null; + state.token = null; + state.isLoggedIn = false; + state.isStaff = false; + }, + setLogoutSuccess: (state) => { + state.username = null; + state.token = null; + state.isLoggedIn = false; + state.isStaff = false; + }, + setAuthError: (state) => { + state.username = null; + state.token = null; + state.isLoggedIn = false; + state.isStaff = false; + }, + }, +}); + +export const { + setAuthTokenSuccess, + setUserLogout, + setLogoutSuccess, + setAuthError, +} = userSlice.actions; + +export default userSlice.reducer; From 9b1ff2a24c0c8d0cc9580a73d5795acaab0472d3 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Tue, 13 Aug 2024 15:39:59 -0400 Subject: [PATCH 104/337] feat: Minor cleanup --- package-lock.json | 28 ++------ src/components/AddNode/GuidedConfig.tsx | 15 +++-- src/components/AddNode/types/index.ts | 20 +----- src/store/configureStore.ts | 2 +- src/store/hooks.ts | 2 +- src/store/plugin/pluginSlice.ts | 90 ++++++++++++++++--------- src/store/plugin/saga.ts | 70 ------------------- src/store/root/rootSaga.ts | 8 +-- 8 files changed, 75 insertions(+), 160 deletions(-) delete mode 100644 src/store/plugin/saga.ts diff --git a/package-lock.json b/package-lock.json index 442a5f930..a3623b095 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2949,7 +2949,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -3100,7 +3099,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true, "license": "MIT" }, "node_modules/argparse": { @@ -3178,9 +3176,9 @@ } }, "node_modules/axios": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", - "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -3644,7 +3642,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5271,7 +5268,6 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, "license": "ISC" }, "node_modules/hammerjs": { @@ -5302,7 +5298,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5510,7 +5505,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -5520,7 +5514,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5657,7 +5650,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, "license": "MIT" }, "node_modules/is-windows": { @@ -5688,7 +5680,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { @@ -9783,7 +9774,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -10505,9 +10495,9 @@ } }, "node_modules/rc-picker": { - "version": "4.6.12", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.12.tgz", - "integrity": "sha512-wZhBf/L1JV/yCnhuVol42nBpZqxV+Nam1/tnsYm5ZWq0QvMLtX1lQEWceu3FyBESzOPEBIAZixiCnISHcbHsgw==", + "version": "4.6.13", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.13.tgz", + "integrity": "sha512-yi4JWPGjm420Q8rHjZ6YNy2c5IfV+9EAzx2pewVRPOjJqfg7uifO/Z0uqxdl/h6AhBocuvRvtlyz6ehrAvTq7A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", @@ -11569,7 +11559,6 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -11671,7 +11660,6 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, "license": "ISC" }, "node_modules/sirv": { @@ -11944,7 +11932,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -12947,7 +12934,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -13078,7 +13064,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -13091,7 +13076,6 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" diff --git a/src/components/AddNode/GuidedConfig.tsx b/src/components/AddNode/GuidedConfig.tsx index 870a472ce..961ace799 100644 --- a/src/components/AddNode/GuidedConfig.tsx +++ b/src/components/AddNode/GuidedConfig.tsx @@ -27,15 +27,16 @@ import { Tooltip, } from "@patternfly/react-core"; import { useMutation } from "@tanstack/react-query"; -import { Alert, Spin } from "../Antd"; import { isEmpty } from "lodash"; import React, { useContext, useEffect, useState } from "react"; import { useDispatch } from "react-redux"; import { quote } from "shlex"; import { v4 } from "uuid"; import { catchError, fetchResource, needsQuoting } from "../../api/common"; +import type { AppDispatch } from "../../store/configureStore"; import { useTypedSelector } from "../../store/hooks"; -import { getParams } from "../../store/plugin/pluginSlice"; +import { fetchParamsAndComputeEnv } from "../../store/plugin/pluginSlice"; +import { Alert, Spin } from "../Antd"; import { ClipboardCopyFixed, ErrorAlert } from "../Common"; import ComputeEnvironments from "./ComputeEnvironment"; import RequiredParam from "./RequiredParam"; @@ -63,7 +64,7 @@ const advancedConfigList = [ const memory_limit = ["Mi", "Gi"]; const GuidedConfig = () => { - const dispatch = useDispatch(); + const dispatch = useDispatch(); const { state, dispatch: nodeDispatch } = useContext(AddNodeContext); const { parameters: params, resourceError } = useTypedSelector( (state) => state.plugin, @@ -103,11 +104,11 @@ const GuidedConfig = () => { }); // Fetch the parameters for this particular plugin to display as a form. - dispatch(getParams(plugin)); + dispatch(fetchParamsAndComputeEnv(plugin)); } } catch (e) { const error_message = catchError(e).error_message; - dispatch({ + nodeDispatch({ type: Types.SetError, payload: { error: !isEmpty(error_message) @@ -482,7 +483,7 @@ const ItalicsComponent = ({ }; const DropdownBasic = ({ plugins }: { plugins?: Plugin[] }) => { - const dispatch = useDispatch(); + const dispatch = useDispatch(); const [isopen, setIsOpen] = React.useState(false); const { state, dispatch: nodeDispatch } = useContext(AddNodeContext); const { selectedPluginFromMeta } = state; @@ -498,7 +499,7 @@ const DropdownBasic = ({ plugins }: { plugins?: Plugin[] }) => { plugin: selectedPlugin, }, }); - dispatch(getParams(selectedPlugin)); + dispatch(fetchParamsAndComputeEnv(selectedPlugin)); }; const menuItems = diff --git a/src/components/AddNode/types/index.ts b/src/components/AddNode/types/index.ts index 64f9f5045..8077f7b2e 100644 --- a/src/components/AddNode/types/index.ts +++ b/src/components/AddNode/types/index.ts @@ -4,7 +4,7 @@ import type { PluginMeta, PluginParameter, } from "@fnndsc/chrisapi"; -import type { IUserState } from "../../../store/user/types"; +import type { IUserState } from "../../../store/user/userSlice"; export interface InputIndex { [key: string]: string; @@ -53,24 +53,6 @@ export interface PluginMetaSelectState { allPlugins?: PluginMeta[]; } -export interface AddNodeProps { - selectedPlugin?: PluginInstance; - pluginInstances?: { - data?: PluginInstance[]; - error: string; - loading: boolean; - }; - params?: { - dropdown: PluginParameter[]; - required: PluginParameter[]; - }; - addNode: (item: { - pluginItem: PluginInstance; - nodes?: PluginInstance[]; - }) => void; - getParams: (plugin: Plugin) => void; -} - export interface GuidedConfigState { componentList: string[]; count: number; diff --git a/src/store/configureStore.ts b/src/store/configureStore.ts index fc745d0c4..417153e3e 100644 --- a/src/store/configureStore.ts +++ b/src/store/configureStore.ts @@ -38,7 +38,7 @@ function configureAppStore() { }, middleware: (getDefaultMiddleware) => getDefaultMiddleware({ - thunk: false, // Disabling thunk since we're using sagas + thunk: true, // Disabling thunk since we're using sagas serializableCheck: false, // Disable serializable check if necessary }).concat(sagaMiddleware), devTools: import.meta.env.NODE_ENV !== "production", diff --git a/src/store/hooks.ts b/src/store/hooks.ts index bf8419f81..a6e46ab49 100644 --- a/src/store/hooks.ts +++ b/src/store/hooks.ts @@ -1,10 +1,10 @@ import { type TypedUseSelectorHook, useSelector } from "react-redux"; import type { RootState } from "./root/applicationState"; -export const useTypedSelector: TypedUseSelectorHook = useSelector; import type { Feed, FileBrowserFolderFile } from "@fnndsc/chrisapi"; import { useMutation } from "@tanstack/react-query"; import ChrisAPIClient from "../api/chrisapiclient"; import { getFileName } from "../api/common"; +export const useTypedSelector: TypedUseSelectorHook = useSelector; export const createLinkAndDownload = (url: string, fileName: string) => { const link = document.createElement("a"); diff --git a/src/store/plugin/pluginSlice.ts b/src/store/plugin/pluginSlice.ts index a5e536fb6..3675e570b 100644 --- a/src/store/plugin/pluginSlice.ts +++ b/src/store/plugin/pluginSlice.ts @@ -1,6 +1,12 @@ -import { type PayloadAction, createSlice } from "@reduxjs/toolkit"; +import { + createAsyncThunk, + createSlice, + type PayloadAction, +} from "@reduxjs/toolkit"; import type { Plugin, PluginParameter } from "@fnndsc/chrisapi"; +import { fetchResource } from "../../api/common"; +// Define the initial state export interface IPluginState { parameters: { required: PluginParameter[]; @@ -13,7 +19,6 @@ export interface IPluginState { }; } -// Define the initial state const initialState: IPluginState = { parameters: { dropdown: [], @@ -30,33 +35,48 @@ const initialState: IPluginState = { }, }; -// Create a slice +// Create async thunk to replace the saga +export const fetchParamsAndComputeEnv = createAsyncThunk( + "plugin/fetchParamsAndComputeEnv", + async (plugin: Plugin, { rejectWithValue }) => { + try { + const fn = plugin.getPluginParameters; + const boundFn = fn.bind(plugin); + const { resource: params } = await fetchResource( + { limit: 20, offset: 0 }, + boundFn, + ); + + const computeFn = plugin.getPluginComputeResources; + const boundComputeFn = computeFn.bind(plugin); + const { resource: computeEnvs } = await fetchResource( + { limit: 20, offset: 0 }, + boundComputeFn, + ); + + const required = params.filter( + (param: PluginParameter) => param.data.optional === false, + ); + const dropdown = params.filter( + (param: PluginParameter) => param.data.optional === true, + ); + + return { required, dropdown, computeEnvs }; + } catch (error: any) { + let errorMessage = + "Unhandled error. Please reach out to @devbabymri.org to report this error"; + if (error instanceof Error) { + errorMessage = error.message; + } + return rejectWithValue(errorMessage); + } + }, +); + const pluginSlice = createSlice({ name: "plugin", initialState, reducers: { - getParams(_state, _action: PayloadAction) { - // This action might be redundant if parameters are fetched in another way - }, - getParamsSuccess( - state, - action: PayloadAction<{ - required: PluginParameter[]; - dropdown: PluginParameter[]; - }>, - ) { - state.parameters.required = action.payload.required; - state.parameters.dropdown = action.payload.dropdown; - }, - getComputeEnv(_state, _action: PayloadAction) { - // This action might be redundant if computeEnv is fetched in another way - }, - getComputeEnvSuccess(state, action: PayloadAction) { - state.computeEnv = action.payload; - }, - getComputeEnvError(state, action: PayloadAction) { - state.resourceError = action.payload; - }, getNodeOperations(state, action: PayloadAction) { const key = action.payload; if (key in state.nodeOperations) { @@ -64,17 +84,21 @@ const pluginSlice = createSlice({ } }, }, + extraReducers: (builder) => { + builder + .addCase(fetchParamsAndComputeEnv.fulfilled, (state, action) => { + state.parameters.required = action.payload.required; + state.parameters.dropdown = action.payload.dropdown; + state.computeEnv = action.payload.computeEnvs; + }) + .addCase(fetchParamsAndComputeEnv.rejected, (state, action) => { + state.resourceError = action.payload as string; + }); + }, }); // Export the actions -export const { - getParams, - getParamsSuccess, - getComputeEnv, - getComputeEnvSuccess, - getComputeEnvError, - getNodeOperations, -} = pluginSlice.actions; +export const { getNodeOperations } = pluginSlice.actions; // Export the reducer export default pluginSlice.reducer; diff --git a/src/store/plugin/saga.ts b/src/store/plugin/saga.ts deleted file mode 100644 index bd5031676..000000000 --- a/src/store/plugin/saga.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { all, fork, put, takeEvery } from "redux-saga/effects"; -import type { IActionTypeParam } from "../../api/model"; -import type { PluginParameter } from "@fnndsc/chrisapi"; -import { fetchResource } from "../../api/common"; -import { - getComputeEnvError, - getComputeEnvSuccess, - getParamsSuccess, -} from "./pluginSlice"; -import { getParams } from "./pluginSlice"; - -// ------------------------------------------------------------------------ -// Description: Get Plugin Descendants, files and parameters on change -// ------------------------------------------------------------------------ - -function* handleGetParams(action: IActionTypeParam) { - // Todo: Seperate these fetch resources into seperate sagas - try { - const plugin = action.payload; - const fn = plugin.getPluginParameters; - const boundFn = fn.bind(plugin); - const { resource: params } = yield fetchResource( - { limit: 20, offset: 0 }, - boundFn, - ); - const computeFn = plugin.getPluginComputeResources; - const boundComputeFn = computeFn.bind(plugin); - const { resource: computeEnvs } = yield fetchResource( - { limit: 20, offset: 0 }, - boundComputeFn, - ); - - const required = params.filter( - (param: PluginParameter) => param.data.optional === false, - ); - const dropdown = params.filter( - (param: PluginParameter) => param.data.optional === true, - ); - - yield all([ - put( - getParamsSuccess({ - required, - dropdown, - }), - ), - put(getComputeEnvSuccess(computeEnvs)), - ]); - } catch (error: any) { - let errorMessage = - "Unhandled error. Please reach out to @devbabymri.org to report this error"; - if (error instanceof Error) { - errorMessage = error.message; - } - yield put(getComputeEnvError(errorMessage)); - } -} -function* watchGetParams() { - yield takeEvery(getParams.type, handleGetParams); -} - -// ------------------------------------------------------------------------ -// Description: Get Plugin Details: Parameters, files and others - -// ------------------------------------------------------------------------ -// We can also use `fork()` here to split our saga into multiple watchers. -// ------------------------------------------------------------------------ -export function* pluginSaga() { - yield all([fork(watchGetParams)]); -} diff --git a/src/store/root/rootSaga.ts b/src/store/root/rootSaga.ts index 4307b60e0..5e22a778d 100644 --- a/src/store/root/rootSaga.ts +++ b/src/store/root/rootSaga.ts @@ -8,16 +8,10 @@ import { all, fork } from "redux-saga/effects"; /// ADD ALL Local Sagas: -import { pluginSaga } from "../plugin/saga"; import { pluginInstanceSaga } from "../pluginInstance/saga"; import { resourceSaga } from "../resources/saga"; import { cartSaga } from "../cart/saga"; export function* rootSaga() { - yield all([ - fork(pluginSaga), - fork(pluginInstanceSaga), - fork(resourceSaga), - fork(cartSaga), - ]); + yield all([fork(pluginInstanceSaga), fork(resourceSaga), fork(cartSaga)]); } From e6af10c07bd554383771fe4e9a0905724438e029 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Tue, 13 Aug 2024 15:51:09 -0400 Subject: [PATCH 105/337] fix: Fix regression caused by the redux update --- src/components/FeedDetails/index.tsx | 56 +++++++++++++++++++++------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/src/components/FeedDetails/index.tsx b/src/components/FeedDetails/index.tsx index 5a61f5fb0..fc7f5cee2 100644 --- a/src/components/FeedDetails/index.tsx +++ b/src/components/FeedDetails/index.tsx @@ -25,14 +25,12 @@ const FeedDetails = () => { const dispatch = useDispatch(); const drawerState = useTypedSelector((state) => state.drawers); - const node = drawerState.node.currentlyActive === "node" ? true : false; - const note = drawerState.node.currentlyActive === "note" ? true : false; + const node = drawerState.node.currentlyActive === "node"; + const note = drawerState.node.currentlyActive === "note"; const [showNoteBadge, setShowNoteBadge] = useState(false); - const terminal = - drawerState.node.currentlyActive === "terminal" ? true : false; + const terminal = drawerState.node.currentlyActive === "terminal"; - const preview = - drawerState.preview.currentlyActive === "preview" ? true : false; + const preview = drawerState.preview.currentlyActive === "preview"; React.useEffect(() => { fetchNote(currentFeed).then((feedNote) => { @@ -116,9 +114,19 @@ const FeedDetails = () => { content={!node && terminal ? "Configuration Panel" : "Terminal"} onClick={() => { if (terminal) { - dispatch(setDrawerCurrentlyActive("node", "node")); + dispatch( + setDrawerCurrentlyActive({ + panel: "node", + currentlyActive: "node", + }), + ); } else { - dispatch(setDrawerCurrentlyActive("node", "terminal")); + dispatch( + setDrawerCurrentlyActive({ + panel: "node", + currentlyActive: "terminal", + }), + ); } }} Icon={ @@ -131,16 +139,26 @@ const FeedDetails = () => { + { if (note) { - dispatch(setDrawerCurrentlyActive("node", "node")); + dispatch( + setDrawerCurrentlyActive({ + panel: "node", + currentlyActive: "node", + }), + ); } else { - dispatch(setDrawerCurrentlyActive("node", "note")); + dispatch( + setDrawerCurrentlyActive({ + panel: "node", + currentlyActive: "note", + }), + ); } }} Icon={ @@ -166,9 +184,19 @@ const FeedDetails = () => { content={preview ? "Visualization Panel" : "Preview Panel"} onClick={() => { if (preview) { - dispatch(setDrawerCurrentlyActive("preview", "xtk")); + dispatch( + setDrawerCurrentlyActive({ + panel: "preview", + currentlyActive: "xtk", + }), + ); } else { - dispatch(setDrawerCurrentlyActive("preview", "preview")); + dispatch( + setDrawerCurrentlyActive({ + panel: "preview", + currentlyActive: "preview", + }), + ); } }} Icon={preview ? : } @@ -215,7 +243,7 @@ export const ButtonContainer = ({ drawerState, isDisabled, }: { - action: string; + action: keyof IDrawerState; dispatch: any; Icon: React.ReactNode; title: string; From c45e989cea95e11fe6c5a088355d12ca11e0d658 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 14 Aug 2024 09:30:10 -0400 Subject: [PATCH 106/337] feat: Update loading state in the feed table --- src/components/Feeds/FeedListView.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 2609b4d6e..85e4f2576 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -547,14 +547,9 @@ function LoadingTable() { {Array.from({ length: 15 }).map((_, index) => ( - - + + - {COLUMN_ORDER.map(({ id }) => ( - - - - ))} ))} From f0410f95a93ac85e117428fba1ada7adf6055661 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 14 Aug 2024 12:11:36 -0400 Subject: [PATCH 107/337] refactor: Update components to use redux toolkit --- package-lock.json | 60 +++++-- package.json | 2 +- src/components/AddNode/AddNode.tsx | 12 +- src/components/AddPipeline/AddPipeline.tsx | 10 +- src/components/DeleteNode/index.tsx | 6 +- src/components/FeedTree/Node.tsx | 10 +- src/components/Feeds/FeedView.tsx | 127 +++++++-------- src/components/NodeDetails/PluginLog.tsx | 2 +- src/store/configureStore.ts | 3 +- src/store/drawer/drawerSlice.ts | 11 +- .../pluginInstance/pluginInstanceSlice.ts | 150 +++++++++++++----- src/store/pluginInstance/saga.ts | 76 --------- src/store/pluginInstance/types.ts | 5 +- src/store/resources/resourceSlice.ts | 9 +- src/store/resources/saga.ts | 1 - src/store/resources/types.ts | 2 +- src/store/root/rootSaga.ts | 3 +- 17 files changed, 246 insertions(+), 243 deletions(-) delete mode 100644 src/store/pluginInstance/saga.ts diff --git a/package-lock.json b/package-lock.json index a3623b095..74876b97d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "@patternfly/react-log-viewer": "^5.2.0", "@patternfly/react-table": "^5.3.4", "@react-hook/resize-observer": "^2.0.1", + "@redux-devtools/extension": "^3.3.0", "@reduxjs/toolkit": "^2.2.7", "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", @@ -90,7 +91,6 @@ "lefthook": "^1.6.1", "nyc": "^17.0.0", "playwright": "^1.45.1", - "redux-devtools-extension": "^2.13.9", "redux-logger": "^3.0.6", "rollup-plugin-node-builtins": "^2.0.0", "vite": "^5.3.3", @@ -1894,6 +1894,37 @@ "react": ">=18" } }, + "node_modules/@redux-devtools/extension": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@redux-devtools/extension/-/extension-3.3.0.tgz", + "integrity": "sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "immutable": "^4.3.4" + }, + "peerDependencies": { + "redux": "^3.1.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/@redux-devtools/extension/node_modules/@babel/runtime": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@redux-devtools/extension/node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "license": "MIT" + }, "node_modules/@redux-saga/core": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.3.0.tgz", @@ -2949,6 +2980,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -3099,6 +3131,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, "license": "MIT" }, "node_modules/argparse": { @@ -3642,6 +3675,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5268,6 +5302,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/hammerjs": { @@ -5298,6 +5333,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5505,6 +5541,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -5514,6 +5551,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5650,6 +5688,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, "license": "MIT" }, "node_modules/is-windows": { @@ -5680,6 +5719,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { @@ -9774,6 +9814,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -11230,17 +11271,6 @@ "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "license": "MIT" }, - "node_modules/redux-devtools-extension": { - "version": "2.13.9", - "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz", - "integrity": "sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A==", - "deprecated": "Package moved to @redux-devtools/extension.", - "dev": true, - "license": "MIT", - "peerDependencies": { - "redux": "^3.1.0 || ^4.0.0" - } - }, "node_modules/redux-logger": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", @@ -11559,6 +11589,7 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -11660,6 +11691,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, "license": "ISC" }, "node_modules/sirv": { @@ -11932,6 +11964,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -12934,6 +12967,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -13064,6 +13098,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -13076,6 +13111,7 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" diff --git a/package.json b/package.json index a6dc357d4..4eb923dcb 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@patternfly/react-log-viewer": "^5.2.0", "@patternfly/react-table": "^5.3.4", "@react-hook/resize-observer": "^2.0.1", + "@redux-devtools/extension": "^3.3.0", "@reduxjs/toolkit": "^2.2.7", "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", @@ -106,7 +107,6 @@ "lefthook": "^1.6.1", "nyc": "^17.0.0", "playwright": "^1.45.1", - "redux-devtools-extension": "^2.13.9", "redux-logger": "^3.0.6", "rollup-plugin-node-builtins": "^2.0.0", "vite": "^5.3.3", diff --git a/src/components/AddNode/AddNode.tsx b/src/components/AddNode/AddNode.tsx index 6b21a4b9c..8bc9aca6b 100644 --- a/src/components/AddNode/AddNode.tsx +++ b/src/components/AddNode/AddNode.tsx @@ -7,30 +7,30 @@ import { } from "@patternfly/react-core"; import type React from "react"; import { useCallback, useContext } from "react"; -import { useDispatch, useSelector } from "react-redux"; +import { useDispatch } from "react-redux"; import { catchError } from "../../api/common"; import { useTypedSelector } from "../../store/hooks"; import { getNodeOperations } from "../../store/plugin/pluginSlice"; -import { addNodeRequest } from "../../store/pluginInstance/pluginInstanceSlice"; +import { addNode } from "../../store/pluginInstance/pluginInstanceSlice"; import type { ApplicationState } from "../../store/root/applicationState"; import { Alert } from "../Antd"; import { getRequiredObject } from "../CreateFeed/createFeedHelper"; import BasicConfiguration from "./BasicConfiguration"; import GuidedConfig from "./GuidedConfig"; import "./add-node.css"; +import type { AppDispatch } from "../../store/configureStore"; import { AddNodeContext } from "./context"; import { Types } from "./types"; const AddNode: React.FC = () => { - const dispatch = useDispatch(); - const { childNode } = useSelector( + const dispatch = useDispatch(); + const { childNode } = useTypedSelector( (state: ApplicationState) => state.plugin.nodeOperations, ); const { pluginInstances, selectedPlugin } = useTypedSelector( (state) => state.instance, ); const params = useTypedSelector((state) => state.plugin.parameters); - const { state, dispatch: nodeDispatch } = useContext(AddNodeContext); const { pluginMeta, @@ -104,7 +104,7 @@ const AddNode: React.FC = () => { await pluginInstance.post(parameterInput); const nodeList = pluginInstance.getItems(); if (nodeList) { - dispatch(addNodeRequest({ pluginItem: nodeList[0], nodes })); + dispatch(addNode({ pluginItem: nodeList[0], nodes })); toggleOpen(); } } catch (error: any) { diff --git a/src/components/AddPipeline/AddPipeline.tsx b/src/components/AddPipeline/AddPipeline.tsx index e7187b7fc..98af04a58 100644 --- a/src/components/AddPipeline/AddPipeline.tsx +++ b/src/components/AddPipeline/AddPipeline.tsx @@ -1,15 +1,15 @@ import type { PluginInstance } from "@fnndsc/chrisapi"; import { Button, Modal, ModalVariant } from "@patternfly/react-core"; import { useMutation } from "@tanstack/react-query"; -import React, { useContext, Fragment } from "react"; +import React, { Fragment, useContext } from "react"; import { useDispatch } from "react-redux"; import ChrisAPIClient from "../../api/chrisapiclient"; import { fetchResource } from "../../api/common"; import { useTypedSelector } from "../../store/hooks"; import { getNodeOperations } from "../../store/plugin/pluginSlice"; import { - getPluginInstancesSuccess, getSelectedPlugin, + setPluginInstancesAndSelectedPlugin, } from "../../store/pluginInstance/pluginInstanceSlice"; import { getPluginInstanceStatusRequest } from "../../store/resources/resourceSlice"; import { Alert, Form, Tag } from "../Antd"; @@ -89,13 +89,11 @@ const AddPipeline = () => { selected: firstInstance, pluginInstances: completeList, }; - reactDispatch(getPluginInstancesSuccess(pluginInstanceObj)); + reactDispatch(setPluginInstancesAndSelectedPlugin(pluginInstanceObj)); reactDispatch(getPluginInstanceStatusRequest(pluginInstanceObj)); } - - // biome-ignore lint/suspicious/noExplicitAny: } catch (e: any) { - throw new Error(e.message ? e.message : e); + if (e instanceof Error) throw new Error(e.message); } } }; diff --git a/src/components/DeleteNode/index.tsx b/src/components/DeleteNode/index.tsx index fb5bbcf86..343d88f7e 100644 --- a/src/components/DeleteNode/index.tsx +++ b/src/components/DeleteNode/index.tsx @@ -7,7 +7,7 @@ import { fetchResource } from "../../api/common"; import { useTypedSelector } from "../../store/hooks"; import { getNodeOperations } from "../../store/plugin/pluginSlice"; import { - getPluginInstancesSuccess, + setPluginInstancesAndSelectedPlugin, getSelectedPlugin, } from "../../store/pluginInstance/pluginInstanceSlice"; import { getPluginInstanceStatusRequest } from "../../store/resources/resourceSlice"; @@ -55,11 +55,11 @@ const DeleteNode = () => { }; dispatch(getSelectedPlugin(selected)); - dispatch(getPluginInstancesSuccess(pluginInstanceObj)); + dispatch(setPluginInstancesAndSelectedPlugin(pluginInstanceObj)); dispatch(getPluginInstanceStatusRequest(pluginInstanceObj)); } } catch (e) { - throw e; + if (e instanceof Error) throw new Error(e.message); } } else { throw new Error("Please select a node to delete"); diff --git a/src/components/FeedTree/Node.tsx b/src/components/FeedTree/Node.tsx index 12ae95372..3fd0f3741 100644 --- a/src/components/FeedTree/Node.tsx +++ b/src/components/FeedTree/Node.tsx @@ -8,9 +8,8 @@ import { useDispatch } from "react-redux"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useTypedSelector } from "../../store/hooks"; import { - getPluginInstancesSuccess, - getSelectedD3Node, getSelectedPlugin, + setPluginInstancesAndSelectedPlugin, } from "../../store/pluginInstance/pluginInstanceSlice"; import { getPluginInstanceStatusRequest } from "../../store/resources/resourceSlice"; import AddNodeConnect from "../AddNode/AddNode"; @@ -183,7 +182,7 @@ const Node = (props: NodeProps) => { pluginInstances: completeList, }; - dispatch(getPluginInstancesSuccess(pluginInstanceObj)); + dispatch(setPluginInstancesAndSelectedPlugin(pluginInstanceObj)); dispatch(getPluginInstanceStatusRequest(pluginInstanceObj)); } } else { @@ -293,7 +292,6 @@ const Node = (props: NodeProps) => { const NodeMemoed = memo(Node); const NodeWrapper = (props: NodeWrapperProps) => { - const dispatch = useDispatch(); const { data, overlayScale } = props; const status = useTypedSelector((state) => { if (data.id && state.resource.pluginInstanceStatus[data.id]) { @@ -306,10 +304,6 @@ const NodeWrapper = (props: NodeWrapperProps) => { return false; }); - useEffect(() => { - if (currentId) dispatch(getSelectedD3Node(data)); - }, [currentId, data, dispatch]); - let scale: number | undefined; // undefined scale is treated as no indvidual scaling if (overlayScale === "time") { const instanceData = props.data.item?.data; diff --git a/src/components/Feeds/FeedView.tsx b/src/components/Feeds/FeedView.tsx index 12f2e6763..0ff8bc500 100644 --- a/src/components/Feeds/FeedView.tsx +++ b/src/components/Feeds/FeedView.tsx @@ -6,9 +6,12 @@ import { DrawerPanelContent, } from "@patternfly/react-core"; import { useQuery } from "@tanstack/react-query"; -import React from "react"; +import React, { useCallback, useEffect, useRef } from "react"; import { useDispatch } from "react-redux"; import { useLocation, useNavigate, useParams } from "react-router"; +import type { AppDispatch } from "../../store/configureStore"; +import type { IDrawerState } from "../../store/drawer/drawerSlice"; +import { resetDrawerState } from "../../store/drawer/drawerSlice"; import { clearSelectedFile } from "../../store/explorer/explorerSlice"; import { getFeedSuccess, @@ -17,8 +20,7 @@ import { } from "../../store/feed/feedSlice"; import { useTypedSelector } from "../../store/hooks"; import { - getPluginInstancesRequest, - getSelectedD3Node, + fetchPluginInstances, getSelectedPlugin, resetPluginInstances, } from "../../store/pluginInstance/pluginInstanceSlice"; @@ -40,31 +42,25 @@ import { handleMinimize, } from "./utilties"; -export default function FeedView() { +const FeedView: React.FC = () => { + const drawerState = useTypedSelector((state) => state.drawers); + const { currentLayout } = useTypedSelector((state) => state.feed); + const dispatch = useDispatch(); const query = useSearchQueryParams(); const type = query.get("type"); - const params = useParams(); - const dispatch = useDispatch(); const navigate = useNavigate(); const location = useLocation(); const [api, contextHolder] = notification.useNotification(); const { id } = params; - const selectedPlugin = useTypedSelector( - (state) => state.instance.selectedPlugin, - ); - const isLoggedIn = useTypedSelector((state) => state.user.isLoggedIn); - const { currentLayout } = useTypedSelector((state) => state.feed); - const pluginInstances = useTypedSelector( - (state) => state.instance.pluginInstances, + const { selectedPlugin, pluginInstances } = useTypedSelector( + (state) => state.instance, ); - const dataRef = React.useRef(); - const { data } = pluginInstances; - const drawerState = useTypedSelector((state) => state.drawers); + const dataRef = useRef(); dataRef.current = { - data, + data: pluginInstances.data, selectedPlugin, }; @@ -84,88 +80,81 @@ export default function FeedView() { enabled: type === "private" && isLoggedIn, }); - React.useEffect(() => { + useEffect(() => { if (!type || (type === "private" && !isLoggedIn)) { const redirectTo = encodeURIComponent( `${location.pathname}${location.search}`, ); navigate(`/login?redirectTo=${redirectTo}`); } - }, [type, navigate, isLoggedIn]); + }, [type, isLoggedIn, location, navigate]); - React.useEffect(() => { + useEffect(() => { if (isPrivateFeedError) { - // cube does not return a 404 error when the user fetches a - // feed with an incorrect token api.error({ message: privateFeedError.message, duration: 1.5, }); - - setTimeout(() => { + const timer = setTimeout(() => { navigate("/feeds?type=private"); }, 2500); + return () => clearTimeout(timer); } - }, [isPrivateFeedError]); + }, [isPrivateFeedError, privateFeedError, api, navigate]); - React.useEffect(() => { + useEffect(() => { const feed: Feed | undefined = privateFeed || publicFeed; if (feed) { dispatch(getFeedSuccess(feed as Feed)); - dispatch(getPluginInstancesRequest(feed)); + dispatch(fetchPluginInstances(feed)); } }, [privateFeed, publicFeed, dispatch]); - React.useEffect(() => { + useEffect(() => { + document.title = "My Analyses - CHRIS UI"; + dispatch(setSidebarActive({ activeItem: "analyses" })); + dispatch(setShowToolbar(true)); + return () => { + console.log("Unmount called"); if (dataRef.current?.selectedPlugin && dataRef.current.data) { dispatch(resetActiveResources(dataRef.current)); } - dispatch(resetFeed()); dispatch(resetPluginInstances()); + dispatch(resetFeed()); dispatch(clearSelectedFile()); + dispatch(resetDrawerState()); dispatch(setShowToolbar(false)); }; }, [dispatch]); - React.useEffect(() => { - dispatch(setShowToolbar(true)); - }, [dispatch]); - - React.useEffect(() => { - document.title = "My Analyses - ChRIS UI site"; - dispatch( - setSidebarActive({ - activeItem: "analyses", - }), - ); - }, [dispatch]); - - const onNodeClick = (node: any) => { - dispatch(clearSelectedFile()); - dispatch(getSelectedPlugin(node.item)); - dispatch(getSelectedD3Node(node)); - }; + const onNodeClick = useCallback( + (node: any) => { + dispatch(clearSelectedFile()); + dispatch(getSelectedPlugin(node.item)); + }, + [dispatch], + ); - const onNodeBrowserClick = (node: PluginInstance) => { - dispatch(clearSelectedFile()); - dispatch(getSelectedPlugin(node)); - }; + const onNodeBrowserClick = useCallback( + (node: PluginInstance) => { + dispatch(clearSelectedFile()); + dispatch(getSelectedPlugin(node)); + }, + [dispatch], + ); - const handleDrawerAction = (mode: string) => { - return ( + const handleDrawerAction = useCallback( + (mode: keyof IDrawerState) => ( { - handleMaximize(mode, dispatch); - }} - handleMinimize={() => { - handleMinimize(mode, dispatch); - }} + handleMaximize={() => handleMaximize(mode, dispatch)} + handleMinimize={() => handleMinimize(mode, dispatch)} maximized={drawerState[mode].maximized} /> - ); - }; + ), + [drawerState, dispatch], + ); const feedTreeAndGraph = ( @@ -182,17 +171,7 @@ export default function FeedView() { } > - { - handleMaximize("graph", dispatch); - }} - handleMinimize={() => { - handleMinimize("graph", dispatch); - }} - maximized={drawerState.graph.maximized} - /> - + {handleDrawerAction("graph")} {!currentLayout ? ( @@ -234,4 +213,6 @@ export default function FeedView() { ); -} +}; + +export default React.memo(FeedView); diff --git a/src/components/NodeDetails/PluginLog.tsx b/src/components/NodeDetails/PluginLog.tsx index 6f94ce847..0ebd5a61e 100644 --- a/src/components/NodeDetails/PluginLog.tsx +++ b/src/components/NodeDetails/PluginLog.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { NodeDetailsProps } from "../../store/resources/types"; +import type { NodeDetailsProps } from "../../store/resources/types"; import LogTerminal from "./LogTerminal"; import { isEmpty } from "lodash"; diff --git a/src/store/configureStore.ts b/src/store/configureStore.ts index 417153e3e..6a9061728 100644 --- a/src/store/configureStore.ts +++ b/src/store/configureStore.ts @@ -5,6 +5,7 @@ * Author: ChRIS UI */ import { configureStore } from "@reduxjs/toolkit"; +import logger from "redux-logger"; import createSagaMiddleware from "redux-saga"; import cartReducer from "./cart/cartSlice"; import drawerReducer from "./drawer/drawerSlice"; @@ -40,7 +41,7 @@ function configureAppStore() { getDefaultMiddleware({ thunk: true, // Disabling thunk since we're using sagas serializableCheck: false, // Disable serializable check if necessary - }).concat(sagaMiddleware), + }).concat(logger, sagaMiddleware), devTools: import.meta.env.NODE_ENV !== "production", }); diff --git a/src/store/drawer/drawerSlice.ts b/src/store/drawer/drawerSlice.ts index a38991b59..bbf51e9fe 100644 --- a/src/store/drawer/drawerSlice.ts +++ b/src/store/drawer/drawerSlice.ts @@ -84,11 +84,18 @@ const drawerSlice = createSlice({ const { panel, currentlyActive } = action.payload; state[panel].currentlyActive = currentlyActive; }, + resetDrawerState: () => { + return initialState; + }, }, }); -export const { setDrawerState, setFilePreviewPanel, setDrawerCurrentlyActive } = - drawerSlice.actions; +export const { + setDrawerState, + setFilePreviewPanel, + setDrawerCurrentlyActive, + resetDrawerState, +} = drawerSlice.actions; export default drawerSlice.reducer; export const getMaximizedObject = ( diff --git a/src/store/pluginInstance/pluginInstanceSlice.ts b/src/store/pluginInstance/pluginInstanceSlice.ts index 85973b495..9e5998cf0 100644 --- a/src/store/pluginInstance/pluginInstanceSlice.ts +++ b/src/store/pluginInstance/pluginInstanceSlice.ts @@ -1,22 +1,80 @@ -import { createSlice, type PayloadAction } from "@reduxjs/toolkit"; +import { + createSlice, + createAsyncThunk, + type PayloadAction, +} from "@reduxjs/toolkit"; +import type { Feed, PluginInstance } from "@fnndsc/chrisapi"; +import { catchError, fetchResource } from "../../api/common"; import type { IPluginInstanceState, AddNodePayload, PluginInstanceObj, } from "./types"; -import type { Feed, PluginInstance } from "@fnndsc/chrisapi"; +import { getPluginInstanceStatusRequest } from "../resources/resourceSlice"; // Define the initial state const initialState: IPluginInstanceState = { selectedPlugin: undefined, pluginInstances: { - data: undefined, + data: [], error: "", loading: false, }, - selectedD3Node: undefined, }; +// Async thunk for fetching plugin instances +export const fetchPluginInstances = createAsyncThunk< + PluginInstanceObj, + Feed, + { rejectValue: string } +>( + "pluginInstance/fetchPluginInstances", + async (feed, { dispatch, rejectWithValue }) => { + try { + const params = { limit: 15, offset: 0 }; + const fn = feed.getPluginInstances; + const boundFn = fn.bind(feed); + + //fetch resource is a utility to fetch paginate resources + const { resource: pluginInstances } = await fetchResource( + params, + boundFn, + ); + + const selected = pluginInstances[pluginInstances.length - 1]; + const pluginInstanceObj = { + selected, + pluginInstances, + }; + //This action triggers a resource fetch in the resource saga + dispatch(getSelectedPlugin(selected)); + dispatch(getPluginInstanceStatusRequest(pluginInstanceObj)); + return { selected, pluginInstances }; + } catch (error) { + const errMessage = catchError(error).error_message; + return rejectWithValue(errMessage); + } + }, +); + +// Async thunk for adding a node +export const addNode = createAsyncThunk< + PluginInstanceObj, + AddNodePayload, + { rejectValue: string } +>( + "pluginInstance/addNode", + async ({ pluginItem, nodes }, { dispatch, rejectWithValue }) => { + try { + const pluginInstances = [...nodes, pluginItem]; + dispatch(getSelectedPlugin(pluginItem)); + return { selected: pluginItem, pluginInstances }; + } catch (error) { + return rejectWithValue("Failed to add node."); + } + }, +); + // Create a slice const pluginInstanceSlice = createSlice({ name: "pluginInstance", @@ -25,37 +83,7 @@ const pluginInstanceSlice = createSlice({ getSelectedPlugin(state, action: PayloadAction) { state.selectedPlugin = action.payload; }, - getSelectedD3Node(state, action: PayloadAction) { - state.selectedD3Node = action.payload; - }, - getPluginInstancesRequest(state, _action: PayloadAction) { - state.pluginInstances.loading = true; - }, - getPluginInstancesSuccess(state, action: PayloadAction) { - state.selectedPlugin = action.payload.selected; - state.pluginInstances = { - data: action.payload.pluginInstances, - error: "", - loading: false, - }; - }, - getPluginInstancesError(state, action: PayloadAction) { - state.pluginInstances = { - data: undefined, - error: action.payload, - loading: false, - }; - }, - addNodeRequest(_state, _action: PayloadAction) { - // This action might be redundant if node adding is handled in saga - }, - addNodeSuccess(state, action: PayloadAction) { - if (state.pluginInstances.data) { - state.pluginInstances.data.push(action.payload); - } else { - state.pluginInstances.data = [action.payload]; - } - }, + setPluginTitle(state, action: PayloadAction) { if (state.pluginInstances.data) { const foundIndex = state.pluginInstances.data.findIndex( @@ -67,23 +95,63 @@ const pluginInstanceSlice = createSlice({ } } }, + setPluginInstancesAndSelectedPlugin( + state, + action: PayloadAction<{ + selected: PluginInstance; + pluginInstances: PluginInstance[]; + }>, + ) { + state.selectedPlugin = action.payload.selected; + state.pluginInstances.data = action.payload.pluginInstances; + }, resetPluginInstances(_state) { return initialState; }, }, + extraReducers: (builder) => { + builder + .addCase(fetchPluginInstances.pending, (state) => { + state.pluginInstances.loading = true; + state.pluginInstances.error = ""; + }) + .addCase( + fetchPluginInstances.fulfilled, + (state, action: PayloadAction) => { + state.pluginInstances = { + data: action.payload.pluginInstances, + error: "", + loading: false, + }; + }, + ) + .addCase(fetchPluginInstances.rejected, (state, action) => { + state.pluginInstances = { + data: [], + error: action.payload || "Failed to fetch plugin instances.", + loading: false, + }; + }) + + .addCase( + addNode.fulfilled, + (state, action: PayloadAction) => { + if (state.pluginInstances.data) { + state.pluginInstances.data.push(action.payload.selected); + } else { + state.pluginInstances.data = [action.payload.selected]; + } + }, + ); + }, }); // Export the actions export const { getSelectedPlugin, - getSelectedD3Node, - getPluginInstancesRequest, - getPluginInstancesSuccess, - getPluginInstancesError, - addNodeRequest, - addNodeSuccess, setPluginTitle, resetPluginInstances, + setPluginInstancesAndSelectedPlugin, } = pluginInstanceSlice.actions; // Export the reducer diff --git a/src/store/pluginInstance/saga.ts b/src/store/pluginInstance/saga.ts deleted file mode 100644 index 533a3fb11..000000000 --- a/src/store/pluginInstance/saga.ts +++ /dev/null @@ -1,76 +0,0 @@ -import type { Feed, PluginInstance } from "@fnndsc/chrisapi"; -import { all, fork, put, takeEvery } from "@redux-saga/core/effects"; -import { catchError, fetchResource } from "../../api/common"; -import type { IActionTypeParam } from "../../api/model"; -import { getPluginInstanceStatusRequest } from "../resources/resourceSlice"; -import { - addNodeRequest, - addNodeSuccess, - getPluginInstancesError, - getPluginInstancesRequest, - getPluginInstancesSuccess, - getSelectedPlugin, -} from "./pluginInstanceSlice"; - -function* setPluginInstances(feed: Feed) { - try { - const params = { limit: 15, offset: 0 }; - const fn = feed.getPluginInstances; - const boundFn = fn.bind(feed); - const { resource: pluginInstances } = yield fetchResource( - params, - boundFn, - ); - - const selected = pluginInstances[pluginInstances.length - 1]; - const pluginInstanceObj = { - selected, - pluginInstances, - }; - - yield all([ - put(getSelectedPlugin(selected)), - put(getPluginInstancesSuccess(pluginInstanceObj)), - put(getPluginInstanceStatusRequest(pluginInstanceObj)), - ]); - } catch (error: any) { - const errObj = catchError(error).error_message; - yield put(getPluginInstancesError(errObj)); - } -} - -function* handleGetPluginInstances(action: IActionTypeParam) { - const feed: Feed = action.payload; - yield setPluginInstances(feed); -} - -function* handleAddNode(action: IActionTypeParam) { - const item: PluginInstance = action.payload.pluginItem; - const pluginInstances: PluginInstance[] = [...action.payload.nodes, item]; - - try { - yield all([ - put(addNodeSuccess(item)), - put(getSelectedPlugin(item)), - put(getPluginInstanceStatusRequest({ selected: item, pluginInstances })), - ]); - } catch (err) { - console.error(err); - } -} - -// ------------------------------------------------------------------------ -// Description: Delete a node -// ------------------------------------------------------------------------ - -function* watchGetPluginInstanceRequest() { - yield takeEvery(getPluginInstancesRequest.type, handleGetPluginInstances); -} - -function* watchAddNode() { - yield takeEvery(addNodeRequest.type, handleAddNode); -} - -export function* pluginInstanceSaga() { - yield all([fork(watchGetPluginInstanceRequest), fork(watchAddNode)]); -} diff --git a/src/store/pluginInstance/types.ts b/src/store/pluginInstance/types.ts index 170a76a73..60a79b64f 100644 --- a/src/store/pluginInstance/types.ts +++ b/src/store/pluginInstance/types.ts @@ -13,14 +13,14 @@ export interface PluginInstanceObj { } export interface PluginInstancePayload { - data?: PluginInstance[]; + data: PluginInstance[]; error: string; loading: boolean; } export interface AddNodePayload { pluginItem: PluginInstance; - nodes?: PluginInstance[]; + nodes: PluginInstance[]; } export interface SplitNodesPayload { @@ -32,5 +32,4 @@ export interface SplitNodesPayload { export interface IPluginInstanceState { pluginInstances: PluginInstancePayload; selectedPlugin?: PluginInstance; - selectedD3Node?: any; } diff --git a/src/store/resources/resourceSlice.ts b/src/store/resources/resourceSlice.ts index 1af98709e..db231ed2c 100644 --- a/src/store/resources/resourceSlice.ts +++ b/src/store/resources/resourceSlice.ts @@ -15,7 +15,7 @@ const initialState: IResourceState = { pluginInstanceStatus: {}, pluginInstanceResource: {}, pluginFiles: {}, - url: "", + loading: false, }; @@ -47,8 +47,9 @@ const resourceSlice = createSlice({ }, getPluginInstanceStatusRequest( _state, - _action: PayloadAction, + action: PayloadAction, ) { + console.log("DIspatch Called", action); // No state mutation needed for this action }, getPluginInstanceStatusSuccess( @@ -104,9 +105,6 @@ const resourceSlice = createSlice({ ) { return initialState; }, - setCurrentUrl(state, action: PayloadAction) { - state.url = action.payload; - }, }, }); @@ -121,7 +119,6 @@ export const { getPluginFilesSuccess, getPluginFilesError, resetActiveResources, - setCurrentUrl, } = resourceSlice.actions; export default resourceSlice.reducer; diff --git a/src/store/resources/saga.ts b/src/store/resources/saga.ts index e60e9bde4..4714a6ba2 100644 --- a/src/store/resources/saga.ts +++ b/src/store/resources/saga.ts @@ -297,7 +297,6 @@ function getLog(raw: string) { } // If both "deflate" and "zlib" fail, you may need to handle other compression methods here. - console.error("Unable to inflate the data."); return null; } diff --git a/src/store/resources/types.ts b/src/store/resources/types.ts index f0f67d86f..7d7a0272c 100644 --- a/src/store/resources/types.ts +++ b/src/store/resources/types.ts @@ -97,6 +97,6 @@ export interface IResourceState { pluginInstanceStatus: PluginInstanceStatusPayload; pluginInstanceResource: PluginInstanceResourcePayload; pluginFiles: FilesPayload; - url: string; + loading: boolean; } diff --git a/src/store/root/rootSaga.ts b/src/store/root/rootSaga.ts index 5e22a778d..d963e37d1 100644 --- a/src/store/root/rootSaga.ts +++ b/src/store/root/rootSaga.ts @@ -8,10 +8,9 @@ import { all, fork } from "redux-saga/effects"; /// ADD ALL Local Sagas: -import { pluginInstanceSaga } from "../pluginInstance/saga"; import { resourceSaga } from "../resources/saga"; import { cartSaga } from "../cart/saga"; export function* rootSaga() { - yield all([fork(pluginInstanceSaga), fork(resourceSaga), fork(cartSaga)]); + yield all([fork(resourceSaga), fork(cartSaga)]); } From e991ed90a1c78fe6f495d3f03e16ca04ba5a9ecf Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 14 Aug 2024 12:58:19 -0400 Subject: [PATCH 108/337] refactor: Remove unused code --- .../FeedOutputBrowser/FeedOutputBrowser.tsx | 4 +- src/components/FeedOutputBrowser/data.ts | 50 ------------------- src/components/FeedTree/FeedTree.css | 11 ---- src/components/FeedTree/FeedTree.tsx | 2 +- src/components/Feeds/FeedListView.tsx | 1 + src/components/Feeds/FeedView.tsx | 1 - src/components/Feeds/Feeds.css | 5 +- 7 files changed, 8 insertions(+), 66 deletions(-) delete mode 100644 src/components/FeedOutputBrowser/data.ts diff --git a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx index 8b9873289..4ff889bbe 100644 --- a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx +++ b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx @@ -1,12 +1,12 @@ +import type { PluginInstance } from "@fnndsc/chrisapi"; import { EmptyState, EmptyStateBody, EmptyStateVariant, Title, } from "@patternfly/react-core"; -import type { PluginInstance } from "@fnndsc/chrisapi"; -import FileBrowser from "./FileBrowser"; import { SpinContainer } from "../Common"; +import FileBrowser from "./FileBrowser"; import { useFeedBrowser } from "./useFeedBrowser"; import "./FeedOutputBrowser.css"; diff --git a/src/components/FeedOutputBrowser/data.ts b/src/components/FeedOutputBrowser/data.ts deleted file mode 100644 index ca216f17b..000000000 --- a/src/components/FeedOutputBrowser/data.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { PluginInstance } from "@fnndsc/chrisapi"; - -export interface DataNode { - children: DataNode[]; - isLeaf?: boolean; - key: string | number; - title?: React.ReactNode; - item: PluginInstance; - parentId?: number; -} - -const firstElement = []; - -export const getFeedTree = (items: PluginInstance[]) => { - const tree = [], - mappedArr: { - [key: string]: DataNode; - } = {}; - - items.forEach((item) => { - const id = item.data.id; - const title = item.data.title || item.data.plugin_name; - if (!mappedArr.hasOwnProperty(id)) { - mappedArr[id] = { - key: id, - title: `${title}`, - parentId: item.data.previous_id, - item: item, - children: [], - }; - } - }); - - for (const id in mappedArr) { - let mappedElem; - if (mappedArr.hasOwnProperty(id)) { - mappedElem = mappedArr[id]; - - if (mappedElem.parentId) { - const parentId = mappedElem.parentId; - if (parentId && mappedArr[parentId] && mappedArr[parentId].children) - mappedArr[parentId].children.push(mappedElem); - } else { - firstElement.push(mappedElem); - tree.push(mappedElem); - } - } - } - return tree; -}; diff --git a/src/components/FeedTree/FeedTree.css b/src/components/FeedTree/FeedTree.css index ab34a9b5c..ed89b8303 100644 --- a/src/components/FeedTree/FeedTree.css +++ b/src/components/FeedTree/FeedTree.css @@ -149,17 +149,6 @@ } } -@keyframes queued { - 0% { - fill: pink; - } - 50% { - fill: pink; - } - 100% { - fill: pink; - } -} .node { cursor: pointer; diff --git a/src/components/FeedTree/FeedTree.tsx b/src/components/FeedTree/FeedTree.tsx index 2dfeebadf..6e2dbb4db 100644 --- a/src/components/FeedTree/FeedTree.tsx +++ b/src/components/FeedTree/FeedTree.tsx @@ -401,7 +401,7 @@ const FeedTree = (props: OwnProps) => { ); })} - {nodes?.map(({ data, x, y, parent }, i) => { + {nodes?.map(({ data, x, y, parent }) => { return ( {Array.from({ length: 15 }).map((_, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: diff --git a/src/components/Feeds/FeedView.tsx b/src/components/Feeds/FeedView.tsx index 0ff8bc500..c24523440 100644 --- a/src/components/Feeds/FeedView.tsx +++ b/src/components/Feeds/FeedView.tsx @@ -116,7 +116,6 @@ const FeedView: React.FC = () => { dispatch(setShowToolbar(true)); return () => { - console.log("Unmount called"); if (dataRef.current?.selectedPlugin && dataRef.current.data) { dispatch(resetActiveResources(dataRef.current)); } diff --git a/src/components/Feeds/Feeds.css b/src/components/Feeds/Feeds.css index a98b70b4d..d0c174a5b 100644 --- a/src/components/Feeds/Feeds.css +++ b/src/components/Feeds/Feeds.css @@ -33,4 +33,7 @@ .chart.dark tspan { fill: white !important; - } \ No newline at end of file + } + + + \ No newline at end of file From d4be187fd1e63c5a8f5c62f3dddc772647d9efb5 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 14 Aug 2024 14:49:12 -0400 Subject: [PATCH 109/337] feat: Update Feed Table to be compact --- src/components/Feeds/FeedListView.tsx | 6 +++++- src/components/Feeds/Feeds.css | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index c38d69ab0..918a7cacc 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -232,7 +232,11 @@ const TableSelectable: React.FC = () => { {loadingFeedState ? ( ) : feedsToDisplay.length > 0 ? ( - +
{ - handleItem(item, type); + { + console.log("Test"); }} - key={type === "file" ? item.data.fname : item.data.path} // Assuming 'item' has an 'id' property > - - - - + { + handleOnClick(e, item, path, type); + }} + > + + + + + ); }; @@ -247,6 +291,10 @@ const FileBrowser = (props: FileBrowserProps) => { /> {drawerState.files.open && ( +
diff --git a/src/components/FeedOutputBrowser/types.ts b/src/components/FeedOutputBrowser/types.ts index d1927c2ed..816458ebe 100644 --- a/src/components/FeedOutputBrowser/types.ts +++ b/src/components/FeedOutputBrowser/types.ts @@ -5,17 +5,19 @@ import type { } from "@fnndsc/chrisapi"; import type { DataNode } from "../../store/explorer/types"; +export interface FilesPayload { + folderFiles: FileBrowserFolderFile[]; + children: any[]; + linkFiles: FileBrowserFolderLinkFile[]; + path: string; +} + export interface FileBrowserProps { - pluginFilesPayload: { - folderFiles: FileBrowserFolderFile[]; - children: any[]; - linkFiles: FileBrowserFolderLinkFile[]; - error: any; - path: string; - }; + pluginFilesPayload: FilesPayload; handleFileClick: (path: string) => void; selected: PluginInstance; filesLoading: boolean; + inValidateFolders: () => void; } export interface FileBrowserState { diff --git a/src/components/FeedOutputBrowser/useFeedBrowser.tsx b/src/components/FeedOutputBrowser/useFeedBrowser.tsx index 4b3158873..9e84badd6 100644 --- a/src/components/FeedOutputBrowser/useFeedBrowser.tsx +++ b/src/components/FeedOutputBrowser/useFeedBrowser.tsx @@ -1,97 +1,153 @@ +import type { + FileBrowserFolderFile, + FileBrowserFolderLinkFile, +} from "@fnndsc/chrisapi"; +import { useQuery, useQueryClient } from "@tanstack/react-query"; import React from "react"; -import { useDispatch } from "react-redux"; -import { getPluginFilesRequest } from "../../store/resources/resourceSlice"; +import ChrisAPIClient from "../../api/chrisapiclient"; +import { fetchResource } from "../../api/common"; +import { catchError } from "../../api/common"; import { useTypedSelector } from "../../store/hooks"; +import type { FilesPayload } from "./types"; const status = ["finishedSuccessfully", "finishedWithError", "cancelled"]; -const getInitialDownloadState = () => { +const getInitialDownloadState = () => ({ + count: 0, + status: false, + plugin_name: "", + error: "", + fetchingFiles: false, +}); + +export const fetchFilesFromAPath = async ( + path: string, +): Promise => { + console.log("Path", path); + const client = ChrisAPIClient.getClient(); + const foldersList = await client.getFileBrowserFolders({ + path, + }); + + const folders = foldersList.getItems(); + + if (folders) { + const folder = folders[0]; + if (folder) { + const pagination = { limit: 100, offset: 0 }; + const fetchChildren = folder.getChildren; + const boundChildren = fetchChildren.bind(folder); + + try { + const { resource: children } = await fetchResource( + pagination, + boundChildren, + ); + const linkFilesFn = folder.getLinkFiles; + const boundLinkFilesFn = linkFilesFn.bind(folder); + const { resource: linkFiles } = + await fetchResource( + pagination, + boundLinkFilesFn, + ); + const filesFn = folder.getFiles; + const boundFilesFn = filesFn.bind(folder); + const { resource: folderFiles } = + await fetchResource(pagination, boundFilesFn); + + return { + folderFiles: folderFiles, + linkFiles: linkFiles, + children: children, + path, + }; + } catch (error) { + const errorMessage = catchError(error).error_message; + throw new Error(errorMessage); + } + } + } + return { - count: 0, - status: false, - plugin_name: "", - error: "", - fetchingFiles: false, + folderFiles: [], + linkFiles: [], + children: [], + path, }; }; export const useFeedBrowser = () => { - const dispatch = useDispatch(); + const queryClient = useQueryClient(); const drawerState = useTypedSelector((state) => state.drawers); const [download, setDownload] = React.useState(getInitialDownloadState); + const [currentPath, setCurrentPath] = React.useState(""); const pluginInstances = useTypedSelector( (state) => state.instance.pluginInstances, ); - const { pluginFiles, loading: filesLoading } = useTypedSelector( - (state) => state.resource, - ); const selected = useTypedSelector((state) => state.instance.selectedPlugin); const { data: plugins } = pluginInstances; - const pluginFilesPayload = selected && pluginFiles[selected.data.id]; + const { + data: pluginFilesPayload, + isLoading: filesLoading, + isError, + error, + } = useQuery({ + queryKey: ["pluginFiles", currentPath], + queryFn: () => fetchFilesFromAPath(currentPath), + enabled: !!selected && !!currentPath, + }); const statusTitle = useTypedSelector((state) => { if (selected) { const id = selected.data.id; - if (selected.data.id && state.resource.pluginInstanceStatus[id]) { + if (id && state.resource.pluginInstanceStatus[id]) { return state.resource.pluginInstanceStatus[id].status; } } }); - const finished = selected && status.includes(selected.data.status); + const finished = selected && status.includes(selected?.data.status); React.useEffect(() => { if ((statusTitle && status.includes(statusTitle)) || finished) { + // User is trying to download a file before it is available if (download.error) { - setDownload((state) => { - return { - ...state, - error: "Files are ready for download now...", - }; - }); - } - - if (selected && !pluginFilesPayload) { - dispatch( - getPluginFilesRequest({ - id: selected.data.id, - path: selected.data.output_path, - }), - ); - } + setDownload((state) => ({ + ...state, + error: "Files are not ready for download now...", + })); - if (download.error) { setTimeout(() => { setDownload(getInitialDownloadState); }, 3000); } } - }, [ - selected, - finished, - dispatch, - pluginFilesPayload, - statusTitle, - download.error, - ]); + }, [finished, pluginFilesPayload, statusTitle, download.error]); + + React.useEffect(() => { + setCurrentPath(selected?.data.output_path); + }, [selected]); const handleFileClick = (path: string) => { if (selected) { - dispatch( - getPluginFilesRequest({ - id: selected.data.id, - path, - }), - ); + setCurrentPath(path); } }; + const inValidateFolders = () => { + queryClient.invalidateQueries({ + queryKey: ["pluginFiles", currentPath], + }); + }; + return { handleFileClick, filesLoading, + isError, + error, plugins, statusTitle, download, @@ -99,5 +155,6 @@ export const useFeedBrowser = () => { pluginFilesPayload, filesStatus: drawerState.files, previewStatus: drawerState.preview, + inValidateFolders, }; }; diff --git a/src/components/Icons/index.tsx b/src/components/Icons/index.tsx index 644aa52c7..f3a9e197e 100644 --- a/src/components/Icons/index.tsx +++ b/src/components/Icons/index.tsx @@ -64,9 +64,13 @@ const MergeIcon = ({ className }: { className?: string }) => { ); }; -const ArchiveIcon = ({ className }: { className?: string }) => { +const ArchiveIcon = ({ + className, + style, +}: { className?: string; style?: React.CSSProperties }) => { return ( { ); }; -const FileImageIcon = () => { +const FileImageIcon = ({ style }: { style?: React.CSSProperties }) => { return ( { ); }; -const FileTxtIcon = () => { +const FileTxtIcon = ({ style }: { style?: React.CSSProperties }) => { return ( { ); }; -const FilePdfIcon = () => { +const FilePdfIcon = ({ style }: { style?: React.CSSProperties }) => { return ( ) { // No state mutation needed for this action }, - getPluginFilesRequest( - state, - _action: PayloadAction<{ id: number; path: string }>, - ) { - state.loading = true; - }, - getPluginFilesSuccess( - state, - action: PayloadAction<{ - id: string; - folderFiles: FileBrowserFolderFile[]; - linkFiles: FileBrowserFolderLinkFile[]; - children: any[]; - path: string; - }>, - ) { - const { id, folderFiles, linkFiles, children, path } = action.payload; - state.loading = false; - state.pluginFiles[id] = { - folderFiles, - children, - linkFiles, - error: "", - path, - }; - }, - getPluginFilesError( - state, - action: PayloadAction<{ id: number; error: any }>, - ) { - const { id, error } = action.payload; - state.loading = false; - state.pluginFiles[id] = { - ...state.pluginFiles[id], - error, - }; - }, + resetActiveResources( _state, _action: PayloadAction, @@ -115,9 +72,7 @@ export const { getPluginInstanceStatusRequest, getPluginInstanceStatusSuccess, stopFetchingStatusResources, - getPluginFilesRequest, - getPluginFilesSuccess, - getPluginFilesError, + resetActiveResources, } = resourceSlice.actions; diff --git a/src/store/resources/saga.ts b/src/store/resources/saga.ts index 4714a6ba2..5ca5fc43f 100644 --- a/src/store/resources/saga.ts +++ b/src/store/resources/saga.ts @@ -7,12 +7,9 @@ import { all, delay, fork, put, takeEvery } from "@redux-saga/core/effects"; import { inflate, inflateRaw } from "pako"; import type { Task } from "redux-saga"; import ChrisAPIClient from "../../api/chrisapiclient"; -import { catchError, fetchResource } from "../../api/common"; + import type { IActionTypeParam } from "../../api/model"; import { - getPluginFilesError, - getPluginFilesRequest, - getPluginFilesSuccess, getPluginInstanceResourceSuccess, getPluginInstanceStatusSuccess, resetActiveResources, @@ -20,90 +17,9 @@ import { stopFetchingStatusResources, getPluginInstanceStatusRequest, } from "./resourceSlice"; -import type { FetchFileResult, PluginStatusLabels } from "./types"; +import type { PluginStatusLabels } from "./types"; import { getSelectedPlugin } from "../pluginInstance/pluginInstanceSlice"; -export const fetchFilesFromAPath = async ( - path: string, -): Promise => { - const client = ChrisAPIClient.getClient(); - const foldersList = await client.getFileBrowserFolders({ - path, - }); - - const folders = foldersList.getItems(); - - if (folders) { - const folder = folders[0]; - if (folder) { - const pagination = { limit: 100, offset: 0 }; - const fetchChildren = folder.getChildren; - const boundChildren = fetchChildren.bind(folder); - - try { - const { resource: children } = await fetchResource( - pagination, - boundChildren, - ); - const linkFilesFn = folder.getLinkFiles; - const boundLinkFilesFn = linkFilesFn.bind(folder); - const { resource: linkFiles } = - await fetchResource( - pagination, - boundLinkFilesFn, - ); - const filesFn = folder.getFiles; - const boundFilesFn = filesFn.bind(folder); - const { resource: folderFiles } = - await fetchResource(pagination, boundFilesFn); - - return { - folderFiles: folderFiles, - linkFiles: linkFiles, - children: children, - }; - } catch (error) { - if (error instanceof Error) { - throw new Error(error.message); - } - const errorMessage = catchError(error).error_message; - throw new Error(errorMessage); - } - } - } - - return { - folderFiles: [], - linkFiles: [], - children: [], - }; -}; - -function* fetchPluginFiles(action: IActionTypeParam) { - const { id, path } = action.payload; - - try { - const { folderFiles, linkFiles, children }: FetchFileResult = - yield fetchFilesFromAPath(path); - - const payload = { - id, - folderFiles, - linkFiles, - children, - path, - }; - yield put(getPluginFilesSuccess(payload)); - } catch (error) { - const errorMessage = error instanceof Error ? error.message : error; - const payload = { - id, - error: errorMessage, - }; - yield put(getPluginFilesError(payload)); - } -} - function* handleGetPluginStatus(instance: PluginInstance) { while (true) { try { @@ -251,10 +167,6 @@ function* pollInstanceEndpoints(action: IActionTypeParam) { yield watchStatusCancelPoll(pollTask); } -function* watchGetPluginFilesRequest() { - yield takeEvery(getPluginFilesRequest.type, fetchPluginFiles); -} - function* watchGetPluginStatusRequest() { yield takeEvery(getPluginInstanceStatusRequest.type, pollInstanceEndpoints); } @@ -269,7 +181,6 @@ function* watchSelectedPlugin() { export function* resourceSaga() { yield all([ - fork(watchGetPluginFilesRequest), fork(watchGetPluginStatusRequest), fork(watchResetActiveResources), fork(watchSelectedPlugin), diff --git a/src/store/resources/types.ts b/src/store/resources/types.ts index 7d7a0272c..02f5fdc29 100644 --- a/src/store/resources/types.ts +++ b/src/store/resources/types.ts @@ -57,12 +57,6 @@ export interface ResourcePayload { pluginLog?: Logs; } -export interface FetchFileResult { - folderFiles: FileBrowserFolderFile[]; - linkFiles: FileBrowserFolderLinkFile[]; - children: any[]; -} - export interface FilesPayload { [id: string]: { folderFiles: FileBrowserFolderFile[]; @@ -96,7 +90,4 @@ export interface DestroyActiveResources { export interface IResourceState { pluginInstanceStatus: PluginInstanceStatusPayload; pluginInstanceResource: PluginInstanceResourcePayload; - pluginFiles: FilesPayload; - - loading: boolean; } From 3394abfc153f7287d41a7f6af296fdd963049ead Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 14 Aug 2024 16:51:42 -0400 Subject: [PATCH 111/337] feat: Fix the creation of folders in the file browser table --- src/components/FeedOutputBrowser/FileBrowser.tsx | 1 + src/components/FeedOutputBrowser/types.ts | 2 ++ src/components/FeedOutputBrowser/useFeedBrowser.tsx | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 4379eff3c..978987d12 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -294,6 +294,7 @@ const FileBrowser = (props: FileBrowserProps) => {
diff --git a/src/components/FeedOutputBrowser/types.ts b/src/components/FeedOutputBrowser/types.ts index 816458ebe..0f757b213 100644 --- a/src/components/FeedOutputBrowser/types.ts +++ b/src/components/FeedOutputBrowser/types.ts @@ -1,6 +1,7 @@ import type { FileBrowserFolderFile, FileBrowserFolderLinkFile, + FileBrowserFolderList, PluginInstance, } from "@fnndsc/chrisapi"; import type { DataNode } from "../../store/explorer/types"; @@ -9,6 +10,7 @@ export interface FilesPayload { folderFiles: FileBrowserFolderFile[]; children: any[]; linkFiles: FileBrowserFolderLinkFile[]; + folderList?: FileBrowserFolderList; path: string; } diff --git a/src/components/FeedOutputBrowser/useFeedBrowser.tsx b/src/components/FeedOutputBrowser/useFeedBrowser.tsx index 9e84badd6..9ae9ccc55 100644 --- a/src/components/FeedOutputBrowser/useFeedBrowser.tsx +++ b/src/components/FeedOutputBrowser/useFeedBrowser.tsx @@ -23,7 +23,6 @@ const getInitialDownloadState = () => ({ export const fetchFilesFromAPath = async ( path: string, ): Promise => { - console.log("Path", path); const client = ChrisAPIClient.getClient(); const foldersList = await client.getFileBrowserFolders({ path, @@ -59,6 +58,7 @@ export const fetchFilesFromAPath = async ( folderFiles: folderFiles, linkFiles: linkFiles, children: children, + folderList: foldersList, path, }; } catch (error) { @@ -72,6 +72,7 @@ export const fetchFilesFromAPath = async ( folderFiles: [], linkFiles: [], children: [], + folderList: undefined, path, }; }; From fdef83f2457b6643c01a19f86fe6a9acf6bd3e09 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Sun, 18 Aug 2024 20:59:53 -0400 Subject: [PATCH 112/337] fix: Fix the bug with fetching files in the file browser --- package-lock.json | 3814 +++++------------ package.json | 1 - .../FeedOutputBrowser/useFeedBrowser.tsx | 27 +- 3 files changed, 1134 insertions(+), 2708 deletions(-) diff --git a/package-lock.json b/package-lock.json index 74876b97d..c6c051039 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,6 @@ "niivue-react": "github:niivue/niivue-react", "npm": "^10.8.2", "p-queue": "^8.0.1", - "package.json": "^0.0.0", "pako": "^1.0.11", "preval.macro": "^5.0.0", "query-string": "^9.0.0", @@ -100,8 +99,6 @@ }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -113,8 +110,6 @@ }, "node_modules/@ant-design/colors": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.1.0.tgz", - "integrity": "sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==", "license": "MIT", "dependencies": { "@ctrl/tinycolor": "^3.6.1" @@ -122,8 +117,6 @@ }, "node_modules/@ant-design/cssinjs": { "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.21.0.tgz", - "integrity": "sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -141,8 +134,6 @@ }, "node_modules/@ant-design/cssinjs-utils": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.0.3.tgz", - "integrity": "sha512-BrztZZKuoYcJK8uEH40ylBemf/Mu/QPiDos56g2bv6eUoniQkgQHOCOvA3+pncoFO1TaS8xcUCIqGzDA0I+ZVQ==", "license": "MIT", "dependencies": { "@ant-design/cssinjs": "^1.21.0", @@ -156,8 +147,6 @@ }, "node_modules/@ant-design/cssinjs-utils/node_modules/@babel/runtime": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -168,8 +157,6 @@ }, "node_modules/@ant-design/fast-color": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", - "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7" @@ -180,8 +167,6 @@ }, "node_modules/@ant-design/fast-color/node_modules/@babel/runtime": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -192,8 +177,6 @@ }, "node_modules/@ant-design/icons": { "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.4.0.tgz", - "integrity": "sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.0.0", @@ -212,14 +195,10 @@ }, "node_modules/@ant-design/icons-svg": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", - "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", "license": "MIT" }, "node_modules/@ant-design/icons/node_modules/@babel/runtime": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -230,8 +209,6 @@ }, "node_modules/@ant-design/react-slick": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", - "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.4", @@ -246,8 +223,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.7", @@ -259,8 +234,6 @@ }, "node_modules/@babel/compat-data": { "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -268,8 +241,6 @@ }, "node_modules/@babel/core": { "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -298,14 +269,10 @@ }, "node_modules/@babel/core/node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -313,8 +280,6 @@ }, "node_modules/@babel/generator": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "license": "MIT", "dependencies": { "@babel/types": "^7.25.0", @@ -328,8 +293,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.25.2", @@ -344,8 +307,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -353,8 +314,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", @@ -366,8 +325,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.24.7", @@ -384,8 +341,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -393,8 +348,6 @@ }, "node_modules/@babel/helper-simple-access": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", @@ -406,8 +359,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -415,8 +366,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -424,8 +373,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -433,8 +380,6 @@ }, "node_modules/@babel/helpers": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "license": "MIT", "dependencies": { "@babel/template": "^7.25.0", @@ -446,8 +391,6 @@ }, "node_modules/@babel/highlight": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", @@ -461,8 +404,6 @@ }, "node_modules/@babel/parser": { "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", "license": "MIT", "dependencies": { "@babel/types": "^7.25.2" @@ -476,8 +417,6 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -491,8 +430,6 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -506,8 +443,6 @@ }, "node_modules/@babel/runtime": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", - "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -518,8 +453,6 @@ }, "node_modules/@babel/template": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", @@ -532,8 +465,6 @@ }, "node_modules/@babel/traverse": { "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", @@ -550,8 +481,6 @@ }, "node_modules/@babel/types": { "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.24.8", @@ -564,15 +493,11 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, "license": "MIT" }, "node_modules/@biomejs/biome": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.8.3.tgz", - "integrity": "sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==", "dev": true, "hasInstallScript": true, "license": "MIT OR Apache-2.0", @@ -597,7 +522,7 @@ "@biomejs/cli-win32-x64": "1.8.3" } }, - "node_modules/@biomejs/cli-darwin-arm64": { + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-darwin-arm64": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.3.tgz", "integrity": "sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==", @@ -614,7 +539,7 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/cli-darwin-x64": { + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-darwin-x64": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.3.tgz", "integrity": "sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==", @@ -631,7 +556,7 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/cli-linux-arm64": { + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-linux-arm64": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.3.tgz", "integrity": "sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==", @@ -648,7 +573,7 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/cli-linux-arm64-musl": { + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-linux-arm64-musl": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.3.tgz", "integrity": "sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==", @@ -665,10 +590,10 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/cli-linux-x64": { + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-linux-x64-musl": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.3.tgz", - "integrity": "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", + "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", "cpu": [ "x64" ], @@ -682,29 +607,29 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/cli-linux-x64-musl": { + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-win32-arm64": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", - "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", + "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT OR Apache-2.0", "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=14.21.3" } }, - "node_modules/@biomejs/cli-win32-arm64": { + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-win32-x64": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", - "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", + "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT OR Apache-2.0", @@ -716,10 +641,8 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/cli-win32-x64": { + "node_modules/@biomejs/cli-linux-x64": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", - "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", "cpu": [ "x64" ], @@ -727,7 +650,7 @@ "license": "MIT OR Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": ">=14.21.3" @@ -735,8 +658,6 @@ }, "node_modules/@cornerstonejs/codec-charls": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-charls/-/codec-charls-1.2.3.tgz", - "integrity": "sha512-qKUe6DN0dnGzhhfZLYhH9UZacMcudjxcaLXCrpxJImT/M/PQvZCT2rllu6VGJbWKJWG+dMVV2zmmleZcdJ7/cA==", "license": "MIT", "engines": { "node": ">=0.14" @@ -744,8 +665,6 @@ }, "node_modules/@cornerstonejs/codec-libjpeg-turbo-8bit": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-libjpeg-turbo-8bit/-/codec-libjpeg-turbo-8bit-1.2.2.tgz", - "integrity": "sha512-aAUMK2958YNpOb/7G6e2/aG7hExTiFTASlMt/v90XA0pRHdWiNg5ny4S5SAju0FbIw4zcMnR0qfY+yW3VG2ivg==", "license": "ISC", "engines": { "node": ">=0.14" @@ -753,8 +672,6 @@ }, "node_modules/@cornerstonejs/codec-openjpeg": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-openjpeg/-/codec-openjpeg-1.2.4.tgz", - "integrity": "sha512-UT2su6xZZnCPSuWf2ldzKa/2+guQ7BGgfBSKqxanggwJHh48gZqIAzekmsLyJHMMK5YDK+ti+fzvVJhBS3Xi/g==", "license": "MIT", "engines": { "node": ">=0.14" @@ -762,8 +679,6 @@ }, "node_modules/@cornerstonejs/codec-openjph": { "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz", - "integrity": "sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==", "license": "MIT", "engines": { "node": ">=0.14" @@ -771,8 +686,6 @@ }, "node_modules/@cornerstonejs/core": { "version": "1.84.0", - "resolved": "https://registry.npmjs.org/@cornerstonejs/core/-/core-1.84.0.tgz", - "integrity": "sha512-fggteqI08EMl561UF+jvN2ba8Xz4aZEo6jQqLSfI4v5sTdKimI/CZ5IZo2MgumsKbuzKR7wTIB6yLp4mGtxKEw==", "license": "MIT", "dependencies": { "@kitware/vtk.js": "30.4.1", @@ -788,8 +701,6 @@ }, "node_modules/@cornerstonejs/dicom-image-loader": { "version": "1.84.0", - "resolved": "https://registry.npmjs.org/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.84.0.tgz", - "integrity": "sha512-iNOZvqyZrK7Xq3U5er0Su9z9bBY57ZUylAsHvzk2AnkiheO7JnZDE+FFLddlHIDMZgfgkPS55zdiiA01d4VzBg==", "license": "MIT", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", @@ -804,14 +715,10 @@ }, "node_modules/@cornerstonejs/dicom-image-loader/node_modules/pako": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", "license": "(MIT AND Zlib)" }, "node_modules/@cornerstonejs/streaming-image-volume-loader": { "version": "1.84.0", - "resolved": "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-1.84.0.tgz", - "integrity": "sha512-IKuotqBtHSVAYRZ1LkRG08eC/LEcGgvwRGq/0MPYkwSMSawOvVFRGzeTmFkHuQ09U8RDxhX/QMeIxIcbQfRfWA==", "license": "MIT", "dependencies": { "@cornerstonejs/core": "^1.84.0", @@ -824,8 +731,6 @@ }, "node_modules/@cornerstonejs/tools": { "version": "1.84.0", - "resolved": "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-1.84.0.tgz", - "integrity": "sha512-k5ncLUxQa7GXRJLUJwkWKCSg6YLrDnIIgrd4VHOvbkjOdjhZ5rrk3fradaBIy/aMl2h5lzK8yCvwxySHm5OSsg==", "license": "MIT", "dependencies": { "@cornerstonejs/core": "^1.84.0", @@ -851,8 +756,6 @@ }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", - "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", "license": "MIT", "engines": { "node": ">=10" @@ -860,577 +763,168 @@ }, "node_modules/@emotion/hash": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", "license": "MIT" }, "node_modules/@emotion/unitless": { "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", "license": "MIT" }, - "node_modules/@esbuild/aix-ppc64": { + "node_modules/@esbuild/linux-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ - "ppc64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "aix" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], + "node_modules/@faker-js/faker": { + "version": "8.4.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } ], + "license": "MIT", "engines": { - "node": ">=12" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "npm": ">=6.14.13" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@fnndsc/chrisapi": { + "version": "1.22.0", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "dependencies": { + "axios": "^1.6.8", + "core-js": "^3.36.1" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@icr/polyseg-wasm": { + "version": "0.4.0", "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": ">=0.14" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, "engines": { - "node": ">=12" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=12" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@kitware/vtk.js": { + "version": "30.4.1", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "7.22.11", + "@types/webxr": "^0.5.5", + "commander": "9.2.0", + "d3-scale": "4.0.2", + "fast-deep-equal": "^3.1.3", + "fflate": "0.7.3", + "gl-matrix": "3.4.3", + "globalthis": "1.0.3", + "seedrandom": "3.0.5", + "shader-loader": "1.3.1", + "shelljs": "0.8.5", + "spark-md5": "3.0.2", + "stream-browserify": "3.0.0", + "webworker-promise": "0.5.0", + "worker-loader": "3.0.8", + "xmlbuilder2": "3.0.2" + }, + "bin": { + "vtkDataConverter": "Utilities/DataGenerator/convert-cli.js", + "xml2json": "Utilities/XMLConverter/xml2json-cli.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.17.10", + "autoprefixer": "^10.4.7", + "wslink": ">=1.1.0 || ^2.0.0" + } + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/@lukeed/uuid": { + "version": "2.0.1", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@lukeed/csprng": "^1.1.0" + }, "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@faker-js/faker": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", - "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } - ], - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=6.14.13" - } - }, - "node_modules/@fnndsc/chrisapi": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@fnndsc/chrisapi/-/chrisapi-1.22.0.tgz", - "integrity": "sha512-npmjbFouPcQn56P6KAHUCFKS2VGf168VlqWzyzencbZQHNbTB6pMzw+LKTO3Xt9ShYy1iNrdelhr41HaP+AlCQ==", - "license": "MIT", - "dependencies": { - "axios": "^1.6.8", - "core-js": "^3.36.1" - } - }, - "node_modules/@icr/polyseg-wasm": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@icr/polyseg-wasm/-/polyseg-wasm-0.4.0.tgz", - "integrity": "sha512-3sZmiwG8I0NaqPle0L7+V/ZexiR7IjIUFkUsaOoFI9rNuBGyyMMmxAxnCmqcDFtBDk9h+JEYJf6e3NnqlHi/HQ==", - "license": "MIT", - "engines": { - "node": ">=0.14" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kitware/vtk.js": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@kitware/vtk.js/-/vtk.js-30.4.1.tgz", - "integrity": "sha512-jBJFm8AyWpJjNFFBadXyvBwegdD9M6WRdxmIb+x/MVpCyA5lEZSMemhiMn71oKsznaEe5Pjv2VDVJWmwK0vhUg==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "7.22.11", - "@types/webxr": "^0.5.5", - "commander": "9.2.0", - "d3-scale": "4.0.2", - "fast-deep-equal": "^3.1.3", - "fflate": "0.7.3", - "gl-matrix": "3.4.3", - "globalthis": "1.0.3", - "seedrandom": "3.0.5", - "shader-loader": "1.3.1", - "shelljs": "0.8.5", - "spark-md5": "3.0.2", - "stream-browserify": "3.0.0", - "webworker-promise": "0.5.0", - "worker-loader": "3.0.8", - "xmlbuilder2": "3.0.2" - }, - "bin": { - "vtkDataConverter": "Utilities/DataGenerator/convert-cli.js", - "xml2json": "Utilities/XMLConverter/xml2json-cli.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.17.10", - "autoprefixer": "^10.4.7", - "wslink": ">=1.1.0 || ^2.0.0" - } - }, - "node_modules/@lukeed/csprng": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@lukeed/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==", - "license": "MIT", - "dependencies": { - "@lukeed/csprng": "^1.1.0" - }, - "engines": { - "node": ">=8" + "node": ">=8" } }, "node_modules/@mattiasbuelens/web-streams-polyfill": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@mattiasbuelens/web-streams-polyfill/-/web-streams-polyfill-0.2.1.tgz", - "integrity": "sha512-oKuFCQFa3W7Hj7zKn0+4ypI8JFm4ZKIoncwAC6wd5WwFW2sL7O1hpPoJdSWpynQ4DJ4lQ6MvFoVDmCLilonDFg==", - "deprecated": "moved to web-streams-polyfill@2.0.0", "license": "MIT", "dependencies": { "@types/whatwg-streams": "^0.0.7" @@ -1441,8 +935,6 @@ }, "node_modules/@niivue/niivue": { "version": "0.41.1", - "resolved": "https://registry.npmjs.org/@niivue/niivue/-/niivue-0.41.1.tgz", - "integrity": "sha512-A1Nfqx/8RYTzCoA7x8AUfC8dPTw7jou6NXAJzXILY6tw22NzF/Qx/XXeJ3mMEg1J7xvGXa83REyvyNEkEvF3bQ==", "license": "BSD-2-Clause", "dependencies": { "@lukeed/uuid": "^2.0.1", @@ -1460,14 +952,10 @@ }, "node_modules/@niivue/niivue/node_modules/fflate": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", "license": "MIT" }, "node_modules/@oozcitak/dom": { "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", - "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", "license": "MIT", "dependencies": { "@oozcitak/infra": "1.0.8", @@ -1480,8 +968,6 @@ }, "node_modules/@oozcitak/infra": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", - "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", "license": "MIT", "dependencies": { "@oozcitak/util": "8.3.8" @@ -1492,8 +978,6 @@ }, "node_modules/@oozcitak/url": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", - "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", "license": "MIT", "dependencies": { "@oozcitak/infra": "1.0.8", @@ -1505,8 +989,6 @@ }, "node_modules/@oozcitak/util": { "version": "8.3.8", - "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", - "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", "license": "MIT", "engines": { "node": ">=8.0" @@ -1514,8 +996,6 @@ }, "node_modules/@patternfly/react-catalog-view-extension": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-catalog-view-extension/-/react-catalog-view-extension-5.0.0.tgz", - "integrity": "sha512-Sg0iLAVhE7wAwBJERNdYp6peMO4THG7ez3xvMXEWh2biXghIv9XVj5BEy0TssihMxZa/pRMdROzcv3QZ9m24Yg==", "license": "MIT", "dependencies": { "@patternfly/react-core": "^5.0.0", @@ -1528,8 +1008,6 @@ }, "node_modules/@patternfly/react-charts": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-7.3.0.tgz", - "integrity": "sha512-J6d/bFolI3zUOvJoK4lEveNeXZeJNfBq+iXgQ/mImESyW0H7MSebMcVB4d+NC6JX0QykuaOEn/7YMJMU9K73tw==", "license": "MIT", "dependencies": { "@patternfly/react-styles": "^5.3.0", @@ -1562,8 +1040,6 @@ }, "node_modules/@patternfly/react-core": { "version": "5.3.4", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.3.4.tgz", - "integrity": "sha512-zr2yeilIoFp8MFOo0vNgI8XuM+P2466zHvy4smyRNRH2/but2WObqx7Wu4ftd/eBMYdNqmTeuXe6JeqqRqnPMQ==", "license": "MIT", "dependencies": { "@patternfly/react-icons": "^5.3.2", @@ -1580,8 +1056,6 @@ }, "node_modules/@patternfly/react-icons": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.3.2.tgz", - "integrity": "sha512-GEygYbl0H4zD8nZuTQy2dayKIrV2bMMeWKSOEZ16Y3EYNgYVUOUnN+J0naAEuEGH39Xb1DE9n+XUbE1PC4CxPA==", "license": "MIT", "peerDependencies": { "react": "^17 || ^18", @@ -1590,8 +1064,6 @@ }, "node_modules/@patternfly/react-log-viewer": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-log-viewer/-/react-log-viewer-5.2.0.tgz", - "integrity": "sha512-+9v4d49ImSMWACJVBbvl5OjIAbEl4QWDuJJQpi2r+tP3ZzAHDZOohOGBeMmT780i0sOeny83qnbNpNbMBVeLCA==", "license": "MIT", "dependencies": { "@patternfly/react-core": "^5.0.0", @@ -1606,14 +1078,10 @@ }, "node_modules/@patternfly/react-styles": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.3.1.tgz", - "integrity": "sha512-H6uBoFH3bJjD6PP75qZ4k+2TtF59vxf9sIVerPpwrGJcRgBZbvbMZCniSC3+S2LQ8DgXLnDvieq78jJzHz0hiA==", "license": "MIT" }, "node_modules/@patternfly/react-table": { "version": "5.3.4", - "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.3.4.tgz", - "integrity": "sha512-jGaiuo02scaC1HdGNHuYVRjtQCOB+vtvfbgS7nl1Y8ZcJ08wyUGhGSrEpNHfGAQ1XDSSoELAxj0cjOQwAAQw1A==", "license": "MIT", "dependencies": { "@patternfly/react-core": "^5.3.4", @@ -1630,18 +1098,14 @@ }, "node_modules/@patternfly/react-tokens": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.3.1.tgz", - "integrity": "sha512-VYK0uVP2/2RJ7ZshJCCLeq0Boih5I1bv+9Z/Bg6h12dCkLs85XsxAX9Ve+BGIo5DF54/mzcRHE1RKYap4ISXuw==", "license": "MIT" }, "node_modules/@playwright/test": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.0.tgz", - "integrity": "sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==", + "version": "1.46.1", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.46.0" + "playwright": "1.46.1" }, "bin": { "playwright": "cli.js" @@ -1652,14 +1116,10 @@ }, "node_modules/@polka/url": { "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", "license": "MIT" }, "node_modules/@popperjs/core": { "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", "funding": { "type": "opencollective", @@ -1668,8 +1128,6 @@ }, "node_modules/@rc-component/async-validator": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", - "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.4" @@ -1680,8 +1138,6 @@ }, "node_modules/@rc-component/async-validator/node_modules/@babel/runtime": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1692,8 +1148,6 @@ }, "node_modules/@rc-component/color-picker": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", - "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", "license": "MIT", "dependencies": { "@ant-design/fast-color": "^2.0.6", @@ -1708,8 +1162,6 @@ }, "node_modules/@rc-component/color-picker/node_modules/@babel/runtime": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1720,8 +1172,6 @@ }, "node_modules/@rc-component/context": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", - "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -1734,8 +1184,6 @@ }, "node_modules/@rc-component/mini-decimal": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", - "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0" @@ -1746,8 +1194,6 @@ }, "node_modules/@rc-component/mutate-observer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", - "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -1764,8 +1210,6 @@ }, "node_modules/@rc-component/portal": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", - "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -1782,8 +1226,6 @@ }, "node_modules/@rc-component/qrcode": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", - "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", @@ -1800,8 +1242,6 @@ }, "node_modules/@rc-component/qrcode/node_modules/@babel/runtime": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1812,8 +1252,6 @@ }, "node_modules/@rc-component/tour": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.0.tgz", - "integrity": "sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -1832,8 +1270,6 @@ }, "node_modules/@rc-component/trigger": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.1.tgz", - "integrity": "sha512-fuU11J8pOt6+U/tU6/CAv8wjCwGaNeRk9f5k8HQth7JBbJ6MMH62WhGycVW75VnXfBZgL/7kO+wbiO2Xc9U9sQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2", @@ -1853,8 +1289,6 @@ }, "node_modules/@rc-component/trigger/node_modules/@babel/runtime": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1865,8 +1299,6 @@ }, "node_modules/@react-hook/latest": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", - "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", "license": "MIT", "peerDependencies": { "react": ">=16.8" @@ -1874,8 +1306,6 @@ }, "node_modules/@react-hook/passive-layout-effect": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", - "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", "license": "MIT", "peerDependencies": { "react": ">=16.8" @@ -1883,8 +1313,6 @@ }, "node_modules/@react-hook/resize-observer": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@react-hook/resize-observer/-/resize-observer-2.0.2.tgz", - "integrity": "sha512-tzKKzxNpfE5TWmxuv+5Ae3IF58n0FQgQaWJmcbYkjXTRZATXxClnTprQ2uuYygYTpu1pqbBskpwMpj6jpT1djA==", "license": "MIT", "dependencies": { "@react-hook/latest": "^1.0.2", @@ -1896,8 +1324,6 @@ }, "node_modules/@redux-devtools/extension": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@redux-devtools/extension/-/extension-3.3.0.tgz", - "integrity": "sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2", @@ -1909,8 +1335,6 @@ }, "node_modules/@redux-devtools/extension/node_modules/@babel/runtime": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1919,16 +1343,8 @@ "node": ">=6.9.0" } }, - "node_modules/@redux-devtools/extension/node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", - "license": "MIT" - }, "node_modules/@redux-saga/core": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.3.0.tgz", - "integrity": "sha512-L+i+qIGuyWn7CIg7k1MteHGfttKPmxwZR5E7OsGikCL2LzYA0RERlaUY00Y3P3ZV2EYgrsYlBrGs6cJP5OKKqA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.3", @@ -1946,14 +1362,10 @@ }, "node_modules/@redux-saga/deferred": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.2.1.tgz", - "integrity": "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==", "license": "MIT" }, "node_modules/@redux-saga/delay-p": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.2.1.tgz", - "integrity": "sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==", "license": "MIT", "dependencies": { "@redux-saga/symbols": "^1.1.3" @@ -1961,8 +1373,6 @@ }, "node_modules/@redux-saga/is": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.3.tgz", - "integrity": "sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==", "license": "MIT", "dependencies": { "@redux-saga/symbols": "^1.1.3", @@ -1971,20 +1381,14 @@ }, "node_modules/@redux-saga/symbols": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.3.tgz", - "integrity": "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==", "license": "MIT" }, "node_modules/@redux-saga/types": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz", - "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==", "license": "MIT" }, "node_modules/@reduxjs/toolkit": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.7.tgz", - "integrity": "sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==", "license": "MIT", "dependencies": { "immer": "^10.0.3", @@ -2006,9 +1410,7 @@ } }, "node_modules/@remix-run/router": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.0.tgz", - "integrity": "sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==", + "version": "1.19.1", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -2016,243 +1418,27 @@ }, "node_modules/@restart/hooks": { "version": "0.4.16", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", - "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", - "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", - "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", - "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", - "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", - "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", - "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", - "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", - "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", - "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", - "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", - "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", - "cpu": [ - "s390x" - ], - "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", - "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", - "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", - "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", - "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", - "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.0", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ] }, "node_modules/@swc/core": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.10.tgz", - "integrity": "sha512-l0xrFwBQ9atizhmV94yC2nwcecTk/oftofwMNPiFMGe56dqdmi2ArHaTV3PCtMlgaUH6rGCehoRMt5OrCI1ktg==", + "version": "1.7.11", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -2268,16 +1454,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.10", - "@swc/core-darwin-x64": "1.7.10", - "@swc/core-linux-arm-gnueabihf": "1.7.10", - "@swc/core-linux-arm64-gnu": "1.7.10", - "@swc/core-linux-arm64-musl": "1.7.10", - "@swc/core-linux-x64-gnu": "1.7.10", - "@swc/core-linux-x64-musl": "1.7.10", - "@swc/core-win32-arm64-msvc": "1.7.10", - "@swc/core-win32-ia32-msvc": "1.7.10", - "@swc/core-win32-x64-msvc": "1.7.10" + "@swc/core-darwin-arm64": "1.7.11", + "@swc/core-darwin-x64": "1.7.11", + "@swc/core-linux-arm-gnueabihf": "1.7.11", + "@swc/core-linux-arm64-gnu": "1.7.11", + "@swc/core-linux-arm64-musl": "1.7.11", + "@swc/core-linux-x64-gnu": "1.7.11", + "@swc/core-linux-x64-musl": "1.7.11", + "@swc/core-win32-arm64-msvc": "1.7.11", + "@swc/core-win32-ia32-msvc": "1.7.11", + "@swc/core-win32-x64-msvc": "1.7.11" }, "peerDependencies": { "@swc/helpers": "*" @@ -2288,29 +1474,27 @@ } } }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.10.tgz", - "integrity": "sha512-TYp4x/9w/C/yMU1olK5hTKq/Hi7BjG71UJ4V1U1WxI1JA3uokjQ/GoktDfmH5V5pX4dgGSOJwUe2RjoN8Z/XnA==", + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.7.11", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { "node": ">=10" } }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.10.tgz", - "integrity": "sha512-P3LJjAWh5yLc6p5IUwV5LgRfA3R1oDCZDMabYyb2BVQuJTD4MfegW9DhBcUUF5dhBLwq3191KpLVzE+dLTbiXw==", + "node_modules/@swc/core/node_modules/@swc/core-darwin-arm64": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.11.tgz", + "integrity": "sha512-HRQv4qIeMBPThZ6Y/4yYW52rGsS6yrpusvuxLGyoFo45Y0y12/V2yXkOIA/0HIQyrqoUAxn1k4zQXpPaPNCmnw==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "Apache-2.0 AND MIT", @@ -2322,32 +1506,32 @@ "node": ">=10" } }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.10.tgz", - "integrity": "sha512-yGOFjE7w/akRTmqGY3FvWYrqbxO7OB2N2FHj2LO5HtzXflfoABb5RyRvdEquX+17J6mEpu4EwjYNraTD/WHIEQ==", + "node_modules/@swc/core/node_modules/@swc/core-darwin-x64": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.11.tgz", + "integrity": "sha512-vtMQj0F3oYwDu5yhO7SKDRg1XekRSi6/TbzHAbBXv+dBhlGGvcZZynT1H90EVFTv+7w7Sh+lOFvRv5Z4ZTcxow==", "cpu": [ - "arm" + "x64" ], "dev": true, - "license": "Apache-2.0", + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": ">=10" } }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.10.tgz", - "integrity": "sha512-SPWsgWHfdWKKjLrYlvhxcdBJ7Ruy6crJbPoE9NfD95eJEjMnS2yZTqj2ChFsY737WeyhWYlHzgYhYOVCp83YwQ==", + "node_modules/@swc/core/node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.11.tgz", + "integrity": "sha512-mHtzWKxhtyreI4CSxs+3+ENv8t/Qo35WFoYG66qHEgJz/Z2Lh6jv1E+MYgHdYwnpQHgHbdvAco7HsBu/Dt6xXw==", "cpu": [ - "arm64" + "arm" ], "dev": true, - "license": "Apache-2.0 AND MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -2356,10 +1540,10 @@ "node": ">=10" } }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.10.tgz", - "integrity": "sha512-PUi50bkNqnBL3Z/Zq6jSfwgN9A/taA6u2Zou0tjDJi7oVdpjdr7SxNgCGzMJ/nNg5D/IQn1opM1jktMvpsPAuQ==", + "node_modules/@swc/core/node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.11.tgz", + "integrity": "sha512-FRwe/x0GfXSQjGP2lIk+NO0pUFS/lI/RorCLBPiK808EVE9JTbh9DKCc/4Bbb4jgScAjNkrFCUVObQYl3YKmpA==", "cpu": [ "arm64" ], @@ -2373,12 +1557,12 @@ "node": ">=10" } }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.10.tgz", - "integrity": "sha512-Sc+pY55gknCAmBQBR6DhlA7jZSxHaLSDb5Sevzi6DOFMXR79NpA6zWTNKwp1GK2AnRIkbAfvYLgOxS5uWTFVpg==", + "node_modules/@swc/core/node_modules/@swc/core-linux-arm64-musl": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.11.tgz", + "integrity": "sha512-GY/rs0+GUq14Gbnza90KOrQd/9yHd5qQMii5jcSWcUCT5A8QTa8kiicsM2NxZeTJ69xlKmT7sLod5l99lki/2A==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "Apache-2.0 AND MIT", @@ -2390,10 +1574,10 @@ "node": ">=10" } }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.10.tgz", - "integrity": "sha512-g5NKx2LXaGd0K26hmEts1Cvb7ptIvq3MHSgr6/D1tRPcDZw1Sp0dYsmyOv0ho4F5GOJyiCooG3oE9FXdb7jIpQ==", + "node_modules/@swc/core/node_modules/@swc/core-linux-x64-musl": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.11.tgz", + "integrity": "sha512-SBEfKrXy6zQ6ksnyxw1FaCftrIH4fLfA81xNnKb7x/6iblv7Ko6H0aK3P5C86jyqF/82+ONl9C7ImGkUFQADig==", "cpu": [ "x64" ], @@ -2407,10 +1591,10 @@ "node": ">=10" } }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.10.tgz", - "integrity": "sha512-plRIsOcfy9t9Q/ivm5DA7I0HaIvfAWPbI+bvVRrr3C/1K2CSqnqZJjEWOAmx2LiyipijNnEaFYuLBp0IkGuJpg==", + "node_modules/@swc/core/node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.11.tgz", + "integrity": "sha512-a2Y4xxEsLLYHJN7sMnw9+YQJDi3M1BxEr9hklfopPuGGnYLFNnx5CypH1l9ReijEfWjIAHNi7pq3m023lzW1Hg==", "cpu": [ "arm64" ], @@ -2424,10 +1608,10 @@ "node": ">=10" } }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.10.tgz", - "integrity": "sha512-GntrVNT23viHtbfzmlK8lfBiKeajH24GzbDT7qXhnoO20suUPcyYZxyvCb4gWM2zu8ZBTPHNlqfrNsriQCZ+lQ==", + "node_modules/@swc/core/node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.11.tgz", + "integrity": "sha512-ZbZFMwZO+j8ulhegJ7EhJ/QVZPoQ5qc30ylJQSxizizTJaen71Q7/13lXWc6ksuCKvg6dUKrp/TPgoxOOtSrFA==", "cpu": [ "ia32" ], @@ -2441,10 +1625,10 @@ "node": ">=10" } }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.10.tgz", - "integrity": "sha512-uXIF8GuSappe1imm6Lf7pHGepfCBjDQlS+qTqvEGE0wZAsL1IVATK9P/cH/OCLfJXeQDTLeSYmrpwjtXNt46tQ==", + "node_modules/@swc/core/node_modules/@swc/core-win32-x64-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.11.tgz", + "integrity": "sha512-IUohZedSJyDu/ReEBG/mqX6uG29uA7zZ9z6dIAF+p6eFxjXmh9MuHryyM+H8ebUyoq/Ad3rL+rUCksnuYNnI0w==", "cpu": [ "x64" ], @@ -2460,15 +1644,11 @@ }, "node_modules/@swc/counter": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/@swc/types": { "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", - "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2477,8 +1657,6 @@ }, "node_modules/@tanstack/query-core": { "version": "5.51.21", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.21.tgz", - "integrity": "sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw==", "license": "MIT", "funding": { "type": "github", @@ -2487,8 +1665,6 @@ }, "node_modules/@tanstack/react-query": { "version": "5.51.23", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.23.tgz", - "integrity": "sha512-CfJCfX45nnVIZjQBRYYtvVMIsGgWLKLYC4xcUiYEey671n1alvTZoCBaU9B85O8mF/tx9LPyrI04A6Bs2THv4A==", "license": "MIT", "dependencies": { "@tanstack/query-core": "5.51.21" @@ -2503,14 +1679,10 @@ }, "node_modules/@tweenjs/tween.js": { "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", @@ -2522,8 +1694,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" @@ -2531,8 +1701,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", @@ -2541,8 +1709,6 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" @@ -2550,39 +1716,27 @@ }, "node_modules/@types/cookie": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", "license": "MIT" }, "node_modules/@types/d3-array": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", "license": "MIT" }, "node_modules/@types/d3-color": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", "license": "MIT" }, "node_modules/@types/d3-hierarchy": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.11.tgz", - "integrity": "sha512-lnQiU7jV+Gyk9oQYk0GGYccuexmQPTp08E0+4BidgFdiJivjEvf+esPSdZqCZ2C7UwTWejWpqetVaU8A+eX3FA==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "license": "MIT", "dependencies": { "@types/d3-color": "*" @@ -2590,14 +1744,10 @@ }, "node_modules/@types/d3-path": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", "license": "MIT", "dependencies": { "@types/d3-time": "*" @@ -2605,14 +1755,10 @@ }, "node_modules/@types/d3-selection": { "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.6.tgz", - "integrity": "sha512-0MhJ/LzJe6/vQVxiYJnvNq5CD/MF6Qy0dLp4BEQ6Dz8oOaB0EMXfx1GGeBFSW+3VzgjaUrxK6uECDQj9VLa/Mg==", "license": "MIT" }, "node_modules/@types/d3-shape": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", "license": "MIT", "dependencies": { "@types/d3-path": "*" @@ -2620,20 +1766,14 @@ }, "node_modules/@types/d3-time": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "license": "MIT" }, "node_modules/@types/d3-zoom": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", @@ -2642,8 +1782,6 @@ }, "node_modules/@types/debug": { "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "license": "MIT", "dependencies": { "@types/ms": "*" @@ -2651,15 +1789,11 @@ }, "node_modules/@types/estree": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true, "license": "MIT" }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "license": "MIT", "dependencies": { "@types/react": "*", @@ -2668,54 +1802,38 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, "node_modules/@types/lodash": { "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", - "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", "dev": true, "license": "MIT" }, "node_modules/@types/ms": { "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", - "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", + "version": "20.16.0", "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/offscreencanvas": { "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", "license": "MIT" }, "node_modules/@types/parse-json": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, "node_modules/@types/prop-types": { "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -2724,8 +1842,6 @@ }, "node_modules/@types/react-dom": { "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, "license": "MIT", "dependencies": { @@ -2734,8 +1850,6 @@ }, "node_modules/@types/redux-logger": { "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@types/redux-logger/-/redux-logger-3.0.13.tgz", - "integrity": "sha512-jylqZXQfMxahkuPcO8J12AKSSCQngdEWQrw7UiLUJzMBcv1r4Qg77P6mjGLjM27e5gFQDPD8vwUMJ9AyVxFSsg==", "dev": true, "license": "MIT", "dependencies": { @@ -2744,45 +1858,31 @@ }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", "license": "MIT" }, "node_modules/@types/uuid": { "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "dev": true, "license": "MIT" }, "node_modules/@types/warning": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", - "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", "license": "MIT" }, "node_modules/@types/webxr": { "version": "0.5.19", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", - "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==", "license": "MIT" }, "node_modules/@types/whatwg-streams": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@types/whatwg-streams/-/whatwg-streams-0.0.7.tgz", - "integrity": "sha512-6sDiSEP6DWcY2ZolsJ2s39ZmsoGQ7KVwBDI3sESQsEm9P2dHTcqnDIHRZFRNtLCzWp7hCFGqYbw5GyfpQnJ01A==", "license": "MIT" }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "license": "ISC" }, "node_modules/@vitejs/plugin-react-swc": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz", - "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==", "dev": true, "license": "MIT", "dependencies": { @@ -2794,8 +1894,6 @@ }, "node_modules/@vitest/coverage-v8": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", - "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", "dev": true, "license": "MIT", "dependencies": { @@ -2822,8 +1920,6 @@ }, "node_modules/@vitest/expect": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", "dev": true, "license": "MIT", "dependencies": { @@ -2838,8 +1934,6 @@ }, "node_modules/@vitest/pretty-format": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2851,8 +1945,6 @@ }, "node_modules/@vitest/runner": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", - "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", "dev": true, "license": "MIT", "dependencies": { @@ -2865,8 +1957,6 @@ }, "node_modules/@vitest/snapshot": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", - "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", "dev": true, "license": "MIT", "dependencies": { @@ -2880,8 +1970,6 @@ }, "node_modules/@vitest/spy": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", "dev": true, "license": "MIT", "dependencies": { @@ -2893,8 +1981,6 @@ }, "node_modules/@vitest/utils": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2909,8 +1995,6 @@ }, "node_modules/@wearemothership/dicom-character-set": { "version": "1.0.4-opt.1", - "resolved": "https://registry.npmjs.org/@wearemothership/dicom-character-set/-/dicom-character-set-1.0.4-opt.1.tgz", - "integrity": "sha512-stqhnpawYHY2UZKj4RHTF71ab3q3z8S1SO9ToQKjsHQwowUdFVo6YFea93psFux3yqNbRlQjwoCdPjHcD0YQzw==", "license": "MIT", "engines": { "node": ">=10" @@ -2918,8 +2002,6 @@ }, "node_modules/abstract-leveldown": { "version": "0.12.4", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==", "dev": true, "license": "MIT", "dependencies": { @@ -2928,8 +2010,6 @@ }, "node_modules/abstract-leveldown/node_modules/xtend": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", "dev": true, "engines": { "node": ">=0.4" @@ -2937,8 +2017,6 @@ }, "node_modules/accessor-fn": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.1.tgz", - "integrity": "sha512-zZpFYBqIL1Aqg+f2qmYHJ8+yIZF7/tP6PUGx2/QM0uGPSO5UegpinmkNwDohxWtOj586BpMPVRUjce2HI6xB3A==", "license": "MIT", "engines": { "node": ">=12" @@ -2946,8 +2024,6 @@ }, "node_modules/ackee-tracker": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ackee-tracker/-/ackee-tracker-5.1.0.tgz", - "integrity": "sha512-A7iKkGyUnEXuOzxultQB7hnm4bStYCo1c38MYRRihBfqUP8AImhtZOODb00t9xrXs/BTsg06bz1MKpXeMs9sYw==", "license": "MIT", "dependencies": { "platform": "^1.3.6" @@ -2955,8 +2031,6 @@ }, "node_modules/acorn": { "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "license": "MIT", "bin": { @@ -2968,8 +2042,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2978,8 +2050,6 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "license": "MIT", "dependencies": { @@ -2992,8 +2062,6 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -3008,8 +2076,6 @@ }, "node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -3017,8 +2083,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -3027,8 +2091,6 @@ }, "node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "dependencies": { "color-convert": "^1.9.0" @@ -3039,8 +2101,6 @@ }, "node_modules/antd": { "version": "5.20.1", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.20.1.tgz", - "integrity": "sha512-YjVCYAfBjrTyNKsg+heAOR0Gm4qJNJoBZQcV1h1BX/ufwoLx0PC5RGs75g6gQFy/1nv8OrJH7DXUGdtwPMB3Vg==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.1.0", @@ -3104,8 +2164,6 @@ }, "node_modules/antd/node_modules/@babel/runtime": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -3116,8 +2174,6 @@ }, "node_modules/append-transform": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, "license": "MIT", "dependencies": { @@ -3129,15 +2185,11 @@ }, "node_modules/archy": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true, "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" @@ -3145,8 +2197,6 @@ }, "node_modules/array-equal": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", - "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3154,20 +2204,14 @@ }, "node_modules/array-tree-filter": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", "license": "MIT" }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "license": "MIT" }, "node_modules/asn1.js": { "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "license": "MIT", "dependencies": { @@ -3178,15 +2222,11 @@ }, "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, "license": "MIT" }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -3195,14 +2235,10 @@ }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, "node_modules/attr-accept": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", - "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", "license": "MIT", "engines": { "node": ">=4" @@ -3210,8 +2246,6 @@ }, "node_modules/axios": { "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -3221,8 +2255,6 @@ }, "node_modules/babel-plugin-macros": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -3236,8 +2268,6 @@ }, "node_modules/babel-plugin-preval": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-preval/-/babel-plugin-preval-5.1.0.tgz", - "integrity": "sha512-G5R+xmo5LS41A4UyZjOjV0mp9AvkuCyUOAJ6TOv/jTZS+VKh7L7HUDRcCSOb0YCM/u0fFarh7Diz0wjY8rFNFg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -3252,20 +2282,14 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/base16": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==", "license": "MIT" }, "node_modules/bezier-js": { "version": "6.1.4", - "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz", - "integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==", "license": "MIT", "funding": { "type": "individual", @@ -3274,8 +2298,6 @@ }, "node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "license": "MIT", "engines": { "node": "*" @@ -3283,8 +2305,6 @@ }, "node_modules/bl": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==", "dev": true, "license": "MIT", "dependencies": { @@ -3293,15 +2313,11 @@ }, "node_modules/bl/node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, "license": "MIT" }, "node_modules/bl/node_modules/readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "license": "MIT", "dependencies": { @@ -3313,22 +2329,16 @@ }, "node_modules/bl/node_modules/string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, "license": "MIT" }, "node_modules/bn.js": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true, "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3337,15 +2347,11 @@ }, "node_modules/brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true, "license": "MIT" }, "node_modules/browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "license": "MIT", "dependencies": { @@ -3359,8 +2365,6 @@ }, "node_modules/browserify-cipher": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "license": "MIT", "dependencies": { @@ -3371,8 +2375,6 @@ }, "node_modules/browserify-des": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "license": "MIT", "dependencies": { @@ -3384,8 +2386,6 @@ }, "node_modules/browserify-fs": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", - "integrity": "sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==", "dev": true, "dependencies": { "level-filesystem": "^1.0.1", @@ -3395,8 +2395,6 @@ }, "node_modules/browserify-rsa": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "license": "MIT", "dependencies": { @@ -3406,8 +2404,6 @@ }, "node_modules/browserify-sign": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", - "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", "dev": true, "license": "ISC", "dependencies": { @@ -3428,8 +2424,6 @@ }, "node_modules/browserslist": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -3460,29 +2454,21 @@ }, "node_modules/buffer-es6": { "version": "4.9.3", - "resolved": "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz", - "integrity": "sha512-Ibt+oXxhmeYJSsCkODPqNpPmyegefiD8rfutH1NYGhMZQhSp95Rz7haemgnJ6dxa6LT+JLLbtgOMORRluwKktw==", "dev": true, "license": "MIT" }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, "node_modules/buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", "dev": true, "license": "MIT" }, "node_modules/cac": { "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", "engines": { @@ -3491,8 +2477,6 @@ }, "node_modules/caching-transform": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "license": "MIT", "dependencies": { @@ -3507,8 +2491,6 @@ }, "node_modules/caching-transform/node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { @@ -3523,8 +2505,6 @@ }, "node_modules/caching-transform/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -3533,8 +2513,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" @@ -3542,8 +2520,6 @@ }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -3552,8 +2528,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", "funding": [ { "type": "opencollective", @@ -3572,8 +2546,6 @@ }, "node_modules/canvas-color-tracker": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.2.2.tgz", - "integrity": "sha512-r+u/Ft2ka4Rj274Ts4L9bhYZLuMvbuJ/yL4seP0s+Pi+i9CM0caD+Sd//yseS5EVBJ2SKSmq36h2mNYUCdmTfA==", "license": "MIT", "dependencies": { "tinycolor2": "^1.6.0" @@ -3584,8 +2556,6 @@ }, "node_modules/chai": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, "license": "MIT", "dependencies": { @@ -3601,8 +2571,6 @@ }, "node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", @@ -3615,8 +2583,6 @@ }, "node_modules/chalk/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "license": "MIT", "engines": { "node": ">=4" @@ -3624,8 +2590,6 @@ }, "node_modules/chalk/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -3636,8 +2600,6 @@ }, "node_modules/character-entities": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "license": "MIT", "funding": { "type": "github", @@ -3646,8 +2608,6 @@ }, "node_modules/check-error": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, "license": "MIT", "engines": { @@ -3656,8 +2616,6 @@ }, "node_modules/cipher-base": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3667,14 +2625,10 @@ }, "node_modules/classnames": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "license": "MIT", "engines": { @@ -3683,8 +2637,6 @@ }, "node_modules/cliui": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3695,8 +2647,6 @@ }, "node_modules/clone": { "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==", "dev": true, "license": "MIT", "engines": { @@ -3705,8 +2655,6 @@ }, "node_modules/clsx": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", "license": "MIT", "engines": { "node": ">=6" @@ -3714,8 +2662,6 @@ }, "node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", "dependencies": { "color-name": "1.1.3" @@ -3723,14 +2669,10 @@ }, "node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -3741,14 +2683,10 @@ }, "node_modules/comlink": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.1.tgz", - "integrity": "sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==", "license": "Apache-2.0" }, "node_modules/commander": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", - "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", "license": "MIT", "engines": { "node": "^12.20.0 || >=14" @@ -3756,27 +2694,19 @@ }, "node_modules/commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true, "license": "MIT" }, "node_modules/compute-scroll-into-view": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", - "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==", "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/concat-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "engines": [ "node >= 0.8" @@ -3791,8 +2721,6 @@ }, "node_modules/console-clear": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", - "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", "license": "MIT", "engines": { "node": ">=4" @@ -3800,15 +2728,11 @@ }, "node_modules/convert-source-map": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3816,8 +2740,6 @@ }, "node_modules/copy-to-clipboard": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", "license": "MIT", "dependencies": { "toggle-selection": "^1.0.6" @@ -3825,8 +2747,6 @@ }, "node_modules/core-js": { "version": "3.38.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.0.tgz", - "integrity": "sha512-XPpwqEodRljce9KswjZShh95qJ1URisBeKCjUdq27YdenkslVe7OO0ZJhlYXAChW7OhXaRLl8AAba7IBfoIHug==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -3836,15 +2756,11 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", @@ -3859,8 +2775,6 @@ }, "node_modules/create-ecdh": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "license": "MIT", "dependencies": { @@ -3870,15 +2784,11 @@ }, "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, "license": "MIT" }, "node_modules/create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "license": "MIT", "dependencies": { @@ -3891,8 +2801,6 @@ }, "node_modules/create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "license": "MIT", "dependencies": { @@ -3906,8 +2814,6 @@ }, "node_modules/cross-fetch": { "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "license": "MIT", "dependencies": { "node-fetch": "^2.6.12" @@ -3915,8 +2821,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "license": "MIT", "dependencies": { @@ -3930,8 +2834,6 @@ }, "node_modules/crypto-browserify": { "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "license": "MIT", "dependencies": { @@ -3953,20 +2855,14 @@ }, "node_modules/cssfilter": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", "license": "MIT" }, "node_modules/csstype": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, "node_modules/d3-array": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "license": "ISC", "dependencies": { "internmap": "1 - 2" @@ -3977,14 +2873,10 @@ }, "node_modules/d3-binarytree": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", - "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==", "license": "MIT" }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "license": "ISC", "engines": { "node": ">=12" @@ -3992,8 +2884,6 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "license": "ISC", "engines": { "node": ">=12" @@ -4001,8 +2891,6 @@ }, "node_modules/d3-drag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -4014,8 +2902,6 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "license": "BSD-3-Clause", "engines": { "node": ">=12" @@ -4023,8 +2909,6 @@ }, "node_modules/d3-force-3d": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.5.tgz", - "integrity": "sha512-tdwhAhoTYZY/a6eo9nR7HP3xSW/C6XvJTbeRpR92nlPzH6OiE+4MliN9feuSFd0tPtEUo+191qOhCTWx3NYifg==", "license": "MIT", "dependencies": { "d3-binarytree": "1", @@ -4039,8 +2923,6 @@ }, "node_modules/d3-format": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "license": "ISC", "engines": { "node": ">=12" @@ -4048,14 +2930,10 @@ }, "node_modules/d3-hierarchy": { "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==", "license": "BSD-3-Clause" }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "license": "ISC", "dependencies": { "d3-color": "1 - 3" @@ -4066,14 +2944,10 @@ }, "node_modules/d3-octree": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.0.2.tgz", - "integrity": "sha512-Qxg4oirJrNXauiuC94uKMbgxwnhdda9xRLl9ihq45srlJ4Ga3CSgqGcAL8iW7N5CIv4Oz8x3E734ulxyvHPvwA==", "license": "MIT" }, "node_modules/d3-path": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "license": "ISC", "engines": { "node": ">=12" @@ -4081,8 +2955,6 @@ }, "node_modules/d3-quadtree": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "license": "ISC", "engines": { "node": ">=12" @@ -4090,8 +2962,6 @@ }, "node_modules/d3-scale": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", @@ -4106,8 +2976,6 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "license": "ISC", "dependencies": { "d3-color": "1 - 3", @@ -4119,8 +2987,6 @@ }, "node_modules/d3-selection": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", "engines": { "node": ">=12" @@ -4128,8 +2994,6 @@ }, "node_modules/d3-shape": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "license": "ISC", "dependencies": { "d3-path": "^3.1.0" @@ -4140,8 +3004,6 @@ }, "node_modules/d3-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "license": "ISC", "dependencies": { "d3-array": "2 - 3" @@ -4152,8 +3014,6 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "license": "ISC", "dependencies": { "d3-time": "1 - 3" @@ -4164,8 +3024,6 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "license": "ISC", "engines": { "node": ">=12" @@ -4173,8 +3031,6 @@ }, "node_modules/d3-transition": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "license": "ISC", "dependencies": { "d3-color": "1 - 3", @@ -4192,8 +3048,6 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -4208,8 +3062,6 @@ }, "node_modules/daikon": { "version": "1.2.46", - "resolved": "https://registry.npmjs.org/daikon/-/daikon-1.2.46.tgz", - "integrity": "sha512-S8dTTlsWYTH3LQztjTW9KnNvxDeL2mr2cau0auLdYMJe4TrocYP1PmidHizO3rXUs+gXpBWI1PQ2qvB4b21QFw==", "license": "MIT", "dependencies": { "@wearemothership/dicom-character-set": "^1.0.4-opt.1", @@ -4221,14 +3073,10 @@ }, "node_modules/daikon/node_modules/pako": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", "license": "(MIT AND Zlib)" }, "node_modules/date-fns": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", "license": "MIT", "funding": { "type": "github", @@ -4237,14 +3085,10 @@ }, "node_modules/dayjs": { "version": "1.11.12", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz", - "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==", "license": "MIT" }, "node_modules/debug": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "license": "MIT", "dependencies": { "ms": "2.1.2" @@ -4260,8 +3104,6 @@ }, "node_modules/decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "license": "MIT", "engines": { @@ -4270,8 +3112,6 @@ }, "node_modules/decode-named-character-reference": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -4283,8 +3123,6 @@ }, "node_modules/decode-uri-component": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", - "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", "license": "MIT", "engines": { "node": ">=14.16" @@ -4292,15 +3130,11 @@ }, "node_modules/deep-diff": { "version": "0.3.8", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", - "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==", "dev": true, "license": "MIT" }, "node_modules/deep-eql": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", "engines": { @@ -4309,387 +3143,693 @@ }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "node_modules/default-require-extensions": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deferred-leveldown": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abstract-leveldown": "~0.12.1" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delaunator": { + "version": "4.0.1", + "license": "ISC" + }, + "node_modules/delaunay-find": { + "version": "0.0.6", + "license": "ISC", + "dependencies": { + "delaunator": "^4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/detect-gpu": { + "version": "5.0.44", + "license": "MIT", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dicom-parser": { + "version": "1.8.21", + "license": "MIT" + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.11", + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.5.7", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/email-validator": { + "version": "2.0.4", + "engines": { + "node": ">4.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", "dev": true, "license": "MIT", "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" + "prr": "~1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "errno": "cli.js" } }, - "node_modules/deferred-leveldown": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==", - "dev": true, + "node_modules/error-ex": { + "version": "1.3.2", "license": "MIT", "dependencies": { - "abstract-leveldown": "~0.12.1" + "is-arrayish": "^0.2.1" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/es-define-property": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/es-errors": { + "version": "1.3.0", "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delaunator": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", - "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==", - "license": "ISC" + "node_modules/es6-error": { + "version": "4.1.1", + "dev": true, + "license": "MIT" }, - "node_modules/delaunay-find": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/delaunay-find/-/delaunay-find-0.0.6.tgz", - "integrity": "sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==", - "license": "ISC", - "dependencies": { - "delaunator": "^4.0.0" + "node_modules/esbuild": { + "version": "0.21.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=0.4.0" + "node": ">=12" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/detect-gpu": { - "version": "5.0.43", - "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.43.tgz", - "integrity": "sha512-KVcUS/YzsZIBIACz6p2xpuBpAjaY4wiELImJ7M8rb9i16NE6frnVpSV/UBpkK6DYj4Wd3NJeE4sghcaypuM8bg==", + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "webgl-constants": "^1.1.1" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/dicom-parser": { - "version": "1.8.21", - "resolved": "https://registry.npmjs.org/dicom-parser/-/dicom-parser-1.8.21.tgz", - "integrity": "sha512-lYCweHQDsC8UFpXErPlg86Px2A8bay0HiUY+wzoG3xv5GzgqVHU3lziwSc/Gzn7VV7y2KeP072SzCviuOoU02w==", - "license": "MIT" - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "node": ">=12" } }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.6.tgz", - "integrity": "sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==", - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.5.6", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.6.tgz", - "integrity": "sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==", + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "MIT" - }, - "node_modules/email-validator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", - "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">4.0" + "node": ">=12" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 4" + "node": ">=12" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node": ">=12" } }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/esbuild": { + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "license": "MIT", "engines": { "node": ">=6" @@ -4697,8 +3837,6 @@ }, "node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -4706,8 +3844,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4719,8 +3855,6 @@ }, "node_modules/espree": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4737,8 +3871,6 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -4750,8 +3882,6 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { @@ -4760,14 +3890,10 @@ }, "node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, "node_modules/evp_bytestokey": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "license": "MIT", "dependencies": { @@ -4777,8 +3903,6 @@ }, "node_modules/execa": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "license": "MIT", "dependencies": { @@ -4801,8 +3925,6 @@ }, "node_modules/execa/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { @@ -4814,8 +3936,6 @@ }, "node_modules/execa/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -4827,20 +3947,14 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, "node_modules/fbemitter": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", "license": "BSD-3-Clause", "dependencies": { "fbjs": "^3.0.0" @@ -4848,8 +3962,6 @@ }, "node_modules/fbjs": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", - "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", "license": "MIT", "dependencies": { "cross-fetch": "^3.1.5", @@ -4863,26 +3975,18 @@ }, "node_modules/fbjs-css-vars": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", "license": "MIT" }, "node_modules/fetch-readablestream": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/fetch-readablestream/-/fetch-readablestream-0.2.0.tgz", - "integrity": "sha512-qu4mXWf4wus4idBIN/kVH+XSer8IZ9CwHP+Pd7DL7TuKNC1hP7ykon4kkBjwJF3EMX2WsFp4hH7gU7CyL7ucXw==", "license": "MIT" }, "node_modules/fflate": { "version": "0.7.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz", - "integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==", "license": "MIT" }, "node_modules/file-selector": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", - "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", "license": "MIT", "dependencies": { "tslib": "^2.4.0" @@ -4893,8 +3997,6 @@ }, "node_modules/filter-obj": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", - "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", "license": "MIT", "engines": { "node": ">=14.16" @@ -4905,8 +4007,6 @@ }, "node_modules/find-cache-dir": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "license": "MIT", "dependencies": { @@ -4923,8 +4023,6 @@ }, "node_modules/find-cache-dir/node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { @@ -4939,8 +4037,6 @@ }, "node_modules/find-cache-dir/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -4949,8 +4045,6 @@ }, "node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -4963,8 +4057,6 @@ }, "node_modules/flux": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", - "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "license": "BSD-3-Clause", "dependencies": { "fbemitter": "^3.0.0", @@ -4976,8 +4068,6 @@ }, "node_modules/focus-trap": { "version": "7.5.2", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz", - "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==", "license": "MIT", "dependencies": { "tabbable": "^6.2.0" @@ -4985,8 +4075,6 @@ }, "node_modules/follow-redirects": { "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -5005,8 +4093,6 @@ }, "node_modules/force-graph": { "version": "1.43.5", - "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.43.5.tgz", - "integrity": "sha512-HveLELh9yhZXO/QOfaFS38vlwJZ/3sKu+jarfXzRmbmihSOH/BbRWnUvmg8wLFiYy6h4HlH4lkRfZRccHYmXgA==", "license": "MIT", "dependencies": { "@tweenjs/tween.js": "18 - 23", @@ -5030,15 +4116,11 @@ }, "node_modules/foreach": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", "dev": true, "license": "MIT" }, "node_modules/foreground-child": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "license": "ISC", "dependencies": { @@ -5051,8 +4133,6 @@ }, "node_modules/form-data": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -5065,14 +4145,10 @@ }, "node_modules/fp-ts": { "version": "2.16.9", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.9.tgz", - "integrity": "sha512-+I2+FnVB+tVaxcYyQkHUq7ZdKScaBlX53A41mxQtpIccsfyv8PzdzP7fzp2AY832T4aoK6UZ5WRX/ebGd8uZuQ==", "license": "MIT" }, "node_modules/fromentries": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "funding": [ { "type": "github", @@ -5091,29 +4167,10 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5121,8 +4178,6 @@ }, "node_modules/fwd-stream": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==", "dev": true, "dependencies": { "readable-stream": "~1.0.26-4" @@ -5130,15 +4185,11 @@ }, "node_modules/fwd-stream/node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, "license": "MIT" }, "node_modules/fwd-stream/node_modules/readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "license": "MIT", "dependencies": { @@ -5150,15 +4201,11 @@ }, "node_modules/fwd-stream/node_modules/string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, "license": "MIT" }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -5166,8 +4213,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -5176,8 +4221,6 @@ }, "node_modules/get-func-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "license": "MIT", "engines": { @@ -5186,8 +4229,6 @@ }, "node_modules/get-intrinsic": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5205,8 +4246,6 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -5215,8 +4254,6 @@ }, "node_modules/get-port": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "license": "MIT", "engines": { "node": ">=4" @@ -5224,8 +4261,6 @@ }, "node_modules/get-stream": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "license": "MIT", "engines": { @@ -5237,15 +4272,10 @@ }, "node_modules/gl-matrix": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", - "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==", "license": "MIT" }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -5264,8 +4294,6 @@ }, "node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "license": "MIT", "engines": { "node": ">=4" @@ -5273,8 +4301,6 @@ }, "node_modules/globalthis": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "license": "MIT", "dependencies": { "define-properties": "^1.1.3" @@ -5288,8 +4314,6 @@ }, "node_modules/gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" @@ -5300,15 +4324,11 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/hammerjs": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -5316,8 +4336,6 @@ }, "node_modules/happy-dom": { "version": "14.12.3", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-14.12.3.tgz", - "integrity": "sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g==", "dev": true, "license": "MIT", "dependencies": { @@ -5331,8 +4349,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -5341,8 +4357,6 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -5353,8 +4367,6 @@ }, "node_modules/has-proto": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5365,8 +4377,6 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5377,8 +4387,6 @@ }, "node_modules/hash-base": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", "dev": true, "license": "MIT", "dependencies": { @@ -5391,8 +4399,6 @@ }, "node_modules/hash.js": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "license": "MIT", "dependencies": { @@ -5402,8 +4408,6 @@ }, "node_modules/hasha": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5419,8 +4423,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5431,8 +4433,6 @@ }, "node_modules/hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, "license": "MIT", "dependencies": { @@ -5443,8 +4443,6 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" @@ -5452,15 +4450,11 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/htmlparser2": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -5478,8 +4472,6 @@ }, "node_modules/human-signals": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5488,15 +4480,11 @@ }, "node_modules/idb-wrapper": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", - "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==", "dev": true, "license": "MIT" }, "node_modules/immer": { "version": "10.1.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", - "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", "license": "MIT", "funding": { "type": "opencollective", @@ -5504,18 +4492,11 @@ } }, "node_modules/immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "version": "4.3.7", + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -5530,8 +4511,6 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" @@ -5539,8 +4518,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -5549,8 +4526,6 @@ }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { @@ -5559,8 +4534,6 @@ }, "node_modules/index-array-by": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", - "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", "license": "MIT", "engines": { "node": ">=12" @@ -5568,15 +4541,10 @@ }, "node_modules/indexof": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", "dev": true }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -5585,14 +4553,10 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/internmap": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "license": "ISC", "engines": { "node": ">=12" @@ -5600,8 +4564,6 @@ }, "node_modules/interpret": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -5609,8 +4571,6 @@ }, "node_modules/invariant": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" @@ -5618,8 +4578,6 @@ }, "node_modules/is": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==", "dev": true, "engines": { "node": "*" @@ -5627,14 +4585,10 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, "node_modules/is-core-module": { "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -5648,8 +4602,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { @@ -5658,14 +4610,10 @@ }, "node_modules/is-object": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==", "dev": true }, "node_modules/is-plain-object": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5673,8 +4621,6 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { @@ -5686,15 +4632,11 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true, "license": "MIT" }, "node_modules/is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "license": "MIT", "engines": { @@ -5703,29 +4645,21 @@ }, "node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, "node_modules/isbuffer": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", - "integrity": "sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==", "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -5734,8 +4668,6 @@ }, "node_modules/istanbul-lib-hook": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5747,8 +4679,6 @@ }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5764,8 +4694,6 @@ }, "node_modules/istanbul-lib-processinfo": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "license": "ISC", "dependencies": { @@ -5782,8 +4710,6 @@ }, "node_modules/istanbul-lib-processinfo/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "license": "MIT", "bin": { @@ -5792,8 +4718,6 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5807,8 +4731,6 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5822,8 +4744,6 @@ }, "node_modules/istanbul-reports": { "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5836,8 +4756,6 @@ }, "node_modules/jerrypick": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.1.tgz", - "integrity": "sha512-XTtedPYEyVp4t6hJrXuRKr/jHj8SC4z+4K0b396PMkov6muL+i8IIamJIvZWe3jUspgIJak0P+BaWKawMYNBLg==", "license": "MIT", "engines": { "node": ">=12" @@ -5845,20 +4763,14 @@ }, "node_modules/jpeg-lossless-decoder-js": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/jpeg-lossless-decoder-js/-/jpeg-lossless-decoder-js-2.0.7.tgz", - "integrity": "sha512-tbZlhFkKmx+JaqVMkq47SKWGuXLkIaV8fTbnhO39dYEnQrSShLGuLCGb0n6ntXjtmk6oAWGiIriWOLwj9od0yQ==", "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", "dependencies": { @@ -5871,8 +4783,6 @@ }, "node_modules/jsesc": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -5883,26 +4793,18 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "license": "ISC" }, "node_modules/json2mq": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", - "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", "license": "MIT", "dependencies": { "string-convert": "^0.2.0" @@ -5910,8 +4812,6 @@ }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -5922,8 +4822,6 @@ }, "node_modules/kapsule": { "version": "1.14.5", - "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.14.5.tgz", - "integrity": "sha512-H0iSpTynUzZw3tgraDmReprpFRmH5oP5GPmaNsurSwLx2H5iCpOMIkp5q+sfhB4Tz/UJd1E1IbEE9Z6ksnJ6RA==", "license": "MIT", "dependencies": { "lodash-es": "4" @@ -5934,17 +4832,13 @@ }, "node_modules/kleur": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/lefthook": { - "version": "1.7.12", - "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.7.12.tgz", - "integrity": "sha512-kZQQAeL4JZbsADqzK5YMP7M0aadGVDha7oo+4exA5FeQbgpmnDq+ejbkdfLOdo9uy7FSY82akmbxAiXq+V4fbg==", + "version": "1.7.14", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5952,20 +4846,34 @@ "lefthook": "bin/index.js" }, "optionalDependencies": { - "lefthook-darwin-arm64": "1.7.12", - "lefthook-darwin-x64": "1.7.12", - "lefthook-freebsd-arm64": "1.7.12", - "lefthook-freebsd-x64": "1.7.12", - "lefthook-linux-arm64": "1.7.12", - "lefthook-linux-x64": "1.7.12", - "lefthook-windows-arm64": "1.7.12", - "lefthook-windows-x64": "1.7.12" - } - }, - "node_modules/lefthook-darwin-arm64": { - "version": "1.7.12", - "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.12.tgz", - "integrity": "sha512-CjbV968FMFJWBe/5UA4H3DiKH5TFCh0449pfr9NTt14r05FIg6YzLf5h97CYlDz3b0Bx8Iz8ZqoguE1dFrYpsg==", + "lefthook-darwin-arm64": "1.7.14", + "lefthook-darwin-x64": "1.7.14", + "lefthook-freebsd-arm64": "1.7.14", + "lefthook-freebsd-x64": "1.7.14", + "lefthook-linux-arm64": "1.7.14", + "lefthook-linux-x64": "1.7.14", + "lefthook-openbsd-arm64": "1.7.14", + "lefthook-openbsd-x64": "1.7.14", + "lefthook-windows-arm64": "1.7.14", + "lefthook-windows-x64": "1.7.14" + } + }, + "node_modules/lefthook-linux-x64": { + "version": "1.7.14", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/lefthook/node_modules/lefthook-darwin-arm64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.14.tgz", + "integrity": "sha512-3hNr04A8DSYZk0RBTdu8D/kkE3FHiNnexAEvuFOqLuf3EQhrrX1wxclGO0+tIk3s7nyh+iqpV69Xd+cb4Fnvpw==", "cpu": [ "arm64" ], @@ -5976,10 +4884,10 @@ "darwin" ] }, - "node_modules/lefthook-darwin-x64": { - "version": "1.7.12", - "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.12.tgz", - "integrity": "sha512-EEwh5zU65MwfwkGOpBW7rd0Ldg7Ef17VoFUQ/pr408acLq7BvNOrrFga/RNUvB5Hsaa7eNjBbv0AG02qE3X/ZA==", + "node_modules/lefthook/node_modules/lefthook-darwin-x64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.14.tgz", + "integrity": "sha512-cXVsxTS2IRKKRyYFEMjAxf0a/31M1PkiNAjlJPXQPoAxxC1rbsvkxWL8vXhH4P0AL18zSYVBf9aTktYArgQGuA==", "cpu": [ "x64" ], @@ -5990,10 +4898,10 @@ "darwin" ] }, - "node_modules/lefthook-freebsd-arm64": { - "version": "1.7.12", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.12.tgz", - "integrity": "sha512-BznKfuFw9lWhqJFrI+ci2EyS5vvfEWTcsISTq0o4a/kR058stK/6B+i+XnTHrHsiOjQbLJ42wcFgvUEFmio6yw==", + "node_modules/lefthook/node_modules/lefthook-freebsd-arm64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.14.tgz", + "integrity": "sha512-rhx2ZkbWD6SkOXLc5/xyN1fu0uL9MLYBYKKg5T0rLRVwqqr9aYKZ+1Rru/5oL8utH1qkQyiwQkcjnKkyHwSjPg==", "cpu": [ "arm64" ], @@ -6004,10 +4912,10 @@ "freebsd" ] }, - "node_modules/lefthook-freebsd-x64": { - "version": "1.7.12", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.12.tgz", - "integrity": "sha512-9+I0xakvqpAIxhPb5ON6a5v/Iyl+gahJi+ogoEDNqlg3zj4otZspOvdiAsLWBAaXI+yFQftOHBM8940Ki5RB0A==", + "node_modules/lefthook/node_modules/lefthook-freebsd-x64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.14.tgz", + "integrity": "sha512-WeVPDm7JB1Crchc7OQ3uLiRfLlhwwX3N2662DPguMresps2r79dUO97LhHMzd+l1RKIqZIgnU+j5fKFI+cmw4w==", "cpu": [ "x64" ], @@ -6018,10 +4926,10 @@ "freebsd" ] }, - "node_modules/lefthook-linux-arm64": { - "version": "1.7.12", - "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.12.tgz", - "integrity": "sha512-FC+4cyz2CUBVL4BnDwnAzQPdBHM80O2TM53qoT1R3sn9LbWwcpnwdXi86NhVD0I7+vKg6rGUKgOQMTZfSe+sDg==", + "node_modules/lefthook/node_modules/lefthook-linux-arm64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.14.tgz", + "integrity": "sha512-IUvxJBfLDVComNc1Djk4VYUJsSAtdwfTvwpNxfaG2qb31VNvF6PPdp43bgpgqzV8O0KDCMm/sn0hlZ00GTuy2A==", "cpu": [ "arm64" ], @@ -6032,10 +4940,24 @@ "linux" ] }, - "node_modules/lefthook-linux-x64": { - "version": "1.7.12", - "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.7.12.tgz", - "integrity": "sha512-BH9peuKjx2ikOxjnohdAH4ocRfC2NZQTXrJXsAdPOFja1iNHzBwpZe+/x+g8fO8a3WVrmBWad3814Hb/oGCICA==", + "node_modules/lefthook/node_modules/lefthook-openbsd-arm64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-1.7.14.tgz", + "integrity": "sha512-Mq5GgjzDMiFin+Ucm52nizvvDQM1o+MnL/P+FDbBq253BIJGDJK+qEuQBgEQndE9bUyAP4qiHb+R6jz5fbpAlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/lefthook/node_modules/lefthook-openbsd-x64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-1.7.14.tgz", + "integrity": "sha512-enbPte9MAYU2JHkcvUBRJrXI6JMVcQqJHN+F8yKOJLFBnthoR0ZUuSTzqAMOivj/wgncHkYPqOWIo1UfB+HpGw==", "cpu": [ "x64" ], @@ -6043,13 +4965,13 @@ "license": "MIT", "optional": true, "os": [ - "linux" + "openbsd" ] }, - "node_modules/lefthook-windows-arm64": { - "version": "1.7.12", - "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.12.tgz", - "integrity": "sha512-GlCNSpXAiBcCQ8jtcFGxkxGzqnsPzGWbx9HTYO7Xz1QjW56de311rdntyVIRl48nQ+Q76fVyEKAtsyQczvRN6w==", + "node_modules/lefthook/node_modules/lefthook-windows-arm64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.14.tgz", + "integrity": "sha512-M9QbTs+Je0SRKC2c/0X8OQsme6glFrKxQoxWMFCN02S6nNLiHqP4vsHphJFU+wnAwv4KE8I1YKT5iMxde0Ejlg==", "cpu": [ "arm64" ], @@ -6060,10 +4982,10 @@ "win32" ] }, - "node_modules/lefthook-windows-x64": { - "version": "1.7.12", - "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.12.tgz", - "integrity": "sha512-9GeeQVUX7R8irJ5mf0Zzxn74ZTpy1LHqIGPRAmn9ELtkVdne/DGpCcGyKGVoJFbMInEaeDHGOnVjeQ9kgWB8Fw==", + "node_modules/lefthook/node_modules/lefthook-windows-x64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.14.tgz", + "integrity": "sha512-40Mx+a44kPZUF/AXV45EIgw03FANTXMFDBR1Ib8qYbSaf1cWqJtfeQs9R5Ea0EdqxXkGprzwZ+yUFFjjfOFIoQ==", "cpu": [ "x64" ], @@ -6076,8 +4998,6 @@ }, "node_modules/level-blobs": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "integrity": "sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==", "dev": true, "dependencies": { "level-peek": "1.0.6", @@ -6087,15 +5007,11 @@ }, "node_modules/level-blobs/node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, "license": "MIT" }, "node_modules/level-blobs/node_modules/readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6107,15 +5023,11 @@ }, "node_modules/level-blobs/node_modules/string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, "license": "MIT" }, "node_modules/level-filesystem": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "integrity": "sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==", "dev": true, "dependencies": { "concat-stream": "^1.4.4", @@ -6131,15 +5043,11 @@ }, "node_modules/level-fix-range": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", - "integrity": "sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==", "dev": true, "license": "MIT" }, "node_modules/level-hooks": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "integrity": "sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==", "dev": true, "dependencies": { "string-range": "~1.2" @@ -6147,8 +5055,6 @@ }, "node_modules/level-js": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "integrity": "sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6162,15 +5068,11 @@ }, "node_modules/level-js/node_modules/object-keys": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", "dev": true, "license": "MIT" }, "node_modules/level-js/node_modules/xtend": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", "dev": true, "dependencies": { "object-keys": "~0.4.0" @@ -6181,8 +5083,6 @@ }, "node_modules/level-peek": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "integrity": "sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6191,8 +5091,6 @@ }, "node_modules/level-sublevel": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "integrity": "sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==", "dev": true, "license": "MIT", "dependencies": { @@ -6204,8 +5102,6 @@ }, "node_modules/level-sublevel/node_modules/level-fix-range": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "integrity": "sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==", "dev": true, "license": "MIT", "dependencies": { @@ -6214,9 +5110,6 @@ }, "node_modules/level-sublevel/node_modules/object-keys": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==", - "deprecated": "Please update to the latest object-keys", "dev": true, "license": "MIT", "dependencies": { @@ -6227,8 +5120,6 @@ }, "node_modules/level-sublevel/node_modules/xtend": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==", "dev": true, "dependencies": { "is-object": "~0.1.2", @@ -6240,8 +5131,6 @@ }, "node_modules/levelup": { "version": "0.18.6", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", - "integrity": "sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6256,22 +5145,16 @@ }, "node_modules/levelup/node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, "license": "MIT" }, "node_modules/levelup/node_modules/prr": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==", "dev": true, "license": "MIT" }, "node_modules/levelup/node_modules/readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "license": "MIT", "dependencies": { @@ -6283,8 +5166,6 @@ }, "node_modules/levelup/node_modules/semver": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", "dev": true, "license": "BSD", "bin": { @@ -6293,15 +5174,11 @@ }, "node_modules/levelup/node_modules/string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, "license": "MIT" }, "node_modules/levelup/node_modules/xtend": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", "dev": true, "engines": { "node": ">=0.4" @@ -6309,14 +5186,10 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, "node_modules/loader-utils": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -6329,8 +5202,6 @@ }, "node_modules/loader-utils/node_modules/json5": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "license": "MIT", "dependencies": { "minimist": "^1.2.0" @@ -6341,8 +5212,6 @@ }, "node_modules/local-access": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz", - "integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==", "license": "MIT", "engines": { "node": ">=6" @@ -6350,8 +5219,6 @@ }, "node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -6363,57 +5230,39 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "license": "MIT" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "license": "MIT" }, "node_modules/lodash.curry": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==", "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, "node_modules/lodash.flattendeep": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true, "license": "MIT" }, "node_modules/lodash.flow": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==", "license": "MIT" }, "node_modules/lodash.get": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -6424,8 +5273,6 @@ }, "node_modules/loupe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, "license": "MIT", "dependencies": { @@ -6434,8 +5281,6 @@ }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -6443,15 +5288,11 @@ }, "node_modules/ltgt": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", "dev": true, "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, "license": "MIT", "dependencies": { @@ -6460,8 +5301,6 @@ }, "node_modules/magicast": { "version": "0.3.4", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", - "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6472,8 +5311,6 @@ }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -6488,8 +5325,6 @@ }, "node_modules/marked": { "version": "13.0.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", - "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -6500,8 +5335,6 @@ }, "node_modules/md5.js": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "license": "MIT", "dependencies": { @@ -6512,21 +5345,15 @@ }, "node_modules/memoize-one": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/micromark": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", "funding": [ { "type": "GitHub Sponsors", @@ -6560,8 +5387,6 @@ }, "node_modules/micromark-core-commonmark": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", "funding": [ { "type": "GitHub Sponsors", @@ -6594,8 +5419,6 @@ }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", @@ -6614,8 +5437,6 @@ }, "node_modules/micromark-extension-gfm-autolink-literal": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", @@ -6630,8 +5451,6 @@ }, "node_modules/micromark-extension-gfm-footnote": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -6650,8 +5469,6 @@ }, "node_modules/micromark-extension-gfm-strikethrough": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -6668,8 +5485,6 @@ }, "node_modules/micromark-extension-gfm-table": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -6685,8 +5500,6 @@ }, "node_modules/micromark-extension-gfm-tagfilter": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" @@ -6698,8 +5511,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -6715,8 +5526,6 @@ }, "node_modules/micromark-factory-destination": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", "funding": [ { "type": "GitHub Sponsors", @@ -6736,8 +5545,6 @@ }, "node_modules/micromark-factory-label": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", "funding": [ { "type": "GitHub Sponsors", @@ -6758,8 +5565,6 @@ }, "node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -6778,8 +5583,6 @@ }, "node_modules/micromark-factory-title": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", "funding": [ { "type": "GitHub Sponsors", @@ -6800,8 +5603,6 @@ }, "node_modules/micromark-factory-whitespace": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", "funding": [ { "type": "GitHub Sponsors", @@ -6822,8 +5623,6 @@ }, "node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -6842,8 +5641,6 @@ }, "node_modules/micromark-util-chunked": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", "funding": [ { "type": "GitHub Sponsors", @@ -6861,8 +5658,6 @@ }, "node_modules/micromark-util-classify-character": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", "funding": [ { "type": "GitHub Sponsors", @@ -6882,8 +5677,6 @@ }, "node_modules/micromark-util-combine-extensions": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", "funding": [ { "type": "GitHub Sponsors", @@ -6902,8 +5695,6 @@ }, "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", "funding": [ { "type": "GitHub Sponsors", @@ -6921,8 +5712,6 @@ }, "node_modules/micromark-util-encode": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", "funding": [ { "type": "GitHub Sponsors", @@ -6937,8 +5726,6 @@ }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", "funding": [ { "type": "GitHub Sponsors", @@ -6953,8 +5740,6 @@ }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", "funding": [ { "type": "GitHub Sponsors", @@ -6972,8 +5757,6 @@ }, "node_modules/micromark-util-resolve-all": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", "funding": [ { "type": "GitHub Sponsors", @@ -6991,8 +5774,6 @@ }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", "funding": [ { "type": "GitHub Sponsors", @@ -7012,8 +5793,6 @@ }, "node_modules/micromark-util-subtokenize": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -7034,8 +5813,6 @@ }, "node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -7050,8 +5827,6 @@ }, "node_modules/micromark-util-types": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", "funding": [ { "type": "GitHub Sponsors", @@ -7066,8 +5841,6 @@ }, "node_modules/miller-rabin": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "license": "MIT", "dependencies": { @@ -7080,15 +5853,11 @@ }, "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, "license": "MIT" }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7096,8 +5865,6 @@ }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -7108,8 +5875,6 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "license": "MIT", "engines": { @@ -7121,22 +5886,16 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true, "license": "ISC" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", "dev": true, "license": "MIT" }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -7147,8 +5906,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7156,14 +5913,10 @@ }, "node_modules/mitt": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "license": "MIT", "engines": { "node": ">=4" @@ -7171,8 +5924,6 @@ }, "node_modules/mrmime": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "license": "MIT", "engines": { "node": ">=10" @@ -7180,14 +5931,10 @@ }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -7204,8 +5951,6 @@ }, "node_modules/nifti-reader-js": { "version": "0.6.8", - "resolved": "https://registry.npmjs.org/nifti-reader-js/-/nifti-reader-js-0.6.8.tgz", - "integrity": "sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==", "license": "MIT", "dependencies": { "fflate": "*" @@ -7224,8 +5969,6 @@ }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -7244,8 +5987,6 @@ }, "node_modules/node-preload": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7257,14 +5998,10 @@ }, "node_modules/node-releases": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "license": "MIT" }, "node_modules/npm": { "version": "10.8.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.2.tgz", - "integrity": "sha512-x/AIjFIKRllrhcb48dqUNAAZl0ig9+qMuN91RpZo3Cb2+zuibfh+KISl6+kVVyktDz230JKc208UkQwwMqyB+w==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -7423,8 +6160,6 @@ }, "node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7439,8 +6174,6 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", "engines": { @@ -9650,8 +8383,6 @@ }, "node_modules/nyc": { "version": "17.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.0.0.tgz", - "integrity": "sha512-ISp44nqNCaPugLLGGfknzQwSwt10SSS5IMoPR7GLoMAyS18Iw5js8U7ga2VF9lYuMZ42gOHr3UddZw4WZltxKg==", "dev": true, "license": "ISC", "dependencies": { @@ -9692,8 +8423,6 @@ }, "node_modules/nyc/node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -9707,8 +8436,6 @@ }, "node_modules/nyc/node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { @@ -9723,8 +8450,6 @@ }, "node_modules/nyc/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -9733,8 +8458,6 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9742,8 +8465,6 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -9751,15 +8472,11 @@ }, "node_modules/octal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "integrity": "sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==", "dev": true, "license": "MIT" }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -9767,8 +8484,6 @@ }, "node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9783,8 +8498,6 @@ }, "node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -9799,8 +8512,6 @@ }, "node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -9812,8 +8523,6 @@ }, "node_modules/p-map": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9825,8 +8534,6 @@ }, "node_modules/p-queue": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", - "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", "license": "MIT", "dependencies": { "eventemitter3": "^5.0.1", @@ -9841,8 +8548,6 @@ }, "node_modules/p-timeout": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", "license": "MIT", "engines": { "node": ">=14.16" @@ -9853,8 +8558,6 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -9863,8 +8566,6 @@ }, "node_modules/package-hash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "license": "ISC", "dependencies": { @@ -9877,23 +8578,12 @@ "node": ">=8" } }, - "node_modules/package.json": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/package.json/-/package.json-0.0.0.tgz", - "integrity": "sha512-4IJoBrMPxhC4cWwViXg7omAK6E/QD3F/DfmD1g20EI4AcV6V/KG5NqqLC2xjCclY1N5V7D+j6rJxi4mXyxIsMg==", - "deprecated": "Use pkg.json instead.", - "license": "BSD" - }, "node_modules/pako": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -9904,8 +8594,6 @@ }, "node_modules/parse-asn1": { "version": "5.1.7", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", - "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", "dev": true, "license": "ISC", "dependencies": { @@ -9922,8 +8610,6 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -9940,14 +8626,10 @@ }, "node_modules/parse-srcset": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", - "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -9956,8 +8638,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9965,8 +8645,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -9975,14 +8653,10 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { "node": ">=8" @@ -9990,15 +8664,11 @@ }, "node_modules/pathe": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, "license": "MIT" }, "node_modules/pathval": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, "license": "MIT", "engines": { @@ -10007,8 +8677,6 @@ }, "node_modules/pbkdf2": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, "license": "MIT", "dependencies": { @@ -10024,14 +8692,10 @@ }, "node_modules/picocolors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "license": "ISC" }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10043,18 +8707,14 @@ }, "node_modules/platform": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "license": "MIT" }, "node_modules/playwright": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.0.tgz", - "integrity": "sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==", + "version": "1.46.1", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.46.0" + "playwright-core": "1.46.1" }, "bin": { "playwright": "cli.js" @@ -10067,9 +8727,7 @@ } }, "node_modules/playwright-core": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.0.tgz", - "integrity": "sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==", + "version": "1.46.1", "dev": true, "license": "Apache-2.0", "bin": { @@ -10079,10 +8737,23 @@ "node": ">=18" } }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "funding": [ { "type": "opencollective", @@ -10109,8 +8780,6 @@ }, "node_modules/preval.macro": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/preval.macro/-/preval.macro-5.0.0.tgz", - "integrity": "sha512-+OZRqZYx1pjZ7H5Jis8bPFXkiT7lwA46UzAT4IjuzFVKwkJK+TwIx1TCqrqNCf8U3e5O12mEJEz1BXslkCLWfQ==", "license": "MIT", "dependencies": { "babel-plugin-preval": "^5.0.0" @@ -10121,22 +8790,16 @@ }, "node_modules/process-es6": { "version": "0.11.6", - "resolved": "https://registry.npmjs.org/process-es6/-/process-es6-0.11.6.tgz", - "integrity": "sha512-GYBRQtL4v3wgigq10Pv58jmTbFXlIiTbSfgnNqZLY0ldUPqy1rRxDI5fCjoCpnM6TqmHQI8ydzTBXW86OYc0gA==", "dev": true, "license": "MIT" }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "license": "MIT" }, "node_modules/process-on-spawn": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, "license": "MIT", "dependencies": { @@ -10148,8 +8811,6 @@ }, "node_modules/promise": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "license": "MIT", "dependencies": { "asap": "~2.0.3" @@ -10157,8 +8818,6 @@ }, "node_modules/prop-types": { "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -10168,21 +8827,15 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, "node_modules/prr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, "license": "MIT" }, "node_modules/public-encrypt": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10196,15 +8849,11 @@ }, "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" @@ -10212,14 +8861,10 @@ }, "node_modules/pure-color": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==", "license": "MIT" }, "node_modules/query-string": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.1.0.tgz", - "integrity": "sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==", "license": "MIT", "dependencies": { "decode-uri-component": "^0.4.1", @@ -10235,8 +8880,6 @@ }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10245,8 +8888,6 @@ }, "node_modules/randomfill": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "license": "MIT", "dependencies": { @@ -10256,8 +8897,6 @@ }, "node_modules/rc-cascader": { "version": "3.27.0", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.27.0.tgz", - "integrity": "sha512-z5uq8VvQadFUBiuZJ7YF5UAUGNkZtdEtcEYiIA94N/Kc2MIKr6lEbN5HyVddvYSgwWlKqnL6pH5bFXFuIK3MNg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -10274,8 +8913,6 @@ }, "node_modules/rc-checkbox": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.3.0.tgz", - "integrity": "sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10289,8 +8926,6 @@ }, "node_modules/rc-collapse": { "version": "3.7.3", - "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.3.tgz", - "integrity": "sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10305,8 +8940,6 @@ }, "node_modules/rc-dialog": { "version": "9.5.2", - "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.5.2.tgz", - "integrity": "sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10322,8 +8955,6 @@ }, "node_modules/rc-drawer": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.2.0.tgz", - "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", @@ -10339,8 +8970,6 @@ }, "node_modules/rc-drawer/node_modules/@babel/runtime": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -10351,8 +8980,6 @@ }, "node_modules/rc-dropdown": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.0.tgz", - "integrity": "sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -10367,8 +8994,6 @@ }, "node_modules/rc-field-form": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.3.0.tgz", - "integrity": "sha512-QyiYrE3uweGGi21MJpxHFmDW+Tb1yt5hitM1k0EbWc5hKDiSf5imOBc6NLLHrYk+sdelrw2Ju/fD4uRQdhSqNg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -10385,8 +9010,6 @@ }, "node_modules/rc-image": { "version": "7.9.0", - "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.9.0.tgz", - "integrity": "sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", @@ -10403,8 +9026,6 @@ }, "node_modules/rc-input": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.6.3.tgz", - "integrity": "sha512-wI4NzuqBS8vvKr8cljsvnTUqItMfG1QbJoxovCgL+DX4eVUcHIjVwharwevIxyy7H/jbLryh+K7ysnJr23aWIA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -10418,8 +9039,6 @@ }, "node_modules/rc-input-number": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.2.0.tgz", - "integrity": "sha512-5XZFhBCV5f9UQ62AZ2hFbEY8iZT/dm23Q1kAg0H8EvOgD3UDbYYJAayoVIkM3lQaCqYAW5gV0yV3vjw1XtzWHg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10435,8 +9054,6 @@ }, "node_modules/rc-mentions": { "version": "2.15.0", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.15.0.tgz", - "integrity": "sha512-f5v5i7VdqvBDXbphoqcQWmXDif2Msd2arritVoWybrVDuHE6nQ7XCYsybHbV//WylooK52BFDouFvyaRDtXZEw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.22.5", @@ -10454,8 +9071,6 @@ }, "node_modules/rc-menu": { "version": "9.14.1", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.14.1.tgz", - "integrity": "sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10472,8 +9087,6 @@ }, "node_modules/rc-motion": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.2.tgz", - "integrity": "sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -10487,8 +9100,6 @@ }, "node_modules/rc-notification": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.0.tgz", - "integrity": "sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10506,8 +9117,6 @@ }, "node_modules/rc-overflow": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", - "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -10522,8 +9131,6 @@ }, "node_modules/rc-pagination": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-4.2.0.tgz", - "integrity": "sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10537,8 +9144,6 @@ }, "node_modules/rc-picker": { "version": "4.6.13", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.13.tgz", - "integrity": "sha512-yi4JWPGjm420Q8rHjZ6YNy2c5IfV+9EAzx2pewVRPOjJqfg7uifO/Z0uqxdl/h6AhBocuvRvtlyz6ehrAvTq7A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", @@ -10576,8 +9181,6 @@ }, "node_modules/rc-picker/node_modules/@babel/runtime": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -10588,8 +9191,6 @@ }, "node_modules/rc-progress": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", - "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10603,8 +9204,6 @@ }, "node_modules/rc-rate": { "version": "2.13.0", - "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.0.tgz", - "integrity": "sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10621,8 +9220,6 @@ }, "node_modules/rc-resize-observer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", - "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.7", @@ -10637,8 +9234,6 @@ }, "node_modules/rc-segmented": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.3.0.tgz", - "integrity": "sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -10653,8 +9248,6 @@ }, "node_modules/rc-select": { "version": "14.15.1", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.15.1.tgz", - "integrity": "sha512-mGvuwW1RMm1NCSI8ZUoRoLRK51R2Nb+QJnmiAvbDRcjh2//ulCkxeV6ZRFTECPpE1t2DPfyqZMPw90SVJzQ7wQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10675,8 +9268,6 @@ }, "node_modules/rc-slider": { "version": "11.1.5", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.5.tgz", - "integrity": "sha512-b77H5PbjMKsvkYXAYIkn50QuFX6ICQmCTibDinI9q+BHx65/TV4TeU25+oadhSRzykxs0/vBWeKBwRyySOeWlg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10693,8 +9284,6 @@ }, "node_modules/rc-steps": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", - "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.16.7", @@ -10711,8 +9300,6 @@ }, "node_modules/rc-switch": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", - "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.21.0", @@ -10726,8 +9313,6 @@ }, "node_modules/rc-table": { "version": "7.45.7", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.45.7.tgz", - "integrity": "sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10747,8 +9332,6 @@ }, "node_modules/rc-tabs": { "version": "15.1.1", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.1.1.tgz", - "integrity": "sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", @@ -10769,8 +9352,6 @@ }, "node_modules/rc-textarea": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.8.1.tgz", - "integrity": "sha512-bm36N2ZqwZAP60ZQg2OY9mPdqWC+m6UTjHc+CqEZOxb3Ia29BGHazY/s5bI8M4113CkqTzhtFUDNA078ZiOx3Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10786,8 +9367,6 @@ }, "node_modules/rc-tooltip": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.0.tgz", - "integrity": "sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", @@ -10801,8 +9380,6 @@ }, "node_modules/rc-tree": { "version": "5.8.8", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.8.tgz", - "integrity": "sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10821,8 +9398,6 @@ }, "node_modules/rc-tree-select": { "version": "5.22.1", - "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.22.1.tgz", - "integrity": "sha512-b8mAK52xEpRgS+b2PTapCt29GoIrO5cO8jB7AfHttFsIJfcnynY9FCtnYzURsKXJkGHbFY6UzSEB2I3TETtdWg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -10838,8 +9413,6 @@ }, "node_modules/rc-upload": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.6.0.tgz", - "integrity": "sha512-Zr0DT1NHw/ApxrP7UAoxOtGaVYuzarrrCVr0ld7RiEFsKX07uFhE1EpCBxwL11ruFn89GMcshOKWp+s6FLyAlA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -10853,8 +9426,6 @@ }, "node_modules/rc-util": { "version": "5.43.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.43.0.tgz", - "integrity": "sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -10867,14 +9438,10 @@ }, "node_modules/rc-util/node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, "node_modules/rc-virtual-list": { "version": "3.14.5", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.14.5.tgz", - "integrity": "sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", @@ -10892,8 +9459,6 @@ }, "node_modules/react": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -10904,8 +9469,6 @@ }, "node_modules/react-activity": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/react-activity/-/react-activity-2.1.3.tgz", - "integrity": "sha512-BdZuwZ4frK+tkjjERtzT0HxbHUN5/hIe9BBL9Ac/kgVOJ0bXjJpz417cQ7XxGSA27I+fsHCNRrFQ1cux61vHDQ==", "license": "MIT", "peerDependencies": { "react": ">= 15.0.0", @@ -10914,8 +9477,6 @@ }, "node_modules/react-base16-styling": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", "license": "MIT", "dependencies": { "base16": "^1.0.0", @@ -10926,8 +9487,6 @@ }, "node_modules/react-bootstrap-typeahead": { "version": "6.3.2", - "resolved": "https://registry.npmjs.org/react-bootstrap-typeahead/-/react-bootstrap-typeahead-6.3.2.tgz", - "integrity": "sha512-N5Mb0WlSSMcD7Z0pcCypILgIuECybev0hl4lsnCa5lbXTnN4QdkuHLGuTLSlXBwm1ZMFpOc2SnsdSRgeFiF+Ow==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.14.6", @@ -10953,8 +9512,6 @@ }, "node_modules/react-cookie": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.2.0.tgz", - "integrity": "sha512-mqhPERUyfOljq5yJ4woDFI33bjEtigsl8JDJdPPeNhr0eSVZmBc/2Vdf8mFxOUktQxhxTR1T+uF0/FRTZyBEgw==", "license": "MIT", "dependencies": { "@types/hoist-non-react-statics": "^3.3.5", @@ -10967,8 +9524,6 @@ }, "node_modules/react-dom": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -10980,8 +9535,6 @@ }, "node_modules/react-dropzone": { "version": "14.2.3", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", - "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", "license": "MIT", "dependencies": { "attr-accept": "^2.2.2", @@ -10997,8 +9550,6 @@ }, "node_modules/react-error-boundary": { "version": "4.0.13", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz", - "integrity": "sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" @@ -11009,14 +9560,10 @@ }, "node_modules/react-fast-compare": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", "license": "MIT" }, "node_modules/react-force-graph-2d": { "version": "1.25.5", - "resolved": "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.25.5.tgz", - "integrity": "sha512-3u8WjZZorpwZSDs3n3QeOS9ZoxFPM+IR9SStYJVQ/qKECydMHarxnf7ynV/MKJbC6kUsc60soD0V+Uq/r2vz7Q==", "license": "MIT", "dependencies": { "force-graph": "1", @@ -11032,14 +9579,10 @@ }, "node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/react-json-view": { "version": "1.21.3", - "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", - "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", "license": "MIT", "dependencies": { "flux": "^4.0.1", @@ -11054,8 +9597,6 @@ }, "node_modules/react-kapsule": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.4.0.tgz", - "integrity": "sha512-w4Yv9CgWdj8kWGQEPNWFGJJ08dYEZHZpiaFR/DgZjCMBNqv9wus2Gy1qvHVJmJbzvAZbq6jdvFC+NYzEqAlNhQ==", "license": "MIT", "dependencies": { "fromentries": "^1.3.2", @@ -11070,8 +9611,6 @@ }, "node_modules/react-lazylog": { "version": "4.5.3", - "resolved": "https://registry.npmjs.org/react-lazylog/-/react-lazylog-4.5.3.tgz", - "integrity": "sha512-lyov32A/4BqihgXgtNXTHCajXSXkYHPlIEmV8RbYjHIMxCFSnmtdg4kDCI3vATz7dURtiFTvrw5yonHnrS+NNg==", "license": "MPL-2.0", "dependencies": { "@mattiasbuelens/web-streams-polyfill": "^0.2.0", @@ -11088,16 +9627,19 @@ "react": ">=16.3.0" } }, + "node_modules/react-lazylog/node_modules/immutable": { + "version": "3.8.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", "license": "MIT" }, "node_modules/react-overlays": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", - "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.8", @@ -11116,8 +9658,6 @@ }, "node_modules/react-popper": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", "license": "MIT", "dependencies": { "react-fast-compare": "^3.0.1", @@ -11131,8 +9671,6 @@ }, "node_modules/react-redux": { "version": "9.1.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", - "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.3", @@ -11153,12 +9691,10 @@ } }, "node_modules/react-router": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.0.tgz", - "integrity": "sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==", + "version": "6.26.1", "license": "MIT", "dependencies": { - "@remix-run/router": "1.19.0" + "@remix-run/router": "1.19.1" }, "engines": { "node": ">=14.0.0" @@ -11168,13 +9704,11 @@ } }, "node_modules/react-router-dom": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.0.tgz", - "integrity": "sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==", + "version": "6.26.1", "license": "MIT", "dependencies": { - "@remix-run/router": "1.19.0", - "react-router": "6.26.0" + "@remix-run/router": "1.19.1", + "react-router": "6.26.1" }, "engines": { "node": ">=14.0.0" @@ -11186,8 +9720,6 @@ }, "node_modules/react-string-replace": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/react-string-replace/-/react-string-replace-0.4.4.tgz", - "integrity": "sha512-FAMkhxmDpCsGTwTZg7p/2v+/GTmxAp73so3fbSvlAcBBX36ujiGRNEaM/1u+jiYQrArhns+7eE92g2pi5E5FUA==", "license": "MIT", "dependencies": { "lodash": "^4.17.4" @@ -11198,8 +9730,6 @@ }, "node_modules/react-textarea-autosize": { "version": "8.5.3", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz", - "integrity": "sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", @@ -11215,8 +9745,6 @@ }, "node_modules/react-virtualized": { "version": "9.22.5", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.5.tgz", - "integrity": "sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.7.2", @@ -11233,8 +9761,6 @@ }, "node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { @@ -11249,15 +9775,11 @@ }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "license": "MIT" }, "node_modules/rechoir": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dependencies": { "resolve": "^1.1.6" }, @@ -11267,14 +9789,10 @@ }, "node_modules/redux": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "license": "MIT" }, "node_modules/redux-logger": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", - "integrity": "sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==", "dev": true, "license": "MIT", "dependencies": { @@ -11283,8 +9801,6 @@ }, "node_modules/redux-saga": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.3.0.tgz", - "integrity": "sha512-J9RvCeAZXSTAibFY0kGw6Iy4EdyDNW7k6Q+liwX+bsck7QVsU78zz8vpBRweEfANxnnlG/xGGeOvf6r8UXzNJQ==", "license": "MIT", "dependencies": { "@redux-saga/core": "^1.3.0" @@ -11292,8 +9808,6 @@ }, "node_modules/redux-thunk": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", - "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", "license": "MIT", "peerDependencies": { "redux": "^5.0.0" @@ -11301,14 +9815,10 @@ }, "node_modules/regenerator-runtime": { "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "license": "MIT" }, "node_modules/release-zalgo": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, "license": "ISC", "dependencies": { @@ -11320,8 +9830,6 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -11330,8 +9838,6 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11339,27 +9845,19 @@ }, "node_modules/require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true, "license": "ISC" }, "node_modules/reselect": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", - "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", "license": "MIT" }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", "license": "MIT" }, "node_modules/resolve": { "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -11375,8 +9873,6 @@ }, "node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -11385,9 +9881,6 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -11402,8 +9895,6 @@ }, "node_modules/ripemd160": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "license": "MIT", "dependencies": { @@ -11412,9 +9903,7 @@ } }, "node_modules/rollup": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", - "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "version": "4.21.0", "dev": true, "license": "MIT", "dependencies": { @@ -11428,29 +9917,27 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.20.0", - "@rollup/rollup-android-arm64": "4.20.0", - "@rollup/rollup-darwin-arm64": "4.20.0", - "@rollup/rollup-darwin-x64": "4.20.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", - "@rollup/rollup-linux-arm-musleabihf": "4.20.0", - "@rollup/rollup-linux-arm64-gnu": "4.20.0", - "@rollup/rollup-linux-arm64-musl": "4.20.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", - "@rollup/rollup-linux-riscv64-gnu": "4.20.0", - "@rollup/rollup-linux-s390x-gnu": "4.20.0", - "@rollup/rollup-linux-x64-gnu": "4.20.0", - "@rollup/rollup-linux-x64-musl": "4.20.0", - "@rollup/rollup-win32-arm64-msvc": "4.20.0", - "@rollup/rollup-win32-ia32-msvc": "4.20.0", - "@rollup/rollup-win32-x64-msvc": "4.20.0", + "@rollup/rollup-android-arm-eabi": "4.21.0", + "@rollup/rollup-android-arm64": "4.21.0", + "@rollup/rollup-darwin-arm64": "4.21.0", + "@rollup/rollup-darwin-x64": "4.21.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", + "@rollup/rollup-linux-arm-musleabihf": "4.21.0", + "@rollup/rollup-linux-arm64-gnu": "4.21.0", + "@rollup/rollup-linux-arm64-musl": "4.21.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", + "@rollup/rollup-linux-riscv64-gnu": "4.21.0", + "@rollup/rollup-linux-s390x-gnu": "4.21.0", + "@rollup/rollup-linux-x64-gnu": "4.21.0", + "@rollup/rollup-linux-x64-musl": "4.21.0", + "@rollup/rollup-win32-arm64-msvc": "4.21.0", + "@rollup/rollup-win32-ia32-msvc": "4.21.0", + "@rollup/rollup-win32-x64-msvc": "4.21.0", "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-node-builtins": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz", - "integrity": "sha512-bxdnJw8jIivr2yEyt8IZSGqZkygIJOGAWypXvHXnwKAbUcN4Q/dGTx7K0oAJryC/m6aq6tKutltSeXtuogU6sw==", "dev": true, "license": "ISC", "dependencies": { @@ -11460,16 +9947,237 @@ "process-es6": "^0.11.2" } }, + "node_modules/rollup/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", + "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", + "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", + "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", + "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", + "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", + "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", + "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", + "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", + "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", + "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", + "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", + "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", + "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", + "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", + "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/rollup/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/rusha": { "version": "0.8.14", - "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.14.tgz", - "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==", "license": "MIT" }, "node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -11477,8 +10185,6 @@ }, "node_modules/sade": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "license": "MIT", "dependencies": { "mri": "^1.1.0" @@ -11489,8 +10195,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -11510,8 +10214,6 @@ }, "node_modules/sanitize-html": { "version": "2.13.0", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.13.0.tgz", - "integrity": "sha512-Xff91Z+4Mz5QiNSLdLWwjgBDm5b1RU6xBT0+12rapjiaR7SwfRdjw8f+6Rir2MXKLrDicRFHdb51hGOAxmsUIA==", "license": "MIT", "dependencies": { "deepmerge": "^4.2.2", @@ -11524,8 +10226,6 @@ }, "node_modules/sanitize-html/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", "engines": { "node": ">=10" @@ -11536,8 +10236,6 @@ }, "node_modules/scheduler": { "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -11545,8 +10243,6 @@ }, "node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -11563,8 +10259,6 @@ }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", - "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", "license": "MIT", "dependencies": { "compute-scroll-into-view": "^3.0.2" @@ -11572,14 +10266,10 @@ }, "node_modules/seedrandom": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", "license": "MIT" }, "node_modules/semiver": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", - "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", "license": "MIT", "engines": { "node": ">=6" @@ -11587,8 +10277,6 @@ }, "node_modules/semver": { "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "license": "ISC", "bin": { @@ -11600,21 +10288,15 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, "license": "ISC" }, "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "license": "MIT" }, "node_modules/sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "license": "(MIT AND BSD-3-Clause)", "dependencies": { @@ -11627,8 +10309,6 @@ }, "node_modules/shader-loader": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/shader-loader/-/shader-loader-1.3.1.tgz", - "integrity": "sha512-dt8F9K0x4rjmaFyHh7rNDfpt4LUiR64zhNIEwp2WbE99B3z4ALuvvmhftkElg93dUD6sTmv/aXa/z9SJiEddcA==", "license": "MIT", "dependencies": { "loader-utils": "^1.1.0" @@ -11636,8 +10316,6 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -11649,8 +10327,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -11659,8 +10335,6 @@ }, "node_modules/shelljs": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", @@ -11676,28 +10350,20 @@ }, "node_modules/shlex": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/shlex/-/shlex-2.1.2.tgz", - "integrity": "sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==", "license": "MIT" }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/sirv": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", @@ -11710,8 +10376,6 @@ }, "node_modules/sirv-cli": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-2.0.2.tgz", - "integrity": "sha512-OtSJDwxsF1NWHc7ps3Sa0s+dPtP15iQNJzfKVz+MxkEo3z72mCD+yu30ct79rPr0CaV1HXSOBp+MIY5uIhHZ1A==", "license": "MIT", "dependencies": { "console-clear": "^1.1.0", @@ -11732,8 +10396,6 @@ }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -11742,8 +10404,6 @@ }, "node_modules/source-map-js": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -11751,14 +10411,10 @@ }, "node_modules/spark-md5": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", - "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==", "license": "(WTFPL OR MIT)" }, "node_modules/spawn-wrap": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "license": "ISC", "dependencies": { @@ -11775,8 +10431,6 @@ }, "node_modules/spawn-wrap/node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { @@ -11791,8 +10445,6 @@ }, "node_modules/spawn-wrap/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -11801,8 +10453,6 @@ }, "node_modules/split-on-first": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", - "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", "license": "MIT", "engines": { "node": ">=12" @@ -11813,28 +10463,20 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/std-env": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true, "license": "MIT" }, "node_modules/stream-browserify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "license": "MIT", "dependencies": { "inherits": "~2.0.4", @@ -11843,8 +10485,6 @@ }, "node_modules/stream-browserify/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -11857,8 +10497,6 @@ }, "node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -11866,27 +10504,19 @@ }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/string-convert": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", "license": "MIT" }, "node_modules/string-range": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "integrity": "sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==", "dev": true, "license": "MIT" }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -11900,8 +10530,6 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -11913,8 +10541,6 @@ }, "node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { @@ -11923,8 +10549,6 @@ }, "node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "license": "MIT", "engines": { @@ -11936,8 +10560,6 @@ }, "node_modules/strip-literal": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", - "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", "dev": true, "license": "MIT", "dependencies": { @@ -11949,21 +10571,15 @@ }, "node_modules/strip-literal/node_modules/js-tokens": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", "dev": true, "license": "MIT" }, "node_modules/stylis": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", "license": "MIT" }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -11975,8 +10591,6 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -11987,14 +10601,10 @@ }, "node_modules/tabbable": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", "license": "MIT" }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", "dependencies": { @@ -12007,14 +10617,10 @@ } }, "node_modules/text-encoding-utf-8": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", - "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" + "version": "1.0.2" }, "node_modules/throttle-debounce": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", - "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", "license": "MIT", "engines": { "node": ">=12.22" @@ -12022,21 +10628,15 @@ }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinycolor2": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "license": "MIT" }, "node_modules/tinydate": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", - "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", "license": "MIT", "engines": { "node": ">=4" @@ -12044,8 +10644,6 @@ }, "node_modules/tinypool": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", "dev": true, "license": "MIT", "engines": { @@ -12054,8 +10652,6 @@ }, "node_modules/tinyrainbow": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "dev": true, "license": "MIT", "engines": { @@ -12064,8 +10660,6 @@ }, "node_modules/tinyspy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", "dev": true, "license": "MIT", "engines": { @@ -12074,8 +10668,6 @@ }, "node_modules/to-fast-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "license": "MIT", "engines": { "node": ">=4" @@ -12083,14 +10675,10 @@ }, "node_modules/toggle-selection": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", "license": "MIT" }, "node_modules/totalist": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "license": "MIT", "engines": { "node": ">=6" @@ -12098,20 +10686,14 @@ }, "node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, "node_modules/tslib": { "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "license": "0BSD" }, "node_modules/type-fest": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -12120,22 +10702,16 @@ }, "node_modules/typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, "license": "MIT" }, "node_modules/typedarray-to-buffer": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", - "integrity": "sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==", "dev": true, "license": "MIT" }, "node_modules/typescript": { "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -12147,8 +10723,6 @@ }, "node_modules/typescript-compare": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", - "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", "license": "MIT", "dependencies": { "typescript-logic": "^0.0.0" @@ -12156,14 +10730,10 @@ }, "node_modules/typescript-logic": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", - "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==", "license": "MIT" }, "node_modules/typescript-tuple": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", - "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", "license": "MIT", "dependencies": { "typescript-compare": "^0.0.2" @@ -12171,8 +10741,6 @@ }, "node_modules/ua-parser-js": { "version": "1.0.38", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz", - "integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==", "funding": [ { "type": "opencollective", @@ -12194,8 +10762,6 @@ }, "node_modules/uncontrollable": { "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.3", @@ -12208,15 +10774,11 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.6", "license": "MIT" }, "node_modules/universal-cookie": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.2.0.tgz", - "integrity": "sha512-PvcyflJAYACJKr28HABxkGemML5vafHmiL4ICe3e+BEKXRMt0GaFLZhAwgv637kFFnnfiSJ8e6jknrKkMrU+PQ==", "license": "MIT", "dependencies": { "@types/cookie": "^0.6.0", @@ -12225,8 +10787,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -12255,8 +10815,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -12264,8 +10822,6 @@ }, "node_modules/use-ackee": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use-ackee/-/use-ackee-3.1.0.tgz", - "integrity": "sha512-RPX51I/Ak6dtNW0aXY6GM/LJ899OU4qoKes/CTGj9+4Qoz9PO7I14BX8Rw6vmlbVvQzZ6WIb01sg7vU/kYEQOw==", "license": "MIT", "dependencies": { "ackee-tracker": "^5.1.0" @@ -12279,8 +10835,6 @@ }, "node_modules/use-composed-ref": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -12288,8 +10842,6 @@ }, "node_modules/use-immer": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/use-immer/-/use-immer-0.9.0.tgz", - "integrity": "sha512-/L+enLi0nvuZ6j4WlyK0US9/ECUtV5v9RUbtxnn5+WbtaXYUaOBoKHDNL9I5AETdurQ4rIFIj/s+Z5X80ATyKw==", "license": "MIT", "peerDependencies": { "immer": ">=2.0.0", @@ -12298,8 +10850,6 @@ }, "node_modules/use-isomorphic-layout-effect": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -12312,8 +10862,6 @@ }, "node_modules/use-latest": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", - "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", "license": "MIT", "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" @@ -12329,8 +10877,6 @@ }, "node_modules/use-sync-external-store": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -12338,14 +10884,10 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -12357,8 +10899,6 @@ }, "node_modules/victory-area": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-36.9.2.tgz", - "integrity": "sha512-32aharvPf2RgdQB+/u1j3/ajYFNH/7ugLX9ZRpdd65gP6QEbtXL+58gS6CxvFw6gr/y8a0xMlkMKkpDVacXLpw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12371,8 +10911,6 @@ }, "node_modules/victory-axis": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-36.9.2.tgz", - "integrity": "sha512-4Odws+IAjprJtBg2b2ZCxEPgrQ6LgIOa22cFkGghzOSfTyNayN4M3AauNB44RZyn2O/hDiM1gdBkEg1g9YDevQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12384,8 +10922,6 @@ }, "node_modules/victory-bar": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-36.9.2.tgz", - "integrity": "sha512-R3LFoR91FzwWcnyGK2P8DHNVv9gsaWhl5pSr2KdeNtvLbZVEIvUkTeVN9RMBMzterSFPw0mbWhS1Asb3sV6PPw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12398,8 +10934,6 @@ }, "node_modules/victory-box-plot": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-36.9.2.tgz", - "integrity": "sha512-nUD45V/YHDkAKZyak7YDsz+Vk1F9N0ica3jWQe0AY0JqD9DleHa8RY/olSVws26kLyEj1I+fQqva6GodcLaIqQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12412,8 +10946,6 @@ }, "node_modules/victory-brush-container": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-36.9.2.tgz", - "integrity": "sha512-KcQjzFeo40tn52cJf1A02l5MqeR9GKkk3loDqM3T2hfi1PCyUrZXEUjGN5HNlLizDRvtcemaAHNAWlb70HbG/g==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12426,8 +10958,6 @@ }, "node_modules/victory-chart": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-36.9.2.tgz", - "integrity": "sha512-dMNcS0BpqL3YiGvI4BSEmPR76FCksCgf3K4CSZ7C/MGyrElqB6wWwzk7afnlB1Qr71YIHXDmdwsPNAl/iEwTtA==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12443,8 +10973,6 @@ }, "node_modules/victory-core": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.21", @@ -12457,8 +10985,6 @@ }, "node_modules/victory-create-container": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-36.9.2.tgz", - "integrity": "sha512-uA0dh1R0YDzuXyE/7StZvq4qshet+WYceY7R1UR5mR/F9079xy+iQsa2Ca4h97/GtVZoLO6r1eKLWBt9TN+U7A==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12475,8 +11001,6 @@ }, "node_modules/victory-cursor-container": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-36.9.2.tgz", - "integrity": "sha512-jidab4j3MaciF3fGX70jTj4H9rrLcY8o2LUrhJ67ZLvEFGGmnPtph+p8Fe97Umrag7E/DszjNxQZolpwlgUh3g==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12488,8 +11012,6 @@ }, "node_modules/victory-group": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-36.9.2.tgz", - "integrity": "sha512-wBmpsjBTKva8mxHvHNY3b8RE58KtnpLLItEyyAHaYkmExwt3Uj8Cld3sF3vmeuijn2iR64NPKeMbgMbfZJzycw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12503,8 +11025,6 @@ }, "node_modules/victory-legend": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-36.9.2.tgz", - "integrity": "sha512-cucFJpv6fty+yXp5pElQFQnHBk1TqA4guGUMI+XF/wLlnuM4bhdAtASobRIIBkz0mHGBaCAAV4PzL9azPU/9dg==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12516,8 +11036,6 @@ }, "node_modules/victory-line": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-36.9.2.tgz", - "integrity": "sha512-kmYFZUo0o2xC8cXRsmt/oUBRQSZJVT2IJnAkboUepypoj09e6CY5tRH4TSdfEDGkBk23xQkn7d4IFgl4kAGnSA==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12530,8 +11048,6 @@ }, "node_modules/victory-pie": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-36.9.2.tgz", - "integrity": "sha512-i3zWezvy5wQEkhXKt4rS9ILGH7Vr9Q5eF9fKO4GMwDPBdYOTE3Dh2tVaSrfDC8g9zFIc0DKzOtVoJRTb+0AkPg==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12544,8 +11060,6 @@ }, "node_modules/victory-polar-axis": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-36.9.2.tgz", - "integrity": "sha512-HBR90FF4M56yf/atXjSmy3DMps1vSAaLXmdVXLM/A5g+0pUS7HO719r5x6dsR3I6Rm+8x6Kk8xJs0qgpnGQIEw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12557,8 +11071,6 @@ }, "node_modules/victory-scatter": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-36.9.2.tgz", - "integrity": "sha512-hK9AtbJQfaW05i8BH7Lf1HK7vWMAfQofj23039HEQJqTKbCL77YT+Q0LhZw1a1BRCpC/5aSg9EuqblhfIYw2wg==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12570,8 +11082,6 @@ }, "node_modules/victory-selection-container": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-36.9.2.tgz", - "integrity": "sha512-chboroEwqqVlMB60kveXM2WznJ33ZM00PWkFVCoJDzHHlYs7TCADxzhqet2S67SbZGSyvSprY2YztSxX8kZ+XQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12583,8 +11093,6 @@ }, "node_modules/victory-shared-events": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-36.9.2.tgz", - "integrity": "sha512-W/atiw3Or6MnpBuhluFv6007YrixIRh5NtiRvtFLGxNuQJLYjaSh6koRAih5xJer5Pj7YUx0tL9x67jTRcJ6Dg==", "license": "MIT", "dependencies": { "json-stringify-safe": "^5.0.1", @@ -12598,8 +11106,6 @@ }, "node_modules/victory-stack": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-36.9.2.tgz", - "integrity": "sha512-imR6FniVlDFlBa/B3Est8kTryNhWj2ZNpivmVOebVDxkKcVlLaDg3LotCUOI7NzOhBQaro0UzeE9KmZV93JcYA==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12613,8 +11119,6 @@ }, "node_modules/victory-tooltip": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-36.9.2.tgz", - "integrity": "sha512-76seo4TWD1WfZHJQH87IP3tlawv38DuwrUxpnTn8+uW6/CUex82poQiVevYdmJzhataS9jjyCWv3w7pOmLBCLg==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12626,8 +11130,6 @@ }, "node_modules/victory-vendor": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", - "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", "license": "MIT AND ISC", "dependencies": { "@types/d3-array": "^3.0.3", @@ -12648,8 +11150,6 @@ }, "node_modules/victory-voronoi-container": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-36.9.2.tgz", - "integrity": "sha512-NIVYqck9N4OQnEz9mgQ4wILsci3OBWWK7RLuITGHyoD7Ne/+WH1i0Pv2y9eIx+f55rc928FUTugPPhkHvXyH3A==", "license": "MIT", "dependencies": { "delaunay-find": "0.0.6", @@ -12664,8 +11164,6 @@ }, "node_modules/victory-zoom-container": { "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-36.9.2.tgz", - "integrity": "sha512-pXa2Ji6EX/pIarKT6Hcmmu2n7IG/x8Vs0D2eACQ/nbpvZa+DXWIxCRW4hcg2Va35fmXcDIEpGaX3/soXzZ+pbw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -12676,14 +11174,12 @@ } }, "node_modules/vite": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", - "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", + "version": "5.4.1", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.40", + "postcss": "^8.4.41", "rollup": "^4.13.0" }, "bin": { @@ -12737,8 +11233,6 @@ }, "node_modules/vite-node": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", - "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12760,8 +11254,6 @@ }, "node_modules/vite-plugin-babel-macros": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/vite-plugin-babel-macros/-/vite-plugin-babel-macros-1.0.6.tgz", - "integrity": "sha512-7cCT8jtu5UjpE46pH7RyVltWw5FbhDAtQliZ6QGqRNR5RUZKdAsB0CDjuF+VBoDpnl0KuESPu22SoNqXRYYWyQ==", "license": "MIT", "dependencies": { "@babel/core": "^7.17.7", @@ -12779,8 +11271,6 @@ }, "node_modules/vite-plugin-istanbul": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vite-plugin-istanbul/-/vite-plugin-istanbul-5.0.0.tgz", - "integrity": "sha512-Tg9zDmm/u4SdEDFbEWHBz7mmFe7jhLRmArA2XCmw5yydEFCARU9r4TxqFFnBFWCL63D9A7XA7VELulOO5T5o/g==", "dev": true, "license": "MIT", "dependencies": { @@ -12796,8 +11286,6 @@ }, "node_modules/vite-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -12813,8 +11301,6 @@ }, "node_modules/vite-plugin-istanbul/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -12838,8 +11324,6 @@ }, "node_modules/vitest": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", - "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", "dev": true, "license": "MIT", "dependencies": { @@ -12903,22 +11387,16 @@ }, "node_modules/warning": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/webgl-constants": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", - "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + "version": "1.1.1" }, "node_modules/webidl-conversions": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -12927,20 +11405,14 @@ }, "node_modules/webworker-promise": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/webworker-promise/-/webworker-promise-0.5.0.tgz", - "integrity": "sha512-14iR79jHAV7ozwvbfif+3wCaApT3I1g8Lo0rJZrwAu6wxZGx/08Y8KXz6as6ZLNUEEufeiEBBYrqyDBClXOsEw==", "license": "MIT" }, "node_modules/whatwg-fetch": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, "license": "MIT", "engines": { @@ -12949,8 +11421,6 @@ }, "node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -12959,14 +11429,10 @@ }, "node_modules/whatwg-url/node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -12981,15 +11447,11 @@ }, "node_modules/which-module": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true, "license": "ISC" }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -13005,8 +11467,6 @@ }, "node_modules/worker-loader": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz", - "integrity": "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", @@ -13025,8 +11485,6 @@ }, "node_modules/worker-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -13039,8 +11497,6 @@ }, "node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "license": "MIT", "dependencies": { @@ -13054,8 +11510,6 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -13070,8 +11524,6 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13083,21 +11535,15 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "license": "ISC", "dependencies": { @@ -13109,8 +11555,6 @@ }, "node_modules/write-file-atomic/node_modules/typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13119,8 +11563,6 @@ }, "node_modules/xmlbuilder2": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.0.2.tgz", - "integrity": "sha512-h4MUawGY21CTdhV4xm3DG9dgsqyhDkZvVJBx88beqX8wJs3VgyGQgAn5VreHuae6unTQxh115aMK5InCVmOIKw==", "license": "MIT", "dependencies": { "@oozcitak/dom": "1.15.10", @@ -13135,8 +11577,6 @@ }, "node_modules/xmlbuilder2/node_modules/js-yaml": { "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -13148,8 +11588,6 @@ }, "node_modules/xss": { "version": "1.0.14", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", - "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", "license": "MIT", "dependencies": { "commander": "^2.20.3", @@ -13164,14 +11602,10 @@ }, "node_modules/xss/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, "node_modules/xtend": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", "dev": true, "engines": { "node": ">=0.4" @@ -13179,21 +11613,15 @@ }, "node_modules/y18n": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, "license": "ISC" }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "license": "ISC", "engines": { "node": ">= 6" @@ -13201,8 +11629,6 @@ }, "node_modules/yargs": { "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "license": "MIT", "dependencies": { @@ -13224,8 +11650,6 @@ }, "node_modules/yargs-parser": { "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 4eb923dcb..817d292ab 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,6 @@ "niivue-react": "github:niivue/niivue-react", "npm": "^10.8.2", "p-queue": "^8.0.1", - "package.json": "^0.0.0", "pako": "^1.0.11", "preval.macro": "^5.0.0", "query-string": "^9.0.0", diff --git a/src/components/FeedOutputBrowser/useFeedBrowser.tsx b/src/components/FeedOutputBrowser/useFeedBrowser.tsx index 9ae9ccc55..9c5802e5a 100644 --- a/src/components/FeedOutputBrowser/useFeedBrowser.tsx +++ b/src/components/FeedOutputBrowser/useFeedBrowser.tsx @@ -90,17 +90,6 @@ export const useFeedBrowser = () => { const selected = useTypedSelector((state) => state.instance.selectedPlugin); const { data: plugins } = pluginInstances; - const { - data: pluginFilesPayload, - isLoading: filesLoading, - isError, - error, - } = useQuery({ - queryKey: ["pluginFiles", currentPath], - queryFn: () => fetchFilesFromAPath(currentPath), - enabled: !!selected && !!currentPath, - }); - const statusTitle = useTypedSelector((state) => { if (selected) { const id = selected.data.id; @@ -110,7 +99,21 @@ export const useFeedBrowser = () => { } }); - const finished = selected && status.includes(selected?.data.status); + const finished = !!( + (selected && status.includes(selected?.data.status)) || + (statusTitle && status.includes(statusTitle)) + ); + + const { + data: pluginFilesPayload, + isLoading: filesLoading, + isError, + error, + } = useQuery({ + queryKey: ["pluginFiles", currentPath], + queryFn: () => fetchFilesFromAPath(currentPath), + enabled: !!selected && !!currentPath && finished, + }); React.useEffect(() => { if ((statusTitle && status.includes(statusTitle)) || finished) { From 1f7320a0969056a51e6db2486bc43eab30b31c07 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 19 Aug 2024 10:22:22 -0400 Subject: [PATCH 113/337] feat: Implement missing features in the file browser table --- .../FeedOutputBrowser/FileBrowser.tsx | 52 +++++++++---------- src/components/Feeds/FeedListView.tsx | 2 +- .../NewLibrary/components/Operations.css | 3 ++ .../NewLibrary/components/Operations.tsx | 20 +++++-- src/store/resources/resourceSlice.ts | 3 +- 5 files changed, 47 insertions(+), 33 deletions(-) create mode 100644 src/components/NewLibrary/components/Operations.css diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 978987d12..4eca4e641 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -29,7 +29,7 @@ import { ClipboardCopyContainer, SpinContainer, getIcon } from "../Common"; import { ThemeContext } from "../DarkTheme/useTheme"; import { DrawerActionButton } from "../Feeds/DrawerUtils"; import { handleMaximize, handleMinimize } from "../Feeds/utilties"; -import { DownloadIcon, HomeIcon } from "../Icons"; +import { HomeIcon } from "../Icons"; import useLongPress, { getBackgroundRowColor, } from "../NewLibrary/utils/longpress"; @@ -39,6 +39,7 @@ import type { FileBrowserProps } from "./types"; import { bytesToSize } from "./utilities"; import { FolderContextMenu } from "../NewLibrary/components/ContextMenu"; import Operations from "../NewLibrary/components/Operations"; +import { format } from "date-fns"; const previewAnimation = [{ opacity: "0.0" }, { opacity: "1.0" }]; @@ -46,6 +47,12 @@ const previewAnimationTiming = { duration: 1000, iterations: 1, }; +const columnNames = { + name: "Name", + created: "Created", + creator: "Creator", + size: "Size", +}; const FileBrowser = (props: FileBrowserProps) => { const { handlers } = useLongPress(); @@ -68,11 +75,7 @@ const FileBrowser = (props: FileBrowserProps) => { const username = useTypedSelector((state) => state.user.username); const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { folderFiles, linkFiles, children, path } = pluginFilesPayload; - const columnNames = { - name: "Name", - size: "Size", - download: "", - }; + const breadcrumb = path.split("/"); const currentPath = `home/${username}/feeds/feed_${feed?.data.id}/${selected?.data.plugin_name}_${selected?.data.id}/data`; @@ -235,25 +238,11 @@ const FileBrowser = (props: FileBrowserProps) => {
); - const downloadComponent = - type !== "file" ? undefined : ( -
{ onClick={(e) => { handleOnClick(e, item, path, type); }} + onContextMenu={(e) => { + handleOnClick(e, item, path, type); + }} > + + - ); @@ -292,6 +287,7 @@ const FileBrowser = (props: FileBrowserProps) => { {drawerState.files.open && ( {
diff --git a/src/components/Feeds/Feeds.css b/src/components/Feeds/Feeds.css index d0c174a5b..311c11f98 100644 --- a/src/components/Feeds/Feeds.css +++ b/src/components/Feeds/Feeds.css @@ -35,5 +35,6 @@ fill: white !important; } - - \ No newline at end of file + .feed-table tbody:where(.pf-v5-c-table__tbody) > tr:where(.pf-v5-c-table__tr) > * { + vertical-align:middle !important; +} \ No newline at end of file From 8927e233973ad233f69202e12c75d2920573fe11 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 14 Aug 2024 16:37:39 -0400 Subject: [PATCH 110/337] feat: Update the File Browser in the Feed View to use the operations and folder context menu hooks --- src/components/Common/index.tsx | 20 +-- src/components/CreateFeed/ChrisFileSelect.tsx | 12 +- src/components/CreateFeed/utils.ts | 38 +++-- .../FeedOutputBrowser/FeedOutputBrowser.tsx | 12 +- .../FeedOutputBrowser/FileBrowser.tsx | 80 ++++++++-- src/components/FeedOutputBrowser/types.ts | 16 +- .../FeedOutputBrowser/useFeedBrowser.tsx | 149 ++++++++++++------ src/components/Icons/index.tsx | 15 +- src/store/resources/resourceSlice.ts | 51 +----- src/store/resources/saga.ts | 93 +---------- src/store/resources/types.ts | 9 -- 11 files changed, 240 insertions(+), 255 deletions(-) diff --git a/src/components/Common/index.tsx b/src/components/Common/index.tsx index 7f6241372..3b7f22feb 100644 --- a/src/components/Common/index.tsx +++ b/src/components/Common/index.tsx @@ -361,25 +361,27 @@ export const ClipboardCopyFixed = ({ ); }; -export const getIcon = (type: string) => { +export const getIcon = (type: string, isDarkTheme: boolean) => { + const color = isDarkTheme ? "#FFFFFF" : "#000000"; // white for dark theme, black for light theme + const iconStyle = { color }; switch (type.toLowerCase()) { case "dir": - return ; + return ; case "dcm": case "jpg": case "png": - return ; + return ; case "txt": - return ; + return ; case "pdf": - return ; + return ; case "zip": - return ; + return ; case "link": - return ; + return ; case "folder": - return ; + return ; default: - return ; + return ; } }; diff --git a/src/components/CreateFeed/ChrisFileSelect.tsx b/src/components/CreateFeed/ChrisFileSelect.tsx index 6e779ea28..b5c12a28a 100644 --- a/src/components/CreateFeed/ChrisFileSelect.tsx +++ b/src/components/CreateFeed/ChrisFileSelect.tsx @@ -23,14 +23,14 @@ export function clearCache() { function getEmptyTree(username: string) { const node: DataBreadcrumb[] = []; node.push({ - breadcrumb: username, - title: username, + breadcrumb: `home/${username}`, + title: `home/${username}`, checkable: false, key: "0-0", }); node.push({ - breadcrumb: "SERVICES", - title: "SERVICES", + breadcrumb: "/SERVICES", + title: "/SERVICES", checkable: false, key: "0-1", }); @@ -81,7 +81,7 @@ const ChrisFileSelect: React.FC = ({ }, }); notification.info({ - message: `New File(s) added`, + message: "New File(s) added", description: `New ${path} file(s) added`, duration: 1, }); @@ -94,7 +94,7 @@ const ChrisFileSelect: React.FC = ({ }, }); notification.info({ - message: `File(s) removed`, + message: "File(s) removed", description: `${path} file(s) removed`, duration: 1, }); diff --git a/src/components/CreateFeed/utils.ts b/src/components/CreateFeed/utils.ts index 0e75440f3..a55418407 100644 --- a/src/components/CreateFeed/utils.ts +++ b/src/components/CreateFeed/utils.ts @@ -1,7 +1,7 @@ import type { PluginMeta, Tag, Pipeline } from "@fnndsc/chrisapi"; import type { EventDataNode } from "rc-tree/lib/interface"; import type { DataBreadcrumb } from "./types/feed"; -import { fetchFilesFromAPath } from "../../store/resources/saga"; +import { fetchFilesFromAPath } from "../FeedOutputBrowser/useFeedBrowser"; import ChrisAPIClient from "../../api/chrisapiclient"; import { fetchResource, fetchResources } from "../../api/common"; @@ -72,29 +72,37 @@ export const generateTreeNodes = async ( checkable: boolean; }[] = []; //@ts-ignore - const { files, folders } = await fetchFilesFromAPath(treeNode.breadcrumb); - const items = [...files, ...folders]; + const { folderFiles, linkFiles, children } = await fetchFilesFromAPath( + treeNode.breadcrumb, + ); + const items = [...folderFiles, ...linkFiles, ...children]; for (let i = 0; i < items.length; i++) { - if (typeof items[i] === "object") { - const filePath = items[i].data.fname.split("/"); - const fileName = filePath[filePath.length - 1]; + const item = items[i]; + if (item.data.path) { + // assume to be a folder or a link as files have fname's property + const path = item.data.path; + const fileNameList = path.split("/"); + const fileName = fileNameList[fileNameList.length - 1]; + arr.push({ - breadcrumb: `${treeNode.breadcrumb}/${fileName}`, + breadcrumb: path, title: fileName, key: `${treeNode.key}-${i}`, - isLeaf: true, - checkable: false, + isLeaf: false, + checkable: true, }); } else { - const checkList = ["uploads", "SERVICES", "PACS"]; - const isCheckable = !checkList.includes(items[i]); + // assumed to be a file + const path = item.data.fname; + const fileNameList = path.split("/"); + const fileName = fileNameList[fileNameList.length - 1]; arr.push({ - breadcrumb: `${treeNode.breadcrumb}/${items[i]}`, - title: items[i], + breadcrumb: `${treeNode.breadcrumb}/${fileName}`, + title: fileName, key: `${treeNode.key}-${i}`, - isLeaf: false, - checkable: isCheckable, + isLeaf: true, + checkable: true, }); } } diff --git a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx index 4ff889bbe..825522e45 100644 --- a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx +++ b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx @@ -5,10 +5,10 @@ import { EmptyStateVariant, Title, } from "@patternfly/react-core"; +import { Alert } from "../Antd"; import { SpinContainer } from "../Common"; import FileBrowser from "./FileBrowser"; import { useFeedBrowser } from "./useFeedBrowser"; - import "./FeedOutputBrowser.css"; export interface FeedOutputBrowserProps { @@ -25,21 +25,25 @@ const FeedOutputBrowser: React.FC = () => { statusTitle, handleFileClick, filesLoading, + isError, + error, + inValidateFolders, } = useFeedBrowser(); return (
- {pluginFilesPayload && selected ? ( + {pluginFilesPayload && selected && !isError ? ( ) : statusTitle && statusTitles.includes(statusTitle) ? ( - ) : filesLoading ? ( - + ) : isError ? ( + ) : ( )} diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 285008b16..4379eff3c 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -1,3 +1,7 @@ +import type { + FileBrowserFolder, + FileBrowserFolderFile, +} from "@fnndsc/chrisapi"; import { Breadcrumb, BreadcrumbItem, @@ -26,10 +30,15 @@ import { ThemeContext } from "../DarkTheme/useTheme"; import { DrawerActionButton } from "../Feeds/DrawerUtils"; import { handleMaximize, handleMinimize } from "../Feeds/utilties"; import { DownloadIcon, HomeIcon } from "../Icons"; +import useLongPress, { + getBackgroundRowColor, +} from "../NewLibrary/utils/longpress"; import FileDetailView from "../Preview/FileDetailView"; import XtkViewer from "../XtkViewer/XtkViewer"; import type { FileBrowserProps } from "./types"; import { bytesToSize } from "./utilities"; +import { FolderContextMenu } from "../NewLibrary/components/ContextMenu"; +import Operations from "../NewLibrary/components/Operations"; const previewAnimation = [{ opacity: "0.0" }, { opacity: "1.0" }]; @@ -39,16 +48,25 @@ const previewAnimationTiming = { }; const FileBrowser = (props: FileBrowserProps) => { + const { handlers } = useLongPress(); + const { handleOnClick } = handlers; const dispatch = useDispatch(); const feed = useTypedSelector((state) => state.feed.currentFeed.data); const handleDownloadMutation = useDownload(feed); const [api, contextHolder] = notification.useNotification(); const { isSuccess, isError, error: downloadError } = handleDownloadMutation; const { isDarkTheme } = useContext(ThemeContext); - const { pluginFilesPayload, handleFileClick, selected, filesLoading } = props; + const { + pluginFilesPayload, + handleFileClick, + selected, + filesLoading, + inValidateFolders, + } = props; const selectedFile = useTypedSelector((state) => state.explorer.selectedFile); const drawerState = useTypedSelector((state) => state.drawers); const username = useTypedSelector((state) => state.user.username); + const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { folderFiles, linkFiles, children, path } = pluginFilesPayload; const columnNames = { name: "Name", @@ -125,14 +143,17 @@ const FileBrowser = (props: FileBrowserProps) => { ?.animate(previewAnimation, previewAnimationTiming); }; - const handleItem = (item: any, type: string) => { + const handleItem = ( + item: FileBrowserFolderFile | FileBrowserFolder, + type: string, + ) => { if (type === "link" || type === "folder") { handleFileClick(item.data.path); } if (type === "file") { toggleAnimation(); - dispatch(setSelectedFile(item)); + dispatch(setSelectedFile(item as FileBrowserFolderFile)); !drawerState.preview.open && dispatch(setFilePreviewPanel()); } }; @@ -188,17 +209,30 @@ const FileBrowser = (props: FileBrowserProps) => { } const isPreviewing = selectedFile === item; const backgroundColor = isDarkTheme ? "#002952" : "#E7F1FA"; + const path = type === "file" ? item.data.fname : item.data.path; - icon = getIcon(iconType); + const isSelected = + selectedPaths.length > 0 && + selectedPaths.some((payload) => payload.path === path); + const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); + + icon = getIcon(iconType, isDarkTheme); const fileNameComponent = (
- {icon} - {fileName} +
); const downloadComponent = @@ -213,17 +247,27 @@ const FileBrowser = (props: FileBrowserProps) => { icon={} /> ); + return ( -
{fileNameComponent}{fsize}{downloadComponent}
{fileNameComponent}{fsize}{downloadComponent}
{fileNameComponent} + {format(new Date(item.data.creation_date), "dd MMM yyyy, HH:mm")} + {item.data.owner_username} {fsize}{downloadComponent}
- + - - - + + + + {filesLoading ? ( diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 918a7cacc..82910e64f 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -227,7 +227,7 @@ const TableSelectable: React.FC = () => { {loadingFeedState ? ( diff --git a/src/components/NewLibrary/components/Operations.css b/src/components/NewLibrary/components/Operations.css new file mode 100644 index 000000000..38ac06190 --- /dev/null +++ b/src/components/NewLibrary/components/Operations.css @@ -0,0 +1,3 @@ +.remove-toolbar-padding { + padding-top: 0 !important; +} \ No newline at end of file diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index e0bd15c36..c2ec1d0e8 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -36,6 +36,7 @@ import { MergeIcon, } from "../../Icons"; import { useFolderOperations } from "../utils/useOperations"; +import "./Operations.css"; interface AddModalProps { isOpen: boolean; @@ -54,7 +55,12 @@ interface OperationProps { inValidateFolders: () => void; computedPath?: string; folderList?: FileBrowserFolderList; - customStyle?: React.CSSProperties; + customStyle?: { + [key: string]: React.CSSProperties; + }; + customClassName?: { + [key: string]: string; + }; } export const AddModal = (props: AddModalProps) => { @@ -115,7 +121,13 @@ const items = [ ]; const Operations = React.forwardRef((props: OperationProps, ref) => { - const { inValidateFolders, computedPath, folderList, customStyle } = props; + const { + inValidateFolders, + computedPath, + folderList, + customStyle, + customClassName, + } = props; const dispatch = useDispatch(); const { modalInfo, @@ -315,8 +327,8 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { hidden onChange={handleFolderChange} /> - - + + {toolbarItems} diff --git a/src/store/resources/resourceSlice.ts b/src/store/resources/resourceSlice.ts index a5a66524f..466b55a08 100644 --- a/src/store/resources/resourceSlice.ts +++ b/src/store/resources/resourceSlice.ts @@ -40,9 +40,8 @@ const resourceSlice = createSlice({ }, getPluginInstanceStatusRequest( _state, - action: PayloadAction, + _action: PayloadAction, ) { - console.log("DIspatch Called", action); // No state mutation needed for this action }, getPluginInstanceStatusSuccess( From 4c88b0d53afbcddfdc265911a2aea244a0595799 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 19 Aug 2024 14:43:26 -0400 Subject: [PATCH 114/337] feat: Share a folder --- src/components/Feeds/FeedListView.tsx | 8 +- src/components/Icons/index.tsx | 8 +- .../NewLibrary/components/ContextMenu.tsx | 30 ++++-- .../NewLibrary/components/FileCard.tsx | 2 +- .../NewLibrary/components/FolderCard.tsx | 2 +- .../NewLibrary/components/Operations.tsx | 95 +++++++++++++++++-- .../NewLibrary/utils/useOperations.tsx | 44 ++++++++- src/routes.tsx | 9 +- 8 files changed, 175 insertions(+), 23 deletions(-) diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 82910e64f..2c83c28e8 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -32,7 +32,7 @@ import { CreateFeedProvider } from "../CreateFeed/context"; import { ThemeContext } from "../DarkTheme/useTheme"; import { SearchIcon } from "../Icons"; import { FolderContextMenu } from "../NewLibrary/components/ContextMenu"; -import Operations from "../NewLibrary/components/Operations"; +import Operations, { ContextTypes } from "../NewLibrary/components/Operations"; import useLongPress from "../NewLibrary/utils/longpress"; import { PipelineProvider } from "../PipelinesCopy/context"; import WrapperConnect from "../Wrapper"; @@ -228,6 +228,7 @@ const TableSelectable: React.FC = () => { {loadingFeedState ? ( @@ -343,7 +344,10 @@ const TableRow: React.FC = ({ }; return ( - + { +const ShareIcon = ({ + className, + style, +}: { className?: string; style?: React.CSSProperties }) => { return ( diff --git a/src/components/NewLibrary/components/ContextMenu.tsx b/src/components/NewLibrary/components/ContextMenu.tsx index 5a2fb8ac9..204c84ff2 100644 --- a/src/components/NewLibrary/components/ContextMenu.tsx +++ b/src/components/NewLibrary/components/ContextMenu.tsx @@ -8,19 +8,22 @@ import { DownloadIcon, DuplicateIcon, MergeIcon, + ShareIcon, } from "../../Icons"; import { useFolderOperations } from "../utils/useOperations"; -import { AddModal } from "./Operations"; +import { AddModal, type ContextTypes } from "./Operations"; interface ContextMenuProps { children: React.ReactElement; computedPath?: string; inValidateFolders: () => void; folderList?: FileBrowserFolderList; + context?: ContextTypes; } export const FolderContextMenu = (props: ContextMenuProps) => { - const { children, inValidateFolders, folderList, computedPath } = props; + const { children, inValidateFolders, folderList, computedPath, context } = + props; const { modalInfo, userError, @@ -29,7 +32,7 @@ export const FolderContextMenu = (props: ContextMenuProps) => { contextHolder, setUserErrors, setModalInfo, - } = useFolderOperations(inValidateFolders, computedPath, folderList); + } = useFolderOperations(inValidateFolders, computedPath, folderList, context); const items: MenuProps["items"] = [ { key: "createFeed", label: "Create Feed", icon: }, @@ -37,6 +40,7 @@ export const FolderContextMenu = (props: ContextMenuProps) => { { key: "anonymize", label: "Anonymize", icon: }, { key: "merge", label: "Merge", icon: }, { key: "duplicate", label: "Copy", icon: }, + { key: "share", label: "Share", icon: }, { key: "delete", label: "Delete", icon: }, ]; @@ -45,17 +49,31 @@ export const FolderContextMenu = (props: ContextMenuProps) => { setModalInfo({ isOpen: false, type: "" })} - onSubmit={(inputValue) => handleModalSubmitMutation.mutate(inputValue)} + onSubmit={(inputValue, additionalValues) => + handleModalSubmitMutation.mutate({ + inputValue, + additionalValues, + }) + } modalTitle={ modalInfo.type === "group" ? "Create a new Group" - : "Create a new Folder" + : modalInfo.type === "share" + ? "Share this Folder" + : "Create a new Folder" + } + inputLabel={ + modalInfo.type === "group" + ? "Group Name" + : modalInfo.type === "share" + ? "User Name" + : "Folder Name" } - inputLabel={modalInfo.type === "group" ? "Group Name" : "Folder Name"} indicators={{ isPending: handleModalSubmitMutation.isPending, isError: handleModalSubmitMutation.isError, error: handleModalSubmitMutation.error as DefaultError, + clearErrors: () => handleModalSubmitMutation.reset(), }} /> diff --git a/src/components/NewLibrary/components/FileCard.tsx b/src/components/NewLibrary/components/FileCard.tsx index 56d118b60..5650b25db 100644 --- a/src/components/NewLibrary/components/FileCard.tsx +++ b/src/components/NewLibrary/components/FileCard.tsx @@ -191,7 +191,7 @@ export const SubFileCard: React.FC = ({ ); const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); const ext = getFileExtension(file.data.fname); - const icon = getIcon(ext); + const icon = getIcon(ext, isDarkTheme); useEffect(() => { if (handleDownloadMutation.isSuccess) { diff --git a/src/components/NewLibrary/components/FolderCard.tsx b/src/components/NewLibrary/components/FolderCard.tsx index d243ddcf5..46a207889 100644 --- a/src/components/NewLibrary/components/FolderCard.tsx +++ b/src/components/NewLibrary/components/FolderCard.tsx @@ -80,7 +80,7 @@ export const SubFolderCard: React.FC = (props) => { const feedMatches = folderName.match(/feed_(\d+)/); const { data, isLoading } = useQuery({ - queryKey: ["AssociatedFeed", folder.data.path], + queryKey: ["associatedFeed", folder.data.path], queryFn: async () => { const id = feedMatches ? feedMatches[1] : null; diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index c2ec1d0e8..15aeb22f8 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -2,6 +2,7 @@ import type { FileBrowserFolderList } from "@fnndsc/chrisapi"; import { ActionGroup, Button, + Checkbox, Chip, ChipGroup, Form, @@ -14,7 +15,6 @@ import { Tooltip, } from "@patternfly/react-core"; import type { DefaultError } from "@tanstack/react-query"; -import { Alert, Dropdown, Spin } from "../../Antd"; import React, { Fragment, useEffect, @@ -26,6 +26,7 @@ import { useDispatch } from "react-redux"; import { getFileName } from "../../../api/common"; import { removeSelectedPayload } from "../../../store/cart/cartSlice"; import { useTypedSelector } from "../../../store/hooks"; +import { Alert, Dropdown, Spin } from "../../Antd"; import { AddIcon, ArchiveIcon, @@ -34,20 +35,35 @@ import { DownloadIcon, DuplicateIcon, MergeIcon, + ShareIcon, } from "../../Icons"; import { useFolderOperations } from "../utils/useOperations"; import "./Operations.css"; +export enum ContextTypes { + feed_table = "FEEDS_TABLE", + library_page = "LIBRARY_PAGE", + filebrowser_table = "FILEBROWSER_TABLE", +} + +export type AdditionalValues = { + share: { + read?: boolean; + write?: boolean; + }; +}; + interface AddModalProps { isOpen: boolean; onClose: () => void; - onSubmit: (inputValue: string) => void; + onSubmit: (inputValue: string, additionalValues?: AdditionalValues) => void; modalTitle: string; inputLabel: string; indicators: { isPending: boolean; isError: boolean; error: DefaultError | null; + clearErrors: () => void; }; } @@ -61,12 +77,19 @@ interface OperationProps { customClassName?: { [key: string]: string; }; + context?: ContextTypes; } export const AddModal = (props: AddModalProps) => { const { isOpen, onClose, onSubmit, modalTitle, inputLabel, indicators } = props; const [inputValue, setInputValue] = useState(""); + const [additionalValues, setAdditionalValues] = useState({ + share: { + read: false, + write: true, + }, + }); const handleClose = () => { setInputValue(""); @@ -97,6 +120,36 @@ export const AddModal = (props: AddModalProps) => { placeholder={inputLabel} /> + + { + setAdditionalValues({ + ...additionalValues, + share: { + ...additionalValues?.share, + read: checked, + }, + }); + }} + /> + { + setAdditionalValues({ + ...additionalValues, + share: { + ...additionalValues?.share, + write: checked, + }, + }); + }} + /> + } @@ -107,7 +160,12 @@ export const AddModal = (props: AddModalProps) => { {indicators.isError && ( - + )} @@ -127,7 +185,9 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { folderList, customStyle, customClassName, + context, } = props; + const dispatch = useDispatch(); const { modalInfo, @@ -141,7 +201,7 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { contextHolder, setUserErrors, setModalInfo, - } = useFolderOperations(inValidateFolders, computedPath, folderList); + } = useFolderOperations(inValidateFolders, computedPath, folderList, context); useImperativeHandle(ref, () => ({ triggerFileUpload: () => { @@ -259,6 +319,13 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { "Copy selected items", )} + + {renderOperationButton( + , + "share", + "Share selected items", + )} + {renderOperationButton( , @@ -298,17 +365,31 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { setModalInfo({ isOpen: false, type: "" })} - onSubmit={(inputValue) => handleModalSubmitMutation.mutate(inputValue)} + onSubmit={(inputValue, additionalValues) => + handleModalSubmitMutation.mutate({ + inputValue, + additionalValues, + }) + } modalTitle={ modalInfo.type === "group" ? "Create a new Group" - : "Create a new Folder" + : modalInfo.type === "share" + ? "Share this Folder" + : "Create a new Folder" + } + inputLabel={ + modalInfo.type === "group" + ? "Group Name" + : modalInfo.type === "share" + ? "User Name" + : "Folder Name" } - inputLabel={modalInfo.type === "group" ? "Group Name" : "Folder Name"} indicators={{ isPending: handleModalSubmitMutation.isPending, isError: handleModalSubmitMutation.isError, error: handleModalSubmitMutation.error as DefaultError, + clearErrors: () => handleModalSubmitMutation.reset(), }} />
+
+ index + }`} + className="result-grid" + >
); } return ( + index + }`} title={`No results found for : ${result.args.PatientID} ${result.args.PatientName} ${result.args.AccessionNumber}`} /> ); diff --git a/src/components/PipelinesCopy/index.tsx b/src/components/PipelinesCopy/index.tsx index a7da63cea..93996e23b 100644 --- a/src/components/PipelinesCopy/index.tsx +++ b/src/components/PipelinesCopy/index.tsx @@ -70,7 +70,7 @@ const PipelinesCopy = () => { }; const fetchPipelinesAgain = () => { - queryClient.invalidateQueries({ + queryClient.refetchQueries({ queryKey: ["pipelines"], }); }; diff --git a/src/components/PipelinesPage/index.tsx b/src/components/PipelinesPage/index.tsx index 35d1ea48c..97abadbf4 100644 --- a/src/components/PipelinesPage/index.tsx +++ b/src/components/PipelinesPage/index.tsx @@ -1,21 +1,14 @@ import React from "react"; -import { useDispatch } from "react-redux"; import { PipelineProvider } from "../PipelinesCopy/context"; import Pipelines from "../PipelinesCopy"; import WrapperConnect from "../Wrapper"; -import { setSidebarActive } from "../../store/ui/uiSlice"; + import { PageSection } from "@patternfly/react-core"; const PipelinePage = () => { - const dispatch = useDispatch(); React.useEffect(() => { document.title = "Pipelines Catalog"; - dispatch( - setSidebarActive({ - activeItem: "pipelines", - }), - ); - }); + }, []); return ( diff --git a/src/components/PluginCatalog/index.tsx b/src/components/PluginCatalog/index.tsx index 1a0a8ee0f..68b22c2fd 100644 --- a/src/components/PluginCatalog/index.tsx +++ b/src/components/PluginCatalog/index.tsx @@ -1,26 +1,17 @@ import React from "react"; -import { useDispatch } from "react-redux"; import { Typography } from "../Antd"; import WrapperConnect from "../Wrapper"; import PluginCatalog from "./PluginCatalog"; import { InfoIcon } from "../Common/"; -import { setSidebarActive } from "../../store/ui/uiSlice"; import { PageSection } from "@patternfly/react-core"; import "./plugin-catalog.css"; const { Paragraph } = Typography; const CatalogPage = () => { - const dispatch = useDispatch(); - React.useEffect(() => { document.title = "Analysis Catalog"; - dispatch( - setSidebarActive({ - activeItem: "catalog", - }), - ); - }); + }, []); return ( diff --git a/src/components/Store/index.tsx b/src/components/Store/index.tsx index 305a35a19..3c30f971a 100644 --- a/src/components/Store/index.tsx +++ b/src/components/Store/index.tsx @@ -27,15 +27,13 @@ import { TextVariants, } from "@patternfly/react-core"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { Alert, Spin, Typography, notification } from "../Antd"; import { format } from "date-fns"; import { isEmpty } from "lodash"; import { type Ref, useEffect, useState } from "react"; import { Cookies, useCookies } from "react-cookie"; -import { useDispatch } from "react-redux"; +import { Alert, Spin, Typography, notification } from "../Antd"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useTypedSelector } from "../../store/hooks"; -import { setSidebarActive } from "../../store/ui/uiSlice"; import { InfoIcon, SpinContainer } from "../Common"; import { CheckCircleIcon, SearchIcon } from "../Icons"; import "../SinglePlugin/singlePlugin.css"; @@ -51,11 +49,10 @@ const { Paragraph } = Typography; const Store = () => { const isStaff = useTypedSelector((state) => state.user.isStaff); - const queryClient = useQueryClient(); const [_cookie, setCookie, removeCookie] = useCookies(); const [api, contextHolder] = notification.useNotification(); - const dispatch = useDispatch(); + const [version, setVersion] = useState<{ [key: string]: any; }>({}); @@ -74,12 +71,7 @@ const Store = () => { useEffect(() => { document.title = "Store Catalog"; - dispatch( - setSidebarActive({ - activeItem: "store", - }), - ); - }, [dispatch]); + }, []); useEffect(() => { const cookies = new Cookies(); @@ -316,7 +308,7 @@ const Store = () => { }); setConfigureStoreValue(configureStoreValue); setConfigureStore(!configureStore); - queryClient.resetQueries({ + queryClient.refetchQueries({ queryKey: ["storePlugins"], }); }} @@ -368,7 +360,7 @@ const Store = () => { removeCookie("configure_url", { path: "/", }); - queryClient.resetQueries({ + queryClient.refetchQueries({ queryKey: ["storePlugins"], }); } else { diff --git a/src/components/Wrapper/Sidebar.tsx b/src/components/Wrapper/Sidebar.tsx index de9bde0a8..aee7ace62 100644 --- a/src/components/Wrapper/Sidebar.tsx +++ b/src/components/Wrapper/Sidebar.tsx @@ -6,33 +6,39 @@ import { PageSidebar, PageSidebarBody, } from "@patternfly/react-core"; +import { useQueryClient } from "@tanstack/react-query"; import { isEmpty } from "lodash"; import type * as React from "react"; import { Link } from "react-router-dom"; import { useTypedSelector } from "../../store/hooks"; import type { IUiState } from "../../store/ui/uiSlice"; -import { setSidebarActive } from "../../store/ui/uiSlice"; import type { IUserState } from "../../store/user/userSlice"; -import { useDispatch } from "react-redux"; type AllProps = IUiState & IUserState; const Sidebar: React.FC = () => { + const queryClient = useQueryClient(); const { sidebarActiveItem, isNavOpen } = useTypedSelector( (state) => state.ui, ); const isLoggedIn = useTypedSelector((state) => state.user.isLoggedIn); - const dispatch = useDispatch(); - const onSelect = (selectedItem: any) => { + const urlParam = isLoggedIn ? "private" : "public"; + + const onSelect = ( + _event: React.FormEvent, + selectedItem: any, + ) => { const { itemId } = selectedItem; - if (sidebarActiveItem !== itemId) { - dispatch(setSidebarActive({ activeItem: itemId })); + // Invalidate feeds if "analyses" is selected + if (itemId === "analyses") { + const queryKey = isLoggedIn ? "feeds" : "publicFeeds"; + queryClient.refetchQueries({ + queryKey: [queryKey], // This assumes your query key for feeds is ["feeds"] + }); } }; - const urlParam = isLoggedIn ? "private" : "public"; - const renderLink = (to: string, label: string, itemId: string) => sidebarActiveItem === itemId && sidebarActiveItem !== "analyses" ? ( {label} diff --git a/src/components/Wrapper/index.tsx b/src/components/Wrapper/index.tsx index e44c5db76..68b92d932 100644 --- a/src/components/Wrapper/index.tsx +++ b/src/components/Wrapper/index.tsx @@ -8,7 +8,7 @@ import "./wrapper.css"; import { setIsNavOpen } from "../../store/ui/uiSlice"; type WrapperProps = { - children: React.ReactElement[]; + children: React.ReactElement[] | React.ReactElement; }; const Wrapper = (props: WrapperProps) => { diff --git a/src/routes.tsx b/src/routes.tsx index 783dfbac3..512d489a1 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import { useNavigate, useRoutes } from "react-router-dom"; +import { useNavigate, useRoutes, matchPath } from "react-router-dom"; import ComputePage from "./components/ComputePage"; import Dashboard from "./components/Dashboard"; import DatasetRedirect from "./components/DatasetRedirect"; @@ -22,6 +22,8 @@ import Signup from "./components/Signup"; import SinglePlugin from "./components/SinglePlugin"; import Store from "./components/Store"; import { useTypedSelector } from "./store/hooks"; +import { useDispatch } from "react-redux"; +import { setSidebarActive } from "./store/ui/uiSlice"; interface IState { selectData?: Series; @@ -41,6 +43,7 @@ export const [State, MainRouterContext] = RouterContext({ }); export const MainRouter: React.FC = () => { + const dispatch = useDispatch(); const [state, setState] = React.useState(State); const [route, setRoute] = React.useState(); const navigate = useNavigate(); @@ -60,6 +63,55 @@ export const MainRouter: React.FC = () => { }, }; + // Define the routes and their corresponding sidebar items + const routeToSidebarItem: Record = { + "/": "overview", + "library/*": "lib", + "feeds/*": "analyses", + "feeds/:id": "analyses", + "plugin/:id": "catalog", + pacs: "pacs", + login: "login", + signup: "signup", + pipelines: "pipelines", + catalog: "catalog", + compute: "compute", + "dataset/:feedName?": "dataset", + "niivue/:plinstId": "niivue", + store: "store", + "install/*": "install", + "*": "notFound", + }; + + const matchRoute = (path: string) => { + const normalizedPath = path.startsWith("/") ? path.slice(1) : path; + + // Exact match first + if (routeToSidebarItem[normalizedPath]) { + return routeToSidebarItem[normalizedPath]; + } + + // Wildcard match + for (const routePath of Object.keys(routeToSidebarItem)) { + if (matchPath({ path: routePath, end: true }, path)) { + return routeToSidebarItem[routePath]; + } + } + + // Default to notFound if no match + return routeToSidebarItem["*"]; + }; + // Update the active sidebar item based on the current route + React.useEffect(() => { + const currentPath = location.pathname; + const sidebarItem = matchRoute(currentPath); + dispatch( + setSidebarActive({ + activeItem: sidebarItem, + }), + ); + }, [location.pathname, dispatch]); + const element = useRoutes([ { path: "/", diff --git a/src/store/cart/types.ts b/src/store/cart/types.ts index 3d1b78cfa..f1841022d 100644 --- a/src/store/cart/types.ts +++ b/src/store/cart/types.ts @@ -2,12 +2,18 @@ import type { Feed, FileBrowserFolder, FileBrowserFolderFile, + FileBrowserFolderLinkFile, } from "@fnndsc/chrisapi"; +export type PayloadTypes = + | FileBrowserFolder + | FileBrowserFolderFile + | FileBrowserFolderLinkFile; + export interface SelectionPayload { path: string; type: string; - payload: FileBrowserFolderFile | FileBrowserFolder; + payload: PayloadTypes; } export type FolderUploadObject = { From 74a93f656d30b76635ea1fe1de7475f4243d13c6 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Tue, 20 Aug 2024 15:08:37 -0400 Subject: [PATCH 117/337] feat: Cleanup --- package-lock.json | 150 +++++++++++++++++- package.json | 2 +- .../components/BreadcrumbContainer.tsx | 26 +-- .../NewLibrary/utils/useDeletePayload.tsx | 42 +++-- .../NewLibrary/utils/useFeedOperations.tsx | 8 +- 5 files changed, 183 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index c6c051039..c5faa2e6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", "@types/d3-zoom": "^3.0.8", - "antd": "^5.20.1", + "antd": "^5.20.2", "axios": "^1.7.2", "d3-hierarchy": "^1.1.9", "d3-selection": "^3.0.0", @@ -110,6 +110,8 @@ }, "node_modules/@ant-design/colors": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.1.0.tgz", + "integrity": "sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==", "license": "MIT", "dependencies": { "@ctrl/tinycolor": "^3.6.1" @@ -117,6 +119,8 @@ }, "node_modules/@ant-design/cssinjs": { "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.21.0.tgz", + "integrity": "sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -134,6 +138,8 @@ }, "node_modules/@ant-design/cssinjs-utils": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.0.3.tgz", + "integrity": "sha512-BrztZZKuoYcJK8uEH40ylBemf/Mu/QPiDos56g2bv6eUoniQkgQHOCOvA3+pncoFO1TaS8xcUCIqGzDA0I+ZVQ==", "license": "MIT", "dependencies": { "@ant-design/cssinjs": "^1.21.0", @@ -147,6 +153,8 @@ }, "node_modules/@ant-design/cssinjs-utils/node_modules/@babel/runtime": { "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -157,6 +165,8 @@ }, "node_modules/@ant-design/fast-color": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7" @@ -167,6 +177,8 @@ }, "node_modules/@ant-design/fast-color/node_modules/@babel/runtime": { "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -177,6 +189,8 @@ }, "node_modules/@ant-design/icons": { "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.4.0.tgz", + "integrity": "sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.0.0", @@ -195,10 +209,14 @@ }, "node_modules/@ant-design/icons-svg": { "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", "license": "MIT" }, "node_modules/@ant-design/icons/node_modules/@babel/runtime": { "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -209,6 +227,8 @@ }, "node_modules/@ant-design/react-slick": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.4", @@ -756,6 +776,8 @@ }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", "license": "MIT", "engines": { "node": ">=10" @@ -763,10 +785,14 @@ }, "node_modules/@emotion/hash": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", "license": "MIT" }, "node_modules/@emotion/unitless": { "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", "license": "MIT" }, "node_modules/@esbuild/linux-x64": { @@ -1128,6 +1154,8 @@ }, "node_modules/@rc-component/async-validator": { "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", + "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.4" @@ -1138,6 +1166,8 @@ }, "node_modules/@rc-component/async-validator/node_modules/@babel/runtime": { "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1148,6 +1178,8 @@ }, "node_modules/@rc-component/color-picker": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", "license": "MIT", "dependencies": { "@ant-design/fast-color": "^2.0.6", @@ -1162,6 +1194,8 @@ }, "node_modules/@rc-component/color-picker/node_modules/@babel/runtime": { "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1172,6 +1206,8 @@ }, "node_modules/@rc-component/context": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -1184,6 +1220,8 @@ }, "node_modules/@rc-component/mini-decimal": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0" @@ -1194,6 +1232,8 @@ }, "node_modules/@rc-component/mutate-observer": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -1210,6 +1250,8 @@ }, "node_modules/@rc-component/portal": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -1226,6 +1268,8 @@ }, "node_modules/@rc-component/qrcode": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", + "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", @@ -1242,6 +1286,8 @@ }, "node_modules/@rc-component/qrcode/node_modules/@babel/runtime": { "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1252,6 +1298,8 @@ }, "node_modules/@rc-component/tour": { "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.0.tgz", + "integrity": "sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -1270,6 +1318,8 @@ }, "node_modules/@rc-component/trigger": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.1.tgz", + "integrity": "sha512-fuU11J8pOt6+U/tU6/CAv8wjCwGaNeRk9f5k8HQth7JBbJ6MMH62WhGycVW75VnXfBZgL/7kO+wbiO2Xc9U9sQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2", @@ -1289,6 +1339,8 @@ }, "node_modules/@rc-component/trigger/node_modules/@babel/runtime": { "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2100,7 +2152,9 @@ } }, "node_modules/antd": { - "version": "5.20.1", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.20.2.tgz", + "integrity": "sha512-9d6Bs5ZKIV+JhB0eD7KxYnIfnhUh86kNtTGIuNiIxHFUhbuyT1DXN2SuMksDmtSfuRYZ82/C4hq+OJjWNNbmHg==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.1.0", @@ -2124,7 +2178,7 @@ "rc-dialog": "~9.5.2", "rc-drawer": "~7.2.0", "rc-dropdown": "~4.2.0", - "rc-field-form": "~2.3.0", + "rc-field-form": "~2.4.0", "rc-image": "~7.9.0", "rc-input": "~1.6.3", "rc-input-number": "~9.2.0", @@ -2133,7 +2187,7 @@ "rc-motion": "^2.9.2", "rc-notification": "~5.6.0", "rc-pagination": "~4.2.0", - "rc-picker": "~4.6.12", + "rc-picker": "~4.6.13", "rc-progress": "~4.0.0", "rc-rate": "~2.13.0", "rc-resize-observer": "^1.4.0", @@ -2148,7 +2202,7 @@ "rc-tooltip": "~6.2.0", "rc-tree": "~5.8.8", "rc-tree-select": "~5.22.1", - "rc-upload": "~4.6.0", + "rc-upload": "~4.7.0", "rc-util": "^5.43.0", "scroll-into-view-if-needed": "^3.1.0", "throttle-debounce": "^5.0.2" @@ -2164,6 +2218,8 @@ }, "node_modules/antd/node_modules/@babel/runtime": { "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2204,6 +2260,8 @@ }, "node_modules/array-tree-filter": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", "license": "MIT" }, "node_modules/asap": { @@ -2740,6 +2798,8 @@ }, "node_modules/copy-to-clipboard": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", "license": "MIT", "dependencies": { "toggle-selection": "^1.0.6" @@ -3084,7 +3144,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.12", + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", "license": "MIT" }, "node_modules/debug": { @@ -4805,6 +4867,8 @@ }, "node_modules/json2mq": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", "license": "MIT", "dependencies": { "string-convert": "^0.2.0" @@ -8897,6 +8961,8 @@ }, "node_modules/rc-cascader": { "version": "3.27.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.27.0.tgz", + "integrity": "sha512-z5uq8VvQadFUBiuZJ7YF5UAUGNkZtdEtcEYiIA94N/Kc2MIKr6lEbN5HyVddvYSgwWlKqnL6pH5bFXFuIK3MNg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -8913,6 +8979,8 @@ }, "node_modules/rc-checkbox": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.3.0.tgz", + "integrity": "sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -8926,6 +8994,8 @@ }, "node_modules/rc-collapse": { "version": "3.7.3", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.3.tgz", + "integrity": "sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -8940,6 +9010,8 @@ }, "node_modules/rc-dialog": { "version": "9.5.2", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.5.2.tgz", + "integrity": "sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -8955,6 +9027,8 @@ }, "node_modules/rc-drawer": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.2.0.tgz", + "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", @@ -8970,6 +9044,8 @@ }, "node_modules/rc-drawer/node_modules/@babel/runtime": { "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -8980,6 +9056,8 @@ }, "node_modules/rc-dropdown": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.0.tgz", + "integrity": "sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -8993,7 +9071,9 @@ } }, "node_modules/rc-field-form": { - "version": "2.3.0", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.4.0.tgz", + "integrity": "sha512-XZ/lF9iqf9HXApIHQHqzJK5v2w4mkUMsVqAzOyWVzoiwwXEavY6Tpuw7HavgzIoD+huVff4JghSGcgEfX6eycg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -9010,6 +9090,8 @@ }, "node_modules/rc-image": { "version": "7.9.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.9.0.tgz", + "integrity": "sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", @@ -9026,6 +9108,8 @@ }, "node_modules/rc-input": { "version": "1.6.3", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.6.3.tgz", + "integrity": "sha512-wI4NzuqBS8vvKr8cljsvnTUqItMfG1QbJoxovCgL+DX4eVUcHIjVwharwevIxyy7H/jbLryh+K7ysnJr23aWIA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -9039,6 +9123,8 @@ }, "node_modules/rc-input-number": { "version": "9.2.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.2.0.tgz", + "integrity": "sha512-5XZFhBCV5f9UQ62AZ2hFbEY8iZT/dm23Q1kAg0H8EvOgD3UDbYYJAayoVIkM3lQaCqYAW5gV0yV3vjw1XtzWHg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -9054,6 +9140,8 @@ }, "node_modules/rc-mentions": { "version": "2.15.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.15.0.tgz", + "integrity": "sha512-f5v5i7VdqvBDXbphoqcQWmXDif2Msd2arritVoWybrVDuHE6nQ7XCYsybHbV//WylooK52BFDouFvyaRDtXZEw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.22.5", @@ -9071,6 +9159,8 @@ }, "node_modules/rc-menu": { "version": "9.14.1", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.14.1.tgz", + "integrity": "sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -9100,6 +9190,8 @@ }, "node_modules/rc-notification": { "version": "5.6.0", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.0.tgz", + "integrity": "sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -9117,6 +9209,8 @@ }, "node_modules/rc-overflow": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", + "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -9131,6 +9225,8 @@ }, "node_modules/rc-pagination": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-4.2.0.tgz", + "integrity": "sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -9144,6 +9240,8 @@ }, "node_modules/rc-picker": { "version": "4.6.13", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.13.tgz", + "integrity": "sha512-yi4JWPGjm420Q8rHjZ6YNy2c5IfV+9EAzx2pewVRPOjJqfg7uifO/Z0uqxdl/h6AhBocuvRvtlyz6ehrAvTq7A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", @@ -9181,6 +9279,8 @@ }, "node_modules/rc-picker/node_modules/@babel/runtime": { "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -9191,6 +9291,8 @@ }, "node_modules/rc-progress": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -9204,6 +9306,8 @@ }, "node_modules/rc-rate": { "version": "2.13.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.0.tgz", + "integrity": "sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -9234,6 +9338,8 @@ }, "node_modules/rc-segmented": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.3.0.tgz", + "integrity": "sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -9248,6 +9354,8 @@ }, "node_modules/rc-select": { "version": "14.15.1", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.15.1.tgz", + "integrity": "sha512-mGvuwW1RMm1NCSI8ZUoRoLRK51R2Nb+QJnmiAvbDRcjh2//ulCkxeV6ZRFTECPpE1t2DPfyqZMPw90SVJzQ7wQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -9268,6 +9376,8 @@ }, "node_modules/rc-slider": { "version": "11.1.5", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.5.tgz", + "integrity": "sha512-b77H5PbjMKsvkYXAYIkn50QuFX6ICQmCTibDinI9q+BHx65/TV4TeU25+oadhSRzykxs0/vBWeKBwRyySOeWlg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -9284,6 +9394,8 @@ }, "node_modules/rc-steps": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.16.7", @@ -9300,6 +9412,8 @@ }, "node_modules/rc-switch": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.21.0", @@ -9313,6 +9427,8 @@ }, "node_modules/rc-table": { "version": "7.45.7", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.45.7.tgz", + "integrity": "sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -9332,6 +9448,8 @@ }, "node_modules/rc-tabs": { "version": "15.1.1", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.1.1.tgz", + "integrity": "sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", @@ -9352,6 +9470,8 @@ }, "node_modules/rc-textarea": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.8.1.tgz", + "integrity": "sha512-bm36N2ZqwZAP60ZQg2OY9mPdqWC+m6UTjHc+CqEZOxb3Ia29BGHazY/s5bI8M4113CkqTzhtFUDNA078ZiOx3Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -9367,6 +9487,8 @@ }, "node_modules/rc-tooltip": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.0.tgz", + "integrity": "sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", @@ -9398,6 +9520,8 @@ }, "node_modules/rc-tree-select": { "version": "5.22.1", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.22.1.tgz", + "integrity": "sha512-b8mAK52xEpRgS+b2PTapCt29GoIrO5cO8jB7AfHttFsIJfcnynY9FCtnYzURsKXJkGHbFY6UzSEB2I3TETtdWg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -9412,7 +9536,9 @@ } }, "node_modules/rc-upload": { - "version": "4.6.0", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.7.0.tgz", + "integrity": "sha512-eUwxYNHlsYe5vYhKFAUGrQG95JrnPzY+BmPi1Daq39fWNl/eOc7v4UODuWrVp2LFkQBuV3cMCG/I68iub6oBrg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -10508,6 +10634,8 @@ }, "node_modules/string-convert": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", "license": "MIT" }, "node_modules/string-range": { @@ -10576,6 +10704,8 @@ }, "node_modules/stylis": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", "license": "MIT" }, "node_modules/supports-color": { @@ -10621,6 +10751,8 @@ }, "node_modules/throttle-debounce": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", "license": "MIT", "engines": { "node": ">=12.22" @@ -10675,6 +10807,8 @@ }, "node_modules/toggle-selection": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", "license": "MIT" }, "node_modules/totalist": { diff --git a/package.json b/package.json index 817d292ab..ec60172ec 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", "@types/d3-zoom": "^3.0.8", - "antd": "^5.20.1", + "antd": "^5.20.2", "axios": "^1.7.2", "d3-hierarchy": "^1.1.9", "d3-selection": "^3.0.0", diff --git a/src/components/NewLibrary/components/BreadcrumbContainer.tsx b/src/components/NewLibrary/components/BreadcrumbContainer.tsx index 47b92b1d4..c4a49727e 100644 --- a/src/components/NewLibrary/components/BreadcrumbContainer.tsx +++ b/src/components/NewLibrary/components/BreadcrumbContainer.tsx @@ -38,6 +38,20 @@ const BreadcrumbContainer = ({ style={{ paddingTop: "0", paddingLeft: "0", paddingBottom: "0" }} > + + {showHomeButton && ( + + -
{!isEmpty(date) ? new Date(date).toDateString() : ""}
+ +
+
+ {!isEmpty(date) + ? format(new Date(date), "dd MMM yyyy, HH:mm") + : "N/A"} +
+
@@ -164,6 +177,12 @@ type SubFileCardProps = { computedPath: string; }; +export const getFileName = ( + file: FileBrowserFolderFile | FileBrowserFolderLinkFile, +) => { + return file.data.fname.split("/").pop() || ""; +}; + export const SubFileCard: React.FC = ({ file, computedPath, @@ -175,8 +194,7 @@ export const SubFileCard: React.FC = ({ const { handlers } = useLongPress(); const [api, contextHolder] = notification.useNotification(); const [preview, setIsPreview] = useState(false); - - const fileName = file.data.fname.split("/").pop() || ""; + const fileName = getFileName(file); const isSelected = selectedPaths.some( (payload) => payload.path === file.data.fname, ); @@ -254,6 +272,10 @@ type SubLinkCardProps = { computedPath: string; }; +export const getLinkFileName = (file: FileBrowserFolderLinkFile) => { + return file.data.path.split("/").pop() || ""; +}; + export const SubLinkCard: React.FC = ({ linkFile, computedPath, @@ -266,7 +288,7 @@ export const SubLinkCard: React.FC = ({ const { handlers } = useLongPress(); const [api, contextHolder] = notification.useNotification(); - const linkName = linkFile.data.path.split("/").pop() || ""; + const linkName = getLinkFileName(linkFile); const isSelected = selectedPaths.some( (payload) => payload.path === linkFile.data.path, ); diff --git a/src/components/NewLibrary/components/FolderCard.tsx b/src/components/NewLibrary/components/FolderCard.tsx index 2a0122334..c4c2a0a74 100644 --- a/src/components/NewLibrary/components/FolderCard.tsx +++ b/src/components/NewLibrary/components/FolderCard.tsx @@ -9,6 +9,8 @@ import { SplitItem, } from "@patternfly/react-core"; import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { format } from "date-fns"; +import { isEmpty } from "lodash"; import { useContext } from "react"; import { Fragment } from "react/jsx-runtime"; import ChrisAPIClient from "../../../api/chrisapiclient"; @@ -56,6 +58,13 @@ interface SubFolderCardProps { handleFolderClick: (path: string) => void; } +export function getFolderName(folder: FileBrowserFolder, computedPath: string) { + const folderPathParts = folder.data.path.split("/"); + const pathName = folderPathParts[folderPathParts.length - 1]; + const folderName = computedPath === "/" ? folder.data.path : pathName; + return folderName; +} + export const SubFolderCard: React.FC = (props) => { const { folder, computedPath, handleFolderClick } = props; const queryClient = useQueryClient(); @@ -63,10 +72,8 @@ export const SubFolderCard: React.FC = (props) => { const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { handlers } = useLongPress(); const { handleOnClick, handleOnMouseDown, handleCheckboxChange } = handlers; + const folderName = getFolderName(folder, computedPath); - const folderPathParts = folder.data.path.split("/"); - const pathName = folderPathParts[folderPathParts.length - 1]; - const folderName = computedPath === "/" ? folder.data.path : pathName; const creationDate = folder.data.creation_date; const isSelected = selectedPaths.some( @@ -152,7 +159,15 @@ export const SubFolderCard: React.FC = (props) => { ? elipses(data, 40) : "Fetching..."} -
{new Date(creationDate).toDateString()}
+
+ {!isEmpty(creationDate) + ? format(new Date(creationDate), "dd MMM yyyy, HH:mm") + : "N/A"} +
diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx new file mode 100644 index 000000000..0c75a29a0 --- /dev/null +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -0,0 +1,105 @@ +import React from "react"; +import { + Table, + Caption, + Thead, + Tr, + Th, + Tbody, + Td, +} from "@patternfly/react-table"; +import type { + FileBrowserFolder, + FileBrowserFolderFile, + FileBrowserFolderLinkFile, +} from "@fnndsc/chrisapi"; +import { getFolderName } from "./FolderCard"; +import { getFileName, getLinkFileName } from "./FileCard"; + +interface TableProps { + data: { + folders: FileBrowserFolder[]; + files: FileBrowserFolderFile[]; + linkFiles: FileBrowserFolderLinkFile[]; + }; + computedPath: string; +} + +const LibraryTable: React.FunctionComponent = ( + props: TableProps, +) => { + // In real usage, this data would come from some external source like an API via props. + + const { data, computedPath } = props; + + const columnNames = { + name: "Name", + date: "Date", + owner: "Owner", + size: "Size", + }; + + return ( + +
{columnNames.name}{columnNames.size}{columnNames.download}{columnNames.name}{columnNames.created}{columnNames.creator}{columnNames.size}
+ + + + + + + + + + + {data.folders.map((resource: FileBrowserFolder) => { + const folderName = getFolderName(resource, computedPath); + return ( + + + + + + + ); + })} + {data.files.map((resource) => { + const fileName = getFileName(resource); + return ( + + + + + + + ); + })} + + {data.linkFiles.map((resource) => { + const fileName = getLinkFileName(resource); + return ( + + + + + + + ); + })} + +
Data Library
{columnNames.name}{columnNames.date}{columnNames.owner}{columnNames.size}
{folderName} + {resource.data.creation_date} + N/ASize
{fileName} + {resource.data.creation_date} + + {resource.data.owner_username} + {resource.data.fsize}
{fileName} + {resource.data.creation_date} + + {resource.data.owner_username} + {resource.data.fsize}
+ + ); +}; + +export default LibraryTable; diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index 074c2ea06..52cabec50 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -39,6 +39,8 @@ import { } from "../../Icons"; import { useFolderOperations } from "../utils/useOperations"; import "./Operations.css"; +import Client from "@fnndsc/chrisapi"; +import ChrisAPIClient from "../../../api/chrisapiclient"; export enum ContextTypes { feed_table = "FEEDS_TABLE", @@ -104,6 +106,13 @@ export const AddModal = (props: AddModalProps) => { onClose(); }; + useEffect(() => { + async function fetchUsers() {} + if (modalTitle === "Share this Folder") { + fetchUsers(); + } + }, [modalTitle]); + return ( { )} {data ? ( - - - - - {fetchMore && !isLoading && ( - - )} -
+ + + + + {fetchMore && !isLoading && ( + + )} +
+ + - + ) : ( )} diff --git a/src/components/NewLibrary/utils/useDeletePayload.tsx b/src/components/NewLibrary/utils/useDeletePayload.tsx index c2f2c88a6..b0a7f957e 100644 --- a/src/components/NewLibrary/utils/useDeletePayload.tsx +++ b/src/components/NewLibrary/utils/useDeletePayload.tsx @@ -33,7 +33,9 @@ const useDeletePayload = (inValidateFolders: () => void, api: any) => { if (axios.isAxiosError(e)) { const error_message = e.response?.data.non_field_errors ? e.response.data.non_field_errors[0] - : e.message; + : e.response?.data.detail + ? e.response?.data.detail + : e.message; errors.push({ path: path.path, message: error_message }); } diff --git a/src/components/NewLibrary/utils/useFeedOperations.tsx b/src/components/NewLibrary/utils/useFeedOperations.tsx index bec498305..5375c9cf5 100644 --- a/src/components/NewLibrary/utils/useFeedOperations.tsx +++ b/src/components/NewLibrary/utils/useFeedOperations.tsx @@ -19,7 +19,6 @@ const useFeedOperations = (inValidateFolders: () => void, api: any) => { const feedList = await Promise.all( paths.map(async (path) => { // cube does not accept forward slashes in the feed name - const filePath = getFileName(path); const idMatch = filePath.match(/feed_(\d+)/); const id = idMatch ? idMatch[1] : null; @@ -32,7 +31,6 @@ const useFeedOperations = (inValidateFolders: () => void, api: any) => { pathToFeed = feed.data.name; } } - const { feed } = await createFeed([path], `Copy of ${pathToFeed}`); return feed; }), From 4508fa4360e2faf92bcbaac40a08ba9795b94036 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Tue, 20 Aug 2024 17:19:25 -0400 Subject: [PATCH 120/337] feat: remove unused code --- src/components/Feeds/FeedListView.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 9744597d8..eff12ff68 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -20,7 +20,6 @@ import { useQuery, useQueryClient } from "@tanstack/react-query"; import { format } from "date-fns"; import type React from "react"; import { useContext, useEffect, useState } from "react"; -import { useDispatch } from "react-redux"; import { useNavigate } from "react-router"; import { useTypedSelector } from "../../store/hooks"; import { AddNodeProvider } from "../AddNode/context"; From edfae8bce02786ff941c0f5a08a117fb06f3e3e2 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 21 Aug 2024 13:14:29 -0400 Subject: [PATCH 121/337] feat: Implement a grid and list layout options in the Library table --- src/components/Common/index.tsx | 44 +++- .../FeedOutputBrowser/FileBrowser.tsx | 3 + src/components/Icons/index.tsx | 4 + .../components/BreadcrumbContainer.tsx | 9 +- src/components/NewLibrary/components/Cart.tsx | 2 +- .../NewLibrary/components/ContextMenu.tsx | 1 - .../NewLibrary/components/FileCard.tsx | 1 - .../NewLibrary/components/LayoutSwitch.tsx | 42 ++++ .../NewLibrary/components/LibraryTable.tsx | 196 +++++++++++++----- src/components/NewLibrary/index.tsx | 104 ++++++---- src/store/cart/cartSlice.ts | 5 + src/store/cart/types.ts | 1 + 12 files changed, 308 insertions(+), 104 deletions(-) create mode 100644 src/components/NewLibrary/components/LayoutSwitch.tsx diff --git a/src/components/Common/index.tsx b/src/components/Common/index.tsx index 3b7f22feb..e81c9cdb5 100644 --- a/src/components/Common/index.tsx +++ b/src/components/Common/index.tsx @@ -1,4 +1,5 @@ import { + Bullseye, ClipboardCopy, ClipboardCopyButton, Dropdown, @@ -15,6 +16,7 @@ import { MenuToggle, TextInput, } from "@patternfly/react-core"; +import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; import { Alert, Popover, Spin, Typography } from "antd"; import React, { type ReactNode, useState } from "react"; import Dots from "react-activity/dist/Dots"; @@ -99,7 +101,7 @@ export const ClipboardCopyContainer = ({ path }: { path: string }) => { _event: React.ClipboardEvent, text: string, ) => { - if (typeof navigator.clipboard == "undefined") { + if (typeof navigator.clipboard === "undefined") { const textArea = document.createElement("textarea"); textArea.value = text; textArea.style.position = "fixed"; @@ -385,3 +387,43 @@ export const getIcon = (type: string, isDarkTheme: boolean) => { return ; } }; + +// This example has been simplified to focus on the empty state. In real usage, +// you may want to derive your rows from typed underlying data and minimal state. See other examples. + +interface EmptyTableProps { + columnNames: { + [key: string]: string; + }[]; +} + +export const TableEmptyState: React.FunctionComponent = ({ + columnNames, +}: EmptyTableProps) => ( + + + + {columnNames.map((column, index) => { + // biome-ignore lint/suspicious/noArrayIndexKey: + return ; + })} + + + + + + + +
{Object.values(column)[0]}
+ + + } + titleText="No results found" + headingLevel="h2" + /> + No Data Found under this path + + +
+); diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 4eca4e641..f5c1c0ef4 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -207,6 +207,9 @@ const FileBrowser = (props: FileBrowserProps) => { if (type === "file" && fileName.indexOf(".") > -1) { iconType = getFileExtension(fileName); fsize = bytesToSize(item.data.fsize); + } else if (type === "link") { + fsize = bytesToSize(item.data.fsize); + iconType = type; } else { iconType = type; } diff --git a/src/components/Icons/index.tsx b/src/components/Icons/index.tsx index ad30d5d22..2af1624dc 100644 --- a/src/components/Icons/index.tsx +++ b/src/components/Icons/index.tsx @@ -30,6 +30,8 @@ import { EditIcon, FileArchiveIcon as PatternflyArchiveIcon, CheckCircleIcon, + BarsIcon, + GripVerticalIcon, } from "@patternfly/react-icons"; const CartIcon = ({ @@ -304,4 +306,6 @@ export { EllipsisVIcon, EditIcon, RetryIcon, + BarsIcon, + GripVerticalIcon, }; diff --git a/src/components/NewLibrary/components/BreadcrumbContainer.tsx b/src/components/NewLibrary/components/BreadcrumbContainer.tsx index c4a49727e..4ef4d8e25 100644 --- a/src/components/NewLibrary/components/BreadcrumbContainer.tsx +++ b/src/components/NewLibrary/components/BreadcrumbContainer.tsx @@ -38,8 +38,8 @@ const BreadcrumbContainer = ({ style={{ paddingTop: "0", paddingLeft: "0", paddingBottom: "0" }} > - - {showHomeButton && ( + {showHomeButton && ( + } diff --git a/src/components/NewLibrary/components/ContextMenu.tsx b/src/components/NewLibrary/components/ContextMenu.tsx index 2f97e2fd7..4324a5a19 100644 --- a/src/components/NewLibrary/components/ContextMenu.tsx +++ b/src/components/NewLibrary/components/ContextMenu.tsx @@ -7,7 +7,6 @@ import { DeleteIcon, DownloadIcon, DuplicateIcon, - EditIcon, MergeIcon, ShareIcon, } from "../../Icons"; diff --git a/src/components/NewLibrary/components/FileCard.tsx b/src/components/NewLibrary/components/FileCard.tsx index ad548318e..aa63d528a 100644 --- a/src/components/NewLibrary/components/FileCard.tsx +++ b/src/components/NewLibrary/components/FileCard.tsx @@ -40,7 +40,6 @@ type Pagination = { type ComponentProps = { name: string; - computedPath: string; date: string; onClick?: (e: React.MouseEvent) => void; diff --git a/src/components/NewLibrary/components/LayoutSwitch.tsx b/src/components/NewLibrary/components/LayoutSwitch.tsx new file mode 100644 index 000000000..16b51d16d --- /dev/null +++ b/src/components/NewLibrary/components/LayoutSwitch.tsx @@ -0,0 +1,42 @@ +import { + ToggleGroup, + ToggleGroupItem, + type ToggleGroupItemProps, +} from "@patternfly/react-core"; +import { BarsIcon, GripVerticalIcon } from "../../Icons"; +import { switchLibraryLayout } from "../../../store/cart/cartSlice"; +import { useDispatch } from "react-redux"; +import { useTypedSelector } from "../../../store/hooks"; + +const LayoutSwitch = () => { + const currentLayout = useTypedSelector((state) => state.cart.currentLayout); + const dispatch = useDispatch(); + const handleChange: ToggleGroupItemProps["onChange"] = (event) => { + dispatch(switchLibraryLayout(event.currentTarget.id)); + }; + return ( +
+ + } + buttonId="list" + onChange={handleChange} + isSelected={currentLayout === "list"} + /> + } + onChange={handleChange} + isSelected={currentLayout === "grid"} + /> + +
+ ); +}; + +export default LayoutSwitch; diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 0c75a29a0..8e1f91281 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -1,20 +1,30 @@ -import React from "react"; -import { - Table, - Caption, - Thead, - Tr, - Th, - Tbody, - Td, -} from "@patternfly/react-table"; import type { FileBrowserFolder, FileBrowserFolderFile, FileBrowserFolderLinkFile, } from "@fnndsc/chrisapi"; -import { getFolderName } from "./FolderCard"; +import { Button } from "@patternfly/react-core"; +import { + Caption, + Table, + Tbody, + Td, + Th, + Thead, + Tr, +} from "@patternfly/react-table"; +import { useQueryClient } from "@tanstack/react-query"; +import { format } from "date-fns"; +import React, { useContext } from "react"; +import { useNavigate } from "react-router"; +import { useTypedSelector } from "../../../store/hooks"; +import { getIcon } from "../../Common"; +import { ThemeContext } from "../../DarkTheme/useTheme"; +import useLongPress, { getBackgroundRowColor } from "../utils/longpress"; +import { FolderContextMenu } from "./ContextMenu"; import { getFileName, getLinkFileName } from "./FileCard"; +import { getFolderName } from "./FolderCard"; +import { formatBytes } from "../../Feeds/utilties"; interface TableProps { data: { @@ -23,25 +33,115 @@ interface TableProps { linkFiles: FileBrowserFolderLinkFile[]; }; computedPath: string; + handleFolderClick: (folderName: string) => void; } +const columnNames = { + name: "Name", + date: "Date", + owner: "Owner", + size: "Size", +}; + const LibraryTable: React.FunctionComponent = ( props: TableProps, ) => { - // In real usage, this data would come from some external source like an API via props. + const navigate = useNavigate(); + const { handlers } = useLongPress(); + const { handleOnClick } = handlers; + const queryClient = useQueryClient(); + const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); + const isDarkTheme = useContext(ThemeContext).isDarkTheme; + const { data, computedPath, handleFolderClick } = props; + + const renderRow = ( + resource: + | FileBrowserFolder + | FileBrowserFolderFile + | FileBrowserFolderLinkFile, + name: string, + date: string, + owner: string, + size: number, + type: string, + ) => { + const isSelected = + selectedPaths.length > 0 && + selectedPaths.some((payload) => payload.path === resource.data.path); + const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); + + const icon = getIcon(type, isDarkTheme); + + const handleItem = ( + item: + | FileBrowserFolderFile + | FileBrowserFolder + | FileBrowserFolderLinkFile, + type: string, + ) => { + if (type === "folder") { + handleFolderClick(name); + } - const { data, computedPath } = props; + if (type === "link") { + navigate(item.data.path); + } - const columnNames = { - name: "Name", - date: "Date", - owner: "Owner", - size: "Size", + if (type === "file") { + // Show preview + } + }; + + const path = type === "file" ? resource.data.fname : resource.data.path; + + return ( + { + queryClient.refetchQueries({ + queryKey: ["library_folders", computedPath], + }); + }} + key={path} + > + { + handleOnClick(e, resource, path, type); + }} + onContextMenu={(e) => { + handleOnClick(e, resource, path, type); + }} + key={name} + > + + + + + {" "} + {format(new Date(date), "dd MMM yyyy, HH:mm")} + + {owner} + + {size > 0 ? formatBytes(size, 0) : " "} + + + + ); }; return ( - +
@@ -54,46 +154,36 @@ const LibraryTable: React.FunctionComponent = ( {data.folders.map((resource: FileBrowserFolder) => { const folderName = getFolderName(resource, computedPath); - return ( - - - - - - + return renderRow( + resource, + folderName, + resource.data.creation_date, + " ", + // Size of the folder is not available yet + 0, + "folder", ); })} - {data.files.map((resource) => { + {data.files.map((resource: FileBrowserFolderFile) => { const fileName = getFileName(resource); - return ( - - - - - - + return renderRow( + resource, + fileName, + resource.data.creation_date, + resource.data.owner_username, + resource.data.fsize, + "file", ); })} - - {data.linkFiles.map((resource) => { + {data.linkFiles.map((resource: FileBrowserFolderLinkFile) => { const fileName = getLinkFileName(resource); - return ( - - - - - - + return renderRow( + resource, + fileName, + resource.data.creation_date, + resource.data.owner_username, + resource.data.fsize, + "link", ); })} diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index 7df76bea8..85f6cb537 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -22,6 +22,7 @@ import { FilesCard, LinkCard } from "./components/FileCard"; import { FolderCard } from "./components/FolderCard"; import Operations from "./components/Operations"; import LibraryTable from "./components/LibraryTable"; +import LayoutSwitch from "./components/LayoutSwitch"; const { Paragraph } = Typography; @@ -100,6 +101,7 @@ const NewLibrary = () => { const [pageNumber, setPageNumber] = useState(1); const [isFirstLoad, setIsFirstLoad] = useState(true); const username = useTypedSelector((state) => state.user.username); + const currentLayout = useTypedSelector((state) => state.cart.currentLayout); const decodedPath = decodeURIComponent(pathname); const currentPathSplit = decodedPath.split("/library/")[1]; const computedPath = currentPathSplit || "/"; @@ -163,6 +165,8 @@ const NewLibrary = () => { return null; } + console.log("Current Layout", currentLayout); + return ( @@ -196,6 +200,9 @@ const NewLibrary = () => { computedPath={computedPath} folderList={data?.folderList} /> + + + { @@ -208,55 +215,66 @@ const NewLibrary = () => { {isLoading && } {isError && } - {data && - data.subFoldersMap.length === 0 && - data.linkFilesMap.length === 0 && - data.filesMap.length === 0 && ( - - )} - {data ? ( + + {/* Render based on currentLayout */} + {currentLayout === "list" ? ( <> - - + ) : ( + - - - {fetchMore && !isLoading && ( - - )} -
- - + )} ) : ( - + <> + {data && + data.subFoldersMap.length === 0 && + data.linkFilesMap.length === 0 && + data.filesMap.length === 0 ? ( + + ) : ( + + + + + {fetchMore && !isLoading && ( + + )} +
+ + )} + )} diff --git a/src/store/cart/cartSlice.ts b/src/store/cart/cartSlice.ts index a4ad7d0d5..f8f1702db 100644 --- a/src/store/cart/cartSlice.ts +++ b/src/store/cart/cartSlice.ts @@ -9,6 +9,7 @@ import type { } from "./types"; const initialState: ICartState = { + currentLayout: "grid", selectedPaths: [], openCart: false, folderDownloadStatus: {}, @@ -21,6 +22,9 @@ const cartSlice = createSlice({ name: "cart", initialState, reducers: { + switchLibraryLayout(state, action: PayloadAction<"grid" | "list">) { + state.currentLayout = action.payload; + }, startUpload(state, _action: PayloadAction) { state.openCart = true; }, @@ -155,6 +159,7 @@ const cartSlice = createSlice({ }); export const { + switchLibraryLayout, startUpload, setSelectedPaths, setBulkSelectedPaths, diff --git a/src/store/cart/types.ts b/src/store/cart/types.ts index f1841022d..2f0a2e155 100644 --- a/src/store/cart/types.ts +++ b/src/store/cart/types.ts @@ -64,6 +64,7 @@ export interface FeedCreationStatus { } export interface ICartState { + currentLayout: "grid" | "list"; selectedPaths: SelectionPayload[]; openCart: boolean; folderDownloadStatus: DownloadStatus; From 1d8817914de0fed56db748710c932b2d70a31652 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 21 Aug 2024 13:15:21 -0400 Subject: [PATCH 122/337] feat: Cleanup --- src/components/NewLibrary/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index 85f6cb537..e56fb79ee 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -165,8 +165,6 @@ const NewLibrary = () => { return null; } - console.log("Current Layout", currentLayout); - return ( From c6a5ee9eb89e4c3becfe2f58c2f01672a9365e71 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 21 Aug 2024 13:45:00 -0400 Subject: [PATCH 123/337] fix: Fix load data on scroll for the library page --- .../NewLibrary/components/LayoutSwitch.tsx | 2 + src/components/NewLibrary/index.tsx | 37 +++++++++++++------ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/components/NewLibrary/components/LayoutSwitch.tsx b/src/components/NewLibrary/components/LayoutSwitch.tsx index 16b51d16d..04b157d7c 100644 --- a/src/components/NewLibrary/components/LayoutSwitch.tsx +++ b/src/components/NewLibrary/components/LayoutSwitch.tsx @@ -23,12 +23,14 @@ const LayoutSwitch = () => { > } buttonId="list" onChange={handleChange} isSelected={currentLayout === "list"} /> } onChange={handleChange} diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index e56fb79ee..bbc77385e 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -106,7 +106,7 @@ const NewLibrary = () => { const currentPathSplit = decodedPath.split("/library/")[1]; const computedPath = currentPathSplit || "/"; const { data, isLoading, isError, error } = useQuery({ - queryKey: ["library_folders", computedPath], + queryKey: ["library_folders", computedPath, pageNumber], queryFn: () => fetchFolders(computedPath, pageNumber), placeholderData: keepPreviousData, structuralSharing: true, @@ -223,15 +223,29 @@ const NewLibrary = () => { data.filesMap.length === 0 ? ( ) : ( - + <> + + {fetchMore && !isLoading && ( + + )} +
+ )} ) : ( @@ -266,7 +280,8 @@ const NewLibrary = () => { )}
From 15921cd63dcc683d963e7c104ca4fe3b8f47a04f Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Thu, 22 Aug 2024 10:54:03 -0400 Subject: [PATCH 124/337] fix: Fix load data on scroll for the library page --- src/components/Login/index.tsx | 17 +++- src/components/Routing/RouterContext.tsx | 11 --- src/components/XtkViewer/CrvFileSelect.tsx | 10 +- .../XtkViewer/PrimaryFileSelect.tsx | 8 +- src/components/XtkViewer/XtkViewer.tsx | 94 +++++++++++-------- 5 files changed, 77 insertions(+), 63 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 73b3ac094..b6be08015 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -9,7 +9,6 @@ import { LoginMainFooterBandItem, LoginPage, } from "@patternfly/react-core"; -import { ExclamationCircleIcon } from "../Icons"; import queryString from "query-string"; import React from "react"; import { useCookies } from "react-cookie"; @@ -19,6 +18,7 @@ import ChrisAPIClient from "../../api/chrisapiclient"; import ChRIS_Logo_Inline from "../../assets/chris-logo-inline.png"; import ChRIS_Logo from "../../assets/chris-logo.png"; import { setAuthTokenSuccess } from "../../store/user/userSlice"; +import { ExclamationCircleIcon } from "../Icons"; import "./Login.css"; export const SimpleLoginPage: React.FunctionComponent = () => { @@ -60,14 +60,12 @@ export const SimpleLoginPage: React.FunctionComponent = () => { path: "/", maxAge: oneDayToSeconds, }); - const client = ChrisAPIClient.getClient(); const user = await client.getUser(); setCookie("isStaff", user.data.is_staff, { path: "/", maxAge: oneDayToSeconds, }); - dispatch( setAuthTokenSuccess({ token, @@ -79,9 +77,18 @@ export const SimpleLoginPage: React.FunctionComponent = () => { const { redirectTo } = queryString.parse(location.search) as { redirectTo: string; }; - - if (redirectTo) { + if (redirectTo?.startsWith("/library")) { + navigate(`/library/home/${username}`); + } else if (redirectTo?.startsWith("/feeds")) { + const feedIdMatch = redirectTo.match(/^\/feeds\/\d+/); + if (feedIdMatch) { + navigate("/feeds?type=private"); + } else { + navigate(redirectTo); + } + } else if (redirectTo) { const decodedRedirectTo = decodeURIComponent(redirectTo); + console.log(decodedRedirectTo); navigate(decodedRedirectTo); } else { navigate("/"); diff --git a/src/components/Routing/RouterContext.tsx b/src/components/Routing/RouterContext.tsx index bb0341f20..35ca4344f 100644 --- a/src/components/Routing/RouterContext.tsx +++ b/src/components/Routing/RouterContext.tsx @@ -9,7 +9,6 @@ type RouterContextType = React.Context>; type RouterObjectType = { state: S; actions: A; - route: (path: string) => any; }; export function RouterContext({ @@ -19,7 +18,6 @@ export function RouterContext({ return [ state, React.createContext>({ - route: (path: string) => path, actions: actions ? actions : ({} as A), state, }), @@ -30,8 +28,6 @@ interface RouterProviderProps { context: RouterContextType; state: S; actions: A; - route?: string; - setRoute: (route?: string) => any; children: React.ReactNode; } @@ -39,16 +35,12 @@ export function RouterProvider({ context, actions, state, - route, - setRoute, children, }: RouterProviderProps) { const props = { context, actions, state, - route, - setRoute, children, }; return ; @@ -62,9 +54,6 @@ const RouterComponent = ({ return ( { - console.log("NEEDED"); - }, state, actions, }} diff --git a/src/components/XtkViewer/CrvFileSelect.tsx b/src/components/XtkViewer/CrvFileSelect.tsx index 4acd3335f..0bdb021c5 100644 --- a/src/components/XtkViewer/CrvFileSelect.tsx +++ b/src/components/XtkViewer/CrvFileSelect.tsx @@ -5,13 +5,13 @@ import { SimpleListItem, } from "@patternfly/react-core"; import { useState } from "react"; -import { FeedFile } from "@fnndsc/chrisapi"; +import type { FileBrowserFolderFile } from "@fnndsc/chrisapi"; interface CrvFileSelectProps { - files: FeedFile[]; - selectedFile?: FeedFile; + files: FileBrowserFolderFile[]; + selectedFile?: FileBrowserFolderFile; title?: string; - handleSelect: (file: FeedFile) => void; + handleSelect: (file: FileBrowserFolderFile) => void; } const CrvFileSelect = (props: CrvFileSelectProps) => { @@ -23,7 +23,7 @@ const CrvFileSelect = (props: CrvFileSelectProps) => { { // data passing between item and handler is done through props - const file = (listItemProps as any)["x-file"] as FeedFile; + const file = (listItemProps as any)["x-file"] as FileBrowserFolderFile; handleSelect(file); setOpen(false); }} diff --git a/src/components/XtkViewer/PrimaryFileSelect.tsx b/src/components/XtkViewer/PrimaryFileSelect.tsx index 6b2baaae1..0b058cf54 100644 --- a/src/components/XtkViewer/PrimaryFileSelect.tsx +++ b/src/components/XtkViewer/PrimaryFileSelect.tsx @@ -1,9 +1,9 @@ import { SimpleList, SimpleListItem } from "@patternfly/react-core"; -import { FeedFile } from "@fnndsc/chrisapi"; +import type { FileBrowserFolderFile } from "@fnndsc/chrisapi"; interface FsmFileSelectProps { - files: FeedFile[]; - handleSelect: (file: FeedFile) => void; + files: FileBrowserFolderFile[]; + handleSelect: (file: FileBrowserFolderFile) => void; } const FsmFileSelect = (props: FsmFileSelectProps) => { @@ -13,7 +13,7 @@ const FsmFileSelect = (props: FsmFileSelectProps) => { { // data passing between item and handler is done through props - const file = (listItemProps as any)["x-file"] as FeedFile; + const file = (listItemProps as any)["x-file"] as FileBrowserFolderFile; handleSelect(file); }} className="fsm-file-list" diff --git a/src/components/XtkViewer/XtkViewer.tsx b/src/components/XtkViewer/XtkViewer.tsx index 0c2406529..2bf4bf7cf 100644 --- a/src/components/XtkViewer/XtkViewer.tsx +++ b/src/components/XtkViewer/XtkViewer.tsx @@ -1,10 +1,12 @@ -import { useEffect, useRef, useState } from "react"; +import type { FileBrowserFolderFile } from "@fnndsc/chrisapi"; import { Button } from "@patternfly/react-core"; import AiOutlineExpand from "@patternfly/react-icons/dist/esm/icons/expand-alt-icon"; -import { FeedFile } from "@fnndsc/chrisapi"; +import { useEffect, useRef, useState } from "react"; import { useTypedSelector } from "../../store/hooks"; -import FsmFileSelect from "./PrimaryFileSelect"; +import { Alert } from "../Antd"; +import { useFeedBrowser } from "../FeedOutputBrowser/useFeedBrowser"; import CrvFileSelect from "./CrvFileSelect"; +import FsmFileSelect from "./PrimaryFileSelect"; import "./xtk-viewer.css"; // X and dat are loaded in from script file @@ -14,10 +16,10 @@ declare const dat: any; export type ViewerMode = "volume" | "mesh" | "other"; type VolumeMode = "3D" | "2D"; -const getFileType = (file?: FeedFile) => +const getFileType = (file?: FileBrowserFolderFile) => file?.data.fname.split(".").slice(-1)[0]; -const getFileData = async (file: FeedFile) => +const getFileData = async (file: FileBrowserFolderFile) => (await file.getFileBlob())?.arrayBuffer(); export function getXtkFileMode(fileType?: string): ViewerMode | undefined { @@ -26,16 +28,21 @@ export function getXtkFileMode(fileType?: string): ViewerMode | undefined { const otherExtensions = ["crv"]; if (!fileType) { return; - } else if (volumeExtensions.includes(fileType)) { + } + if (volumeExtensions.includes(fileType)) { return "volume"; - } else if (meshExtensions.includes(fileType)) { + } + if (meshExtensions.includes(fileType)) { return "mesh"; - } else if (otherExtensions.includes(fileType)) { + } + if (otherExtensions.includes(fileType)) { return "other"; } } -function getPrimaryFileMode(file: FeedFile): ViewerMode | undefined { +function getPrimaryFileMode( + file: FileBrowserFolderFile, +): ViewerMode | undefined { const fileType = getFileType(file); return getXtkFileMode(fileType); } @@ -43,11 +50,9 @@ function getPrimaryFileMode(file: FeedFile): ViewerMode | undefined { const XtkViewer = () => { const selectedFile = useTypedSelector((state) => state.explorer.selectedFile); const selectedFileType = getFileType(selectedFile); - const { pluginFiles } = useTypedSelector((state) => state.resource); - const selected = useTypedSelector((state) => state.instance.selectedPlugin); - const pluginFilesPayload = selected && pluginFiles[selected.data.id]; - const directoryFiles = pluginFilesPayload ? pluginFilesPayload.files : []; - const crvFiles = directoryFiles.filter((file) => { + const { pluginFilesPayload } = useFeedBrowser(); + const directoryFiles = pluginFilesPayload?.folderFiles; + const crvFiles = directoryFiles?.filter((file) => { const fileName = file.data.fname; return fileName?.endsWith(".crv"); }); @@ -58,15 +63,19 @@ const XtkViewer = () => { ? getPrimaryFileMode(defaultPrimaryFile) : undefined; - const [primaryFile, setPrimaryFile] = useState( - defaultPrimaryFile, - ); + const [primaryFile, setPrimaryFile] = useState< + FileBrowserFolderFile | undefined + >(defaultPrimaryFile); const [viewerMode, setViewerMode] = useState( defaultViewerMode, ); const [volumeMode, setVolumeMode] = useState("3D"); - const [crvFile, setCrvFile] = useState(defaultCrvFile); - const [secondaryFile, setSecondaryFile] = useState(); + const [crvFile, setCrvFile] = useState( + defaultCrvFile, + ); + const [secondaryFile, setSecondaryFile] = useState< + FileBrowserFolderFile | undefined + >(); const [orientation, setOrientation] = useState("x"); const [fullscreen, setFullscreen] = useState(false); @@ -127,7 +136,7 @@ const XtkViewer = () => { r.add(secondaryObject); } - r.onShowtime = function () { + r.onShowtime = () => { gui = new dat.GUI(); if (viewerMode === "mesh") { @@ -164,12 +173,8 @@ const XtkViewer = () => { renderFileData(); return () => { - try { - r && r.destroy(); - gui && gui.destroy(); - } catch (e) { - console.log(e); - } + r?.destroy(); + gui?.destroy(); }; }, [ viewerMode, @@ -192,6 +197,10 @@ const XtkViewer = () => { const datGuiContainerRef = useRef(null); const fullscreenRef = useRef(null); + if (!directoryFiles) { + return ; + } + return (
{ /> ) : ( <> -
+
{viewerMode === "mesh" ? (
- - + {crvFiles ? ( + <> + + + + ) : ( + + )}
) : (
From 8e5375d92c05d7bb9b39b2551d4fc5fbb6bbdd02 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Thu, 22 Aug 2024 11:08:09 -0400 Subject: [PATCH 125/337] feat: Update the location of the layout switch button --- src/components/Login/index.tsx | 1 - .../NewLibrary/components/LayoutSwitch.tsx | 39 ++++++++----------- .../NewLibrary/components/Operations.tsx | 14 ++++++- src/components/NewLibrary/index.tsx | 7 +--- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index b6be08015..4af89e240 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -88,7 +88,6 @@ export const SimpleLoginPage: React.FunctionComponent = () => { } } else if (redirectTo) { const decodedRedirectTo = decodeURIComponent(redirectTo); - console.log(decodedRedirectTo); navigate(decodedRedirectTo); } else { navigate("/"); diff --git a/src/components/NewLibrary/components/LayoutSwitch.tsx b/src/components/NewLibrary/components/LayoutSwitch.tsx index 04b157d7c..b17fec4fc 100644 --- a/src/components/NewLibrary/components/LayoutSwitch.tsx +++ b/src/components/NewLibrary/components/LayoutSwitch.tsx @@ -15,29 +15,22 @@ const LayoutSwitch = () => { dispatch(switchLibraryLayout(event.currentTarget.id)); }; return ( -
- - } - buttonId="list" - onChange={handleChange} - isSelected={currentLayout === "list"} - /> - } - onChange={handleChange} - isSelected={currentLayout === "grid"} - /> - -
+ + } + buttonId="list" + onChange={handleChange} + isSelected={currentLayout === "list"} + /> + } + onChange={handleChange} + isSelected={currentLayout === "grid"} + /> + ); }; diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index 52cabec50..01a4bddda 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -39,8 +39,8 @@ import { } from "../../Icons"; import { useFolderOperations } from "../utils/useOperations"; import "./Operations.css"; -import Client from "@fnndsc/chrisapi"; -import ChrisAPIClient from "../../../api/chrisapiclient"; +import { useLocation } from "react-router"; +import LayoutSwitch from "./LayoutSwitch"; export enum ContextTypes { feed_table = "FEEDS_TABLE", @@ -199,6 +199,7 @@ const items = [ ]; const Operations = React.forwardRef((props: OperationProps, ref) => { + const location = useLocation(); const { inValidateFolders, computedPath, @@ -445,6 +446,15 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { {toolbarItems} + {location.pathname.startsWith("/library/") && ( + + + + )} diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index bbc77385e..02d38a4ed 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -9,20 +9,19 @@ import { useQuery, useQueryClient, } from "@tanstack/react-query"; -import { Alert, Typography } from "../Antd"; import { debounce } from "lodash"; import { useEffect, useRef, useState } from "react"; import { useLocation, useNavigate } from "react-router"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useTypedSelector } from "../../store/hooks"; +import { Alert, Typography } from "../Antd"; import { EmptyStateComponent, InfoIcon, SpinContainer } from "../Common"; import WrapperConnect from "../Wrapper"; import BreadcrumbContainer from "./components/BreadcrumbContainer"; import { FilesCard, LinkCard } from "./components/FileCard"; import { FolderCard } from "./components/FolderCard"; -import Operations from "./components/Operations"; import LibraryTable from "./components/LibraryTable"; -import LayoutSwitch from "./components/LayoutSwitch"; +import Operations from "./components/Operations"; const { Paragraph } = Typography; @@ -199,8 +198,6 @@ const NewLibrary = () => { folderList={data?.folderList} /> - - { From 711dbb5cc635892c2733674a4fffecc3a89d4321 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Thu, 22 Aug 2024 17:26:56 -0400 Subject: [PATCH 126/337] feat: Update how queries are refetched or invalidated --- .../FeedOutputBrowser/FeedOutputBrowser.tsx | 6 +- .../FeedOutputBrowser/FileBrowser.tsx | 19 ++++-- src/components/FeedOutputBrowser/types.ts | 2 +- .../FeedOutputBrowser/useFeedBrowser.tsx | 15 ++--- src/components/Feeds/FeedListView.tsx | 34 ++++------ .../NewLibrary/components/ContextMenu.tsx | 11 ++- .../NewLibrary/components/FileCard.tsx | 27 ++++---- .../NewLibrary/components/FolderCard.tsx | 9 ++- .../NewLibrary/components/Operations.tsx | 28 +++----- src/components/NewLibrary/context/index.tsx | 67 +++++++++++++++++++ src/components/NewLibrary/index.tsx | 12 ++-- .../NewLibrary/utils/useDeletePayload.tsx | 9 +-- .../NewLibrary/utils/useFeedOperations.tsx | 10 ++- .../NewLibrary/utils/useOperations.tsx | 22 +++--- src/routes.tsx | 21 ++++-- 15 files changed, 181 insertions(+), 111 deletions(-) create mode 100644 src/components/NewLibrary/context/index.tsx diff --git a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx index 825522e45..293ddd532 100644 --- a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx +++ b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx @@ -7,9 +7,9 @@ import { } from "@patternfly/react-core"; import { Alert } from "../Antd"; import { SpinContainer } from "../Common"; +import "./FeedOutputBrowser.css"; import FileBrowser from "./FileBrowser"; import { useFeedBrowser } from "./useFeedBrowser"; -import "./FeedOutputBrowser.css"; export interface FeedOutputBrowserProps { handlePluginSelect: (node: PluginInstance) => void; @@ -27,7 +27,7 @@ const FeedOutputBrowser: React.FC = () => { filesLoading, isError, error, - inValidateFolders, + currentPath, } = useFeedBrowser(); return ( @@ -38,7 +38,7 @@ const FeedOutputBrowser: React.FC = () => { handleFileClick={handleFileClick} pluginFilesPayload={pluginFilesPayload} filesLoading={filesLoading} - inValidateFolders={inValidateFolders} + currentPath={currentPath} /> ) : statusTitle && statusTitles.includes(statusTitle) ? ( diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index f5c1c0ef4..a9ec311a4 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -15,6 +15,7 @@ import { Tooltip, } from "@patternfly/react-core"; import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; +import { format } from "date-fns"; import { useContext, useEffect } from "react"; import { useDispatch } from "react-redux"; import { getFileExtension } from "../../api/model"; @@ -30,6 +31,9 @@ import { ThemeContext } from "../DarkTheme/useTheme"; import { DrawerActionButton } from "../Feeds/DrawerUtils"; import { handleMaximize, handleMinimize } from "../Feeds/utilties"; import { HomeIcon } from "../Icons"; +import { FolderContextMenu } from "../NewLibrary/components/ContextMenu"; +import Operations from "../NewLibrary/components/Operations"; +import { OperationContext } from "../NewLibrary/context"; import useLongPress, { getBackgroundRowColor, } from "../NewLibrary/utils/longpress"; @@ -37,9 +41,6 @@ import FileDetailView from "../Preview/FileDetailView"; import XtkViewer from "../XtkViewer/XtkViewer"; import type { FileBrowserProps } from "./types"; import { bytesToSize } from "./utilities"; -import { FolderContextMenu } from "../NewLibrary/components/ContextMenu"; -import Operations from "../NewLibrary/components/Operations"; -import { format } from "date-fns"; const previewAnimation = [{ opacity: "0.0" }, { opacity: "1.0" }]; @@ -68,7 +69,7 @@ const FileBrowser = (props: FileBrowserProps) => { handleFileClick, selected, filesLoading, - inValidateFolders, + currentPath: additionalKey, } = props; const selectedFile = useTypedSelector((state) => state.explorer.selectedFile); const drawerState = useTypedSelector((state) => state.drawers); @@ -245,7 +246,10 @@ const FileBrowser = (props: FileBrowserProps) => { return (
{ diff --git a/src/components/FeedOutputBrowser/types.ts b/src/components/FeedOutputBrowser/types.ts index 0f757b213..9e0b3110c 100644 --- a/src/components/FeedOutputBrowser/types.ts +++ b/src/components/FeedOutputBrowser/types.ts @@ -19,7 +19,7 @@ export interface FileBrowserProps { handleFileClick: (path: string) => void; selected: PluginInstance; filesLoading: boolean; - inValidateFolders: () => void; + currentPath: string; } export interface FileBrowserState { diff --git a/src/components/FeedOutputBrowser/useFeedBrowser.tsx b/src/components/FeedOutputBrowser/useFeedBrowser.tsx index 10a70abe3..a911548bf 100644 --- a/src/components/FeedOutputBrowser/useFeedBrowser.tsx +++ b/src/components/FeedOutputBrowser/useFeedBrowser.tsx @@ -5,8 +5,7 @@ import type { import { useQuery, useQueryClient } from "@tanstack/react-query"; import React from "react"; import ChrisAPIClient from "../../api/chrisapiclient"; -import { fetchResource } from "../../api/common"; -import { catchError } from "../../api/common"; +import { catchError, fetchResource } from "../../api/common"; import { useTypedSelector } from "../../store/hooks"; import type { FilesPayload } from "./types"; @@ -104,13 +103,15 @@ export const useFeedBrowser = () => { (statusTitle && status.includes(statusTitle)) ); + const queryKey = ["pluginFiles", currentPath]; + const { data: pluginFilesPayload, isLoading: filesLoading, isError, error, } = useQuery({ - queryKey: ["pluginFiles", currentPath], + queryKey: queryKey, queryFn: () => fetchFilesFromAPath(currentPath), enabled: !!selected && !!currentPath && finished, }); @@ -141,12 +142,6 @@ export const useFeedBrowser = () => { } }; - const inValidateFolders = () => { - queryClient.refetchQueries({ - queryKey: ["pluginFiles", currentPath], - }); - }; - return { handleFileClick, filesLoading, @@ -159,6 +154,6 @@ export const useFeedBrowser = () => { pluginFilesPayload, filesStatus: drawerState.files, previewStatus: drawerState.preview, - inValidateFolders, + currentPath, }; }; diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index eff12ff68..b3f3d5fbc 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -16,7 +16,7 @@ import { Tooltip, } from "@patternfly/react-core"; import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; -import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { useQuery } from "@tanstack/react-query"; import { format } from "date-fns"; import type React from "react"; import { useContext, useEffect, useState } from "react"; @@ -30,7 +30,7 @@ import { CreateFeedProvider } from "../CreateFeed/context"; import { ThemeContext } from "../DarkTheme/useTheme"; import { SearchIcon } from "../Icons"; import { FolderContextMenu } from "../NewLibrary/components/ContextMenu"; -import Operations, { ContextTypes } from "../NewLibrary/components/Operations"; +import Operations from "../NewLibrary/components/Operations"; import useLongPress from "../NewLibrary/utils/longpress"; import { PipelineProvider } from "../PipelinesCopy/context"; import WrapperConnect from "../Wrapper"; @@ -40,6 +40,7 @@ import { fetchPublicFeeds, getPluginInstanceDetails, } from "./utilties"; +import { OperationContext } from "../NewLibrary/context"; const { Paragraph } = Typography; @@ -52,7 +53,6 @@ const useSearchQuery = (query: URLSearchParams) => ({ }); const TableSelectable: React.FC = () => { - const queryClient = useQueryClient(); const query = useSearchQueryParams(); const navigate = useNavigate(); @@ -99,10 +99,6 @@ const TableSelectable: React.FC = () => { ); }; - const handleFilterChange = (search: string, searchType: string) => { - navigate(`/feeds?search=${search}&searchType=${searchType}&type=${type}`); - }; - const onExampleTypeChange: ToggleGroupItemProps["onChange"] = (event) => { const id = event.currentTarget.id; navigate( @@ -134,12 +130,6 @@ const TableSelectable: React.FC = () => { const loadingFeedState = isLoading || isFetching || publicFeedLoading || publicFeedFetching; - const inValidateFolders = () => { - queryClient.refetchQueries({ - queryKey: ["feeds"], - }); - }; - const generatePagination = (feedCount?: number) => { if (!feedCount && loadingFeedState) { return ; @@ -218,9 +208,11 @@ const TableSelectable: React.FC = () => { {loadingFeedState ? ( @@ -247,7 +239,7 @@ const TableSelectable: React.FC = () => { columnNames={columnNames} allFeeds={feedsToDisplay} type={type} - inValidateFolders={inValidateFolders} + additionalKeys={[perPage, page, type, search, searchType]} /> ))} @@ -276,13 +268,13 @@ interface TableRowProps { status: string; }; type: string; - inValidateFolders: () => void; + additionalKeys: string[]; } const TableRow: React.FC = ({ feed, columnNames, - inValidateFolders, + additionalKeys, }) => { const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { handlers } = useLongPress(); @@ -337,8 +329,10 @@ const TableRow: React.FC = ({ return ( void; + origin: OriginState; folderList?: FileBrowserFolderList; - context?: ContextTypes; } export const FolderContextMenu = (props: ContextMenuProps) => { - const { children, inValidateFolders, folderList, computedPath, context } = - props; + const { children, origin, folderList, computedPath } = props; const { modalInfo, userError, @@ -32,7 +31,7 @@ export const FolderContextMenu = (props: ContextMenuProps) => { contextHolder, setUserErrors, setModalInfo, - } = useFolderOperations(inValidateFolders, computedPath, folderList, context); + } = useFolderOperations(origin, computedPath, folderList); const items: MenuProps["items"] = [ { key: "createFeed", label: "Create Feed", icon: }, diff --git a/src/components/NewLibrary/components/FileCard.tsx b/src/components/NewLibrary/components/FileCard.tsx index aa63d528a..9caec2355 100644 --- a/src/components/NewLibrary/components/FileCard.tsx +++ b/src/components/NewLibrary/components/FileCard.tsx @@ -32,6 +32,7 @@ import useLongPress, { getBackgroundRowColor, } from "../utils/longpress"; import { FolderContextMenu } from "./ContextMenu"; +import { OperationContext, type OriginState } from "../context"; type Pagination = { totalCount: number; @@ -42,9 +43,9 @@ type ComponentProps = { name: string; computedPath: string; date: string; + origin: OriginState; onClick?: (e: React.MouseEvent) => void; onMouseDown?: () => void; - inValidateFolders?: () => void; onCheckboxChange?: (e: React.FormEvent) => void; onContextMenuClick?: (e: React.MouseEvent) => void; onNavigate: () => void; @@ -55,7 +56,7 @@ type ComponentProps = { const PresentationComponent: React.FC = ({ name, - inValidateFolders, + origin, date, onClick, onNavigate, @@ -67,7 +68,7 @@ const PresentationComponent: React.FC = ({ bgRow, }) => ( - inValidateFolders?.()}> + = ({ file, computedPath, }) => { - const queryClient = useQueryClient(); const { isDarkTheme } = useContext(ThemeContext); const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const handleDownloadMutation = useDownload(); @@ -235,12 +235,11 @@ export const SubFileCard: React.FC = ({ <> {contextHolder} { - queryClient.refetchQueries({ - queryKey: ["library_folders", computedPath], - }); + origin={{ + type: OperationContext.LIBRARY, + additionalKeys: [computedPath], }} + onClick={handleClick} onMouseDown={handlers.handleOnMouseDown} onCheckboxChange={handleCheckboxChange} onContextMenuClick={handleClick} @@ -280,7 +279,6 @@ export const SubLinkCard: React.FC = ({ computedPath, }) => { const navigate = useNavigate(); - const queryClient = useQueryClient(); const { isDarkTheme } = useContext(ThemeContext); const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const handleDownloadMutation = useDownload(); @@ -328,12 +326,11 @@ export const SubLinkCard: React.FC = ({ <> {contextHolder} { - queryClient.refetchQueries({ - queryKey: ["library_folders", computedPath], - }); + origin={{ + type: OperationContext.LIBRARY, + additionalKeys: [computedPath], }} + onClick={handleClick} onMouseDown={handlers.handleOnMouseDown} onCheckboxChange={handleCheckboxChange} onContextMenuClick={handleClick} diff --git a/src/components/NewLibrary/components/FolderCard.tsx b/src/components/NewLibrary/components/FolderCard.tsx index c4c2a0a74..33d33199f 100644 --- a/src/components/NewLibrary/components/FolderCard.tsx +++ b/src/components/NewLibrary/components/FolderCard.tsx @@ -20,6 +20,7 @@ import { ThemeContext } from "../../DarkTheme/useTheme"; import { FolderIcon } from "../../Icons"; import useLongPress, { getBackgroundRowColor } from "../utils/longpress"; import { FolderContextMenu } from "./ContextMenu"; +import { OperationContext } from "../context"; type Pagination = { totalCount: number; @@ -67,7 +68,6 @@ export function getFolderName(folder: FileBrowserFolder, computedPath: string) { export const SubFolderCard: React.FC = (props) => { const { folder, computedPath, handleFolderClick } = props; - const queryClient = useQueryClient(); const isDarkTheme = useContext(ThemeContext).isDarkTheme; const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { handlers } = useLongPress(); @@ -105,10 +105,9 @@ export const SubFolderCard: React.FC = (props) => { return ( { - queryClient.refetchQueries({ - queryKey: ["library_folders", computedPath], - }); + origin={{ + type: OperationContext.LIBRARY, + additionalKeys: [computedPath], }} > void; + origin: OriginState; computedPath?: string; folderList?: FileBrowserFolderList; customStyle?: { @@ -80,7 +75,6 @@ interface OperationProps { customClassName?: { [key: string]: string; }; - context?: ContextTypes; } export const AddModal = (props: AddModalProps) => { @@ -199,17 +193,13 @@ const items = [ ]; const Operations = React.forwardRef((props: OperationProps, ref) => { + const { invalidateQueries } = useOperationsContext(); const location = useLocation(); - const { - inValidateFolders, - computedPath, - folderList, - customStyle, - customClassName, - context, - } = props; + const { origin, computedPath, folderList, customStyle, customClassName } = + props; const dispatch = useDispatch(); + const { modalInfo, userError, @@ -222,7 +212,7 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { contextHolder, setUserErrors, setModalInfo, - } = useFolderOperations(inValidateFolders, computedPath, folderList, context); + } = useFolderOperations(origin, computedPath, folderList); useImperativeHandle(ref, () => ({ triggerFileUpload: () => { @@ -248,9 +238,9 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { Object.values(folderUploadStatus).some(isUploadComplete); if (hasFileUploadCompleted || hasFolderUploadCompleted) { - inValidateFolders(); + invalidateQueries(); } - }, [fileUploadStatus, folderUploadStatus, inValidateFolders]); + }, [fileUploadStatus, folderUploadStatus, origin]); const renderOperationButton = ( icon: React.ReactNode, diff --git a/src/components/NewLibrary/context/index.tsx b/src/components/NewLibrary/context/index.tsx new file mode 100644 index 000000000..19bba20a4 --- /dev/null +++ b/src/components/NewLibrary/context/index.tsx @@ -0,0 +1,67 @@ +import { useQueryClient } from "@tanstack/react-query"; +import { createContext, useContext, useState } from "react"; + +export enum OperationContext { + LIBRARY = "library", + FEEDS = "feeds", + FILEBROWSER = "fileBrowser", +} + +export interface OriginState { + type: OperationContext; + additionalKeys: string[]; +} + +interface OperationsContextType { + invalidateQueries: () => void; + setOrigin: React.Dispatch>; +} + +const OperationsContext = createContext( + undefined, +); + +export const useOperationsContext = () => { + const context = useContext(OperationsContext); + if (!context) { + throw new Error( + "useOperationsContext must be used within an OperationsProvider", + ); + } + return context; +}; + +export const OperationsProvider: React.FC< + React.PropsWithChildren<{ + children: React.ReactElement; + }> +> = ({ children }) => { + const queryClient = useQueryClient(); + const [origin, setOrigin] = useState(); + + const invalidateQueries = () => { + switch (origin?.type) { + case OperationContext.LIBRARY: + queryClient.refetchQueries({ + queryKey: ["library_folders", ...origin.additionalKeys], + }); + break; + case OperationContext.FEEDS: + console.log("additionalKeys", origin.additionalKeys); + queryClient.refetchQueries({ + queryKey: ["feeds", ...origin.additionalKeys], + }); + break; + case OperationContext.FILEBROWSER: + queryClient.refetchQueries({ + queryKey: ["pluginFiles", ...origin.additionalKeys], + }); + } + }; + + return ( + + {children} + + ); +}; diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index 02d38a4ed..b4a6b204a 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -22,6 +22,7 @@ import { FilesCard, LinkCard } from "./components/FileCard"; import { FolderCard } from "./components/FolderCard"; import LibraryTable from "./components/LibraryTable"; import Operations from "./components/Operations"; +import { OperationContext } from "./context"; const { Paragraph } = Typography; @@ -95,7 +96,6 @@ const NewLibrary = () => { } const { pathname } = useLocation(); - const queryClient = useQueryClient(); const navigate = useNavigate(); const [pageNumber, setPageNumber] = useState(1); const [isFirstLoad, setIsFirstLoad] = useState(true); @@ -104,8 +104,9 @@ const NewLibrary = () => { const decodedPath = decodeURIComponent(pathname); const currentPathSplit = decodedPath.split("/library/")[1]; const computedPath = currentPathSplit || "/"; + const queryKey = ["library_folders", computedPath, pageNumber]; const { data, isLoading, isError, error } = useQuery({ - queryKey: ["library_folders", computedPath, pageNumber], + queryKey: queryKey, queryFn: () => fetchFolders(computedPath, pageNumber), placeholderData: keepPreviousData, structuralSharing: true, @@ -189,10 +190,9 @@ const NewLibrary = () => { /> { - queryClient.refetchQueries({ - queryKey: ["library_folders", computedPath], - }); + origin={{ + type: OperationContext.LIBRARY, + additionalKeys: [computedPath], }} computedPath={computedPath} folderList={data?.folderList} diff --git a/src/components/NewLibrary/utils/useDeletePayload.tsx b/src/components/NewLibrary/utils/useDeletePayload.tsx index b0a7f957e..c6b95b0cf 100644 --- a/src/components/NewLibrary/utils/useDeletePayload.tsx +++ b/src/components/NewLibrary/utils/useDeletePayload.tsx @@ -5,14 +5,17 @@ import { useDispatch } from "react-redux"; import ChrisAPIClient from "../../../api/chrisapiclient"; import { clearSelectedPaths } from "../../../store/cart/cartSlice"; import type { SelectionPayload } from "../../../store/cart/types"; +import { type OriginState, useOperationsContext } from "../context"; type DeletionErrors = { path: string; message: string }[]; -const useDeletePayload = (inValidateFolders: () => void, api: any) => { +const useDeletePayload = (origin: OriginState, api: any) => { + const { setOrigin, invalidateQueries } = useOperationsContext(); const dispatch = useDispatch(); const [notificationKey, setNotificationKey] = useState(null); const handleDelete = async (paths: SelectionPayload[]) => { + setOrigin(origin); const errors: DeletionErrors = []; const successfulPaths: string[] = []; @@ -27,7 +30,6 @@ const useDeletePayload = (inValidateFolders: () => void, api: any) => { Authorization: `Token ${client.auth.token}`, }, }); - successfulPaths.push(pathToClear); } catch (e) { if (axios.isAxiosError(e)) { @@ -43,9 +45,7 @@ const useDeletePayload = (inValidateFolders: () => void, api: any) => { }), ); - inValidateFolders(); successfulPaths.forEach((path) => dispatch(clearSelectedPaths(path))); - return errors.length > 0 ? errors : null; }; @@ -79,6 +79,7 @@ const useDeletePayload = (inValidateFolders: () => void, api: any) => { placement: "topRight", }); } else { + invalidateQueries(); api.success({ message: "Deletion Successful", description: "Selected files and folders were successfully deleted.", diff --git a/src/components/NewLibrary/utils/useFeedOperations.tsx b/src/components/NewLibrary/utils/useFeedOperations.tsx index 5375c9cf5..d39cc730c 100644 --- a/src/components/NewLibrary/utils/useFeedOperations.tsx +++ b/src/components/NewLibrary/utils/useFeedOperations.tsx @@ -5,8 +5,10 @@ import { getFileName } from "../../../api/common"; import { createFeed } from "../../../store/cart/downloadSaga"; import type { SelectionPayload } from "../../../store/cart/types"; import { useTypedSelector } from "../../../store/hooks"; +import { type OriginState, useOperationsContext } from "../context"; -const useFeedOperations = (inValidateFolders: () => void, api: any) => { +const useFeedOperations = (origin: OriginState, api: any) => { + const { setOrigin, invalidateQueries } = useOperationsContext(); const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const giveMePaths = useMemo(() => { @@ -14,6 +16,7 @@ const useFeedOperations = (inValidateFolders: () => void, api: any) => { }, [selectedPaths]); const handleDuplicate = async () => { + setOrigin(origin); const paths = giveMePaths; try { const feedList = await Promise.all( @@ -44,6 +47,7 @@ const useFeedOperations = (inValidateFolders: () => void, api: any) => { }; const handleMerge = async () => { + setOrigin(origin); const paths = giveMePaths; try { const sanitizedPaths = await Promise.all( @@ -86,7 +90,7 @@ const useFeedOperations = (inValidateFolders: () => void, api: any) => { api.success({ message: "Feed copied successfully", }); - inValidateFolders(); + invalidateQueries(); }, onError: (e) => { api.error({ @@ -102,7 +106,7 @@ const useFeedOperations = (inValidateFolders: () => void, api: any) => { api.success({ message: "Feed merged successfully", }); - inValidateFolders(); + invalidateQueries(); }, onError: (e) => { api.error({ diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index a275077be..417cb4d9a 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -13,16 +13,17 @@ import { } from "../../../store/cart/cartSlice"; import { useTypedSelector } from "../../../store/hooks"; import { notification } from "../../Antd"; -import type { AdditionalValues, ContextTypes } from "../components/Operations"; +import type { AdditionalValues } from "../components/Operations"; +import { type OriginState, useOperationsContext } from "../context"; import useDeletePayload from "../utils/useDeletePayload"; import useFeedOperations from "./useFeedOperations"; export const useFolderOperations = ( - inValidateFolders: () => void, + origin: OriginState, computedPath?: string, // This path is passed to for file upload and folder uploads in the library folderList?: FileBrowserFolderList, - _context?: ContextTypes, ) => { + const { setOrigin, invalidateQueries } = useOperationsContext(); const router = useContext(MainRouterContext); const { selectedPaths } = useTypedSelector((state) => state.cart); const username = useTypedSelector((state) => state.user.username); @@ -33,9 +34,9 @@ export const useFolderOperations = ( const fileInput = useRef(null); const [api, contextHolder] = notification.useNotification(); - const deleteMutation = useDeletePayload(inValidateFolders, api); + const deleteMutation = useDeletePayload(origin, api); const { handleDuplicateMutation, handleMergeMutation } = useFeedOperations( - inValidateFolders, + origin, api, ); @@ -46,6 +47,7 @@ export const useFolderOperations = ( }; const handleFileChange = async (e: React.ChangeEvent) => { + setOrigin(origin); const fileList = e.target.files || []; const files = Array.from(fileList); dispatch( @@ -55,6 +57,7 @@ export const useFolderOperations = ( }; const handleFolderChange = async (e: React.ChangeEvent) => { + setOrigin(origin); const fileList = e.target.files || []; const files = Array.from(fileList); dispatch( @@ -68,10 +71,11 @@ export const useFolderOperations = ( }; const createFolder = async (inputValue: string) => { + setOrigin(origin); const finalPath = `${computedPath}/${inputValue}`; try { await folderList?.post({ path: finalPath }); - inValidateFolders(); + invalidateQueries(); } catch (error: any) { const path = error?.response?.data?.path; const message = !isEmpty(path) ? path[0] : "Failed to create a folder."; @@ -150,6 +154,7 @@ export const useFolderOperations = ( } case "download": + setOrigin(origin); dispatch(setToggleCart()); dispatch( startDownload({ @@ -160,11 +165,10 @@ export const useFolderOperations = ( // Invalidate the folders after a time limit. This is poorly designed, as this part of the UI assumes // that a feed will be created within a certain time frame. Mixing Redux and React Query isn't effective. // A better design needs to be considered. - setTimeout(() => { - inValidateFolders(); - }, 2000); + invalidateQueries(); break; case "anonymize": + setOrigin(origin); dispatch(setToggleCart()); dispatch( startAnonymize({ diff --git a/src/routes.tsx b/src/routes.tsx index 512d489a1..91ca8bf51 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -1,5 +1,10 @@ import * as React from "react"; -import { useNavigate, useRoutes, matchPath } from "react-router-dom"; +import { + useNavigate, + useRoutes, + matchPath, + useLocation, +} from "react-router-dom"; import ComputePage from "./components/ComputePage"; import Dashboard from "./components/Dashboard"; import DatasetRedirect from "./components/DatasetRedirect"; @@ -24,6 +29,7 @@ import Store from "./components/Store"; import { useTypedSelector } from "./store/hooks"; import { useDispatch } from "react-redux"; import { setSidebarActive } from "./store/ui/uiSlice"; +import { OperationsProvider } from "./components/NewLibrary/context"; interface IState { selectData?: Series; @@ -43,6 +49,7 @@ export const [State, MainRouterContext] = RouterContext({ }); export const MainRouter: React.FC = () => { + const location = useLocation(); const dispatch = useDispatch(); const [state, setState] = React.useState(State); const [route, setRoute] = React.useState(); @@ -125,7 +132,9 @@ export const MainRouter: React.FC = () => { {...{ actions, state, route, setRoute }} context={MainRouterContext} > - + + + ), @@ -138,7 +147,9 @@ export const MainRouter: React.FC = () => { {...{ actions, state, route, setRoute }} context={MainRouterContext} > - + + + ), }, @@ -149,7 +160,9 @@ export const MainRouter: React.FC = () => { {...{ actions, state, route, setRoute }} context={MainRouterContext} > - + + + ), }, From b3c1d2b6f25c92a9917a79e004f55debe265c901 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Thu, 22 Aug 2024 17:30:43 -0400 Subject: [PATCH 127/337] fix: Cleanup --- src/components/NewLibrary/components/LibraryTable.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 8e1f91281..5fe3aaaa8 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -25,6 +25,7 @@ import { FolderContextMenu } from "./ContextMenu"; import { getFileName, getLinkFileName } from "./FileCard"; import { getFolderName } from "./FolderCard"; import { formatBytes } from "../../Feeds/utilties"; +import { OperationContext } from "../context"; interface TableProps { data: { @@ -96,10 +97,9 @@ const LibraryTable: React.FunctionComponent = ( return ( { - queryClient.refetchQueries({ - queryKey: ["library_folders", computedPath], - }); + origin={{ + type: OperationContext.LIBRARY, + additionalKeys: [computedPath], }} key={path} > From b0ea26d208e0ff64f120431c965b063692fb8a35 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Fri, 23 Aug 2024 11:10:06 -0400 Subject: [PATCH 128/337] feat: Update how the context in which operations are called is determined --- src/components/NewLibrary/context/index.tsx | 26 ++++++++++++------- src/components/NewLibrary/index.tsx | 6 +---- .../NewLibrary/utils/useDeletePayload.tsx | 4 +-- .../NewLibrary/utils/useFeedOperations.tsx | 6 ++--- .../NewLibrary/utils/useOperations.tsx | 12 ++++----- 5 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/components/NewLibrary/context/index.tsx b/src/components/NewLibrary/context/index.tsx index 19bba20a4..2d4dbc391 100644 --- a/src/components/NewLibrary/context/index.tsx +++ b/src/components/NewLibrary/context/index.tsx @@ -1,5 +1,5 @@ import { useQueryClient } from "@tanstack/react-query"; -import { createContext, useContext, useState } from "react"; +import { createContext, useContext, useRef } from "react"; export enum OperationContext { LIBRARY = "library", @@ -14,7 +14,7 @@ export interface OriginState { interface OperationsContextType { invalidateQueries: () => void; - setOrigin: React.Dispatch>; + handleOrigin: (origin: OriginState) => void; } const OperationsContext = createContext( @@ -37,30 +37,38 @@ export const OperationsProvider: React.FC< }> > = ({ children }) => { const queryClient = useQueryClient(); - const [origin, setOrigin] = useState(); + const originRef = useRef(); + + const handleOrigin = (newOrigin: OriginState) => { + originRef.current = newOrigin; + }; const invalidateQueries = () => { - switch (origin?.type) { + const additionalKeys = originRef.current?.additionalKeys || []; + const type = originRef.current?.type; + + if (!type) return; + switch (type) { case OperationContext.LIBRARY: queryClient.refetchQueries({ - queryKey: ["library_folders", ...origin.additionalKeys], + queryKey: ["library_folders", ...additionalKeys], }); break; + case OperationContext.FEEDS: - console.log("additionalKeys", origin.additionalKeys); queryClient.refetchQueries({ - queryKey: ["feeds", ...origin.additionalKeys], + queryKey: ["feeds", ...additionalKeys], }); break; case OperationContext.FILEBROWSER: queryClient.refetchQueries({ - queryKey: ["pluginFiles", ...origin.additionalKeys], + queryKey: ["pluginFiles", ...additionalKeys], }); } }; return ( - + {children} ); diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index b4a6b204a..23dd4ae43 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -4,11 +4,7 @@ import type { FileBrowserFolderLinkFile, } from "@fnndsc/chrisapi"; import { Button, Grid, PageSection } from "@patternfly/react-core"; -import { - keepPreviousData, - useQuery, - useQueryClient, -} from "@tanstack/react-query"; +import { keepPreviousData, useQuery } from "@tanstack/react-query"; import { debounce } from "lodash"; import { useEffect, useRef, useState } from "react"; import { useLocation, useNavigate } from "react-router"; diff --git a/src/components/NewLibrary/utils/useDeletePayload.tsx b/src/components/NewLibrary/utils/useDeletePayload.tsx index c6b95b0cf..33970a25d 100644 --- a/src/components/NewLibrary/utils/useDeletePayload.tsx +++ b/src/components/NewLibrary/utils/useDeletePayload.tsx @@ -10,12 +10,12 @@ import { type OriginState, useOperationsContext } from "../context"; type DeletionErrors = { path: string; message: string }[]; const useDeletePayload = (origin: OriginState, api: any) => { - const { setOrigin, invalidateQueries } = useOperationsContext(); + const { handleOrigin, invalidateQueries } = useOperationsContext(); const dispatch = useDispatch(); const [notificationKey, setNotificationKey] = useState(null); const handleDelete = async (paths: SelectionPayload[]) => { - setOrigin(origin); + handleOrigin(origin); const errors: DeletionErrors = []; const successfulPaths: string[] = []; diff --git a/src/components/NewLibrary/utils/useFeedOperations.tsx b/src/components/NewLibrary/utils/useFeedOperations.tsx index d39cc730c..8257e6410 100644 --- a/src/components/NewLibrary/utils/useFeedOperations.tsx +++ b/src/components/NewLibrary/utils/useFeedOperations.tsx @@ -8,7 +8,7 @@ import { useTypedSelector } from "../../../store/hooks"; import { type OriginState, useOperationsContext } from "../context"; const useFeedOperations = (origin: OriginState, api: any) => { - const { setOrigin, invalidateQueries } = useOperationsContext(); + const { handleOrigin, invalidateQueries } = useOperationsContext(); const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const giveMePaths = useMemo(() => { @@ -16,7 +16,7 @@ const useFeedOperations = (origin: OriginState, api: any) => { }, [selectedPaths]); const handleDuplicate = async () => { - setOrigin(origin); + handleOrigin(origin); const paths = giveMePaths; try { const feedList = await Promise.all( @@ -47,7 +47,7 @@ const useFeedOperations = (origin: OriginState, api: any) => { }; const handleMerge = async () => { - setOrigin(origin); + handleOrigin(origin); const paths = giveMePaths; try { const sanitizedPaths = await Promise.all( diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index 417cb4d9a..ffc3323e8 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -23,7 +23,7 @@ export const useFolderOperations = ( computedPath?: string, // This path is passed to for file upload and folder uploads in the library folderList?: FileBrowserFolderList, ) => { - const { setOrigin, invalidateQueries } = useOperationsContext(); + const { handleOrigin, invalidateQueries } = useOperationsContext(); const router = useContext(MainRouterContext); const { selectedPaths } = useTypedSelector((state) => state.cart); const username = useTypedSelector((state) => state.user.username); @@ -47,7 +47,7 @@ export const useFolderOperations = ( }; const handleFileChange = async (e: React.ChangeEvent) => { - setOrigin(origin); + handleOrigin(origin); const fileList = e.target.files || []; const files = Array.from(fileList); dispatch( @@ -57,7 +57,7 @@ export const useFolderOperations = ( }; const handleFolderChange = async (e: React.ChangeEvent) => { - setOrigin(origin); + handleOrigin(origin); const fileList = e.target.files || []; const files = Array.from(fileList); dispatch( @@ -71,7 +71,7 @@ export const useFolderOperations = ( }; const createFolder = async (inputValue: string) => { - setOrigin(origin); + handleOrigin(origin); const finalPath = `${computedPath}/${inputValue}`; try { await folderList?.post({ path: finalPath }); @@ -154,7 +154,7 @@ export const useFolderOperations = ( } case "download": - setOrigin(origin); + handleOrigin(origin); dispatch(setToggleCart()); dispatch( startDownload({ @@ -168,7 +168,7 @@ export const useFolderOperations = ( invalidateQueries(); break; case "anonymize": - setOrigin(origin); + handleOrigin(origin); dispatch(setToggleCart()); dispatch( startAnonymize({ From f4363d1250a19c9d7f0488353d4479ff5a6eab78 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Fri, 23 Aug 2024 15:56:25 -0400 Subject: [PATCH 129/337] feat: Update file previews for library table --- package-lock.json | 6414 ++++++++++------- .../NewLibrary/components/FileCard.tsx | 1 - .../NewLibrary/components/LibraryTable.tsx | 30 +- .../Preview/displays/ImageDisplay.tsx | 32 +- 4 files changed, 3988 insertions(+), 2489 deletions(-) diff --git a/package-lock.json b/package-lock.json index c5faa2e6e..d0a803e00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -99,6 +99,8 @@ }, "node_modules/@ampproject/remapping": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -118,9 +120,9 @@ } }, "node_modules/@ant-design/cssinjs": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.21.0.tgz", - "integrity": "sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.21.1.tgz", + "integrity": "sha512-tyWnlK+XH7Bumd0byfbCiZNK43HEubMoCcu9VxwsAwiHdHTgWa+tMN0/yvxa+e8EzuFP1WdUNNPclRpVtD33lg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -129,7 +131,7 @@ "classnames": "^2.3.1", "csstype": "^3.1.3", "rc-util": "^5.35.0", - "stylis": "^4.0.13" + "stylis": "^4.3.3" }, "peerDependencies": { "react": ">=16.0.0", @@ -152,9 +154,9 @@ } }, "node_modules/@ant-design/cssinjs-utils/node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -176,9 +178,9 @@ } }, "node_modules/@ant-design/fast-color/node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -214,9 +216,9 @@ "license": "MIT" }, "node_modules/@ant-design/icons/node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -243,6 +245,8 @@ }, "node_modules/@babel/code-frame": { "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.7", @@ -253,7 +257,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.2", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -261,6 +267,8 @@ }, "node_modules/@babel/core": { "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -289,20 +297,26 @@ }, "node_modules/@babel/core/node_modules/convert-source-map": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.25.0", + "version": "7.25.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz", + "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.0", + "@babel/types": "^7.25.4", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -313,6 +327,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.25.2", @@ -327,6 +343,8 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -334,6 +352,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", @@ -345,6 +365,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.24.7", @@ -361,6 +383,8 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -368,6 +392,8 @@ }, "node_modules/@babel/helper-simple-access": { "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", @@ -379,6 +405,8 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -386,6 +414,8 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -393,6 +423,8 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -400,6 +432,8 @@ }, "node_modules/@babel/helpers": { "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "license": "MIT", "dependencies": { "@babel/template": "^7.25.0", @@ -411,6 +445,8 @@ }, "node_modules/@babel/highlight": { "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", @@ -423,10 +459,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.3", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", + "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.25.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -437,6 +475,8 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -449,10 +489,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -463,6 +505,8 @@ }, "node_modules/@babel/runtime": { "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", + "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -473,6 +517,8 @@ }, "node_modules/@babel/template": { "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", @@ -484,14 +530,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.3", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", + "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", + "@babel/generator": "^7.25.4", + "@babel/parser": "^7.25.4", "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", + "@babel/types": "^7.25.4", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -500,7 +548,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.2", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", + "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.24.8", @@ -513,11 +563,15 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, "license": "MIT" }, "node_modules/@biomejs/biome": { "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.8.3.tgz", + "integrity": "sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==", "dev": true, "hasInstallScript": true, "license": "MIT OR Apache-2.0", @@ -542,7 +596,7 @@ "@biomejs/cli-win32-x64": "1.8.3" } }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-darwin-arm64": { + "node_modules/@biomejs/cli-darwin-arm64": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.3.tgz", "integrity": "sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==", @@ -559,7 +613,7 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-darwin-x64": { + "node_modules/@biomejs/cli-darwin-x64": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.3.tgz", "integrity": "sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==", @@ -576,7 +630,7 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-linux-arm64": { + "node_modules/@biomejs/cli-linux-arm64": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.3.tgz", "integrity": "sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==", @@ -593,7 +647,7 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-linux-arm64-musl": { + "node_modules/@biomejs/cli-linux-arm64-musl": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.3.tgz", "integrity": "sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==", @@ -610,10 +664,10 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-linux-x64-musl": { + "node_modules/@biomejs/cli-linux-x64": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", - "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.3.tgz", + "integrity": "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==", "cpu": [ "x64" ], @@ -627,29 +681,29 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-win32-arm64": { + "node_modules/@biomejs/cli-linux-x64-musl": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", - "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", + "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT OR Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": ">=14.21.3" } }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-win32-x64": { + "node_modules/@biomejs/cli-win32-arm64": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", - "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", + "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT OR Apache-2.0", @@ -661,8 +715,10 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/cli-linux-x64": { + "node_modules/@biomejs/cli-win32-x64": { "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", + "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", "cpu": [ "x64" ], @@ -670,7 +726,7 @@ "license": "MIT OR Apache-2.0", "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=14.21.3" @@ -678,6 +734,8 @@ }, "node_modules/@cornerstonejs/codec-charls": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-charls/-/codec-charls-1.2.3.tgz", + "integrity": "sha512-qKUe6DN0dnGzhhfZLYhH9UZacMcudjxcaLXCrpxJImT/M/PQvZCT2rllu6VGJbWKJWG+dMVV2zmmleZcdJ7/cA==", "license": "MIT", "engines": { "node": ">=0.14" @@ -685,6 +743,8 @@ }, "node_modules/@cornerstonejs/codec-libjpeg-turbo-8bit": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-libjpeg-turbo-8bit/-/codec-libjpeg-turbo-8bit-1.2.2.tgz", + "integrity": "sha512-aAUMK2958YNpOb/7G6e2/aG7hExTiFTASlMt/v90XA0pRHdWiNg5ny4S5SAju0FbIw4zcMnR0qfY+yW3VG2ivg==", "license": "ISC", "engines": { "node": ">=0.14" @@ -692,6 +752,8 @@ }, "node_modules/@cornerstonejs/codec-openjpeg": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-openjpeg/-/codec-openjpeg-1.2.4.tgz", + "integrity": "sha512-UT2su6xZZnCPSuWf2ldzKa/2+guQ7BGgfBSKqxanggwJHh48gZqIAzekmsLyJHMMK5YDK+ti+fzvVJhBS3Xi/g==", "license": "MIT", "engines": { "node": ">=0.14" @@ -699,13 +761,17 @@ }, "node_modules/@cornerstonejs/codec-openjph": { "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz", + "integrity": "sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==", "license": "MIT", "engines": { "node": ">=0.14" } }, "node_modules/@cornerstonejs/core": { - "version": "1.84.0", + "version": "1.84.1", + "resolved": "https://registry.npmjs.org/@cornerstonejs/core/-/core-1.84.1.tgz", + "integrity": "sha512-tvzgaqnRS7oGlF3MwLE6YjqpTejVAF02r7azSEJuHrkypd4gutNDAjsb8Z9AFgjxQ5daLdaZjRbJiL0QgMB83Q==", "license": "MIT", "dependencies": { "@kitware/vtk.js": "30.4.1", @@ -720,14 +786,16 @@ } }, "node_modules/@cornerstonejs/dicom-image-loader": { - "version": "1.84.0", + "version": "1.84.1", + "resolved": "https://registry.npmjs.org/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.84.1.tgz", + "integrity": "sha512-82gU9Qqd4O+POuvNekgkMphoLipiu6HsHQxBaTQ5f7r+WGT9wQwOmtJ5p3xcs0DkeHIfqvzXvvCQxfQdX4KXBw==", "license": "MIT", "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", - "@cornerstonejs/core": "^1.84.0", + "@cornerstonejs/core": "^1.84.1", "dicom-parser": "^1.8.9", "pako": "^2.0.4", "uuid": "^9.0.0" @@ -735,13 +803,17 @@ }, "node_modules/@cornerstonejs/dicom-image-loader/node_modules/pako": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", "license": "(MIT AND Zlib)" }, "node_modules/@cornerstonejs/streaming-image-volume-loader": { - "version": "1.84.0", + "version": "1.84.1", + "resolved": "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-1.84.1.tgz", + "integrity": "sha512-XVN6RUHFuVigsr24fecMv/e9roFtlXvMsOXW0+hNsKVcLjY0Qmh6tBUd+pxfLvFmm94Tg+9rhsnEbVQEzcgVSQ==", "license": "MIT", "dependencies": { - "@cornerstonejs/core": "^1.84.0", + "@cornerstonejs/core": "^1.84.1", "comlink": "^4.4.1" }, "funding": { @@ -750,10 +822,12 @@ } }, "node_modules/@cornerstonejs/tools": { - "version": "1.84.0", + "version": "1.84.1", + "resolved": "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-1.84.1.tgz", + "integrity": "sha512-LPjdla6VznjnVKlisdr6zh0wuEBKpBRiOf6589jqAeszqWDUrJEdj1X4ZKgppg6RWjdJNG5L/lhZjhqS1M3FEA==", "license": "MIT", "dependencies": { - "@cornerstonejs/core": "^1.84.0", + "@cornerstonejs/core": "^1.84.1", "@icr/polyseg-wasm": "0.4.0", "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -795,3103 +869,3820 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", "license": "MIT" }, - "node_modules/@esbuild/linux-x64": { + "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ - "x64" + "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "aix" ], "engines": { "node": ">=12" } }, - "node_modules/@faker-js/faker": { - "version": "8.4.1", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=6.14.13" - } - }, - "node_modules/@fnndsc/chrisapi": { - "version": "1.22.0", - "license": "MIT", - "dependencies": { - "axios": "^1.6.8", - "core-js": "^3.36.1" + "node": ">=12" } }, - "node_modules/@icr/polyseg-wasm": { - "version": "0.4.0", + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.14" + "node": ">=12" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kitware/vtk.js": { - "version": "30.4.1", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "7.22.11", - "@types/webxr": "^0.5.5", - "commander": "9.2.0", - "d3-scale": "4.0.2", - "fast-deep-equal": "^3.1.3", - "fflate": "0.7.3", - "gl-matrix": "3.4.3", - "globalthis": "1.0.3", - "seedrandom": "3.0.5", - "shader-loader": "1.3.1", - "shelljs": "0.8.5", - "spark-md5": "3.0.2", - "stream-browserify": "3.0.0", - "webworker-promise": "0.5.0", - "worker-loader": "3.0.8", - "xmlbuilder2": "3.0.2" - }, - "bin": { - "vtkDataConverter": "Utilities/DataGenerator/convert-cli.js", - "xml2json": "Utilities/XMLConverter/xml2json-cli.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.17.10", - "autoprefixer": "^10.4.7", - "wslink": ">=1.1.0 || ^2.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@lukeed/csprng": { - "version": "1.1.0", + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@lukeed/uuid": { - "version": "2.0.1", + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@lukeed/csprng": "^1.1.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@mattiasbuelens/web-streams-polyfill": { - "version": "0.2.1", + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@types/whatwg-streams": "^0.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/@niivue/niivue": { - "version": "0.41.1", - "license": "BSD-2-Clause", - "dependencies": { - "@lukeed/uuid": "^2.0.1", - "@ungap/structured-clone": "^1.2.0", - "array-equal": "^1.0.2", - "daikon": "^1.2.46", - "fflate": "^0.8.2", - "gl-matrix": "^3.4.3", - "nifti-reader-js": "^0.6.8", - "rxjs": "^7.8.1" - }, - "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.13.2" + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@niivue/niivue/node_modules/fflate": { - "version": "0.8.2", - "license": "MIT" - }, - "node_modules/@oozcitak/dom": { - "version": "1.15.10", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/url": "1.0.4", - "@oozcitak/util": "8.3.8" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0" + "node": ">=12" } }, - "node_modules/@oozcitak/infra": { - "version": "1.0.8", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@oozcitak/util": "8.3.8" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0" + "node": ">=12" } }, - "node_modules/@oozcitak/url": { - "version": "1.0.4", + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0" + "node": ">=12" } }, - "node_modules/@oozcitak/util": { - "version": "8.3.8", + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0" + "node": ">=12" } }, - "node_modules/@patternfly/react-catalog-view-extension": { - "version": "5.0.0", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@patternfly/react-core": "^5.0.0", - "@patternfly/react-styles": "^5.0.0" - }, - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@patternfly/react-charts": { - "version": "7.3.0", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@patternfly/react-styles": "^5.3.0", - "@patternfly/react-tokens": "^5.3.0", - "hoist-non-react-statics": "^3.3.0", - "lodash": "^4.17.21", - "tslib": "^2.5.0", - "victory-area": "^36.9.1", - "victory-axis": "^36.9.1", - "victory-bar": "^36.9.1", - "victory-box-plot": "^36.9.1", - "victory-chart": "^36.9.1", - "victory-core": "^36.9.1", - "victory-create-container": "^36.9.1", - "victory-cursor-container": "^36.9.1", - "victory-group": "^36.9.1", - "victory-legend": "^36.9.1", - "victory-line": "^36.9.1", - "victory-pie": "^36.9.1", - "victory-scatter": "^36.9.1", - "victory-stack": "^36.9.1", - "victory-tooltip": "^36.9.1", - "victory-voronoi-container": "^36.9.1", - "victory-zoom-container": "^36.9.1" - }, - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@patternfly/react-core": { - "version": "5.3.4", + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@patternfly/react-icons": "^5.3.2", - "@patternfly/react-styles": "^5.3.1", - "@patternfly/react-tokens": "^5.3.1", - "focus-trap": "7.5.2", - "react-dropzone": "^14.2.3", - "tslib": "^2.5.0" - }, - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@patternfly/react-icons": { - "version": "5.3.2", + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@patternfly/react-log-viewer": { - "version": "5.2.0", + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@patternfly/react-core": "^5.0.0", - "@patternfly/react-icons": "^5.0.0", - "@patternfly/react-styles": "^5.0.0", - "memoize-one": "^5.1.0" - }, - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@patternfly/react-styles": { - "version": "5.3.1", - "license": "MIT" + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@patternfly/react-table": { - "version": "5.3.4", + "node_modules/@faker-js/faker": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", + "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "npm": ">=6.14.13" + } + }, + "node_modules/@fnndsc/chrisapi": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@fnndsc/chrisapi/-/chrisapi-1.22.0.tgz", + "integrity": "sha512-npmjbFouPcQn56P6KAHUCFKS2VGf168VlqWzyzencbZQHNbTB6pMzw+LKTO3Xt9ShYy1iNrdelhr41HaP+AlCQ==", "license": "MIT", "dependencies": { - "@patternfly/react-core": "^5.3.4", - "@patternfly/react-icons": "^5.3.2", - "@patternfly/react-styles": "^5.3.1", - "@patternfly/react-tokens": "^5.3.1", - "lodash": "^4.17.19", - "tslib": "^2.5.0" - }, - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" + "axios": "^1.6.8", + "core-js": "^3.36.1" } }, - "node_modules/@patternfly/react-tokens": { - "version": "5.3.1", - "license": "MIT" + "node_modules/@icr/polyseg-wasm": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@icr/polyseg-wasm/-/polyseg-wasm-0.4.0.tgz", + "integrity": "sha512-3sZmiwG8I0NaqPle0L7+V/ZexiR7IjIUFkUsaOoFI9rNuBGyyMMmxAxnCmqcDFtBDk9h+JEYJf6e3NnqlHi/HQ==", + "license": "MIT", + "engines": { + "node": ">=0.14" + } }, - "node_modules/@playwright/test": { - "version": "1.46.1", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "playwright": "1.46.1" - }, - "bin": { - "playwright": "cli.js" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.25", - "license": "MIT" - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "engines": { + "node": ">=8" } }, - "node_modules/@rc-component/async-validator": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", - "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.24.4" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=14.x" + "node": ">=6.0.0" } }, - "node_modules/@rc-component/async-validator/node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@rc-component/color-picker": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", - "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "license": "MIT", - "dependencies": { - "@ant-design/fast-color": "^2.0.6", - "@babel/runtime": "^7.23.6", - "classnames": "^2.2.6", - "rc-util": "^5.38.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@rc-component/color-picker/node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@rc-component/context": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", - "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", - "license": "MIT", + "node_modules/@kitware/vtk.js": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@kitware/vtk.js/-/vtk.js-30.4.1.tgz", + "integrity": "sha512-jBJFm8AyWpJjNFFBadXyvBwegdD9M6WRdxmIb+x/MVpCyA5lEZSMemhiMn71oKsznaEe5Pjv2VDVJWmwK0vhUg==", + "license": "BSD-3-Clause", "dependencies": { - "@babel/runtime": "^7.10.1", - "rc-util": "^5.27.0" + "@babel/runtime": "7.22.11", + "@types/webxr": "^0.5.5", + "commander": "9.2.0", + "d3-scale": "4.0.2", + "fast-deep-equal": "^3.1.3", + "fflate": "0.7.3", + "gl-matrix": "3.4.3", + "globalthis": "1.0.3", + "seedrandom": "3.0.5", + "shader-loader": "1.3.1", + "shelljs": "0.8.5", + "spark-md5": "3.0.2", + "stream-browserify": "3.0.0", + "webworker-promise": "0.5.0", + "worker-loader": "3.0.8", + "xmlbuilder2": "3.0.2" + }, + "bin": { + "vtkDataConverter": "Utilities/DataGenerator/convert-cli.js", + "xml2json": "Utilities/XMLConverter/xml2json-cli.js" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "@babel/preset-env": "^7.17.10", + "autoprefixer": "^10.4.7", + "wslink": ">=1.1.0 || ^2.0.0" } }, - "node_modules/@rc-component/mini-decimal": { + "node_modules/@lukeed/csprng": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", - "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.0" - }, "engines": { - "node": ">=8.x" + "node": ">=8" } }, - "node_modules/@rc-component/mutate-observer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", - "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "node_modules/@lukeed/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" + "@lukeed/csprng": "^1.1.0" }, "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "node": ">=8" } }, - "node_modules/@rc-component/portal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", - "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "node_modules/@mattiasbuelens/web-streams-polyfill": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@mattiasbuelens/web-streams-polyfill/-/web-streams-polyfill-0.2.1.tgz", + "integrity": "sha512-oKuFCQFa3W7Hj7zKn0+4ypI8JFm4ZKIoncwAC6wd5WwFW2sL7O1hpPoJdSWpynQ4DJ4lQ6MvFoVDmCLilonDFg==", + "deprecated": "moved to web-streams-polyfill@2.0.0", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" + "@types/whatwg-streams": "^0.0.7" }, "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "node": ">= 8" } }, - "node_modules/@rc-component/qrcode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", - "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", - "license": "MIT", + "node_modules/@niivue/niivue": { + "version": "0.41.1", + "resolved": "https://registry.npmjs.org/@niivue/niivue/-/niivue-0.41.1.tgz", + "integrity": "sha512-A1Nfqx/8RYTzCoA7x8AUfC8dPTw7jou6NXAJzXILY6tw22NzF/Qx/XXeJ3mMEg1J7xvGXa83REyvyNEkEvF3bQ==", + "license": "BSD-2-Clause", "dependencies": { - "@babel/runtime": "^7.24.7", - "classnames": "^2.3.2", - "rc-util": "^5.38.0" - }, - "engines": { - "node": ">=8.x" + "@lukeed/uuid": "^2.0.1", + "@ungap/structured-clone": "^1.2.0", + "array-equal": "^1.0.2", + "daikon": "^1.2.46", + "fflate": "^0.8.2", + "gl-matrix": "^3.4.3", + "nifti-reader-js": "^0.6.8", + "rxjs": "^7.8.1" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "^4.13.2" } }, - "node_modules/@rc-component/qrcode/node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "node_modules/@niivue/niivue/node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, + "node_modules/@oozcitak/dom": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", + "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.14.0" + "@oozcitak/infra": "1.0.8", + "@oozcitak/url": "1.0.4", + "@oozcitak/util": "8.3.8" }, "engines": { - "node": ">=6.9.0" + "node": ">=8.0" } }, - "node_modules/@rc-component/tour": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.0.tgz", - "integrity": "sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==", + "node_modules/@oozcitak/infra": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", + "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.18.0", - "@rc-component/portal": "^1.0.0-9", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" + "@oozcitak/util": "8.3.8" }, "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "node": ">=6.0" } }, - "node_modules/@rc-component/trigger": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.1.tgz", - "integrity": "sha512-fuU11J8pOt6+U/tU6/CAv8wjCwGaNeRk9f5k8HQth7JBbJ6MMH62WhGycVW75VnXfBZgL/7kO+wbiO2Xc9U9sQ==", + "node_modules/@oozcitak/url": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", + "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "@rc-component/portal": "^1.1.0", - "classnames": "^2.3.2", - "rc-motion": "^2.0.0", - "rc-resize-observer": "^1.3.1", - "rc-util": "^5.38.0" + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8" }, "engines": { - "node": ">=8.x" + "node": ">=8.0" + } + }, + "node_modules/@oozcitak/util": { + "version": "8.3.8", + "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", + "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@patternfly/react-catalog-view-extension": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-catalog-view-extension/-/react-catalog-view-extension-5.0.0.tgz", + "integrity": "sha512-Sg0iLAVhE7wAwBJERNdYp6peMO4THG7ez3xvMXEWh2biXghIv9XVj5BEy0TssihMxZa/pRMdROzcv3QZ9m24Yg==", + "license": "MIT", + "dependencies": { + "@patternfly/react-core": "^5.0.0", + "@patternfly/react-styles": "^5.0.0" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": "^17 || ^18", + "react-dom": "^17 || ^18" } }, - "node_modules/@rc-component/trigger/node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "node_modules/@patternfly/react-charts": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-7.3.0.tgz", + "integrity": "sha512-J6d/bFolI3zUOvJoK4lEveNeXZeJNfBq+iXgQ/mImESyW0H7MSebMcVB4d+NC6JX0QykuaOEn/7YMJMU9K73tw==", "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.14.0" + "@patternfly/react-styles": "^5.3.0", + "@patternfly/react-tokens": "^5.3.0", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "tslib": "^2.5.0", + "victory-area": "^36.9.1", + "victory-axis": "^36.9.1", + "victory-bar": "^36.9.1", + "victory-box-plot": "^36.9.1", + "victory-chart": "^36.9.1", + "victory-core": "^36.9.1", + "victory-create-container": "^36.9.1", + "victory-cursor-container": "^36.9.1", + "victory-group": "^36.9.1", + "victory-legend": "^36.9.1", + "victory-line": "^36.9.1", + "victory-pie": "^36.9.1", + "victory-scatter": "^36.9.1", + "victory-stack": "^36.9.1", + "victory-tooltip": "^36.9.1", + "victory-voronoi-container": "^36.9.1", + "victory-zoom-container": "^36.9.1" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "react": "^17 || ^18", + "react-dom": "^17 || ^18" } }, - "node_modules/@react-hook/latest": { - "version": "1.0.3", + "node_modules/@patternfly/react-core": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.3.4.tgz", + "integrity": "sha512-zr2yeilIoFp8MFOo0vNgI8XuM+P2466zHvy4smyRNRH2/but2WObqx7Wu4ftd/eBMYdNqmTeuXe6JeqqRqnPMQ==", "license": "MIT", + "dependencies": { + "@patternfly/react-icons": "^5.3.2", + "@patternfly/react-styles": "^5.3.1", + "@patternfly/react-tokens": "^5.3.1", + "focus-trap": "7.5.2", + "react-dropzone": "^14.2.3", + "tslib": "^2.5.0" + }, "peerDependencies": { - "react": ">=16.8" + "react": "^17 || ^18", + "react-dom": "^17 || ^18" } }, - "node_modules/@react-hook/passive-layout-effect": { - "version": "1.2.1", + "node_modules/@patternfly/react-icons": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.3.2.tgz", + "integrity": "sha512-GEygYbl0H4zD8nZuTQy2dayKIrV2bMMeWKSOEZ16Y3EYNgYVUOUnN+J0naAEuEGH39Xb1DE9n+XUbE1PC4CxPA==", "license": "MIT", "peerDependencies": { - "react": ">=16.8" + "react": "^17 || ^18", + "react-dom": "^17 || ^18" } }, - "node_modules/@react-hook/resize-observer": { - "version": "2.0.2", + "node_modules/@patternfly/react-log-viewer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-log-viewer/-/react-log-viewer-5.2.0.tgz", + "integrity": "sha512-+9v4d49ImSMWACJVBbvl5OjIAbEl4QWDuJJQpi2r+tP3ZzAHDZOohOGBeMmT780i0sOeny83qnbNpNbMBVeLCA==", "license": "MIT", "dependencies": { - "@react-hook/latest": "^1.0.2", - "@react-hook/passive-layout-effect": "^1.2.0" + "@patternfly/react-core": "^5.0.0", + "@patternfly/react-icons": "^5.0.0", + "@patternfly/react-styles": "^5.0.0", + "memoize-one": "^5.1.0" }, "peerDependencies": { - "react": ">=18" + "react": "^17 || ^18", + "react-dom": "^17 || ^18" } }, - "node_modules/@redux-devtools/extension": { - "version": "3.3.0", + "node_modules/@patternfly/react-styles": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.3.1.tgz", + "integrity": "sha512-H6uBoFH3bJjD6PP75qZ4k+2TtF59vxf9sIVerPpwrGJcRgBZbvbMZCniSC3+S2LQ8DgXLnDvieq78jJzHz0hiA==", + "license": "MIT" + }, + "node_modules/@patternfly/react-table": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.3.4.tgz", + "integrity": "sha512-jGaiuo02scaC1HdGNHuYVRjtQCOB+vtvfbgS7nl1Y8ZcJ08wyUGhGSrEpNHfGAQ1XDSSoELAxj0cjOQwAAQw1A==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "immutable": "^4.3.4" + "@patternfly/react-core": "^5.3.4", + "@patternfly/react-icons": "^5.3.2", + "@patternfly/react-styles": "^5.3.1", + "@patternfly/react-tokens": "^5.3.1", + "lodash": "^4.17.19", + "tslib": "^2.5.0" }, "peerDependencies": { - "redux": "^3.1.0 || ^4.0.0 || ^5.0.0" + "react": "^17 || ^18", + "react-dom": "^17 || ^18" } }, - "node_modules/@redux-devtools/extension/node_modules/@babel/runtime": { - "version": "7.25.0", - "license": "MIT", + "node_modules/@patternfly/react-tokens": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.3.1.tgz", + "integrity": "sha512-VYK0uVP2/2RJ7ZshJCCLeq0Boih5I1bv+9Z/Bg6h12dCkLs85XsxAX9Ve+BGIo5DF54/mzcRHE1RKYap4ISXuw==", + "license": "MIT" + }, + "node_modules/@playwright/test": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.1.tgz", + "integrity": "sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "regenerator-runtime": "^0.14.0" + "playwright": "1.46.1" + }, + "bin": { + "playwright": "cli.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@redux-saga/core": { - "version": "1.3.0", + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.6.3", - "@redux-saga/deferred": "^1.2.1", - "@redux-saga/delay-p": "^1.2.1", - "@redux-saga/is": "^1.1.3", - "@redux-saga/symbols": "^1.1.3", - "@redux-saga/types": "^1.2.1", - "typescript-tuple": "^2.2.1" - }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/redux-saga" + "url": "https://opencollective.com/popperjs" } }, - "node_modules/@redux-saga/deferred": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/@redux-saga/delay-p": { - "version": "1.2.1", + "node_modules/@rc-component/async-validator": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", + "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", "license": "MIT", "dependencies": { - "@redux-saga/symbols": "^1.1.3" + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" } }, - "node_modules/@redux-saga/is": { - "version": "1.1.3", + "node_modules/@rc-component/async-validator/node_modules/@babel/runtime": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { - "@redux-saga/symbols": "^1.1.3", - "@redux-saga/types": "^1.2.1" + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@redux-saga/symbols": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/@redux-saga/types": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/@reduxjs/toolkit": { - "version": "2.2.7", + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", "license": "MIT", "dependencies": { - "immer": "^10.0.3", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" }, "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@remix-run/router": { - "version": "1.19.1", + "node_modules/@rc-component/color-picker/node_modules/@babel/runtime": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" } }, - "node_modules/@restart/hooks": { - "version": "0.4.16", + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", "license": "MIT", "dependencies": { - "dequal": "^2.0.3" + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" }, "peerDependencies": { - "react": ">=16.8.0" + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.0", - "cpu": [ - "x64" - ], + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@swc/core": { - "version": "1.7.11", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.12" + "@babel/runtime": "^7.18.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.11", - "@swc/core-darwin-x64": "1.7.11", - "@swc/core-linux-arm-gnueabihf": "1.7.11", - "@swc/core-linux-arm64-gnu": "1.7.11", - "@swc/core-linux-arm64-musl": "1.7.11", - "@swc/core-linux-x64-gnu": "1.7.11", - "@swc/core-linux-x64-musl": "1.7.11", - "@swc/core-win32-arm64-msvc": "1.7.11", - "@swc/core-win32-ia32-msvc": "1.7.11", - "@swc/core-win32-x64-msvc": "1.7.11" - }, - "peerDependencies": { - "@swc/helpers": "*" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.11", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-darwin-arm64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.11.tgz", - "integrity": "sha512-HRQv4qIeMBPThZ6Y/4yYW52rGsS6yrpusvuxLGyoFo45Y0y12/V2yXkOIA/0HIQyrqoUAxn1k4zQXpPaPNCmnw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-darwin-x64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.11.tgz", - "integrity": "sha512-vtMQj0F3oYwDu5yhO7SKDRg1XekRSi6/TbzHAbBXv+dBhlGGvcZZynT1H90EVFTv+7w7Sh+lOFvRv5Z4ZTcxow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.11.tgz", - "integrity": "sha512-mHtzWKxhtyreI4CSxs+3+ENv8t/Qo35WFoYG66qHEgJz/Z2Lh6jv1E+MYgHdYwnpQHgHbdvAco7HsBu/Dt6xXw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.11.tgz", - "integrity": "sha512-FRwe/x0GfXSQjGP2lIk+NO0pUFS/lI/RorCLBPiK808EVE9JTbh9DKCc/4Bbb4jgScAjNkrFCUVObQYl3YKmpA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" + "node": ">=8.x" } }, - "node_modules/@swc/core/node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.11.tgz", - "integrity": "sha512-GY/rs0+GUq14Gbnza90KOrQd/9yHd5qQMii5jcSWcUCT5A8QTa8kiicsM2NxZeTJ69xlKmT7sLod5l99lki/2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, "engines": { - "node": ">=10" + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@swc/core/node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.11.tgz", - "integrity": "sha512-SBEfKrXy6zQ6ksnyxw1FaCftrIH4fLfA81xNnKb7x/6iblv7Ko6H0aK3P5C86jyqF/82+ONl9C7ImGkUFQADig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, "engines": { - "node": ">=10" + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@swc/core/node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.11.tgz", - "integrity": "sha512-a2Y4xxEsLLYHJN7sMnw9+YQJDi3M1BxEr9hklfopPuGGnYLFNnx5CypH1l9ReijEfWjIAHNi7pq3m023lzW1Hg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@rc-component/qrcode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", + "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, "engines": { - "node": ">=10" + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@swc/core/node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.11.tgz", - "integrity": "sha512-ZbZFMwZO+j8ulhegJ7EhJ/QVZPoQ5qc30ylJQSxizizTJaen71Q7/13lXWc6ksuCKvg6dUKrp/TPgoxOOtSrFA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@rc-component/qrcode/node_modules/@babel/runtime": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/@swc/core/node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.11.tgz", - "integrity": "sha512-IUohZedSJyDu/ReEBG/mqX6uG29uA7zZ9z6dIAF+p6eFxjXmh9MuHryyM+H8ebUyoq/Ad3rL+rUCksnuYNnI0w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@rc-component/tour": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.0.tgz", + "integrity": "sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, "engines": { - "node": ">=10" + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@swc/types": { - "version": "0.1.12", - "dev": true, - "license": "Apache-2.0", + "node_modules/@rc-component/trigger": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.1.tgz", + "integrity": "sha512-fuU11J8pOt6+U/tU6/CAv8wjCwGaNeRk9f5k8HQth7JBbJ6MMH62WhGycVW75VnXfBZgL/7kO+wbiO2Xc9U9sQ==", + "license": "MIT", "dependencies": { - "@swc/counter": "^0.1.3" + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@tanstack/query-core": { - "version": "5.51.21", + "node_modules/@rc-component/trigger/node_modules/@babel/runtime": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@tanstack/react-query": { - "version": "5.51.23", + "node_modules/@react-hook/latest": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", + "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.51.21" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, "peerDependencies": { - "react": "^18.0.0" + "react": ">=16.8" } }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.3", - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", + "node_modules/@react-hook/passive-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", + "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "peerDependencies": { + "react": ">=16.8" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", + "node_modules/@react-hook/resize-observer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@react-hook/resize-observer/-/resize-observer-2.0.2.tgz", + "integrity": "sha512-tzKKzxNpfE5TWmxuv+5Ae3IF58n0FQgQaWJmcbYkjXTRZATXxClnTprQ2uuYygYTpu1pqbBskpwMpj6jpT1djA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "@react-hook/latest": "^1.0.2", + "@react-hook/passive-layout-effect": "^1.2.0" + }, + "peerDependencies": { + "react": ">=18" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", + "node_modules/@redux-devtools/extension": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@redux-devtools/extension/-/extension-3.3.0.tgz", + "integrity": "sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/runtime": "^7.23.2", + "immutable": "^4.3.4" + }, + "peerDependencies": { + "redux": "^3.1.0 || ^4.0.0 || ^5.0.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", + "node_modules/@redux-devtools/extension/node_modules/@babel/runtime": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "license": "MIT" - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/@types/d3-hierarchy": { - "version": "1.1.11", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", + "node_modules/@redux-saga/core": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.3.0.tgz", + "integrity": "sha512-L+i+qIGuyWn7CIg7k1MteHGfttKPmxwZR5E7OsGikCL2LzYA0RERlaUY00Y3P3ZV2EYgrsYlBrGs6cJP5OKKqA==", "license": "MIT", "dependencies": { - "@types/d3-color": "*" + "@babel/runtime": "^7.6.3", + "@redux-saga/deferred": "^1.2.1", + "@redux-saga/delay-p": "^1.2.1", + "@redux-saga/is": "^1.1.3", + "@redux-saga/symbols": "^1.1.3", + "@redux-saga/types": "^1.2.1", + "typescript-tuple": "^2.2.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/redux-saga" } }, - "node_modules/@types/d3-path": { - "version": "3.1.0", + "node_modules/@redux-saga/deferred": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.2.1.tgz", + "integrity": "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==", "license": "MIT" }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", + "node_modules/@redux-saga/delay-p": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.2.1.tgz", + "integrity": "sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==", "license": "MIT", "dependencies": { - "@types/d3-time": "*" + "@redux-saga/symbols": "^1.1.3" } }, - "node_modules/@types/d3-selection": { - "version": "1.4.6", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.6", + "node_modules/@redux-saga/is": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.3.tgz", + "integrity": "sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==", "license": "MIT", "dependencies": { - "@types/d3-path": "*" + "@redux-saga/symbols": "^1.1.3", + "@redux-saga/types": "^1.2.1" } }, - "node_modules/@types/d3-time": { - "version": "3.0.3", + "node_modules/@redux-saga/symbols": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.3.tgz", + "integrity": "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==", "license": "MIT" }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", + "node_modules/@redux-saga/types": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz", + "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==", "license": "MIT" }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", + "node_modules/@reduxjs/toolkit": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.7.tgz", + "integrity": "sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==", "license": "MIT", "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } } }, - "node_modules/@types/debug": { - "version": "4.1.12", + "node_modules/@remix-run/router": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz", + "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==", "license": "MIT", - "dependencies": { - "@types/ms": "*" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", + "node_modules/@restart/hooks": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", "license": "MIT", "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.7", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", + "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@types/ms": { - "version": "0.7.34", - "license": "MIT" + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", + "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@types/node": { - "version": "20.16.0", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", + "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "license": "MIT" + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", + "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "license": "MIT" + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", + "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "license": "MIT" + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", + "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/react": { - "version": "18.3.3", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", + "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/react-dom": { - "version": "18.3.0", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", + "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/react": "*" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/redux-logger": { - "version": "3.0.13", + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", + "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "redux": "^5.0.0" - } - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "license": "MIT" + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/uuid": { - "version": "9.0.8", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", + "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT" - }, - "node_modules/@types/warning": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/@types/webxr": { - "version": "0.5.19", - "license": "MIT" - }, - "node_modules/@types/whatwg-streams": { - "version": "0.0.7", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "license": "ISC" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@vitejs/plugin-react-swc": { - "version": "3.7.0", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", + "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "@swc/core": "^1.5.7" - }, - "peerDependencies": { - "vite": "^4 || ^5" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@vitest/coverage-v8": { - "version": "1.6.0", - "dev": true, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz", + "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.4", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.4", - "istanbul-reports": "^3.1.6", - "magic-string": "^0.30.5", - "magicast": "^0.3.3", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "test-exclude": "^6.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "1.6.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@vitest/expect": { - "version": "2.0.5", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", + "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@vitest/pretty-format": { - "version": "2.0.5", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", + "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@vitest/runner": { - "version": "2.0.5", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", + "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "@vitest/utils": "2.0.5", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@vitest/snapshot": { - "version": "2.0.5", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", + "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "magic-string": "^0.30.10", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@vitest/spy": { - "version": "2.0.5", + "node_modules/@swc/core": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.14.tgz", + "integrity": "sha512-9aeXeifnyuvc2pcuuhPQgVUwdpGEzZ+9nJu0W8/hNl/aESFsJGR5i9uQJRGu0atoNr01gK092fvmqMmQAPcKow==", "dev": true, - "license": "MIT", + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "tinyspy": "^3.0.0" + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.12" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.7.14", + "@swc/core-darwin-x64": "1.7.14", + "@swc/core-linux-arm-gnueabihf": "1.7.14", + "@swc/core-linux-arm64-gnu": "1.7.14", + "@swc/core-linux-arm64-musl": "1.7.14", + "@swc/core-linux-x64-gnu": "1.7.14", + "@swc/core-linux-x64-musl": "1.7.14", + "@swc/core-win32-arm64-msvc": "1.7.14", + "@swc/core-win32-ia32-msvc": "1.7.14", + "@swc/core-win32-x64-msvc": "1.7.14" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } } }, - "node_modules/@vitest/utils": { - "version": "2.0.5", + "node_modules/@swc/core-darwin-arm64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.14.tgz", + "integrity": "sha512-V0OUXjOH+hdGxDYG8NkQzy25mKOpcNKFpqtZEzLe5V/CpLJPnpg1+pMz70m14s9ZFda9OxsjlvPbg1FLUwhgIQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@wearemothership/dicom-character-set": { - "version": "1.0.4-opt.1", - "license": "MIT", + "node_modules/@swc/core-darwin-x64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.14.tgz", + "integrity": "sha512-9iFvUnxG6FC3An5ogp5jbBfQuUmTTwy8KMB+ZddUoPB3NR1eV+Y9vOh/tfWcenSJbgOKDLgYC5D/b1mHAprsrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { "node": ">=10" } }, - "node_modules/abstract-leveldown": { - "version": "0.12.4", + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.14.tgz", + "integrity": "sha512-zGJsef9qPivKSH8Vv4F/HiBXBTHZ5Hs3ZjVGo/UIdWPJF8fTL9OVADiRrl34Q7zOZEtGXRwEKLUW1SCQcbDvZA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~3.0.0" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" } }, - "node_modules/abstract-leveldown/node_modules/xtend": { - "version": "3.0.0", + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.14.tgz", + "integrity": "sha512-AxV3MPsoI7i4B8FXOew3dx3N8y00YoJYvIPfxelw07RegeCEH3aHp2U2DtgbP/NV1ugZMx0TL2Z2DEvocmA51g==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.4" + "node": ">=10" } }, - "node_modules/accessor-fn": { - "version": "1.5.1", - "license": "MIT", + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.14.tgz", + "integrity": "sha512-JDLdNjUj3zPehd4+DrQD8Ltb3B5lD8D05IwePyDWw+uR/YPc7w/TX1FUVci5h3giJnlMCJRvi1IQYV7K1n7KtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/ackee-tracker": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "platform": "^1.3.6" + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.14.tgz", + "integrity": "sha512-Siy5OvPCLLWmMdx4msnEs8HvEVUEigSn0+3pbLjv78iwzXd0qSBNHUPZyC1xeurVaUbpNDxZTpPRIwpqNE2+Og==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" } }, - "node_modules/acorn": { - "version": "8.12.1", + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.14.tgz", + "integrity": "sha512-FtEGm9mwtRYQNK43WMtUIadxHs/ja2rnDurB99os0ZoFTGG2IHuht2zD97W0wB8JbqEabT1XwSG9Y5wmN+ciEQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.4.0" + "node": ">=10" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.14.tgz", + "integrity": "sha512-Jp8KDlfq7Ntt2/BXr0y344cYgB1zf0DaLzDZ1ZJR6rYlAzWYSccLYcxHa97VGnsYhhPspMpmCvHid97oe2hl4A==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.14.tgz", + "integrity": "sha512-I+cFsXF0OU0J9J4zdWiQKKLURO5dvCujH9Jr8N0cErdy54l9d4gfIxdctfTF+7FyXtWKLTCkp+oby9BQhkFGWA==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/ajv": { - "version": "6.12.6", - "license": "MIT", - "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" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.14.tgz", + "integrity": "sha512-NNrprQCK6d28mG436jVo2TD+vACHseUECacEBGZ9Ef0qfOIWS1XIt2MisQKG0Oea2VvLFl6tF/V4Lnx/H0Sn3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" }, - "node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/@swc/types": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", + "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", + "node_modules/@tanstack/query-core": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.52.0.tgz", + "integrity": "sha512-U1DOEgltjUwalN6uWYTewSnA14b+tE7lSylOiASKCAO61ENJeCq9VVD/TXHA6O5u9+6v5+UgGYBSccTKDoyMqw==", "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/antd": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.20.2.tgz", - "integrity": "sha512-9d6Bs5ZKIV+JhB0eD7KxYnIfnhUh86kNtTGIuNiIxHFUhbuyT1DXN2SuMksDmtSfuRYZ82/C4hq+OJjWNNbmHg==", + "node_modules/@tanstack/react-query": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.52.1.tgz", + "integrity": "sha512-soyn4dNIUZ8US8NaPVXv06gkZFHaZnPfKWPDjRJjFRW3Y7WZ0jx72eT6zhw3VQlkMPysmXye8l35ewPHspKgbQ==", "license": "MIT", "dependencies": { - "@ant-design/colors": "^7.1.0", - "@ant-design/cssinjs": "^1.21.0", - "@ant-design/cssinjs-utils": "^1.0.3", - "@ant-design/icons": "^5.4.0", - "@ant-design/react-slick": "~1.1.2", - "@babel/runtime": "^7.24.8", - "@ctrl/tinycolor": "^3.6.1", - "@rc-component/color-picker": "~2.0.1", - "@rc-component/mutate-observer": "^1.1.0", - "@rc-component/qrcode": "~1.0.0", - "@rc-component/tour": "~1.15.0", - "@rc-component/trigger": "^2.2.1", - "classnames": "^2.5.1", - "copy-to-clipboard": "^3.3.3", - "dayjs": "^1.11.11", - "rc-cascader": "~3.27.0", - "rc-checkbox": "~3.3.0", - "rc-collapse": "~3.7.3", - "rc-dialog": "~9.5.2", - "rc-drawer": "~7.2.0", - "rc-dropdown": "~4.2.0", - "rc-field-form": "~2.4.0", - "rc-image": "~7.9.0", - "rc-input": "~1.6.3", - "rc-input-number": "~9.2.0", - "rc-mentions": "~2.15.0", - "rc-menu": "~9.14.1", - "rc-motion": "^2.9.2", - "rc-notification": "~5.6.0", - "rc-pagination": "~4.2.0", - "rc-picker": "~4.6.13", - "rc-progress": "~4.0.0", - "rc-rate": "~2.13.0", - "rc-resize-observer": "^1.4.0", - "rc-segmented": "~2.3.0", - "rc-select": "~14.15.1", - "rc-slider": "~11.1.5", - "rc-steps": "~6.0.1", - "rc-switch": "~4.1.0", - "rc-table": "~7.45.7", - "rc-tabs": "~15.1.1", - "rc-textarea": "~1.8.1", - "rc-tooltip": "~6.2.0", - "rc-tree": "~5.8.8", - "rc-tree-select": "~5.22.1", - "rc-upload": "~4.7.0", - "rc-util": "^5.43.0", - "scroll-into-view-if-needed": "^3.1.0", - "throttle-debounce": "^5.0.2" + "@tanstack/query-core": "5.52.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ant-design" + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": "^18 || ^19" } }, - "node_modules/antd/node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/append-transform": { - "version": "2.0.0", - "dev": true, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "license": "MIT", "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" + "@babel/types": "^7.0.0" } }, - "node_modules/archy": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/array-equal": { - "version": "1.0.2", + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@babel/types": "^7.20.7" } }, - "node_modules/array-tree-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", "license": "MIT" }, - "node_modules/asap": { - "version": "2.0.6", + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", "license": "MIT" }, - "node_modules/asn1.js": { - "version": "4.10.1", + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-hierarchy": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.11.tgz", + "integrity": "sha512-lnQiU7jV+Gyk9oQYk0GGYccuexmQPTp08E0+4BidgFdiJivjEvf+esPSdZqCZ2C7UwTWejWpqetVaU8A+eX3FA==", "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "license": "MIT", "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "@types/d3-color": "*" } }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "dev": true, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", "license": "MIT" }, - "node_modules/assertion-error": { - "version": "2.0.1", - "dev": true, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@types/d3-time": "*" } }, - "node_modules/asynckit": { - "version": "0.4.0", + "node_modules/@types/d3-selection": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.6.tgz", + "integrity": "sha512-0MhJ/LzJe6/vQVxiYJnvNq5CD/MF6Qy0dLp4BEQ6Dz8oOaB0EMXfx1GGeBFSW+3VzgjaUrxK6uECDQj9VLa/Mg==", "license": "MIT" }, - "node_modules/attr-accept": { - "version": "2.2.2", + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@types/d3-path": "*" } }, - "node_modules/axios": { - "version": "1.7.4", + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" } }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" + "@types/ms": "*" } }, - "node_modules/babel-plugin-preval": { - "version": "5.1.0", + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5", - "@types/babel__core": "^7.1.12", - "babel-plugin-macros": "^3.0.1", - "require-from-string": "^2.0.2" - }, - "engines": { - "node": ">=10", - "npm": ">=6" + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, - "node_modules/base16": { - "version": "1.0.0", + "node_modules/@types/lodash": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "dev": true, "license": "MIT" }, - "node_modules/bezier-js": { - "version": "6.1.4", + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", + "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/Pomax/bezierjs/blob/master/FUNDING.md" + "dependencies": { + "undici-types": "~6.19.2" } }, - "node_modules/big.js": { - "version": "5.2.2", + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.4", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz", + "integrity": "sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==", "license": "MIT", - "engines": { - "node": "*" + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" } }, - "node_modules/bl": { - "version": "0.8.2", + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, "license": "MIT", "dependencies": { - "readable-stream": "~1.0.26" + "@types/react": "*" } }, - "node_modules/bl/node_modules/isarray": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "1.0.34", + "node_modules/@types/redux-logger": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@types/redux-logger/-/redux-logger-3.0.13.tgz", + "integrity": "sha512-jylqZXQfMxahkuPcO8J12AKSSCQngdEWQrw7UiLUJzMBcv1r4Qg77P6mjGLjM27e5gFQDPD8vwUMJ9AyVxFSsg==", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "redux": "^5.0.0" } }, - "node_modules/bl/node_modules/string_decoder": { - "version": "0.10.31", - "dev": true, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", "license": "MIT" }, - "node_modules/bn.js": { - "version": "5.2.1", + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "dev": true, "license": "MIT" }, - "node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/@types/warning": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", + "license": "MIT" + }, + "node_modules/@types/webxr": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", + "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==", + "license": "MIT" + }, + "node_modules/@types/whatwg-streams": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@types/whatwg-streams/-/whatwg-streams-0.0.7.tgz", + "integrity": "sha512-6sDiSEP6DWcY2ZolsJ2s39ZmsoGQ7KVwBDI3sESQsEm9P2dHTcqnDIHRZFRNtLCzWp7hCFGqYbw5GyfpQnJ01A==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz", + "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==", + "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@swc/core": "^1.5.7" + }, + "peerDependencies": { + "vite": "^4 || ^5" } }, - "node_modules/brorand": { - "version": "1.1.0", + "node_modules/@vitest/coverage-v8": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", + "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.4", + "istanbul-reports": "^3.1.6", + "magic-string": "^0.30.5", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "test-exclude": "^6.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.6.0" + } }, - "node_modules/browserify-aes": { - "version": "1.2.0", + "node_modules/@vitest/expect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", "dev": true, "license": "MIT", "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/browserify-cipher": { - "version": "1.0.1", + "node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", "dev": true, "license": "MIT", "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/browserify-des": { - "version": "1.0.2", + "node_modules/@vitest/runner": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", + "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", "dev": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "@vitest/utils": "2.0.5", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/browserify-fs": { - "version": "1.0.0", + "node_modules/@vitest/snapshot": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", + "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", "dev": true, + "license": "MIT", "dependencies": { - "level-filesystem": "^1.0.1", - "level-js": "^2.1.3", - "levelup": "^0.18.2" + "@vitest/pretty-format": "2.0.5", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/browserify-rsa": { - "version": "4.1.0", + "node_modules/@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/browserify-sign": { - "version": "4.2.3", + "node_modules/@vitest/utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" }, - "engines": { - "node": ">= 0.12" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/browserslist": { - "version": "4.23.3", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/@wearemothership/dicom-character-set": { + "version": "1.0.4-opt.1", + "resolved": "https://registry.npmjs.org/@wearemothership/dicom-character-set/-/dicom-character-set-1.0.4-opt.1.tgz", + "integrity": "sha512-stqhnpawYHY2UZKj4RHTF71ab3q3z8S1SO9ToQKjsHQwowUdFVo6YFea93psFux3yqNbRlQjwoCdPjHcD0YQzw==", "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=10" } }, - "node_modules/buffer-es6": { - "version": "4.9.3", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-from": { - "version": "1.1.2", + "node_modules/abstract-leveldown": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", + "integrity": "sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "xtend": "~3.0.0" + } }, - "node_modules/buffer-xor": { - "version": "1.0.3", + "node_modules/abstract-leveldown/node_modules/xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=0.4" + } }, - "node_modules/cac": { - "version": "6.7.14", - "dev": true, + "node_modules/accessor-fn": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.1.tgz", + "integrity": "sha512-zZpFYBqIL1Aqg+f2qmYHJ8+yIZF7/tP6PUGx2/QM0uGPSO5UegpinmkNwDohxWtOj586BpMPVRUjce2HI6xB3A==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/caching-transform": { - "version": "4.0.0", - "dev": true, + "node_modules/ackee-tracker": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ackee-tracker/-/ackee-tracker-5.1.0.tgz", + "integrity": "sha512-A7iKkGyUnEXuOzxultQB7hnm4bStYCo1c38MYRRihBfqUP8AImhtZOODb00t9xrXs/BTsg06bz1MKpXeMs9sYw==", "license": "MIT", "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" + "platform": "^1.3.6" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/caching-transform/node_modules/make-dir": { + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "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" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/caching-transform/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/callsites": { - "version": "3.1.0", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "dev": true, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/canvas-color-tracker": { - "version": "1.2.2", + "node_modules/antd": { + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.20.2.tgz", + "integrity": "sha512-9d6Bs5ZKIV+JhB0eD7KxYnIfnhUh86kNtTGIuNiIxHFUhbuyT1DXN2SuMksDmtSfuRYZ82/C4hq+OJjWNNbmHg==", "license": "MIT", "dependencies": { - "tinycolor2": "^1.6.0" + "@ant-design/colors": "^7.1.0", + "@ant-design/cssinjs": "^1.21.0", + "@ant-design/cssinjs-utils": "^1.0.3", + "@ant-design/icons": "^5.4.0", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.24.8", + "@ctrl/tinycolor": "^3.6.1", + "@rc-component/color-picker": "~2.0.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/qrcode": "~1.0.0", + "@rc-component/tour": "~1.15.0", + "@rc-component/trigger": "^2.2.1", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.11", + "rc-cascader": "~3.27.0", + "rc-checkbox": "~3.3.0", + "rc-collapse": "~3.7.3", + "rc-dialog": "~9.5.2", + "rc-drawer": "~7.2.0", + "rc-dropdown": "~4.2.0", + "rc-field-form": "~2.4.0", + "rc-image": "~7.9.0", + "rc-input": "~1.6.3", + "rc-input-number": "~9.2.0", + "rc-mentions": "~2.15.0", + "rc-menu": "~9.14.1", + "rc-motion": "^2.9.2", + "rc-notification": "~5.6.0", + "rc-pagination": "~4.2.0", + "rc-picker": "~4.6.13", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.0", + "rc-resize-observer": "^1.4.0", + "rc-segmented": "~2.3.0", + "rc-select": "~14.15.1", + "rc-slider": "~11.1.5", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.45.7", + "rc-tabs": "~15.1.1", + "rc-textarea": "~1.8.1", + "rc-tooltip": "~6.2.0", + "rc-tree": "~5.8.8", + "rc-tree-select": "~5.22.1", + "rc-upload": "~4.7.0", + "rc-util": "^5.43.0", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" }, - "engines": { - "node": ">=12" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/chai": { - "version": "5.1.1", - "dev": true, + "node_modules/antd/node_modules/@babel/runtime": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" + "regenerator-runtime": "^0.14.0" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/chalk": { - "version": "2.4.2", + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "default-require-extensions": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/chalk/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, + "license": "MIT" }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "sprintf-js": "~1.0.2" } }, - "node_modules/character-entities": { - "version": "2.0.2", + "node_modules/array-equal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", + "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==", "license": "MIT", "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/check-error": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", + "license": "MIT" }, - "node_modules/cipher-base": { - "version": "1.0.4", + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "license": "MIT", "dependencies": { + "bn.js": "^4.0.0", "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "minimalistic-assert": "^1.0.0" } }, - "node_modules/classnames": { - "version": "2.5.1", + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, "license": "MIT" }, - "node_modules/clean-stack": { - "version": "2.2.0", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "node": ">=12" } }, - "node_modules/clone": { - "version": "0.1.19", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, - "node_modules/clsx": { - "version": "1.2.1", + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/color-convert": { - "version": "1.9.3", + "node_modules/axios": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz", + "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==", "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" }, "engines": { - "node": ">= 0.8" + "node": ">=10", + "npm": ">=6" } }, - "node_modules/comlink": { - "version": "4.4.1", - "license": "Apache-2.0" - }, - "node_modules/commander": { - "version": "9.2.0", + "node_modules/babel-plugin-preval": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-preval/-/babel-plugin-preval-5.1.0.tgz", + "integrity": "sha512-G5R+xmo5LS41A4UyZjOjV0mp9AvkuCyUOAJ6TOv/jTZS+VKh7L7HUDRcCSOb0YCM/u0fFarh7Diz0wjY8rFNFg==", "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@types/babel__core": "^7.1.12", + "babel-plugin-macros": "^3.0.1", + "require-from-string": "^2.0.2" + }, "engines": { - "node": "^12.20.0 || >=14" + "node": ">=10", + "npm": ">=6" } }, - "node_modules/commondir": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/compute-scroll-into-view": { - "version": "3.1.0", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, - "node_modules/concat-map": { - "version": "0.0.1", + "node_modules/base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==", "license": "MIT" }, - "node_modules/concat-stream": { - "version": "1.6.2", - "dev": true, - "engines": [ - "node >= 0.8" - ], + "node_modules/bezier-js": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz", + "integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==", "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/bezierjs/blob/master/FUNDING.md" } }, - "node_modules/console-clear": { - "version": "1.1.1", + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "license": "MIT", "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", + "node_modules/bl": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", + "integrity": "sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==", "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.6.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "license": "MIT", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, - "node_modules/core-js": { - "version": "3.38.0", - "hasInstallScript": true, "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "dependencies": { + "readable-stream": "~1.0.26" } }, - "node_modules/core-util-is": { - "version": "1.0.3", + "node_modules/bl/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, "license": "MIT" }, - "node_modules/cosmiconfig": { - "version": "7.1.0", + "node_modules/bl/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, "license": "MIT", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", + "node_modules/bl/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true, "license": "MIT" }, - "node_modules/create-hash": { + "node_modules/browserify-aes": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.1", + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "safe-buffer": "^5.0.1" } }, - "node_modules/create-hmac": { - "version": "1.1.7", + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "node_modules/cross-fetch": { - "version": "3.1.8", + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, "license": "MIT", "dependencies": { - "node-fetch": "^2.6.12" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", + "node_modules/browserify-fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", + "integrity": "sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==", + "dev": true, + "dependencies": { + "level-filesystem": "^1.0.1", + "level-js": "^2.1.3", + "levelup": "^0.18.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "dev": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" }, "engines": { - "node": ">= 8" + "node": ">= 0.12" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "dev": true, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": "*" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/cssfilter": { - "version": "0.0.10", + "node_modules/buffer-es6": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz", + "integrity": "sha512-Ibt+oXxhmeYJSsCkODPqNpPmyegefiD8rfutH1NYGhMZQhSp95Rz7haemgnJ6dxa6LT+JLLbtgOMORRluwKktw==", + "dev": true, "license": "MIT" }, - "node_modules/csstype": { - "version": "3.1.3", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, "license": "MIT" }, - "node_modules/d3-array": { - "version": "3.2.4", - "license": "ISC", + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "license": "MIT", "dependencies": { - "internmap": "1 - 2" + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/d3-binarytree": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/d3-color": { + "node_modules/caching-transform/node_modules/make-dir": { "version": "3.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/d3-dispatch": { - "version": "3.0.1", + "node_modules/caching-transform/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/d3-drag": { - "version": "3.0.0", - "license": "ISC", + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/canvas-color-tracker": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.2.2.tgz", + "integrity": "sha512-r+u/Ft2ka4Rj274Ts4L9bhYZLuMvbuJ/yL4seP0s+Pi+i9CM0caD+Sd//yseS5EVBJ2SKSmq36h2mNYUCdmTfA==", + "license": "MIT", "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" + "tinycolor2": "^1.6.0" }, "engines": { "node": ">=12" } }, - "node_modules/d3-ease": { - "version": "3.0.1", - "license": "BSD-3-Clause", + "node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, "engines": { "node": ">=12" } }, - "node_modules/d3-force-3d": { - "version": "3.0.5", + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "dependencies": { - "d3-binarytree": "1", - "d3-dispatch": "1 - 3", - "d3-octree": "1", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/d3-format": { - "version": "3.1.0", - "license": "ISC", + "node_modules/chalk/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/d3-hierarchy": { - "version": "1.1.9", - "license": "BSD-3-Clause" - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "license": "ISC", + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { - "d3-color": "1 - 3" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=12" - } - }, - "node_modules/d3-octree": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/d3-path": { - "version": "3.1.0", - "license": "ISC", - "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "license": "ISC", - "engines": { - "node": ">=12" + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/d3-scale": { - "version": "4.0.2", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 16" } }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "license": "ISC", + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "license": "MIT", "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/d3-selection": { - "version": "3.0.0", - "license": "ISC", - "engines": { - "node": ">=12" - } + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" }, - "node_modules/d3-shape": { - "version": "3.2.0", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/d3-time": { - "version": "3.1.0", + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, "license": "ISC", "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, + "node_modules/clone": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", + "integrity": "sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/d3-timer": { - "version": "3.0.1", - "license": "ISC", + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/d3-transition": { - "version": "3.0.1", - "license": "ISC", + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" + "color-name": "1.1.3" } }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "license": "ISC", + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/daikon": { - "version": "1.2.46", + "node_modules/comlink": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.1.tgz", + "integrity": "sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==", + "license": "Apache-2.0" + }, + "node_modules/commander": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", + "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", "license": "MIT", - "dependencies": { - "@wearemothership/dicom-character-set": "^1.0.4-opt.1", - "fflate": "*", - "jpeg-lossless-decoder-js": "2.0.7", - "pako": "^2.1", - "xss": "1.0.14" + "engines": { + "node": "^12.20.0 || >=14" } }, - "node_modules/daikon/node_modules/pako": { - "version": "2.1.0", - "license": "(MIT AND Zlib)" + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" }, - "node_modules/date-fns": { - "version": "3.6.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } + "node_modules/compute-scroll-into-view": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", + "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==", + "license": "MIT" }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, - "node_modules/debug": { - "version": "4.3.6", + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], "license": "MIT", "dependencies": { - "ms": "2.1.2" - }, + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-clear": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", + "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", + "license": "MIT", "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=4" } }, - "node_modules/decamelize": { - "version": "1.2.0", + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", "license": "MIT", "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "toggle-selection": "^1.0.6" } }, - "node_modules/decode-uri-component": { - "version": "0.4.1", + "node_modules/core-js": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", + "hasInstallScript": true, "license": "MIT", - "engines": { - "node": ">=14.16" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/deep-diff": { - "version": "0.3.8", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true, "license": "MIT" }, - "node_modules/deep-eql": { - "version": "5.0.2", - "dev": true, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/deepmerge": { - "version": "4.3.1", + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "node_modules/default-require-extensions": { - "version": "3.0.1", + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "license": "MIT", "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/deferred-leveldown": { - "version": "0.2.0", + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "license": "MIT", "dependencies": { - "abstract-leveldown": "~0.12.1" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/define-data-property": { - "version": "1.1.4", + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 8" } }, - "node_modules/define-properties": { - "version": "1.2.1", + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, - "node_modules/delaunator": { - "version": "4.0.1", - "license": "ISC" + "node_modules/cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", + "license": "MIT" }, - "node_modules/delaunay-find": { - "version": "0.0.6", + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "license": "ISC", "dependencies": { - "delaunator": "^4.0.0" + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", + "node_modules/d3-binarytree": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", + "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==", + "license": "MIT" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", "engines": { - "node": ">=0.4.0" + "node": ">=12" } }, - "node_modules/dequal": { - "version": "2.0.3", - "license": "MIT", + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/des.js": { - "version": "1.1.0", - "dev": true, - "license": "MIT", + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/detect-gpu": { - "version": "5.0.44", + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force-3d": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.5.tgz", + "integrity": "sha512-tdwhAhoTYZY/a6eo9nR7HP3xSW/C6XvJTbeRpR92nlPzH6OiE+4MliN9feuSFd0tPtEUo+191qOhCTWx3NYifg==", "license": "MIT", "dependencies": { - "webgl-constants": "^1.1.1" + "d3-binarytree": "1", + "d3-dispatch": "1 - 3", + "d3-octree": "1", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/devlop": { - "version": "1.1.0", - "license": "MIT", + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { - "dequal": "^2.0.0" + "d3-color": "1 - 3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=12" } }, - "node_modules/dicom-parser": { - "version": "1.8.21", + "node_modules/d3-octree": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.0.2.tgz", + "integrity": "sha512-Qxg4oirJrNXauiuC94uKMbgxwnhdda9xRLl9ihq45srlJ4Ga3CSgqGcAL8iW7N5CIv4Oz8x3E734ulxyvHPvwA==", "license": "MIT" }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" } }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "license": "MIT", + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "license": "MIT", + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "engines": { + "node": ">=12" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } }, - "node_modules/domhandler": { - "version": "5.0.3", - "license": "BSD-2-Clause", + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", "dependencies": { - "domelementtype": "^2.3.0" + "d3-path": "^3.1.0" }, "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "node": ">=12" } }, - "node_modules/domutils": { + "node_modules/d3-time": { "version": "3.1.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "d3-array": "2 - 3" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "engines": { + "node": ">=12" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.11", - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.5.7", - "dev": true, - "license": "MIT", + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/email-validator": { - "version": "2.0.4", + "d3-time": "1 - 3" + }, "engines": { - "node": ">4.0" + "node": ">=12" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "license": "MIT", + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { - "node": ">= 4" + "node": ">=12" } }, - "node_modules/entities": { - "version": "4.5.0", - "license": "BSD-2-Clause", + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, "engines": { - "node": ">=0.12" + "node": ">=12" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "peerDependencies": { + "d3-selection": "2 - 3" } }, - "node_modules/errno": { - "version": "0.1.8", - "dev": true, - "license": "MIT", + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", "dependencies": { - "prr": "~1.0.1" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" }, - "bin": { - "errno": "cli.js" + "engines": { + "node": ">=12" } }, - "node_modules/error-ex": { - "version": "1.3.2", + "node_modules/daikon": { + "version": "1.2.46", + "resolved": "https://registry.npmjs.org/daikon/-/daikon-1.2.46.tgz", + "integrity": "sha512-S8dTTlsWYTH3LQztjTW9KnNvxDeL2mr2cau0auLdYMJe4TrocYP1PmidHizO3rXUs+gXpBWI1PQ2qvB4b21QFw==", "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "@wearemothership/dicom-character-set": "^1.0.4-opt.1", + "fflate": "*", + "jpeg-lossless-decoder-js": "2.0.7", + "pako": "^2.1", + "xss": "1.0.14" } }, - "node_modules/es-define-property": { - "version": "1.0.0", + "node_modules/daikon/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4" + "ms": "2.1.2" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/es-errors": { - "version": "1.3.0", + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.21.5", - "dev": true, - "hasInstallScript": true, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" + "dependencies": { + "character-entities": "^2.0.0" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decode-uri-component": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", + "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", + "license": "MIT", + "engines": { + "node": ">=14.16" } }, - "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], + "node_modules/deep-diff": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", + "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "aix" - ], "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/esbuild/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/esbuild/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "strip-bom": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], + "node_modules/deferred-leveldown": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", + "integrity": "sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "dependencies": { + "abstract-leveldown": "~0.12.1" } }, - "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/delaunator": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", + "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==", + "license": "ISC" + }, + "node_modules/delaunay-find": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/delaunay-find/-/delaunay-find-0.0.6.tgz", + "integrity": "sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==", + "license": "ISC", + "dependencies": { + "delaunator": "^4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=12" + "node": ">=0.4.0" } }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], + "node_modules/detect-gpu": { + "version": "5.0.44", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.44.tgz", + "integrity": "sha512-R4lA6vEmd4IxMQgDEp74e80MDKXkNXz5FpA0/LvuXt7qVWF0faBj7xhJTC8DDWjxFWdMWLyJJSK9JGpMEBX8RA==", + "license": "MIT", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dicom-parser": { + "version": "1.8.21", + "resolved": "https://registry.npmjs.org/dicom-parser/-/dicom-parser-1.8.21.tgz", + "integrity": "sha512-lYCweHQDsC8UFpXErPlg86Px2A8bay0HiUY+wzoG3xv5GzgqVHU3lziwSc/Gzn7VV7y2KeP072SzCviuOoU02w==", + "license": "MIT" + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", "license": "MIT", - "optional": true, - "os": [ - "linux" + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, "engines": { - "node": ">=12" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], + "node_modules/electron-to-chromium": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT" + }, + "node_modules/email-validator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", + "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", "engines": { - "node": ">=12" + "node": ">4.0" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">= 4" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { - "node": ">=12" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" } }, - "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "get-intrinsic": "^1.2.4" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "node_modules/esbuild": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "license": "MIT", "engines": { "node": ">=6" @@ -3899,6 +4690,8 @@ }, "node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -3906,6 +4699,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3917,6 +4712,8 @@ }, "node_modules/espree": { "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3933,6 +4730,8 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -3944,6 +4743,8 @@ }, "node_modules/estree-walker": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { @@ -3952,10 +4753,14 @@ }, "node_modules/eventemitter3": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, "node_modules/evp_bytestokey": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "license": "MIT", "dependencies": { @@ -3965,6 +4770,8 @@ }, "node_modules/execa": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "license": "MIT", "dependencies": { @@ -3987,6 +4794,8 @@ }, "node_modules/execa/node_modules/is-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { @@ -3998,6 +4807,8 @@ }, "node_modules/execa/node_modules/signal-exit": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -4009,14 +4820,20 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, "node_modules/fbemitter": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", "license": "BSD-3-Clause", "dependencies": { "fbjs": "^3.0.0" @@ -4024,6 +4841,8 @@ }, "node_modules/fbjs": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", "license": "MIT", "dependencies": { "cross-fetch": "^3.1.5", @@ -4037,18 +4856,26 @@ }, "node_modules/fbjs-css-vars": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", "license": "MIT" }, "node_modules/fetch-readablestream": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/fetch-readablestream/-/fetch-readablestream-0.2.0.tgz", + "integrity": "sha512-qu4mXWf4wus4idBIN/kVH+XSer8IZ9CwHP+Pd7DL7TuKNC1hP7ykon4kkBjwJF3EMX2WsFp4hH7gU7CyL7ucXw==", "license": "MIT" }, "node_modules/fflate": { "version": "0.7.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz", + "integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==", "license": "MIT" }, "node_modules/file-selector": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", + "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", "license": "MIT", "dependencies": { "tslib": "^2.4.0" @@ -4059,6 +4886,8 @@ }, "node_modules/filter-obj": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", + "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", "license": "MIT", "engines": { "node": ">=14.16" @@ -4069,6 +4898,8 @@ }, "node_modules/find-cache-dir": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "license": "MIT", "dependencies": { @@ -4085,6 +4916,8 @@ }, "node_modules/find-cache-dir/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { @@ -4099,6 +4932,8 @@ }, "node_modules/find-cache-dir/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -4107,6 +4942,8 @@ }, "node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -4119,6 +4956,8 @@ }, "node_modules/flux": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "license": "BSD-3-Clause", "dependencies": { "fbemitter": "^3.0.0", @@ -4130,6 +4969,8 @@ }, "node_modules/focus-trap": { "version": "7.5.2", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz", + "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==", "license": "MIT", "dependencies": { "tabbable": "^6.2.0" @@ -4137,6 +4978,8 @@ }, "node_modules/follow-redirects": { "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -4155,6 +4998,8 @@ }, "node_modules/force-graph": { "version": "1.43.5", + "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.43.5.tgz", + "integrity": "sha512-HveLELh9yhZXO/QOfaFS38vlwJZ/3sKu+jarfXzRmbmihSOH/BbRWnUvmg8wLFiYy6h4HlH4lkRfZRccHYmXgA==", "license": "MIT", "dependencies": { "@tweenjs/tween.js": "18 - 23", @@ -4178,11 +5023,15 @@ }, "node_modules/foreach": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", "dev": true, "license": "MIT" }, "node_modules/foreground-child": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "license": "ISC", "dependencies": { @@ -4195,6 +5044,8 @@ }, "node_modules/form-data": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -4207,10 +5058,14 @@ }, "node_modules/fp-ts": { "version": "2.16.9", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.9.tgz", + "integrity": "sha512-+I2+FnVB+tVaxcYyQkHUq7ZdKScaBlX53A41mxQtpIccsfyv8PzdzP7fzp2AY832T4aoK6UZ5WRX/ebGd8uZuQ==", "license": "MIT" }, "node_modules/fromentries": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "funding": [ { "type": "github", @@ -4229,10 +5084,29 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4240,6 +5114,8 @@ }, "node_modules/fwd-stream": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", + "integrity": "sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==", "dev": true, "dependencies": { "readable-stream": "~1.0.26-4" @@ -4247,11 +5123,15 @@ }, "node_modules/fwd-stream/node_modules/isarray": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, "license": "MIT" }, "node_modules/fwd-stream/node_modules/readable-stream": { "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "license": "MIT", "dependencies": { @@ -4263,11 +5143,15 @@ }, "node_modules/fwd-stream/node_modules/string_decoder": { "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, "license": "MIT" }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -4275,6 +5159,8 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -4283,6 +5169,8 @@ }, "node_modules/get-func-name": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "license": "MIT", "engines": { @@ -4291,6 +5179,8 @@ }, "node_modules/get-intrinsic": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4308,6 +5198,8 @@ }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -4316,6 +5208,8 @@ }, "node_modules/get-port": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "license": "MIT", "engines": { "node": ">=4" @@ -4323,6 +5217,8 @@ }, "node_modules/get-stream": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "license": "MIT", "engines": { @@ -4334,10 +5230,15 @@ }, "node_modules/gl-matrix": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==", "license": "MIT" }, "node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -4356,6 +5257,8 @@ }, "node_modules/globals": { "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "license": "MIT", "engines": { "node": ">=4" @@ -4363,6 +5266,8 @@ }, "node_modules/globalthis": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "license": "MIT", "dependencies": { "define-properties": "^1.1.3" @@ -4376,6 +5281,8 @@ }, "node_modules/gopd": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" @@ -4386,11 +5293,15 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/hammerjs": { "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -4398,6 +5309,8 @@ }, "node_modules/happy-dom": { "version": "14.12.3", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-14.12.3.tgz", + "integrity": "sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g==", "dev": true, "license": "MIT", "dependencies": { @@ -4411,6 +5324,8 @@ }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -4419,6 +5334,8 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -4429,6 +5346,8 @@ }, "node_modules/has-proto": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4439,6 +5358,8 @@ }, "node_modules/has-symbols": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4449,6 +5370,8 @@ }, "node_modules/hash-base": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", "dev": true, "license": "MIT", "dependencies": { @@ -4461,6 +5384,8 @@ }, "node_modules/hash.js": { "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "license": "MIT", "dependencies": { @@ -4470,6 +5395,8 @@ }, "node_modules/hasha": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4485,6 +5412,8 @@ }, "node_modules/hasown": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4495,6 +5424,8 @@ }, "node_modules/hmac-drbg": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, "license": "MIT", "dependencies": { @@ -4505,6 +5436,8 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" @@ -4512,11 +5445,15 @@ }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/htmlparser2": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -4534,6 +5471,8 @@ }, "node_modules/human-signals": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4542,11 +5481,15 @@ }, "node_modules/idb-wrapper": { "version": "1.7.2", + "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", + "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==", "dev": true, "license": "MIT" }, "node_modules/immer": { "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", "license": "MIT", "funding": { "type": "opencollective", @@ -4555,10 +5498,14 @@ }, "node_modules/immutable": { "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -4573,6 +5520,8 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" @@ -4580,6 +5529,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -4588,6 +5539,8 @@ }, "node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { @@ -4596,6 +5549,8 @@ }, "node_modules/index-array-by": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", + "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", "license": "MIT", "engines": { "node": ">=12" @@ -4603,10 +5558,15 @@ }, "node_modules/indexof": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", "dev": true }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -4615,10 +5575,14 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/internmap": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "license": "ISC", "engines": { "node": ">=12" @@ -4626,6 +5590,8 @@ }, "node_modules/interpret": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -4633,6 +5599,8 @@ }, "node_modules/invariant": { "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" @@ -4640,6 +5608,8 @@ }, "node_modules/is": { "version": "0.2.7", + "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", + "integrity": "sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==", "dev": true, "engines": { "node": "*" @@ -4647,10 +5617,14 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.15.0", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -4664,6 +5638,8 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { @@ -4672,10 +5648,14 @@ }, "node_modules/is-object": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", + "integrity": "sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==", "dev": true }, "node_modules/is-plain-object": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4683,6 +5663,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { @@ -4694,11 +5676,15 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true, "license": "MIT" }, "node_modules/is-windows": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "license": "MIT", "engines": { @@ -4707,21 +5693,29 @@ }, "node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, "node_modules/isbuffer": { "version": "0.0.0", + "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", + "integrity": "sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==", "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -4730,6 +5724,8 @@ }, "node_modules/istanbul-lib-hook": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4741,6 +5737,8 @@ }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4756,6 +5754,8 @@ }, "node_modules/istanbul-lib-processinfo": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "license": "ISC", "dependencies": { @@ -4772,6 +5772,8 @@ }, "node_modules/istanbul-lib-processinfo/node_modules/uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "license": "MIT", "bin": { @@ -4780,6 +5782,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4793,6 +5797,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4806,6 +5812,8 @@ }, "node_modules/istanbul-reports": { "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4818,6 +5826,8 @@ }, "node_modules/jerrypick": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.1.tgz", + "integrity": "sha512-XTtedPYEyVp4t6hJrXuRKr/jHj8SC4z+4K0b396PMkov6muL+i8IIamJIvZWe3jUspgIJak0P+BaWKawMYNBLg==", "license": "MIT", "engines": { "node": ">=12" @@ -4825,14 +5835,20 @@ }, "node_modules/jpeg-lossless-decoder-js": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/jpeg-lossless-decoder-js/-/jpeg-lossless-decoder-js-2.0.7.tgz", + "integrity": "sha512-tbZlhFkKmx+JaqVMkq47SKWGuXLkIaV8fTbnhO39dYEnQrSShLGuLCGb0n6ntXjtmk6oAWGiIriWOLwj9od0yQ==", "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", "dependencies": { @@ -4845,6 +5861,8 @@ }, "node_modules/jsesc": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -4855,14 +5873,20 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "license": "ISC" }, "node_modules/json2mq": { @@ -4876,6 +5900,8 @@ }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -4886,6 +5912,8 @@ }, "node_modules/kapsule": { "version": "1.14.5", + "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.14.5.tgz", + "integrity": "sha512-H0iSpTynUzZw3tgraDmReprpFRmH5oP5GPmaNsurSwLx2H5iCpOMIkp5q+sfhB4Tz/UJd1E1IbEE9Z6ksnJ6RA==", "license": "MIT", "dependencies": { "lodash-es": "4" @@ -4896,6 +5924,8 @@ }, "node_modules/kleur": { "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", "engines": { "node": ">=6" @@ -4903,6 +5933,8 @@ }, "node_modules/lefthook": { "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.7.14.tgz", + "integrity": "sha512-GIMJm3HPksrHyXgu9OYX3r9QKM10hxoeiI45+7KhJKvAWChDtGqMZ5EPQuTMVsXu5IwggQL9QJLhDfk54WOXEw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4922,19 +5954,7 @@ "lefthook-windows-x64": "1.7.14" } }, - "node_modules/lefthook-linux-x64": { - "version": "1.7.14", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/lefthook/node_modules/lefthook-darwin-arm64": { + "node_modules/lefthook-darwin-arm64": { "version": "1.7.14", "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.14.tgz", "integrity": "sha512-3hNr04A8DSYZk0RBTdu8D/kkE3FHiNnexAEvuFOqLuf3EQhrrX1wxclGO0+tIk3s7nyh+iqpV69Xd+cb4Fnvpw==", @@ -4948,7 +5968,7 @@ "darwin" ] }, - "node_modules/lefthook/node_modules/lefthook-darwin-x64": { + "node_modules/lefthook-darwin-x64": { "version": "1.7.14", "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.14.tgz", "integrity": "sha512-cXVsxTS2IRKKRyYFEMjAxf0a/31M1PkiNAjlJPXQPoAxxC1rbsvkxWL8vXhH4P0AL18zSYVBf9aTktYArgQGuA==", @@ -4962,7 +5982,7 @@ "darwin" ] }, - "node_modules/lefthook/node_modules/lefthook-freebsd-arm64": { + "node_modules/lefthook-freebsd-arm64": { "version": "1.7.14", "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.14.tgz", "integrity": "sha512-rhx2ZkbWD6SkOXLc5/xyN1fu0uL9MLYBYKKg5T0rLRVwqqr9aYKZ+1Rru/5oL8utH1qkQyiwQkcjnKkyHwSjPg==", @@ -4976,7 +5996,7 @@ "freebsd" ] }, - "node_modules/lefthook/node_modules/lefthook-freebsd-x64": { + "node_modules/lefthook-freebsd-x64": { "version": "1.7.14", "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.14.tgz", "integrity": "sha512-WeVPDm7JB1Crchc7OQ3uLiRfLlhwwX3N2662DPguMresps2r79dUO97LhHMzd+l1RKIqZIgnU+j5fKFI+cmw4w==", @@ -4990,7 +6010,7 @@ "freebsd" ] }, - "node_modules/lefthook/node_modules/lefthook-linux-arm64": { + "node_modules/lefthook-linux-arm64": { "version": "1.7.14", "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.14.tgz", "integrity": "sha512-IUvxJBfLDVComNc1Djk4VYUJsSAtdwfTvwpNxfaG2qb31VNvF6PPdp43bgpgqzV8O0KDCMm/sn0hlZ00GTuy2A==", @@ -5004,7 +6024,21 @@ "linux" ] }, - "node_modules/lefthook/node_modules/lefthook-openbsd-arm64": { + "node_modules/lefthook-linux-x64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.7.14.tgz", + "integrity": "sha512-jCNjVk+9iaFSwlFH4RM7SI05tpdty0vPzSTsABXUQwdmKdt1hPWhnUsEhCU03ik33UmpfmXUK9pLFgStT7W5rw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/lefthook-openbsd-arm64": { "version": "1.7.14", "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-1.7.14.tgz", "integrity": "sha512-Mq5GgjzDMiFin+Ucm52nizvvDQM1o+MnL/P+FDbBq253BIJGDJK+qEuQBgEQndE9bUyAP4qiHb+R6jz5fbpAlA==", @@ -5018,7 +6052,7 @@ "openbsd" ] }, - "node_modules/lefthook/node_modules/lefthook-openbsd-x64": { + "node_modules/lefthook-openbsd-x64": { "version": "1.7.14", "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-1.7.14.tgz", "integrity": "sha512-enbPte9MAYU2JHkcvUBRJrXI6JMVcQqJHN+F8yKOJLFBnthoR0ZUuSTzqAMOivj/wgncHkYPqOWIo1UfB+HpGw==", @@ -5032,7 +6066,7 @@ "openbsd" ] }, - "node_modules/lefthook/node_modules/lefthook-windows-arm64": { + "node_modules/lefthook-windows-arm64": { "version": "1.7.14", "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.14.tgz", "integrity": "sha512-M9QbTs+Je0SRKC2c/0X8OQsme6glFrKxQoxWMFCN02S6nNLiHqP4vsHphJFU+wnAwv4KE8I1YKT5iMxde0Ejlg==", @@ -5046,7 +6080,7 @@ "win32" ] }, - "node_modules/lefthook/node_modules/lefthook-windows-x64": { + "node_modules/lefthook-windows-x64": { "version": "1.7.14", "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.14.tgz", "integrity": "sha512-40Mx+a44kPZUF/AXV45EIgw03FANTXMFDBR1Ib8qYbSaf1cWqJtfeQs9R5Ea0EdqxXkGprzwZ+yUFFjjfOFIoQ==", @@ -5062,6 +6096,8 @@ }, "node_modules/level-blobs": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", + "integrity": "sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==", "dev": true, "dependencies": { "level-peek": "1.0.6", @@ -5071,11 +6107,15 @@ }, "node_modules/level-blobs/node_modules/isarray": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, "license": "MIT" }, "node_modules/level-blobs/node_modules/readable-stream": { "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5087,11 +6127,15 @@ }, "node_modules/level-blobs/node_modules/string_decoder": { "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, "license": "MIT" }, "node_modules/level-filesystem": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", + "integrity": "sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==", "dev": true, "dependencies": { "concat-stream": "^1.4.4", @@ -5107,11 +6151,15 @@ }, "node_modules/level-fix-range": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", + "integrity": "sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==", "dev": true, "license": "MIT" }, "node_modules/level-hooks": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", + "integrity": "sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==", "dev": true, "dependencies": { "string-range": "~1.2" @@ -5119,6 +6167,8 @@ }, "node_modules/level-js": { "version": "2.2.4", + "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", + "integrity": "sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5132,11 +6182,15 @@ }, "node_modules/level-js/node_modules/object-keys": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", "dev": true, "license": "MIT" }, "node_modules/level-js/node_modules/xtend": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", "dev": true, "dependencies": { "object-keys": "~0.4.0" @@ -5147,6 +6201,8 @@ }, "node_modules/level-peek": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", + "integrity": "sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5155,6 +6211,8 @@ }, "node_modules/level-sublevel": { "version": "5.2.3", + "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", + "integrity": "sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==", "dev": true, "license": "MIT", "dependencies": { @@ -5166,6 +6224,8 @@ }, "node_modules/level-sublevel/node_modules/level-fix-range": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", + "integrity": "sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==", "dev": true, "license": "MIT", "dependencies": { @@ -5174,6 +6234,9 @@ }, "node_modules/level-sublevel/node_modules/object-keys": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", + "integrity": "sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==", + "deprecated": "Please update to the latest object-keys", "dev": true, "license": "MIT", "dependencies": { @@ -5184,6 +6247,8 @@ }, "node_modules/level-sublevel/node_modules/xtend": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", + "integrity": "sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==", "dev": true, "dependencies": { "is-object": "~0.1.2", @@ -5195,6 +6260,8 @@ }, "node_modules/levelup": { "version": "0.18.6", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", + "integrity": "sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5209,16 +6276,22 @@ }, "node_modules/levelup/node_modules/isarray": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, "license": "MIT" }, "node_modules/levelup/node_modules/prr": { "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==", "dev": true, "license": "MIT" }, "node_modules/levelup/node_modules/readable-stream": { "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "license": "MIT", "dependencies": { @@ -5230,6 +6303,8 @@ }, "node_modules/levelup/node_modules/semver": { "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", "dev": true, "license": "BSD", "bin": { @@ -5238,11 +6313,15 @@ }, "node_modules/levelup/node_modules/string_decoder": { "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, "license": "MIT" }, "node_modules/levelup/node_modules/xtend": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", "dev": true, "engines": { "node": ">=0.4" @@ -5250,10 +6329,14 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, "node_modules/loader-utils": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -5266,6 +6349,8 @@ }, "node_modules/loader-utils/node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "license": "MIT", "dependencies": { "minimist": "^1.2.0" @@ -5276,6 +6361,8 @@ }, "node_modules/local-access": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz", + "integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==", "license": "MIT", "engines": { "node": ">=6" @@ -5283,6 +6370,8 @@ }, "node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -5294,39 +6383,57 @@ }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "license": "MIT" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "license": "MIT" }, "node_modules/lodash.curry": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==", "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, "node_modules/lodash.flattendeep": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true, "license": "MIT" }, "node_modules/lodash.flow": { "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==", "license": "MIT" }, "node_modules/lodash.get": { "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -5337,6 +6444,8 @@ }, "node_modules/loupe": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, "license": "MIT", "dependencies": { @@ -5345,6 +6454,8 @@ }, "node_modules/lru-cache": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -5352,11 +6463,15 @@ }, "node_modules/ltgt": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", "dev": true, "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, "license": "MIT", "dependencies": { @@ -5365,6 +6480,8 @@ }, "node_modules/magicast": { "version": "0.3.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", + "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5375,6 +6492,8 @@ }, "node_modules/make-dir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -5389,6 +6508,8 @@ }, "node_modules/marked": { "version": "13.0.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", + "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -5399,6 +6520,8 @@ }, "node_modules/md5.js": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "license": "MIT", "dependencies": { @@ -5409,15 +6532,21 @@ }, "node_modules/memoize-one": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/micromark": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", "funding": [ { "type": "GitHub Sponsors", @@ -5451,6 +6580,8 @@ }, "node_modules/micromark-core-commonmark": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", "funding": [ { "type": "GitHub Sponsors", @@ -5483,6 +6614,8 @@ }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", @@ -5501,6 +6634,8 @@ }, "node_modules/micromark-extension-gfm-autolink-literal": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", @@ -5515,6 +6650,8 @@ }, "node_modules/micromark-extension-gfm-footnote": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -5533,6 +6670,8 @@ }, "node_modules/micromark-extension-gfm-strikethrough": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -5549,6 +6688,8 @@ }, "node_modules/micromark-extension-gfm-table": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -5564,6 +6705,8 @@ }, "node_modules/micromark-extension-gfm-tagfilter": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" @@ -5575,6 +6718,8 @@ }, "node_modules/micromark-extension-gfm-task-list-item": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -5590,6 +6735,8 @@ }, "node_modules/micromark-factory-destination": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", "funding": [ { "type": "GitHub Sponsors", @@ -5609,6 +6756,8 @@ }, "node_modules/micromark-factory-label": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", "funding": [ { "type": "GitHub Sponsors", @@ -5629,6 +6778,8 @@ }, "node_modules/micromark-factory-space": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -5647,6 +6798,8 @@ }, "node_modules/micromark-factory-title": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", "funding": [ { "type": "GitHub Sponsors", @@ -5667,6 +6820,8 @@ }, "node_modules/micromark-factory-whitespace": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", "funding": [ { "type": "GitHub Sponsors", @@ -5687,6 +6842,8 @@ }, "node_modules/micromark-util-character": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -5705,6 +6862,8 @@ }, "node_modules/micromark-util-chunked": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", "funding": [ { "type": "GitHub Sponsors", @@ -5722,6 +6881,8 @@ }, "node_modules/micromark-util-classify-character": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", "funding": [ { "type": "GitHub Sponsors", @@ -5741,6 +6902,8 @@ }, "node_modules/micromark-util-combine-extensions": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", "funding": [ { "type": "GitHub Sponsors", @@ -5759,6 +6922,8 @@ }, "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", "funding": [ { "type": "GitHub Sponsors", @@ -5776,6 +6941,8 @@ }, "node_modules/micromark-util-encode": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", "funding": [ { "type": "GitHub Sponsors", @@ -5790,6 +6957,8 @@ }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", "funding": [ { "type": "GitHub Sponsors", @@ -5804,6 +6973,8 @@ }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", "funding": [ { "type": "GitHub Sponsors", @@ -5821,6 +6992,8 @@ }, "node_modules/micromark-util-resolve-all": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", "funding": [ { "type": "GitHub Sponsors", @@ -5838,6 +7011,8 @@ }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", "funding": [ { "type": "GitHub Sponsors", @@ -5857,6 +7032,8 @@ }, "node_modules/micromark-util-subtokenize": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -5877,6 +7054,8 @@ }, "node_modules/micromark-util-symbol": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -5891,6 +7070,8 @@ }, "node_modules/micromark-util-types": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", "funding": [ { "type": "GitHub Sponsors", @@ -5905,6 +7086,8 @@ }, "node_modules/miller-rabin": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "license": "MIT", "dependencies": { @@ -5917,11 +7100,15 @@ }, "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, "license": "MIT" }, "node_modules/mime-db": { "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5929,6 +7116,8 @@ }, "node_modules/mime-types": { "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -5939,6 +7128,8 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "license": "MIT", "engines": { @@ -5950,16 +7141,22 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true, "license": "ISC" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", "dev": true, "license": "MIT" }, "node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -5970,6 +7167,8 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5977,10 +7176,14 @@ }, "node_modules/mitt": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "license": "MIT", "engines": { "node": ">=4" @@ -5988,6 +7191,8 @@ }, "node_modules/mrmime": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "license": "MIT", "engines": { "node": ">=10" @@ -5995,10 +7200,14 @@ }, "node_modules/ms": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -6015,6 +7224,8 @@ }, "node_modules/nifti-reader-js": { "version": "0.6.8", + "resolved": "https://registry.npmjs.org/nifti-reader-js/-/nifti-reader-js-0.6.8.tgz", + "integrity": "sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==", "license": "MIT", "dependencies": { "fflate": "*" @@ -6033,6 +7244,8 @@ }, "node_modules/node-fetch": { "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -6051,6 +7264,8 @@ }, "node_modules/node-preload": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6062,10 +7277,14 @@ }, "node_modules/node-releases": { "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "license": "MIT" }, "node_modules/npm": { "version": "10.8.2", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.2.tgz", + "integrity": "sha512-x/AIjFIKRllrhcb48dqUNAAZl0ig9+qMuN91RpZo3Cb2+zuibfh+KISl6+kVVyktDz230JKc208UkQwwMqyB+w==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -6224,6 +7443,8 @@ }, "node_modules/npm-run-path": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6238,6 +7459,8 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", "engines": { @@ -8447,6 +9670,8 @@ }, "node_modules/nyc": { "version": "17.0.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.0.0.tgz", + "integrity": "sha512-ISp44nqNCaPugLLGGfknzQwSwt10SSS5IMoPR7GLoMAyS18Iw5js8U7ga2VF9lYuMZ42gOHr3UddZw4WZltxKg==", "dev": true, "license": "ISC", "dependencies": { @@ -8487,6 +9712,8 @@ }, "node_modules/nyc/node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8500,6 +9727,8 @@ }, "node_modules/nyc/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { @@ -8514,6 +9743,8 @@ }, "node_modules/nyc/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -8522,6 +9753,8 @@ }, "node_modules/object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8529,6 +9762,8 @@ }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -8536,11 +9771,15 @@ }, "node_modules/octal": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", + "integrity": "sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==", "dev": true, "license": "MIT" }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -8548,6 +9787,8 @@ }, "node_modules/onetime": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8562,6 +9803,8 @@ }, "node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -8576,6 +9819,8 @@ }, "node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -8587,6 +9832,8 @@ }, "node_modules/p-map": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8598,6 +9845,8 @@ }, "node_modules/p-queue": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", + "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", "license": "MIT", "dependencies": { "eventemitter3": "^5.0.1", @@ -8612,6 +9861,8 @@ }, "node_modules/p-timeout": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", + "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", "license": "MIT", "engines": { "node": ">=14.16" @@ -8622,6 +9873,8 @@ }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -8630,6 +9883,8 @@ }, "node_modules/package-hash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "license": "ISC", "dependencies": { @@ -8644,10 +9899,14 @@ }, "node_modules/pako": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -8658,6 +9917,8 @@ }, "node_modules/parse-asn1": { "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", "dev": true, "license": "ISC", "dependencies": { @@ -8674,6 +9935,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -8690,10 +9953,14 @@ }, "node_modules/parse-srcset": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -8702,6 +9969,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8709,6 +9978,8 @@ }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -8717,10 +9988,14 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { "node": ">=8" @@ -8728,11 +10003,15 @@ }, "node_modules/pathe": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, "license": "MIT" }, "node_modules/pathval": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, "license": "MIT", "engines": { @@ -8741,6 +10020,8 @@ }, "node_modules/pbkdf2": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, "license": "MIT", "dependencies": { @@ -8756,10 +10037,14 @@ }, "node_modules/picocolors": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "license": "ISC" }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8771,10 +10056,14 @@ }, "node_modules/platform": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "license": "MIT" }, "node_modules/playwright": { "version": "1.46.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.1.tgz", + "integrity": "sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8792,6 +10081,8 @@ }, "node_modules/playwright-core": { "version": "1.46.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.1.tgz", + "integrity": "sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==", "dev": true, "license": "Apache-2.0", "bin": { @@ -8801,23 +10092,10 @@ "node": ">=18" } }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/postcss": { "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "funding": [ { "type": "opencollective", @@ -8844,6 +10122,8 @@ }, "node_modules/preval.macro": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/preval.macro/-/preval.macro-5.0.0.tgz", + "integrity": "sha512-+OZRqZYx1pjZ7H5Jis8bPFXkiT7lwA46UzAT4IjuzFVKwkJK+TwIx1TCqrqNCf8U3e5O12mEJEz1BXslkCLWfQ==", "license": "MIT", "dependencies": { "babel-plugin-preval": "^5.0.0" @@ -8854,16 +10134,22 @@ }, "node_modules/process-es6": { "version": "0.11.6", + "resolved": "https://registry.npmjs.org/process-es6/-/process-es6-0.11.6.tgz", + "integrity": "sha512-GYBRQtL4v3wgigq10Pv58jmTbFXlIiTbSfgnNqZLY0ldUPqy1rRxDI5fCjoCpnM6TqmHQI8ydzTBXW86OYc0gA==", "dev": true, "license": "MIT" }, "node_modules/process-nextick-args": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "license": "MIT" }, "node_modules/process-on-spawn": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, "license": "MIT", "dependencies": { @@ -8875,6 +10161,8 @@ }, "node_modules/promise": { "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "license": "MIT", "dependencies": { "asap": "~2.0.3" @@ -8882,6 +10170,8 @@ }, "node_modules/prop-types": { "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -8891,15 +10181,21 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, "node_modules/prr": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, "license": "MIT" }, "node_modules/public-encrypt": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8913,11 +10209,15 @@ }, "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" @@ -8925,10 +10225,14 @@ }, "node_modules/pure-color": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==", "license": "MIT" }, "node_modules/query-string": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.1.0.tgz", + "integrity": "sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==", "license": "MIT", "dependencies": { "decode-uri-component": "^0.4.1", @@ -8944,6 +10248,8 @@ }, "node_modules/randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8952,6 +10258,8 @@ }, "node_modules/randomfill": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "license": "MIT", "dependencies": { @@ -9043,9 +10351,9 @@ } }, "node_modules/rc-drawer/node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -9177,6 +10485,8 @@ }, "node_modules/rc-motion": { "version": "2.9.2", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.2.tgz", + "integrity": "sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -9278,9 +10588,9 @@ } }, "node_modules/rc-picker/node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -9324,6 +10634,8 @@ }, "node_modules/rc-resize-observer": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", + "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.7", @@ -9502,6 +10814,8 @@ }, "node_modules/rc-tree": { "version": "5.8.8", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.8.tgz", + "integrity": "sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -9552,6 +10866,8 @@ }, "node_modules/rc-util": { "version": "5.43.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.43.0.tgz", + "integrity": "sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -9564,10 +10880,14 @@ }, "node_modules/rc-util/node_modules/react-is": { "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, "node_modules/rc-virtual-list": { "version": "3.14.5", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.14.5.tgz", + "integrity": "sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", @@ -9585,6 +10905,8 @@ }, "node_modules/react": { "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -9595,6 +10917,8 @@ }, "node_modules/react-activity": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/react-activity/-/react-activity-2.1.3.tgz", + "integrity": "sha512-BdZuwZ4frK+tkjjERtzT0HxbHUN5/hIe9BBL9Ac/kgVOJ0bXjJpz417cQ7XxGSA27I+fsHCNRrFQ1cux61vHDQ==", "license": "MIT", "peerDependencies": { "react": ">= 15.0.0", @@ -9603,6 +10927,8 @@ }, "node_modules/react-base16-styling": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", "license": "MIT", "dependencies": { "base16": "^1.0.0", @@ -9613,6 +10939,8 @@ }, "node_modules/react-bootstrap-typeahead": { "version": "6.3.2", + "resolved": "https://registry.npmjs.org/react-bootstrap-typeahead/-/react-bootstrap-typeahead-6.3.2.tgz", + "integrity": "sha512-N5Mb0WlSSMcD7Z0pcCypILgIuECybev0hl4lsnCa5lbXTnN4QdkuHLGuTLSlXBwm1ZMFpOc2SnsdSRgeFiF+Ow==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.14.6", @@ -9638,6 +10966,8 @@ }, "node_modules/react-cookie": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.2.0.tgz", + "integrity": "sha512-mqhPERUyfOljq5yJ4woDFI33bjEtigsl8JDJdPPeNhr0eSVZmBc/2Vdf8mFxOUktQxhxTR1T+uF0/FRTZyBEgw==", "license": "MIT", "dependencies": { "@types/hoist-non-react-statics": "^3.3.5", @@ -9650,6 +10980,8 @@ }, "node_modules/react-dom": { "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -9661,6 +10993,8 @@ }, "node_modules/react-dropzone": { "version": "14.2.3", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", + "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", "license": "MIT", "dependencies": { "attr-accept": "^2.2.2", @@ -9676,6 +11010,8 @@ }, "node_modules/react-error-boundary": { "version": "4.0.13", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz", + "integrity": "sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" @@ -9686,10 +11022,14 @@ }, "node_modules/react-fast-compare": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", "license": "MIT" }, "node_modules/react-force-graph-2d": { "version": "1.25.5", + "resolved": "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.25.5.tgz", + "integrity": "sha512-3u8WjZZorpwZSDs3n3QeOS9ZoxFPM+IR9SStYJVQ/qKECydMHarxnf7ynV/MKJbC6kUsc60soD0V+Uq/r2vz7Q==", "license": "MIT", "dependencies": { "force-graph": "1", @@ -9705,10 +11045,14 @@ }, "node_modules/react-is": { "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/react-json-view": { "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", "license": "MIT", "dependencies": { "flux": "^4.0.1", @@ -9723,6 +11067,8 @@ }, "node_modules/react-kapsule": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.4.0.tgz", + "integrity": "sha512-w4Yv9CgWdj8kWGQEPNWFGJJ08dYEZHZpiaFR/DgZjCMBNqv9wus2Gy1qvHVJmJbzvAZbq6jdvFC+NYzEqAlNhQ==", "license": "MIT", "dependencies": { "fromentries": "^1.3.2", @@ -9737,6 +11083,8 @@ }, "node_modules/react-lazylog": { "version": "4.5.3", + "resolved": "https://registry.npmjs.org/react-lazylog/-/react-lazylog-4.5.3.tgz", + "integrity": "sha512-lyov32A/4BqihgXgtNXTHCajXSXkYHPlIEmV8RbYjHIMxCFSnmtdg4kDCI3vATz7dURtiFTvrw5yonHnrS+NNg==", "license": "MPL-2.0", "dependencies": { "@mattiasbuelens/web-streams-polyfill": "^0.2.0", @@ -9755,6 +11103,8 @@ }, "node_modules/react-lazylog/node_modules/immutable": { "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9762,10 +11112,14 @@ }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", "license": "MIT" }, "node_modules/react-overlays": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", + "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.8", @@ -9784,6 +11138,8 @@ }, "node_modules/react-popper": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", "license": "MIT", "dependencies": { "react-fast-compare": "^3.0.1", @@ -9797,6 +11153,8 @@ }, "node_modules/react-redux": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", + "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.3", @@ -9818,6 +11176,8 @@ }, "node_modules/react-router": { "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz", + "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==", "license": "MIT", "dependencies": { "@remix-run/router": "1.19.1" @@ -9831,6 +11191,8 @@ }, "node_modules/react-router-dom": { "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz", + "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==", "license": "MIT", "dependencies": { "@remix-run/router": "1.19.1", @@ -9846,6 +11208,8 @@ }, "node_modules/react-string-replace": { "version": "0.4.4", + "resolved": "https://registry.npmjs.org/react-string-replace/-/react-string-replace-0.4.4.tgz", + "integrity": "sha512-FAMkhxmDpCsGTwTZg7p/2v+/GTmxAp73so3fbSvlAcBBX36ujiGRNEaM/1u+jiYQrArhns+7eE92g2pi5E5FUA==", "license": "MIT", "dependencies": { "lodash": "^4.17.4" @@ -9856,6 +11220,8 @@ }, "node_modules/react-textarea-autosize": { "version": "8.5.3", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz", + "integrity": "sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", @@ -9871,6 +11237,8 @@ }, "node_modules/react-virtualized": { "version": "9.22.5", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.5.tgz", + "integrity": "sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.7.2", @@ -9887,6 +11255,8 @@ }, "node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { @@ -9901,11 +11271,15 @@ }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "license": "MIT" }, "node_modules/rechoir": { "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dependencies": { "resolve": "^1.1.6" }, @@ -9915,10 +11289,14 @@ }, "node_modules/redux": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "license": "MIT" }, "node_modules/redux-logger": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", + "integrity": "sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==", "dev": true, "license": "MIT", "dependencies": { @@ -9927,6 +11305,8 @@ }, "node_modules/redux-saga": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.3.0.tgz", + "integrity": "sha512-J9RvCeAZXSTAibFY0kGw6Iy4EdyDNW7k6Q+liwX+bsck7QVsU78zz8vpBRweEfANxnnlG/xGGeOvf6r8UXzNJQ==", "license": "MIT", "dependencies": { "@redux-saga/core": "^1.3.0" @@ -9934,6 +11314,8 @@ }, "node_modules/redux-thunk": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", "license": "MIT", "peerDependencies": { "redux": "^5.0.0" @@ -9941,10 +11323,14 @@ }, "node_modules/regenerator-runtime": { "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "license": "MIT" }, "node_modules/release-zalgo": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, "license": "ISC", "dependencies": { @@ -9956,6 +11342,8 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -9964,6 +11352,8 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9971,19 +11361,27 @@ }, "node_modules/require-main-filename": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true, "license": "ISC" }, "node_modules/reselect": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", "license": "MIT" }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", "license": "MIT" }, "node_modules/resolve": { "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -9999,6 +11397,8 @@ }, "node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -10007,6 +11407,9 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -10021,6 +11424,8 @@ }, "node_modules/ripemd160": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "license": "MIT", "dependencies": { @@ -10030,6 +11435,8 @@ }, "node_modules/rollup": { "version": "4.21.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", + "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10064,6 +11471,8 @@ }, "node_modules/rollup-plugin-node-builtins": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz", + "integrity": "sha512-bxdnJw8jIivr2yEyt8IZSGqZkygIJOGAWypXvHXnwKAbUcN4Q/dGTx7K0oAJryC/m6aq6tKutltSeXtuogU6sw==", "dev": true, "license": "ISC", "dependencies": { @@ -10073,237 +11482,16 @@ "process-es6": "^0.11.2" } }, - "node_modules/rollup/node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", - "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", - "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", - "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", - "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", - "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", - "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", - "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", - "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", - "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", - "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", - "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", - "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", - "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", - "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", - "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/rollup/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/rusha": { "version": "0.8.14", + "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.14.tgz", + "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==", "license": "MIT" }, "node_modules/rxjs": { "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -10311,6 +11499,8 @@ }, "node_modules/sade": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "license": "MIT", "dependencies": { "mri": "^1.1.0" @@ -10321,6 +11511,8 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -10340,6 +11532,8 @@ }, "node_modules/sanitize-html": { "version": "2.13.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.13.0.tgz", + "integrity": "sha512-Xff91Z+4Mz5QiNSLdLWwjgBDm5b1RU6xBT0+12rapjiaR7SwfRdjw8f+6Rir2MXKLrDicRFHdb51hGOAxmsUIA==", "license": "MIT", "dependencies": { "deepmerge": "^4.2.2", @@ -10352,6 +11546,8 @@ }, "node_modules/sanitize-html/node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", "engines": { "node": ">=10" @@ -10362,6 +11558,8 @@ }, "node_modules/scheduler": { "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -10369,6 +11567,8 @@ }, "node_modules/schema-utils": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -10385,6 +11585,8 @@ }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", "license": "MIT", "dependencies": { "compute-scroll-into-view": "^3.0.2" @@ -10392,10 +11594,14 @@ }, "node_modules/seedrandom": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", "license": "MIT" }, "node_modules/semiver": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", + "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", "license": "MIT", "engines": { "node": ">=6" @@ -10403,6 +11609,8 @@ }, "node_modules/semver": { "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "license": "ISC", "bin": { @@ -10414,15 +11622,21 @@ }, "node_modules/set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, "license": "ISC" }, "node_modules/setimmediate": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "license": "MIT" }, "node_modules/sha.js": { "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "license": "(MIT AND BSD-3-Clause)", "dependencies": { @@ -10435,6 +11649,8 @@ }, "node_modules/shader-loader": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/shader-loader/-/shader-loader-1.3.1.tgz", + "integrity": "sha512-dt8F9K0x4rjmaFyHh7rNDfpt4LUiR64zhNIEwp2WbE99B3z4ALuvvmhftkElg93dUD6sTmv/aXa/z9SJiEddcA==", "license": "MIT", "dependencies": { "loader-utils": "^1.1.0" @@ -10442,6 +11658,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -10453,6 +11671,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -10461,6 +11681,8 @@ }, "node_modules/shelljs": { "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", @@ -10476,20 +11698,28 @@ }, "node_modules/shlex": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/shlex/-/shlex-2.1.2.tgz", + "integrity": "sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==", "license": "MIT" }, "node_modules/siginfo": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/sirv": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", @@ -10502,6 +11732,8 @@ }, "node_modules/sirv-cli": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-2.0.2.tgz", + "integrity": "sha512-OtSJDwxsF1NWHc7ps3Sa0s+dPtP15iQNJzfKVz+MxkEo3z72mCD+yu30ct79rPr0CaV1HXSOBp+MIY5uIhHZ1A==", "license": "MIT", "dependencies": { "console-clear": "^1.1.0", @@ -10522,6 +11754,8 @@ }, "node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -10530,6 +11764,8 @@ }, "node_modules/source-map-js": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -10537,10 +11773,14 @@ }, "node_modules/spark-md5": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", + "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==", "license": "(WTFPL OR MIT)" }, "node_modules/spawn-wrap": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "license": "ISC", "dependencies": { @@ -10557,6 +11797,8 @@ }, "node_modules/spawn-wrap/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { @@ -10571,6 +11813,8 @@ }, "node_modules/spawn-wrap/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -10579,6 +11823,8 @@ }, "node_modules/split-on-first": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", + "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", "license": "MIT", "engines": { "node": ">=12" @@ -10589,20 +11835,28 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, "node_modules/stackback": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/std-env": { "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true, "license": "MIT" }, "node_modules/stream-browserify": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "license": "MIT", "dependencies": { "inherits": "~2.0.4", @@ -10611,6 +11865,8 @@ }, "node_modules/stream-browserify/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -10623,6 +11879,8 @@ }, "node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -10630,6 +11888,8 @@ }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/string-convert": { @@ -10640,11 +11900,15 @@ }, "node_modules/string-range": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", + "integrity": "sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==", "dev": true, "license": "MIT" }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -10658,6 +11922,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -10669,6 +11935,8 @@ }, "node_modules/strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { @@ -10677,6 +11945,8 @@ }, "node_modules/strip-final-newline": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "license": "MIT", "engines": { @@ -10688,6 +11958,8 @@ }, "node_modules/strip-literal": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", "dev": true, "license": "MIT", "dependencies": { @@ -10699,17 +11971,21 @@ }, "node_modules/strip-literal/node_modules/js-tokens": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", "dev": true, "license": "MIT" }, "node_modules/stylis": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", + "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", "license": "MIT" }, "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -10721,6 +11997,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -10731,10 +12009,14 @@ }, "node_modules/tabbable": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", "license": "MIT" }, "node_modules/test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", "dependencies": { @@ -10747,7 +12029,9 @@ } }, "node_modules/text-encoding-utf-8": { - "version": "1.0.2" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", + "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" }, "node_modules/throttle-debounce": { "version": "5.0.2", @@ -10760,22 +12044,30 @@ }, "node_modules/tinybench": { "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinycolor2": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "license": "MIT" }, "node_modules/tinydate": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", + "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tinypool": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", "dev": true, "license": "MIT", "engines": { @@ -10784,6 +12076,8 @@ }, "node_modules/tinyrainbow": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "dev": true, "license": "MIT", "engines": { @@ -10792,6 +12086,8 @@ }, "node_modules/tinyspy": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", + "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", "dev": true, "license": "MIT", "engines": { @@ -10800,6 +12096,8 @@ }, "node_modules/to-fast-properties": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "license": "MIT", "engines": { "node": ">=4" @@ -10813,6 +12111,8 @@ }, "node_modules/totalist": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "license": "MIT", "engines": { "node": ">=6" @@ -10820,14 +12120,20 @@ }, "node_modules/tr46": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, "node_modules/tslib": { "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "license": "0BSD" }, "node_modules/type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -10836,16 +12142,22 @@ }, "node_modules/typedarray": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, "license": "MIT" }, "node_modules/typedarray-to-buffer": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", + "integrity": "sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==", "dev": true, "license": "MIT" }, "node_modules/typescript": { "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -10857,6 +12169,8 @@ }, "node_modules/typescript-compare": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", + "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", "license": "MIT", "dependencies": { "typescript-logic": "^0.0.0" @@ -10864,10 +12178,14 @@ }, "node_modules/typescript-logic": { "version": "0.0.0", + "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", + "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==", "license": "MIT" }, "node_modules/typescript-tuple": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", + "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", "license": "MIT", "dependencies": { "typescript-compare": "^0.0.2" @@ -10875,6 +12193,8 @@ }, "node_modules/ua-parser-js": { "version": "1.0.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz", + "integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==", "funding": [ { "type": "opencollective", @@ -10896,6 +12216,8 @@ }, "node_modules/uncontrollable": { "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.3", @@ -10908,11 +12230,15 @@ } }, "node_modules/undici-types": { - "version": "6.19.6", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, "node_modules/universal-cookie": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.2.0.tgz", + "integrity": "sha512-PvcyflJAYACJKr28HABxkGemML5vafHmiL4ICe3e+BEKXRMt0GaFLZhAwgv637kFFnnfiSJ8e6jknrKkMrU+PQ==", "license": "MIT", "dependencies": { "@types/cookie": "^0.6.0", @@ -10921,6 +12247,8 @@ }, "node_modules/update-browserslist-db": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -10949,6 +12277,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -10956,6 +12286,8 @@ }, "node_modules/use-ackee": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use-ackee/-/use-ackee-3.1.0.tgz", + "integrity": "sha512-RPX51I/Ak6dtNW0aXY6GM/LJ899OU4qoKes/CTGj9+4Qoz9PO7I14BX8Rw6vmlbVvQzZ6WIb01sg7vU/kYEQOw==", "license": "MIT", "dependencies": { "ackee-tracker": "^5.1.0" @@ -10969,6 +12301,8 @@ }, "node_modules/use-composed-ref": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -10976,6 +12310,8 @@ }, "node_modules/use-immer": { "version": "0.9.0", + "resolved": "https://registry.npmjs.org/use-immer/-/use-immer-0.9.0.tgz", + "integrity": "sha512-/L+enLi0nvuZ6j4WlyK0US9/ECUtV5v9RUbtxnn5+WbtaXYUaOBoKHDNL9I5AETdurQ4rIFIj/s+Z5X80ATyKw==", "license": "MIT", "peerDependencies": { "immer": ">=2.0.0", @@ -10984,6 +12320,8 @@ }, "node_modules/use-isomorphic-layout-effect": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -10996,6 +12334,8 @@ }, "node_modules/use-latest": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", "license": "MIT", "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" @@ -11011,6 +12351,8 @@ }, "node_modules/use-sync-external-store": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -11018,10 +12360,14 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/uuid": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -11033,6 +12379,8 @@ }, "node_modules/victory-area": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-36.9.2.tgz", + "integrity": "sha512-32aharvPf2RgdQB+/u1j3/ajYFNH/7ugLX9ZRpdd65gP6QEbtXL+58gS6CxvFw6gr/y8a0xMlkMKkpDVacXLpw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11045,6 +12393,8 @@ }, "node_modules/victory-axis": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-36.9.2.tgz", + "integrity": "sha512-4Odws+IAjprJtBg2b2ZCxEPgrQ6LgIOa22cFkGghzOSfTyNayN4M3AauNB44RZyn2O/hDiM1gdBkEg1g9YDevQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11056,6 +12406,8 @@ }, "node_modules/victory-bar": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-36.9.2.tgz", + "integrity": "sha512-R3LFoR91FzwWcnyGK2P8DHNVv9gsaWhl5pSr2KdeNtvLbZVEIvUkTeVN9RMBMzterSFPw0mbWhS1Asb3sV6PPw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11068,6 +12420,8 @@ }, "node_modules/victory-box-plot": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-36.9.2.tgz", + "integrity": "sha512-nUD45V/YHDkAKZyak7YDsz+Vk1F9N0ica3jWQe0AY0JqD9DleHa8RY/olSVws26kLyEj1I+fQqva6GodcLaIqQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11080,6 +12434,8 @@ }, "node_modules/victory-brush-container": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-36.9.2.tgz", + "integrity": "sha512-KcQjzFeo40tn52cJf1A02l5MqeR9GKkk3loDqM3T2hfi1PCyUrZXEUjGN5HNlLizDRvtcemaAHNAWlb70HbG/g==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11092,6 +12448,8 @@ }, "node_modules/victory-chart": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-36.9.2.tgz", + "integrity": "sha512-dMNcS0BpqL3YiGvI4BSEmPR76FCksCgf3K4CSZ7C/MGyrElqB6wWwzk7afnlB1Qr71YIHXDmdwsPNAl/iEwTtA==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11107,6 +12465,8 @@ }, "node_modules/victory-core": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", + "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.21", @@ -11119,6 +12479,8 @@ }, "node_modules/victory-create-container": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-36.9.2.tgz", + "integrity": "sha512-uA0dh1R0YDzuXyE/7StZvq4qshet+WYceY7R1UR5mR/F9079xy+iQsa2Ca4h97/GtVZoLO6r1eKLWBt9TN+U7A==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11135,6 +12497,8 @@ }, "node_modules/victory-cursor-container": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-36.9.2.tgz", + "integrity": "sha512-jidab4j3MaciF3fGX70jTj4H9rrLcY8o2LUrhJ67ZLvEFGGmnPtph+p8Fe97Umrag7E/DszjNxQZolpwlgUh3g==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11146,6 +12510,8 @@ }, "node_modules/victory-group": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-36.9.2.tgz", + "integrity": "sha512-wBmpsjBTKva8mxHvHNY3b8RE58KtnpLLItEyyAHaYkmExwt3Uj8Cld3sF3vmeuijn2iR64NPKeMbgMbfZJzycw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11159,6 +12525,8 @@ }, "node_modules/victory-legend": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-36.9.2.tgz", + "integrity": "sha512-cucFJpv6fty+yXp5pElQFQnHBk1TqA4guGUMI+XF/wLlnuM4bhdAtASobRIIBkz0mHGBaCAAV4PzL9azPU/9dg==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11170,6 +12538,8 @@ }, "node_modules/victory-line": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-36.9.2.tgz", + "integrity": "sha512-kmYFZUo0o2xC8cXRsmt/oUBRQSZJVT2IJnAkboUepypoj09e6CY5tRH4TSdfEDGkBk23xQkn7d4IFgl4kAGnSA==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11182,6 +12552,8 @@ }, "node_modules/victory-pie": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-36.9.2.tgz", + "integrity": "sha512-i3zWezvy5wQEkhXKt4rS9ILGH7Vr9Q5eF9fKO4GMwDPBdYOTE3Dh2tVaSrfDC8g9zFIc0DKzOtVoJRTb+0AkPg==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11194,6 +12566,8 @@ }, "node_modules/victory-polar-axis": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-36.9.2.tgz", + "integrity": "sha512-HBR90FF4M56yf/atXjSmy3DMps1vSAaLXmdVXLM/A5g+0pUS7HO719r5x6dsR3I6Rm+8x6Kk8xJs0qgpnGQIEw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11205,6 +12579,8 @@ }, "node_modules/victory-scatter": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-36.9.2.tgz", + "integrity": "sha512-hK9AtbJQfaW05i8BH7Lf1HK7vWMAfQofj23039HEQJqTKbCL77YT+Q0LhZw1a1BRCpC/5aSg9EuqblhfIYw2wg==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11216,6 +12592,8 @@ }, "node_modules/victory-selection-container": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-36.9.2.tgz", + "integrity": "sha512-chboroEwqqVlMB60kveXM2WznJ33ZM00PWkFVCoJDzHHlYs7TCADxzhqet2S67SbZGSyvSprY2YztSxX8kZ+XQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11227,6 +12605,8 @@ }, "node_modules/victory-shared-events": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-36.9.2.tgz", + "integrity": "sha512-W/atiw3Or6MnpBuhluFv6007YrixIRh5NtiRvtFLGxNuQJLYjaSh6koRAih5xJer5Pj7YUx0tL9x67jTRcJ6Dg==", "license": "MIT", "dependencies": { "json-stringify-safe": "^5.0.1", @@ -11240,6 +12620,8 @@ }, "node_modules/victory-stack": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-36.9.2.tgz", + "integrity": "sha512-imR6FniVlDFlBa/B3Est8kTryNhWj2ZNpivmVOebVDxkKcVlLaDg3LotCUOI7NzOhBQaro0UzeE9KmZV93JcYA==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11253,6 +12635,8 @@ }, "node_modules/victory-tooltip": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-36.9.2.tgz", + "integrity": "sha512-76seo4TWD1WfZHJQH87IP3tlawv38DuwrUxpnTn8+uW6/CUex82poQiVevYdmJzhataS9jjyCWv3w7pOmLBCLg==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11264,6 +12648,8 @@ }, "node_modules/victory-vendor": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", "license": "MIT AND ISC", "dependencies": { "@types/d3-array": "^3.0.3", @@ -11284,6 +12670,8 @@ }, "node_modules/victory-voronoi-container": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-36.9.2.tgz", + "integrity": "sha512-NIVYqck9N4OQnEz9mgQ4wILsci3OBWWK7RLuITGHyoD7Ne/+WH1i0Pv2y9eIx+f55rc928FUTugPPhkHvXyH3A==", "license": "MIT", "dependencies": { "delaunay-find": "0.0.6", @@ -11298,6 +12686,8 @@ }, "node_modules/victory-zoom-container": { "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-36.9.2.tgz", + "integrity": "sha512-pXa2Ji6EX/pIarKT6Hcmmu2n7IG/x8Vs0D2eACQ/nbpvZa+DXWIxCRW4hcg2Va35fmXcDIEpGaX3/soXzZ+pbw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", @@ -11308,13 +12698,15 @@ } }, "node_modules/vite": { - "version": "5.4.1", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", + "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.41", - "rollup": "^4.13.0" + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -11367,6 +12759,8 @@ }, "node_modules/vite-node": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", + "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", "dev": true, "license": "MIT", "dependencies": { @@ -11388,6 +12782,8 @@ }, "node_modules/vite-plugin-babel-macros": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vite-plugin-babel-macros/-/vite-plugin-babel-macros-1.0.6.tgz", + "integrity": "sha512-7cCT8jtu5UjpE46pH7RyVltWw5FbhDAtQliZ6QGqRNR5RUZKdAsB0CDjuF+VBoDpnl0KuESPu22SoNqXRYYWyQ==", "license": "MIT", "dependencies": { "@babel/core": "^7.17.7", @@ -11405,6 +12801,8 @@ }, "node_modules/vite-plugin-istanbul": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-istanbul/-/vite-plugin-istanbul-5.0.0.tgz", + "integrity": "sha512-Tg9zDmm/u4SdEDFbEWHBz7mmFe7jhLRmArA2XCmw5yydEFCARU9r4TxqFFnBFWCL63D9A7XA7VELulOO5T5o/g==", "dev": true, "license": "MIT", "dependencies": { @@ -11420,6 +12818,8 @@ }, "node_modules/vite-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -11435,6 +12835,8 @@ }, "node_modules/vite-plugin-istanbul/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -11458,6 +12860,8 @@ }, "node_modules/vitest": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", + "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", "dev": true, "license": "MIT", "dependencies": { @@ -11521,16 +12925,22 @@ }, "node_modules/warning": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/webgl-constants": { - "version": "1.1.1" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" }, "node_modules/webidl-conversions": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -11539,14 +12949,20 @@ }, "node_modules/webworker-promise": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webworker-promise/-/webworker-promise-0.5.0.tgz", + "integrity": "sha512-14iR79jHAV7ozwvbfif+3wCaApT3I1g8Lo0rJZrwAu6wxZGx/08Y8KXz6as6ZLNUEEufeiEBBYrqyDBClXOsEw==", "license": "MIT" }, "node_modules/whatwg-fetch": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, "license": "MIT", "engines": { @@ -11555,6 +12971,8 @@ }, "node_modules/whatwg-url": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -11563,10 +12981,14 @@ }, "node_modules/whatwg-url/node_modules/webidl-conversions": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -11581,11 +13003,15 @@ }, "node_modules/which-module": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true, "license": "ISC" }, "node_modules/why-is-node-running": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -11601,6 +13027,8 @@ }, "node_modules/worker-loader": { "version": "3.0.8", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz", + "integrity": "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", @@ -11619,6 +13047,8 @@ }, "node_modules/worker-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -11631,6 +13061,8 @@ }, "node_modules/wrap-ansi": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "license": "MIT", "dependencies": { @@ -11644,6 +13076,8 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -11658,6 +13092,8 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11669,15 +13105,21 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "license": "ISC", "dependencies": { @@ -11689,6 +13131,8 @@ }, "node_modules/write-file-atomic/node_modules/typedarray-to-buffer": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "license": "MIT", "dependencies": { @@ -11697,6 +13141,8 @@ }, "node_modules/xmlbuilder2": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.0.2.tgz", + "integrity": "sha512-h4MUawGY21CTdhV4xm3DG9dgsqyhDkZvVJBx88beqX8wJs3VgyGQgAn5VreHuae6unTQxh115aMK5InCVmOIKw==", "license": "MIT", "dependencies": { "@oozcitak/dom": "1.15.10", @@ -11711,6 +13157,8 @@ }, "node_modules/xmlbuilder2/node_modules/js-yaml": { "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -11722,6 +13170,8 @@ }, "node_modules/xss": { "version": "1.0.14", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", + "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", "license": "MIT", "dependencies": { "commander": "^2.20.3", @@ -11736,10 +13186,14 @@ }, "node_modules/xss/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, "node_modules/xtend": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", "dev": true, "engines": { "node": ">=0.4" @@ -11747,15 +13201,21 @@ }, "node_modules/y18n": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, "license": "ISC" }, "node_modules/yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "license": "ISC", "engines": { "node": ">= 6" @@ -11763,6 +13223,8 @@ }, "node_modules/yargs": { "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "license": "MIT", "dependencies": { @@ -11784,6 +13246,8 @@ }, "node_modules/yargs-parser": { "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "license": "ISC", "dependencies": { diff --git a/src/components/NewLibrary/components/FileCard.tsx b/src/components/NewLibrary/components/FileCard.tsx index 9caec2355..27b2b4991 100644 --- a/src/components/NewLibrary/components/FileCard.tsx +++ b/src/components/NewLibrary/components/FileCard.tsx @@ -14,7 +14,6 @@ import { SplitItem, Tooltip, } from "@patternfly/react-core"; -import { useQueryClient } from "@tanstack/react-query"; import { format } from "date-fns"; import { isEmpty } from "lodash"; import type React from "react"; diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 5fe3aaaa8..f114baa20 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -13,19 +13,21 @@ import { Thead, Tr, } from "@patternfly/react-table"; -import { useQueryClient } from "@tanstack/react-query"; import { format } from "date-fns"; -import React, { useContext } from "react"; +import React, { useContext, useState } from "react"; import { useNavigate } from "react-router"; import { useTypedSelector } from "../../../store/hooks"; import { getIcon } from "../../Common"; import { ThemeContext } from "../../DarkTheme/useTheme"; +import { formatBytes } from "../../Feeds/utilties"; +import { OperationContext } from "../context"; import useLongPress, { getBackgroundRowColor } from "../utils/longpress"; import { FolderContextMenu } from "./ContextMenu"; import { getFileName, getLinkFileName } from "./FileCard"; import { getFolderName } from "./FolderCard"; -import { formatBytes } from "../../Feeds/utilties"; -import { OperationContext } from "../context"; +import "./LibraryTable.css"; +import { Drawer } from "antd"; +import FileDetailView from "../../Preview/FileDetailView"; interface TableProps { data: { @@ -50,10 +52,11 @@ const LibraryTable: React.FunctionComponent = ( const navigate = useNavigate(); const { handlers } = useLongPress(); const { handleOnClick } = handlers; - const queryClient = useQueryClient(); const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const isDarkTheme = useContext(ThemeContext).isDarkTheme; const { data, computedPath, handleFolderClick } = props; + const [preview, setShowPreview] = useState(false); + const [selectedFile, setSelectedFile] = useState(); const renderRow = ( resource: @@ -70,7 +73,6 @@ const LibraryTable: React.FunctionComponent = ( selectedPaths.length > 0 && selectedPaths.some((payload) => payload.path === resource.data.path); const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); - const icon = getIcon(type, isDarkTheme); const handleItem = ( @@ -90,6 +92,8 @@ const LibraryTable: React.FunctionComponent = ( if (type === "file") { // Show preview + setSelectedFile(resource as FileBrowserFolderFile); + setShowPreview(true); } }; @@ -141,6 +145,20 @@ const LibraryTable: React.FunctionComponent = ( return ( + { + setShowPreview(false); + setSelectedFile(undefined); + }} + placement="right" + > + {selectedFile && ( + + )} +
Data Library
{folderName} - {resource.data.creation_date} - N/ASize
{fileName} - {resource.data.creation_date} - - {resource.data.owner_username} - {resource.data.fsize}
{fileName} - {resource.data.creation_date} - - {resource.data.owner_username} - {resource.data.fsize}
diff --git a/src/components/Preview/displays/ImageDisplay.tsx b/src/components/Preview/displays/ImageDisplay.tsx index a028298ba..b6e8ccdee 100644 --- a/src/components/Preview/displays/ImageDisplay.tsx +++ b/src/components/Preview/displays/ImageDisplay.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useEffect, useState } from "react"; import type { IFileBlob } from "../../../api/model"; type AllProps = { @@ -7,16 +7,34 @@ type AllProps = { const ImageDisplay: React.FunctionComponent = (props: AllProps) => { const { fileItem } = props; - const url = fileItem.url - ? fileItem.url - : fileItem.blob - ? window.URL.createObjectURL(new Blob([fileItem.blob])) - : ""; + const [url, setUrl] = useState(""); + + useEffect(() => { + if (fileItem.url) { + setUrl(fileItem.url); + } else if (fileItem.blob) { + // Specify the correct MIME type when creating the Blob + const blob = new Blob([fileItem.blob], { type: "image/png" }); + const objectUrl = URL.createObjectURL(blob); + setUrl(objectUrl); + + // Clean up the object URL when the component unmounts + return () => { + URL.revokeObjectURL(objectUrl); + }; + } + }, [fileItem]); + + if (!url) return null; + return ( + // biome-ignore lint/a11y/useKeyWithClickEvents: e.preventDefault()} /> ); }; From 1d2018334c859f5a3167fff2e8e1d86164f7270b Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Fri, 23 Aug 2024 16:06:02 -0400 Subject: [PATCH 130/337] feat: Update the Library Table to show file previews correctly --- .../NewLibrary/components/LibraryTable.tsx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index f114baa20..51f770ad4 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -13,6 +13,7 @@ import { Thead, Tr, } from "@patternfly/react-table"; +import { Drawer } from "antd"; import { format } from "date-fns"; import React, { useContext, useState } from "react"; import { useNavigate } from "react-router"; @@ -20,14 +21,12 @@ import { useTypedSelector } from "../../../store/hooks"; import { getIcon } from "../../Common"; import { ThemeContext } from "../../DarkTheme/useTheme"; import { formatBytes } from "../../Feeds/utilties"; +import FileDetailView from "../../Preview/FileDetailView"; import { OperationContext } from "../context"; import useLongPress, { getBackgroundRowColor } from "../utils/longpress"; import { FolderContextMenu } from "./ContextMenu"; import { getFileName, getLinkFileName } from "./FileCard"; import { getFolderName } from "./FolderCard"; -import "./LibraryTable.css"; -import { Drawer } from "antd"; -import FileDetailView from "../../Preview/FileDetailView"; interface TableProps { data: { @@ -71,7 +70,15 @@ const LibraryTable: React.FunctionComponent = ( ) => { const isSelected = selectedPaths.length > 0 && - selectedPaths.some((payload) => payload.path === resource.data.path); + selectedPaths.some((payload) => { + if (type === "folder" || type === "link") { + return payload.path === resource.data.path; + } + + if (type === "file") { + return payload.path === resource.data.fname; + } + }); const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); const icon = getIcon(type, isDarkTheme); From 1c6f8384fd659c81e767a93eb08bf5ab4a2fb76a Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Fri, 23 Aug 2024 16:11:55 -0400 Subject: [PATCH 131/337] feat: Cleanup --- src/components/NewLibrary/components/Cart.tsx | 6 ++++-- src/components/NewLibrary/components/FileCard.tsx | 2 +- src/components/NewLibrary/components/FolderCard.tsx | 2 +- src/components/NewLibrary/components/Operations.tsx | 6 +++--- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/components/NewLibrary/components/Cart.tsx b/src/components/NewLibrary/components/Cart.tsx index 9fdd36276..f44d9481c 100644 --- a/src/components/NewLibrary/components/Cart.tsx +++ b/src/components/NewLibrary/components/Cart.tsx @@ -1,5 +1,4 @@ import { Button, Text, Tooltip } from "@patternfly/react-core"; -import { Drawer, List, Popconfirm, Space } from "../../Antd"; import { isEmpty } from "lodash"; import { useDispatch } from "react-redux"; import { Link } from "react-router-dom"; @@ -12,6 +11,7 @@ import { } from "../../../store/cart/cartSlice"; import { DownloadTypes } from "../../../store/cart/types"; import { useTypedSelector } from "../../../store/hooks"; +import { Drawer, List, Popconfirm, Space } from "../../Antd"; import { DotsIndicator, EmptyStateComponent } from "../../Common"; import { CheckCircleIcon, CloseIcon, FileIcon, FolderIcon } from "../../Icons"; import { ShowInFolder, TitleNameClipped, elipses } from "../utils/longpress"; @@ -166,7 +166,9 @@ const Cart = () => { avatar={} title={ } diff --git a/src/components/NewLibrary/components/FileCard.tsx b/src/components/NewLibrary/components/FileCard.tsx index 27b2b4991..b6fca2325 100644 --- a/src/components/NewLibrary/components/FileCard.tsx +++ b/src/components/NewLibrary/components/FileCard.tsx @@ -26,12 +26,12 @@ import { getIcon } from "../../Common"; import { ThemeContext } from "../../DarkTheme/useTheme"; import { ExternalLinkSquareAltIcon } from "../../Icons"; import FileDetailView from "../../Preview/FileDetailView"; +import { OperationContext, type OriginState } from "../context"; import useLongPress, { elipses, getBackgroundRowColor, } from "../utils/longpress"; import { FolderContextMenu } from "./ContextMenu"; -import { OperationContext, type OriginState } from "../context"; type Pagination = { totalCount: number; diff --git a/src/components/NewLibrary/components/FolderCard.tsx b/src/components/NewLibrary/components/FolderCard.tsx index 33d33199f..0ae5f2469 100644 --- a/src/components/NewLibrary/components/FolderCard.tsx +++ b/src/components/NewLibrary/components/FolderCard.tsx @@ -8,7 +8,7 @@ import { Split, SplitItem, } from "@patternfly/react-core"; -import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { useQuery } from "@tanstack/react-query"; import { format } from "date-fns"; import { isEmpty } from "lodash"; import { useContext } from "react"; diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index 6f328a25e..eea1e26a0 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -23,6 +23,7 @@ import React, { useState, } from "react"; import { useDispatch } from "react-redux"; +import { useLocation } from "react-router"; import { getFileName } from "../../../api/common"; import { removeSelectedPayload } from "../../../store/cart/cartSlice"; import { useTypedSelector } from "../../../store/hooks"; @@ -37,11 +38,10 @@ import { MergeIcon, ShareIcon, } from "../../Icons"; -import { useFolderOperations } from "../utils/useOperations"; -import "./Operations.css"; -import { useLocation } from "react-router"; import { type OriginState, useOperationsContext } from "../context"; +import { useFolderOperations } from "../utils/useOperations"; import LayoutSwitch from "./LayoutSwitch"; +import "./Operations.css"; export type AdditionalValues = { share: { From 6805968c7b32765098fafd02afdcd87f4fa8b6c4 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 26 Aug 2024 12:15:47 -0400 Subject: [PATCH 132/337] feat: Update to folder upload statuses --- package.json | 1 + src/store/cart/uploadSaga.ts | 19 +++++++++++++++++++ tsconfig.node.json | 2 +- vite.config.ts | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 54afd19f5..ff124180e 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "dev": "npm run dev:local", "dev:local": "npm run test:prepare && vite", "dev:public": "vite -c testing/publicCUBE/vite.config.ts", + "dev:metal": "vite", "build": "vite build", "test": "vitest", "__test:prepare:comment": "# test:prepare runs CUBE locally and loads sample DICOM data into the PACS.", diff --git a/src/store/cart/uploadSaga.ts b/src/store/cart/uploadSaga.ts index 7c9cb99f8..4492690bd 100644 --- a/src/store/cart/uploadSaga.ts +++ b/src/store/cart/uploadSaga.ts @@ -85,6 +85,24 @@ function* uploadFileBatch( let lastError = ""; const folderController = new AbortController(); + // Immediately set a status to indicate that the upload has started + if (isFolder) { + // Immediately show the upload status for folders, as calculating the status for batched uploads may take time, + // and the UI won't provide any notification during that period. + const name = files[0].webkitRelativePath; + const fileName = name.split("/")[0]; + yield put( + setFolderUploadStatus({ + step: "Upload Started", + fileName: fileName, + totalCount: totalFiles, + currentCount: uploadedFilesCount, + controller: folderController, + path: currentPath, + type: "folder", + }), + ); + } for (const batch of batches) { yield all( batch.map((file) => { @@ -96,6 +114,7 @@ function* uploadFileBatch( formData.append("fname", file, name); const controller = new AbortController(); + const config = { headers: { Authorization: `Token ${client.auth.token}` }, signal: isFolder ? folderController.signal : controller.signal, diff --git a/tsconfig.node.json b/tsconfig.node.json index 1c1f96d2b..1416f2aad 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -4,7 +4,7 @@ "lib": ["ES2023"], "module": "ESNext", "skipLibCheck": true, - + "composite": true, "moduleResolution": "bundler", "noImplicitAny": true, "allowSyntheticDefaultImports": true diff --git a/vite.config.ts b/vite.config.ts index 3dc74396d..9680c194d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -26,6 +26,7 @@ export default defineConfig({ // workaround for "Cornerstone3D tools does not build with vite" // https://github.com/cornerstonejs/cornerstone3D/issues/1071 "@cornerstonejs/tools": "@cornerstonejs/tools/dist/umd/index.js", + fs: "rollup-plugin-node-builtins", }, }, }); From 489e0a420fa0ac7507f115973d8a2f112d17c116 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 26 Aug 2024 16:15:14 -0400 Subject: [PATCH 133/337] feat: Uploading a file or a folder in the feeds list page creates a new feed --- src/components/NewLibrary/components/Cart.tsx | 151 ++++---- .../NewLibrary/components/ContextMenu.tsx | 7 +- .../NewLibrary/components/Operations.tsx | 278 +++++++------- src/components/NewLibrary/context/index.tsx | 1 + src/components/NewLibrary/utils/longpress.tsx | 6 +- .../NewLibrary/utils/useOperations.tsx | 38 +- src/store/cart/downloadSaga.ts | 11 +- src/store/cart/types.ts | 2 + src/store/cart/uploadSaga.ts | 339 +++++++++++++----- 9 files changed, 520 insertions(+), 313 deletions(-) diff --git a/src/components/NewLibrary/components/Cart.tsx b/src/components/NewLibrary/components/Cart.tsx index f44d9481c..ff35d0906 100644 --- a/src/components/NewLibrary/components/Cart.tsx +++ b/src/components/NewLibrary/components/Cart.tsx @@ -183,89 +183,102 @@ const Cart = () => { ( - - {} - , - status.progress === 100 || - status.currentStep === "UploadComplete" ? ( - - ) : status.currentStep.includes("Cancelled") || - status.currentStep.startsWith("Error") ? ( - - ) : ( - - ), - , - , - ]} - > - } - title={} - /> - - )} + renderItem={([name, status]) => { + const isError = + status.currentStep.includes("Cancelled") || + status.currentStep.startsWith("Error"); + const isComplete = + status.progress === 100 && status.currentStep === "Upload Complete"; + return ( + + {} + , + isComplete ? ( + + ) : isError ? ( + + ) : ( + + ), + , + , + ]} + > + } + title={} + /> + + ); + }} /> { + const isError = + status.currentStep.includes("Cancelled") || + status.currentStep.startsWith("Error"); + const isComplete = + status.done === status.total && + status.currentStep === "Upload Complete"; return ( {status.currentStep}, - status.done === status.total || - status.currentStep === "UploadComplete" ? ( + isComplete ? ( - ) : status.currentStep.includes("Cancelled") || - status.currentStep.startsWith("Error") ? ( + ) : isError ? ( { {status.done}/{status.total} ), - , + , - - - {indicators.isError && ( - - )} - - - ); -}; - const items = [ { key: "newFolder", label: "New Folder" }, { key: "fileUpload", label: "File Upload" }, @@ -193,13 +69,10 @@ const items = [ ]; const Operations = React.forwardRef((props: OperationProps, ref) => { - const { invalidateQueries } = useOperationsContext(); const location = useLocation(); const { origin, computedPath, folderList, customStyle, customClassName } = props; - const dispatch = useDispatch(); - const { modalInfo, userError, @@ -212,7 +85,12 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { contextHolder, setUserErrors, setModalInfo, - } = useFolderOperations(origin, computedPath, folderList); + } = useFolderOperations( + origin, + computedPath, + folderList, + location.pathname === "/feeds", + ); useImperativeHandle(ref, () => ({ triggerFileUpload: () => { @@ -223,25 +101,9 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { }, })); - const { selectedPaths, fileUploadStatus, folderUploadStatus } = - useTypedSelector((state) => state.cart); + const { selectedPaths } = useTypedSelector((state) => state.cart); const selectedPathsCount = selectedPaths.length; - useEffect(() => { - // Check if any file or folder upload has completed - const isUploadComplete = (status: any) => - status.currentStep === "Upload Complete"; - - const hasFileUploadCompleted = - Object.values(fileUploadStatus).some(isUploadComplete); - const hasFolderUploadCompleted = - Object.values(folderUploadStatus).some(isUploadComplete); - - if (hasFileUploadCompleted || hasFolderUploadCompleted) { - invalidateQueries(); - } - }, [fileUploadStatus, folderUploadStatus, origin]); - const renderOperationButton = ( icon: React.ReactNode, operationKey: string, @@ -452,3 +314,127 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { }); export default Operations; + +interface AddModalProps { + operationType: string; + isOpen: boolean; + onClose: () => void; + onSubmit: (inputValue: string, additionalValues?: AdditionalValues) => void; + modalTitle: string; + inputLabel: string; + indicators: { + isPending: boolean; + isError: boolean; + error: DefaultError | null; + clearErrors: () => void; + }; +} + +export const AddModal = (props: AddModalProps) => { + const { + isOpen, + onClose, + onSubmit, + modalTitle, + inputLabel, + indicators, + operationType, + } = props; + const [inputValue, setInputValue] = useState(""); + const [additionalValues, setAdditionalValues] = useState({ + share: { + read: false, + write: true, + }, + }); + + const handleClose = () => { + setInputValue(""); + onClose(); + }; + + useEffect(() => { + async function fetchUsers() {} + if (modalTitle === "Share this Folder") { + fetchUsers(); + } + }, [modalTitle]); + + return ( + +
+ + setInputValue(value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + e.preventDefault(); + onSubmit(inputValue); + } + }} + aria-label={inputLabel} + placeholder={inputLabel} + /> + + {operationType === "share" && ( + + { + setAdditionalValues({ + ...additionalValues, + share: { + ...additionalValues?.share, + read: checked, + }, + }); + }} + /> + { + setAdditionalValues({ + ...additionalValues, + share: { + ...additionalValues?.share, + write: checked, + }, + }); + }} + /> + + )} + + + + + + {indicators.isError && ( + + )} + +
+ ); +}; diff --git a/src/components/NewLibrary/context/index.tsx b/src/components/NewLibrary/context/index.tsx index 2d4dbc391..f9c1749c0 100644 --- a/src/components/NewLibrary/context/index.tsx +++ b/src/components/NewLibrary/context/index.tsx @@ -48,6 +48,7 @@ export const OperationsProvider: React.FC< const type = originRef.current?.type; if (!type) return; + switch (type) { case OperationContext.LIBRARY: queryClient.refetchQueries({ diff --git a/src/components/NewLibrary/utils/longpress.tsx b/src/components/NewLibrary/utils/longpress.tsx index 43935cd7b..c94dee588 100644 --- a/src/components/NewLibrary/utils/longpress.tsx +++ b/src/components/NewLibrary/utils/longpress.tsx @@ -153,12 +153,16 @@ export function TitleNameClipped({ ); } -export function ShowInFolder({ path }: { path: string }) { +export function ShowInFolder({ + path, + isError, +}: { path: string; isError: boolean }) { const navigate = useNavigate(); const dispatch = useDispatch(); return ( , - ]} - > - } - title={} - /> -
- ); - }} - /> - { - const isError = - status.currentStep.includes("Cancelled") || - status.currentStep.startsWith("Error"); - const isComplete = - status.done === status.total && - status.currentStep === "Upload Complete"; - return ( - {status.currentStep}, - isComplete ? ( - - ) : isError ? ( - - ) : ( -
- {status.done}/{status.total} -
- ), - , - , - ]} - > - } - title={} - /> -
- ); - }} + + + {isEmpty(folderUploadStatus) && isEmpty(fileUploadStatus) && isEmpty(fileDownloadStatus) && @@ -341,6 +211,9 @@ const Cart = () => { export default Cart; +/************************************************ */ +/* Utility Components for the cart */ +/*********************************************** */ export const Status = ({ currentStatus, }: { @@ -367,3 +240,114 @@ export const Status = ({ return currentStatus ? : null; } }; + +type UploadStatusProp = FileUpload | FolderUpload; +interface UploadListProps { + uploadStatus: UploadStatusProp; + type: "file" | "folder"; + dispatch: AppDispatch; +} +const UploadList: React.FC = ({ + uploadStatus, + type, + dispatch, +}) => ( + ( + + )} + /> +); + +interface UploadStatusProps { + status: FileUploadObject | FolderUploadObject; + type: "file" | "folder"; + name: string; + dispatch: AppDispatch; +} +const UploadStatus: React.FC = ({ + status, + type, + name, + dispatch, +}) => { + const isError = + status.currentStep.includes("Cancelled") || + status.currentStep.startsWith("Error"); + const isComplete = + type === "file" + ? (status as FileUploadObject).progress === 100 && + status.currentStep === "Upload Complete" + : (status as FolderUploadObject).done === + (status as FolderUploadObject).total && + status.currentStep === "Upload Complete"; + + const handleAction = () => { + if (status.currentStep === "Uploading...") { + dispatch(cancelUpload({ type, id: name })); + } else { + dispatch(clearUploadState({ type, id: name })); + } + }; + + return ( + + + , + isComplete ? ( + + ) : isError ? ( + + ) : type === "file" ? ( + + ) : ( +
+ {(status as FolderUploadObject).done}/ + {(status as FolderUploadObject).total} +
+ ), + , + , + ]} + > + : } + title={} + /> +
+ ); +}; From 4ca3a1d0eb8d643a00c368c1bcf51c0009699837 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 26 Aug 2024 16:56:56 -0400 Subject: [PATCH 136/337] refactor: cleanup --- src/components/Common/index.tsx | 8 ++++++-- src/components/NewLibrary/components/LibraryTable.tsx | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/Common/index.tsx b/src/components/Common/index.tsx index e81c9cdb5..3e2f86c0a 100644 --- a/src/components/Common/index.tsx +++ b/src/components/Common/index.tsx @@ -363,9 +363,13 @@ export const ClipboardCopyFixed = ({ ); }; -export const getIcon = (type: string, isDarkTheme: boolean) => { +export const getIcon = ( + type: string, + isDarkTheme: boolean, + customStyle?: React.CSSProperties, +) => { const color = isDarkTheme ? "#FFFFFF" : "#000000"; // white for dark theme, black for light theme - const iconStyle = { color }; + const iconStyle = { color, ...customStyle }; switch (type.toLowerCase()) { case "dir": return ; diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 51f770ad4..3037db207 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -80,7 +80,9 @@ const LibraryTable: React.FunctionComponent = ( } }); const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); - const icon = getIcon(type, isDarkTheme); + const icon = getIcon(type, isDarkTheme, { + marginRight: "0.25em", + }); const handleItem = ( item: From fdae3c634955d5828b7802a593ff652cbbde497d Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Tue, 27 Aug 2024 10:41:47 -0400 Subject: [PATCH 137/337] feat: Update the Search Bar in the Feeds Table --- package-lock.json | 8 +-- package.json | 2 +- .../FeedOutputBrowser/FileBrowser.tsx | 1 + src/components/Feeds/FeedListView.tsx | 16 ++++- src/components/Feeds/Feeds.css | 1 + src/components/Feeds/FeedsSearch.tsx | 58 +++++++++++++++++++ .../NewLibrary/components/FolderCard.tsx | 2 +- 7 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 src/components/Feeds/FeedsSearch.tsx diff --git a/package-lock.json b/package-lock.json index a94d2f1f1..a080cbab4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", "@types/d3-zoom": "^3.0.8", - "antd": "^5.20.2", + "antd": "^5.20.3", "axios": "^1.7.2", "d3-hierarchy": "^1.1.9", "d3-selection": "^3.0.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/antd": { - "version": "5.20.2", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.20.2.tgz", - "integrity": "sha512-9d6Bs5ZKIV+JhB0eD7KxYnIfnhUh86kNtTGIuNiIxHFUhbuyT1DXN2SuMksDmtSfuRYZ82/C4hq+OJjWNNbmHg==", + "version": "5.20.3", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.20.3.tgz", + "integrity": "sha512-v2s5LJlhuccIKLT17ESXQDkiQJdPK4jXg4x2pmSSRlrKXAxfftn8Zhd/7pdF3qR3OkwheQpSRjynrNZKp9Tgkg==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.1.0", diff --git a/package.json b/package.json index ff124180e..7cf98cf7e 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", "@types/d3-zoom": "^3.0.8", - "antd": "^5.20.2", + "antd": "^5.20.3", "axios": "^1.7.2", "d3-hierarchy": "^1.1.9", "d3-selection": "^3.0.0", diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index a9ec311a4..58078adfc 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -237,6 +237,7 @@ const FileBrowser = (props: FileBrowserProps) => { }} icon={icon} variant="link" + style={{ padding: "0" }} > {fileName} diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index b3f3d5fbc..a7bc2350c 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -4,12 +4,12 @@ import { Button, Checkbox, EmptyState, - Title, EmptyStateIcon, EmptyStateVariant, PageSection, Pagination, Skeleton, + Title, ToggleGroup, ToggleGroupItem, type ToggleGroupItemProps, @@ -18,6 +18,7 @@ import { import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; import { useQuery } from "@tanstack/react-query"; import { format } from "date-fns"; +import { debounce } from "lodash"; import type React from "react"; import { useContext, useEffect, useState } from "react"; import { useNavigate } from "react-router"; @@ -31,16 +32,17 @@ import { ThemeContext } from "../DarkTheme/useTheme"; import { SearchIcon } from "../Icons"; import { FolderContextMenu } from "../NewLibrary/components/ContextMenu"; import Operations from "../NewLibrary/components/Operations"; +import { OperationContext } from "../NewLibrary/context"; import useLongPress from "../NewLibrary/utils/longpress"; import { PipelineProvider } from "../PipelinesCopy/context"; import WrapperConnect from "../Wrapper"; +import FeedSearch from "./FeedsSearch"; import { useSearchQueryParams } from "./usePaginate"; import { fetchFeeds, fetchPublicFeeds, getPluginInstanceDetails, } from "./utilties"; -import { OperationContext } from "../NewLibrary/context"; const { Paragraph } = Typography; @@ -99,6 +101,10 @@ const TableSelectable: React.FC = () => { ); }; + const handleFilterChange = debounce((search: string, searchType: string) => { + navigate(`/feeds?search=${search}&searchType=${searchType}&type=${type}`); + }, 50); + const onExampleTypeChange: ToggleGroupItemProps["onChange"] = (event) => { const id = event.currentTarget.id; navigate( @@ -214,6 +220,12 @@ const TableSelectable: React.FC = () => { }} customStyle={{ toolbarItem: { paddingInlineStart: "0" } }} /> + {loadingFeedState ? ( ) : feedsToDisplay.length > 0 ? ( diff --git a/src/components/Feeds/Feeds.css b/src/components/Feeds/Feeds.css index 311c11f98..086603935 100644 --- a/src/components/Feeds/Feeds.css +++ b/src/components/Feeds/Feeds.css @@ -5,6 +5,7 @@ align-items: center; justify-content: space-between; padding-block-end: 0 !important; + min-height:60px } .feed-list .error { diff --git a/src/components/Feeds/FeedsSearch.tsx b/src/components/Feeds/FeedsSearch.tsx new file mode 100644 index 000000000..bee4f9c0e --- /dev/null +++ b/src/components/Feeds/FeedsSearch.tsx @@ -0,0 +1,58 @@ +import { Space, Input, Select } from "antd"; +const { Search } = Input; + +const options = [ + { + value: "name", + label: "Name", + }, + { + value: "id", + label: "ID", + }, + { + value: "name_exact", + label: "Exact Match", + }, + + { + value: "name_startsWith", + label: "Match Starts With", + }, +]; + +interface FeedSearchProps { + search: string; + searchType: string; + onSearch: (search: string, searchType: string) => void; + loading: boolean; +} + +const FeedSearch = ({ + search, + searchType, + onSearch, + loading, +}: FeedSearchProps) => { + return ( + + { onSearch(search, value); @@ -50,6 +50,7 @@ const FeedSearch = ({ value={search} loading={loading && search.length > 0} enterButton="Search" + placeholder="Search in Analyses" /> ); diff --git a/src/components/Feeds/useFeedListData.tsx b/src/components/Feeds/useFeedListData.tsx new file mode 100644 index 000000000..8c0383cbc --- /dev/null +++ b/src/components/Feeds/useFeedListData.tsx @@ -0,0 +1,55 @@ +import { useQuery } from "@tanstack/react-query"; +import { useTypedSelector } from "../../store/hooks"; +import { fetchFeeds, fetchPublicFeeds } from "./utilties"; // Your API functions +import { useLocation } from "react-router"; +import { useMemo } from "react"; + +export function useSearchQueryParams() { + const { search } = useLocation(); + return useMemo(() => new URLSearchParams(search), [search]); +} + +const useSearchQuery = (query: URLSearchParams) => ({ + page: query.get("page") || "1", + search: query.get("search") || "", + searchType: query.get("searchType") || "name", + perPage: query.get("perPage") || "18", + type: query.get("type") || "public", +}); + +export const useFeedListData = () => { + const query = useSearchQueryParams(); + const isLoggedIn = useTypedSelector((state) => state.user.isLoggedIn); + const { perPage, page, type, search, searchType } = useSearchQuery(query); + + const { data, isLoading, isFetching } = useQuery({ + queryKey: ["feeds", perPage, page, type, search, searchType], + queryFn: () => fetchFeeds({ perPage, page, type, search, searchType }), + enabled: type === "private" || isLoggedIn, + }); + + const { + data: publicFeeds, + isLoading: publicFeedLoading, + isFetching: publicFeedFetching, + } = useQuery({ + queryKey: ["publicFeeds", perPage, page, type, search, searchType], + queryFn: () => + fetchPublicFeeds({ perPage, page, type, search, searchType }), + enabled: type === "public" || !isLoggedIn, + }); + + const feedCount = + type === "private" ? data?.totalFeedsCount : publicFeeds?.totalFeedsCount; + + const loadingFeedState = + isLoading || isFetching || publicFeedLoading || publicFeedFetching; + + return { + feedCount, + loadingFeedState, + feedsToDisplay: + type === "private" ? data?.feeds || [] : publicFeeds?.feeds || [], + searchFolderData: { perPage, page, type, search, searchType }, + }; +}; diff --git a/src/components/Feeds/useFetchFeed.tsx b/src/components/Feeds/useFetchFeed.tsx new file mode 100644 index 000000000..706e9c020 --- /dev/null +++ b/src/components/Feeds/useFetchFeed.tsx @@ -0,0 +1,60 @@ +import { useQuery } from "@tanstack/react-query"; +import { useEffect } from "react"; +import { useNavigate } from "react-router"; +import type { Feed } from "@fnndsc/chrisapi"; +import { fetchAuthenticatedFeed, fetchPublicFeed } from "./utilties"; +import { notification } from "../Antd"; + +export const useFetchFeed = ( + id: string | undefined, + type: string | null, + isLoggedIn?: boolean, +) => { + const navigate = useNavigate(); + const [api, contextHolder] = notification.useNotification(); + + const { data: publicFeed, isError: isPublicFeedError } = useQuery({ + queryKey: ["publicFeed", id], + queryFn: () => fetchPublicFeed(id), + enabled: type === "public", + }); + + const { + data: privateFeed, + isError: isPrivateFeedError, + error: privateFeedError, + } = useQuery({ + queryKey: ["authenticatedFeed", id], + queryFn: () => fetchAuthenticatedFeed(id), + enabled: type === "private" && isLoggedIn, + }); + + useEffect(() => { + if (!type || (type === "private" && !isLoggedIn)) { + const redirectTo = encodeURIComponent(window.location.href); + navigate(`/login?redirectTo=${redirectTo}`); + } + }, [type, isLoggedIn, navigate]); + + useEffect(() => { + if (isPrivateFeedError) { + api.error({ + message: + privateFeedError?.message || "Failed to load the private feed.", + duration: 1.5, + }); + const timer = setTimeout(() => { + navigate("/feeds?type=private"); + }, 2500); + return () => clearTimeout(timer); + } + }, [isPrivateFeedError, privateFeedError, api, navigate]); + + const feed: Feed | undefined = privateFeed || publicFeed; + + return { + feed, + isError: isPrivateFeedError || isPublicFeedError, + contextHolder, + }; +}; diff --git a/src/components/Feeds/usePaginate.tsx b/src/components/Feeds/usePaginate.tsx index 0fb2de175..a932b466e 100644 --- a/src/components/Feeds/usePaginate.tsx +++ b/src/components/Feeds/usePaginate.tsx @@ -12,7 +12,7 @@ export interface FilterState { export const usePaginate = () => { const [filterState, setFilterState] = useState({ - perPage: 16, + perPage: 18, page: 1, search: "", searchType: "name", diff --git a/src/components/Wrapper/Header.tsx b/src/components/Wrapper/Header.tsx index c2ea37b7f..cc7d72ce9 100644 --- a/src/components/Wrapper/Header.tsx +++ b/src/components/Wrapper/Header.tsx @@ -1,24 +1,13 @@ -import * as React from "react"; import { Masthead, - MastheadToggle, - MastheadMain, - MastheadBrand, MastheadContent, + MastheadToggle, PageToggleButton, - Brand, } from "@patternfly/react-core"; -import brandImg from "../../assets/logo_chris_dashboard.png"; -import BarsIcon from "@patternfly/react-icons/dist/esm/icons/bars-icon"; -import ToolbarComponent from "./Toolbar"; -import type { IUserState } from "../../store/user/userSlice"; import { useTypedSelector } from "../../store/hooks"; - -const brand = ( - - - -); +import type { IUserState } from "../../store/user/userSlice"; +import { BarsIcon } from "../Icons"; +import ToolbarComponent from "./Toolbar"; interface IHeaderProps { user: IUserState; @@ -27,18 +16,20 @@ interface IHeaderProps { export default function Header(props: IHeaderProps) { const showToolbar = useTypedSelector((state) => state.feed.showToolbar); + const isNavOpen = useTypedSelector((state) => state.ui.isNavOpen); // Get the sidebar open state + + // Apply margin-left to MastheadContent if sidebar is open + const mastheadContentStyle = { + marginLeft: isNavOpen ? "12rem" : "0", // Adjust based on sidebar state + }; const pageToolbar = ( ); return ( - - + + - - - {brand} - - - {pageToolbar} + + {pageToolbar} + ); } diff --git a/src/components/Wrapper/Sidebar.tsx b/src/components/Wrapper/Sidebar.tsx index aee7ace62..e19434a95 100644 --- a/src/components/Wrapper/Sidebar.tsx +++ b/src/components/Wrapper/Sidebar.tsx @@ -5,14 +5,15 @@ import { NavList, PageSidebar, PageSidebarBody, + Brand, } from "@patternfly/react-core"; import { useQueryClient } from "@tanstack/react-query"; import { isEmpty } from "lodash"; -import type * as React from "react"; import { Link } from "react-router-dom"; import { useTypedSelector } from "../../store/hooks"; import type { IUiState } from "../../store/ui/uiSlice"; import type { IUserState } from "../../store/user/userSlice"; +import brandImg from "../../assets/logo_chris_dashboard.png"; type AllProps = IUiState & IUserState; @@ -98,11 +99,20 @@ const Sidebar: React.FC = () => { return ( - {PageNav} + +
+
{PageNav}
+ +
+
); }; +export default Sidebar; + const AnonSidebarImpl: React.FC = ({ isNavOpen, sidebarActiveItem, @@ -141,11 +151,18 @@ const AnonSidebarImpl: React.FC = ({ return ( - {PageNav} + +
+
{PageNav}
+
+ +
+
+
); }; export { AnonSidebarImpl as AnonSidebar }; - -export default Sidebar; diff --git a/src/components/Wrapper/TitleComponent.tsx b/src/components/Wrapper/TitleComponent.tsx new file mode 100644 index 000000000..152624ba1 --- /dev/null +++ b/src/components/Wrapper/TitleComponent.tsx @@ -0,0 +1,68 @@ +import { useLocation } from "react-router"; + +import { Typography } from "antd"; +import { InfoIcon } from "../Common"; +const { Paragraph } = Typography; +import { matchPath } from "react-router"; +import { + useFeedListData, + useSearchQueryParams, +} from "../Feeds/useFeedListData"; +import { useFetchFeed } from "../Feeds/useFetchFeed"; +import { useTypedSelector } from "../../store/hooks"; +import { CodeBranchIcon } from "../Icons"; + +const FeedsNameComponent = () => { + const { feedCount, loadingFeedState } = useFeedListData(); + + return ( + + Analyses (aka ChRIS feeds) are computational experiments where data + are organized and processed by ChRIS plugins. In this view you may + view your analyses and also the ones shared with you. + + } + /> + ); +}; + +const { Title } = Typography; +const FeedsDetailComponent = ({ id }: { id?: string }) => { + const query = useSearchQueryParams(); + const type = query.get("type"); + const isLoggedIn = useTypedSelector((state) => state.user.isLoggedIn); + + const { feed } = useFetchFeed(id, type, isLoggedIn); + + return ( + + <CodeBranchIcon style={{ marginRight: "0.25em" }} /> + {feed?.data.name} + + ); +}; + +const TitleComponent = () => { + const location = useLocation(); + + const match = matchPath("/feeds/:id", location.pathname); + + if (match) { + const { id } = match.params; + return ; + } + + return location.pathname === "/feeds" ? : null; +}; + +export default TitleComponent; diff --git a/src/components/Wrapper/Toolbar.tsx b/src/components/Wrapper/Toolbar.tsx index a94fe2919..28feae7f2 100644 --- a/src/components/Wrapper/Toolbar.tsx +++ b/src/components/Wrapper/Toolbar.tsx @@ -3,11 +3,10 @@ import { Dropdown, DropdownItem, DropdownList, + Flex, + FlexItem, MenuToggle, Switch, - Toolbar, - ToolbarGroup, - ToolbarItem, } from "@patternfly/react-core"; import { useQueryClient } from "@tanstack/react-query"; import * as React from "react"; @@ -21,6 +20,7 @@ import { ThemeContext } from "../DarkTheme/useTheme"; import FeedDetails from "../FeedDetails"; import CartNotify from "./CartNotify"; import { clearCartOnLogout } from "../../store/cart/cartSlice"; +import TitleComponent from "./TitleComponent"; type ToolbarComponentProps = { showToolbar: boolean; @@ -45,9 +45,8 @@ const ToolbarComponent: React.FC = ( const handleChange = () => { toggleTheme(); }; - // Description: Logout user + const onLogout = () => { - // Some additional cleanup of active resources before logging out queryClient.clear(); ChrisAPIClient.setIsTokenAuthorized(false); removeCookie("username", { @@ -84,72 +83,81 @@ const ToolbarComponent: React.FC = ( Sign out , ]; + return ( - - - {/* The Feeds View Page shows additional contents in the navigation bar */} + + + + + {/* Center */} + {props.showToolbar && !fullScreen && } - - - - - - - - + - {token ? ( - - onDropdownToggle()} - isOpen={dropdownOpen} - toggle={(toggleRef) => { - return ( + {/* Right section */} + + + + + + + + + + {token ? ( + ( {username} - ); - }} - > - {userDropdownItems} - - - ) : ( - <> - - - - - - - - - )} - - + {userDropdownItems} + + ) : ( + <> + + + + )} + + + + ); }; diff --git a/src/components/Wrapper/wrapper.css b/src/components/Wrapper/wrapper.css index d5cc61ef1..8b1378917 100644 --- a/src/components/Wrapper/wrapper.css +++ b/src/components/Wrapper/wrapper.css @@ -1,56 +1 @@ -/* YourComponent.css */ -/* Styling for the Toolbar component */ -.toolbar { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; -} - -/* Styling for the first ToolbarGroup component */ -.feed-details { - margin-left: 40em; -} - -/* Media queries for responsive design */ -@media (max-width: 1880px) { - .feed-details { - margin-left: 15em; - } -} - -/* Media queries for responsive design */ -@media (max-width: 1200px) { - .feed-details { - margin-left: 10em; - } -} - -@media (max-width: 992px) { - .feed-details { - margin-left: 5em; - } -} - -/* Styling for the second ToolbarGroup component */ -.authentication { - margin-left: auto; -} - -/* Additional styling for responsive design if needed */ -@media (max-width: 912px) { - .toolbar { - flex-direction: column; - align-items: stretch; - } - - .feed-details { - margin-left: 0; - margin-bottom: 0.25rem; /* Add margin to separate rows */ - } - - .authentication { - margin-left: 0; - } -} diff --git a/src/store/configureStore.ts b/src/store/configureStore.ts index 6a9061728..c292b4b1c 100644 --- a/src/store/configureStore.ts +++ b/src/store/configureStore.ts @@ -39,7 +39,7 @@ function configureAppStore() { }, middleware: (getDefaultMiddleware) => getDefaultMiddleware({ - thunk: true, // Disabling thunk since we're using sagas + thunk: true, serializableCheck: false, // Disable serializable check if necessary }).concat(logger, sagaMiddleware), devTools: import.meta.env.NODE_ENV !== "production", From 7ba53c93ecd58080f4c3dc23a0017e680b66f8c7 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 28 Aug 2024 12:00:12 -0400 Subject: [PATCH 141/337] feat: Update File and Folder Uploads --- package-lock.json | 3357 +++++++---------- package.json | 3 +- .../NewLibrary/components/Operations.tsx | 43 +- .../NewLibrary/utils/useOperations.tsx | 1 + 4 files changed, 1370 insertions(+), 2034 deletions(-) diff --git a/package-lock.json b/package-lock.json index a080cbab4..b824f763f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,6 @@ "@patternfly/react-log-viewer": "^5.2.0", "@patternfly/react-table": "^5.3.4", "@react-hook/resize-observer": "^2.0.1", - "@redux-devtools/extension": "^3.3.0", "@reduxjs/toolkit": "^2.2.7", "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", @@ -75,6 +74,7 @@ "@biomejs/biome": "1.8.3", "@faker-js/faker": "^8.4.0", "@playwright/test": "^1.41.2", + "@redux-devtools/extension": "^3.3.0", "@types/d3-hierarchy": "^1.1.7", "@types/d3-selection": "^1.4.3", "@types/lodash": "^4.14.202", @@ -99,8 +99,6 @@ }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -112,8 +110,6 @@ }, "node_modules/@ant-design/colors": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.1.0.tgz", - "integrity": "sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==", "license": "MIT", "dependencies": { "@ctrl/tinycolor": "^3.6.1" @@ -121,8 +117,6 @@ }, "node_modules/@ant-design/cssinjs": { "version": "1.21.1", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.21.1.tgz", - "integrity": "sha512-tyWnlK+XH7Bumd0byfbCiZNK43HEubMoCcu9VxwsAwiHdHTgWa+tMN0/yvxa+e8EzuFP1WdUNNPclRpVtD33lg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -140,8 +134,6 @@ }, "node_modules/@ant-design/cssinjs-utils": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.0.3.tgz", - "integrity": "sha512-BrztZZKuoYcJK8uEH40ylBemf/Mu/QPiDos56g2bv6eUoniQkgQHOCOvA3+pncoFO1TaS8xcUCIqGzDA0I+ZVQ==", "license": "MIT", "dependencies": { "@ant-design/cssinjs": "^1.21.0", @@ -155,8 +147,6 @@ }, "node_modules/@ant-design/cssinjs-utils/node_modules/@babel/runtime": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -167,8 +157,6 @@ }, "node_modules/@ant-design/fast-color": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", - "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7" @@ -179,8 +167,6 @@ }, "node_modules/@ant-design/fast-color/node_modules/@babel/runtime": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -191,8 +177,6 @@ }, "node_modules/@ant-design/icons": { "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.4.0.tgz", - "integrity": "sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.0.0", @@ -211,14 +195,10 @@ }, "node_modules/@ant-design/icons-svg": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", - "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", "license": "MIT" }, "node_modules/@ant-design/icons/node_modules/@babel/runtime": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -229,8 +209,6 @@ }, "node_modules/@ant-design/react-slick": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", - "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.4", @@ -245,8 +223,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.7", @@ -258,8 +234,6 @@ }, "node_modules/@babel/compat-data": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -267,8 +241,6 @@ }, "node_modules/@babel/core": { "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -297,14 +269,10 @@ }, "node_modules/@babel/core/node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -312,8 +280,6 @@ }, "node_modules/@babel/generator": { "version": "7.25.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz", - "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==", "license": "MIT", "dependencies": { "@babel/types": "^7.25.4", @@ -327,8 +293,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.25.2", @@ -343,8 +307,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -352,8 +314,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", @@ -365,8 +325,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.24.7", @@ -383,8 +341,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -392,8 +348,6 @@ }, "node_modules/@babel/helper-simple-access": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", @@ -405,8 +359,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -414,8 +366,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -423,8 +373,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -432,8 +380,6 @@ }, "node_modules/@babel/helpers": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "license": "MIT", "dependencies": { "@babel/template": "^7.25.0", @@ -445,8 +391,6 @@ }, "node_modules/@babel/highlight": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", @@ -460,8 +404,6 @@ }, "node_modules/@babel/parser": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", - "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", "license": "MIT", "dependencies": { "@babel/types": "^7.25.4" @@ -475,8 +417,6 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -490,8 +430,6 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", - "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8" @@ -505,8 +443,6 @@ }, "node_modules/@babel/runtime": { "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", - "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -517,8 +453,6 @@ }, "node_modules/@babel/template": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", @@ -531,8 +465,6 @@ }, "node_modules/@babel/traverse": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", - "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", @@ -549,8 +481,6 @@ }, "node_modules/@babel/types": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", - "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.24.8", @@ -563,15 +493,11 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, "license": "MIT" }, "node_modules/@biomejs/biome": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.8.3.tgz", - "integrity": "sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==", "dev": true, "hasInstallScript": true, "license": "MIT OR Apache-2.0", @@ -596,16 +522,67 @@ "@biomejs/cli-win32-x64": "1.8.3" } }, - "node_modules/@biomejs/cli-linux-x64": { + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.3.tgz", + "integrity": "sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-darwin-x64": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.3.tgz", - "integrity": "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.3.tgz", + "integrity": "sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==", "cpu": [ "x64" ], "dev": true, "license": "MIT OR Apache-2.0", "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-linux-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.3.tgz", + "integrity": "sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.3.tgz", + "integrity": "sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, "os": [ "linux" ], @@ -613,7 +590,7 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/cli-linux-x64-musl": { + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-linux-x64-musl": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", @@ -630,10 +607,57 @@ "node": ">=14.21.3" } }, + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-win32-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", + "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/biome/node_modules/@biomejs/cli-win32-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", + "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.8.3", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, "node_modules/@cornerstonejs/codec-charls": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-charls/-/codec-charls-1.2.3.tgz", - "integrity": "sha512-qKUe6DN0dnGzhhfZLYhH9UZacMcudjxcaLXCrpxJImT/M/PQvZCT2rllu6VGJbWKJWG+dMVV2zmmleZcdJ7/cA==", "license": "MIT", "engines": { "node": ">=0.14" @@ -641,8 +665,6 @@ }, "node_modules/@cornerstonejs/codec-libjpeg-turbo-8bit": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-libjpeg-turbo-8bit/-/codec-libjpeg-turbo-8bit-1.2.2.tgz", - "integrity": "sha512-aAUMK2958YNpOb/7G6e2/aG7hExTiFTASlMt/v90XA0pRHdWiNg5ny4S5SAju0FbIw4zcMnR0qfY+yW3VG2ivg==", "license": "ISC", "engines": { "node": ">=0.14" @@ -650,8 +672,6 @@ }, "node_modules/@cornerstonejs/codec-openjpeg": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-openjpeg/-/codec-openjpeg-1.2.4.tgz", - "integrity": "sha512-UT2su6xZZnCPSuWf2ldzKa/2+guQ7BGgfBSKqxanggwJHh48gZqIAzekmsLyJHMMK5YDK+ti+fzvVJhBS3Xi/g==", "license": "MIT", "engines": { "node": ">=0.14" @@ -659,8 +679,6 @@ }, "node_modules/@cornerstonejs/codec-openjph": { "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz", - "integrity": "sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==", "license": "MIT", "engines": { "node": ">=0.14" @@ -668,8 +686,6 @@ }, "node_modules/@cornerstonejs/core": { "version": "1.84.1", - "resolved": "https://registry.npmjs.org/@cornerstonejs/core/-/core-1.84.1.tgz", - "integrity": "sha512-tvzgaqnRS7oGlF3MwLE6YjqpTejVAF02r7azSEJuHrkypd4gutNDAjsb8Z9AFgjxQ5daLdaZjRbJiL0QgMB83Q==", "license": "MIT", "dependencies": { "@kitware/vtk.js": "30.4.1", @@ -685,8 +701,6 @@ }, "node_modules/@cornerstonejs/dicom-image-loader": { "version": "1.84.1", - "resolved": "https://registry.npmjs.org/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.84.1.tgz", - "integrity": "sha512-82gU9Qqd4O+POuvNekgkMphoLipiu6HsHQxBaTQ5f7r+WGT9wQwOmtJ5p3xcs0DkeHIfqvzXvvCQxfQdX4KXBw==", "license": "MIT", "dependencies": { "@cornerstonejs/codec-charls": "^1.2.3", @@ -701,14 +715,10 @@ }, "node_modules/@cornerstonejs/dicom-image-loader/node_modules/pako": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", "license": "(MIT AND Zlib)" }, "node_modules/@cornerstonejs/streaming-image-volume-loader": { "version": "1.84.1", - "resolved": "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-1.84.1.tgz", - "integrity": "sha512-XVN6RUHFuVigsr24fecMv/e9roFtlXvMsOXW0+hNsKVcLjY0Qmh6tBUd+pxfLvFmm94Tg+9rhsnEbVQEzcgVSQ==", "license": "MIT", "dependencies": { "@cornerstonejs/core": "^1.84.1", @@ -721,8 +731,6 @@ }, "node_modules/@cornerstonejs/tools": { "version": "1.84.1", - "resolved": "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-1.84.1.tgz", - "integrity": "sha512-LPjdla6VznjnVKlisdr6zh0wuEBKpBRiOf6589jqAeszqWDUrJEdj1X4ZKgppg6RWjdJNG5L/lhZjhqS1M3FEA==", "license": "MIT", "dependencies": { "@cornerstonejs/core": "^1.84.1", @@ -748,8 +756,6 @@ }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", - "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", "license": "MIT", "engines": { "node": ">=10" @@ -757,20 +763,14 @@ }, "node_modules/@emotion/hash": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", "license": "MIT" }, "node_modules/@emotion/unitless": { "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", "license": "MIT" }, "node_modules/@esbuild/linux-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -786,8 +786,6 @@ }, "node_modules/@faker-js/faker": { "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", - "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", "dev": true, "funding": [ { @@ -803,8 +801,6 @@ }, "node_modules/@fnndsc/chrisapi": { "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@fnndsc/chrisapi/-/chrisapi-1.22.0.tgz", - "integrity": "sha512-npmjbFouPcQn56P6KAHUCFKS2VGf168VlqWzyzencbZQHNbTB6pMzw+LKTO3Xt9ShYy1iNrdelhr41HaP+AlCQ==", "license": "MIT", "dependencies": { "axios": "^1.6.8", @@ -813,8 +809,6 @@ }, "node_modules/@icr/polyseg-wasm": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@icr/polyseg-wasm/-/polyseg-wasm-0.4.0.tgz", - "integrity": "sha512-3sZmiwG8I0NaqPle0L7+V/ZexiR7IjIUFkUsaOoFI9rNuBGyyMMmxAxnCmqcDFtBDk9h+JEYJf6e3NnqlHi/HQ==", "license": "MIT", "engines": { "node": ">=0.14" @@ -822,8 +816,6 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "license": "ISC", "dependencies": { @@ -840,8 +832,6 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "license": "MIT", "engines": { @@ -853,8 +843,6 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -866,15 +854,11 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { @@ -891,8 +875,6 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -907,8 +889,6 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -925,8 +905,6 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", "dependencies": { @@ -942,8 +920,6 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { @@ -952,8 +928,6 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -966,8 +940,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -975,8 +947,6 @@ }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -984,14 +954,10 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1000,8 +966,6 @@ }, "node_modules/@kitware/vtk.js": { "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@kitware/vtk.js/-/vtk.js-30.4.1.tgz", - "integrity": "sha512-jBJFm8AyWpJjNFFBadXyvBwegdD9M6WRdxmIb+x/MVpCyA5lEZSMemhiMn71oKsznaEe5Pjv2VDVJWmwK0vhUg==", "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "7.22.11", @@ -1033,8 +997,6 @@ }, "node_modules/@lukeed/csprng": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", "license": "MIT", "engines": { "node": ">=8" @@ -1042,8 +1004,6 @@ }, "node_modules/@lukeed/uuid": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==", "license": "MIT", "dependencies": { "@lukeed/csprng": "^1.1.0" @@ -1054,9 +1014,6 @@ }, "node_modules/@mattiasbuelens/web-streams-polyfill": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@mattiasbuelens/web-streams-polyfill/-/web-streams-polyfill-0.2.1.tgz", - "integrity": "sha512-oKuFCQFa3W7Hj7zKn0+4ypI8JFm4ZKIoncwAC6wd5WwFW2sL7O1hpPoJdSWpynQ4DJ4lQ6MvFoVDmCLilonDFg==", - "deprecated": "moved to web-streams-polyfill@2.0.0", "license": "MIT", "dependencies": { "@types/whatwg-streams": "^0.0.7" @@ -1067,8 +1024,6 @@ }, "node_modules/@niivue/niivue": { "version": "0.41.1", - "resolved": "https://registry.npmjs.org/@niivue/niivue/-/niivue-0.41.1.tgz", - "integrity": "sha512-A1Nfqx/8RYTzCoA7x8AUfC8dPTw7jou6NXAJzXILY6tw22NzF/Qx/XXeJ3mMEg1J7xvGXa83REyvyNEkEvF3bQ==", "license": "BSD-2-Clause", "dependencies": { "@lukeed/uuid": "^2.0.1", @@ -1086,14 +1041,10 @@ }, "node_modules/@niivue/niivue/node_modules/fflate": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", "license": "MIT" }, "node_modules/@oozcitak/dom": { "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", - "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", "license": "MIT", "dependencies": { "@oozcitak/infra": "1.0.8", @@ -1106,8 +1057,6 @@ }, "node_modules/@oozcitak/infra": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", - "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", "license": "MIT", "dependencies": { "@oozcitak/util": "8.3.8" @@ -1118,8 +1067,6 @@ }, "node_modules/@oozcitak/url": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", - "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", "license": "MIT", "dependencies": { "@oozcitak/infra": "1.0.8", @@ -1131,8 +1078,6 @@ }, "node_modules/@oozcitak/util": { "version": "8.3.8", - "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", - "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", "license": "MIT", "engines": { "node": ">=8.0" @@ -1140,8 +1085,6 @@ }, "node_modules/@patternfly/react-catalog-view-extension": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-catalog-view-extension/-/react-catalog-view-extension-5.0.0.tgz", - "integrity": "sha512-Sg0iLAVhE7wAwBJERNdYp6peMO4THG7ez3xvMXEWh2biXghIv9XVj5BEy0TssihMxZa/pRMdROzcv3QZ9m24Yg==", "license": "MIT", "dependencies": { "@patternfly/react-core": "^5.0.0", @@ -1153,33 +1096,31 @@ } }, "node_modules/@patternfly/react-charts": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-7.3.0.tgz", - "integrity": "sha512-J6d/bFolI3zUOvJoK4lEveNeXZeJNfBq+iXgQ/mImESyW0H7MSebMcVB4d+NC6JX0QykuaOEn/7YMJMU9K73tw==", + "version": "7.4.0", "license": "MIT", "dependencies": { - "@patternfly/react-styles": "^5.3.0", - "@patternfly/react-tokens": "^5.3.0", - "hoist-non-react-statics": "^3.3.0", + "@patternfly/react-styles": "^5.4.0", + "@patternfly/react-tokens": "^5.4.0", + "hoist-non-react-statics": "^3.3.2", "lodash": "^4.17.21", - "tslib": "^2.5.0", - "victory-area": "^36.9.1", - "victory-axis": "^36.9.1", - "victory-bar": "^36.9.1", - "victory-box-plot": "^36.9.1", - "victory-chart": "^36.9.1", - "victory-core": "^36.9.1", - "victory-create-container": "^36.9.1", - "victory-cursor-container": "^36.9.1", - "victory-group": "^36.9.1", - "victory-legend": "^36.9.1", - "victory-line": "^36.9.1", - "victory-pie": "^36.9.1", - "victory-scatter": "^36.9.1", - "victory-stack": "^36.9.1", - "victory-tooltip": "^36.9.1", - "victory-voronoi-container": "^36.9.1", - "victory-zoom-container": "^36.9.1" + "tslib": "^2.6.3", + "victory-area": "^37.0.2", + "victory-axis": "^37.0.2", + "victory-bar": "^37.0.2", + "victory-box-plot": "^37.0.2", + "victory-chart": "^37.0.2", + "victory-core": "^37.0.2", + "victory-create-container": "^37.0.2", + "victory-cursor-container": "^37.0.2", + "victory-group": "^37.0.2", + "victory-legend": "^37.0.2", + "victory-line": "^37.0.2", + "victory-pie": "^37.0.2", + "victory-scatter": "^37.0.2", + "victory-stack": "^37.0.2", + "victory-tooltip": "^37.0.2", + "victory-voronoi-container": "^37.0.2", + "victory-zoom-container": "^37.0.2" }, "peerDependencies": { "react": "^17 || ^18", @@ -1187,17 +1128,15 @@ } }, "node_modules/@patternfly/react-core": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.3.4.tgz", - "integrity": "sha512-zr2yeilIoFp8MFOo0vNgI8XuM+P2466zHvy4smyRNRH2/but2WObqx7Wu4ftd/eBMYdNqmTeuXe6JeqqRqnPMQ==", + "version": "5.4.0", "license": "MIT", "dependencies": { - "@patternfly/react-icons": "^5.3.2", - "@patternfly/react-styles": "^5.3.1", - "@patternfly/react-tokens": "^5.3.1", - "focus-trap": "7.5.2", + "@patternfly/react-icons": "^5.4.0", + "@patternfly/react-styles": "^5.4.0", + "@patternfly/react-tokens": "^5.4.0", + "focus-trap": "7.5.4", "react-dropzone": "^14.2.3", - "tslib": "^2.5.0" + "tslib": "^2.6.3" }, "peerDependencies": { "react": "^17 || ^18", @@ -1205,9 +1144,7 @@ } }, "node_modules/@patternfly/react-icons": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.3.2.tgz", - "integrity": "sha512-GEygYbl0H4zD8nZuTQy2dayKIrV2bMMeWKSOEZ16Y3EYNgYVUOUnN+J0naAEuEGH39Xb1DE9n+XUbE1PC4CxPA==", + "version": "5.4.0", "license": "MIT", "peerDependencies": { "react": "^17 || ^18", @@ -1215,9 +1152,7 @@ } }, "node_modules/@patternfly/react-log-viewer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-log-viewer/-/react-log-viewer-5.2.0.tgz", - "integrity": "sha512-+9v4d49ImSMWACJVBbvl5OjIAbEl4QWDuJJQpi2r+tP3ZzAHDZOohOGBeMmT780i0sOeny83qnbNpNbMBVeLCA==", + "version": "5.3.0", "license": "MIT", "dependencies": { "@patternfly/react-core": "^5.0.0", @@ -1231,23 +1166,19 @@ } }, "node_modules/@patternfly/react-styles": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.3.1.tgz", - "integrity": "sha512-H6uBoFH3bJjD6PP75qZ4k+2TtF59vxf9sIVerPpwrGJcRgBZbvbMZCniSC3+S2LQ8DgXLnDvieq78jJzHz0hiA==", + "version": "5.4.0", "license": "MIT" }, "node_modules/@patternfly/react-table": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.3.4.tgz", - "integrity": "sha512-jGaiuo02scaC1HdGNHuYVRjtQCOB+vtvfbgS7nl1Y8ZcJ08wyUGhGSrEpNHfGAQ1XDSSoELAxj0cjOQwAAQw1A==", + "version": "5.4.0", "license": "MIT", "dependencies": { - "@patternfly/react-core": "^5.3.4", - "@patternfly/react-icons": "^5.3.2", - "@patternfly/react-styles": "^5.3.1", - "@patternfly/react-tokens": "^5.3.1", - "lodash": "^4.17.19", - "tslib": "^2.5.0" + "@patternfly/react-core": "^5.4.0", + "@patternfly/react-icons": "^5.4.0", + "@patternfly/react-styles": "^5.4.0", + "@patternfly/react-tokens": "^5.4.0", + "lodash": "^4.17.21", + "tslib": "^2.6.3" }, "peerDependencies": { "react": "^17 || ^18", @@ -1255,15 +1186,11 @@ } }, "node_modules/@patternfly/react-tokens": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.3.1.tgz", - "integrity": "sha512-VYK0uVP2/2RJ7ZshJCCLeq0Boih5I1bv+9Z/Bg6h12dCkLs85XsxAX9Ve+BGIo5DF54/mzcRHE1RKYap4ISXuw==", + "version": "5.4.0", "license": "MIT" }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", "optional": true, @@ -1273,8 +1200,6 @@ }, "node_modules/@playwright/test": { "version": "1.46.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.1.tgz", - "integrity": "sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1289,14 +1214,10 @@ }, "node_modules/@polka/url": { "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", "license": "MIT" }, "node_modules/@popperjs/core": { "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", "funding": { "type": "opencollective", @@ -1305,8 +1226,6 @@ }, "node_modules/@rc-component/async-validator": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", - "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.4" @@ -1317,8 +1236,6 @@ }, "node_modules/@rc-component/async-validator/node_modules/@babel/runtime": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1329,8 +1246,6 @@ }, "node_modules/@rc-component/color-picker": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", - "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", "license": "MIT", "dependencies": { "@ant-design/fast-color": "^2.0.6", @@ -1345,8 +1260,6 @@ }, "node_modules/@rc-component/color-picker/node_modules/@babel/runtime": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1357,8 +1270,6 @@ }, "node_modules/@rc-component/context": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", - "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -1371,8 +1282,6 @@ }, "node_modules/@rc-component/mini-decimal": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", - "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0" @@ -1383,8 +1292,6 @@ }, "node_modules/@rc-component/mutate-observer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", - "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -1401,8 +1308,6 @@ }, "node_modules/@rc-component/portal": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", - "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -1419,8 +1324,6 @@ }, "node_modules/@rc-component/qrcode": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", - "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", @@ -1437,8 +1340,6 @@ }, "node_modules/@rc-component/qrcode/node_modules/@babel/runtime": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1449,8 +1350,6 @@ }, "node_modules/@rc-component/tour": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.0.tgz", - "integrity": "sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -1469,8 +1368,6 @@ }, "node_modules/@rc-component/trigger": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.1.tgz", - "integrity": "sha512-fuU11J8pOt6+U/tU6/CAv8wjCwGaNeRk9f5k8HQth7JBbJ6MMH62WhGycVW75VnXfBZgL/7kO+wbiO2Xc9U9sQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2", @@ -1490,8 +1387,6 @@ }, "node_modules/@rc-component/trigger/node_modules/@babel/runtime": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1502,8 +1397,6 @@ }, "node_modules/@react-hook/latest": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", - "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", "license": "MIT", "peerDependencies": { "react": ">=16.8" @@ -1511,8 +1404,6 @@ }, "node_modules/@react-hook/passive-layout-effect": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", - "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", "license": "MIT", "peerDependencies": { "react": ">=16.8" @@ -1520,8 +1411,6 @@ }, "node_modules/@react-hook/resize-observer": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@react-hook/resize-observer/-/resize-observer-2.0.2.tgz", - "integrity": "sha512-tzKKzxNpfE5TWmxuv+5Ae3IF58n0FQgQaWJmcbYkjXTRZATXxClnTprQ2uuYygYTpu1pqbBskpwMpj6jpT1djA==", "license": "MIT", "dependencies": { "@react-hook/latest": "^1.0.2", @@ -1533,8 +1422,7 @@ }, "node_modules/@redux-devtools/extension": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@redux-devtools/extension/-/extension-3.3.0.tgz", - "integrity": "sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2", @@ -1546,8 +1434,7 @@ }, "node_modules/@redux-devtools/extension/node_modules/@babel/runtime": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", + "dev": true, "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1558,8 +1445,6 @@ }, "node_modules/@redux-saga/core": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.3.0.tgz", - "integrity": "sha512-L+i+qIGuyWn7CIg7k1MteHGfttKPmxwZR5E7OsGikCL2LzYA0RERlaUY00Y3P3ZV2EYgrsYlBrGs6cJP5OKKqA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.3", @@ -1577,14 +1462,10 @@ }, "node_modules/@redux-saga/deferred": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.2.1.tgz", - "integrity": "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==", "license": "MIT" }, "node_modules/@redux-saga/delay-p": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.2.1.tgz", - "integrity": "sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==", "license": "MIT", "dependencies": { "@redux-saga/symbols": "^1.1.3" @@ -1592,8 +1473,6 @@ }, "node_modules/@redux-saga/is": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.3.tgz", - "integrity": "sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==", "license": "MIT", "dependencies": { "@redux-saga/symbols": "^1.1.3", @@ -1602,20 +1481,14 @@ }, "node_modules/@redux-saga/symbols": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.3.tgz", - "integrity": "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==", "license": "MIT" }, "node_modules/@redux-saga/types": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz", - "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==", "license": "MIT" }, "node_modules/@reduxjs/toolkit": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.7.tgz", - "integrity": "sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==", "license": "MIT", "dependencies": { "immer": "^10.0.3", @@ -1638,8 +1511,6 @@ }, "node_modules/@remix-run/router": { "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz", - "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -1647,8 +1518,6 @@ }, "node_modules/@restart/hooks": { "version": "0.4.16", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", - "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", "license": "MIT", "dependencies": { "dequal": "^2.0.3" @@ -1658,9 +1527,7 @@ } }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz", - "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==", + "version": "4.21.1", "cpu": [ "x64" ], @@ -1670,24 +1537,8 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", - "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@swc/core": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.14.tgz", - "integrity": "sha512-9aeXeifnyuvc2pcuuhPQgVUwdpGEzZ+9nJu0W8/hNl/aESFsJGR5i9uQJRGu0atoNr01gK092fvmqMmQAPcKow==", + "version": "1.7.21", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -1703,16 +1554,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.14", - "@swc/core-darwin-x64": "1.7.14", - "@swc/core-linux-arm-gnueabihf": "1.7.14", - "@swc/core-linux-arm64-gnu": "1.7.14", - "@swc/core-linux-arm64-musl": "1.7.14", - "@swc/core-linux-x64-gnu": "1.7.14", - "@swc/core-linux-x64-musl": "1.7.14", - "@swc/core-win32-arm64-msvc": "1.7.14", - "@swc/core-win32-ia32-msvc": "1.7.14", - "@swc/core-win32-x64-msvc": "1.7.14" + "@swc/core-darwin-arm64": "1.7.21", + "@swc/core-darwin-x64": "1.7.21", + "@swc/core-linux-arm-gnueabihf": "1.7.21", + "@swc/core-linux-arm64-gnu": "1.7.21", + "@swc/core-linux-arm64-musl": "1.7.21", + "@swc/core-linux-x64-gnu": "1.7.21", + "@swc/core-linux-x64-musl": "1.7.21", + "@swc/core-win32-arm64-msvc": "1.7.21", + "@swc/core-win32-ia32-msvc": "1.7.21", + "@swc/core-win32-x64-msvc": "1.7.21" }, "peerDependencies": { "@swc/helpers": "*" @@ -1724,9 +1575,7 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.14.tgz", - "integrity": "sha512-Siy5OvPCLLWmMdx4msnEs8HvEVUEigSn0+3pbLjv78iwzXd0qSBNHUPZyC1xeurVaUbpNDxZTpPRIwpqNE2+Og==", + "version": "1.7.21", "cpu": [ "x64" ], @@ -1740,10 +1589,95 @@ "node": ">=10" } }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.14.tgz", - "integrity": "sha512-FtEGm9mwtRYQNK43WMtUIadxHs/ja2rnDurB99os0ZoFTGG2IHuht2zD97W0wB8JbqEabT1XwSG9Y5wmN+ciEQ==", + "node_modules/@swc/core/node_modules/@swc/core-darwin-arm64": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.21.tgz", + "integrity": "sha512-hh5uOZ7jWF66z2TRMhhXtWMQkssuPCSIZPy9VHf5KvZ46cX+5UeECDthchYklEVZQyy4Qr6oxfh4qff/5spoMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core/node_modules/@swc/core-darwin-x64": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.21.tgz", + "integrity": "sha512-lTsPquqSierQ6jWiWM7NnYXXZGk9zx3NGkPLHjPbcH5BmyiauX0CC/YJYJx7YmS2InRLyALlGmidHkaF4JY28A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core/node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.21.tgz", + "integrity": "sha512-AgSd0fnSzAqCvWpzzZCq75z62JVGUkkXEOpfdi99jj/tryPy38KdXJtkVWJmufPXlRHokGTBitalk33WDJwsbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core/node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.21.tgz", + "integrity": "sha512-l+jw6RQ4Y43/8dIst0c73uQE+W3kCWrCFqMqC/xIuE/iqHOnvYK6YbA1ffOct2dImkHzNiKuoehGqtQAc6cNaQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core/node_modules/@swc/core-linux-arm64-musl": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.21.tgz", + "integrity": "sha512-29KKZXrTo/c9F1JFL9WsNvCa6UCdIVhHP5EfuYhlKbn5/YmSsNFkuHdUtZFEd5U4+jiShXDmgGCtLW2d08LIwg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core/node_modules/@swc/core-linux-x64-musl": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.21.tgz", + "integrity": "sha512-hYKLVeUTHqvFK628DFJEwxoX6p42T3HaQ4QjNtf3oKhiJWFh9iTRUrN/oCB5YI3R9WMkFkKh+99gZ/Dd0T5lsg==", "cpu": [ "x64" ], @@ -1757,17 +1691,64 @@ "node": ">=10" } }, + "node_modules/@swc/core/node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.21.tgz", + "integrity": "sha512-qyWAKW10aMBe6iUqeZ7NAJIswjfggVTUpDINpQGUJhz+pR71YZDidXgZXpaDB84YyDB2JAlRqd1YrLkl7CMiIw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core/node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.21.tgz", + "integrity": "sha512-cy61wS3wgH5mEwBiQ5w6/FnQrchBDAdPsSh0dKSzNmI+4K8hDxS8uzdBycWqJXO0cc+mA77SIlwZC3hP3Kum2g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core/node_modules/@swc/core-win32-x64-msvc": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.21.tgz", + "integrity": "sha512-/rexGItJURNJOdae+a48M+loT74nsEU+PyRRVAkZMKNRtLoYFAr0cpDlS5FodIgGunp/nqM0bst4H2w6Y05IKA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@swc/counter": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/@swc/types": { "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", - "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1775,9 +1756,7 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.52.0.tgz", - "integrity": "sha512-U1DOEgltjUwalN6uWYTewSnA14b+tE7lSylOiASKCAO61ENJeCq9VVD/TXHA6O5u9+6v5+UgGYBSccTKDoyMqw==", + "version": "5.52.2", "license": "MIT", "funding": { "type": "github", @@ -1785,12 +1764,10 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.52.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.52.1.tgz", - "integrity": "sha512-soyn4dNIUZ8US8NaPVXv06gkZFHaZnPfKWPDjRJjFRW3Y7WZ0jx72eT6zhw3VQlkMPysmXye8l35ewPHspKgbQ==", + "version": "5.52.2", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.52.0" + "@tanstack/query-core": "5.52.2" }, "funding": { "type": "github", @@ -1802,14 +1779,10 @@ }, "node_modules/@tweenjs/tween.js": { "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", @@ -1821,8 +1794,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" @@ -1830,8 +1801,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", @@ -1840,8 +1809,6 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" @@ -1849,54 +1816,38 @@ }, "node_modules/@types/cookie": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", "license": "MIT" }, "node_modules/@types/d3-array": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", "license": "MIT" }, "node_modules/@types/d3-color": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", "license": "MIT" }, "node_modules/@types/d3-hierarchy": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.11.tgz", - "integrity": "sha512-lnQiU7jV+Gyk9oQYk0GGYccuexmQPTp08E0+4BidgFdiJivjEvf+esPSdZqCZ2C7UwTWejWpqetVaU8A+eX3FA==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "license": "MIT", "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-2.0.4.tgz", - "integrity": "sha512-jjZVLBjEX4q6xneKMmv62UocaFJFOTQSb/1aTzs3m3ICTOFoVaqGBHpNLm/4dVi0/FTltfBKgmOK1ECj3/gGjA==", + "version": "3.1.0", "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", "license": "MIT", "dependencies": { "@types/d3-time": "*" @@ -1904,14 +1855,10 @@ }, "node_modules/@types/d3-selection": { "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.6.tgz", - "integrity": "sha512-0MhJ/LzJe6/vQVxiYJnvNq5CD/MF6Qy0dLp4BEQ6Dz8oOaB0EMXfx1GGeBFSW+3VzgjaUrxK6uECDQj9VLa/Mg==", "license": "MIT" }, "node_modules/@types/d3-shape": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", "license": "MIT", "dependencies": { "@types/d3-path": "*" @@ -1919,20 +1866,14 @@ }, "node_modules/@types/d3-time": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "license": "MIT" }, "node_modules/@types/d3-zoom": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", @@ -1941,8 +1882,6 @@ }, "node_modules/@types/debug": { "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "license": "MIT", "dependencies": { "@types/ms": "*" @@ -1950,15 +1889,11 @@ }, "node_modules/@types/estree": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true, "license": "MIT" }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "license": "MIT", "dependencies": { "@types/react": "*", @@ -1967,27 +1902,19 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, "node_modules/@types/lodash": { "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", - "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", "dev": true, "license": "MIT" }, "node_modules/@types/ms": { "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", "license": "MIT" }, "node_modules/@types/node": { - "version": "20.16.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", - "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", + "version": "20.16.2", "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -1995,26 +1922,18 @@ }, "node_modules/@types/offscreencanvas": { "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", "license": "MIT" }, "node_modules/@types/parse-json": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, "node_modules/@types/prop-types": { "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.4", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz", - "integrity": "sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -2023,8 +1942,6 @@ }, "node_modules/@types/react-dom": { "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, "license": "MIT", "dependencies": { @@ -2033,8 +1950,6 @@ }, "node_modules/@types/redux-logger": { "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@types/redux-logger/-/redux-logger-3.0.13.tgz", - "integrity": "sha512-jylqZXQfMxahkuPcO8J12AKSSCQngdEWQrw7UiLUJzMBcv1r4Qg77P6mjGLjM27e5gFQDPD8vwUMJ9AyVxFSsg==", "dev": true, "license": "MIT", "dependencies": { @@ -2043,45 +1958,31 @@ }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", "license": "MIT" }, "node_modules/@types/uuid": { "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "dev": true, "license": "MIT" }, "node_modules/@types/warning": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", - "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", "license": "MIT" }, "node_modules/@types/webxr": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", - "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==", + "version": "0.5.20", "license": "MIT" }, "node_modules/@types/whatwg-streams": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@types/whatwg-streams/-/whatwg-streams-0.0.7.tgz", - "integrity": "sha512-6sDiSEP6DWcY2ZolsJ2s39ZmsoGQ7KVwBDI3sESQsEm9P2dHTcqnDIHRZFRNtLCzWp7hCFGqYbw5GyfpQnJ01A==", "license": "MIT" }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "license": "ISC" }, "node_modules/@vitejs/plugin-react-swc": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz", - "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==", "dev": true, "license": "MIT", "dependencies": { @@ -2093,8 +1994,6 @@ }, "node_modules/@vitest/coverage-v8": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.0.5.tgz", - "integrity": "sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==", "dev": true, "license": "MIT", "dependencies": { @@ -2118,151 +2017,51 @@ "vitest": "2.0.5" } }, - "node_modules/@vitest/coverage-v8/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@vitest/expect": { + "version": "2.0.5", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/coverage-v8/node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "node_modules/@vitest/pretty-format": { + "version": "2.0.5", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" + "tinyrainbow": "^1.2.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/coverage-v8/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/@vitest/runner": { + "version": "2.0.5", "dev": true, - "license": "ISC", + "license": "MIT", "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" + "@vitest/utils": "2.0.5", + "pathe": "^1.1.2" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/coverage-v8/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@vitest/snapshot": { + "version": "2.0.5", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", - "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "2.0.5", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", - "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "magic-string": "^0.30.10", - "pathe": "^1.1.2" + "@vitest/pretty-format": "2.0.5", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" }, "funding": { "url": "https://opencollective.com/vitest" @@ -2270,8 +2069,6 @@ }, "node_modules/@vitest/spy": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", "dev": true, "license": "MIT", "dependencies": { @@ -2283,8 +2080,6 @@ }, "node_modules/@vitest/utils": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2299,8 +2094,6 @@ }, "node_modules/@wearemothership/dicom-character-set": { "version": "1.0.4-opt.1", - "resolved": "https://registry.npmjs.org/@wearemothership/dicom-character-set/-/dicom-character-set-1.0.4-opt.1.tgz", - "integrity": "sha512-stqhnpawYHY2UZKj4RHTF71ab3q3z8S1SO9ToQKjsHQwowUdFVo6YFea93psFux3yqNbRlQjwoCdPjHcD0YQzw==", "license": "MIT", "engines": { "node": ">=10" @@ -2308,8 +2101,6 @@ }, "node_modules/abstract-leveldown": { "version": "0.12.4", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==", "dev": true, "license": "MIT", "dependencies": { @@ -2318,8 +2109,6 @@ }, "node_modules/abstract-leveldown/node_modules/xtend": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", "dev": true, "engines": { "node": ">=0.4" @@ -2327,8 +2116,6 @@ }, "node_modules/accessor-fn": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.1.tgz", - "integrity": "sha512-zZpFYBqIL1Aqg+f2qmYHJ8+yIZF7/tP6PUGx2/QM0uGPSO5UegpinmkNwDohxWtOj586BpMPVRUjce2HI6xB3A==", "license": "MIT", "engines": { "node": ">=12" @@ -2336,8 +2123,6 @@ }, "node_modules/ackee-tracker": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ackee-tracker/-/ackee-tracker-5.1.0.tgz", - "integrity": "sha512-A7iKkGyUnEXuOzxultQB7hnm4bStYCo1c38MYRRihBfqUP8AImhtZOODb00t9xrXs/BTsg06bz1MKpXeMs9sYw==", "license": "MIT", "dependencies": { "platform": "^1.3.6" @@ -2345,8 +2130,6 @@ }, "node_modules/acorn": { "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "license": "MIT", "bin": { @@ -2358,8 +2141,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2368,8 +2149,6 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "license": "MIT", "dependencies": { @@ -2382,8 +2161,6 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -2398,8 +2175,6 @@ }, "node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -2407,8 +2182,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -2417,8 +2190,6 @@ }, "node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "dependencies": { "color-convert": "^1.9.0" @@ -2429,8 +2200,6 @@ }, "node_modules/antd": { "version": "5.20.3", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.20.3.tgz", - "integrity": "sha512-v2s5LJlhuccIKLT17ESXQDkiQJdPK4jXg4x2pmSSRlrKXAxfftn8Zhd/7pdF3qR3OkwheQpSRjynrNZKp9Tgkg==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.1.0", @@ -2494,8 +2263,6 @@ }, "node_modules/antd/node_modules/@babel/runtime": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2506,8 +2273,6 @@ }, "node_modules/append-transform": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, "license": "MIT", "dependencies": { @@ -2519,15 +2284,11 @@ }, "node_modules/archy": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true, "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" @@ -2535,8 +2296,6 @@ }, "node_modules/array-equal": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", - "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2544,20 +2303,14 @@ }, "node_modules/array-tree-filter": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", "license": "MIT" }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "license": "MIT" }, "node_modules/asn1.js": { "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "license": "MIT", "dependencies": { @@ -2568,15 +2321,11 @@ }, "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, "license": "MIT" }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -2585,14 +2334,10 @@ }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, "node_modules/attr-accept": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", - "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", "license": "MIT", "engines": { "node": ">=4" @@ -2600,8 +2345,6 @@ }, "node_modules/axios": { "version": "1.7.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz", - "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -2611,8 +2354,6 @@ }, "node_modules/babel-plugin-macros": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -2626,8 +2367,6 @@ }, "node_modules/babel-plugin-preval": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-preval/-/babel-plugin-preval-5.1.0.tgz", - "integrity": "sha512-G5R+xmo5LS41A4UyZjOjV0mp9AvkuCyUOAJ6TOv/jTZS+VKh7L7HUDRcCSOb0YCM/u0fFarh7Diz0wjY8rFNFg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -2642,20 +2381,14 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/base16": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==", "license": "MIT" }, "node_modules/bezier-js": { "version": "6.1.4", - "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz", - "integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==", "license": "MIT", "funding": { "type": "individual", @@ -2664,8 +2397,6 @@ }, "node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "license": "MIT", "engines": { "node": "*" @@ -2673,8 +2404,6 @@ }, "node_modules/bl": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==", "dev": true, "license": "MIT", "dependencies": { @@ -2683,15 +2412,11 @@ }, "node_modules/bl/node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, "license": "MIT" }, "node_modules/bl/node_modules/readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "license": "MIT", "dependencies": { @@ -2703,22 +2428,16 @@ }, "node_modules/bl/node_modules/string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, "license": "MIT" }, "node_modules/bn.js": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true, "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -2727,15 +2446,11 @@ }, "node_modules/brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true, "license": "MIT" }, "node_modules/browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "license": "MIT", "dependencies": { @@ -2749,8 +2464,6 @@ }, "node_modules/browserify-cipher": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "license": "MIT", "dependencies": { @@ -2761,8 +2474,6 @@ }, "node_modules/browserify-des": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "license": "MIT", "dependencies": { @@ -2774,8 +2485,6 @@ }, "node_modules/browserify-fs": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", - "integrity": "sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==", "dev": true, "dependencies": { "level-filesystem": "^1.0.1", @@ -2785,8 +2494,6 @@ }, "node_modules/browserify-rsa": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "license": "MIT", "dependencies": { @@ -2796,8 +2503,6 @@ }, "node_modules/browserify-sign": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", - "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", "dev": true, "license": "ISC", "dependencies": { @@ -2818,8 +2523,6 @@ }, "node_modules/browserslist": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -2850,29 +2553,21 @@ }, "node_modules/buffer-es6": { "version": "4.9.3", - "resolved": "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz", - "integrity": "sha512-Ibt+oXxhmeYJSsCkODPqNpPmyegefiD8rfutH1NYGhMZQhSp95Rz7haemgnJ6dxa6LT+JLLbtgOMORRluwKktw==", "dev": true, "license": "MIT" }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, "node_modules/buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", "dev": true, "license": "MIT" }, "node_modules/cac": { "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", "engines": { @@ -2881,8 +2576,6 @@ }, "node_modules/caching-transform": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "license": "MIT", "dependencies": { @@ -2897,8 +2590,6 @@ }, "node_modules/caching-transform/node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { @@ -2913,8 +2604,6 @@ }, "node_modules/caching-transform/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -2923,8 +2612,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" @@ -2932,8 +2619,6 @@ }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -2941,9 +2626,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "version": "1.0.30001653", "funding": [ { "type": "opencollective", @@ -2962,8 +2645,6 @@ }, "node_modules/canvas-color-tracker": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.2.2.tgz", - "integrity": "sha512-r+u/Ft2ka4Rj274Ts4L9bhYZLuMvbuJ/yL4seP0s+Pi+i9CM0caD+Sd//yseS5EVBJ2SKSmq36h2mNYUCdmTfA==", "license": "MIT", "dependencies": { "tinycolor2": "^1.6.0" @@ -2974,8 +2655,6 @@ }, "node_modules/chai": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, "license": "MIT", "dependencies": { @@ -2991,8 +2670,6 @@ }, "node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", @@ -3005,8 +2682,6 @@ }, "node_modules/chalk/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "license": "MIT", "engines": { "node": ">=4" @@ -3014,8 +2689,6 @@ }, "node_modules/chalk/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -3026,8 +2699,6 @@ }, "node_modules/character-entities": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "license": "MIT", "funding": { "type": "github", @@ -3036,8 +2707,6 @@ }, "node_modules/check-error": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, "license": "MIT", "engines": { @@ -3046,8 +2715,6 @@ }, "node_modules/cipher-base": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3057,14 +2724,10 @@ }, "node_modules/classnames": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "license": "MIT", "engines": { @@ -3073,8 +2736,6 @@ }, "node_modules/cliui": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3085,8 +2746,6 @@ }, "node_modules/clone": { "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==", "dev": true, "license": "MIT", "engines": { @@ -3095,8 +2754,6 @@ }, "node_modules/clsx": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", "license": "MIT", "engines": { "node": ">=6" @@ -3104,8 +2761,6 @@ }, "node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", "dependencies": { "color-name": "1.1.3" @@ -3113,14 +2768,10 @@ }, "node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -3131,14 +2782,10 @@ }, "node_modules/comlink": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.1.tgz", - "integrity": "sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==", "license": "Apache-2.0" }, "node_modules/commander": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", - "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", "license": "MIT", "engines": { "node": "^12.20.0 || >=14" @@ -3146,27 +2793,19 @@ }, "node_modules/commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true, "license": "MIT" }, "node_modules/compute-scroll-into-view": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", - "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==", "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/concat-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "engines": [ "node >= 0.8" @@ -3181,8 +2820,6 @@ }, "node_modules/console-clear": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", - "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", "license": "MIT", "engines": { "node": ">=4" @@ -3190,15 +2827,11 @@ }, "node_modules/convert-source-map": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3206,8 +2839,6 @@ }, "node_modules/copy-to-clipboard": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", "license": "MIT", "dependencies": { "toggle-selection": "^1.0.6" @@ -3215,8 +2846,6 @@ }, "node_modules/core-js": { "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", - "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -3226,15 +2855,11 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", @@ -3249,8 +2874,6 @@ }, "node_modules/create-ecdh": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "license": "MIT", "dependencies": { @@ -3260,15 +2883,11 @@ }, "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, "license": "MIT" }, "node_modules/create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "license": "MIT", "dependencies": { @@ -3281,8 +2900,6 @@ }, "node_modules/create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "license": "MIT", "dependencies": { @@ -3296,8 +2913,6 @@ }, "node_modules/cross-fetch": { "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "license": "MIT", "dependencies": { "node-fetch": "^2.6.12" @@ -3305,8 +2920,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "license": "MIT", "dependencies": { @@ -3320,8 +2933,6 @@ }, "node_modules/crypto-browserify": { "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "license": "MIT", "dependencies": { @@ -3343,20 +2954,14 @@ }, "node_modules/cssfilter": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", "license": "MIT" }, "node_modules/csstype": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, "node_modules/d3-array": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "license": "ISC", "dependencies": { "internmap": "1 - 2" @@ -3367,14 +2972,10 @@ }, "node_modules/d3-binarytree": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", - "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==", "license": "MIT" }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "license": "ISC", "engines": { "node": ">=12" @@ -3382,8 +2983,6 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "license": "ISC", "engines": { "node": ">=12" @@ -3391,8 +2990,6 @@ }, "node_modules/d3-drag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -3404,8 +3001,6 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "license": "BSD-3-Clause", "engines": { "node": ">=12" @@ -3413,8 +3008,6 @@ }, "node_modules/d3-force-3d": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.5.tgz", - "integrity": "sha512-tdwhAhoTYZY/a6eo9nR7HP3xSW/C6XvJTbeRpR92nlPzH6OiE+4MliN9feuSFd0tPtEUo+191qOhCTWx3NYifg==", "license": "MIT", "dependencies": { "d3-binarytree": "1", @@ -3429,8 +3022,6 @@ }, "node_modules/d3-format": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "license": "ISC", "engines": { "node": ">=12" @@ -3438,14 +3029,10 @@ }, "node_modules/d3-hierarchy": { "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==", "license": "BSD-3-Clause" }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "license": "ISC", "dependencies": { "d3-color": "1 - 3" @@ -3456,14 +3043,10 @@ }, "node_modules/d3-octree": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.0.2.tgz", - "integrity": "sha512-Qxg4oirJrNXauiuC94uKMbgxwnhdda9xRLl9ihq45srlJ4Ga3CSgqGcAL8iW7N5CIv4Oz8x3E734ulxyvHPvwA==", "license": "MIT" }, "node_modules/d3-path": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "license": "ISC", "engines": { "node": ">=12" @@ -3471,8 +3054,6 @@ }, "node_modules/d3-quadtree": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "license": "ISC", "engines": { "node": ">=12" @@ -3480,8 +3061,6 @@ }, "node_modules/d3-scale": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", @@ -3496,8 +3075,6 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "license": "ISC", "dependencies": { "d3-color": "1 - 3", @@ -3509,8 +3086,6 @@ }, "node_modules/d3-selection": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", "engines": { "node": ">=12" @@ -3518,8 +3093,6 @@ }, "node_modules/d3-shape": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "license": "ISC", "dependencies": { "d3-path": "^3.1.0" @@ -3530,8 +3103,6 @@ }, "node_modules/d3-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "license": "ISC", "dependencies": { "d3-array": "2 - 3" @@ -3542,8 +3113,6 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "license": "ISC", "dependencies": { "d3-time": "1 - 3" @@ -3554,8 +3123,6 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "license": "ISC", "engines": { "node": ">=12" @@ -3563,8 +3130,6 @@ }, "node_modules/d3-transition": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "license": "ISC", "dependencies": { "d3-color": "1 - 3", @@ -3582,8 +3147,6 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -3598,8 +3161,6 @@ }, "node_modules/daikon": { "version": "1.2.46", - "resolved": "https://registry.npmjs.org/daikon/-/daikon-1.2.46.tgz", - "integrity": "sha512-S8dTTlsWYTH3LQztjTW9KnNvxDeL2mr2cau0auLdYMJe4TrocYP1PmidHizO3rXUs+gXpBWI1PQ2qvB4b21QFw==", "license": "MIT", "dependencies": { "@wearemothership/dicom-character-set": "^1.0.4-opt.1", @@ -3611,14 +3172,10 @@ }, "node_modules/daikon/node_modules/pako": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", "license": "(MIT AND Zlib)" }, "node_modules/date-fns": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", "license": "MIT", "funding": { "type": "github", @@ -3627,14 +3184,10 @@ }, "node_modules/dayjs": { "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", "license": "MIT" }, "node_modules/debug": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "license": "MIT", "dependencies": { "ms": "2.1.2" @@ -3650,8 +3203,6 @@ }, "node_modules/decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "license": "MIT", "engines": { @@ -3660,8 +3211,6 @@ }, "node_modules/decode-named-character-reference": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -3673,8 +3222,6 @@ }, "node_modules/decode-uri-component": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", - "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", "license": "MIT", "engines": { "node": ">=14.16" @@ -3682,15 +3229,11 @@ }, "node_modules/deep-diff": { "version": "0.3.8", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", - "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==", "dev": true, "license": "MIT" }, "node_modules/deep-eql": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", "engines": { @@ -3699,8 +3242,6 @@ }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3708,8 +3249,6 @@ }, "node_modules/default-require-extensions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, "license": "MIT", "dependencies": { @@ -3724,8 +3263,6 @@ }, "node_modules/deferred-leveldown": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==", "dev": true, "license": "MIT", "dependencies": { @@ -3734,8 +3271,6 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -3751,8 +3286,6 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", @@ -3768,14 +3301,10 @@ }, "node_modules/delaunator": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", - "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==", "license": "ISC" }, "node_modules/delaunay-find": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/delaunay-find/-/delaunay-find-0.0.6.tgz", - "integrity": "sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==", "license": "ISC", "dependencies": { "delaunator": "^4.0.0" @@ -3783,8 +3312,6 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -3792,8 +3319,6 @@ }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", "engines": { "node": ">=6" @@ -3801,8 +3326,6 @@ }, "node_modules/des.js": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dev": true, "license": "MIT", "dependencies": { @@ -3811,9 +3334,7 @@ } }, "node_modules/detect-gpu": { - "version": "5.0.44", - "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.44.tgz", - "integrity": "sha512-R4lA6vEmd4IxMQgDEp74e80MDKXkNXz5FpA0/LvuXt7qVWF0faBj7xhJTC8DDWjxFWdMWLyJJSK9JGpMEBX8RA==", + "version": "5.0.45", "license": "MIT", "dependencies": { "webgl-constants": "^1.1.1" @@ -3821,8 +3342,6 @@ }, "node_modules/devlop": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "license": "MIT", "dependencies": { "dequal": "^2.0.0" @@ -3834,14 +3353,10 @@ }, "node_modules/dicom-parser": { "version": "1.8.21", - "resolved": "https://registry.npmjs.org/dicom-parser/-/dicom-parser-1.8.21.tgz", - "integrity": "sha512-lYCweHQDsC8UFpXErPlg86Px2A8bay0HiUY+wzoG3xv5GzgqVHU3lziwSc/Gzn7VV7y2KeP072SzCviuOoU02w==", "license": "MIT" }, "node_modules/diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "license": "MIT", "dependencies": { @@ -3852,15 +3367,11 @@ }, "node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, "license": "MIT" }, "node_modules/dom-helpers": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", @@ -3869,8 +3380,6 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -3883,8 +3392,6 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -3895,8 +3402,6 @@ }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -3910,8 +3415,6 @@ }, "node_modules/domutils": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -3924,21 +3427,15 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.5.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", - "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "license": "ISC" }, "node_modules/elliptic": { "version": "6.5.7", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", - "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3953,140 +3450,490 @@ }, "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, "license": "MIT" }, "node_modules/email-validator": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", - "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", "engines": { - "node": ">4.0" + "node": ">4.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 4" + "node": ">=12" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node": ">=12" } }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/esbuild": { + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "license": "MIT", "engines": { "node": ">=6" @@ -4094,8 +3941,6 @@ }, "node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -4103,8 +3948,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4116,8 +3959,6 @@ }, "node_modules/espree": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4134,8 +3975,6 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -4147,8 +3986,6 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { @@ -4157,14 +3994,10 @@ }, "node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, "node_modules/evp_bytestokey": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "license": "MIT", "dependencies": { @@ -4174,8 +4007,6 @@ }, "node_modules/execa": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "license": "MIT", "dependencies": { @@ -4198,8 +4029,6 @@ }, "node_modules/execa/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { @@ -4211,8 +4040,6 @@ }, "node_modules/execa/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -4224,20 +4051,14 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, "node_modules/fbemitter": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", "license": "BSD-3-Clause", "dependencies": { "fbjs": "^3.0.0" @@ -4245,8 +4066,6 @@ }, "node_modules/fbjs": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", - "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", "license": "MIT", "dependencies": { "cross-fetch": "^3.1.5", @@ -4260,26 +4079,18 @@ }, "node_modules/fbjs-css-vars": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", "license": "MIT" }, "node_modules/fetch-readablestream": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/fetch-readablestream/-/fetch-readablestream-0.2.0.tgz", - "integrity": "sha512-qu4mXWf4wus4idBIN/kVH+XSer8IZ9CwHP+Pd7DL7TuKNC1hP7ykon4kkBjwJF3EMX2WsFp4hH7gU7CyL7ucXw==", "license": "MIT" }, "node_modules/fflate": { "version": "0.7.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz", - "integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==", "license": "MIT" }, "node_modules/file-selector": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", - "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", "license": "MIT", "dependencies": { "tslib": "^2.4.0" @@ -4290,8 +4101,6 @@ }, "node_modules/filter-obj": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", - "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", "license": "MIT", "engines": { "node": ">=14.16" @@ -4302,8 +4111,6 @@ }, "node_modules/find-cache-dir": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "license": "MIT", "dependencies": { @@ -4320,8 +4127,6 @@ }, "node_modules/find-cache-dir/node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { @@ -4336,8 +4141,6 @@ }, "node_modules/find-cache-dir/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -4346,8 +4149,6 @@ }, "node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -4360,8 +4161,6 @@ }, "node_modules/flux": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", - "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "license": "BSD-3-Clause", "dependencies": { "fbemitter": "^3.0.0", @@ -4372,9 +4171,7 @@ } }, "node_modules/focus-trap": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz", - "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==", + "version": "7.5.4", "license": "MIT", "dependencies": { "tabbable": "^6.2.0" @@ -4382,8 +4179,6 @@ }, "node_modules/follow-redirects": { "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -4402,8 +4197,6 @@ }, "node_modules/force-graph": { "version": "1.43.5", - "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.43.5.tgz", - "integrity": "sha512-HveLELh9yhZXO/QOfaFS38vlwJZ/3sKu+jarfXzRmbmihSOH/BbRWnUvmg8wLFiYy6h4HlH4lkRfZRccHYmXgA==", "license": "MIT", "dependencies": { "@tweenjs/tween.js": "18 - 23", @@ -4427,15 +4220,11 @@ }, "node_modules/foreach": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", "dev": true, "license": "MIT" }, "node_modules/foreground-child": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "license": "ISC", "dependencies": { @@ -4448,8 +4237,6 @@ }, "node_modules/form-data": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -4462,14 +4249,10 @@ }, "node_modules/fp-ts": { "version": "2.16.9", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.9.tgz", - "integrity": "sha512-+I2+FnVB+tVaxcYyQkHUq7ZdKScaBlX53A41mxQtpIccsfyv8PzdzP7fzp2AY832T4aoK6UZ5WRX/ebGd8uZuQ==", "license": "MIT" }, "node_modules/fromentries": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "funding": [ { "type": "github", @@ -4488,14 +4271,10 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4503,8 +4282,6 @@ }, "node_modules/fwd-stream": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==", "dev": true, "dependencies": { "readable-stream": "~1.0.26-4" @@ -4512,15 +4289,11 @@ }, "node_modules/fwd-stream/node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, "license": "MIT" }, "node_modules/fwd-stream/node_modules/readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "license": "MIT", "dependencies": { @@ -4532,15 +4305,11 @@ }, "node_modules/fwd-stream/node_modules/string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, "license": "MIT" }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -4548,8 +4317,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -4558,8 +4325,6 @@ }, "node_modules/get-func-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "license": "MIT", "engines": { @@ -4568,8 +4333,6 @@ }, "node_modules/get-intrinsic": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4587,8 +4350,6 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -4597,8 +4358,6 @@ }, "node_modules/get-port": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "license": "MIT", "engines": { "node": ">=4" @@ -4606,8 +4365,6 @@ }, "node_modules/get-stream": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "license": "MIT", "engines": { @@ -4619,15 +4376,10 @@ }, "node_modules/gl-matrix": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", - "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==", "license": "MIT" }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -4646,8 +4398,6 @@ }, "node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "license": "MIT", "engines": { "node": ">=4" @@ -4655,8 +4405,6 @@ }, "node_modules/globalthis": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "license": "MIT", "dependencies": { "define-properties": "^1.1.3" @@ -4670,8 +4418,6 @@ }, "node_modules/gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" @@ -4682,15 +4428,11 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/hammerjs": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -4698,8 +4440,6 @@ }, "node_modules/happy-dom": { "version": "15.0.0", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-15.0.0.tgz", - "integrity": "sha512-DsvANUcxxY20iCo3Yllm7dqwzPVPduGfVFxa7mONwMBLczFeQgkN0LpDir1kIY322JMh+hrcPV3aGLyHCESDlA==", "dev": true, "license": "MIT", "dependencies": { @@ -4713,8 +4453,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -4723,8 +4461,6 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -4735,8 +4471,6 @@ }, "node_modules/has-proto": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4747,8 +4481,6 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4759,8 +4491,6 @@ }, "node_modules/hash-base": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", "dev": true, "license": "MIT", "dependencies": { @@ -4773,8 +4503,6 @@ }, "node_modules/hash.js": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "license": "MIT", "dependencies": { @@ -4784,8 +4512,6 @@ }, "node_modules/hasha": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4801,8 +4527,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4813,8 +4537,6 @@ }, "node_modules/hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, "license": "MIT", "dependencies": { @@ -4825,8 +4547,6 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" @@ -4834,15 +4554,11 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/htmlparser2": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -4860,8 +4576,6 @@ }, "node_modules/human-signals": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4870,15 +4584,11 @@ }, "node_modules/idb-wrapper": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", - "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==", "dev": true, "license": "MIT" }, "node_modules/immer": { "version": "10.1.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", - "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", "license": "MIT", "funding": { "type": "opencollective", @@ -4887,14 +4597,11 @@ }, "node_modules/immutable": { "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true, "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -4909,8 +4616,6 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" @@ -4918,8 +4623,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -4928,8 +4631,6 @@ }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { @@ -4938,8 +4639,6 @@ }, "node_modules/index-array-by": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", - "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", "license": "MIT", "engines": { "node": ">=12" @@ -4947,15 +4646,10 @@ }, "node_modules/indexof": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", "dev": true }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -4964,14 +4658,10 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/internmap": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "license": "ISC", "engines": { "node": ">=12" @@ -4979,8 +4669,6 @@ }, "node_modules/interpret": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -4988,8 +4676,6 @@ }, "node_modules/invariant": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" @@ -4997,8 +4683,6 @@ }, "node_modules/is": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==", "dev": true, "engines": { "node": "*" @@ -5006,14 +4690,10 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, "node_modules/is-core-module": { "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -5027,8 +4707,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { @@ -5037,14 +4715,10 @@ }, "node_modules/is-object": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==", "dev": true }, "node_modules/is-plain-object": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5052,8 +4726,6 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { @@ -5065,15 +4737,11 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true, "license": "MIT" }, "node_modules/is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "license": "MIT", "engines": { @@ -5082,29 +4750,21 @@ }, "node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, "node_modules/isbuffer": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", - "integrity": "sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==", "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -5113,8 +4773,6 @@ }, "node_modules/istanbul-lib-hook": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5126,8 +4784,6 @@ }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5143,8 +4799,6 @@ }, "node_modules/istanbul-lib-processinfo": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "license": "ISC", "dependencies": { @@ -5161,8 +4815,6 @@ }, "node_modules/istanbul-lib-processinfo/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "license": "MIT", "bin": { @@ -5171,8 +4823,6 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5186,8 +4836,6 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5201,8 +4849,6 @@ }, "node_modules/istanbul-reports": { "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5215,8 +4861,6 @@ }, "node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -5231,8 +4875,6 @@ }, "node_modules/jerrypick": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.1.tgz", - "integrity": "sha512-XTtedPYEyVp4t6hJrXuRKr/jHj8SC4z+4K0b396PMkov6muL+i8IIamJIvZWe3jUspgIJak0P+BaWKawMYNBLg==", "license": "MIT", "engines": { "node": ">=12" @@ -5240,20 +4882,14 @@ }, "node_modules/jpeg-lossless-decoder-js": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/jpeg-lossless-decoder-js/-/jpeg-lossless-decoder-js-2.0.7.tgz", - "integrity": "sha512-tbZlhFkKmx+JaqVMkq47SKWGuXLkIaV8fTbnhO39dYEnQrSShLGuLCGb0n6ntXjtmk6oAWGiIriWOLwj9od0yQ==", "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", "dependencies": { @@ -5266,8 +4902,6 @@ }, "node_modules/jsesc": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -5278,26 +4912,18 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "license": "ISC" }, "node_modules/json2mq": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", - "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", "license": "MIT", "dependencies": { "string-convert": "^0.2.0" @@ -5305,8 +4931,6 @@ }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -5317,8 +4941,6 @@ }, "node_modules/kapsule": { "version": "1.14.5", - "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.14.5.tgz", - "integrity": "sha512-H0iSpTynUzZw3tgraDmReprpFRmH5oP5GPmaNsurSwLx2H5iCpOMIkp5q+sfhB4Tz/UJd1E1IbEE9Z6ksnJ6RA==", "license": "MIT", "dependencies": { "lodash-es": "4" @@ -5329,8 +4951,6 @@ }, "node_modules/kleur": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", "engines": { "node": ">=6" @@ -5338,8 +4958,6 @@ }, "node_modules/lefthook": { "version": "1.7.14", - "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.7.14.tgz", - "integrity": "sha512-GIMJm3HPksrHyXgu9OYX3r9QKM10hxoeiI45+7KhJKvAWChDtGqMZ5EPQuTMVsXu5IwggQL9QJLhDfk54WOXEw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5361,8 +4979,6 @@ }, "node_modules/lefthook-linux-x64": { "version": "1.7.14", - "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.7.14.tgz", - "integrity": "sha512-jCNjVk+9iaFSwlFH4RM7SI05tpdty0vPzSTsABXUQwdmKdt1hPWhnUsEhCU03ik33UmpfmXUK9pLFgStT7W5rw==", "cpu": [ "x64" ], @@ -5373,10 +4989,134 @@ "linux" ] }, + "node_modules/lefthook/node_modules/lefthook-darwin-arm64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.14.tgz", + "integrity": "sha512-3hNr04A8DSYZk0RBTdu8D/kkE3FHiNnexAEvuFOqLuf3EQhrrX1wxclGO0+tIk3s7nyh+iqpV69Xd+cb4Fnvpw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/lefthook/node_modules/lefthook-darwin-x64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.14.tgz", + "integrity": "sha512-cXVsxTS2IRKKRyYFEMjAxf0a/31M1PkiNAjlJPXQPoAxxC1rbsvkxWL8vXhH4P0AL18zSYVBf9aTktYArgQGuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/lefthook/node_modules/lefthook-freebsd-arm64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.14.tgz", + "integrity": "sha512-rhx2ZkbWD6SkOXLc5/xyN1fu0uL9MLYBYKKg5T0rLRVwqqr9aYKZ+1Rru/5oL8utH1qkQyiwQkcjnKkyHwSjPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/lefthook/node_modules/lefthook-freebsd-x64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.14.tgz", + "integrity": "sha512-WeVPDm7JB1Crchc7OQ3uLiRfLlhwwX3N2662DPguMresps2r79dUO97LhHMzd+l1RKIqZIgnU+j5fKFI+cmw4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/lefthook/node_modules/lefthook-linux-arm64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.14.tgz", + "integrity": "sha512-IUvxJBfLDVComNc1Djk4VYUJsSAtdwfTvwpNxfaG2qb31VNvF6PPdp43bgpgqzV8O0KDCMm/sn0hlZ00GTuy2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/lefthook/node_modules/lefthook-openbsd-arm64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-1.7.14.tgz", + "integrity": "sha512-Mq5GgjzDMiFin+Ucm52nizvvDQM1o+MnL/P+FDbBq253BIJGDJK+qEuQBgEQndE9bUyAP4qiHb+R6jz5fbpAlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/lefthook/node_modules/lefthook-openbsd-x64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-1.7.14.tgz", + "integrity": "sha512-enbPte9MAYU2JHkcvUBRJrXI6JMVcQqJHN+F8yKOJLFBnthoR0ZUuSTzqAMOivj/wgncHkYPqOWIo1UfB+HpGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/lefthook/node_modules/lefthook-windows-arm64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.14.tgz", + "integrity": "sha512-M9QbTs+Je0SRKC2c/0X8OQsme6glFrKxQoxWMFCN02S6nNLiHqP4vsHphJFU+wnAwv4KE8I1YKT5iMxde0Ejlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/lefthook/node_modules/lefthook-windows-x64": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.14.tgz", + "integrity": "sha512-40Mx+a44kPZUF/AXV45EIgw03FANTXMFDBR1Ib8qYbSaf1cWqJtfeQs9R5Ea0EdqxXkGprzwZ+yUFFjjfOFIoQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/level-blobs": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "integrity": "sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==", "dev": true, "dependencies": { "level-peek": "1.0.6", @@ -5386,15 +5126,11 @@ }, "node_modules/level-blobs/node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, "license": "MIT" }, "node_modules/level-blobs/node_modules/readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5406,15 +5142,11 @@ }, "node_modules/level-blobs/node_modules/string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, "license": "MIT" }, "node_modules/level-filesystem": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "integrity": "sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==", "dev": true, "dependencies": { "concat-stream": "^1.4.4", @@ -5430,15 +5162,11 @@ }, "node_modules/level-fix-range": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", - "integrity": "sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==", "dev": true, "license": "MIT" }, "node_modules/level-hooks": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "integrity": "sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==", "dev": true, "dependencies": { "string-range": "~1.2" @@ -5446,8 +5174,6 @@ }, "node_modules/level-js": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "integrity": "sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5461,15 +5187,11 @@ }, "node_modules/level-js/node_modules/object-keys": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", "dev": true, "license": "MIT" }, "node_modules/level-js/node_modules/xtend": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", "dev": true, "dependencies": { "object-keys": "~0.4.0" @@ -5480,8 +5202,6 @@ }, "node_modules/level-peek": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "integrity": "sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5490,8 +5210,6 @@ }, "node_modules/level-sublevel": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "integrity": "sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==", "dev": true, "license": "MIT", "dependencies": { @@ -5503,8 +5221,6 @@ }, "node_modules/level-sublevel/node_modules/level-fix-range": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "integrity": "sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==", "dev": true, "license": "MIT", "dependencies": { @@ -5513,9 +5229,6 @@ }, "node_modules/level-sublevel/node_modules/object-keys": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==", - "deprecated": "Please update to the latest object-keys", "dev": true, "license": "MIT", "dependencies": { @@ -5526,8 +5239,6 @@ }, "node_modules/level-sublevel/node_modules/xtend": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==", "dev": true, "dependencies": { "is-object": "~0.1.2", @@ -5539,8 +5250,6 @@ }, "node_modules/levelup": { "version": "0.18.6", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", - "integrity": "sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5555,22 +5264,16 @@ }, "node_modules/levelup/node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, "license": "MIT" }, "node_modules/levelup/node_modules/prr": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==", "dev": true, "license": "MIT" }, "node_modules/levelup/node_modules/readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "license": "MIT", "dependencies": { @@ -5582,8 +5285,6 @@ }, "node_modules/levelup/node_modules/semver": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", "dev": true, "license": "BSD", "bin": { @@ -5592,15 +5293,11 @@ }, "node_modules/levelup/node_modules/string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true, "license": "MIT" }, "node_modules/levelup/node_modules/xtend": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", "dev": true, "engines": { "node": ">=0.4" @@ -5608,14 +5305,10 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, "node_modules/loader-utils": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -5628,8 +5321,6 @@ }, "node_modules/loader-utils/node_modules/json5": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "license": "MIT", "dependencies": { "minimist": "^1.2.0" @@ -5640,8 +5331,6 @@ }, "node_modules/local-access": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz", - "integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==", "license": "MIT", "engines": { "node": ">=6" @@ -5649,8 +5338,6 @@ }, "node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -5662,57 +5349,39 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "license": "MIT" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "license": "MIT" }, "node_modules/lodash.curry": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==", "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, "node_modules/lodash.flattendeep": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true, "license": "MIT" }, "node_modules/lodash.flow": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==", "license": "MIT" }, "node_modules/lodash.get": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -5723,8 +5392,6 @@ }, "node_modules/loupe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, "license": "MIT", "dependencies": { @@ -5733,8 +5400,6 @@ }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -5742,15 +5407,11 @@ }, "node_modules/ltgt": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", "dev": true, "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, "license": "MIT", "dependencies": { @@ -5758,21 +5419,17 @@ } }, "node_modules/magicast": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", - "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", + "version": "0.3.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.24.4", - "@babel/types": "^7.24.0", + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -5787,8 +5444,6 @@ }, "node_modules/marked": { "version": "13.0.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", - "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -5799,8 +5454,6 @@ }, "node_modules/md5.js": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "license": "MIT", "dependencies": { @@ -5811,21 +5464,15 @@ }, "node_modules/memoize-one": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/micromark": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", "funding": [ { "type": "GitHub Sponsors", @@ -5859,8 +5506,6 @@ }, "node_modules/micromark-core-commonmark": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", "funding": [ { "type": "GitHub Sponsors", @@ -5893,8 +5538,6 @@ }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", @@ -5913,8 +5556,6 @@ }, "node_modules/micromark-extension-gfm-autolink-literal": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", @@ -5929,8 +5570,6 @@ }, "node_modules/micromark-extension-gfm-footnote": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -5949,8 +5588,6 @@ }, "node_modules/micromark-extension-gfm-strikethrough": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -5967,8 +5604,6 @@ }, "node_modules/micromark-extension-gfm-table": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -5984,8 +5619,6 @@ }, "node_modules/micromark-extension-gfm-tagfilter": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" @@ -5997,8 +5630,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -6014,8 +5645,6 @@ }, "node_modules/micromark-factory-destination": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", "funding": [ { "type": "GitHub Sponsors", @@ -6035,8 +5664,6 @@ }, "node_modules/micromark-factory-label": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", "funding": [ { "type": "GitHub Sponsors", @@ -6057,8 +5684,6 @@ }, "node_modules/micromark-factory-space": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "funding": [ { "type": "GitHub Sponsors", @@ -6077,8 +5702,6 @@ }, "node_modules/micromark-factory-title": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", "funding": [ { "type": "GitHub Sponsors", @@ -6099,8 +5722,6 @@ }, "node_modules/micromark-factory-whitespace": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", "funding": [ { "type": "GitHub Sponsors", @@ -6121,8 +5742,6 @@ }, "node_modules/micromark-util-character": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -6141,8 +5760,6 @@ }, "node_modules/micromark-util-chunked": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", "funding": [ { "type": "GitHub Sponsors", @@ -6160,8 +5777,6 @@ }, "node_modules/micromark-util-classify-character": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", "funding": [ { "type": "GitHub Sponsors", @@ -6181,8 +5796,6 @@ }, "node_modules/micromark-util-combine-extensions": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", "funding": [ { "type": "GitHub Sponsors", @@ -6201,8 +5814,6 @@ }, "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", "funding": [ { "type": "GitHub Sponsors", @@ -6220,8 +5831,6 @@ }, "node_modules/micromark-util-encode": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", "funding": [ { "type": "GitHub Sponsors", @@ -6236,8 +5845,6 @@ }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", "funding": [ { "type": "GitHub Sponsors", @@ -6252,8 +5859,6 @@ }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", "funding": [ { "type": "GitHub Sponsors", @@ -6271,8 +5876,6 @@ }, "node_modules/micromark-util-resolve-all": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", "funding": [ { "type": "GitHub Sponsors", @@ -6290,8 +5893,6 @@ }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", "funding": [ { "type": "GitHub Sponsors", @@ -6311,8 +5912,6 @@ }, "node_modules/micromark-util-subtokenize": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -6333,8 +5932,6 @@ }, "node_modules/micromark-util-symbol": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -6349,8 +5946,6 @@ }, "node_modules/micromark-util-types": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", "funding": [ { "type": "GitHub Sponsors", @@ -6365,8 +5960,6 @@ }, "node_modules/miller-rabin": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "license": "MIT", "dependencies": { @@ -6379,15 +5972,11 @@ }, "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, "license": "MIT" }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -6395,8 +5984,6 @@ }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -6407,8 +5994,6 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "license": "MIT", "engines": { @@ -6420,22 +6005,16 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true, "license": "ISC" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", "dev": true, "license": "MIT" }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -6446,8 +6025,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6455,8 +6032,6 @@ }, "node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "license": "ISC", "engines": { @@ -6465,14 +6040,10 @@ }, "node_modules/mitt": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", "license": "MIT" }, "node_modules/mri": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "license": "MIT", "engines": { "node": ">=4" @@ -6480,8 +6051,6 @@ }, "node_modules/mrmime": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "license": "MIT", "engines": { "node": ">=10" @@ -6489,14 +6058,10 @@ }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -6513,8 +6078,6 @@ }, "node_modules/nifti-reader-js": { "version": "0.6.8", - "resolved": "https://registry.npmjs.org/nifti-reader-js/-/nifti-reader-js-0.6.8.tgz", - "integrity": "sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==", "license": "MIT", "dependencies": { "fflate": "*" @@ -6533,8 +6096,6 @@ }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -6553,8 +6114,6 @@ }, "node_modules/node-preload": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6566,14 +6125,10 @@ }, "node_modules/node-releases": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "license": "MIT" }, "node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6588,8 +6143,6 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", "engines": { @@ -6601,8 +6154,6 @@ }, "node_modules/nyc": { "version": "17.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.0.0.tgz", - "integrity": "sha512-ISp44nqNCaPugLLGGfknzQwSwt10SSS5IMoPR7GLoMAyS18Iw5js8U7ga2VF9lYuMZ42gOHr3UddZw4WZltxKg==", "dev": true, "license": "ISC", "dependencies": { @@ -6643,8 +6194,6 @@ }, "node_modules/nyc/node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6658,8 +6207,6 @@ }, "node_modules/nyc/node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { @@ -6674,18 +6221,35 @@ }, "node_modules/nyc/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/nyc/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc/node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6693,8 +6257,6 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -6702,15 +6264,11 @@ }, "node_modules/octal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "integrity": "sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==", "dev": true, "license": "MIT" }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -6718,8 +6276,6 @@ }, "node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6734,8 +6290,6 @@ }, "node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -6750,8 +6304,6 @@ }, "node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -6763,8 +6315,6 @@ }, "node_modules/p-map": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6776,8 +6326,6 @@ }, "node_modules/p-queue": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", - "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", "license": "MIT", "dependencies": { "eventemitter3": "^5.0.1", @@ -6792,8 +6340,6 @@ }, "node_modules/p-timeout": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", "license": "MIT", "engines": { "node": ">=14.16" @@ -6804,8 +6350,6 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -6814,8 +6358,6 @@ }, "node_modules/package-hash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "license": "ISC", "dependencies": { @@ -6830,21 +6372,15 @@ }, "node_modules/package-json-from-dist": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/pako": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -6855,8 +6391,6 @@ }, "node_modules/parse-asn1": { "version": "5.1.7", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", - "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", "dev": true, "license": "ISC", "dependencies": { @@ -6873,8 +6407,6 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -6891,14 +6423,10 @@ }, "node_modules/parse-srcset": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", - "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -6907,8 +6435,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6916,8 +6442,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -6926,14 +6450,10 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -6949,15 +6469,11 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, "license": "ISC" }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { "node": ">=8" @@ -6965,15 +6481,11 @@ }, "node_modules/pathe": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, "license": "MIT" }, "node_modules/pathval": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, "license": "MIT", "engines": { @@ -6982,8 +6494,6 @@ }, "node_modules/pbkdf2": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, "license": "MIT", "dependencies": { @@ -6999,14 +6509,10 @@ }, "node_modules/picocolors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "license": "ISC" }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7018,14 +6524,10 @@ }, "node_modules/platform": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "license": "MIT" }, "node_modules/playwright": { "version": "1.46.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.1.tgz", - "integrity": "sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7043,8 +6545,6 @@ }, "node_modules/playwright-core": { "version": "1.46.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.1.tgz", - "integrity": "sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==", "dev": true, "license": "Apache-2.0", "bin": { @@ -7054,10 +6554,23 @@ "node": ">=18" } }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "funding": [ { "type": "opencollective", @@ -7084,8 +6597,6 @@ }, "node_modules/preval.macro": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/preval.macro/-/preval.macro-5.0.0.tgz", - "integrity": "sha512-+OZRqZYx1pjZ7H5Jis8bPFXkiT7lwA46UzAT4IjuzFVKwkJK+TwIx1TCqrqNCf8U3e5O12mEJEz1BXslkCLWfQ==", "license": "MIT", "dependencies": { "babel-plugin-preval": "^5.0.0" @@ -7096,22 +6607,16 @@ }, "node_modules/process-es6": { "version": "0.11.6", - "resolved": "https://registry.npmjs.org/process-es6/-/process-es6-0.11.6.tgz", - "integrity": "sha512-GYBRQtL4v3wgigq10Pv58jmTbFXlIiTbSfgnNqZLY0ldUPqy1rRxDI5fCjoCpnM6TqmHQI8ydzTBXW86OYc0gA==", "dev": true, "license": "MIT" }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "license": "MIT" }, "node_modules/process-on-spawn": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, "license": "MIT", "dependencies": { @@ -7123,8 +6628,6 @@ }, "node_modules/promise": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "license": "MIT", "dependencies": { "asap": "~2.0.3" @@ -7132,8 +6635,6 @@ }, "node_modules/prop-types": { "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -7143,21 +6644,15 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, "node_modules/prr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, "license": "MIT" }, "node_modules/public-encrypt": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7171,15 +6666,11 @@ }, "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" @@ -7187,14 +6678,10 @@ }, "node_modules/pure-color": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==", "license": "MIT" }, "node_modules/query-string": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.1.0.tgz", - "integrity": "sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==", "license": "MIT", "dependencies": { "decode-uri-component": "^0.4.1", @@ -7210,8 +6697,6 @@ }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7220,8 +6705,6 @@ }, "node_modules/randomfill": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "license": "MIT", "dependencies": { @@ -7231,8 +6714,6 @@ }, "node_modules/rc-cascader": { "version": "3.27.0", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.27.0.tgz", - "integrity": "sha512-z5uq8VvQadFUBiuZJ7YF5UAUGNkZtdEtcEYiIA94N/Kc2MIKr6lEbN5HyVddvYSgwWlKqnL6pH5bFXFuIK3MNg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -7249,8 +6730,6 @@ }, "node_modules/rc-checkbox": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.3.0.tgz", - "integrity": "sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7264,8 +6743,6 @@ }, "node_modules/rc-collapse": { "version": "3.7.3", - "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.3.tgz", - "integrity": "sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7280,8 +6757,6 @@ }, "node_modules/rc-dialog": { "version": "9.5.2", - "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.5.2.tgz", - "integrity": "sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7297,8 +6772,6 @@ }, "node_modules/rc-drawer": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.2.0.tgz", - "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", @@ -7314,8 +6787,6 @@ }, "node_modules/rc-drawer/node_modules/@babel/runtime": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -7326,8 +6797,6 @@ }, "node_modules/rc-dropdown": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.0.tgz", - "integrity": "sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -7342,8 +6811,6 @@ }, "node_modules/rc-field-form": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.4.0.tgz", - "integrity": "sha512-XZ/lF9iqf9HXApIHQHqzJK5v2w4mkUMsVqAzOyWVzoiwwXEavY6Tpuw7HavgzIoD+huVff4JghSGcgEfX6eycg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -7360,8 +6827,6 @@ }, "node_modules/rc-image": { "version": "7.9.0", - "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.9.0.tgz", - "integrity": "sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", @@ -7378,8 +6843,6 @@ }, "node_modules/rc-input": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.6.3.tgz", - "integrity": "sha512-wI4NzuqBS8vvKr8cljsvnTUqItMfG1QbJoxovCgL+DX4eVUcHIjVwharwevIxyy7H/jbLryh+K7ysnJr23aWIA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -7393,8 +6856,6 @@ }, "node_modules/rc-input-number": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.2.0.tgz", - "integrity": "sha512-5XZFhBCV5f9UQ62AZ2hFbEY8iZT/dm23Q1kAg0H8EvOgD3UDbYYJAayoVIkM3lQaCqYAW5gV0yV3vjw1XtzWHg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7410,8 +6871,6 @@ }, "node_modules/rc-mentions": { "version": "2.15.0", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.15.0.tgz", - "integrity": "sha512-f5v5i7VdqvBDXbphoqcQWmXDif2Msd2arritVoWybrVDuHE6nQ7XCYsybHbV//WylooK52BFDouFvyaRDtXZEw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.22.5", @@ -7429,8 +6888,6 @@ }, "node_modules/rc-menu": { "version": "9.14.1", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.14.1.tgz", - "integrity": "sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7447,8 +6904,6 @@ }, "node_modules/rc-motion": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.2.tgz", - "integrity": "sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -7462,8 +6917,6 @@ }, "node_modules/rc-notification": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.0.tgz", - "integrity": "sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7481,8 +6934,6 @@ }, "node_modules/rc-overflow": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", - "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -7497,8 +6948,6 @@ }, "node_modules/rc-pagination": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-4.2.0.tgz", - "integrity": "sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7511,9 +6960,7 @@ } }, "node_modules/rc-picker": { - "version": "4.6.13", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.13.tgz", - "integrity": "sha512-yi4JWPGjm420Q8rHjZ6YNy2c5IfV+9EAzx2pewVRPOjJqfg7uifO/Z0uqxdl/h6AhBocuvRvtlyz6ehrAvTq7A==", + "version": "4.6.14", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", @@ -7551,8 +6998,6 @@ }, "node_modules/rc-picker/node_modules/@babel/runtime": { "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -7563,8 +7008,6 @@ }, "node_modules/rc-progress": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", - "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7578,8 +7021,6 @@ }, "node_modules/rc-rate": { "version": "2.13.0", - "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.0.tgz", - "integrity": "sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7596,8 +7037,6 @@ }, "node_modules/rc-resize-observer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", - "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.7", @@ -7612,8 +7051,6 @@ }, "node_modules/rc-segmented": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.3.0.tgz", - "integrity": "sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -7628,8 +7065,6 @@ }, "node_modules/rc-select": { "version": "14.15.1", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.15.1.tgz", - "integrity": "sha512-mGvuwW1RMm1NCSI8ZUoRoLRK51R2Nb+QJnmiAvbDRcjh2//ulCkxeV6ZRFTECPpE1t2DPfyqZMPw90SVJzQ7wQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7650,8 +7085,6 @@ }, "node_modules/rc-slider": { "version": "11.1.5", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.5.tgz", - "integrity": "sha512-b77H5PbjMKsvkYXAYIkn50QuFX6ICQmCTibDinI9q+BHx65/TV4TeU25+oadhSRzykxs0/vBWeKBwRyySOeWlg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7668,8 +7101,6 @@ }, "node_modules/rc-steps": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", - "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.16.7", @@ -7686,8 +7117,6 @@ }, "node_modules/rc-switch": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", - "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.21.0", @@ -7701,8 +7130,6 @@ }, "node_modules/rc-table": { "version": "7.45.7", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.45.7.tgz", - "integrity": "sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7722,8 +7149,6 @@ }, "node_modules/rc-tabs": { "version": "15.1.1", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.1.1.tgz", - "integrity": "sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", @@ -7744,8 +7169,6 @@ }, "node_modules/rc-textarea": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.8.1.tgz", - "integrity": "sha512-bm36N2ZqwZAP60ZQg2OY9mPdqWC+m6UTjHc+CqEZOxb3Ia29BGHazY/s5bI8M4113CkqTzhtFUDNA078ZiOx3Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7761,8 +7184,6 @@ }, "node_modules/rc-tooltip": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.0.tgz", - "integrity": "sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", @@ -7776,8 +7197,6 @@ }, "node_modules/rc-tree": { "version": "5.8.8", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.8.tgz", - "integrity": "sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7795,9 +7214,7 @@ } }, "node_modules/rc-tree-select": { - "version": "5.22.1", - "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.22.1.tgz", - "integrity": "sha512-b8mAK52xEpRgS+b2PTapCt29GoIrO5cO8jB7AfHttFsIJfcnynY9FCtnYzURsKXJkGHbFY6UzSEB2I3TETtdWg==", + "version": "5.22.2", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -7813,8 +7230,6 @@ }, "node_modules/rc-upload": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.7.0.tgz", - "integrity": "sha512-eUwxYNHlsYe5vYhKFAUGrQG95JrnPzY+BmPi1Daq39fWNl/eOc7v4UODuWrVp2LFkQBuV3cMCG/I68iub6oBrg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -7828,8 +7243,6 @@ }, "node_modules/rc-util": { "version": "5.43.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.43.0.tgz", - "integrity": "sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -7842,14 +7255,10 @@ }, "node_modules/rc-util/node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, "node_modules/rc-virtual-list": { "version": "3.14.5", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.14.5.tgz", - "integrity": "sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", @@ -7867,8 +7276,6 @@ }, "node_modules/react": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -7879,8 +7286,6 @@ }, "node_modules/react-activity": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/react-activity/-/react-activity-2.1.3.tgz", - "integrity": "sha512-BdZuwZ4frK+tkjjERtzT0HxbHUN5/hIe9BBL9Ac/kgVOJ0bXjJpz417cQ7XxGSA27I+fsHCNRrFQ1cux61vHDQ==", "license": "MIT", "peerDependencies": { "react": ">= 15.0.0", @@ -7889,8 +7294,6 @@ }, "node_modules/react-base16-styling": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", "license": "MIT", "dependencies": { "base16": "^1.0.0", @@ -7901,8 +7304,6 @@ }, "node_modules/react-bootstrap-typeahead": { "version": "6.3.2", - "resolved": "https://registry.npmjs.org/react-bootstrap-typeahead/-/react-bootstrap-typeahead-6.3.2.tgz", - "integrity": "sha512-N5Mb0WlSSMcD7Z0pcCypILgIuECybev0hl4lsnCa5lbXTnN4QdkuHLGuTLSlXBwm1ZMFpOc2SnsdSRgeFiF+Ow==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.14.6", @@ -7928,8 +7329,6 @@ }, "node_modules/react-cookie": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.2.0.tgz", - "integrity": "sha512-mqhPERUyfOljq5yJ4woDFI33bjEtigsl8JDJdPPeNhr0eSVZmBc/2Vdf8mFxOUktQxhxTR1T+uF0/FRTZyBEgw==", "license": "MIT", "dependencies": { "@types/hoist-non-react-statics": "^3.3.5", @@ -7942,8 +7341,6 @@ }, "node_modules/react-dom": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -7955,8 +7352,6 @@ }, "node_modules/react-dropzone": { "version": "14.2.3", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", - "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", "license": "MIT", "dependencies": { "attr-accept": "^2.2.2", @@ -7972,8 +7367,6 @@ }, "node_modules/react-error-boundary": { "version": "4.0.13", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz", - "integrity": "sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" @@ -7984,14 +7377,10 @@ }, "node_modules/react-fast-compare": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", "license": "MIT" }, "node_modules/react-force-graph-2d": { "version": "1.25.5", - "resolved": "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.25.5.tgz", - "integrity": "sha512-3u8WjZZorpwZSDs3n3QeOS9ZoxFPM+IR9SStYJVQ/qKECydMHarxnf7ynV/MKJbC6kUsc60soD0V+Uq/r2vz7Q==", "license": "MIT", "dependencies": { "force-graph": "1", @@ -8007,14 +7396,10 @@ }, "node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/react-json-view": { "version": "1.21.3", - "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", - "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", "license": "MIT", "dependencies": { "flux": "^4.0.1", @@ -8029,8 +7414,6 @@ }, "node_modules/react-kapsule": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.4.0.tgz", - "integrity": "sha512-w4Yv9CgWdj8kWGQEPNWFGJJ08dYEZHZpiaFR/DgZjCMBNqv9wus2Gy1qvHVJmJbzvAZbq6jdvFC+NYzEqAlNhQ==", "license": "MIT", "dependencies": { "fromentries": "^1.3.2", @@ -8045,8 +7428,6 @@ }, "node_modules/react-lazylog": { "version": "4.5.3", - "resolved": "https://registry.npmjs.org/react-lazylog/-/react-lazylog-4.5.3.tgz", - "integrity": "sha512-lyov32A/4BqihgXgtNXTHCajXSXkYHPlIEmV8RbYjHIMxCFSnmtdg4kDCI3vATz7dURtiFTvrw5yonHnrS+NNg==", "license": "MPL-2.0", "dependencies": { "@mattiasbuelens/web-streams-polyfill": "^0.2.0", @@ -8065,8 +7446,6 @@ }, "node_modules/react-lazylog/node_modules/immutable": { "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8074,14 +7453,10 @@ }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", "license": "MIT" }, "node_modules/react-overlays": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", - "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.13.8", @@ -8100,8 +7475,6 @@ }, "node_modules/react-popper": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", "license": "MIT", "dependencies": { "react-fast-compare": "^3.0.1", @@ -8115,8 +7488,6 @@ }, "node_modules/react-redux": { "version": "9.1.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", - "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.3", @@ -8138,8 +7509,6 @@ }, "node_modules/react-router": { "version": "6.26.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz", - "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==", "license": "MIT", "dependencies": { "@remix-run/router": "1.19.1" @@ -8153,8 +7522,6 @@ }, "node_modules/react-router-dom": { "version": "6.26.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz", - "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==", "license": "MIT", "dependencies": { "@remix-run/router": "1.19.1", @@ -8170,8 +7537,6 @@ }, "node_modules/react-string-replace": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/react-string-replace/-/react-string-replace-0.4.4.tgz", - "integrity": "sha512-FAMkhxmDpCsGTwTZg7p/2v+/GTmxAp73so3fbSvlAcBBX36ujiGRNEaM/1u+jiYQrArhns+7eE92g2pi5E5FUA==", "license": "MIT", "dependencies": { "lodash": "^4.17.4" @@ -8182,8 +7547,6 @@ }, "node_modules/react-textarea-autosize": { "version": "8.5.3", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz", - "integrity": "sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", @@ -8199,8 +7562,6 @@ }, "node_modules/react-virtualized": { "version": "9.22.5", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.5.tgz", - "integrity": "sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.7.2", @@ -8217,8 +7578,6 @@ }, "node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { @@ -8233,15 +7592,11 @@ }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "license": "MIT" }, "node_modules/rechoir": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dependencies": { "resolve": "^1.1.6" }, @@ -8251,15 +7606,10 @@ }, "node_modules/redux": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "license": "MIT" }, "node_modules/redux-devtools-extension": { "version": "2.13.9", - "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz", - "integrity": "sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A==", - "deprecated": "Package moved to @redux-devtools/extension.", "dev": true, "license": "MIT", "peerDependencies": { @@ -8268,8 +7618,6 @@ }, "node_modules/redux-logger": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", - "integrity": "sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==", "dev": true, "license": "MIT", "dependencies": { @@ -8278,8 +7626,6 @@ }, "node_modules/redux-saga": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.3.0.tgz", - "integrity": "sha512-J9RvCeAZXSTAibFY0kGw6Iy4EdyDNW7k6Q+liwX+bsck7QVsU78zz8vpBRweEfANxnnlG/xGGeOvf6r8UXzNJQ==", "license": "MIT", "dependencies": { "@redux-saga/core": "^1.3.0" @@ -8287,8 +7633,6 @@ }, "node_modules/redux-thunk": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", - "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", "license": "MIT", "peerDependencies": { "redux": "^5.0.0" @@ -8296,14 +7640,10 @@ }, "node_modules/regenerator-runtime": { "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "license": "MIT" }, "node_modules/release-zalgo": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, "license": "ISC", "dependencies": { @@ -8315,8 +7655,6 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -8325,8 +7663,6 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8334,27 +7670,19 @@ }, "node_modules/require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true, "license": "ISC" }, "node_modules/reselect": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", - "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", "license": "MIT" }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", "license": "MIT" }, "node_modules/resolve": { "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -8370,8 +7698,6 @@ }, "node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -8380,9 +7706,6 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -8397,8 +7720,6 @@ }, "node_modules/ripemd160": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "license": "MIT", "dependencies": { @@ -8407,9 +7728,7 @@ } }, "node_modules/rollup": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", - "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==", + "version": "4.21.1", "dev": true, "license": "MIT", "dependencies": { @@ -8423,29 +7742,27 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.0", - "@rollup/rollup-android-arm64": "4.21.0", - "@rollup/rollup-darwin-arm64": "4.21.0", - "@rollup/rollup-darwin-x64": "4.21.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", - "@rollup/rollup-linux-arm-musleabihf": "4.21.0", - "@rollup/rollup-linux-arm64-gnu": "4.21.0", - "@rollup/rollup-linux-arm64-musl": "4.21.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", - "@rollup/rollup-linux-riscv64-gnu": "4.21.0", - "@rollup/rollup-linux-s390x-gnu": "4.21.0", - "@rollup/rollup-linux-x64-gnu": "4.21.0", - "@rollup/rollup-linux-x64-musl": "4.21.0", - "@rollup/rollup-win32-arm64-msvc": "4.21.0", - "@rollup/rollup-win32-ia32-msvc": "4.21.0", - "@rollup/rollup-win32-x64-msvc": "4.21.0", + "@rollup/rollup-android-arm-eabi": "4.21.1", + "@rollup/rollup-android-arm64": "4.21.1", + "@rollup/rollup-darwin-arm64": "4.21.1", + "@rollup/rollup-darwin-x64": "4.21.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.1", + "@rollup/rollup-linux-arm-musleabihf": "4.21.1", + "@rollup/rollup-linux-arm64-gnu": "4.21.1", + "@rollup/rollup-linux-arm64-musl": "4.21.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.1", + "@rollup/rollup-linux-riscv64-gnu": "4.21.1", + "@rollup/rollup-linux-s390x-gnu": "4.21.1", + "@rollup/rollup-linux-x64-gnu": "4.21.1", + "@rollup/rollup-linux-x64-musl": "4.21.1", + "@rollup/rollup-win32-arm64-msvc": "4.21.1", + "@rollup/rollup-win32-ia32-msvc": "4.21.1", + "@rollup/rollup-win32-x64-msvc": "4.21.1", "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-node-builtins": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz", - "integrity": "sha512-bxdnJw8jIivr2yEyt8IZSGqZkygIJOGAWypXvHXnwKAbUcN4Q/dGTx7K0oAJryC/m6aq6tKutltSeXtuogU6sw==", "dev": true, "license": "ISC", "dependencies": { @@ -8455,16 +7772,237 @@ "process-es6": "^0.11.2" } }, + "node_modules/rollup/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.1.tgz", + "integrity": "sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.1.tgz", + "integrity": "sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.1.tgz", + "integrity": "sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.1.tgz", + "integrity": "sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.1.tgz", + "integrity": "sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.1.tgz", + "integrity": "sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.1.tgz", + "integrity": "sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.1.tgz", + "integrity": "sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.1.tgz", + "integrity": "sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.1.tgz", + "integrity": "sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.1.tgz", + "integrity": "sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.1.tgz", + "integrity": "sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.1.tgz", + "integrity": "sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.1.tgz", + "integrity": "sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.1.tgz", + "integrity": "sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/rollup/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/rusha": { "version": "0.8.14", - "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.14.tgz", - "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==", "license": "MIT" }, "node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -8472,8 +8010,6 @@ }, "node_modules/sade": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "license": "MIT", "dependencies": { "mri": "^1.1.0" @@ -8484,8 +8020,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -8505,8 +8039,6 @@ }, "node_modules/sanitize-html": { "version": "2.13.0", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.13.0.tgz", - "integrity": "sha512-Xff91Z+4Mz5QiNSLdLWwjgBDm5b1RU6xBT0+12rapjiaR7SwfRdjw8f+6Rir2MXKLrDicRFHdb51hGOAxmsUIA==", "license": "MIT", "dependencies": { "deepmerge": "^4.2.2", @@ -8519,8 +8051,6 @@ }, "node_modules/sanitize-html/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", "engines": { "node": ">=10" @@ -8531,8 +8061,6 @@ }, "node_modules/scheduler": { "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -8540,8 +8068,6 @@ }, "node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -8558,8 +8084,6 @@ }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", - "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", "license": "MIT", "dependencies": { "compute-scroll-into-view": "^3.0.2" @@ -8567,14 +8091,10 @@ }, "node_modules/seedrandom": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", "license": "MIT" }, "node_modules/semiver": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", - "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", "license": "MIT", "engines": { "node": ">=6" @@ -8582,8 +8102,6 @@ }, "node_modules/semver": { "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "license": "ISC", "bin": { @@ -8595,21 +8113,15 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, "license": "ISC" }, "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "license": "MIT" }, "node_modules/sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "license": "(MIT AND BSD-3-Clause)", "dependencies": { @@ -8622,8 +8134,6 @@ }, "node_modules/shader-loader": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/shader-loader/-/shader-loader-1.3.1.tgz", - "integrity": "sha512-dt8F9K0x4rjmaFyHh7rNDfpt4LUiR64zhNIEwp2WbE99B3z4ALuvvmhftkElg93dUD6sTmv/aXa/z9SJiEddcA==", "license": "MIT", "dependencies": { "loader-utils": "^1.1.0" @@ -8631,8 +8141,6 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -8644,8 +8152,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -8654,8 +8160,6 @@ }, "node_modules/shelljs": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", @@ -8671,28 +8175,20 @@ }, "node_modules/shlex": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/shlex/-/shlex-2.1.2.tgz", - "integrity": "sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==", "license": "MIT" }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/sirv": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", @@ -8705,8 +8201,6 @@ }, "node_modules/sirv-cli": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-2.0.2.tgz", - "integrity": "sha512-OtSJDwxsF1NWHc7ps3Sa0s+dPtP15iQNJzfKVz+MxkEo3z72mCD+yu30ct79rPr0CaV1HXSOBp+MIY5uIhHZ1A==", "license": "MIT", "dependencies": { "console-clear": "^1.1.0", @@ -8726,19 +8220,15 @@ } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.4", "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, "node_modules/source-map-js": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -8746,14 +8236,10 @@ }, "node_modules/spark-md5": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", - "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==", "license": "(WTFPL OR MIT)" }, "node_modules/spawn-wrap": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "license": "ISC", "dependencies": { @@ -8770,8 +8256,6 @@ }, "node_modules/spawn-wrap/node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { @@ -8786,8 +8270,6 @@ }, "node_modules/spawn-wrap/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -8796,8 +8278,6 @@ }, "node_modules/split-on-first": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", - "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", "license": "MIT", "engines": { "node": ">=12" @@ -8808,28 +8288,20 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/std-env": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true, "license": "MIT" }, "node_modules/stream-browserify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "license": "MIT", "dependencies": { "inherits": "~2.0.4", @@ -8838,8 +8310,6 @@ }, "node_modules/stream-browserify/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -8852,8 +8322,6 @@ }, "node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -8861,27 +8329,19 @@ }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/string-convert": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", "license": "MIT" }, "node_modules/string-range": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "integrity": "sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==", "dev": true, "license": "MIT" }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -8896,8 +8356,6 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -8911,8 +8369,6 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -8925,8 +8381,6 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -8938,8 +8392,6 @@ }, "node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { @@ -8948,8 +8400,6 @@ }, "node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "license": "MIT", "engines": { @@ -8961,14 +8411,10 @@ }, "node_modules/stylis": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", - "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", "license": "MIT" }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -8980,8 +8426,6 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -8992,34 +8436,93 @@ }, "node_modules/tabbable": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", "license": "MIT" }, "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "version": "7.0.1", "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "glob": "^10.4.1", + "minimatch": "^9.0.4" }, "engines": { - "node": ">=8" + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/test-exclude/node_modules/foreground-child": { + "version": "3.3.0", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.4.5", + "dev": true, + "license": "ISC", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/text-encoding-utf-8": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", - "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" + "version": "1.0.2" }, "node_modules/throttle-debounce": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", - "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", "license": "MIT", "engines": { "node": ">=12.22" @@ -9027,21 +8530,15 @@ }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinycolor2": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "license": "MIT" }, "node_modules/tinydate": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", - "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", "license": "MIT", "engines": { "node": ">=4" @@ -9049,8 +8546,6 @@ }, "node_modules/tinypool": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", - "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", "dev": true, "license": "MIT", "engines": { @@ -9059,8 +8554,6 @@ }, "node_modules/tinyrainbow": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "dev": true, "license": "MIT", "engines": { @@ -9069,8 +8562,6 @@ }, "node_modules/tinyspy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", "dev": true, "license": "MIT", "engines": { @@ -9079,8 +8570,6 @@ }, "node_modules/to-fast-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "license": "MIT", "engines": { "node": ">=4" @@ -9088,14 +8577,10 @@ }, "node_modules/toggle-selection": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", "license": "MIT" }, "node_modules/totalist": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "license": "MIT", "engines": { "node": ">=6" @@ -9103,20 +8588,14 @@ }, "node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "version": "2.7.0", "license": "0BSD" }, "node_modules/type-fest": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -9125,22 +8604,16 @@ }, "node_modules/typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, "license": "MIT" }, "node_modules/typedarray-to-buffer": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", - "integrity": "sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==", "dev": true, "license": "MIT" }, "node_modules/typescript": { "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -9152,8 +8625,6 @@ }, "node_modules/typescript-compare": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", - "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", "license": "MIT", "dependencies": { "typescript-logic": "^0.0.0" @@ -9161,14 +8632,10 @@ }, "node_modules/typescript-logic": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", - "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==", "license": "MIT" }, "node_modules/typescript-tuple": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", - "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", "license": "MIT", "dependencies": { "typescript-compare": "^0.0.2" @@ -9176,8 +8643,6 @@ }, "node_modules/ua-parser-js": { "version": "1.0.38", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz", - "integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==", "funding": [ { "type": "opencollective", @@ -9199,8 +8664,6 @@ }, "node_modules/uncontrollable": { "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.3", @@ -9214,14 +8677,10 @@ }, "node_modules/undici-types": { "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, "node_modules/universal-cookie": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.2.0.tgz", - "integrity": "sha512-PvcyflJAYACJKr28HABxkGemML5vafHmiL4ICe3e+BEKXRMt0GaFLZhAwgv637kFFnnfiSJ8e6jknrKkMrU+PQ==", "license": "MIT", "dependencies": { "@types/cookie": "^0.6.0", @@ -9230,8 +8689,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -9260,8 +8717,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -9269,8 +8724,6 @@ }, "node_modules/use-ackee": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use-ackee/-/use-ackee-3.1.0.tgz", - "integrity": "sha512-RPX51I/Ak6dtNW0aXY6GM/LJ899OU4qoKes/CTGj9+4Qoz9PO7I14BX8Rw6vmlbVvQzZ6WIb01sg7vU/kYEQOw==", "license": "MIT", "dependencies": { "ackee-tracker": "^5.1.0" @@ -9284,8 +8737,6 @@ }, "node_modules/use-composed-ref": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -9293,8 +8744,6 @@ }, "node_modules/use-immer": { "version": "0.10.0", - "resolved": "https://registry.npmjs.org/use-immer/-/use-immer-0.10.0.tgz", - "integrity": "sha512-/eVwNR4TG9Tm/dd+aHYLLaI0FLfYKlkTqKMkn78Ah/EYVzWd/zJIgpkdoFEKbhQJOGo8XN7/mWrTx0exp1c+Ug==", "license": "MIT", "peerDependencies": { "immer": ">=8.0.0", @@ -9303,8 +8752,6 @@ }, "node_modules/use-isomorphic-layout-effect": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -9317,8 +8764,6 @@ }, "node_modules/use-latest": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", - "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", "license": "MIT", "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" @@ -9334,8 +8779,6 @@ }, "node_modules/use-sync-external-store": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" @@ -9343,14 +8786,10 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -9361,278 +8800,238 @@ } }, "node_modules/victory-area": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-36.9.2.tgz", - "integrity": "sha512-32aharvPf2RgdQB+/u1j3/ajYFNH/7ugLX9ZRpdd65gP6QEbtXL+58gS6CxvFw6gr/y8a0xMlkMKkpDVacXLpw==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2", - "victory-vendor": "^36.9.2" + "victory-core": "^37.0.2", + "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-axis": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-36.9.2.tgz", - "integrity": "sha512-4Odws+IAjprJtBg2b2ZCxEPgrQ6LgIOa22cFkGghzOSfTyNayN4M3AauNB44RZyn2O/hDiM1gdBkEg1g9YDevQ==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-bar": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-36.9.2.tgz", - "integrity": "sha512-R3LFoR91FzwWcnyGK2P8DHNVv9gsaWhl5pSr2KdeNtvLbZVEIvUkTeVN9RMBMzterSFPw0mbWhS1Asb3sV6PPw==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2", - "victory-vendor": "^36.9.2" + "victory-core": "^37.0.2", + "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-box-plot": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-36.9.2.tgz", - "integrity": "sha512-nUD45V/YHDkAKZyak7YDsz+Vk1F9N0ica3jWQe0AY0JqD9DleHa8RY/olSVws26kLyEj1I+fQqva6GodcLaIqQ==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2", - "victory-vendor": "^36.9.2" + "victory-core": "^37.0.2", + "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-brush-container": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-36.9.2.tgz", - "integrity": "sha512-KcQjzFeo40tn52cJf1A02l5MqeR9GKkk3loDqM3T2hfi1PCyUrZXEUjGN5HNlLizDRvtcemaAHNAWlb70HbG/g==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "^36.9.2" + "victory-core": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-chart": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-36.9.2.tgz", - "integrity": "sha512-dMNcS0BpqL3YiGvI4BSEmPR76FCksCgf3K4CSZ7C/MGyrElqB6wWwzk7afnlB1Qr71YIHXDmdwsPNAl/iEwTtA==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-axis": "^36.9.2", - "victory-core": "^36.9.2", - "victory-polar-axis": "^36.9.2", - "victory-shared-events": "^36.9.2" + "victory-axis": "^37.0.2", + "victory-core": "^37.0.2", + "victory-polar-axis": "^37.0.2", + "victory-shared-events": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-create-container": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-36.9.2.tgz", - "integrity": "sha512-uA0dh1R0YDzuXyE/7StZvq4qshet+WYceY7R1UR5mR/F9079xy+iQsa2Ca4h97/GtVZoLO6r1eKLWBt9TN+U7A==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-brush-container": "^36.9.2", - "victory-core": "^36.9.2", - "victory-cursor-container": "^36.9.2", - "victory-selection-container": "^36.9.2", - "victory-voronoi-container": "^36.9.2", - "victory-zoom-container": "^36.9.2" + "victory-brush-container": "^37.0.2", + "victory-core": "^37.0.2", + "victory-cursor-container": "^37.0.2", + "victory-selection-container": "^37.0.2", + "victory-voronoi-container": "^37.0.2", + "victory-zoom-container": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-cursor-container": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-36.9.2.tgz", - "integrity": "sha512-jidab4j3MaciF3fGX70jTj4H9rrLcY8o2LUrhJ67ZLvEFGGmnPtph+p8Fe97Umrag7E/DszjNxQZolpwlgUh3g==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-group": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-36.9.2.tgz", - "integrity": "sha512-wBmpsjBTKva8mxHvHNY3b8RE58KtnpLLItEyyAHaYkmExwt3Uj8Cld3sF3vmeuijn2iR64NPKeMbgMbfZJzycw==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "^36.9.2", - "victory-shared-events": "^36.9.2" + "victory-core": "^37.0.2", + "victory-shared-events": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-legend": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-36.9.2.tgz", - "integrity": "sha512-cucFJpv6fty+yXp5pElQFQnHBk1TqA4guGUMI+XF/wLlnuM4bhdAtASobRIIBkz0mHGBaCAAV4PzL9azPU/9dg==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-line": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-36.9.2.tgz", - "integrity": "sha512-kmYFZUo0o2xC8cXRsmt/oUBRQSZJVT2IJnAkboUepypoj09e6CY5tRH4TSdfEDGkBk23xQkn7d4IFgl4kAGnSA==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2", - "victory-vendor": "^36.9.2" + "victory-core": "^37.0.2", + "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-pie": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-36.9.2.tgz", - "integrity": "sha512-i3zWezvy5wQEkhXKt4rS9ILGH7Vr9Q5eF9fKO4GMwDPBdYOTE3Dh2tVaSrfDC8g9zFIc0DKzOtVoJRTb+0AkPg==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2", - "victory-vendor": "^36.9.2" + "victory-core": "^37.0.2", + "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-polar-axis": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-36.9.2.tgz", - "integrity": "sha512-HBR90FF4M56yf/atXjSmy3DMps1vSAaLXmdVXLM/A5g+0pUS7HO719r5x6dsR3I6Rm+8x6Kk8xJs0qgpnGQIEw==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-scatter": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-36.9.2.tgz", - "integrity": "sha512-hK9AtbJQfaW05i8BH7Lf1HK7vWMAfQofj23039HEQJqTKbCL77YT+Q0LhZw1a1BRCpC/5aSg9EuqblhfIYw2wg==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-selection-container": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-36.9.2.tgz", - "integrity": "sha512-chboroEwqqVlMB60kveXM2WznJ33ZM00PWkFVCoJDzHHlYs7TCADxzhqet2S67SbZGSyvSprY2YztSxX8kZ+XQ==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-shared-events": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-36.9.2.tgz", - "integrity": "sha512-W/atiw3Or6MnpBuhluFv6007YrixIRh5NtiRvtFLGxNuQJLYjaSh6koRAih5xJer5Pj7YUx0tL9x67jTRcJ6Dg==", + "version": "37.0.2", "license": "MIT", "dependencies": { "json-stringify-safe": "^5.0.1", "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "^36.9.2" + "victory-core": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-stack": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-36.9.2.tgz", - "integrity": "sha512-imR6FniVlDFlBa/B3Est8kTryNhWj2ZNpivmVOebVDxkKcVlLaDg3LotCUOI7NzOhBQaro0UzeE9KmZV93JcYA==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "^36.9.2", - "victory-shared-events": "^36.9.2" + "victory-core": "^37.0.2", + "victory-shared-events": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-tooltip": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-36.9.2.tgz", - "integrity": "sha512-76seo4TWD1WfZHJQH87IP3tlawv38DuwrUxpnTn8+uW6/CUex82poQiVevYdmJzhataS9jjyCWv3w7pOmLBCLg==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-vendor": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", - "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "version": "37.0.2", "license": "MIT AND ISC", "dependencies": { "@types/d3-array": "^3.0.3", @@ -9652,29 +9051,25 @@ } }, "node_modules/victory-voronoi-container": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-36.9.2.tgz", - "integrity": "sha512-NIVYqck9N4OQnEz9mgQ4wILsci3OBWWK7RLuITGHyoD7Ne/+WH1i0Pv2y9eIx+f55rc928FUTugPPhkHvXyH3A==", + "version": "37.0.2", "license": "MIT", "dependencies": { "delaunay-find": "0.0.6", "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "^36.9.2", - "victory-tooltip": "^36.9.2" + "victory-core": "^37.0.2", + "victory-tooltip": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-zoom-container": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-36.9.2.tgz", - "integrity": "sha512-pXa2Ji6EX/pIarKT6Hcmmu2n7IG/x8Vs0D2eACQ/nbpvZa+DXWIxCRW4hcg2Va35fmXcDIEpGaX3/soXzZ+pbw==", + "version": "37.0.2", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" @@ -9682,8 +9077,6 @@ }, "node_modules/vite": { "version": "5.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", - "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", "dev": true, "license": "MIT", "dependencies": { @@ -9742,8 +9135,6 @@ }, "node_modules/vite-node": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", - "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9765,8 +9156,6 @@ }, "node_modules/vite-plugin-babel-macros": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/vite-plugin-babel-macros/-/vite-plugin-babel-macros-1.0.6.tgz", - "integrity": "sha512-7cCT8jtu5UjpE46pH7RyVltWw5FbhDAtQliZ6QGqRNR5RUZKdAsB0CDjuF+VBoDpnl0KuESPu22SoNqXRYYWyQ==", "license": "MIT", "dependencies": { "@babel/core": "^7.17.7", @@ -9784,8 +9173,6 @@ }, "node_modules/vite-plugin-istanbul": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/vite-plugin-istanbul/-/vite-plugin-istanbul-6.0.2.tgz", - "integrity": "sha512-0/sKwjEEIwbEyl43xX7onX3dIbMJAsigNsKyyVPalG1oRFo5jn3qkJbS2PUfp9wrr3piy1eT6qRoeeum2p4B2A==", "dev": true, "license": "MIT", "dependencies": { @@ -9800,20 +9187,36 @@ "vite": ">=4 <=6" } }, - "node_modules/vite-plugin-istanbul/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "node_modules/vite-plugin-istanbul/node_modules/test-exclude": { + "version": "6.0.0", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, "engines": { - "node": ">= 8" + "node": ">=8" + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/vitest": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", - "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", "dev": true, "license": "MIT", "dependencies": { @@ -9877,22 +9280,16 @@ }, "node_modules/warning": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/webgl-constants": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", - "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + "version": "1.1.1" }, "node_modules/webidl-conversions": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -9901,20 +9298,14 @@ }, "node_modules/webworker-promise": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/webworker-promise/-/webworker-promise-0.5.0.tgz", - "integrity": "sha512-14iR79jHAV7ozwvbfif+3wCaApT3I1g8Lo0rJZrwAu6wxZGx/08Y8KXz6as6ZLNUEEufeiEBBYrqyDBClXOsEw==", "license": "MIT" }, "node_modules/whatwg-fetch": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, "license": "MIT", "engines": { @@ -9923,8 +9314,6 @@ }, "node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -9933,14 +9322,10 @@ }, "node_modules/whatwg-url/node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -9955,15 +9340,11 @@ }, "node_modules/which-module": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true, "license": "ISC" }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -9979,8 +9360,6 @@ }, "node_modules/worker-loader": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz", - "integrity": "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", @@ -9999,8 +9378,6 @@ }, "node_modules/worker-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -10013,8 +9390,6 @@ }, "node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "license": "MIT", "dependencies": { @@ -10029,8 +9404,6 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10047,8 +9420,6 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -10063,8 +9434,6 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10076,15 +9445,11 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -10099,8 +9464,6 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10112,21 +9475,15 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "license": "ISC", "dependencies": { @@ -10138,8 +9495,6 @@ }, "node_modules/write-file-atomic/node_modules/typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10148,8 +9503,6 @@ }, "node_modules/xmlbuilder2": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.0.2.tgz", - "integrity": "sha512-h4MUawGY21CTdhV4xm3DG9dgsqyhDkZvVJBx88beqX8wJs3VgyGQgAn5VreHuae6unTQxh115aMK5InCVmOIKw==", "license": "MIT", "dependencies": { "@oozcitak/dom": "1.15.10", @@ -10164,8 +9517,6 @@ }, "node_modules/xmlbuilder2/node_modules/js-yaml": { "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -10177,8 +9528,6 @@ }, "node_modules/xss": { "version": "1.0.14", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", - "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", "license": "MIT", "dependencies": { "commander": "^2.20.3", @@ -10193,14 +9542,10 @@ }, "node_modules/xss/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, "node_modules/xtend": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", "dev": true, "engines": { "node": ">=0.4" @@ -10208,21 +9553,15 @@ }, "node_modules/y18n": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, "license": "ISC" }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "license": "ISC", "engines": { "node": ">= 6" @@ -10230,8 +9569,6 @@ }, "node_modules/yargs": { "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "license": "MIT", "dependencies": { @@ -10253,8 +9590,6 @@ }, "node_modules/yargs-parser": { "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 7cf98cf7e..88b897f88 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "@patternfly/react-log-viewer": "^5.2.0", "@patternfly/react-table": "^5.3.4", "@react-hook/resize-observer": "^2.0.1", - "@redux-devtools/extension": "^3.3.0", + "@reduxjs/toolkit": "^2.2.7", "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", @@ -102,6 +102,7 @@ "vite-plugin-babel-macros": "^1.0.6" }, "devDependencies": { + "@redux-devtools/extension": "^3.3.0", "@biomejs/biome": "1.8.3", "@faker-js/faker": "^8.4.0", "@playwright/test": "^1.41.2", diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index d4101e640..8ad8246a3 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -233,25 +233,6 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { ], ); - const modalTypeLabels: Record< - string, - { modalTitle: string; inputLabel: string } - > = { - group: { - modalTitle: "Create a new Group", - inputLabel: "Group Name", - }, - share: { - modalTitle: "Share this Folder", - inputLabel: "User Name", - }, - - default: { - modalTitle: "Create a new Folder", - inputLabel: "Folder Name", - }, - }; - return ( <> { /> @@ -315,6 +295,25 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { export default Operations; +const modalTypeLabels: Record< + string, + { modalTitle: string; inputLabel: string } +> = { + group: { + modalTitle: "Create a new Group", + inputLabel: "Group Name", + }, + share: { + modalTitle: "Share this Folder", + inputLabel: "User Name", + }, + + default: { + modalTitle: "Create a new Folder", + inputLabel: "Folder Name", + }, +}; + interface AddModalProps { operationType: string; isOpen: boolean; diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index e59942b2d..a0f1b3e3d 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -68,6 +68,7 @@ export const useFolderOperations = ( const currentPath = createFeed ? `home/${username}/uploads/${uniqueName}` : computedPath; + (""); dispatch( startUpload({ From f65bb5a4144c6b9b8a63edc747a36da6062bbdec Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 28 Aug 2024 14:49:28 -0400 Subject: [PATCH 142/337] feat: Update how titles are displayed in the ui --- src/components/ComputePage/index.tsx | 20 --- src/components/Dashboard/index.tsx | 33 +--- src/components/NewLibrary/index.tsx | 28 +--- src/components/PluginCatalog/index.tsx | 27 ---- src/components/Store/index.tsx | 64 ++++---- src/components/Wrapper/TitleComponent.tsx | 174 ++++++++++++++++++---- 6 files changed, 176 insertions(+), 170 deletions(-) diff --git a/src/components/ComputePage/index.tsx b/src/components/ComputePage/index.tsx index 656cbef6c..e8aa7376a 100644 --- a/src/components/ComputePage/index.tsx +++ b/src/components/ComputePage/index.tsx @@ -13,26 +13,6 @@ const ComputePage = () => { }, []); return ( - - -

- This page presents the available Compute environments - that are known to ChRIS. These denote computers and - clusters/clouds that can be selected to run various{" "} - plugins and pipelines. The special host{" "} - environment is always available and is the actual server that is - running ChRIS. It is generally not recommended to run intensive - computation on the host environment. Adding new{" "} - Compute to ChRIS is typically enabled by using the - separate ChRIS admin interface. -

- - } - /> -
diff --git a/src/components/Dashboard/index.tsx b/src/components/Dashboard/index.tsx index ab38a7415..22c8d59ad 100644 --- a/src/components/Dashboard/index.tsx +++ b/src/components/Dashboard/index.tsx @@ -1,47 +1,16 @@ import React from "react"; -import BUILD_VERSION from "../../getBuildVersion"; import { Grid, GridItem, PageSection } from "@patternfly/react-core"; -import { Typography } from "../Antd"; import WrapperConnect from "../Wrapper"; import { CatalogTile } from "@patternfly/react-catalog-view-extension"; -import { InfoIcon } from "../Common"; import "./dashboard.css"; -const { Paragraph } = Typography; - -interface DashboardProps { - children?: React.ReactNode; -} - -const DashboardPage = (props: DashboardProps) => { - const { children } = props; - +const DashboardPage = () => { React.useEffect(() => { document.title = "Overview"; }, []); return ( - - -

- Retrieve, analyze, and visualize any data using a - powerful cloud computing platform: ChRIS. - Let's get started. -

-

- Build: {BUILD_VERSION} -

- - } - /> - - {children} -
- diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index 23dd4ae43..9e4895593 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -163,28 +163,11 @@ const NewLibrary = () => { return ( - - -

- The Library provides a card-focused mechanism for browsing, - viewing, and interacting with data in the ChRIS system. A card - is analogous to a file or folder in a convention filesystem, and - multiple cards can be grouped into a shopping cart to allow for - bulk operations. Simply long press and release a card to add it - to the cart. Bulk operations include: Download (which - will copy all cart contents to your local filesystem),{" "} - Delete (which will permanently remove all data in the - cards from ChRIS), and Create which will seed a new - analysis with a new root node containing each card as a - subdirectory. -

- - } - /> - + { }} computedPath={computedPath} folderList={data?.folderList} + customStyle={{ toolbarItem: { paddingInlineStart: "0" } }} /> { React.useEffect(() => { document.title = "Analysis Catalog"; @@ -15,29 +11,6 @@ const CatalogPage = () => { return ( - - -

- ChRIS is a platform that runs Plugins. A plugin is a - single application (similar to apps on a mobile device). - Examples of ChRIS Plugins are applications that analyze - images (like{" "} - pl-fshack that - runs a neuro image analysis program called{" "} - FreeSurfer). - Other Plugins perform operations like zipping files, - converting medical images from DICOM to jpg, etc. On this page - you can browse Plugins available for you to use. For more - options, consult the{" "} - ChRIS store. -

- - } - /> -
diff --git a/src/components/Store/index.tsx b/src/components/Store/index.tsx index 34670f765..169848e96 100644 --- a/src/components/Store/index.tsx +++ b/src/components/Store/index.tsx @@ -334,54 +334,40 @@ const Store = () => { - +
- -

- This is a global store from where you can install your - plugins. -

- - } - /> You are currently viewing plugins fetched from{" "} {configureStoreValue || import.meta.env.VITE_CHRIS_STORE_URL} +
- -
- - { +const { Paragraph, Title } = Typography; + +// Component for displaying name and description +const InfoSection: React.FC<{ title: string; content: React.ReactNode }> = ({ + title, + content, +}) => {content}} />; + +// Feeds name component +const FeedsNameComponent: React.FC = () => { const { feedCount, loadingFeedState } = useFeedListData(); + const feedCountText = + !feedCount && loadingFeedState + ? "Fetching..." + : feedCount === -1 + ? 0 + : feedCount; return ( - - Analyses (aka ChRIS feeds) are computational experiments where data - are organized and processed by ChRIS plugins. In this view you may - view your analyses and also the ones shared with you. - - } + ); }; -const { Title } = Typography; -const FeedsDetailComponent = ({ id }: { id?: string }) => { +// Library name component +const LibraryNameComponent: React.FC = () => ( + + The Library provides a card-focused mechanism for browsing, viewing, and + interacting with data in the ChRIS system. A card is analogous to a file + or folder in a conventional filesystem, and multiple cards can be + grouped into a shopping cart to allow for bulk operations. Simply long + press and release a card to add it to the cart. Bulk operations include:{" "} + Download (which will copy all cart contents to your local + filesystem), Delete (which will permanently remove all data in + the cards from ChRIS), and Create which will seed a new analysis + with a new root node containing each card as a subdirectory. + + } + /> +); + +// Overview name component +const OverviewNameComponent: React.FC = () => ( + + Retrieve, analyze, and visualize any data using a powerful cloud + computing platform: ChRIS. Let's get started. +

+ Build: {BUILD_VERSION} +

+ + } + /> +); + +// Plugin catalog component +const PluginCatalogComponent: React.FC = () => ( + + ChRIS is a platform that runs Plugins. A plugin is a single + application (similar to apps on a mobile device). Examples of + ChRIS Plugins are applications that analyze images (like{" "} + pl-fshack that runs a + neuro image analysis program called{" "} + FreeSurfer). Other{" "} + Plugins perform operations like zipping files, converting medical + images from DICOM to jpg, etc. On this page you can browse{" "} + Plugins available for you to use. For more options, consult the{" "} + ChRIS store. + + } + /> +); + +// Compute catalog component +const ComputeCatalogComponent: React.FC = () => ( + + This page presents the available Compute environments that are + known to ChRIS. These denote computers and clusters/clouds that can be + selected to run various plugins and pipelines. The special{" "} + host environment is always available and is the actual server + that is running ChRIS. It is generally not recommended to run intensive + computation on the host environment. Adding new Compute to + ChRIS is typically enabled by using the separate ChRIS admin interface. + + } + /> +); + +// Pipeline catalog component +const PipelineCatalogComponent: React.FC = () => ( + + Pipelines + +); + +// Store catalog component +const StoreCatalogComponent: React.FC = () => ( + +); + +// Configuration for path mappings +const pathToComponentMap: Record = { + "/feeds": FeedsNameComponent, + "/": OverviewNameComponent, + "/catalog": PluginCatalogComponent, + "/compute": ComputeCatalogComponent, + "/pipelines": PipelineCatalogComponent, + "/store": StoreCatalogComponent, +}; + +// Feeds detail component +const FeedsDetailComponent: React.FC<{ id?: string }> = ({ id }) => { const query = useSearchQueryParams(); const type = query.get("type"); const isLoggedIn = useTypedSelector((state) => state.user.isLoggedIn); @@ -47,22 +151,32 @@ const FeedsDetailComponent = ({ id }: { id?: string }) => { return ( <CodeBranchIcon style={{ marginRight: "0.25em" }} /> - {feed?.data.name} + <Tooltip content={feed?.data.name}> + <span>{elipses(feed?.data.name, 40)}</span> + </Tooltip> ); }; -const TitleComponent = () => { +// Title component to dynamically map location to the appropriate component +const TitleComponent: React.FC = () => { const location = useLocation(); - const match = matchPath("/feeds/:id", location.pathname); + // Check if the current location matches specific paths + const feedMatch = matchPath("/feeds/:id", location.pathname); + const libraryMatch = matchPath("/library/*", location.pathname); - if (match) { - const { id } = match.params; + if (feedMatch) { + const { id } = feedMatch.params; return ; } - return location.pathname === "/feeds" ? : null; + if (libraryMatch) { + return ; + } + + const Component = pathToComponentMap[location.pathname]; + return Component ? : null; }; export default TitleComponent; From e13bd0eed69881da4a5e9ad969d0ff2e068d9df0 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 28 Aug 2024 15:02:34 -0400 Subject: [PATCH 143/337] refactors: Miscellanous improvements --- src/components/Feeds/FeedListView.tsx | 7 ++++++- src/components/NewLibrary/components/Operations.tsx | 5 ++++- src/components/Wrapper/TitleComponent.tsx | 4 ++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 632465498..4ac3d1792 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -174,7 +174,12 @@ const TableSelectable: React.FC = () => { type: OperationContext.FEEDS, additionalKeys: [perPage, page, type, search, searchType], }} - customStyle={{ toolbarItem: { paddingInlineStart: "0" } }} + customStyle={{ + toolbarItem: { paddingInlineStart: "0" }, + toolbar: { + paddingTop: "0", + }, + }} /> {loadingFeedState ? ( diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index 8ad8246a3..3144eaafc 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -275,7 +275,10 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { hidden onChange={handleFolderChange} /> - + {toolbarItems} {location.pathname.startsWith("/library/") && ( diff --git a/src/components/Wrapper/TitleComponent.tsx b/src/components/Wrapper/TitleComponent.tsx index 548585f0a..6278e3cbc 100644 --- a/src/components/Wrapper/TitleComponent.tsx +++ b/src/components/Wrapper/TitleComponent.tsx @@ -148,6 +148,10 @@ const FeedsDetailComponent: React.FC<{ id?: string }> = ({ id }) => { const { feed } = useFetchFeed(id, type, isLoggedIn); + if (!feed) { + return null; + } + return ( <CodeBranchIcon style={{ marginRight: "0.25em" }} /> From 0c1304ae651ebd61c71f0dd2b51f2f8e34a531fc Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Wed, 28 Aug 2024 15:25:04 -0400 Subject: [PATCH 144/337] feat: List view as the default in the Library Table --- src/components/NewLibrary/components/LibraryTable.tsx | 10 +++++++--- src/components/NewLibrary/components/Operations.css | 7 ++++++- src/store/cart/cartSlice.ts | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 3037db207..540a2ebf3 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -40,8 +40,8 @@ interface TableProps { const columnNames = { name: "Name", - date: "Date", - owner: "Owner", + date: "Created", + owner: "Creator", size: "Size", }; @@ -168,7 +168,11 @@ const LibraryTable: React.FunctionComponent<TableProps> = ( <FileDetailView selectedFile={selectedFile} preview="large" /> )} </Drawer> - <Table aria-label="Simple table"> + <Table + className="library-table" + variant="compact" + aria-label="Simple table" + > <Caption>Data Library</Caption> <Thead> <Tr> diff --git a/src/components/NewLibrary/components/Operations.css b/src/components/NewLibrary/components/Operations.css index 38ac06190..b4498edba 100644 --- a/src/components/NewLibrary/components/Operations.css +++ b/src/components/NewLibrary/components/Operations.css @@ -1,3 +1,8 @@ .remove-toolbar-padding { padding-top: 0 !important; -} \ No newline at end of file +} + +.library-table.pf-v5-c-table.pf-m-compact tr:where(.pf-v5-c-table__tr):not(.pf-v5-c-table__expandable-row) { + --pf-v5-c-table--cell--PaddingTop: 0.75em; + --pf-v5-c-table--cell--PaddingBottom: 0.75em; + } \ No newline at end of file diff --git a/src/store/cart/cartSlice.ts b/src/store/cart/cartSlice.ts index 16af3aa41..cc696729f 100644 --- a/src/store/cart/cartSlice.ts +++ b/src/store/cart/cartSlice.ts @@ -9,7 +9,7 @@ import type { import { DownloadTypes } from "./types"; const initialState: ICartState = { - currentLayout: "grid", + currentLayout: "list", selectedPaths: [], openCart: false, folderDownloadStatus: {}, From 607e77aa43e3a1f99c660734dd0c1fb9c646f7ae Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Wed, 28 Aug 2024 15:47:28 -0400 Subject: [PATCH 145/337] refactor: Fix regression --- src/components/Feeds/FeedListView.tsx | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 4ac3d1792..5e42812b6 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -117,11 +117,7 @@ const TableSelectable: React.FC = () => { return ( <WrapperConnect> - <PageSection - style={{ paddingTop: "0.25em" }} - variant="dark" - className="feed-header" - > + <PageSection style={{ paddingTop: "0.25em" }} className="feed-header"> <div> <FeedSearch loading={loadingFeedState} @@ -165,10 +161,7 @@ const TableSelectable: React.FC = () => { </CreateFeedProvider> </div> </PageSection> - <PageSection - variant="dark" - style={{ paddingBlockStart: "0.5em", height: "100%" }} - > + <PageSection style={{ paddingBlockStart: "0.5em", height: "100%" }}> <Operations origin={{ type: OperationContext.FEEDS, From f70bc7b77aea7656c79388a9d683d8c277449148 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Wed, 28 Aug 2024 16:00:57 -0400 Subject: [PATCH 146/337] feat: Fix the title of the pages in light mode --- src/components/Common/index.tsx | 6 +++++- src/components/Wrapper/TitleComponent.tsx | 16 +++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/components/Common/index.tsx b/src/components/Common/index.tsx index 3e2f86c0a..d2346b39e 100644 --- a/src/components/Common/index.tsx +++ b/src/components/Common/index.tsx @@ -148,12 +148,16 @@ export const InfoIcon = ({ p2, p3, p4, + customStyle, }: { title: string; p1?: any; p2?: any; p3?: any; p4?: any; + customStyle?: { + [key: string]: React.CSSProperties; + }; }) => { const content = ( <Hint> @@ -166,7 +170,7 @@ export const InfoIcon = ({ return ( <div style={{ display: "flex" }}> - <Title level={4} style={{ marginBottom: 0 }}> + <Title level={4} style={{ ...customStyle?.title, marginBottom: 0 }}> {title} diff --git a/src/components/Wrapper/TitleComponent.tsx b/src/components/Wrapper/TitleComponent.tsx index 6278e3cbc..474a24d85 100644 --- a/src/components/Wrapper/TitleComponent.tsx +++ b/src/components/Wrapper/TitleComponent.tsx @@ -18,7 +18,17 @@ const { Paragraph, Title } = Typography; const InfoSection: React.FC<{ title: string; content: React.ReactNode }> = ({ title, content, -}) => {content}} />; +}) => ( + {content}} + /> +); // Feeds name component const FeedsNameComponent: React.FC = () => { @@ -117,7 +127,7 @@ const ComputeCatalogComponent: React.FC = () => ( // Pipeline catalog component const PipelineCatalogComponent: React.FC = () => ( - + <Title level={4} style={{ marginBottom: 0, color: "white" }}> Pipelines ); @@ -153,7 +163,7 @@ const FeedsDetailComponent: React.FC<{ id?: string }> = ({ id }) => { } return ( - + <Title level={4} style={{ marginBottom: 0, color: "white" }}> <CodeBranchIcon style={{ marginRight: "0.25em" }} /> <Tooltip content={feed?.data.name}> <span>{elipses(feed?.data.name, 40)}</span> From 812c345bae1cf5262770aad7765a0173750de443 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Wed, 28 Aug 2024 17:44:33 -0400 Subject: [PATCH 147/337] feat: Update the library page to show highlights to newly created resources --- .../NewLibrary/components/FileCard.tsx | 49 ++- .../NewLibrary/components/FolderCard.tsx | 31 +- .../NewLibrary/components/LibraryTable.tsx | 306 ++++++++++-------- src/components/NewLibrary/index.tsx | 6 +- 4 files changed, 245 insertions(+), 147 deletions(-) diff --git a/src/components/NewLibrary/components/FileCard.tsx b/src/components/NewLibrary/components/FileCard.tsx index b6fca2325..ef836af55 100644 --- a/src/components/NewLibrary/components/FileCard.tsx +++ b/src/components/NewLibrary/components/FileCard.tsx @@ -14,7 +14,7 @@ import { SplitItem, Tooltip, } from "@patternfly/react-core"; -import { format } from "date-fns"; +import { differenceInSeconds, format } from "date-fns"; import { isEmpty } from "lodash"; import type React from "react"; import { useContext, useEffect, useState } from "react"; @@ -192,14 +192,46 @@ export const SubFileCard: React.FC<SubFileCardProps> = ({ const { handlers } = useLongPress(); const [api, contextHolder] = notification.useNotification(); const [preview, setIsPreview] = useState(false); + const [isNewFile, setIsNewFile] = useState<boolean>(false); + const creationDate = file.data.creation_date; + const secondsSinceCreation = differenceInSeconds(new Date(), creationDate); + const [isNewFolder, setIsNewFolder] = useState<boolean>( + secondsSinceCreation <= 15, + ); const fileName = getFileName(file); const isSelected = selectedPaths.some( (payload) => payload.path === file.data.fname, ); - const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); + const shouldHighlight = isNewFolder || isSelected; + const selectedBgRow = getBackgroundRowColor(shouldHighlight, isDarkTheme); const ext = getFileExtension(file.data.fname); const icon = getIcon(ext, isDarkTheme); + useEffect(() => { + if (isNewFolder) { + const timeoutId = setTimeout(() => { + setIsNewFolder(false); + }, 2000); // 60 seconds + + // Cleanup the timeout if the component unmounts before the timeout completes + return () => clearTimeout(timeoutId); + } + }, [isNewFolder]); + + useEffect(() => { + const creationDate = new Date(file.data.creation_date); + const secondsSinceCreation = differenceInSeconds(new Date(), creationDate); + + if (secondsSinceCreation <= 15) { + setIsNewFile(true); + const timeoutId = setTimeout(() => { + setIsNewFile(false); + }, 2000); // 2 seconds + + return () => clearTimeout(timeoutId); + } + }, [file.data.creation_date]); + useEffect(() => { if (handleDownloadMutation.isSuccess) { api.success({ @@ -248,7 +280,9 @@ export const SubFileCard: React.FC<SubFileCardProps> = ({ name={fileName} date={file.data.creation_date} icon={icon} - bgRow={selectedBgRow} + bgRow={ + isNewFile ? getBackgroundRowColor(true, isDarkTheme) : selectedBgRow + } /> <Modal className="library-preview" @@ -289,6 +323,15 @@ export const SubLinkCard: React.FC<SubLinkCardProps> = ({ (payload) => payload.path === linkFile.data.path, ); const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); + + // Calculate if the link file is new + const creationDate = new Date(linkFile.data.creation_date); + const now = new Date(); + const secondsSinceCreation = Math.floor( + (now.getTime() - creationDate.getTime()) / 1000, + ); + const isNewLinkFile = secondsSinceCreation <= 2; // 2 seconds + const icon = <ExternalLinkSquareAltIcon />; useEffect(() => { diff --git a/src/components/NewLibrary/components/FolderCard.tsx b/src/components/NewLibrary/components/FolderCard.tsx index 9615bb120..a070a3c11 100644 --- a/src/components/NewLibrary/components/FolderCard.tsx +++ b/src/components/NewLibrary/components/FolderCard.tsx @@ -9,9 +9,9 @@ import { SplitItem, } from "@patternfly/react-core"; import { useQuery } from "@tanstack/react-query"; -import { format } from "date-fns"; +import { differenceInSeconds, format } from "date-fns"; import { isEmpty } from "lodash"; -import { useContext } from "react"; +import { useContext, useEffect, useState } from "react"; import { Fragment } from "react/jsx-runtime"; import ChrisAPIClient from "../../../api/chrisapiclient"; import { elipses } from "../../../api/common"; @@ -75,15 +75,29 @@ export const SubFolderCard: React.FC<SubFolderCardProps> = (props) => { const folderName = getFolderName(folder, computedPath); const creationDate = folder.data.creation_date; + const secondsSinceCreation = differenceInSeconds(new Date(), creationDate); + + const [isNewFolder, setIsNewFolder] = useState<boolean>( + secondsSinceCreation <= 15, + ); + + useEffect(() => { + if (isNewFolder) { + const timeoutId = setTimeout(() => { + setIsNewFolder(false); + }, 2000); // 60 seconds + + // Cleanup the timeout if the component unmounts before the timeout completes + return () => clearTimeout(timeoutId); + } + }, [isNewFolder]); const isSelected = selectedPaths.some( (payload) => payload.path === folder.data.path, ); - const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); - // When users create an analysis, they have a specific name in mind. Showing the user the underlying - // folder path (e.g., feed_98) can be confusing if the analysis is titled 'Freesurfer Analysis'. - // Therefore, we perform an additional fetch to display the feed folders with their title names. + const shouldHighlight = isNewFolder || isSelected; + const highlightedBgRow = getBackgroundRowColor(shouldHighlight, isDarkTheme); const feedMatches = folderName.match(/feed_(\d+)/); const { data, isLoading } = useQuery({ @@ -111,7 +125,10 @@ export const SubFolderCard: React.FC<SubFolderCardProps> = (props) => { }} > <Card - style={{ background: selectedBgRow, cursor: "pointer" }} + style={{ + background: highlightedBgRow, + cursor: "pointer", + }} isSelected={isSelected} isClickable isSelectable diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 540a2ebf3..418d41047 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -1,8 +1,6 @@ -import type { - FileBrowserFolder, - FileBrowserFolderFile, - FileBrowserFolderLinkFile, -} from "@fnndsc/chrisapi"; +import React, { useContext, useState, useEffect } from "react"; +import { useNavigate } from "react-router"; +import { useTypedSelector } from "../../../store/hooks"; import { Button } from "@patternfly/react-core"; import { Caption, @@ -14,10 +12,12 @@ import { Tr, } from "@patternfly/react-table"; import { Drawer } from "antd"; -import { format } from "date-fns"; -import React, { useContext, useState } from "react"; -import { useNavigate } from "react-router"; -import { useTypedSelector } from "../../../store/hooks"; +import { differenceInSeconds, format } from "date-fns"; +import type { + FileBrowserFolder, + FileBrowserFolderFile, + FileBrowserFolderLinkFile, +} from "@fnndsc/chrisapi"; import { getIcon } from "../../Common"; import { ThemeContext } from "../../DarkTheme/useTheme"; import { formatBytes } from "../../Feeds/utilties"; @@ -45,111 +45,146 @@ const columnNames = { size: "Size", }; -const LibraryTable: React.FunctionComponent<TableProps> = ( - props: TableProps, -) => { +interface RowProps { + resource: + | FileBrowserFolder + | FileBrowserFolderFile + | FileBrowserFolderLinkFile; + name: string; + date: string; + owner: string; + size: number; + type: "folder" | "file" | "link"; + computedPath: string; + handleFolderClick: (folderName: string) => void; + handleFileClick: (file: FileBrowserFolderFile) => void; +} + +const BaseRow: React.FC<RowProps> = ({ + resource, + name, + date, + owner, + size, + type, + computedPath, + handleFolderClick, + handleFileClick, +}) => { const navigate = useNavigate(); const { handlers } = useLongPress(); const { handleOnClick } = handlers; const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const isDarkTheme = useContext(ThemeContext).isDarkTheme; - const { data, computedPath, handleFolderClick } = props; - const [preview, setShowPreview] = useState(false); - const [selectedFile, setSelectedFile] = useState<FileBrowserFolderFile>(); + const secondsSinceCreation = differenceInSeconds(new Date(), date); + const [isNewResource, setIsNewResource] = useState<boolean>( + secondsSinceCreation <= 15, + ); - const renderRow = ( - resource: - | FileBrowserFolder - | FileBrowserFolderFile - | FileBrowserFolderLinkFile, - name: string, - date: string, - owner: string, - size: number, - type: string, - ) => { - const isSelected = - selectedPaths.length > 0 && - selectedPaths.some((payload) => { - if (type === "folder" || type === "link") { - return payload.path === resource.data.path; - } - - if (type === "file") { - return payload.path === resource.data.fname; - } - }); - const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); - const icon = getIcon(type, isDarkTheme, { - marginRight: "0.25em", - }); + useEffect(() => { + if (isNewResource) { + const timeoutId = setTimeout(() => { + setIsNewResource(false); + }, 2000); - const handleItem = ( - item: - | FileBrowserFolderFile - | FileBrowserFolder - | FileBrowserFolderLinkFile, - type: string, - ) => { - if (type === "folder") { - handleFolderClick(name); - } + return () => clearTimeout(timeoutId); + } + }, [isNewResource]); - if (type === "link") { - navigate(item.data.path); + const isSelected = + selectedPaths.length > 0 && + selectedPaths.some((payload) => { + if (type === "folder" || type === "link") { + return payload.path === resource.data.path; } - if (type === "file") { - // Show preview - setSelectedFile(resource as FileBrowserFolderFile); - setShowPreview(true); + return payload.path === resource.data.fname; } - }; + }); - const path = type === "file" ? resource.data.fname : resource.data.path; + const shouldHighlight = isNewResource || isSelected; + const highlightedBgRow = getBackgroundRowColor(shouldHighlight, isDarkTheme); + const icon = getIcon(type, isDarkTheme, { + marginRight: "0.25em", + }); - return ( - <FolderContextMenu - origin={{ - type: OperationContext.LIBRARY, - additionalKeys: [computedPath], + const handleItem = () => { + if (type === "folder") { + handleFolderClick(name); + } else if (type === "link") { + navigate(resource.data.path); + } else if (type === "file") { + handleFileClick(resource as FileBrowserFolderFile); + } + }; + + const path = type === "file" ? resource.data.fname : resource.data.path; + + return ( + <FolderContextMenu + origin={{ + type: OperationContext.LIBRARY, + additionalKeys: [computedPath], + }} + key={path} + > + <Tr + style={{ background: highlightedBgRow }} + onClick={(e) => { + handleOnClick(e, resource, path, type); + }} + onContextMenu={(e) => { + handleOnClick(e, resource, path, type); }} - key={path} > - <Tr - style={{ background: selectedBgRow }} - onClick={(e) => { - handleOnClick(e, resource, path, type); - }} - onContextMenu={(e) => { - handleOnClick(e, resource, path, type); - }} - key={name} - > - <Td dataLabel={columnNames.name}> - <Button - onClick={(e) => { - e.stopPropagation(); - handleItem(resource, type); - }} - style={{ padding: 0 }} - icon={icon} - variant="link" - > - {name} - </Button> - </Td> - <Td dataLabel={columnNames.date}> - {" "} - {format(new Date(date), "dd MMM yyyy, HH:mm")} - </Td> - <Td dataLabel={columnNames.owner}>{owner}</Td> - <Td dataLabel={columnNames.size}> - {size > 0 ? formatBytes(size, 0) : " "} - </Td> - </Tr> - </FolderContextMenu> - ); + <Td dataLabel={columnNames.name}> + <Button + onClick={(e) => { + e.stopPropagation(); + handleItem(); + }} + style={{ padding: 0 }} + icon={icon} + variant="link" + > + {name} + </Button> + </Td> + <Td dataLabel={columnNames.date}> + {format(new Date(date), "dd MMM yyyy, HH:mm")} + </Td> + <Td dataLabel={columnNames.owner}>{owner}</Td> + <Td dataLabel={columnNames.size}> + {size > 0 ? formatBytes(size, 0) : " "} + </Td> + </Tr> + </FolderContextMenu> + ); +}; + +const FolderRow: React.FC<Omit<RowProps, "type">> = (props) => ( + <BaseRow {...props} type="folder" /> +); + +const FileRow: React.FC<Omit<RowProps, "type">> = (props) => ( + <BaseRow {...props} type="file" /> +); + +const LinkRow: React.FC<Omit<RowProps, "type">> = (props) => ( + <BaseRow {...props} type="link" /> +); + +const LibraryTable: React.FC<TableProps> = ({ + data, + computedPath, + handleFolderClick, +}) => { + const [preview, setShowPreview] = useState(false); + const [selectedFile, setSelectedFile] = useState<FileBrowserFolderFile>(); + + const handleFileClick = (file: FileBrowserFolderFile) => { + setSelectedFile(file); + setShowPreview(true); }; return ( @@ -183,40 +218,45 @@ const LibraryTable: React.FunctionComponent<TableProps> = ( </Tr> </Thead> <Tbody> - {data.folders.map((resource: FileBrowserFolder) => { - const folderName = getFolderName(resource, computedPath); - return renderRow( - resource, - folderName, - resource.data.creation_date, - " ", - // Size of the folder is not available yet - 0, - "folder", - ); - })} - {data.files.map((resource: FileBrowserFolderFile) => { - const fileName = getFileName(resource); - return renderRow( - resource, - fileName, - resource.data.creation_date, - resource.data.owner_username, - resource.data.fsize, - "file", - ); - })} - {data.linkFiles.map((resource: FileBrowserFolderLinkFile) => { - const fileName = getLinkFileName(resource); - return renderRow( - resource, - fileName, - resource.data.creation_date, - resource.data.owner_username, - resource.data.fsize, - "link", - ); - })} + {data.folders.map((resource: FileBrowserFolder) => ( + <FolderRow + key={resource.data.path} + resource={resource} + name={getFolderName(resource, computedPath)} + date={resource.data.creation_date} + owner=" " + size={0} + computedPath={computedPath} + handleFolderClick={handleFolderClick} + handleFileClick={handleFileClick} + /> + ))} + {data.files.map((resource: FileBrowserFolderFile) => ( + <FileRow + key={resource.data.fname} + resource={resource} + name={getFileName(resource)} + date={resource.data.creation_date} + owner={resource.data.owner_username} + size={resource.data.fsize} + computedPath={computedPath} + handleFolderClick={handleFolderClick} + handleFileClick={handleFileClick} + /> + ))} + {data.linkFiles.map((resource: FileBrowserFolderLinkFile) => ( + <LinkRow + key={resource.data.path} + resource={resource} + name={getLinkFileName(resource)} + date={resource.data.creation_date} + owner={resource.data.owner_username} + size={resource.data.fsize} + computedPath={computedPath} + handleFolderClick={handleFolderClick} + handleFileClick={handleFileClick} + /> + ))} </Tbody> </Table> </React.Fragment> diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index 9e4895593..8c328779b 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -10,8 +10,8 @@ import { useEffect, useRef, useState } from "react"; import { useLocation, useNavigate } from "react-router"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useTypedSelector } from "../../store/hooks"; -import { Alert, Typography } from "../Antd"; -import { EmptyStateComponent, InfoIcon, SpinContainer } from "../Common"; +import { Alert } from "../Antd"; +import { EmptyStateComponent, SpinContainer } from "../Common"; import WrapperConnect from "../Wrapper"; import BreadcrumbContainer from "./components/BreadcrumbContainer"; import { FilesCard, LinkCard } from "./components/FileCard"; @@ -20,8 +20,6 @@ import LibraryTable from "./components/LibraryTable"; import Operations from "./components/Operations"; import { OperationContext } from "./context"; -const { Paragraph } = Typography; - const NewLibrary = () => { // Fetch folders from the server async function fetchFolders(computedPath: string, pageNumber: number) { From c37b228ee5a909192acb23ce28bb314136a336be Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 29 Aug 2024 09:31:50 -0400 Subject: [PATCH 148/337] Add a tag to newly created resources in the library --- src/app.css | 2 +- .../NewLibrary/components/LibraryTable.tsx | 37 +++++++++++++------ .../NewLibrary/components/Operations.css | 4 +- src/components/Wrapper/Toolbar.tsx | 4 +- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/app.css b/src/app.css index 825e3930a..c4e62affd 100644 --- a/src/app.css +++ b/src/app.css @@ -43,7 +43,7 @@ } .pf-v5-c-page__main-section { - padding-block-start: 0.5em; + padding-block-start: 0; } .pf-v5-c-page__sidebar { diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 418d41047..dcdb44e83 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -1,6 +1,8 @@ -import React, { useContext, useState, useEffect } from "react"; -import { useNavigate } from "react-router"; -import { useTypedSelector } from "../../../store/hooks"; +import type { + FileBrowserFolder, + FileBrowserFolderFile, + FileBrowserFolderLinkFile, +} from "@fnndsc/chrisapi"; import { Button } from "@patternfly/react-core"; import { Caption, @@ -11,13 +13,11 @@ import { Thead, Tr, } from "@patternfly/react-table"; -import { Drawer } from "antd"; +import { Drawer, Tag } from "antd"; import { differenceInSeconds, format } from "date-fns"; -import type { - FileBrowserFolder, - FileBrowserFolderFile, - FileBrowserFolderLinkFile, -} from "@fnndsc/chrisapi"; +import React, { useContext, useState, useEffect, useRef } from "react"; +import { useNavigate } from "react-router"; +import { useTypedSelector } from "../../../store/hooks"; import { getIcon } from "../../Common"; import { ThemeContext } from "../../DarkTheme/useTheme"; import { formatBytes } from "../../Feeds/utilties"; @@ -76,16 +76,23 @@ const BaseRow: React.FC<RowProps> = ({ const { handleOnClick } = handlers; const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const isDarkTheme = useContext(ThemeContext).isDarkTheme; - const secondsSinceCreation = differenceInSeconds(new Date(), date); + const rowRef = useRef<HTMLTableRowElement>(null); // Create a ref for the row + + const secondsSinceCreation = differenceInSeconds(new Date(), new Date(date)); const [isNewResource, setIsNewResource] = useState<boolean>( secondsSinceCreation <= 15, ); useEffect(() => { - if (isNewResource) { + if (isNewResource && rowRef.current) { + rowRef.current.scrollIntoView({ + behavior: "smooth", + block: "center", + }); + const timeoutId = setTimeout(() => { setIsNewResource(false); - }, 2000); + }, 10000); return () => clearTimeout(timeoutId); } @@ -129,6 +136,7 @@ const BaseRow: React.FC<RowProps> = ({ key={path} > <Tr + ref={rowRef} // Attach the ref to the row style={{ background: highlightedBgRow }} onClick={(e) => { handleOnClick(e, resource, path, type); @@ -149,6 +157,11 @@ const BaseRow: React.FC<RowProps> = ({ > {name} </Button> + {isNewResource && ( + <Tag style={{ marginLeft: "0.25em" }} color="#3E8635"> + Recently Added + </Tag> + )} </Td> <Td dataLabel={columnNames.date}> {format(new Date(date), "dd MMM yyyy, HH:mm")} diff --git a/src/components/NewLibrary/components/Operations.css b/src/components/NewLibrary/components/Operations.css index b4498edba..773a7ba56 100644 --- a/src/components/NewLibrary/components/Operations.css +++ b/src/components/NewLibrary/components/Operations.css @@ -3,6 +3,6 @@ } .library-table.pf-v5-c-table.pf-m-compact tr:where(.pf-v5-c-table__tr):not(.pf-v5-c-table__expandable-row) { - --pf-v5-c-table--cell--PaddingTop: 0.75em; - --pf-v5-c-table--cell--PaddingBottom: 0.75em; + --pf-v5-c-table--cell--PaddingTop: 1em; + --pf-v5-c-table--cell--PaddingBottom: 1em; } \ No newline at end of file diff --git a/src/components/Wrapper/Toolbar.tsx b/src/components/Wrapper/Toolbar.tsx index 28feae7f2..e1255c86a 100644 --- a/src/components/Wrapper/Toolbar.tsx +++ b/src/components/Wrapper/Toolbar.tsx @@ -135,7 +135,7 @@ const ToolbarComponent: React.FC<ToolbarComponentProps> = ( ) : ( <> <Button - style={{ padding: "0" }} + style={{ padding: "0.25em" }} variant="link" onClick={() => { navigate( @@ -146,7 +146,7 @@ const ToolbarComponent: React.FC<ToolbarComponentProps> = ( Login </Button> <Button - style={{ padding: "0" }} + style={{ padding: "0.25em" }} variant="link" onClick={() => navigate("/signup")} > From 65eb2b03897ffcce585aa8aadd11c73a6277031d Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 29 Aug 2024 11:19:17 -0400 Subject: [PATCH 149/337] feat: Rewworking file and folder selections with checkboxes --- src/components/Feeds/FeedListView.tsx | 15 ++++- src/components/Feeds/useFeedListData.tsx | 2 +- .../NewLibrary/components/FileCard.tsx | 28 ++++++---- .../NewLibrary/components/FolderCard.tsx | 12 +++- .../NewLibrary/components/LibraryTable.tsx | 56 ++++++++++++++----- src/components/NewLibrary/utils/longpress.tsx | 44 ++++++++++----- .../Preview/displays/DcmDisplay.tsx | 3 +- 7 files changed, 113 insertions(+), 47 deletions(-) diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 5e42812b6..6fe615fb6 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -238,7 +238,7 @@ const TableRow: React.FC<TableRowProps> = ({ }) => { const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { handlers } = useLongPress(); - const { handleOnClick } = handlers; + const { handleOnClick, isMenuOpen } = handlers; const navigate = useNavigate(); const [intervalMs, setIntervalMs] = useState(2000); const { isDarkTheme } = useContext(ThemeContext); @@ -298,6 +298,7 @@ const TableRow: React.FC<TableRowProps> = ({ key={feed.data.id} style={{ backgroundColor: selectedBgRow, + cursor: "pointer", }} data-test-id={`${feed.data.name}-test`} onContextMenu={async (e) => { @@ -305,8 +306,13 @@ const TableRow: React.FC<TableRowProps> = ({ handleOnClick(e, payload, feed.data.folder_path, "folder"); }} onClick={async (e) => { - const payload = await getFolderForThisFeed(); - handleOnClick(e, payload, feed.data.folder_path, "folder"); + e.stopPropagation(); + if (e.ctrlKey || isMenuOpen) { + const payload = await getFolderForThisFeed(); + handleOnClick(e, payload, feed.data.folder_path, "folder"); + } else { + onFeedNameClick(); + } }} > <Td> @@ -441,6 +447,9 @@ const FeedInfoColumn = ({ e.stopPropagation(); onClick(feed); }} + style={{ + padding: 0, + }} > {feed.data.name} </Button> diff --git a/src/components/Feeds/useFeedListData.tsx b/src/components/Feeds/useFeedListData.tsx index 8c0383cbc..1ce002acf 100644 --- a/src/components/Feeds/useFeedListData.tsx +++ b/src/components/Feeds/useFeedListData.tsx @@ -13,7 +13,7 @@ const useSearchQuery = (query: URLSearchParams) => ({ page: query.get("page") || "1", search: query.get("search") || "", searchType: query.get("searchType") || "name", - perPage: query.get("perPage") || "18", + perPage: query.get("perPage") || "20", type: query.get("type") || "public", }); diff --git a/src/components/NewLibrary/components/FileCard.tsx b/src/components/NewLibrary/components/FileCard.tsx index ef836af55..69143a2f3 100644 --- a/src/components/NewLibrary/components/FileCard.tsx +++ b/src/components/NewLibrary/components/FileCard.tsx @@ -254,8 +254,14 @@ export const SubFileCard: React.FC<SubFileCardProps> = ({ handleDownloadMutation, ]); - const handleClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => - handlers.handleOnClick(e, file, file.data.fname, "file"); + const handleClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => { + e.stopPropagation(); + if (e.ctrlKey || handlers.isMenuOpen) { + handlers.handleOnClick(e, file, file.data.fname, "file"); + } else { + setIsPreview(!preview); + } + }; const handleCheckboxChange = (e: React.FormEvent<HTMLInputElement>) => { e.stopPropagation(); @@ -324,14 +330,6 @@ export const SubLinkCard: React.FC<SubLinkCardProps> = ({ ); const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); - // Calculate if the link file is new - const creationDate = new Date(linkFile.data.creation_date); - const now = new Date(); - const secondsSinceCreation = Math.floor( - (now.getTime() - creationDate.getTime()) / 1000, - ); - const isNewLinkFile = secondsSinceCreation <= 2; // 2 seconds - const icon = <ExternalLinkSquareAltIcon />; useEffect(() => { @@ -356,8 +354,14 @@ export const SubLinkCard: React.FC<SubLinkCardProps> = ({ handleDownloadMutation, ]); - const handleClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => - handlers.handleOnClick(e, linkFile, linkFile.data.path, "linkFile"); + const handleClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => { + e.stopPropagation(); + if (e.ctrlKey || handlers.isMenuOpen) { + handlers.handleOnClick(e, linkFile, linkFile.data.path, "linkFile"); + } else { + navigate(linkFile.data.path); + } + }; const handleCheckboxChange = (e: React.FormEvent<HTMLInputElement>) => { e.stopPropagation(); diff --git a/src/components/NewLibrary/components/FolderCard.tsx b/src/components/NewLibrary/components/FolderCard.tsx index a070a3c11..8f0c2b033 100644 --- a/src/components/NewLibrary/components/FolderCard.tsx +++ b/src/components/NewLibrary/components/FolderCard.tsx @@ -71,7 +71,8 @@ export const SubFolderCard: React.FC<SubFolderCardProps> = (props) => { const isDarkTheme = useContext(ThemeContext).isDarkTheme; const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { handlers } = useLongPress(); - const { handleOnClick, handleOnMouseDown, handleCheckboxChange } = handlers; + const { handleOnClick, handleOnMouseDown, handleCheckboxChange, isMenuOpen } = + handlers; const folderName = getFolderName(folder, computedPath); const creationDate = folder.data.creation_date; @@ -134,7 +135,14 @@ export const SubFolderCard: React.FC<SubFolderCardProps> = (props) => { isSelectable isCompact isFlat - onClick={(e) => handleOnClick(e, folder, folder.data.path, "folder")} + onClick={(e) => { + e.stopPropagation(); + if (e.ctrlKey || isMenuOpen) { + handleOnClick(e, folder, folder.data.path, "folder"); + } else { + handleFolderClick(folderName); + } + }} onContextMenu={(e) => handleOnClick(e, folder, folder.data.path, "folder") } diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index dcdb44e83..be4c8d5e9 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -3,7 +3,7 @@ import type { FileBrowserFolderFile, FileBrowserFolderLinkFile, } from "@fnndsc/chrisapi"; -import { Button } from "@patternfly/react-core"; +import { Button, Checkbox } from "@patternfly/react-core"; import { Caption, Table, @@ -15,7 +15,7 @@ import { } from "@patternfly/react-table"; import { Drawer, Tag } from "antd"; import { differenceInSeconds, format } from "date-fns"; -import React, { useContext, useState, useEffect, useRef } from "react"; +import React, { useContext, useEffect, useRef, useState } from "react"; import { useNavigate } from "react-router"; import { useTypedSelector } from "../../../store/hooks"; import { getIcon } from "../../Common"; @@ -73,7 +73,7 @@ const BaseRow: React.FC<RowProps> = ({ }) => { const navigate = useNavigate(); const { handlers } = useLongPress(); - const { handleOnClick } = handlers; + const { handleOnClick, handleCheckboxChange, isMenuOpen } = handlers; const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const isDarkTheme = useContext(ThemeContext).isDarkTheme; const rowRef = useRef<HTMLTableRowElement>(null); // Create a ref for the row @@ -112,7 +112,7 @@ const BaseRow: React.FC<RowProps> = ({ const shouldHighlight = isNewResource || isSelected; const highlightedBgRow = getBackgroundRowColor(shouldHighlight, isDarkTheme); const icon = getIcon(type, isDarkTheme, { - marginRight: "0.25em", + marginRight: "0.5em", }); const handleItem = () => { @@ -125,7 +125,10 @@ const BaseRow: React.FC<RowProps> = ({ } }; - const path = type === "file" ? resource.data.fname : resource.data.path; + const path = + type === "file" || type === "link" + ? resource.data.fname + : resource.data.path; return ( <FolderContextMenu @@ -137,21 +140,47 @@ const BaseRow: React.FC<RowProps> = ({ > <Tr ref={rowRef} // Attach the ref to the row - style={{ background: highlightedBgRow }} + style={{ background: highlightedBgRow, cursor: "pointer" }} onClick={(e) => { - handleOnClick(e, resource, path, type); + e.stopPropagation(); + if (e.ctrlKey || isMenuOpen) { + handleOnClick(e, resource, path, type); + } else { + handleItem(); + } }} onContextMenu={(e) => { handleOnClick(e, resource, path, type); }} > - <Td dataLabel={columnNames.name}> + <Td + style={{ + paddingInlineEnd: 0, + }} + > + <Checkbox + name={name} + isChecked={isSelected} + id="Select Resources" + aria-label="Select resources" + onClick={(e) => e.stopPropagation()} + onChange={(event) => { + handleCheckboxChange(event, path, resource, type); + }} + /> + </Td> + <Td + style={{ + paddingInlineStart: 0, + }} + dataLabel={columnNames.name} + > <Button onClick={(e) => { e.stopPropagation(); handleItem(); }} - style={{ padding: 0 }} + style={{ padding: "0.25em" }} icon={icon} variant="link" > @@ -224,10 +253,11 @@ const LibraryTable: React.FC<TableProps> = ({ <Caption>Data Library</Caption> <Thead> <Tr> - <Th>{columnNames.name}</Th> - <Th>{columnNames.date}</Th> - <Th>{columnNames.owner}</Th> - <Th>{columnNames.size}</Th> + <Th arial-label="Select a row" /> + <Th name="name">{columnNames.name}</Th> + <Th name="date">{columnNames.date}</Th> + <Th name="owner">{columnNames.owner}</Th> + <Th name="size">{columnNames.size}</Th> </Tr> </Thead> <Tbody> diff --git a/src/components/NewLibrary/utils/longpress.tsx b/src/components/NewLibrary/utils/longpress.tsx index c94dee588..677b32645 100644 --- a/src/components/NewLibrary/utils/longpress.tsx +++ b/src/components/NewLibrary/utils/longpress.tsx @@ -24,15 +24,14 @@ export function elipses(str: string, len: number) { export default function useLongPress() { const dispatch = useDispatch(); const [action, setAction] = useState<string>(); + const [isMenuOpen, setIsMenuOpen] = useState<boolean>(false); // Track menu state const state = useTypedSelector((state) => state.cart); const timerRef = useRef<ReturnType<typeof window.setTimeout>>(); const isLongPress = useRef<boolean>(); - const { selectedPaths } = state; function startPressTimer() { isLongPress.current = false; - //@ts-ignore timerRef.current = window.setTimeout(() => { isLongPress.current = true; @@ -59,18 +58,40 @@ export default function useLongPress() { type: string, ) { const isExist = selectedPaths.some((item) => item.path === pathForCart); - if (e.type === "contextmenu") { - // Handle right-click (context menu) + + // Handle Ctrl + Click for selection + if (e.type === "click" && (e as React.MouseEvent).ctrlKey) { + e.preventDefault(); + if (!isExist) { + selectFolder(pathForCart, type, payload); + } else { + deselectFolder(pathForCart); + } + } else if (e.type === "contextmenu") { e.preventDefault(); // Prevent the default context menu from appearing + if (!isExist) { selectFolder(pathForCart, type, payload); } + + // Toggle the menu state + setIsMenuOpen((prev) => { + if (prev) { + deselectFolder(pathForCart); + } + return !prev; + }); } else { - // Handle every click on the card if (!isExist) { selectFolder(pathForCart, type, payload); } else { - deselectFolder(pathForCart); + // If menu was open, deselect and close menu on row click + if (isMenuOpen) { + deselectFolder(pathForCart); + setIsMenuOpen(false); + } else { + deselectFolder(pathForCart); + } } } } @@ -86,15 +107,9 @@ export default function useLongPress() { ) => { e.stopPropagation(); if (e.currentTarget.checked) { - dispatch( - setSelectedPaths({ - path, - type, - payload, - }), - ); + selectFolder(path, type, payload); } else { - dispatch(clearSelectedPaths(path)); + deselectFolder(path); } }; @@ -124,6 +139,7 @@ export default function useLongPress() { handleOnTouchStart, handleOnTouchEnd, handleCheckboxChange, + isMenuOpen, }, }; } diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index ca9b30767..f073a35b2 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -70,8 +70,8 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { useEffect(() => { //Global registration needs to happen once registerToolingOnce(); - return () => { + renderingEngine?.destroy(); removeTools(); cleanupCornerstoneTooling(); }; @@ -82,7 +82,6 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { if (file && blob) { let imageID: string; const extension = getFileExtension(file.data.fname); - renderingEngine?.destroy(); await basicInit(); setUpTooling(uniqueId); if (extension === "dcm") { From c2c2405ba92117a24bf71c5614aa5f68c1cc1489 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 29 Aug 2024 12:10:44 -0400 Subject: [PATCH 150/337] feat: Use Helper Functions in the File Browser Table --- .../FeedOutputBrowser/FileBrowser.tsx | 82 +++++++++++++++++-- .../NewLibrary/components/LibraryTable.tsx | 7 +- 2 files changed, 77 insertions(+), 12 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 58078adfc..93bbfe6d6 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -1,6 +1,7 @@ import type { FileBrowserFolder, FileBrowserFolderFile, + FileBrowserFolderLinkFile, } from "@fnndsc/chrisapi"; import { Breadcrumb, @@ -18,6 +19,10 @@ import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; import { format } from "date-fns"; import { useContext, useEffect } from "react"; import { useDispatch } from "react-redux"; +import { + getFileName, + getLinkFileName, +} from "../NewLibrary/components/FileCard"; import { getFileExtension } from "../../api/model"; import { setFilePreviewPanel } from "../../store/drawer/drawerSlice"; import { @@ -32,6 +37,12 @@ import { DrawerActionButton } from "../Feeds/DrawerUtils"; import { handleMaximize, handleMinimize } from "../Feeds/utilties"; import { HomeIcon } from "../Icons"; import { FolderContextMenu } from "../NewLibrary/components/ContextMenu"; +import { getFolderName } from "../NewLibrary/components/FolderCard"; +import { + FolderRow, + FileRow, + LinkRow, +} from "../NewLibrary/components/LibraryTable"; import Operations from "../NewLibrary/components/Operations"; import { OperationContext } from "../NewLibrary/context"; import useLongPress, { @@ -342,17 +353,70 @@ const FileBrowser = (props: FileBrowserProps) => { <SpinContainer title="Fetching Files for this path..." /> ) : ( <Tbody> - {folderFiles.map((folderFile) => { - const component = tableRowItem(folderFile, "file"); - return component; + {folderFiles.map((resource: FileBrowserFolderFile) => { + return ( + <FileRow + key={resource.data.fname} + resource={resource} + name={getFileName(resource)} + date={resource.data.creation_date} + owner={resource.data.owner_username} + size={resource.data.fsize} + computedPath={path} + handleFolderClick={() => { + return; + }} + handleFileClick={() => { + toggleAnimation(); + dispatch( + setSelectedFile( + resource as FileBrowserFolderFile, + ), + ); + !drawerState.preview.open && + dispatch(setFilePreviewPanel()); + }} + /> + ); })} - {linkFiles.map((linkFile) => { - const component = tableRowItem(linkFile, "link"); - return component; + {linkFiles.map((resource: FileBrowserFolderLinkFile) => { + return ( + <LinkRow + key={resource.data.path} + resource={resource} + name={getLinkFileName(resource)} + date={resource.data.creation_date} + owner={resource.data.owner_username} + size={resource.data.fsize} + computedPath={path} + handleFolderClick={() => { + handleFileClick(resource.data.path); + }} + handleFileClick={() => { + return; + }} + /> + ); })} - {children.map((child) => { - const component = tableRowItem(child, "folder"); - return component; + + {children.map((resource: FileBrowserFolder) => { + return ( + <FolderRow + key={resource.data.path} + resource={resource} + name={getFolderName(resource, path)} + date={resource.data.creation_date} + owner=" " + size={0} + computedPath={path} + handleFolderClick={() => + handleFileClick(resource.data.path) + } + handleFileClick={() => { + return; + }} + /> + ); })} </Tbody> )} diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index be4c8d5e9..66d88d1cb 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -156,6 +156,7 @@ const BaseRow: React.FC<RowProps> = ({ <Td style={{ paddingInlineEnd: 0, + maxWidth: "1em", }} > <Checkbox @@ -204,15 +205,15 @@ const BaseRow: React.FC<RowProps> = ({ ); }; -const FolderRow: React.FC<Omit<RowProps, "type">> = (props) => ( +export const FolderRow: React.FC<Omit<RowProps, "type">> = (props) => ( <BaseRow {...props} type="folder" /> ); -const FileRow: React.FC<Omit<RowProps, "type">> = (props) => ( +export const FileRow: React.FC<Omit<RowProps, "type">> = (props) => ( <BaseRow {...props} type="file" /> ); -const LinkRow: React.FC<Omit<RowProps, "type">> = (props) => ( +export const LinkRow: React.FC<Omit<RowProps, "type">> = (props) => ( <BaseRow {...props} type="link" /> ); From 53dca7dd6fc06000d05301179f6f16b568695116 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 29 Aug 2024 12:33:02 -0400 Subject: [PATCH 151/337] feat: minor update to the context menu interaction --- src/components/NewLibrary/utils/longpress.tsx | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/components/NewLibrary/utils/longpress.tsx b/src/components/NewLibrary/utils/longpress.tsx index 677b32645..65aa0dc07 100644 --- a/src/components/NewLibrary/utils/longpress.tsx +++ b/src/components/NewLibrary/utils/longpress.tsx @@ -58,7 +58,6 @@ export default function useLongPress() { type: string, ) { const isExist = selectedPaths.some((item) => item.path === pathForCart); - // Handle Ctrl + Click for selection if (e.type === "click" && (e as React.MouseEvent).ctrlKey) { e.preventDefault(); @@ -69,26 +68,19 @@ export default function useLongPress() { } } else if (e.type === "contextmenu") { e.preventDefault(); // Prevent the default context menu from appearing - if (!isExist) { selectFolder(pathForCart, type, payload); } - // Toggle the menu state setIsMenuOpen((prev) => { - if (prev) { - deselectFolder(pathForCart); - } return !prev; }); } else { - if (!isExist) { - selectFolder(pathForCart, type, payload); + if (isMenuOpen) { + setIsMenuOpen(false); } else { - // If menu was open, deselect and close menu on row click - if (isMenuOpen) { - deselectFolder(pathForCart); - setIsMenuOpen(false); + if (!isExist && !isMenuOpen) { + selectFolder(pathForCart, type, payload); } else { deselectFolder(pathForCart); } From 37bd360b0aeecd62fc161c689c561462238135e9 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 29 Aug 2024 12:56:58 -0400 Subject: [PATCH 152/337] feat: css updates to the data tables --- .../FeedOutputBrowser/FileBrowser.tsx | 88 +------------------ .../NewLibrary/components/LibraryTable.tsx | 8 +- 2 files changed, 3 insertions(+), 93 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 93bbfe6d6..b853d26ce 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -204,87 +204,6 @@ const FileBrowser = (props: FileBrowserProps) => { </DrawerPanelContent> ); - const tableRowItem = (item: any, type: string) => { - let iconType: string; - let icon: React.ReactNode = null; - let fsize = " "; - let fileName = ""; - iconType = "UNKNOWN FORMAT"; - const pathList = - type === "folder" || type === "link" - ? item.data.path.split("/") - : item.data.fname.split("/"); - - fileName = pathList[pathList.length - 1]; - if (type === "file" && fileName.indexOf(".") > -1) { - iconType = getFileExtension(fileName); - fsize = bytesToSize(item.data.fsize); - } else if (type === "link") { - fsize = bytesToSize(item.data.fsize); - iconType = type; - } else { - iconType = type; - } - const isPreviewing = selectedFile === item; - const backgroundColor = isDarkTheme ? "#002952" : "#E7F1FA"; - const path = type === "file" ? item.data.fname : item.data.path; - - const isSelected = - selectedPaths.length > 0 && - selectedPaths.some((payload) => payload.path === path); - const selectedBgRow = getBackgroundRowColor(isSelected, isDarkTheme); - - icon = getIcon(iconType, isDarkTheme); - const fileNameComponent = ( - <div - style={{ - backgroundColor: isPreviewing ? backgroundColor : "inherit", - }} - > - <Button - onClick={(e) => { - e.stopPropagation(); - handleItem(item, type); - }} - icon={icon} - variant="link" - style={{ padding: "0" }} - > - {fileName} - </Button> - </div> - ); - - return ( - <FolderContextMenu - key={path} // Assuming 'item' has an 'id' property - origin={{ - type: OperationContext.FILEBROWSER, - additionalKeys: [additionalKey], - }} - > - <Tr - style={{ - background: selectedBgRow, - }} - onClick={(e) => { - handleOnClick(e, item, path, type); - }} - onContextMenu={(e) => { - handleOnClick(e, item, path, type); - }} - > - <Td dataLabel={columnNames.name}>{fileNameComponent}</Td> - <Td dataLabel={columnNames.created}> - {format(new Date(item.data.creation_date), "dd MMM yyyy, HH:mm")} - </Td> - <Td dataLabel={columnNames.creator}>{item.data.owner_username}</Td> - <Td dataLabel={columnNames.size}>{fsize}</Td> - </Tr> - </FolderContextMenu> - ); - }; - return ( <Grid hasGutter className="file-browser"> {contextHolder} @@ -337,11 +256,8 @@ const FileBrowser = (props: FileBrowserProps) => { )} </div> </div> - <Table aria-label="file-browser-table" variant="compact"> - <Thead - aria-label="file-browser-table" - className="file-browser-table--head" - > + <Table variant="compact"> + <Thead aria-label="file-browser-table"> <Tr> <Th aria-label="file-name">{columnNames.name}</Th> <Th aria-label="file-creator">{columnNames.created}</Th> diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 66d88d1cb..f4f2fc0e2 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -155,7 +155,6 @@ const BaseRow: React.FC<RowProps> = ({ > <Td style={{ - paddingInlineEnd: 0, maxWidth: "1em", }} > @@ -170,12 +169,7 @@ const BaseRow: React.FC<RowProps> = ({ }} /> </Td> - <Td - style={{ - paddingInlineStart: 0, - }} - dataLabel={columnNames.name} - > + <Td dataLabel={columnNames.name}> <Button onClick={(e) => { e.stopPropagation(); From 9537c8677259e251668bcddff878d43d83ed4f00 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 29 Aug 2024 13:13:56 -0400 Subject: [PATCH 153/337] refactors: Minor Updates --- src/components/PipelinesCopy/utils.ts | 3 ++- src/components/Store/index.tsx | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/PipelinesCopy/utils.ts b/src/components/PipelinesCopy/utils.ts index 211de80f1..73c25537e 100644 --- a/src/components/PipelinesCopy/utils.ts +++ b/src/components/PipelinesCopy/utils.ts @@ -1,4 +1,5 @@ -import type { Client, Plugin, PluginMeta } from "@fnndsc/chrisapi"; +import type { Plugin, PluginMeta } from "@fnndsc/chrisapi"; +import type Client from "@fnndsc/chrisapi"; import axios from "axios"; import { fetchResource } from "../../api/common"; diff --git a/src/components/Store/index.tsx b/src/components/Store/index.tsx index 169848e96..d91318964 100644 --- a/src/components/Store/index.tsx +++ b/src/components/Store/index.tsx @@ -31,10 +31,10 @@ import { format } from "date-fns"; import { isEmpty } from "lodash"; import { type Ref, useEffect, useState } from "react"; import { Cookies, useCookies } from "react-cookie"; -import { Alert, Spin, Typography, notification } from "../Antd"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useTypedSelector } from "../../store/hooks"; -import { InfoIcon, SpinContainer } from "../Common"; +import { Alert, Spin, Typography, notification } from "../Antd"; +import { SpinContainer } from "../Common"; import { CheckCircleIcon, SearchIcon } from "../Icons"; import "../SinglePlugin/singlePlugin.css"; import WrapperConnect from "../Wrapper"; From 4310e3a987dc3d5ec3523a82b1c7db2f8a1ce582 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 29 Aug 2024 13:20:54 -0400 Subject: [PATCH 154/337] feat: CSS improvements in the Library Table --- src/components/NewLibrary/components/LibraryTable.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index f4f2fc0e2..10072796c 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -155,7 +155,9 @@ const BaseRow: React.FC<RowProps> = ({ > <Td style={{ - maxWidth: "1em", + maxWidth: "0.5em", + paddingInlineEnd: "0", + paddingInlineStart: "1.5em", }} > <Checkbox @@ -169,7 +171,12 @@ const BaseRow: React.FC<RowProps> = ({ }} /> </Td> - <Td dataLabel={columnNames.name}> + <Td + style={{ + paddingInlineStart: "0", + }} + dataLabel={columnNames.name} + > <Button onClick={(e) => { e.stopPropagation(); From c5670004eb31213aa6f3ce1f8c6704daf0759680 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 29 Aug 2024 14:00:12 -0400 Subject: [PATCH 155/337] feat: Fix Store Bug --- src/components/PipelinesCopy/utils.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/components/PipelinesCopy/utils.ts b/src/components/PipelinesCopy/utils.ts index 73c25537e..c5f4393fe 100644 --- a/src/components/PipelinesCopy/utils.ts +++ b/src/components/PipelinesCopy/utils.ts @@ -1,5 +1,4 @@ -import type { Plugin, PluginMeta } from "@fnndsc/chrisapi"; -import type Client from "@fnndsc/chrisapi"; +import type { Client, Plugin, PluginMeta } from "@fnndsc/chrisapi"; import axios from "axios"; import { fetchResource } from "../../api/common"; @@ -10,11 +9,6 @@ interface Params { name_exact?: string; } -const defaultParams = { - limit: 20, - offset: 0, -}; - /** * Fetches plugin metadata from the ChRIS store. * @param {Client} client - The ChRIS API client. @@ -29,7 +23,10 @@ export const fetchPluginMetas = async (client: Client, params?: Params) => { try { const { resource: pluginMetas } = await fetchResource<PluginMeta>( - params || defaultParams, + params || { + limit: 20, + offset: 0, + }, boundFn, ); return pluginMetas; @@ -47,11 +44,17 @@ export const fetchPluginMetas = async (client: Client, params?: Params) => { export const fetchPluginForMeta = async (pluginMeta: PluginMeta) => { const fn = pluginMeta.getPlugins; const boundFn = fn.bind(pluginMeta); + const defaultParams = { + limit: 20, + offset: 0, + }; try { const { resource: plugins } = await fetchResource(defaultParams, boundFn); + return plugins as Plugin[]; } catch (error) { + console.log("Error", error); if (error instanceof Error) { throw new Error(error.message); } From bf24d1d35cf6070c25d6e8fb20e491f815e40a07 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 29 Aug 2024 14:26:14 -0400 Subject: [PATCH 156/337] feat: Add spacing --- .../NewLibrary/components/LibraryTable.tsx | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 10072796c..f6b98a062 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -153,13 +153,7 @@ const BaseRow: React.FC<RowProps> = ({ handleOnClick(e, resource, path, type); }} > - <Td - style={{ - maxWidth: "0.5em", - paddingInlineEnd: "0", - paddingInlineStart: "1.5em", - }} - > + <Td> <Checkbox name={name} isChecked={isSelected} @@ -171,12 +165,7 @@ const BaseRow: React.FC<RowProps> = ({ }} /> </Td> - <Td - style={{ - paddingInlineStart: "0", - }} - dataLabel={columnNames.name} - > + <Td dataLabel={columnNames.name}> <Button onClick={(e) => { e.stopPropagation(); From 955e5c6eb28f45c9ba2664b9b3396380e6d81dca Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 29 Aug 2024 16:21:52 -0400 Subject: [PATCH 157/337] feat: Update resource interactions based on the focus group --- .../FeedOutputBrowser/FileBrowser.tsx | 32 ++------ src/components/Feeds/FeedListView.tsx | 8 +- .../NewLibrary/components/FileCard.tsx | 12 +-- .../NewLibrary/components/FolderCard.tsx | 12 +-- .../NewLibrary/components/LibraryTable.tsx | 51 ++++++++----- src/components/NewLibrary/utils/longpress.tsx | 75 ++++++++++++------- src/components/PipelinesCopy/utils.ts | 5 +- 7 files changed, 99 insertions(+), 96 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index b853d26ce..57bf02fbe 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -15,15 +15,13 @@ import { Grid, Tooltip, } from "@patternfly/react-core"; -import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; -import { format } from "date-fns"; +import { Table, Tbody, Th, Thead, Tr } from "@patternfly/react-table"; import { useContext, useEffect } from "react"; import { useDispatch } from "react-redux"; import { getFileName, getLinkFileName, } from "../NewLibrary/components/FileCard"; -import { getFileExtension } from "../../api/model"; import { setFilePreviewPanel } from "../../store/drawer/drawerSlice"; import { clearSelectedFile, @@ -31,12 +29,11 @@ import { } from "../../store/explorer/explorerSlice"; import useDownload, { useTypedSelector } from "../../store/hooks"; import { notification } from "../Antd"; -import { ClipboardCopyContainer, SpinContainer, getIcon } from "../Common"; +import { ClipboardCopyContainer, SpinContainer } from "../Common"; import { ThemeContext } from "../DarkTheme/useTheme"; import { DrawerActionButton } from "../Feeds/DrawerUtils"; import { handleMaximize, handleMinimize } from "../Feeds/utilties"; import { HomeIcon } from "../Icons"; -import { FolderContextMenu } from "../NewLibrary/components/ContextMenu"; import { getFolderName } from "../NewLibrary/components/FolderCard"; import { FolderRow, @@ -45,13 +42,10 @@ import { } from "../NewLibrary/components/LibraryTable"; import Operations from "../NewLibrary/components/Operations"; import { OperationContext } from "../NewLibrary/context"; -import useLongPress, { - getBackgroundRowColor, -} from "../NewLibrary/utils/longpress"; +import useLongPress from "../NewLibrary/utils/longpress"; import FileDetailView from "../Preview/FileDetailView"; import XtkViewer from "../XtkViewer/XtkViewer"; import type { FileBrowserProps } from "./types"; -import { bytesToSize } from "./utilities"; const previewAnimation = [{ opacity: "0.0" }, { opacity: "1.0" }]; @@ -85,7 +79,6 @@ const FileBrowser = (props: FileBrowserProps) => { const selectedFile = useTypedSelector((state) => state.explorer.selectedFile); const drawerState = useTypedSelector((state) => state.drawers); const username = useTypedSelector((state) => state.user.username); - const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { folderFiles, linkFiles, children, path } = pluginFilesPayload; const breadcrumb = path.split("/"); @@ -158,21 +151,6 @@ const FileBrowser = (props: FileBrowserProps) => { ?.animate(previewAnimation, previewAnimationTiming); }; - const handleItem = ( - item: FileBrowserFolderFile | FileBrowserFolder, - type: string, - ) => { - if (type === "link" || type === "folder") { - handleFileClick(item.data.path); - } - - if (type === "file") { - toggleAnimation(); - dispatch(setSelectedFile(item as FileBrowserFolderFile)); - !drawerState.preview.open && dispatch(setFilePreviewPanel()); - } - }; - const previewPanel = ( <DrawerPanelContent className="file-browser__previewPanel" @@ -306,10 +284,10 @@ const FileBrowser = (props: FileBrowserProps) => { size={resource.data.fsize} computedPath={path} handleFolderClick={() => { - handleFileClick(resource.data.path); + return; }} handleFileClick={() => { - return; + handleFileClick(resource.data.path); }} /> ); diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 6fe615fb6..047c54f25 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -307,12 +307,10 @@ const TableRow: React.FC<TableRowProps> = ({ }} onClick={async (e) => { e.stopPropagation(); - if (e.ctrlKey || isMenuOpen) { - const payload = await getFolderForThisFeed(); - handleOnClick(e, payload, feed.data.folder_path, "folder"); - } else { + const payload = await getFolderForThisFeed(); + handleOnClick(e, payload, feed.data.folder_path, "folder", () => { onFeedNameClick(); - } + }); }} > <Td> diff --git a/src/components/NewLibrary/components/FileCard.tsx b/src/components/NewLibrary/components/FileCard.tsx index 69143a2f3..080e3bfae 100644 --- a/src/components/NewLibrary/components/FileCard.tsx +++ b/src/components/NewLibrary/components/FileCard.tsx @@ -256,11 +256,9 @@ export const SubFileCard: React.FC<SubFileCardProps> = ({ const handleClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => { e.stopPropagation(); - if (e.ctrlKey || handlers.isMenuOpen) { - handlers.handleOnClick(e, file, file.data.fname, "file"); - } else { + handlers.handleOnClick(e, file, file.data.fname, "file", () => { setIsPreview(!preview); - } + }); }; const handleCheckboxChange = (e: React.FormEvent<HTMLInputElement>) => { @@ -356,11 +354,9 @@ export const SubLinkCard: React.FC<SubLinkCardProps> = ({ const handleClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => { e.stopPropagation(); - if (e.ctrlKey || handlers.isMenuOpen) { - handlers.handleOnClick(e, linkFile, linkFile.data.path, "linkFile"); - } else { + handlers.handleOnClick(e, linkFile, linkFile.data.path, "linkFile", () => { navigate(linkFile.data.path); - } + }); }; const handleCheckboxChange = (e: React.FormEvent<HTMLInputElement>) => { diff --git a/src/components/NewLibrary/components/FolderCard.tsx b/src/components/NewLibrary/components/FolderCard.tsx index 8f0c2b033..f08db70c8 100644 --- a/src/components/NewLibrary/components/FolderCard.tsx +++ b/src/components/NewLibrary/components/FolderCard.tsx @@ -18,9 +18,9 @@ import { elipses } from "../../../api/common"; import { useTypedSelector } from "../../../store/hooks"; import { ThemeContext } from "../../DarkTheme/useTheme"; import { FolderIcon } from "../../Icons"; +import { OperationContext } from "../context"; import useLongPress, { getBackgroundRowColor } from "../utils/longpress"; import { FolderContextMenu } from "./ContextMenu"; -import { OperationContext } from "../context"; type Pagination = { totalCount: number; @@ -71,8 +71,7 @@ export const SubFolderCard: React.FC<SubFolderCardProps> = (props) => { const isDarkTheme = useContext(ThemeContext).isDarkTheme; const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { handlers } = useLongPress(); - const { handleOnClick, handleOnMouseDown, handleCheckboxChange, isMenuOpen } = - handlers; + const { handleOnClick, handleOnMouseDown, handleCheckboxChange } = handlers; const folderName = getFolderName(folder, computedPath); const creationDate = folder.data.creation_date; @@ -136,12 +135,9 @@ export const SubFolderCard: React.FC<SubFolderCardProps> = (props) => { isCompact isFlat onClick={(e) => { - e.stopPropagation(); - if (e.ctrlKey || isMenuOpen) { - handleOnClick(e, folder, folder.data.path, "folder"); - } else { + handleOnClick(e, folder, folder.data.path, "folder", () => { handleFolderClick(folderName); - } + }); }} onContextMenu={(e) => handleOnClick(e, folder, folder.data.path, "folder") diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index f6b98a062..d8a2298c5 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -56,8 +56,8 @@ interface RowProps { size: number; type: "folder" | "file" | "link"; computedPath: string; - handleFolderClick: (folderName: string) => void; - handleFileClick: (file: FileBrowserFolderFile) => void; + handleFolderClick: () => void; + handleFileClick: () => void; } const BaseRow: React.FC<RowProps> = ({ @@ -71,9 +71,8 @@ const BaseRow: React.FC<RowProps> = ({ handleFolderClick, handleFileClick, }) => { - const navigate = useNavigate(); const { handlers } = useLongPress(); - const { handleOnClick, handleCheckboxChange, isMenuOpen } = handlers; + const { handleOnClick, handleCheckboxChange } = handlers; const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const isDarkTheme = useContext(ThemeContext).isDarkTheme; const rowRef = useRef<HTMLTableRowElement>(null); // Create a ref for the row @@ -117,18 +116,18 @@ const BaseRow: React.FC<RowProps> = ({ const handleItem = () => { if (type === "folder") { - handleFolderClick(name); + handleFolderClick(); } else if (type === "link") { - navigate(resource.data.path); + handleFileClick(); } else if (type === "file") { - handleFileClick(resource as FileBrowserFolderFile); + handleFileClick(); } }; const path = - type === "file" || type === "link" - ? resource.data.fname - : resource.data.path; + type === "folder" || type === "link" + ? resource.data.path + : resource.data.fname; return ( <FolderContextMenu @@ -143,11 +142,9 @@ const BaseRow: React.FC<RowProps> = ({ style={{ background: highlightedBgRow, cursor: "pointer" }} onClick={(e) => { e.stopPropagation(); - if (e.ctrlKey || isMenuOpen) { - handleOnClick(e, resource, path, type); - } else { + handleOnClick(e, resource, path, type, () => { handleItem(); - } + }); }} onContextMenu={(e) => { handleOnClick(e, resource, path, type); @@ -212,6 +209,7 @@ const LibraryTable: React.FC<TableProps> = ({ computedPath, handleFolderClick, }) => { + const navigate = useNavigate(); const [preview, setShowPreview] = useState(false); const [selectedFile, setSelectedFile] = useState<FileBrowserFolderFile>(); @@ -261,8 +259,13 @@ const LibraryTable: React.FC<TableProps> = ({ owner=" " size={0} computedPath={computedPath} - handleFolderClick={handleFolderClick} - handleFileClick={handleFileClick} + handleFolderClick={() => { + const name = getFolderName(resource.data.path, computedPath); + handleFolderClick(name); + }} + handleFileClick={() => { + return; + }} /> ))} {data.files.map((resource: FileBrowserFolderFile) => ( @@ -274,8 +277,12 @@ const LibraryTable: React.FC<TableProps> = ({ owner={resource.data.owner_username} size={resource.data.fsize} computedPath={computedPath} - handleFolderClick={handleFolderClick} - handleFileClick={handleFileClick} + handleFolderClick={() => { + return; + }} + handleFileClick={() => { + handleFileClick(resource); + }} /> ))} {data.linkFiles.map((resource: FileBrowserFolderLinkFile) => ( @@ -287,8 +294,12 @@ const LibraryTable: React.FC<TableProps> = ({ owner={resource.data.owner_username} size={resource.data.fsize} computedPath={computedPath} - handleFolderClick={handleFolderClick} - handleFileClick={handleFileClick} + handleFolderClick={() => { + return; + }} + handleFileClick={() => { + navigate(resource.data.path); + }} /> ))} </Tbody> diff --git a/src/components/NewLibrary/utils/longpress.tsx b/src/components/NewLibrary/utils/longpress.tsx index 65aa0dc07..184bc16c6 100644 --- a/src/components/NewLibrary/utils/longpress.tsx +++ b/src/components/NewLibrary/utils/longpress.tsx @@ -51,41 +51,66 @@ export default function useLongPress() { dispatch(clearSelectedPaths(pathForCart)); } + const clickTimer = useRef<ReturnType<typeof setTimeout> | null>(null); + const clickCount = useRef(0); function handleOnClick( e: React.MouseEvent | React.TouchEvent, payload: PayloadTypes, pathForCart: string, type: string, + optionalCallback?: () => void, ) { const isExist = selectedPaths.some((item) => item.path === pathForCart); - // Handle Ctrl + Click for selection - if (e.type === "click" && (e as React.MouseEvent).ctrlKey) { - e.preventDefault(); - if (!isExist) { - selectFolder(pathForCart, type, payload); - } else { - deselectFolder(pathForCart); - } - } else if (e.type === "contextmenu") { - e.preventDefault(); // Prevent the default context menu from appearing - if (!isExist) { - selectFolder(pathForCart, type, payload); - } - // Toggle the menu state - setIsMenuOpen((prev) => { - return !prev; - }); - } else { - if (isMenuOpen) { - setIsMenuOpen(false); - } else { - if (!isExist && !isMenuOpen) { - selectFolder(pathForCart, type, payload); + + clickCount.current += 1; + if (clickTimer.current) { + clearTimeout(clickTimer.current); + } + + clickTimer.current = setTimeout(() => { + if (clickCount.current === 1) { + // Single click + if (e.ctrlKey) { + // Ctrl + Click: Toggle selection + if (isExist) { + deselectFolder(pathForCart); + } else { + selectFolder(pathForCart, type, payload); + } + } else if (e.type === "contextmenu") { + e.preventDefault(); // Prevent the default context menu from appearing + if (!isExist) { + selectFolder(pathForCart, type, payload); + } + // Toggle the menu state + setIsMenuOpen((prev) => { + if (prev) { + deselectFolder(pathForCart); + } + return !prev; + }); } else { - deselectFolder(pathForCart); + if (isMenuOpen) { + // The context menu is also closed by a right click + // We don't want it to confuse it with select/deselect of a folder + setIsMenuOpen(false); + } else { + // Normal click: Select/Deselect + if (isExist) { + deselectFolder(pathForCart); + } else { + selectFolder(pathForCart, type, payload); + } + } } + } else if (clickCount.current === 2) { + // Double click: Enter folder + optionalCallback?.(); } - } + + clickCount.current = 0; + }, 300); // Adjust this delay as needed + // Handle Ctrl + Click for selection } const handleCheckboxChange = ( diff --git a/src/components/PipelinesCopy/utils.ts b/src/components/PipelinesCopy/utils.ts index c5f4393fe..ed14cf527 100644 --- a/src/components/PipelinesCopy/utils.ts +++ b/src/components/PipelinesCopy/utils.ts @@ -1,4 +1,5 @@ -import type { Client, Plugin, PluginMeta } from "@fnndsc/chrisapi"; +import type { Plugin, PluginMeta } from "@fnndsc/chrisapi"; +import type Client from "@fnndsc/chrisapi"; import axios from "axios"; import { fetchResource } from "../../api/common"; @@ -51,10 +52,8 @@ export const fetchPluginForMeta = async (pluginMeta: PluginMeta) => { try { const { resource: plugins } = await fetchResource(defaultParams, boundFn); - return plugins as Plugin[]; } catch (error) { - console.log("Error", error); if (error instanceof Error) { throw new Error(error.message); } From 6fc1b5abf1258dfcf92411f57302ce29c63c8a1b Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 29 Aug 2024 16:27:09 -0400 Subject: [PATCH 158/337] fix: Fix Folder Click --- src/components/NewLibrary/components/LibraryTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index d8a2298c5..561ac3797 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -260,7 +260,7 @@ const LibraryTable: React.FC<TableProps> = ({ size={0} computedPath={computedPath} handleFolderClick={() => { - const name = getFolderName(resource.data.path, computedPath); + const name = getFolderName(resource, computedPath); handleFolderClick(name); }} handleFileClick={() => { From 618d542e3e8b680543972cb249131ebda1765863 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 29 Aug 2024 16:53:23 -0400 Subject: [PATCH 159/337] feat: Update the tables to use the patternfly select instead of Checkboxes --- .../FeedOutputBrowser/FileBrowser.tsx | 99 ++++++++++--------- src/components/Feeds/FeedListView.tsx | 1 + src/components/NewLibrary/components/Cart.tsx | 2 +- .../NewLibrary/components/LayoutSwitch.tsx | 4 +- .../NewLibrary/components/LibraryTable.tsx | 29 ++++-- 5 files changed, 79 insertions(+), 56 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 57bf02fbe..174c828a3 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -247,55 +247,62 @@ const FileBrowser = (props: FileBrowserProps) => { <SpinContainer title="Fetching Files for this path..." /> ) : ( <Tbody> - {folderFiles.map((resource: FileBrowserFolderFile) => { - return ( - <FileRow - key={resource.data.fname} - resource={resource} - name={getFileName(resource)} - date={resource.data.creation_date} - owner={resource.data.owner_username} - size={resource.data.fsize} - computedPath={path} - handleFolderClick={() => { - return; - }} - handleFileClick={() => { - toggleAnimation(); - dispatch( - setSelectedFile( - resource as FileBrowserFolderFile, - ), - ); - !drawerState.preview.open && - dispatch(setFilePreviewPanel()); - }} - /> - ); - })} - {linkFiles.map((resource: FileBrowserFolderLinkFile) => { - return ( - <LinkRow - key={resource.data.path} - resource={resource} - name={getLinkFileName(resource)} - date={resource.data.creation_date} - owner={resource.data.owner_username} - size={resource.data.fsize} - computedPath={path} - handleFolderClick={() => { - return; - }} - handleFileClick={() => { - handleFileClick(resource.data.path); - }} - /> - ); - })} + {folderFiles.map( + (resource: FileBrowserFolderFile, index) => { + return ( + <FileRow + rowIndex={index} + key={resource.data.fname} + resource={resource} + name={getFileName(resource)} + date={resource.data.creation_date} + owner={resource.data.owner_username} + size={resource.data.fsize} + computedPath={path} + handleFolderClick={() => { + return; + }} + handleFileClick={() => { + toggleAnimation(); + dispatch( + setSelectedFile( + resource as FileBrowserFolderFile, + ), + ); + !drawerState.preview.open && + dispatch(setFilePreviewPanel()); + }} + /> + ); + }, + )} + {linkFiles.map( + (resource: FileBrowserFolderLinkFile, index) => { + return ( + <LinkRow + rowIndex={index} + key={resource.data.path} + resource={resource} + name={getLinkFileName(resource)} + date={resource.data.creation_date} + owner={resource.data.owner_username} + size={resource.data.fsize} + computedPath={path} + handleFolderClick={() => { + return; + }} + handleFileClick={() => { + handleFileClick(resource.data.path); + }} + /> + ); + }, + )} - {children.map((resource: FileBrowserFolder) => { + {children.map((resource: FileBrowserFolder, index) => { return ( <FolderRow + rowIndex={index} key={resource.data.path} resource={resource} name={getFolderName(resource, path)} diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 047c54f25..f070785ba 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -321,6 +321,7 @@ const TableRow: React.FC<TableRowProps> = ({ /> </Td> <Td dataLabel={columnNames.id}>{feed.data.id}</Td> + <Td dataLabel={columnNames.analysis}> <FeedInfoColumn feed={feed} onClick={onFeedNameClick} /> </Td> diff --git a/src/components/NewLibrary/components/Cart.tsx b/src/components/NewLibrary/components/Cart.tsx index 0a80d2604..2a67aac1f 100644 --- a/src/components/NewLibrary/components/Cart.tsx +++ b/src/components/NewLibrary/components/Cart.tsx @@ -5,6 +5,7 @@ import { Link } from "react-router-dom"; import { getFileName } from "../../../api/common"; import { cancelUpload, + clearCart, clearDownloadStatus, clearUploadState, setToggleCart, @@ -23,7 +24,6 @@ import { DotsIndicator, EmptyStateComponent } from "../../Common"; import { CheckCircleIcon, CloseIcon, FileIcon, FolderIcon } from "../../Icons"; import { ShowInFolder, TitleNameClipped, elipses } from "../utils/longpress"; import "./Cart.css"; -import { clearCart } from "../../../store/cart/cartSlice"; import ProgressRing from "./RadialProgress"; const Cart = () => { diff --git a/src/components/NewLibrary/components/LayoutSwitch.tsx b/src/components/NewLibrary/components/LayoutSwitch.tsx index b17fec4fc..34bc15833 100644 --- a/src/components/NewLibrary/components/LayoutSwitch.tsx +++ b/src/components/NewLibrary/components/LayoutSwitch.tsx @@ -3,10 +3,10 @@ import { ToggleGroupItem, type ToggleGroupItemProps, } from "@patternfly/react-core"; -import { BarsIcon, GripVerticalIcon } from "../../Icons"; -import { switchLibraryLayout } from "../../../store/cart/cartSlice"; import { useDispatch } from "react-redux"; +import { switchLibraryLayout } from "../../../store/cart/cartSlice"; import { useTypedSelector } from "../../../store/hooks"; +import { BarsIcon, GripVerticalIcon } from "../../Icons"; const LayoutSwitch = () => { const currentLayout = useTypedSelector((state) => state.cart.currentLayout); diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 561ac3797..101e97aa1 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -3,7 +3,7 @@ import type { FileBrowserFolderFile, FileBrowserFolderLinkFile, } from "@fnndsc/chrisapi"; -import { Button, Checkbox } from "@patternfly/react-core"; +import { Button } from "@patternfly/react-core"; import { Caption, Table, @@ -46,6 +46,7 @@ const columnNames = { }; interface RowProps { + rowIndex: number; resource: | FileBrowserFolder | FileBrowserFolderFile @@ -61,6 +62,7 @@ interface RowProps { } const BaseRow: React.FC<RowProps> = ({ + rowIndex, resource, name, date, @@ -150,8 +152,16 @@ const BaseRow: React.FC<RowProps> = ({ handleOnClick(e, resource, path, type); }} > - <Td> - <Checkbox + <Td + select={{ + rowIndex: rowIndex, + onSelect: (event) => + handleCheckboxChange(event, path, resource, type), + isSelected: isSelected, + }} + > + {/* +<Checkbox name={name} isChecked={isSelected} id="Select Resources" @@ -161,6 +171,8 @@ const BaseRow: React.FC<RowProps> = ({ handleCheckboxChange(event, path, resource, type); }} /> + + */} </Td> <Td dataLabel={columnNames.name}> <Button @@ -176,7 +188,7 @@ const BaseRow: React.FC<RowProps> = ({ </Button> {isNewResource && ( <Tag style={{ marginLeft: "0.25em" }} color="#3E8635"> - Recently Added + Newly Added </Tag> )} </Td> @@ -250,8 +262,9 @@ const LibraryTable: React.FC<TableProps> = ({ </Tr> </Thead> <Tbody> - {data.folders.map((resource: FileBrowserFolder) => ( + {data.folders.map((resource: FileBrowserFolder, index) => ( <FolderRow + rowIndex={index} key={resource.data.path} resource={resource} name={getFolderName(resource, computedPath)} @@ -268,8 +281,9 @@ const LibraryTable: React.FC<TableProps> = ({ }} /> ))} - {data.files.map((resource: FileBrowserFolderFile) => ( + {data.files.map((resource: FileBrowserFolderFile, index) => ( <FileRow + rowIndex={index} key={resource.data.fname} resource={resource} name={getFileName(resource)} @@ -285,8 +299,9 @@ const LibraryTable: React.FC<TableProps> = ({ }} /> ))} - {data.linkFiles.map((resource: FileBrowserFolderLinkFile) => ( + {data.linkFiles.map((resource: FileBrowserFolderLinkFile, index) => ( <LinkRow + rowIndex={index} key={resource.data.path} resource={resource} name={getLinkFileName(resource)} From 6a8fde96ab2097110cd19c1b1f44913b01722a4b Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 30 Aug 2024 10:26:28 -0400 Subject: [PATCH 160/337] feat: Remove unused code --- .../NewLibrary/components/LibraryTable.tsx | 16 +--------------- src/components/Store/index.tsx | 5 +---- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 101e97aa1..df69c996d 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -159,21 +159,7 @@ const BaseRow: React.FC<RowProps> = ({ handleCheckboxChange(event, path, resource, type), isSelected: isSelected, }} - > - {/* -<Checkbox - name={name} - isChecked={isSelected} - id="Select Resources" - aria-label="Select resources" - onClick={(e) => e.stopPropagation()} - onChange={(event) => { - handleCheckboxChange(event, path, resource, type); - }} - /> - - */} - </Td> + /> <Td dataLabel={columnNames.name}> <Button onClick={(e) => { diff --git a/src/components/Store/index.tsx b/src/components/Store/index.tsx index d91318964..2e2e9daeb 100644 --- a/src/components/Store/index.tsx +++ b/src/components/Store/index.tsx @@ -33,20 +33,17 @@ import { type Ref, useEffect, useState } from "react"; import { Cookies, useCookies } from "react-cookie"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useTypedSelector } from "../../store/hooks"; -import { Alert, Spin, Typography, notification } from "../Antd"; +import { Alert, Spin, notification } from "../Antd"; import { SpinContainer } from "../Common"; import { CheckCircleIcon, SearchIcon } from "../Icons"; import "../SinglePlugin/singlePlugin.css"; import WrapperConnect from "../Wrapper"; - import { fetchPluginForMeta, fetchPluginMetas, handleInstallPlugin, } from "../PipelinesCopy/utils"; -const { Paragraph } = Typography; - const Store = () => { const isStaff = useTypedSelector((state) => state.user.isStaff); const queryClient = useQueryClient(); From 4cef9a91c41722eca1ea52545d2e8889ba444755 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 3 Sep 2024 11:28:10 -0400 Subject: [PATCH 161/337] feat: Update the Feed Table to use Patternfly's select elements for better small screen compatability --- src/api/model.ts | 2 +- .../FeedOutputBrowser/FileBrowser.tsx | 1 + src/components/Feeds/FeedListView.tsx | 85 +++++++------------ .../NewLibrary/components/LibraryTable.tsx | 19 +---- src/components/NewLibrary/utils/longpress.tsx | 2 +- 5 files changed, 40 insertions(+), 69 deletions(-) diff --git a/src/api/model.ts b/src/api/model.ts index 7ccb51dcf..85725f9ee 100644 --- a/src/api/model.ts +++ b/src/api/model.ts @@ -186,7 +186,7 @@ export const fileViewerMap: any = { jpg: "ImageDisplay", jpeg: "ImageDisplay", gif: "ImageDisplay", - dcm: "DcmDisplay", + dcm: "NiiVueDisplay", default: "CatchallDisplay", nii: "NiiVueDisplay", gz: "CatchallDisplay", diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 174c828a3..459184cb1 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -237,6 +237,7 @@ const FileBrowser = (props: FileBrowserProps) => { <Table variant="compact"> <Thead aria-label="file-browser-table"> <Tr> + <Th /> <Th aria-label="file-name">{columnNames.name}</Th> <Th aria-label="file-creator">{columnNames.created}</Th> <Th aria-label="file-owner">{columnNames.creator}</Th> diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index f070785ba..7050ae2bd 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -232,13 +232,14 @@ interface TableRowProps { } const TableRow: React.FC<TableRowProps> = ({ + rowIndex, feed, columnNames, additionalKeys, }) => { const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { handlers } = useLongPress(); - const { handleOnClick, isMenuOpen } = handlers; + const { handleOnClick } = handlers; const navigate = useNavigate(); const [intervalMs, setIntervalMs] = useState(2000); const { isDarkTheme } = useContext(ThemeContext); @@ -306,20 +307,43 @@ const TableRow: React.FC<TableRowProps> = ({ handleOnClick(e, payload, feed.data.folder_path, "folder"); }} onClick={async (e) => { - e.stopPropagation(); + console.log("Clicked"); + e?.stopPropagation(); const payload = await getFolderForThisFeed(); handleOnClick(e, payload, feed.data.folder_path, "folder", () => { onFeedNameClick(); }); }} + isRowSelected={isSelected} > - <Td> - <BulkCheckbox - feed={feed} - getFolderForThisFeed={getFolderForThisFeed} - isSelected={isSelected} - /> - </Td> + <Td + onClick={(e) => e.stopPropagation()} + select={{ + rowIndex: rowIndex, + isSelected: isSelected, + onSelect: async (event) => { + event.stopPropagation(); + const isChecked = event.currentTarget.checked; // Capture the checked value before the async call + const payload = await getFolderForThisFeed(); + + // Create a new event object with the captured properties + const newEvent = { + ...event, + stopPropagation: () => event.stopPropagation(), + preventDefault: () => event.preventDefault(), + currentTarget: { ...event.currentTarget, checked: isChecked }, + }; + + // Pass the new event object to the handler function + handlers.handleCheckboxChange( + newEvent, + feed.data.folder_path, + payload, + "folder", + ); + }, + }} + /> <Td dataLabel={columnNames.id}>{feed.data.id}</Td> <Td dataLabel={columnNames.analysis}> @@ -343,49 +367,6 @@ const TableRow: React.FC<TableRowProps> = ({ ); }; -const BulkCheckbox = ({ - feed, - getFolderForThisFeed, - isSelected, -}: { - feed: Feed; - getFolderForThisFeed: () => Promise<FileBrowserFolder>; - isSelected: boolean; -}) => { - const { handlers } = useLongPress(); - const handleCheckboxChange = handlers.handleCheckboxChange; - - return ( - <Checkbox - className={`${feed.data.name}-checkbox`} - isChecked={isSelected} - id={feed.data.id} - aria-label={`${feed.data.name}-checkbox`} - onClick={(e) => e.stopPropagation()} - onChange={async (event) => { - const isChecked = event.currentTarget.checked; // Capture the checked value before the async call - const payload = await getFolderForThisFeed(); - - // Create a new event object with the captured properties - const newEvent = { - ...event, - stopPropagation: () => event.stopPropagation(), - preventDefault: () => event.preventDefault(), - currentTarget: { ...event.currentTarget, checked: isChecked }, - }; - - // Pass the new event object to the handler function - handleCheckboxChange( - newEvent, - feed.data.folder_path, - payload, - "folder", - ); - }} - /> - ); -}; - const DonutUtilization = (props: { details: any; }) => { diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 101e97aa1..c4eb53c47 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -151,29 +151,18 @@ const BaseRow: React.FC<RowProps> = ({ onContextMenu={(e) => { handleOnClick(e, resource, path, type); }} + isSelectable={true} + isRowSelected={isSelected} > <Td + onClick={(e) => e.stopPropagation()} select={{ rowIndex: rowIndex, onSelect: (event) => handleCheckboxChange(event, path, resource, type), isSelected: isSelected, }} - > - {/* -<Checkbox - name={name} - isChecked={isSelected} - id="Select Resources" - aria-label="Select resources" - onClick={(e) => e.stopPropagation()} - onChange={(event) => { - handleCheckboxChange(event, path, resource, type); - }} - /> - - */} - </Td> + /> <Td dataLabel={columnNames.name}> <Button onClick={(e) => { diff --git a/src/components/NewLibrary/utils/longpress.tsx b/src/components/NewLibrary/utils/longpress.tsx index 184bc16c6..1a202cbeb 100644 --- a/src/components/NewLibrary/utils/longpress.tsx +++ b/src/components/NewLibrary/utils/longpress.tsx @@ -54,7 +54,7 @@ export default function useLongPress() { const clickTimer = useRef<ReturnType<typeof setTimeout> | null>(null); const clickCount = useRef(0); function handleOnClick( - e: React.MouseEvent | React.TouchEvent, + e: React.MouseEvent | React.TouchEvent | React.KeyboardEvent, payload: PayloadTypes, pathForCart: string, type: string, From d05bef586b936e2f25c83d5d687c429af002014a Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 3 Sep 2024 16:20:47 -0400 Subject: [PATCH 162/337] feat: Update create feed with file uploads in the feed table --- src/components/Feeds/FeedListView.tsx | 4 +- .../NewLibrary/components/ContextMenu.tsx | 22 +- .../NewLibrary/components/Operations.tsx | 85 +++--- .../NewLibrary/utils/useOperations.tsx | 242 +++++++++++------- src/store/cart/types.ts | 1 + 5 files changed, 208 insertions(+), 146 deletions(-) diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 7050ae2bd..b7db6379e 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -1,8 +1,7 @@ -import type { Feed, FileBrowserFolder } from "@fnndsc/chrisapi"; +import type { Feed } from "@fnndsc/chrisapi"; import { ChartDonutUtilization } from "@patternfly/react-charts"; import { Button, - Checkbox, EmptyState, EmptyStateIcon, EmptyStateVariant, @@ -307,7 +306,6 @@ const TableRow: React.FC<TableRowProps> = ({ handleOnClick(e, payload, feed.data.folder_path, "folder"); }} onClick={async (e) => { - console.log("Clicked"); e?.stopPropagation(); const payload = await getFolderForThisFeed(); handleOnClick(e, payload, feed.data.folder_path, "folder", () => { diff --git a/src/components/NewLibrary/components/ContextMenu.tsx b/src/components/NewLibrary/components/ContextMenu.tsx index 55fa9fff6..b18df166a 100644 --- a/src/components/NewLibrary/components/ContextMenu.tsx +++ b/src/components/NewLibrary/components/ContextMenu.tsx @@ -24,13 +24,13 @@ interface ContextMenuProps { export const FolderContextMenu = (props: ContextMenuProps) => { const { children, origin, folderList, computedPath } = props; const { - modalInfo, - userError, + modalState, + userRelatedError, handleModalSubmitMutation, handleOperations, contextHolder, - setUserErrors, - setModalInfo, + setUserRelatedError, + setModalState, } = useFolderOperations( origin, computedPath, @@ -69,14 +69,14 @@ export const FolderContextMenu = (props: ContextMenuProps) => { }; const { modalTitle, inputLabel } = - modalTypeLabels[modalInfo.type] || modalTypeLabels.default; + modalTypeLabels[modalState.type] || modalTypeLabels.default; return ( <> <AddModal - operationType={modalInfo.type} - isOpen={modalInfo.isOpen} - onClose={() => setModalInfo({ isOpen: false, type: "" })} + operationType={modalState.type} + isOpen={modalState.isOpen} + onClose={() => setModalState({ isOpen: false, type: "" })} onSubmit={(inputValue, additionalValues) => handleModalSubmitMutation.mutate({ inputValue, @@ -101,13 +101,13 @@ export const FolderContextMenu = (props: ContextMenuProps) => { {children} </Dropdown> - {userError && ( + {userRelatedError && ( <Alert style={{ marginLeft: "1rem" }} type="error" - description={userError} + description={userRelatedError} closable - onClose={() => setUserErrors("")} + onClose={() => setUserRelatedError("")} /> )} </> diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index 3144eaafc..b9a805b79 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -15,15 +15,10 @@ import { Tooltip, } from "@patternfly/react-core"; import type { DefaultError } from "@tanstack/react-query"; -import React, { - Fragment, - useEffect, - useImperativeHandle, - useMemo, - useState, -} from "react"; +import type React from "react"; +import { Fragment, useEffect, useMemo, useState } from "react"; import { useDispatch } from "react-redux"; -import { useLocation } from "react-router"; +import { matchPath, useLocation } from "react-router"; import { getFileName } from "../../../api/common"; import { removeSelectedPayload } from "../../../store/cart/cartSlice"; import { useTypedSelector } from "../../../store/hooks"; @@ -68,23 +63,24 @@ const items = [ { key: "folderUpload", label: "Folder Upload" }, ]; -const Operations = React.forwardRef((props: OperationProps, ref) => { +const Operations = (props: OperationProps) => { const location = useLocation(); const { origin, computedPath, folderList, customStyle, customClassName } = props; const dispatch = useDispatch(); const { - modalInfo, - userError, - folderInput, - fileInput, + modalState, + userRelatedError, + folderInputRef, + fileInputRef, handleFileChange, + createFeedWithFile, handleFolderChange, handleModalSubmitMutation, handleOperations, contextHolder, - setUserErrors, - setModalInfo, + setUserRelatedError, + setModalState, } = useFolderOperations( origin, computedPath, @@ -92,15 +88,6 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { location.pathname === "/feeds", ); - useImperativeHandle(ref, () => ({ - triggerFileUpload: () => { - fileInput.current?.click(); - }, - triggerFolderUpload: () => { - folderInput.current?.click(); - }, - })); - const { selectedPaths } = useTypedSelector((state) => state.cart); const selectedPathsCount = selectedPaths.length; @@ -145,13 +132,13 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { New </Button> </Dropdown> - {userError && ( + {userRelatedError && ( <Alert style={{ marginLeft: "1rem" }} type="error" - description={userError} + description={userRelatedError} closable - onClose={() => setUserErrors("")} + onClose={() => setUserRelatedError("")} /> )} </ToolbarItem> @@ -224,21 +211,21 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { ), [ contextHolder, - userError, + userRelatedError, selectedPaths, selectedPathsCount, dispatch, handleOperations, - setUserErrors, + setUserRelatedError, ], ); return ( <> <AddModal - operationType={modalInfo.type} - isOpen={modalInfo.isOpen} - onClose={() => setModalInfo({ isOpen: false, type: "" })} + operationType={modalState.type} + isOpen={modalState.isOpen} + onClose={() => setModalState({ isOpen: false, type: "" })} onSubmit={(inputValue, additionalValues) => handleModalSubmitMutation.mutate({ inputValue, @@ -246,11 +233,11 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { }) } modalTitle={ - modalTypeLabels[modalInfo.type]?.modalTitle ?? + modalTypeLabels[modalState.type]?.modalTitle ?? modalTypeLabels.default.modalTitle } inputLabel={ - modalTypeLabels[modalInfo.type]?.inputLabel ?? + modalTypeLabels[modalState.type]?.inputLabel ?? modalTypeLabels.default.inputLabel } indicators={{ @@ -261,19 +248,32 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { }} /> <input - ref={fileInput} + ref={fileInputRef} multiple={true} type="file" hidden - onChange={handleFileChange} + onChange={(e) => { + if (matchPath({ path: "/feeds", end: true }, location.pathname)) { + createFeedWithFile(e, "file"); + } else { + handleFileChange(e); + } + }} /> <input - ref={folderInput} + ref={folderInputRef} type="file" + //@ts-ignore webkitdirectory="" directory="" hidden - onChange={handleFolderChange} + onChange={(e) => { + if (matchPath({ path: "/feeds", end: true }, location.pathname)) { + createFeedWithFile(e, "folder"); + } else { + handleFolderChange(e); + } + }} /> <Toolbar style={{ ...customStyle?.toolbar }} @@ -294,7 +294,7 @@ const Operations = React.forwardRef((props: OperationProps, ref) => { </Toolbar> </> ); -}); +}; export default Operations; @@ -310,6 +310,10 @@ const modalTypeLabels: Record< modalTitle: "Share this Folder", inputLabel: "User Name", }, + createFeedWithFile: { + modalTitle: "Create Feed", + inputLabel: "Feed Name", + }, default: { modalTitle: "Create a new Folder", @@ -330,6 +334,9 @@ interface AddModalProps { error: DefaultError | null; clearErrors: () => void; }; + additionalValues?: { + [key: string]: any; + }; } export const AddModal = (props: AddModalProps) => { diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index a0f1b3e3d..018c59848 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -1,6 +1,5 @@ import type { FileBrowserFolderList } from "@fnndsc/chrisapi"; import { useMutation } from "@tanstack/react-query"; -import { create, isEmpty } from "lodash"; import { useContext, useRef, useState } from "react"; import { useDispatch } from "react-redux"; import ChrisAPIClient from "../../../api/chrisapiclient"; @@ -18,9 +17,28 @@ import { type OriginState, useOperationsContext } from "../context"; import useDeletePayload from "../utils/useDeletePayload"; import useFeedOperations from "./useFeedOperations"; +interface ModalState { + type: string; + isOpen: boolean; + additionalProps?: Record<string, any>; +} + +export const getCurrentTimestamp = () => { + return new Date() + .toLocaleString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + hour: "2-digit", + minute: "2-digit", + hour12: true, + }) + .replace(/[^a-zA-Z0-9]/g, "_"); +}; + export const useFolderOperations = ( origin: OriginState, - computedPath?: string, // This path is passed to for file upload and folder uploads in the library + computedPath?: string, folderList?: FileBrowserFolderList, createFeed?: boolean, ) => { @@ -28,17 +46,21 @@ export const useFolderOperations = ( const router = useContext(MainRouterContext); const { selectedPaths } = useTypedSelector((state) => state.cart); const username = useTypedSelector((state) => state.user.username); - const [modalInfo, setModalInfo] = useState({ isOpen: false, type: "" }); - const [userError, setUserErrors] = useState(""); + const [modalState, setModalState] = useState<ModalState>({ + isOpen: false, + type: "", + }); + const [userRelatedError, setUserRelatedError] = useState<string>(""); const dispatch = useDispatch(); - const folderInput = useRef<HTMLInputElement>(null); - const fileInput = useRef<HTMLInputElement>(null); - const [api, contextHolder] = notification.useNotification(); + const folderInputRef = useRef<HTMLInputElement>(null); + const fileInputRef = useRef<HTMLInputElement>(null); + const [notificationAPI, notificationContextHolder] = + notification.useNotification(); - const deleteMutation = useDeletePayload(origin, api); + const deleteMutation = useDeletePayload(origin, notificationAPI); const { handleDuplicateMutation, handleMergeMutation } = useFeedOperations( origin, - api, + notificationAPI, ); const resetInputField = (inputRef: React.RefObject<HTMLInputElement>) => { @@ -47,77 +69,90 @@ export const useFolderOperations = ( } }; - const getCurrentTimestamp = () => { - const timestamp = new Date().toLocaleString("en-US", { - year: "numeric", - month: "short", - day: "numeric", - hour: "2-digit", - minute: "2-digit", - hour12: true, - }); - return `${timestamp.replace(/[^a-zA-Z0-9]/g, "_")}`; - }; - - const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => { + const handleFileChange = async ( + event: React.ChangeEvent<HTMLInputElement>, + name?: string, + ) => { handleOrigin(origin); - const fileList = e.target.files || []; - const files = Array.from(fileList); - const uniqueName = getCurrentTimestamp(); - - const currentPath = createFeed + const files = Array.from(event.target.files || []); + const uniqueName = name + ? `${name}_${getCurrentTimestamp()}` + : getCurrentTimestamp(); + const uploadPath = createFeed ? `home/${username}/uploads/${uniqueName}` : computedPath; - (""); dispatch( startUpload({ files, isFolder: false, - currentPath: currentPath as string, + currentPath: uploadPath as string, invalidateFunc: invalidateQueries, createFeed, + nameForFeed: name, }), ); - resetInputField(fileInput); + resetInputField(fileInputRef); }; - const handleFolderChange = async (e: React.ChangeEvent<HTMLInputElement>) => { + const handleFolderChange = async ( + event: React.ChangeEvent<HTMLInputElement>, + name?: string, + ) => { handleOrigin(origin); - const fileList = e.target.files || []; - const files = Array.from(fileList); - const uniqueName = getCurrentTimestamp(); - - const currentPath = createFeed + const files = Array.from(event.target.files || []); + const uniqueName = name + ? `${name}_${getCurrentTimestamp()}` + : getCurrentTimestamp(); + const uploadPath = createFeed ? `home/${username}/uploads/${uniqueName}` : computedPath; + dispatch( startUpload({ files, isFolder: true, - currentPath: currentPath as string, + currentPath: uploadPath as string, invalidateFunc: invalidateQueries, createFeed, + nameForFeed: name, }), ); - resetInputField(folderInput); + resetInputField(folderInputRef); }; - const createFolder = async (inputValue: string) => { + const createFolder = async (folderName: string) => { handleOrigin(origin); - const finalPath = `${computedPath}/${inputValue}`; + const finalPath = `${computedPath}/${folderName}`; + try { await folderList?.post({ path: finalPath }); invalidateQueries(); } catch (error: any) { - const path = error?.response?.data?.path; - const message = !isEmpty(path) ? path[0] : "Failed to create a folder."; - throw new Error(message); + const errorMessage = + error?.response?.data?.path?.[0] || "Failed to create a folder."; + throw new Error(errorMessage); } }; + const createFeedWithFile = ( + event: React.ChangeEvent<HTMLInputElement>, + type: string, + ) => { + setModalState({ + type: "createFeedWithFile", + isOpen: true, + additionalProps: { + createFeedWithFile: { + event, + type, + }, + }, + }); + }; + const shareFolder = async ( - inputValue: string, + username: string, additionalValues?: AdditionalValues, ) => { const permissions = @@ -127,19 +162,16 @@ export const useFolderOperations = ( ? "r" : "w"; - for (const selectedPayload of selectedPaths) { - const { payload } = selectedPayload; + for (const selectedItem of selectedPaths) { + const { payload } = selectedItem; try { - await payload.addUserPermission(inputValue, permissions); - } catch (e: any) { - const username = e?.response?.data?.username; - const non_field_errors = e?.response?.data?.non_field_errors; - const message = !isEmpty(username) - ? username[0] - : !isEmpty(non_field_errors) - ? non_field_errors[0] - : "Failed to share this folder."; - throw new Error(message); + await payload.addUserPermission(username, permissions); + } catch (error: any) { + const errorMessage = + error?.response?.data?.username?.[0] || + error?.response?.data?.non_field_errors?.[0] || + "Failed to share this folder."; + throw new Error(errorMessage); } } }; @@ -148,20 +180,41 @@ export const useFolderOperations = ( inputValue: string, additionalValues?: AdditionalValues, ) => { - if (modalInfo.type === "group") { - const client = ChrisAPIClient.getClient(); - await client.adminCreateGroup({ name: inputValue }); - // Todo: Error Handling - } else if (modalInfo.type === "folder") { - await createFolder(inputValue); - } else if (modalInfo.type === "share") { - await shareFolder(inputValue, additionalValues); + switch (modalState.type) { + case "group": { + const client = ChrisAPIClient.getClient(); + await client.adminCreateGroup({ name: inputValue }); + break; + } + + case "folder": + await createFolder(inputValue); + break; + + case "share": + await shareFolder(inputValue, additionalValues); + break; + + case "createFeedWithFile": { + const { event, type } = + modalState.additionalProps?.createFeedWithFile || {}; + if (type === "file") { + handleFileChange(event, inputValue); + } else if (type === "folder") { + handleFolderChange(event, inputValue); + } + break; + } + + default: + break; } - setModalInfo({ isOpen: false, type: "" }); + + setModalState({ isOpen: false, type: "" }); }; const handleModalSubmitMutation = useMutation({ - mutationFn: ({ + mutationFn: async ({ inputValue, additionalValues, }: { @@ -178,8 +231,8 @@ export const useFolderOperations = ( handleDuplicateMutation.mutate(); }; - const handleOperations = (key: string) => { - switch (key) { + const handleOperations = (operationKey: string) => { + switch (operationKey) { case "createFeed": { const paths = selectedPaths.map((payload) => payload.path); router.actions.createFeedWithData(paths); @@ -190,16 +243,11 @@ export const useFolderOperations = ( handleOrigin(origin); dispatch(setToggleCart()); dispatch( - startDownload({ - paths: selectedPaths, - username: username as string, - }), + startDownload({ paths: selectedPaths, username: username as string }), ); - // Invalidate the folders after a time limit. This is poorly designed, as this part of the UI assumes - // that a feed will be created within a certain time frame. Mixing Redux and React Query isn't effective. - // A better design needs to be considered. invalidateQueries(); break; + case "anonymize": handleOrigin(origin); dispatch(setToggleCart()); @@ -210,48 +258,56 @@ export const useFolderOperations = ( }), ); break; + case "delete": deleteMutation.mutate(selectedPaths); break; + case "newFolder": - setModalInfo({ isOpen: true, type: "folder" }); + setModalState({ isOpen: true, type: "folder" }); break; + case "fileUpload": - fileInput.current?.click(); + fileInputRef.current?.click(); break; + case "folderUpload": - folderInput.current?.click(); + folderInputRef.current?.click(); break; + case "createGroup": - setModalInfo({ isOpen: true, type: "group" }); + setModalState({ isOpen: true, type: "group" }); break; - case "merge": { + + case "merge": handleMerge(); break; - } - case "share": { - setModalInfo({ isOpen: true, type: "share" }); + + case "share": + setModalState({ isOpen: true, type: "share" }); break; - } - case "duplicate": { + case "duplicate": handleDuplicate(); break; - } + + default: + break; } }; return { - modalInfo, - userError, - folderInput, - fileInput, + modalState, + userRelatedError, + folderInputRef, + fileInputRef, handleFileChange, + createFeedWithFile, handleFolderChange, handleModalSubmitMutation, handleOperations, - contextHolder, - setUserErrors, - setModalInfo, + contextHolder: notificationContextHolder, + setUserRelatedError, + setModalState, }; }; diff --git a/src/store/cart/types.ts b/src/store/cart/types.ts index 99938ce6c..732472710 100644 --- a/src/store/cart/types.ts +++ b/src/store/cart/types.ts @@ -79,6 +79,7 @@ export interface UploadPayload { currentPath: string; invalidateFunc: () => void; createFeed?: boolean; + nameForFeed?: string; } export type OperationPayload = { From d676e85d7f30da3e30eec99bfb83eba41c96ff10 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Wed, 4 Sep 2024 15:12:26 -0400 Subject: [PATCH 163/337] feat: Create Feed for file and folder uploads in the Feed Table --- .../NewLibrary/components/ContextMenu.tsx | 30 +- .../NewLibrary/components/Operations.tsx | 292 ++++++++---------- .../NewLibrary/utils/useOperations.tsx | 16 +- src/store/cart/uploadSaga.ts | 66 ++-- 4 files changed, 188 insertions(+), 216 deletions(-) diff --git a/src/components/NewLibrary/components/ContextMenu.tsx b/src/components/NewLibrary/components/ContextMenu.tsx index b18df166a..f77e74da9 100644 --- a/src/components/NewLibrary/components/ContextMenu.tsx +++ b/src/components/NewLibrary/components/ContextMenu.tsx @@ -1,5 +1,6 @@ import type { FileBrowserFolderList } from "@fnndsc/chrisapi"; import type { DefaultError } from "@tanstack/react-query"; +import { matchPath } from "react-router"; import { Alert, Dropdown, type MenuProps } from "../../Antd"; import { ArchiveIcon, @@ -35,7 +36,7 @@ export const FolderContextMenu = (props: ContextMenuProps) => { origin, computedPath, folderList, - location.pathname === "/feeds", + matchPath({ path: "/feeds", end: true }, location.pathname) !== null, // This checks if the path matches and returns true or false ); const items: MenuProps["items"] = [ @@ -49,33 +50,10 @@ export const FolderContextMenu = (props: ContextMenuProps) => { { key: "delete", label: "Delete", icon: <DeleteIcon /> }, ]; - const modalTypeLabels: Record< - string, - { modalTitle: string; inputLabel: string } - > = { - group: { - modalTitle: "Create a new Group", - inputLabel: "Group Name", - }, - share: { - modalTitle: "Share this Folder", - inputLabel: "User Name", - }, - - default: { - modalTitle: "Create a new Folder", - inputLabel: "Folder Name", - }, - }; - - const { modalTitle, inputLabel } = - modalTypeLabels[modalState.type] || modalTypeLabels.default; - return ( <> <AddModal - operationType={modalState.type} - isOpen={modalState.isOpen} + modalState={modalState} onClose={() => setModalState({ isOpen: false, type: "" })} onSubmit={(inputValue, additionalValues) => handleModalSubmitMutation.mutate({ @@ -83,8 +61,6 @@ export const FolderContextMenu = (props: ContextMenuProps) => { additionalValues, }) } - modalTitle={modalTitle} - inputLabel={inputLabel} indicators={{ isPending: handleModalSubmitMutation.isPending, isError: handleModalSubmitMutation.isError, diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index b9a805b79..33bc61667 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -7,6 +7,8 @@ import { ChipGroup, Form, FormGroup, + HelperText, + HelperTextItem, Modal, TextInput, Toolbar, @@ -15,14 +17,13 @@ import { Tooltip, } from "@patternfly/react-core"; import type { DefaultError } from "@tanstack/react-query"; -import type React from "react"; import { Fragment, useEffect, useMemo, useState } from "react"; import { useDispatch } from "react-redux"; import { matchPath, useLocation } from "react-router"; import { getFileName } from "../../../api/common"; import { removeSelectedPayload } from "../../../store/cart/cartSlice"; import { useTypedSelector } from "../../../store/hooks"; -import { Alert, Dropdown, Spin } from "../../Antd"; +import { Alert, Dropdown } from "../../Antd"; import { AddIcon, ArchiveIcon, @@ -34,7 +35,7 @@ import { ShareIcon, } from "../../Icons"; import type { OriginState } from "../context"; -import { useFolderOperations } from "../utils/useOperations"; +import { type ModalState, useFolderOperations } from "../utils/useOperations"; import LayoutSwitch from "./LayoutSwitch"; import "./Operations.css"; @@ -57,17 +58,22 @@ interface OperationProps { }; } -const items = [ +const OPERATION_ITEMS = [ { key: "newFolder", label: "New Folder" }, { key: "fileUpload", label: "File Upload" }, { key: "folderUpload", label: "Folder Upload" }, ]; -const Operations = (props: OperationProps) => { +const Operations = ({ + origin, + computedPath, + folderList, + customStyle, + customClassName, +}: OperationProps) => { const location = useLocation(); - const { origin, computedPath, folderList, customStyle, customClassName } = - props; const dispatch = useDispatch(); + const { modalState, userRelatedError, @@ -85,10 +91,10 @@ const Operations = (props: OperationProps) => { origin, computedPath, folderList, - location.pathname === "/feeds", + matchPath({ path: "/feeds", end: true }, location.pathname) !== null, // This checks if the path matches and returns true or false ); - const { selectedPaths } = useTypedSelector((state) => state.cart); + const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const selectedPathsCount = selectedPaths.length; const renderOperationButton = ( @@ -114,11 +120,9 @@ const Operations = (props: OperationProps) => { <ToolbarItem> <Dropdown menu={{ - items, + items: OPERATION_ITEMS, selectable: true, - onClick: (info) => { - handleOperations(info.key); - }, + onClick: (info) => handleOperations(info.key), }} > <Button @@ -144,55 +148,41 @@ const Operations = (props: OperationProps) => { </ToolbarItem> {selectedPathsCount > 0 && ( <> - <ToolbarItem> - {renderOperationButton( - <CodeBranchIcon />, - "createFeed", - "Create a new feed", - )} - </ToolbarItem> - <ToolbarItem> - {renderOperationButton( - <DownloadIcon />, - "download", - "Download selected items", - )} - </ToolbarItem> - <ToolbarItem> - {renderOperationButton( - <ArchiveIcon />, - "anonymize", - "Anonymize selected items", - )} - </ToolbarItem> - <ToolbarItem> - {renderOperationButton( - <MergeIcon />, - "merge", - "Merge selected items", - )} - </ToolbarItem> - <ToolbarItem> - {renderOperationButton( - <DuplicateIcon />, - "duplicate", - "Copy selected items", - )} - </ToolbarItem> - <ToolbarItem> - {renderOperationButton( - <ShareIcon />, - "share", - "Share selected items", - )} - </ToolbarItem> - <ToolbarItem> - {renderOperationButton( - <DeleteIcon />, - "delete", - "Delete selected items", - )} - </ToolbarItem> + {renderOperationButton( + <CodeBranchIcon />, + "createFeed", + "Create a new feed", + )} + {renderOperationButton( + <DownloadIcon />, + "download", + "Download selected items", + )} + {renderOperationButton( + <ArchiveIcon />, + "anonymize", + "Anonymize selected items", + )} + {renderOperationButton( + <MergeIcon />, + "merge", + "Merge selected items", + )} + {renderOperationButton( + <DuplicateIcon />, + "duplicate", + "Copy selected items", + )} + {renderOperationButton( + <ShareIcon />, + "share", + "Share selected items", + )} + {renderOperationButton( + <DeleteIcon />, + "delete", + "Delete selected items", + )} <ToolbarItem> <ChipGroup> {selectedPaths.map((selection) => ( @@ -223,22 +213,10 @@ const Operations = (props: OperationProps) => { return ( <> <AddModal - operationType={modalState.type} - isOpen={modalState.isOpen} + modalState={modalState} onClose={() => setModalState({ isOpen: false, type: "" })} onSubmit={(inputValue, additionalValues) => - handleModalSubmitMutation.mutate({ - inputValue, - additionalValues, - }) - } - modalTitle={ - modalTypeLabels[modalState.type]?.modalTitle ?? - modalTypeLabels.default.modalTitle - } - inputLabel={ - modalTypeLabels[modalState.type]?.inputLabel ?? - modalTypeLabels.default.inputLabel + handleModalSubmitMutation.mutate({ inputValue, additionalValues }) } indicators={{ isPending: handleModalSubmitMutation.isPending, @@ -249,7 +227,7 @@ const Operations = (props: OperationProps) => { /> <input ref={fileInputRef} - multiple={true} + multiple type="file" hidden onChange={(e) => { @@ -263,10 +241,10 @@ const Operations = (props: OperationProps) => { <input ref={folderInputRef} type="file" + hidden //@ts-ignore webkitdirectory="" directory="" - hidden onChange={(e) => { if (matchPath({ path: "/feeds", end: true }, location.pathname)) { createFeedWithFile(e, "folder"); @@ -276,17 +254,13 @@ const Operations = (props: OperationProps) => { }} /> <Toolbar - style={{ ...customStyle?.toolbar }} + style={customStyle?.toolbar} className={customClassName?.toolbar} > - <ToolbarContent style={{ ...customStyle?.toolbarItem }}> + <ToolbarContent style={customStyle?.toolbarItem}> {toolbarItems} {location.pathname.startsWith("/library/") && ( - <ToolbarItem - align={{ - default: "alignRight", - }} - > + <ToolbarItem align={{ default: "alignRight" }}> <LayoutSwitch /> </ToolbarItem> )} @@ -298,7 +272,7 @@ const Operations = (props: OperationProps) => { export default Operations; -const modalTypeLabels: Record< +const MODAL_TYPE_LABELS: Record< string, { modalTitle: string; inputLabel: string } > = { @@ -314,7 +288,6 @@ const modalTypeLabels: Record< modalTitle: "Create Feed", inputLabel: "Feed Name", }, - default: { modalTitle: "Create a new Folder", inputLabel: "Folder Name", @@ -322,56 +295,53 @@ const modalTypeLabels: Record< }; interface AddModalProps { - operationType: string; - isOpen: boolean; + modalState: ModalState; onClose: () => void; onSubmit: (inputValue: string, additionalValues?: AdditionalValues) => void; - modalTitle: string; - inputLabel: string; indicators: { isPending: boolean; isError: boolean; error: DefaultError | null; clearErrors: () => void; }; - additionalValues?: { - [key: string]: any; - }; } -export const AddModal = (props: AddModalProps) => { - const { - isOpen, - onClose, - onSubmit, - modalTitle, - inputLabel, - indicators, - operationType, - } = props; +export const AddModal = ({ + modalState, + onClose, + onSubmit, + indicators, +}: AddModalProps) => { const [inputValue, setInputValue] = useState(""); const [additionalValues, setAdditionalValues] = useState<AdditionalValues>({ - share: { - read: false, - write: true, - }, + share: { read: false, write: true }, }); + const { modalTitle, inputLabel } = useMemo(() => { + const modalType = + MODAL_TYPE_LABELS[modalState.type] ?? MODAL_TYPE_LABELS.default; + return { + modalTitle: modalType.modalTitle, + inputLabel: modalType.inputLabel, + }; + }, [modalState.type]); + + useEffect(() => { + if (modalState.additionalProps?.createFeedWithFile) { + setInputValue( + modalState.additionalProps.createFeedWithFile.defaultFeedName, + ); + } + }, [modalState.type]); + const handleClose = () => { setInputValue(""); onClose(); }; - useEffect(() => { - async function fetchUsers() {} - if (modalTitle === "Share this Folder") { - fetchUsers(); - } - }, [modalTitle]); - return ( <Modal - isOpen={isOpen} + isOpen={modalState.isOpen} variant="small" aria-label={modalTitle} title={modalTitle} @@ -392,57 +362,61 @@ export const AddModal = (props: AddModalProps) => { aria-label={inputLabel} placeholder={inputLabel} /> + {modalState.type === "createFeedWithFile" && ( + <HelperText> + <HelperTextItem> + You can create a Feed by uploading a file. + </HelperTextItem> + </HelperText> + )} </FormGroup> - {operationType === "share" && ( - <FormGroup> - <Checkbox - id="read" - isChecked={additionalValues?.share.read} - label="Read" - onChange={(_event, checked) => { - setAdditionalValues({ - ...additionalValues, - share: { - ...additionalValues?.share, - read: checked, - }, - }); - }} - /> - <Checkbox - id="write" - isChecked={additionalValues?.share.write} - label="Write" - onChange={(_event, checked) => { - setAdditionalValues({ - ...additionalValues, - share: { - ...additionalValues?.share, - write: checked, - }, - }); - }} - /> - </FormGroup> + {modalState.type === "share" && ( + <Fragment> + <FormGroup fieldId="share-checkbox-group"> + <Checkbox + label="Read" + id="share-checkbox-1" + isChecked={additionalValues.share.read} + onChange={(_e, checked) => + setAdditionalValues((prevState) => ({ + share: { ...prevState.share, read: checked }, + })) + } + /> + <Checkbox + label="Write" + id="share-checkbox-2" + isChecked={additionalValues.share.write} + onChange={(_e, checked) => + setAdditionalValues((prevState) => ({ + share: { ...prevState.share, write: checked }, + })) + } + /> + </FormGroup> + </Fragment> )} - - <ActionGroup> - <Button - icon={indicators.isPending && <Spin />} - onClick={() => onSubmit(inputValue)} - > - Confirm - </Button> - <Button onClick={handleClose}>Cancel</Button> - </ActionGroup> {indicators.isError && ( <Alert - type="error" + message="Failed to create a new folder" description={indicators.error?.message} + type="error" + showIcon closable - onClose={indicators.clearErrors} + afterClose={() => indicators.clearErrors()} /> )} + <ActionGroup> + <Button + onClick={() => onSubmit(inputValue, additionalValues)} + isLoading={indicators.isPending} + > + Create + </Button> + <Button variant="link" onClick={handleClose}> + Cancel + </Button> + </ActionGroup> </Form> </Modal> ); diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index 018c59848..a0a789db2 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -17,7 +17,7 @@ import { type OriginState, useOperationsContext } from "../context"; import useDeletePayload from "../utils/useDeletePayload"; import useFeedOperations from "./useFeedOperations"; -interface ModalState { +export interface ModalState { type: string; isOpen: boolean; additionalProps?: Record<string, any>; @@ -48,7 +48,7 @@ export const useFolderOperations = ( const username = useTypedSelector((state) => state.user.username); const [modalState, setModalState] = useState<ModalState>({ isOpen: false, - type: "", + type: "folder", }); const [userRelatedError, setUserRelatedError] = useState<string>(""); const dispatch = useDispatch(); @@ -139,6 +139,17 @@ export const useFolderOperations = ( event: React.ChangeEvent<HTMLInputElement>, type: string, ) => { + let defaultFeedName = ""; + const files = Array.from(event.target.files || []); + if (type === "folder") { + const name = files[0].webkitRelativePath; + const fileName = name.split("/")[0]; + defaultFeedName = `Feed for ${fileName}`; + } else { + defaultFeedName = + files.length < 2 ? `Feed for ${files[0].name}` : "Multiple File Upload"; + } + setModalState({ type: "createFeedWithFile", isOpen: true, @@ -146,6 +157,7 @@ export const useFolderOperations = ( createFeedWithFile: { event, type, + defaultFeedName: defaultFeedName, }, }, }); diff --git a/src/store/cart/uploadSaga.ts b/src/store/cart/uploadSaga.ts index 2afcce035..c460be0f2 100644 --- a/src/store/cart/uploadSaga.ts +++ b/src/store/cart/uploadSaga.ts @@ -76,6 +76,7 @@ function* uploadFileBatch( batchSize: number, invalidateFunc: () => void, shouldCreateFeed?: boolean, + nameForFeed?: string, ) { const url = `${import.meta.env.VITE_CHRIS_UI_URL}userfiles/`; const firstBatch = files.slice(0, 1); // First batch with 1 file @@ -83,6 +84,7 @@ function* uploadFileBatch( const batches = [firstBatch, ...remainingBatches]; const totalFiles = files.length; let uploadedFilesCount = 0; + let uploadFileCountForFeed = 0; let cancelledUploads = false; let errorOccurred = false; let lastError = ""; @@ -165,6 +167,10 @@ function* uploadFileBatch( ); } + if (response && !error) { + uploadFileCountForFeed += 1; + } + if (response || error) { break; } @@ -188,6 +194,34 @@ function* uploadFileBatch( folderController, invalidateFunc, shouldCreateFeed, + nameForFeed, + ); + } + } + + if ( + !isFolder && + shouldCreateFeed && + uploadFileCountForFeed === files.length + ) { + // This creates a feed for multiple file uploads + try { + yield call( + createFeed, + [currentPath], + nameForFeed ? nameForFeed : "", + invalidateFunc, + ); + } catch (e) { + yield put( + setFileUploadStatus({ + step: "Error: Failed to create a feed", + fileName: nameForFeed as string, + progress: 0, + controller: null, + path: currentPath, + type: "file", + }), ); } } @@ -201,6 +235,7 @@ function* handleUpload(action: IActionTypeParam) { currentPath, createFeed, invalidateFunc, + nameForFeed, }: UploadPayload = action.payload; const client = ChrisAPIClient.getClient(); const batchSize = files.length > 500 ? 100 : 50; // Adjust the batch size as needed @@ -214,6 +249,7 @@ function* handleUpload(action: IActionTypeParam) { batchSize, invalidateFunc, createFeed, + nameForFeed, ); } @@ -323,28 +359,6 @@ function* updateFileUploadStatus( type: "file", }), ); - - if (isDone && response && shouldCreateFeed) { - try { - yield call( - createFeed, - [currentPath], - `Library upload for ${name}`, - invalidateFunc, - ); - } catch (e) { - yield put( - setFileUploadStatus({ - step: "Error: Failed to create a feed", - fileName: name, - progress, - controller: null, - path: currentPath, - type: "file", - }), - ); - } - } } function* updateFolderUploadStatus( @@ -355,6 +369,7 @@ function* updateFolderUploadStatus( controller: AbortController, invalidateFunc: () => void, shouldCreateFeed?: boolean, + nameForFeed?: string, ) { const name = file.webkitRelativePath; const fileName = name.split("/")[0]; @@ -362,12 +377,7 @@ function* updateFolderUploadStatus( const uploadDone = uploadedFilesCount === totalFiles; try { if (uploadDone && shouldCreateFeed) { - yield call( - createFeed, - [path], - `Library upload for ${fileName}`, - invalidateFunc, - ); + yield call(createFeed, [path], nameForFeed as string, invalidateFunc); } //invalidate the ui page if the upload is complete uploadDone && !shouldCreateFeed && invalidateFunc(); From 1ec04f0b7de9ec5636f60b823f5caa12ce5ba6cb Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Wed, 4 Sep 2024 16:48:38 -0400 Subject: [PATCH 164/337] feat: Rename a Feed --- .../NewLibrary/components/ContextMenu.tsx | 3 +- .../NewLibrary/components/Operations.tsx | 22 +- src/components/NewLibrary/utils/longpress.tsx | 15 ++ .../NewLibrary/utils/useOperations.tsx | 222 +++++++----------- 4 files changed, 126 insertions(+), 136 deletions(-) diff --git a/src/components/NewLibrary/components/ContextMenu.tsx b/src/components/NewLibrary/components/ContextMenu.tsx index f77e74da9..b59c732bf 100644 --- a/src/components/NewLibrary/components/ContextMenu.tsx +++ b/src/components/NewLibrary/components/ContextMenu.tsx @@ -8,6 +8,7 @@ import { DeleteIcon, DownloadIcon, DuplicateIcon, + EditIcon, MergeIcon, ShareIcon, } from "../../Icons"; @@ -46,7 +47,7 @@ export const FolderContextMenu = (props: ContextMenuProps) => { { key: "merge", label: "Merge", icon: <MergeIcon /> }, { key: "duplicate", label: "Copy", icon: <DuplicateIcon /> }, { key: "share", label: "Share", icon: <ShareIcon /> }, - + { key: "rename", label: "Rename", icon: <EditIcon /> }, { key: "delete", label: "Delete", icon: <DeleteIcon /> }, ]; diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index 33bc61667..604b9416f 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -31,6 +31,7 @@ import { DeleteIcon, DownloadIcon, DuplicateIcon, + EditIcon, MergeIcon, ShareIcon, } from "../../Icons"; @@ -178,6 +179,8 @@ const Operations = ({ "share", "Share selected items", )} + + {renderOperationButton(<EditIcon />, "rename", "Rename")} {renderOperationButton( <DeleteIcon />, "delete", @@ -274,23 +277,32 @@ export default Operations; const MODAL_TYPE_LABELS: Record< string, - { modalTitle: string; inputLabel: string } + { modalTitle: string; inputLabel: string; buttonLabel: string } > = { group: { modalTitle: "Create a new Group", inputLabel: "Group Name", + buttonLabel: "Create", }, share: { modalTitle: "Share this Folder", inputLabel: "User Name", + buttonLabel: "Share", + }, + rename: { + modalTitle: "Rename", + inputLabel: "Rename", + buttonLabel: "Rename", }, createFeedWithFile: { modalTitle: "Create Feed", inputLabel: "Feed Name", + buttonLabel: "Create", }, default: { modalTitle: "Create a new Folder", inputLabel: "Folder Name", + buttonLabel: "Create", }, }; @@ -317,12 +329,13 @@ export const AddModal = ({ share: { read: false, write: true }, }); - const { modalTitle, inputLabel } = useMemo(() => { + const { modalTitle, inputLabel, buttonLabel } = useMemo(() => { const modalType = MODAL_TYPE_LABELS[modalState.type] ?? MODAL_TYPE_LABELS.default; return { modalTitle: modalType.modalTitle, inputLabel: modalType.inputLabel, + buttonLabel: modalType.buttonLabel, }; }, [modalState.type]); @@ -365,7 +378,8 @@ export const AddModal = ({ {modalState.type === "createFeedWithFile" && ( <HelperText> <HelperTextItem> - You can create a Feed by uploading a file. + Please provide a name for your feed or hit 'Create' to use the + default name </HelperTextItem> </HelperText> )} @@ -411,7 +425,7 @@ export const AddModal = ({ onClick={() => onSubmit(inputValue, additionalValues)} isLoading={indicators.isPending} > - Create + {buttonLabel} </Button> <Button variant="link" onClick={handleClose}> Cancel diff --git a/src/components/NewLibrary/utils/longpress.tsx b/src/components/NewLibrary/utils/longpress.tsx index 1a202cbeb..6498db781 100644 --- a/src/components/NewLibrary/utils/longpress.tsx +++ b/src/components/NewLibrary/utils/longpress.tsx @@ -1,4 +1,5 @@ import type { + Feed, FileBrowserFolder, FileBrowserFolderFile, FileBrowserFolderLinkFile, @@ -7,6 +8,7 @@ import { Button, Tooltip } from "@patternfly/react-core"; import { useRef, useState } from "react"; import { useDispatch } from "react-redux"; import { useNavigate } from "react-router"; +import ChrisAPIClient from "../../../api/chrisapiclient"; import { clearSelectedPaths, setSelectedPaths, @@ -207,3 +209,16 @@ export function ShowInFolder({ </Tooltip> ); } + +export const fetchFeedForPath = async (path: string): Promise<Feed | null> => { + const feedMatches = path.match(/feed_(\d+)/); + const id = feedMatches ? feedMatches[1] : null; + + if (id) { + const client = ChrisAPIClient.getClient(); + const feed: Feed = (await client.getFeed(Number(id))) as Feed; + if (!feed) throw new Error("Failed to fetch the feed"); + return feed; + } + return null; +}; diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index a0a789db2..ad8676e55 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -1,7 +1,10 @@ -import type { FileBrowserFolderList } from "@fnndsc/chrisapi"; -import { useMutation } from "@tanstack/react-query"; import { useContext, useRef, useState } from "react"; import { useDispatch } from "react-redux"; +import { useMutation } from "@tanstack/react-query"; +import type { + FileBrowserFolder, + FileBrowserFolderList, +} from "@fnndsc/chrisapi"; import ChrisAPIClient from "../../../api/chrisapiclient"; import { MainRouterContext } from "../../../routes"; import { @@ -13,9 +16,12 @@ import { import { useTypedSelector } from "../../../store/hooks"; import { notification } from "../../Antd"; import type { AdditionalValues } from "../components/Operations"; -import { type OriginState, useOperationsContext } from "../context"; +import { useOperationsContext, type OriginState } from "../context"; import useDeletePayload from "../utils/useDeletePayload"; import useFeedOperations from "./useFeedOperations"; +import { catchError } from "../../../api/common"; +import { getFolderName } from "../components/FolderCard"; +import { fetchFeedForPath } from "./longpress"; export interface ModalState { type: string; @@ -23,8 +29,8 @@ export interface ModalState { additionalProps?: Record<string, any>; } -export const getCurrentTimestamp = () => { - return new Date() +export const getCurrentTimestamp = () => + new Date() .toLocaleString("en-US", { year: "numeric", month: "short", @@ -34,7 +40,6 @@ export const getCurrentTimestamp = () => { hour12: true, }) .replace(/[^a-zA-Z0-9]/g, "_"); -}; export const useFolderOperations = ( origin: OriginState, @@ -45,15 +50,18 @@ export const useFolderOperations = ( const { handleOrigin, invalidateQueries } = useOperationsContext(); const router = useContext(MainRouterContext); const { selectedPaths } = useTypedSelector((state) => state.cart); - const username = useTypedSelector((state) => state.user.username); + const username = useTypedSelector((state) => state.user.username) as string; + const dispatch = useDispatch(); + const [modalState, setModalState] = useState<ModalState>({ isOpen: false, type: "folder", }); const [userRelatedError, setUserRelatedError] = useState<string>(""); - const dispatch = useDispatch(); + const folderInputRef = useRef<HTMLInputElement>(null); const fileInputRef = useRef<HTMLInputElement>(null); + const [notificationAPI, notificationContextHolder] = notification.useNotification(); @@ -64,13 +72,12 @@ export const useFolderOperations = ( ); const resetInputField = (inputRef: React.RefObject<HTMLInputElement>) => { - if (inputRef.current) { - inputRef.current.value = ""; - } + if (inputRef.current) inputRef.current.value = ""; }; - const handleFileChange = async ( + const handleUpload = async ( event: React.ChangeEvent<HTMLInputElement>, + isFolder: boolean, name?: string, ) => { handleOrigin(origin); @@ -85,40 +92,15 @@ export const useFolderOperations = ( dispatch( startUpload({ files, - isFolder: false, + isFolder, currentPath: uploadPath as string, invalidateFunc: invalidateQueries, createFeed, nameForFeed: name, }), ); - resetInputField(fileInputRef); - }; - - const handleFolderChange = async ( - event: React.ChangeEvent<HTMLInputElement>, - name?: string, - ) => { - handleOrigin(origin); - const files = Array.from(event.target.files || []); - const uniqueName = name - ? `${name}_${getCurrentTimestamp()}` - : getCurrentTimestamp(); - const uploadPath = createFeed - ? `home/${username}/uploads/${uniqueName}` - : computedPath; - dispatch( - startUpload({ - files, - isFolder: true, - currentPath: uploadPath as string, - invalidateFunc: invalidateQueries, - createFeed, - nameForFeed: name, - }), - ); - resetInputField(folderInputRef); + resetInputField(isFolder ? folderInputRef : fileInputRef); }; const createFolder = async (folderName: string) => { @@ -139,32 +121,25 @@ export const useFolderOperations = ( event: React.ChangeEvent<HTMLInputElement>, type: string, ) => { - let defaultFeedName = ""; const files = Array.from(event.target.files || []); - if (type === "folder") { - const name = files[0].webkitRelativePath; - const fileName = name.split("/")[0]; - defaultFeedName = `Feed for ${fileName}`; - } else { - defaultFeedName = - files.length < 2 ? `Feed for ${files[0].name}` : "Multiple File Upload"; - } + const defaultFeedName = + type === "folder" + ? `Feed for ${files[0].webkitRelativePath.split("/")[0]}` + : files.length < 2 + ? `Feed for ${files[0].name}` + : "Multiple File Upload"; setModalState({ type: "createFeedWithFile", isOpen: true, additionalProps: { - createFeedWithFile: { - event, - type, - defaultFeedName: defaultFeedName, - }, + createFeedWithFile: { event, type, defaultFeedName }, }, }); }; const shareFolder = async ( - username: string, + targetUsername: string, additionalValues?: AdditionalValues, ) => { const permissions = @@ -174,10 +149,9 @@ export const useFolderOperations = ( ? "r" : "w"; - for (const selectedItem of selectedPaths) { - const { payload } = selectedItem; + for (const { payload } of selectedPaths) { try { - await payload.addUserPermission(username, permissions); + await payload.addUserPermission(targetUsername, permissions); } catch (error: any) { const errorMessage = error?.response?.data?.username?.[0] || @@ -188,6 +162,32 @@ export const useFolderOperations = ( } }; + const renameFolder = async (inputValue: string) => { + handleOrigin(origin); + if (createFeed) { + // Renaming a feed + for (const { payload } of selectedPaths) { + try { + // This code is temporary + const fileName = getFolderName( + payload as FileBrowserFolder, + payload.data.path, + ); + const feed = await fetchFeedForPath(fileName); + if (feed) { + await feed.put({ + name: inputValue, + }); + } + } catch (error: any) { + const error_message = catchError(error).error_message; + throw new Error(error_message); + } + } + invalidateQueries(); + } + }; + const handleModalSubmit = async ( inputValue: string, additionalValues?: AdditionalValues, @@ -198,26 +198,24 @@ export const useFolderOperations = ( await client.adminCreateGroup({ name: inputValue }); break; } - case "folder": await createFolder(inputValue); break; - case "share": await shareFolder(inputValue, additionalValues); break; + case "rename": { + await renameFolder(inputValue); + break; + } + case "createFeedWithFile": { const { event, type } = modalState.additionalProps?.createFeedWithFile || {}; - if (type === "file") { - handleFileChange(event, inputValue); - } else if (type === "folder") { - handleFolderChange(event, inputValue); - } + await handleUpload(event, type === "folder", inputValue); break; } - default: break; } @@ -235,77 +233,35 @@ export const useFolderOperations = ( }) => handleModalSubmit(inputValue, additionalValues), }); - const handleMerge = () => { - handleMergeMutation.mutate(); - }; - - const handleDuplicate = () => { - handleDuplicateMutation.mutate(); - }; - const handleOperations = (operationKey: string) => { - switch (operationKey) { - case "createFeed": { - const paths = selectedPaths.map((payload) => payload.path); + const operationsMap: Record<string, () => void> = { + createFeed: () => { + const paths = selectedPaths.map(({ path }) => path); router.actions.createFeedWithData(paths); - break; - } - - case "download": + }, + download: () => { handleOrigin(origin); dispatch(setToggleCart()); - dispatch( - startDownload({ paths: selectedPaths, username: username as string }), - ); + dispatch(startDownload({ paths: selectedPaths, username: username })); invalidateQueries(); - break; - - case "anonymize": + }, + anonymize: () => { handleOrigin(origin); dispatch(setToggleCart()); - dispatch( - startAnonymize({ - paths: selectedPaths, - username: username as string, - }), - ); - break; - - case "delete": - deleteMutation.mutate(selectedPaths); - break; - - case "newFolder": - setModalState({ isOpen: true, type: "folder" }); - break; - - case "fileUpload": - fileInputRef.current?.click(); - break; - - case "folderUpload": - folderInputRef.current?.click(); - break; - - case "createGroup": - setModalState({ isOpen: true, type: "group" }); - break; - - case "merge": - handleMerge(); - break; - - case "share": - setModalState({ isOpen: true, type: "share" }); - break; - - case "duplicate": - handleDuplicate(); - break; - - default: - break; - } + dispatch(startAnonymize({ paths: selectedPaths, username })); + }, + delete: () => deleteMutation.mutate(selectedPaths), + newFolder: () => setModalState({ isOpen: true, type: "folder" }), + fileUpload: () => fileInputRef.current?.click(), + folderUpload: () => folderInputRef.current?.click(), + createGroup: () => setModalState({ isOpen: true, type: "group" }), + merge: handleMergeMutation.mutate, + share: () => setModalState({ isOpen: true, type: "share" }), + rename: () => setModalState({ isOpen: true, type: "rename" }), + duplicate: handleDuplicateMutation.mutate, + }; + + operationsMap[operationKey]?.(); }; return { @@ -313,9 +269,13 @@ export const useFolderOperations = ( userRelatedError, folderInputRef, fileInputRef, - handleFileChange, + handleFileChange: (e: React.ChangeEvent<HTMLInputElement>, name?: string) => + handleUpload(e, false, name), createFeedWithFile, - handleFolderChange, + handleFolderChange: ( + e: React.ChangeEvent<HTMLInputElement>, + name?: string, + ) => handleUpload(e, true, name), handleModalSubmitMutation, handleOperations, contextHolder: notificationContextHolder, From fb5dd4026c9470e431b13c0551dae0e5359c2737 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Wed, 4 Sep 2024 17:09:42 -0400 Subject: [PATCH 165/337] feat: Do not allow empty values in the Operation Modal --- src/components/NewLibrary/components/Operations.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index 604b9416f..f9a381959 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -424,6 +424,7 @@ export const AddModal = ({ <Button onClick={() => onSubmit(inputValue, additionalValues)} isLoading={indicators.isPending} + isDisabled={!inputValue} > {buttonLabel} </Button> From 1f9379dfaa2bd94b7e4fe95cef417f0a6409b26b Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 5 Sep 2024 10:34:10 -0400 Subject: [PATCH 166/337] feat: Disable rename for library and file browser table --- .../NewLibrary/components/ContextMenu.tsx | 16 +++++++++------- .../NewLibrary/components/Operations.tsx | 11 +++++------ src/store/cart/downloadSaga.ts | 2 +- src/store/cart/uploadSaga.ts | 2 +- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/components/NewLibrary/components/ContextMenu.tsx b/src/components/NewLibrary/components/ContextMenu.tsx index b59c732bf..c8cbbf61e 100644 --- a/src/components/NewLibrary/components/ContextMenu.tsx +++ b/src/components/NewLibrary/components/ContextMenu.tsx @@ -25,6 +25,8 @@ interface ContextMenuProps { export const FolderContextMenu = (props: ContextMenuProps) => { const { children, origin, folderList, computedPath } = props; + const isFeedsTable = + matchPath({ path: "/feeds", end: true }, location.pathname) !== null; // This checks if the path matches and returns true or false const { modalState, userRelatedError, @@ -33,12 +35,7 @@ export const FolderContextMenu = (props: ContextMenuProps) => { contextHolder, setUserRelatedError, setModalState, - } = useFolderOperations( - origin, - computedPath, - folderList, - matchPath({ path: "/feeds", end: true }, location.pathname) !== null, // This checks if the path matches and returns true or false - ); + } = useFolderOperations(origin, computedPath, folderList, isFeedsTable); const items: MenuProps["items"] = [ { key: "createFeed", label: "Create Feed", icon: <CodeBranchIcon /> }, @@ -47,7 +44,12 @@ export const FolderContextMenu = (props: ContextMenuProps) => { { key: "merge", label: "Merge", icon: <MergeIcon /> }, { key: "duplicate", label: "Copy", icon: <DuplicateIcon /> }, { key: "share", label: "Share", icon: <ShareIcon /> }, - { key: "rename", label: "Rename", icon: <EditIcon /> }, + { + key: "rename", + label: "Rename", + icon: <EditIcon />, + disabled: !isFeedsTable, + }, { key: "delete", label: "Delete", icon: <DeleteIcon /> }, ]; diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index f9a381959..d182c24c3 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -74,6 +74,8 @@ const Operations = ({ }: OperationProps) => { const location = useLocation(); const dispatch = useDispatch(); + const isFeedsTable = + matchPath({ path: "/feeds", end: true }, location.pathname) !== null; // This checks if the path matches and returns true or false const { modalState, @@ -88,12 +90,7 @@ const Operations = ({ contextHolder, setUserRelatedError, setModalState, - } = useFolderOperations( - origin, - computedPath, - folderList, - matchPath({ path: "/feeds", end: true }, location.pathname) !== null, // This checks if the path matches and returns true or false - ); + } = useFolderOperations(origin, computedPath, folderList, isFeedsTable); const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const selectedPathsCount = selectedPaths.length; @@ -105,11 +102,13 @@ const Operations = ({ ) => ( <Tooltip content={ariaLabel}> <Button + style={{ marginRight: "1em" }} icon={icon} size="sm" onClick={() => handleOperations(operationKey)} variant="tertiary" aria-label={ariaLabel} + isDisabled={operationKey === "rename" && !isFeedsTable} /> </Tooltip> ); diff --git a/src/store/cart/downloadSaga.ts b/src/store/cart/downloadSaga.ts index 5b28b2914..888066df2 100644 --- a/src/store/cart/downloadSaga.ts +++ b/src/store/cart/downloadSaga.ts @@ -20,8 +20,8 @@ import { downloadFile } from "../hooks"; import { setFileDownloadStatus, setFolderDownloadStatus, - startDownload, startAnonymize, + startDownload, } from "./cartSlice"; import { DownloadTypes, diff --git a/src/store/cart/uploadSaga.ts b/src/store/cart/uploadSaga.ts index c460be0f2..72ffd9aec 100644 --- a/src/store/cart/uploadSaga.ts +++ b/src/store/cart/uploadSaga.ts @@ -137,7 +137,7 @@ function* uploadFileBatch( errorOccurred = true; lastError = error; // Store the last error message - // We need to cancel the folder upload manually since it will upload other files in the list and they will all error out due to the path being invalid path + // We need to cancel the folder upload manually since it will upload other files in the list and they will all error out due to the path being an invalid path isFolder && folderController.abort(); if (!isFolder) { // No need to manually cancel the upload for a single file as the request will fail. From 57a333ed449a395ea76491e84fb53ad23554df89 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 5 Sep 2024 11:15:06 -0400 Subject: [PATCH 167/337] fix: Update the useOperations hook --- src/app.css | 4 ++-- src/components/Feeds/DrawerUtils.tsx | 2 +- src/components/NewLibrary/utils/useOperations.tsx | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/app.css b/src/app.css index c4e62affd..c8b3c18aa 100644 --- a/src/app.css +++ b/src/app.css @@ -34,8 +34,8 @@ } ::-webkit-scrollbar { - width: 0.5rem; - height: 0.5rem; + width: 0.5em; + height: 0.5em; } ::-webkit-scrollbar-track { diff --git a/src/components/Feeds/DrawerUtils.tsx b/src/components/Feeds/DrawerUtils.tsx index 3d80be91b..4fe064108 100644 --- a/src/components/Feeds/DrawerUtils.tsx +++ b/src/components/Feeds/DrawerUtils.tsx @@ -86,7 +86,7 @@ export const DrawerActionButton = ({ /> ) : ( <Button - style={{ paddingLeft: "0.5em", paddingRight: "0.5em" }} + style={{ paddingLeft: "0.5em", paddingRight: "0.5em", zIndex: 999 }} onClick={handleMaximize} variant="link" icon={<ExpandArrowsAltIcon />} diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index ad8676e55..f57e24100 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -22,6 +22,7 @@ import useFeedOperations from "./useFeedOperations"; import { catchError } from "../../../api/common"; import { getFolderName } from "../components/FolderCard"; import { fetchFeedForPath } from "./longpress"; +import { create } from "lodash"; export interface ModalState { type: string; @@ -85,6 +86,7 @@ export const useFolderOperations = ( const uniqueName = name ? `${name}_${getCurrentTimestamp()}` : getCurrentTimestamp(); + const uploadPath = createFeed ? `home/${username}/uploads/${uniqueName}` : computedPath; From c6f0d57b15c3deeb6dede21b6dcf966fd000a54f Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 5 Sep 2024 11:58:33 -0400 Subject: [PATCH 168/337] feat: Update the store saga with a fix --- src/store/cart/uploadSaga.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/store/cart/uploadSaga.ts b/src/store/cart/uploadSaga.ts index 72ffd9aec..5aa096b64 100644 --- a/src/store/cart/uploadSaga.ts +++ b/src/store/cart/uploadSaga.ts @@ -373,14 +373,17 @@ function* updateFolderUploadStatus( ) { const name = file.webkitRelativePath; const fileName = name.split("/")[0]; - const path = `${currentPath}/${name}`; const uploadDone = uploadedFilesCount === totalFiles; try { if (uploadDone && shouldCreateFeed) { - yield call(createFeed, [path], nameForFeed as string, invalidateFunc); + yield call( + createFeed, + [`${currentPath}/${fileName}`], + nameForFeed as string, + invalidateFunc, + ); } //invalidate the ui page if the upload is complete - uploadDone && !shouldCreateFeed && invalidateFunc(); yield put( setFolderUploadStatus({ step: uploadDone ? "Upload Complete" : "Uploading...", @@ -392,6 +395,7 @@ function* updateFolderUploadStatus( type: "folder", }), ); + uploadDone && !shouldCreateFeed && invalidateFunc(); } catch (e) { yield put( setFolderUploadStatus({ From 89c1b96f08feb268dd47f70d72e48052afbef67b Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 5 Sep 2024 12:03:06 -0400 Subject: [PATCH 169/337] feat: Add a fixed width to the Newly Added Label to prevent layout shifts in the table --- .../NewLibrary/components/LibraryTable.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index c4eb53c47..c6f2ce1d2 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -175,11 +175,15 @@ const BaseRow: React.FC<RowProps> = ({ > {name} </Button> - {isNewResource && ( - <Tag style={{ marginLeft: "0.25em" }} color="#3E8635"> - Newly Added - </Tag> - )} + <span + style={{ + display: "inline-block", + width: "90px", + marginLeft: "0.25em", + }} + > + {isNewResource ? <Tag color="#3E8635">Newly Added</Tag> : null} + </span> </Td> <Td dataLabel={columnNames.date}> {format(new Date(date), "dd MMM yyyy, HH:mm")} From 0536e14ebbb4a33fbc552857970f0521902d5de3 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 5 Sep 2024 12:21:36 -0400 Subject: [PATCH 170/337] feat: Handle bad feed names in the Feed Table --- src/store/cart/downloadSaga.ts | 55 +++++++++++++++++++++------------- src/store/cart/uploadSaga.ts | 1 + 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/store/cart/downloadSaga.ts b/src/store/cart/downloadSaga.ts index 888066df2..91b490397 100644 --- a/src/store/cart/downloadSaga.ts +++ b/src/store/cart/downloadSaga.ts @@ -28,6 +28,7 @@ import { type PayloadTypes, type SelectionPayload, } from "./types"; +import { create } from "lodash"; export function* setStatus( type: string, @@ -53,29 +54,41 @@ export async function createFeed( feedName: string, invalidateFunc?: () => void, ) { - const client = ChrisAPIClient.getClient(); - const dircopy: Plugin | undefined = (await getPlugin("pl-dircopy")) as - | Plugin - | undefined; - if (!dircopy) { - throw new Error("pl-dircopy was not registered"); - } - const createdInstance: PluginInstance = (await client.createPluginInstance( - dircopy.data.id, - //@ts-ignore - { dir: path.length > 0 ? path.join(",") : path[0] }, - )) as PluginInstance; - if (!createdInstance) { - throw new Error("Failed to create an instance of pl-dircopy"); - } - const feed = (await createdInstance.getFeed()) as Feed; - if (!feed) { + let createdInstance: PluginInstance | null = null; + let feed: Feed | null = null; + try { + const client = ChrisAPIClient.getClient(); + const dircopy: Plugin | undefined = (await getPlugin("pl-dircopy")) as + | Plugin + | undefined; + if (!dircopy) { + throw new Error("pl-dircopy was not registered"); + } + createdInstance = (await client.createPluginInstance( + dircopy.data.id, + //@ts-ignore + { dir: path.length > 0 ? path.join(",") : path[0] }, + )) as PluginInstance; + if (!createdInstance) { + throw new Error("Failed to create an instance of pl-dircopy"); + } + feed = (await createdInstance.getFeed()) as Feed; + await feed.put({ name: feedName }); + //invalidate the ui page if the feed is created. Do this only if invalidate func is passed in. + invalidateFunc?.(); + return { createdInstance, feed }; + } catch (e) { + if (createdInstance) { + await createdInstance.put({ + status: "cancelled", + }); + } + if (feed) { + await feed.delete(); + } + throw new Error("Failed to create a Feed"); } - await feed.put({ name: feedName }); - //invalidate the ui page if the feed is created. Do this only if invalidate func is passed in. - invalidateFunc?.(); - return { createdInstance, feed }; } function* downloadFolder( diff --git a/src/store/cart/uploadSaga.ts b/src/store/cart/uploadSaga.ts index 5aa096b64..9735a64e5 100644 --- a/src/store/cart/uploadSaga.ts +++ b/src/store/cart/uploadSaga.ts @@ -213,6 +213,7 @@ function* uploadFileBatch( invalidateFunc, ); } catch (e) { + console.log("E", e); yield put( setFileUploadStatus({ step: "Error: Failed to create a feed", From 2dd89f307f55265bbb14a86213e327ce4efb06ab Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 5 Sep 2024 15:05:34 -0400 Subject: [PATCH 171/337] feat: Implement sorting in the Feeds List Table --- src/components/Feeds/FeedListView.tsx | 205 ++++++++++++------ .../NewLibrary/components/LibraryTable.tsx | 59 ++++- src/store/cart/uploadSaga.ts | 1 - 3 files changed, 197 insertions(+), 68 deletions(-) diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index b7db6379e..318a9dac5 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -15,11 +15,11 @@ import { Tooltip, } from "@patternfly/react-core"; import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; -import { useQuery } from "@tanstack/react-query"; +import { useQuery, useQueries } from "@tanstack/react-query"; import { format } from "date-fns"; import { debounce } from "lodash"; import type React from "react"; -import { useContext, useEffect, useState } from "react"; +import { useContext, useEffect, useState, useMemo } from "react"; import { useNavigate } from "react-router"; import { useTypedSelector } from "../../store/hooks"; import { AddNodeProvider } from "../AddNode/context"; @@ -37,8 +37,67 @@ import WrapperConnect from "../Wrapper"; import FeedSearch from "./FeedsSearch"; import { useFeedListData } from "./useFeedListData"; import { getPluginInstanceDetails } from "./utilties"; - const { Paragraph } = Typography; +import { SortByDirection } from "@patternfly/react-table"; + +interface ColumnDefinition { + id: string; + label: string; + comparator: (a: Feed, b: Feed, detailsA: any, detailsB: any) => number; +} + +const COLUMN_DEFINITIONS: ColumnDefinition[] = [ + { + id: "id", + label: "ID", + comparator: (a, b) => a.data.id - b.data.id, + }, + { + id: "analysis", + label: "Analysis", + comparator: (a, b) => a.data.name.localeCompare(b.data.name), + }, + { + id: "created", + label: "Created", + comparator: (a, b) => + new Date(a.data.creation_date).getTime() - + new Date(b.data.creation_date).getTime(), + }, + { + id: "creator", + label: "Creator", + comparator: (a, b) => + a.data.owner_username.localeCompare(b.data.owner_username), + }, + { + id: "runtime", + label: "Run Time", + comparator: (_a, _b, detailsA, detailsB) => { + const timeA = detailsA?.time || "0"; + const timeB = detailsB?.time || "0"; + return timeA.localeCompare(timeB); + }, + }, + { + id: "size", + label: "Size", + comparator: (_a, _b, detailsA, detailsB) => { + const sizeA = detailsA?.size || "0"; + const sizeB = detailsB?.size || "0"; + return sizeA.localeCompare(sizeB); + }, + }, + { + id: "status", + label: "Status", + comparator: (_a, _b, detailsA, detailsB) => { + const progressA = detailsA?.progress || 0; + const progressB = detailsB?.progress || 0; + return progressA - progressB; + }, + }, +]; const TableSelectable: React.FC = () => { const navigate = useNavigate(); @@ -46,6 +105,68 @@ const TableSelectable: React.FC = () => { useFeedListData(); const isLoggedIn = useTypedSelector((state) => state.user.isLoggedIn); const { perPage, page, type, search, searchType } = searchFolderData; + const [activeSortIndex, setActiveSortIndex] = useState<number>(0); + const [activeSortDirection, setActiveSortDirection] = + useState<SortByDirection>(SortByDirection.desc); + + const feedQueries = useQueries({ + queries: feedsToDisplay.map((feed) => ({ + queryKey: ["feedDetails", feed.data.id], + queryFn: async () => { + const res = await getPluginInstanceDetails(feed); + return { [feed.data.id]: { details: res } }; + }, + refetchInterval: (data: any) => { + const details = data?.[feed.data.id]?.details; + if (details?.progress === 100 || details?.error === true) { + return false; // Stop polling + } + return 2000; // Poll every 2 seconds + }, + })), + }); + + const feedDetails = useMemo(() => { + return Object.assign({}, ...feedQueries.map((query) => query.data || {})); + }, [feedQueries]); + + const getSortParams = (columnIndex: number) => ({ + sortBy: { + index: activeSortIndex as number, + direction: activeSortDirection, + }, + onSort: ( + _event: React.MouseEvent, + index: number, + direction: SortByDirection, + ) => { + setActiveSortIndex(index); + setActiveSortDirection(direction); + }, + columnIndex, + }); + + const sortedFeeds = useMemo(() => { + if (activeSortIndex !== null && feedDetails) { + const comparator = COLUMN_DEFINITIONS[activeSortIndex].comparator; + return [...feedsToDisplay].sort((a, b) => + activeSortDirection === SortByDirection.asc + ? comparator( + a, + b, + feedDetails[a.data.id]?.details, + feedDetails[b.data.id]?.details, + ) + : comparator( + b, + a, + feedDetails[b.data.id]?.details, + feedDetails[a.data.id]?.details, + ), + ); + } + return feedsToDisplay; + }, [feedsToDisplay, activeSortIndex, activeSortDirection, feedDetails]); const onSetPage = ( _: React.MouseEvent | React.KeyboardEvent | MouseEvent, @@ -85,16 +206,6 @@ const TableSelectable: React.FC = () => { } }, [isLoggedIn, navigate, perPage, page, searchType, search, type]); - const columnNames = { - id: "ID", - analysis: "Analysis", - created: "Created", - creator: "Creator", - runtime: "Run Time", - size: "Size", - status: "Status", - }; - const generatePagination = (feedCount?: number) => { if (!feedCount && loadingFeedState) { return <Skeleton width="25%" screenreaderText="Loaded Feed Count" />; @@ -184,21 +295,23 @@ const TableSelectable: React.FC = () => { <Thead> <Tr> <Th /> - {Object.values(columnNames).map((name) => ( - <Th key={name}>{name}</Th> + {COLUMN_DEFINITIONS.map((column, columnIndex) => ( + <Th key={column.id} sort={getSortParams(columnIndex)}> + {column.label} + </Th> ))} </Tr> </Thead> <Tbody> - {feedsToDisplay.map((feed, rowIndex) => ( + {sortedFeeds.map((feed, rowIndex) => ( <TableRow key={feed.data.id} feed={feed} rowIndex={rowIndex} - columnNames={columnNames} allFeeds={feedsToDisplay} type={type} additionalKeys={[perPage, page, type, search, searchType]} + details={feedDetails?.[feed.data.id]?.details} /> ))} </Tbody> @@ -217,60 +330,26 @@ interface TableRowProps { rowIndex: number; feed: Feed; allFeeds: Feed[]; - columnNames: { - id: string; - analysis: string; - created: string; - creator: string; - runtime: string; - size: string; - status: string; - }; type: string; additionalKeys: string[]; + details: any; } const TableRow: React.FC<TableRowProps> = ({ rowIndex, feed, - columnNames, additionalKeys, + details, }) => { const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { handlers } = useLongPress(); const { handleOnClick } = handlers; const navigate = useNavigate(); - const [intervalMs, setIntervalMs] = useState(2000); const { isDarkTheme } = useContext(ThemeContext); - - const { data } = useQuery({ - queryKey: ["feedResources", feed], - queryFn: async () => { - try { - const res = await getPluginInstanceDetails(feed); - if (res.progress === 100 || res.error === true) { - setIntervalMs(0); - } - - return { - [feed.data.id]: { - details: res, - }, - }; - } catch (error) { - setIntervalMs(0); - return {}; - } - }, - refetchInterval: intervalMs, - }); - const getFolderForThisFeed = async () => { const payload = await feed.getFolder(); return payload; }; - - const details = data?.[feed.data.id].details; const backgroundColor = isDarkTheme ? "#002952" : "#E7F1FA"; const backgroundRow = details && details.progress < 100 && !details.error @@ -342,23 +421,19 @@ const TableRow: React.FC<TableRowProps> = ({ }, }} /> - <Td dataLabel={columnNames.id}>{feed.data.id}</Td> + <Td dataLabel="ID">{feed.data.id}</Td> - <Td dataLabel={columnNames.analysis}> + <Td dataLabel="analysis"> <FeedInfoColumn feed={feed} onClick={onFeedNameClick} /> </Td> - <Td dataLabel={columnNames.created}> + <Td dataLabel="created"> {format(new Date(feed.data.creation_date), "dd MMM yyyy, HH:mm")} </Td> - <Td dataLabel={columnNames.creator}>{feed.data.owner_username}</Td> - <Td dataLabel={columnNames.runtime}> - {data?.[feed.data.id].details.time} - </Td> - <Td dataLabel={columnNames.size}> - {data?.[feed.data.id].details.size} - </Td> - <Td dataLabel={columnNames.status}> - <DonutUtilization details={data?.[feed.data.id].details} /> + <Td dataLabel="creator">{feed.data.owner_username}</Td> + <Td dataLabel="runtime">{details?.time}</Td> + <Td dataLabel="size">{details?.size}</Td> + <Td dataLabel="status"> + <DonutUtilization details={details} /> </Td> </Tr> </FolderContextMenu> diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index c6f2ce1d2..cfe92e872 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -6,6 +6,9 @@ import type { import { Button } from "@patternfly/react-core"; import { Caption, + type ISortBy, + type OnSort, + type SortByDirection, Table, Tbody, Td, @@ -217,12 +220,59 @@ const LibraryTable: React.FC<TableProps> = ({ const navigate = useNavigate(); const [preview, setShowPreview] = useState(false); const [selectedFile, setSelectedFile] = useState<FileBrowserFolderFile>(); + const [sortBy, setSortBy] = useState<ISortBy>({ + index: 0, + direction: "asc", + }); const handleFileClick = (file: FileBrowserFolderFile) => { setSelectedFile(file); setShowPreview(true); }; + const onSort: OnSort = (_event, columnIndex, sortByDirection) => { + setSortBy({ index: columnIndex, direction: sortByDirection }); + return sortRows(columnIndex, sortByDirection); + }; + + const sortRows = (index: number, direction: SortByDirection) => { + const sortedData = { ...data }; + if (index === 1) { + sortedData.folders.sort( + (a, b) => + getFolderName(a, computedPath).localeCompare( + getFolderName(b, computedPath), + ) * (direction === "asc" ? 1 : -1), + ); + sortedData.files.sort( + (a, b) => + getFileName(a).localeCompare(getFileName(b)) * + (direction === "asc" ? 1 : -1), + ); + sortedData.linkFiles.sort( + (a, b) => + getLinkFileName(a).localeCompare(getLinkFileName(b)) * + (direction === "asc" ? 1 : -1), + ); + } else if (index === 2) { + sortedData.folders.sort((a, b) => { + const dateA = new Date(a.data.creation_date).getTime(); + const dateB = new Date(b.data.creation_date).getTime(); + return (dateA - dateB) * (direction === "asc" ? 1 : -1); + }); + sortedData.files.sort((a, b) => { + const dateA = new Date(a.data.creation_date).getTime(); + const dateB = new Date(b.data.creation_date).getTime(); + return (dateA - dateB) * (direction === "asc" ? 1 : -1); + }); + sortedData.linkFiles.sort((a, b) => { + const dateA = new Date(a.data.creation_date).getTime(); + const dateB = new Date(b.data.creation_date).getTime(); + return (dateA - dateB) * (direction === "asc" ? 1 : -1); + }); + } + }; + return ( <React.Fragment> <Drawer @@ -243,13 +293,18 @@ const LibraryTable: React.FC<TableProps> = ({ className="library-table" variant="compact" aria-label="Simple table" + isStriped={true} > <Caption>Data Library</Caption> <Thead> <Tr> <Th arial-label="Select a row" /> - <Th name="name">{columnNames.name}</Th> - <Th name="date">{columnNames.date}</Th> + <Th sort={{ sortBy, onSort, columnIndex: 1 }} name="name"> + {columnNames.name} + </Th> + <Th sort={{ sortBy, onSort, columnIndex: 2 }} name="date"> + {columnNames.date} + </Th> <Th name="owner">{columnNames.owner}</Th> <Th name="size">{columnNames.size}</Th> </Tr> diff --git a/src/store/cart/uploadSaga.ts b/src/store/cart/uploadSaga.ts index 9735a64e5..5aa096b64 100644 --- a/src/store/cart/uploadSaga.ts +++ b/src/store/cart/uploadSaga.ts @@ -213,7 +213,6 @@ function* uploadFileBatch( invalidateFunc, ); } catch (e) { - console.log("E", e); yield put( setFileUploadStatus({ step: "Error: Failed to create a feed", From e7f8df497c0d67620c4f867daed6e913ce27904a Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 5 Sep 2024 16:08:19 -0400 Subject: [PATCH 172/337] feat: Update the "CreateFeed" option in the Library Page --- .../FeedOutputBrowser/FeedOutputBrowser.tsx | 8 +- .../FeedOutputBrowser/FileBrowser.tsx | 135 ++++++++---------- src/components/FeedOutputBrowser/types.ts | 2 +- .../FeedOutputBrowser/useFeedBrowser.tsx | 3 +- src/components/Feeds/FeedListView.tsx | 6 +- .../NewLibrary/components/Operations.tsx | 25 ++-- .../NewLibrary/utils/useOperations.tsx | 50 +++++-- src/store/cart/downloadSaga.ts | 1 - 8 files changed, 126 insertions(+), 104 deletions(-) diff --git a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx index 293ddd532..5eca21fb5 100644 --- a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx +++ b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx @@ -5,7 +5,7 @@ import { EmptyStateVariant, Title, } from "@patternfly/react-core"; -import { Alert } from "../Antd"; +import { Alert, Spin } from "../Antd"; import { SpinContainer } from "../Common"; import "./FeedOutputBrowser.css"; import FileBrowser from "./FileBrowser"; @@ -29,15 +29,15 @@ const FeedOutputBrowser: React.FC<FeedOutputBrowserProps> = () => { error, currentPath, } = useFeedBrowser(); - return ( <div style={{ height: "100%" }} className="feed-output-browser"> - {pluginFilesPayload && selected && !isError ? ( + {filesLoading ? ( + <SpinContainer title="Fetching Files..." /> + ) : pluginFilesPayload && selected && !isError ? ( <FileBrowser selected={selected} handleFileClick={handleFileClick} pluginFilesPayload={pluginFilesPayload} - filesLoading={filesLoading} currentPath={currentPath} /> ) : statusTitle && statusTitles.includes(statusTitle) ? ( diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 459184cb1..34deb0331 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -61,26 +61,23 @@ const columnNames = { }; const FileBrowser = (props: FileBrowserProps) => { - const { handlers } = useLongPress(); - const { handleOnClick } = handlers; const dispatch = useDispatch(); const feed = useTypedSelector((state) => state.feed.currentFeed.data); const handleDownloadMutation = useDownload(feed); const [api, contextHolder] = notification.useNotification(); const { isSuccess, isError, error: downloadError } = handleDownloadMutation; - const { isDarkTheme } = useContext(ThemeContext); + const { pluginFilesPayload, handleFileClick, selected, - filesLoading, + currentPath: additionalKey, } = props; const selectedFile = useTypedSelector((state) => state.explorer.selectedFile); const drawerState = useTypedSelector((state) => state.drawers); const username = useTypedSelector((state) => state.user.username); const { folderFiles, linkFiles, children, path } = pluginFilesPayload; - const breadcrumb = path.split("/"); const currentPath = `home/${username}/feeds/feed_${feed?.data.id}/${selected?.data.plugin_name}_${selected?.data.id}/data`; @@ -244,84 +241,76 @@ const FileBrowser = (props: FileBrowserProps) => { <Th aria-label="file-size">{columnNames.size}</Th> </Tr> </Thead> - {filesLoading ? ( - <SpinContainer title="Fetching Files for this path..." /> - ) : ( - <Tbody> - {folderFiles.map( - (resource: FileBrowserFolderFile, index) => { - return ( - <FileRow - rowIndex={index} - key={resource.data.fname} - resource={resource} - name={getFileName(resource)} - date={resource.data.creation_date} - owner={resource.data.owner_username} - size={resource.data.fsize} - computedPath={path} - handleFolderClick={() => { - return; - }} - handleFileClick={() => { - toggleAnimation(); - dispatch( - setSelectedFile( - resource as FileBrowserFolderFile, - ), - ); - !drawerState.preview.open && - dispatch(setFilePreviewPanel()); - }} - /> - ); - }, - )} - {linkFiles.map( - (resource: FileBrowserFolderLinkFile, index) => { - return ( - <LinkRow - rowIndex={index} - key={resource.data.path} - resource={resource} - name={getLinkFileName(resource)} - date={resource.data.creation_date} - owner={resource.data.owner_username} - size={resource.data.fsize} - computedPath={path} - handleFolderClick={() => { - return; - }} - handleFileClick={() => { - handleFileClick(resource.data.path); - }} - /> - ); - }, - )} - - {children.map((resource: FileBrowserFolder, index) => { + <Tbody> + {folderFiles.map((resource: FileBrowserFolderFile, index) => { + return ( + <FileRow + rowIndex={index} + key={resource.data.fname} + resource={resource} + name={getFileName(resource)} + date={resource.data.creation_date} + owner={resource.data.owner_username} + size={resource.data.fsize} + computedPath={path} + handleFolderClick={() => { + return; + }} + handleFileClick={() => { + toggleAnimation(); + dispatch( + setSelectedFile(resource as FileBrowserFolderFile), + ); + !drawerState.preview.open && + dispatch(setFilePreviewPanel()); + }} + /> + ); + })} + {linkFiles.map( + (resource: FileBrowserFolderLinkFile, index) => { return ( - <FolderRow + <LinkRow rowIndex={index} key={resource.data.path} resource={resource} - name={getFolderName(resource, path)} + name={getLinkFileName(resource)} date={resource.data.creation_date} - owner=" " - size={0} + owner={resource.data.owner_username} + size={resource.data.fsize} computedPath={path} - handleFolderClick={() => - handleFileClick(resource.data.path) - } - handleFileClick={() => { + handleFolderClick={() => { return; }} + handleFileClick={() => { + handleFileClick(resource.data.path); + }} /> ); - })} - </Tbody> - )} + }, + )} + + {children.map((resource: FileBrowserFolder, index) => { + return ( + <FolderRow + rowIndex={index} + key={resource.data.path} + resource={resource} + name={getFolderName(resource, path)} + date={resource.data.creation_date} + owner=" " + size={0} + computedPath={path} + handleFolderClick={() => + handleFileClick(resource.data.path) + } + handleFileClick={() => { + return; + }} + /> + ); + })} + </Tbody> </Table> </DrawerContentBody> )} diff --git a/src/components/FeedOutputBrowser/types.ts b/src/components/FeedOutputBrowser/types.ts index 9e0b3110c..cfc997f95 100644 --- a/src/components/FeedOutputBrowser/types.ts +++ b/src/components/FeedOutputBrowser/types.ts @@ -18,7 +18,7 @@ export interface FileBrowserProps { pluginFilesPayload: FilesPayload; handleFileClick: (path: string) => void; selected: PluginInstance; - filesLoading: boolean; + currentPath: string; } diff --git a/src/components/FeedOutputBrowser/useFeedBrowser.tsx b/src/components/FeedOutputBrowser/useFeedBrowser.tsx index a911548bf..3d134a91a 100644 --- a/src/components/FeedOutputBrowser/useFeedBrowser.tsx +++ b/src/components/FeedOutputBrowser/useFeedBrowser.tsx @@ -2,7 +2,7 @@ import type { FileBrowserFolderFile, FileBrowserFolderLinkFile, } from "@fnndsc/chrisapi"; -import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { useQuery } from "@tanstack/react-query"; import React from "react"; import ChrisAPIClient from "../../api/chrisapiclient"; import { catchError, fetchResource } from "../../api/common"; @@ -77,7 +77,6 @@ export const fetchFilesFromAPath = async ( }; export const useFeedBrowser = () => { - const queryClient = useQueryClient(); const drawerState = useTypedSelector((state) => state.drawers); const [download, setDownload] = React.useState(getInitialDownloadState); const [currentPath, setCurrentPath] = React.useState(""); diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 318a9dac5..6498731b0 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -15,11 +15,12 @@ import { Tooltip, } from "@patternfly/react-core"; import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; -import { useQuery, useQueries } from "@tanstack/react-query"; +import { SortByDirection } from "@patternfly/react-table"; +import { useQueries } from "@tanstack/react-query"; import { format } from "date-fns"; import { debounce } from "lodash"; import type React from "react"; -import { useContext, useEffect, useState, useMemo } from "react"; +import { useContext, useEffect, useMemo, useState } from "react"; import { useNavigate } from "react-router"; import { useTypedSelector } from "../../store/hooks"; import { AddNodeProvider } from "../AddNode/context"; @@ -38,7 +39,6 @@ import FeedSearch from "./FeedsSearch"; import { useFeedListData } from "./useFeedListData"; import { getPluginInstanceDetails } from "./utilties"; const { Paragraph } = Typography; -import { SortByDirection } from "@patternfly/react-table"; interface ColumnDefinition { id: string; diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index d182c24c3..5aeb30679 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -293,6 +293,11 @@ const MODAL_TYPE_LABELS: Record< inputLabel: "Rename", buttonLabel: "Rename", }, + createFeed: { + modalTitle: "Create Feed", + inputLabel: "Feed Name", + buttonLabel: "Create", + }, createFeedWithFile: { modalTitle: "Create Feed", inputLabel: "Feed Name", @@ -344,6 +349,9 @@ export const AddModal = ({ modalState.additionalProps.createFeedWithFile.defaultFeedName, ); } + if (modalState.additionalProps?.createFeed) { + setInputValue(modalState.additionalProps.createFeed.defaultFeedName); + } }, [modalState.type]); const handleClose = () => { @@ -374,14 +382,15 @@ export const AddModal = ({ aria-label={inputLabel} placeholder={inputLabel} /> - {modalState.type === "createFeedWithFile" && ( - <HelperText> - <HelperTextItem> - Please provide a name for your feed or hit 'Create' to use the - default name - </HelperTextItem> - </HelperText> - )} + {modalState.type === "createFeedWithFile" || + (modalState.type === "createFeed" && ( + <HelperText> + <HelperTextItem> + Please provide a name for your feed or hit 'Create' to use the + default name + </HelperTextItem> + </HelperText> + ))} </FormGroup> {modalState.type === "share" && ( <Fragment> diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index f57e24100..35007ccc1 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -1,28 +1,28 @@ -import { useContext, useRef, useState } from "react"; -import { useDispatch } from "react-redux"; -import { useMutation } from "@tanstack/react-query"; import type { FileBrowserFolder, FileBrowserFolderList, } from "@fnndsc/chrisapi"; +import { useMutation } from "@tanstack/react-query"; +import { useRef, useState } from "react"; +import { useDispatch } from "react-redux"; import ChrisAPIClient from "../../../api/chrisapiclient"; -import { MainRouterContext } from "../../../routes"; +import { catchError, getFileName } from "../../../api/common"; import { setToggleCart, startAnonymize, startDownload, startUpload, } from "../../../store/cart/cartSlice"; +import { createFeed as createFeedSaga } from "../../../store/cart/downloadSaga"; +import type { SelectionPayload } from "../../../store/cart/types"; import { useTypedSelector } from "../../../store/hooks"; import { notification } from "../../Antd"; +import { getFolderName } from "../components/FolderCard"; import type { AdditionalValues } from "../components/Operations"; -import { useOperationsContext, type OriginState } from "../context"; +import { type OriginState, useOperationsContext } from "../context"; import useDeletePayload from "../utils/useDeletePayload"; -import useFeedOperations from "./useFeedOperations"; -import { catchError } from "../../../api/common"; -import { getFolderName } from "../components/FolderCard"; import { fetchFeedForPath } from "./longpress"; -import { create } from "lodash"; +import useFeedOperations from "./useFeedOperations"; export interface ModalState { type: string; @@ -49,7 +49,6 @@ export const useFolderOperations = ( createFeed?: boolean, ) => { const { handleOrigin, invalidateQueries } = useOperationsContext(); - const router = useContext(MainRouterContext); const { selectedPaths } = useTypedSelector((state) => state.cart); const username = useTypedSelector((state) => state.user.username) as string; const dispatch = useDispatch(); @@ -140,6 +139,12 @@ export const useFolderOperations = ( }); }; + const createFeedFromMenu = async (inputValue: string) => { + handleOrigin(origin); + const pathList = selectedPaths.map((payload) => payload.path); + await createFeedSaga(pathList, inputValue, invalidateQueries); + }; + const shareFolder = async ( targetUsername: string, additionalValues?: AdditionalValues, @@ -218,6 +223,10 @@ export const useFolderOperations = ( await handleUpload(event, type === "folder", inputValue); break; } + case "createFeed": { + await createFeedFromMenu(inputValue); + break; + } default: break; } @@ -235,11 +244,28 @@ export const useFolderOperations = ( }) => handleModalSubmit(inputValue, additionalValues), }); + const getFeedNameForSinglePath = (path: SelectionPayload) => { + const { payload } = path; + const name = payload.data.path || payload.data.fname; + return getFileName(name); + }; + const handleOperations = (operationKey: string) => { const operationsMap: Record<string, () => void> = { createFeed: () => { - const paths = selectedPaths.map(({ path }) => path); - router.actions.createFeedWithData(paths); + const defaultFeedName = + selectedPaths.length > 1 + ? "Feed created from your Library" + : `Feed created for ${getFeedNameForSinglePath(selectedPaths[0])}`; + setModalState({ + type: "createFeed", + isOpen: true, + additionalProps: { + createFeed: { + defaultFeedName, + }, + }, + }); }, download: () => { handleOrigin(origin); diff --git a/src/store/cart/downloadSaga.ts b/src/store/cart/downloadSaga.ts index 91b490397..2f9d68e36 100644 --- a/src/store/cart/downloadSaga.ts +++ b/src/store/cart/downloadSaga.ts @@ -28,7 +28,6 @@ import { type PayloadTypes, type SelectionPayload, } from "./types"; -import { create } from "lodash"; export function* setStatus( type: string, From c45c1f4b7185416ce797b90886613e6cf868d52f Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 5 Sep 2024 16:35:56 -0400 Subject: [PATCH 173/337] feat: Use Inter as the default font --- package-lock.json | 396 ++-------------------------------------------- package.json | 6 +- src/app.css | 12 +- src/main.tsx | 1 + 4 files changed, 23 insertions(+), 392 deletions(-) diff --git a/package-lock.json b/package-lock.json index b824f763f..2ea23a457 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@cornerstonejs/streaming-image-volume-loader": "^1.82.4", "@cornerstonejs/tools": "^1.82.4", "@fnndsc/chrisapi": "^1.22.0", + "@fontsource/inter": "^5.0.20", "@niivue/niivue": "^0.41.1", "@patternfly/react-catalog-view-extension": "^5.0.0", "@patternfly/react-charts": "^7.3.0", @@ -91,7 +92,7 @@ "playwright": "^1.41.2", "redux-devtools-extension": "^2.13.9", "redux-logger": "^3.0.6", - "rollup-plugin-node-builtins": "^2.1.2", + "rollup-plugin-node-builtins": "^2.0.0", "vite": "^5.3.2", "vite-plugin-istanbul": "^6.0.2", "vitest": "^2.0.5" @@ -807,6 +808,12 @@ "core-js": "^3.36.1" } }, + "node_modules/@fontsource/inter": { + "version": "5.0.20", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.0.20.tgz", + "integrity": "sha512-rtw2F7xfM7rJmmnncXnR4ADr5wXsp4GyN1O1jmQJ1PMjAK+bm620/ZkQkeOYOkGoa09OksGinOeMA+Mkt6K9PQ==", + "license": "OFL-1.1" + }, "node_modules/@icr/polyseg-wasm": { "version": "0.4.0", "license": "MIT", @@ -2099,21 +2106,6 @@ "node": ">=10" } }, - "node_modules/abstract-leveldown": { - "version": "0.12.4", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~3.0.0" - } - }, - "node_modules/abstract-leveldown/node_modules/xtend": { - "version": "3.0.0", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/accessor-fn": { "version": "1.5.1", "license": "MIT", @@ -2402,35 +2394,6 @@ "node": "*" } }, - "node_modules/bl": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~1.0.26" - } - }, - "node_modules/bl/node_modules/isarray": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "1.0.34", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "0.10.31", - "dev": true, - "license": "MIT" - }, "node_modules/bn.js": { "version": "5.2.1", "dev": true, @@ -2483,15 +2446,6 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/browserify-fs": { - "version": "1.0.0", - "dev": true, - "dependencies": { - "level-filesystem": "^1.0.1", - "level-js": "^2.1.3", - "levelup": "^0.18.2" - } - }, "node_modules/browserify-rsa": { "version": "4.1.0", "dev": true, @@ -2556,11 +2510,6 @@ "dev": true, "license": "MIT" }, - "node_modules/buffer-from": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, "node_modules/buffer-xor": { "version": "1.0.3", "dev": true, @@ -2744,14 +2693,6 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/clone": { - "version": "0.1.19", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/clsx": { "version": "1.2.1", "license": "MIT", @@ -2804,20 +2745,6 @@ "version": "0.0.1", "license": "MIT" }, - "node_modules/concat-stream": { - "version": "1.6.2", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "node_modules/console-clear": { "version": "1.1.1", "license": "MIT", @@ -3261,14 +3188,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deferred-leveldown": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~0.12.1" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "license": "MIT", @@ -3481,17 +3400,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/errno": { - "version": "0.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, "node_modules/error-ex": { "version": "1.3.2", "license": "MIT", @@ -4218,11 +4126,6 @@ "node": ">=12" } }, - "node_modules/foreach": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, "node_modules/foreground-child": { "version": "2.0.0", "dev": true, @@ -4280,34 +4183,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fwd-stream": { - "version": "1.0.4", - "dev": true, - "dependencies": { - "readable-stream": "~1.0.26-4" - } - }, - "node_modules/fwd-stream/node_modules/isarray": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/fwd-stream/node_modules/readable-stream": { - "version": "1.0.34", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/fwd-stream/node_modules/string_decoder": { - "version": "0.10.31", - "dev": true, - "license": "MIT" - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "license": "MIT", @@ -4582,11 +4457,6 @@ "node": ">=16.17.0" } }, - "node_modules/idb-wrapper": { - "version": "1.7.2", - "dev": true, - "license": "MIT" - }, "node_modules/immer": { "version": "10.1.1", "license": "MIT", @@ -4644,10 +4514,6 @@ "node": ">=12" } }, - "node_modules/indexof": { - "version": "0.0.1", - "dev": true - }, "node_modules/inflight": { "version": "1.0.6", "license": "ISC", @@ -4681,13 +4547,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/is": { - "version": "0.2.7", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "license": "MIT" @@ -4713,10 +4572,6 @@ "node": ">=8" } }, - "node_modules/is-object": { - "version": "0.1.2", - "dev": true - }, "node_modules/is-plain-object": { "version": "5.0.0", "license": "MIT", @@ -4753,11 +4608,6 @@ "dev": true, "license": "MIT" }, - "node_modules/isbuffer": { - "version": "0.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "dev": true, @@ -5115,194 +4965,6 @@ "win32" ] }, - "node_modules/level-blobs": { - "version": "0.1.7", - "dev": true, - "dependencies": { - "level-peek": "1.0.6", - "once": "^1.3.0", - "readable-stream": "^1.0.26-4" - } - }, - "node_modules/level-blobs/node_modules/isarray": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/level-blobs/node_modules/readable-stream": { - "version": "1.1.14", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/level-blobs/node_modules/string_decoder": { - "version": "0.10.31", - "dev": true, - "license": "MIT" - }, - "node_modules/level-filesystem": { - "version": "1.2.0", - "dev": true, - "dependencies": { - "concat-stream": "^1.4.4", - "errno": "^0.1.1", - "fwd-stream": "^1.0.4", - "level-blobs": "^0.1.7", - "level-peek": "^1.0.6", - "level-sublevel": "^5.2.0", - "octal": "^1.0.0", - "once": "^1.3.0", - "xtend": "^2.2.0" - } - }, - "node_modules/level-fix-range": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/level-hooks": { - "version": "4.5.0", - "dev": true, - "dependencies": { - "string-range": "~1.2" - } - }, - "node_modules/level-js": { - "version": "2.2.4", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "abstract-leveldown": "~0.12.0", - "idb-wrapper": "^1.5.0", - "isbuffer": "~0.0.0", - "ltgt": "^2.1.2", - "typedarray-to-buffer": "~1.0.0", - "xtend": "~2.1.2" - } - }, - "node_modules/level-js/node_modules/object-keys": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/level-js/node_modules/xtend": { - "version": "2.1.2", - "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/level-peek": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "level-fix-range": "~1.0.2" - } - }, - "node_modules/level-sublevel": { - "version": "5.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "level-fix-range": "2.0", - "level-hooks": ">=4.4.0 <5", - "string-range": "~1.2.1", - "xtend": "~2.0.4" - } - }, - "node_modules/level-sublevel/node_modules/level-fix-range": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "~0.1.9" - } - }, - "node_modules/level-sublevel/node_modules/object-keys": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "foreach": "~2.0.1", - "indexof": "~0.0.1", - "is": "~0.2.6" - } - }, - "node_modules/level-sublevel/node_modules/xtend": { - "version": "2.0.6", - "dev": true, - "dependencies": { - "is-object": "~0.1.2", - "object-keys": "~0.2.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/levelup": { - "version": "0.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "~0.8.1", - "deferred-leveldown": "~0.2.0", - "errno": "~0.1.1", - "prr": "~0.0.0", - "readable-stream": "~1.0.26", - "semver": "~2.3.1", - "xtend": "~3.0.0" - } - }, - "node_modules/levelup/node_modules/isarray": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/levelup/node_modules/prr": { - "version": "0.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/levelup/node_modules/readable-stream": { - "version": "1.0.34", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/levelup/node_modules/semver": { - "version": "2.3.2", - "dev": true, - "license": "BSD", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/levelup/node_modules/string_decoder": { - "version": "0.10.31", - "dev": true, - "license": "MIT" - }, - "node_modules/levelup/node_modules/xtend": { - "version": "3.0.0", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "license": "MIT" @@ -5405,11 +5067,6 @@ "yallist": "^3.0.2" } }, - "node_modules/ltgt": { - "version": "2.2.1", - "dev": true, - "license": "MIT" - }, "node_modules/magic-string": { "version": "0.30.11", "dev": true, @@ -6262,11 +5919,6 @@ "node": ">= 0.4" } }, - "node_modules/octal": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/once": { "version": "1.4.0", "license": "ISC", @@ -6646,11 +6298,6 @@ "version": "1.1.0", "license": "MIT" }, - "node_modules/prr": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/public-encrypt": { "version": "4.0.3", "dev": true, @@ -7762,11 +7409,12 @@ } }, "node_modules/rollup-plugin-node-builtins": { - "version": "2.1.2", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.0.0.tgz", + "integrity": "sha512-jvsEYNf5U95YttEQbs5c6H7YSMYGs3SWA8/MfnlQ9ddijsgYbq8uKx4WQ1J8Zyrq+tgPF0Quu48PURrlcMZWoQ==", "dev": true, "license": "ISC", "dependencies": { - "browserify-fs": "^1.0.0", "buffer-es6": "^4.9.2", "crypto-browserify": "^3.11.0", "process-es6": "^0.11.2" @@ -8335,11 +7983,6 @@ "version": "0.2.1", "license": "MIT" }, - "node_modules/string-range": { - "version": "1.2.2", - "dev": true, - "license": "MIT" - }, "node_modules/string-width": { "version": "4.2.3", "dev": true, @@ -8602,16 +8245,6 @@ "node": ">=8" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/typedarray-to-buffer": { - "version": "1.0.4", - "dev": true, - "license": "MIT" - }, "node_modules/typescript": { "version": "5.5.4", "license": "Apache-2.0", @@ -9544,13 +9177,6 @@ "version": "2.20.3", "license": "MIT" }, - "node_modules/xtend": { - "version": "2.2.0", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "4.0.3", "dev": true, diff --git a/package.json b/package.json index 88b897f88..41cfa20d0 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "@cornerstonejs/streaming-image-volume-loader": "^1.82.4", "@cornerstonejs/tools": "^1.82.4", "@fnndsc/chrisapi": "^1.22.0", + "@fontsource/inter": "^5.0.20", "@niivue/niivue": "^0.41.1", "@patternfly/react-catalog-view-extension": "^5.0.0", "@patternfly/react-charts": "^7.3.0", @@ -50,7 +51,6 @@ "@patternfly/react-log-viewer": "^5.2.0", "@patternfly/react-table": "^5.3.4", "@react-hook/resize-observer": "^2.0.1", - "@reduxjs/toolkit": "^2.2.7", "@tanstack/react-query": "^5.51.1", "@types/d3-shape": "^3.1.6", @@ -102,10 +102,10 @@ "vite-plugin-babel-macros": "^1.0.6" }, "devDependencies": { - "@redux-devtools/extension": "^3.3.0", "@biomejs/biome": "1.8.3", "@faker-js/faker": "^8.4.0", "@playwright/test": "^1.41.2", + "@redux-devtools/extension": "^3.3.0", "@types/d3-hierarchy": "^1.1.7", "@types/d3-selection": "^1.4.3", "@types/lodash": "^4.14.202", @@ -122,7 +122,7 @@ "playwright": "^1.41.2", "redux-devtools-extension": "^2.13.9", "redux-logger": "^3.0.6", - "rollup-plugin-node-builtins": "^2.1.2", + "rollup-plugin-node-builtins": "^2.0.0", "vite": "^5.3.2", "vite-plugin-istanbul": "^6.0.2", "vitest": "^2.0.5" diff --git a/src/app.css b/src/app.css index c8b3c18aa..731e27217 100644 --- a/src/app.css +++ b/src/app.css @@ -1,3 +1,7 @@ + body { + font-family: "Inter" +} + .dcm-preview { position: relative; height: 100%; @@ -66,8 +70,8 @@ .small-button { width: 20px; height: 20px; - font-size:12px; - + font-size: 12px; + } .large-button { @@ -77,9 +81,9 @@ .button-style { border-radius: 50% !important; - padding:1rem !important; + padding: 1rem !important; border: none !important; display: flex !important; justify-content: center !important; align-items: center !important; -} +} \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx index cca4d7d53..5bbf07bb7 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -3,6 +3,7 @@ import ReactDOM from "react-dom/client"; import App from "./App.tsx"; import { store } from "./store/configureStore.ts"; import { ThemeContextProvider } from "./components/DarkTheme/useTheme.tsx"; +import "@fontsource/inter/400.css"; // Defaults to weight 400. ReactDOM.createRoot(document.getElementById("root")!).render( <React.StrictMode> From 07d098cb005899262a7a1f78ca0e287a94e0ddce Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 6 Sep 2024 10:38:06 -0400 Subject: [PATCH 174/337] feat: Update the Library Table to use feed names --- .../NewLibrary/components/FolderCard.tsx | 30 ++++++------------- .../NewLibrary/components/LibraryTable.tsx | 29 +++++++++++++++--- src/components/NewLibrary/utils/longpress.tsx | 20 +++++++++++++ 3 files changed, 54 insertions(+), 25 deletions(-) diff --git a/src/components/NewLibrary/components/FolderCard.tsx b/src/components/NewLibrary/components/FolderCard.tsx index f08db70c8..d50f1f6f2 100644 --- a/src/components/NewLibrary/components/FolderCard.tsx +++ b/src/components/NewLibrary/components/FolderCard.tsx @@ -19,7 +19,10 @@ import { useTypedSelector } from "../../../store/hooks"; import { ThemeContext } from "../../DarkTheme/useTheme"; import { FolderIcon } from "../../Icons"; import { OperationContext } from "../context"; -import useLongPress, { getBackgroundRowColor } from "../utils/longpress"; +import useLongPress, { + getBackgroundRowColor, + useAssociatedFeed, +} from "../utils/longpress"; import { FolderContextMenu } from "./ContextMenu"; type Pagination = { @@ -71,8 +74,10 @@ export const SubFolderCard: React.FC<SubFolderCardProps> = (props) => { const isDarkTheme = useContext(ThemeContext).isDarkTheme; const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const { handlers } = useLongPress(); + const { handleOnClick, handleOnMouseDown, handleCheckboxChange } = handlers; const folderName = getFolderName(folder, computedPath); + const { data: feedName, isLoading } = useAssociatedFeed(folderName); const creationDate = folder.data.creation_date; const secondsSinceCreation = differenceInSeconds(new Date(), creationDate); @@ -99,23 +104,6 @@ export const SubFolderCard: React.FC<SubFolderCardProps> = (props) => { const shouldHighlight = isNewFolder || isSelected; const highlightedBgRow = getBackgroundRowColor(shouldHighlight, isDarkTheme); - const feedMatches = folderName.match(/feed_(\d+)/); - const { data, isLoading } = useQuery({ - queryKey: ["associatedFeed", folder.data.path], - queryFn: async () => { - const id = feedMatches ? feedMatches[1] : null; - - if (id) { - const client = ChrisAPIClient.getClient(); - const feed = await client.getFeed(Number(id)); - if (!feed) throw new Error("Failed to fetch the feed"); - return feed.data.name; - } - return null; - }, - enabled: feedMatches?.length > 0, - }); - return ( <GridItem xl={3} lg={4} md={6} sm={12} key={folder.data.id}> <FolderContextMenu @@ -173,10 +161,10 @@ export const SubFolderCard: React.FC<SubFolderCardProps> = (props) => { variant="link" style={{ padding: 0 }} > - {!data && !isLoading + {!feedName && !isLoading ? elipses(folderName, 40) - : data - ? elipses(data, 40) + : feedName + ? elipses(feedName, 40) : "Fetching..."} </Button> <div diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index cfe92e872..af0636c74 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -17,6 +17,7 @@ import { Tr, } from "@patternfly/react-table"; import { Drawer, Tag } from "antd"; +import { Skeleton } from "@patternfly/react-core"; import { differenceInSeconds, format } from "date-fns"; import React, { useContext, useEffect, useRef, useState } from "react"; import { useNavigate } from "react-router"; @@ -26,7 +27,10 @@ import { ThemeContext } from "../../DarkTheme/useTheme"; import { formatBytes } from "../../Feeds/utilties"; import FileDetailView from "../../Preview/FileDetailView"; import { OperationContext } from "../context"; -import useLongPress, { getBackgroundRowColor } from "../utils/longpress"; +import useLongPress, { + getBackgroundRowColor, + useAssociatedFeed, +} from "../utils/longpress"; import { FolderContextMenu } from "./ContextMenu"; import { getFileName, getLinkFileName } from "./FileCard"; import { getFolderName } from "./FolderCard"; @@ -50,6 +54,7 @@ const columnNames = { interface RowProps { rowIndex: number; + key: string; resource: | FileBrowserFolder | FileBrowserFolderFile @@ -200,9 +205,25 @@ const BaseRow: React.FC<RowProps> = ({ ); }; -export const FolderRow: React.FC<Omit<RowProps, "type">> = (props) => ( - <BaseRow {...props} type="folder" /> -); +export const FolderRow: React.FC<Omit<RowProps, "type">> = (props) => { + const { data, isLoading } = useAssociatedFeed(props.name); + + if (isLoading) { + return ( + <Tr> + <Skeleton width="100%" /> + </Tr> + ); + } + + return ( + <BaseRow + {...props} + name={data ? data : props.name} // Example of adding feed info to the row name + type="folder" + /> + ); +}; export const FileRow: React.FC<Omit<RowProps, "type">> = (props) => ( <BaseRow {...props} type="file" /> diff --git a/src/components/NewLibrary/utils/longpress.tsx b/src/components/NewLibrary/utils/longpress.tsx index 6498db781..20d8fd53e 100644 --- a/src/components/NewLibrary/utils/longpress.tsx +++ b/src/components/NewLibrary/utils/longpress.tsx @@ -5,6 +5,7 @@ import type { FileBrowserFolderLinkFile, } from "@fnndsc/chrisapi"; import { Button, Tooltip } from "@patternfly/react-core"; +import { useQuery } from "@tanstack/react-query"; import { useRef, useState } from "react"; import { useDispatch } from "react-redux"; import { useNavigate } from "react-router"; @@ -222,3 +223,22 @@ export const fetchFeedForPath = async (path: string): Promise<Feed | null> => { } return null; }; + +export const useAssociatedFeed = (folderPath: string) => { + const feedMatches = folderPath.match(/feed_(\d+)/); + + return useQuery({ + queryKey: ["associatedFeed", folderPath], + queryFn: async () => { + const id = feedMatches ? feedMatches[1] : null; + if (id) { + const client = ChrisAPIClient.getClient(); + const feed = await client.getFeed(Number(id)); + if (!feed) throw new Error("Failed to fetch the feed"); + return feed.data.name; + } + return null; + }, + enabled: Boolean(feedMatches?.length), + }); +}; From e87c2ea7e7baf641f40825f90ca1148e78ebf3ba Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 6 Sep 2024 11:18:18 -0400 Subject: [PATCH 175/337] fix: Fix the sorting of feeds according to the sizes --- src/api/model.ts | 2 +- src/components/Feeds/FeedListView.tsx | 12 +++++++++--- src/components/Feeds/utilties.ts | 6 +++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/api/model.ts b/src/api/model.ts index 85725f9ee..7ccb51dcf 100644 --- a/src/api/model.ts +++ b/src/api/model.ts @@ -186,7 +186,7 @@ export const fileViewerMap: any = { jpg: "ImageDisplay", jpeg: "ImageDisplay", gif: "ImageDisplay", - dcm: "NiiVueDisplay", + dcm: "DcmDisplay", default: "CatchallDisplay", nii: "NiiVueDisplay", gz: "CatchallDisplay", diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 6498731b0..d1308d372 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -37,7 +37,7 @@ import { PipelineProvider } from "../PipelinesCopy/context"; import WrapperConnect from "../Wrapper"; import FeedSearch from "./FeedsSearch"; import { useFeedListData } from "./useFeedListData"; -import { getPluginInstanceDetails } from "./utilties"; +import { formatBytes, getPluginInstanceDetails } from "./utilties"; const { Paragraph } = Typography; interface ColumnDefinition { @@ -85,7 +85,7 @@ const COLUMN_DEFINITIONS: ColumnDefinition[] = [ comparator: (_a, _b, detailsA, detailsB) => { const sizeA = detailsA?.size || "0"; const sizeB = detailsB?.size || "0"; - return sizeA.localeCompare(sizeB); + return sizeA - sizeB; }, }, { @@ -431,7 +431,13 @@ const TableRow: React.FC<TableRowProps> = ({ </Td> <Td dataLabel="creator">{feed.data.owner_username}</Td> <Td dataLabel="runtime">{details?.time}</Td> - <Td dataLabel="size">{details?.size}</Td> + <Td dataLabel="size"> + {details?.size ? ( + formatBytes(details?.size, 0) + ) : ( + <Skeleton width="100%" height="40px" /> + )} + </Td> <Td dataLabel="status"> <DonutUtilization details={details} /> </Td> diff --git a/src/components/Feeds/utilties.ts b/src/components/Feeds/utilties.ts index 4ab07db01..e9d4a17f7 100644 --- a/src/components/Feeds/utilties.ts +++ b/src/components/Feeds/utilties.ts @@ -162,7 +162,7 @@ type PluginInstanceStatus = | "finishedSuccessfully"; interface PluginInstanceDetails { - size: string; + size: number; progress: number; time: string; error: boolean; @@ -183,7 +183,7 @@ export const getPluginInstanceDetails = async ( feed: Feed, ): Promise<PluginInstanceDetails> => { const details: PluginInstanceDetails = { - size: "", + size: 0, progress: 0, time: "", error: false, @@ -236,7 +236,7 @@ export const getPluginInstanceDetails = async ( const progressPercentage = (completedMilestones / totalMilestones) * 100; - details.size = formatBytes(totalSize, 0); + details.size = totalSize; details.progress = Math.floor(progressPercentage); details.time = convertMsToHM(totalRunTime); details.error = error; From e7b6339d23adb2d08d11f1deabd83f53ffbf5766 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 6 Sep 2024 12:06:52 -0400 Subject: [PATCH 176/337] fix: Fix the regression in status tracking while adding a node --- src/store/pluginInstance/pluginInstanceSlice.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/store/pluginInstance/pluginInstanceSlice.ts b/src/store/pluginInstance/pluginInstanceSlice.ts index 9e5998cf0..48c1cdbc3 100644 --- a/src/store/pluginInstance/pluginInstanceSlice.ts +++ b/src/store/pluginInstance/pluginInstanceSlice.ts @@ -68,6 +68,12 @@ export const addNode = createAsyncThunk< try { const pluginInstances = [...nodes, pluginItem]; dispatch(getSelectedPlugin(pluginItem)); + dispatch( + getPluginInstanceStatusRequest({ + selected: pluginItem, + pluginInstances, + }), + ); return { selected: pluginItem, pluginInstances }; } catch (error) { return rejectWithValue("Failed to add node."); From 2ac12419888b74323ffb9ccb9fbe9a86cdc0fd6c Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 6 Sep 2024 13:13:54 -0400 Subject: [PATCH 177/337] fix: Fix quoting of strings in the terminal --- src/api/common.ts | 17 ++++++++++++++ src/components/AddNode/GuidedConfig.tsx | 26 ++++++++++++---------- src/components/NodeDetails/NodeDetails.tsx | 9 ++++---- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/api/common.ts b/src/api/common.ts index 2096dc7e4..2aad5c2cb 100644 --- a/src/api/common.ts +++ b/src/api/common.ts @@ -495,11 +495,28 @@ export function needsQuoting(value: string) { return false; } + // Avoid shlex.quote if the string contains an apostrophe + + if (value.includes("'")) { + return true; + } + // If not quoted, check if quoting is necessary const quotedValue = quote(value); return quotedValue !== value; } +// Custom quote function to avoid mangling strings with apostrophes +export function customQuote(value: string) { + // If the string contains a single quote, wrap it in double quotes + if (value.includes("'")) { + return `"${value}"`; // Wrap in double quotes + } + + // Otherwise, fall back to shlex.quote for safe quoting + return quote(value); +} + export const getFileName = (name: string) => { return name.split("/").slice(-1).join(""); }; diff --git a/src/components/AddNode/GuidedConfig.tsx b/src/components/AddNode/GuidedConfig.tsx index 961ace799..78ca490cc 100644 --- a/src/components/AddNode/GuidedConfig.tsx +++ b/src/components/AddNode/GuidedConfig.tsx @@ -30,13 +30,17 @@ import { useMutation } from "@tanstack/react-query"; import { isEmpty } from "lodash"; import React, { useContext, useEffect, useState } from "react"; import { useDispatch } from "react-redux"; -import { quote } from "shlex"; import { v4 } from "uuid"; -import { catchError, fetchResource, needsQuoting } from "../../api/common"; +import { + catchError, + customQuote, + fetchResource, + needsQuoting, +} from "../../api/common"; import type { AppDispatch } from "../../store/configureStore"; import { useTypedSelector } from "../../store/hooks"; import { fetchParamsAndComputeEnv } from "../../store/plugin/pluginSlice"; -import { Alert, Spin } from "../Antd"; +import { Alert } from "../Antd"; import { ClipboardCopyFixed, ErrorAlert } from "../Common"; import ComputeEnvironments from "./ComputeEnvironment"; import RequiredParam from "./RequiredParam"; @@ -367,7 +371,9 @@ const CheckboxComponent = () => { const { param_name, type, value } = parameter.data; if (paramsRequiredFetched?.[param_name]) { const quotedValue = - type === "string" && needsQuoting(value) ? quote(value) : value; + type === "string" && needsQuoting(value) + ? customQuote(value) + : value; const [id, flag] = paramsRequiredFetched[param_name]; requiredInput[id] = { value: quotedValue, @@ -377,7 +383,9 @@ const CheckboxComponent = () => { }; } else if (paramsDropdownFetched) { const quotedValue = - type === "string" && needsQuoting(value) ? quote(value) : value; + type === "string" && needsQuoting(value) + ? customQuote(value) + : value; const flag = paramsDropdownFetched[param_name]; dropdownInput[v4()] = { @@ -407,7 +415,7 @@ const CheckboxComponent = () => { } }; - const { isPending, isError, error, mutate, reset } = useMutation({ + const { isError, error, mutate, reset } = useMutation({ mutationFn: () => handleCheckboxChange(), }); @@ -449,12 +457,6 @@ const CheckboxComponent = () => { }); }} /> - {isPending && ( - <div style={{ marginTop: "0.75em" }}> - <Spin />{" "} - <span style={{ marginLeft: "0.75em" }}>Contructing the form...</span> - </div> - )} {isError && <Alert type="error" description={error.message} />} </> ); diff --git a/src/components/NodeDetails/NodeDetails.tsx b/src/components/NodeDetails/NodeDetails.tsx index 4cfc19656..b931704c5 100644 --- a/src/components/NodeDetails/NodeDetails.tsx +++ b/src/components/NodeDetails/NodeDetails.tsx @@ -1,4 +1,4 @@ -import { +import type { Plugin, PluginInstance, PluginInstanceDescendantList, @@ -10,11 +10,10 @@ import { Grid, GridItem, } from "@patternfly/react-core"; -import React, { Fragment, ReactNode } from "react"; +import React, { Fragment, type ReactNode } from "react"; import { ErrorBoundary } from "react-error-boundary"; import { useNavigate } from "react-router"; -import { quote } from "shlex"; -import { needsQuoting } from "../../api/common"; +import { needsQuoting, customQuote } from "../../api/common"; import { useTypedSelector } from "../../store/hooks"; import { SpinContainer } from "../Common"; import { isPlVisualDataset } from "../DatasetRedirect/getDatasets"; @@ -301,7 +300,7 @@ function getCommand( const value = instanceParameters[i].data.value; const safeValue = - isString && needsQuoting(value) ? quote(value) : value; + isString && needsQuoting(value) ? customQuote(value) : value; modifiedParams.push({ name: pluginParameters[j].data.flag, From 06afcb322455c404df8e90226ed9f11b751dd76b Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 6 Sep 2024 14:56:44 -0400 Subject: [PATCH 178/337] feat: Disable the 'New Folder' menu item in the feeds table --- src/components/FeedOutputBrowser/FileBrowser.tsx | 16 +++++++--------- .../NewLibrary/components/Operations.tsx | 10 +++++++--- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 34deb0331..3cec9d8c8 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -16,12 +16,8 @@ import { Tooltip, } from "@patternfly/react-core"; import { Table, Tbody, Th, Thead, Tr } from "@patternfly/react-table"; -import { useContext, useEffect } from "react"; +import { useEffect } from "react"; import { useDispatch } from "react-redux"; -import { - getFileName, - getLinkFileName, -} from "../NewLibrary/components/FileCard"; import { setFilePreviewPanel } from "../../store/drawer/drawerSlice"; import { clearSelectedFile, @@ -29,20 +25,22 @@ import { } from "../../store/explorer/explorerSlice"; import useDownload, { useTypedSelector } from "../../store/hooks"; import { notification } from "../Antd"; -import { ClipboardCopyContainer, SpinContainer } from "../Common"; -import { ThemeContext } from "../DarkTheme/useTheme"; +import { ClipboardCopyContainer } from "../Common"; import { DrawerActionButton } from "../Feeds/DrawerUtils"; import { handleMaximize, handleMinimize } from "../Feeds/utilties"; import { HomeIcon } from "../Icons"; +import { + getFileName, + getLinkFileName, +} from "../NewLibrary/components/FileCard"; import { getFolderName } from "../NewLibrary/components/FolderCard"; import { - FolderRow, FileRow, + FolderRow, LinkRow, } from "../NewLibrary/components/LibraryTable"; import Operations from "../NewLibrary/components/Operations"; import { OperationContext } from "../NewLibrary/context"; -import useLongPress from "../NewLibrary/utils/longpress"; import FileDetailView from "../Preview/FileDetailView"; import XtkViewer from "../XtkViewer/XtkViewer"; import type { FileBrowserProps } from "./types"; diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index 5aeb30679..0339ce00e 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -60,9 +60,9 @@ interface OperationProps { } const OPERATION_ITEMS = [ - { key: "newFolder", label: "New Folder" }, - { key: "fileUpload", label: "File Upload" }, - { key: "folderUpload", label: "Folder Upload" }, + { key: "newFolder", label: "New Folder", disabled: false }, + { key: "fileUpload", label: "File Upload", disabled: false }, + { key: "folderUpload", label: "Folder Upload", disabled: false }, ]; const Operations = ({ @@ -77,6 +77,10 @@ const Operations = ({ const isFeedsTable = matchPath({ path: "/feeds", end: true }, location.pathname) !== null; // This checks if the path matches and returns true or false + if (isFeedsTable) { + OPERATION_ITEMS[0].disabled = true; + } + const { modalState, userRelatedError, From 5cb603f3d0de60cc1bd662bbacdeaa644ec356a9 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 6 Sep 2024 15:33:58 -0400 Subject: [PATCH 179/337] feat: Resize the terminal dynamically --- src/components/FeedTree/useSize.tsx | 14 ++--- src/components/NodeDetails/LogTerminal.tsx | 59 ++++++++++++++++++++-- 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/src/components/FeedTree/useSize.tsx b/src/components/FeedTree/useSize.tsx index dd7f6fbac..b3d323365 100644 --- a/src/components/FeedTree/useSize.tsx +++ b/src/components/FeedTree/useSize.tsx @@ -1,20 +1,22 @@ -import React, { RefObject, MutableRefObject } from "react"; +import React, { type RefObject, type MutableRefObject } from "react"; import useResizeObserver from "@react-hook/resize-observer"; const useSize = ( target: | MutableRefObject<HTMLDivElement | SVGSVGElement | null> - | RefObject<SVGGElement>, + | RefObject<SVGGElement | HTMLDivElement | SVGSVGElement>, ) => { - const [size, setSize] = React.useState(); + // size is of type DOMRectReadOnly or undefined initially + const [size, setSize] = React.useState<DOMRectReadOnly | undefined>(); React.useLayoutEffect(() => { if (target.current) { - //@ts-ignore - setSize(target.current.getBoundingClientRect()); + // Safely access getBoundingClientRect() method + const rect = target.current.getBoundingClientRect(); + setSize(rect); } }, [target]); - //@ts-ignore + useResizeObserver(target, (entry) => setSize(entry.contentRect)); return size; diff --git a/src/components/NodeDetails/LogTerminal.tsx b/src/components/NodeDetails/LogTerminal.tsx index d47cee718..66e103496 100644 --- a/src/components/NodeDetails/LogTerminal.tsx +++ b/src/components/NodeDetails/LogTerminal.tsx @@ -1,14 +1,67 @@ import { LogViewer } from "@patternfly/react-log-viewer"; +import { useRef, useEffect, useState } from "react"; +import useSize from "../FeedTree/useSize"; +import { useTypedSelector } from "../../store/hooks"; type LogTerminalProps = { text: string; }; const LogTerminal = ({ text }: LogTerminalProps) => { + const divRef = useRef<HTMLDivElement>(null); + const size = useSize(divRef); + const isTerminalMaximized = useTypedSelector( + (state) => state.drawers.node.maximized, + ); + const [terminalSize, setTerminalSize] = useState({ + width: "100%", + height: "100%", + }); + + const handleResize = () => { + if (divRef.current && size) { + const parentWidth = size.width; + const parentHeight = size.height; + const element = document.getElementById("log-viewer"); + + if (element) { + setTerminalSize({ + width: `${parentWidth}px`, + height: `${parentHeight}px`, + }); + } + } + }; + + useEffect(() => { + // Call handleResize whenever window resizes + window.addEventListener("resize", handleResize); + + // Initial resize logic when component mounts + handleResize(); + + // Cleanup on unmount + return () => { + window.removeEventListener("resize", handleResize); + }; + }, [size, isTerminalMaximized]); // Ensure the effect runs when size or maximized state changes + return ( - <> - <LogViewer hasLineNumbers={false} height={"100%"} data={text} /> - </> + <div + id="log-viewer" + ref={divRef} + style={{ + height: "100%", + width: "100%", + }} + > + <LogViewer + height={terminalSize.height} + width={terminalSize.width} + hasLineNumbers={false} + data={text} + /> + </div> ); }; From e41c6ad45f014c8318272c8acf9b052852fda29a Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 6 Sep 2024 16:19:50 -0400 Subject: [PATCH 180/337] fix: Update the Node Details Panel to reflect the feed author correctly --- src/components/NodeDetails/NodeDetails.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/NodeDetails/NodeDetails.tsx b/src/components/NodeDetails/NodeDetails.tsx index b931704c5..9a3f81679 100644 --- a/src/components/NodeDetails/NodeDetails.tsx +++ b/src/components/NodeDetails/NodeDetails.tsx @@ -154,7 +154,7 @@ const NodeDetails: React.FC = () => { > <Grid className="node-details__grid"> {renderGridItem("Feed Name", feed?.data?.name)} - {renderGridItem("Feed Author", feed?.data.creator_username)} + {renderGridItem("Feed Author", feed?.data.owner_username)} {selectedPlugin.data.previous_id && renderGridItem( "Parent Node ID", From 6f64fadc46dba55b432877d393ec8b574d9dc581 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Wed, 11 Sep 2024 22:24:28 -0400 Subject: [PATCH 181/337] Update miniChRIS to CUBE version 6 --- testing/getDicoms.mjs | 2 +- testing/miniChRIS | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/testing/getDicoms.mjs b/testing/getDicoms.mjs index c38b4119f..10f8e8334 100755 --- a/testing/getDicoms.mjs +++ b/testing/getDicoms.mjs @@ -5,7 +5,7 @@ import * as childProcess from "node:child_process"; import * as os from "node:os"; import * as path from "node:path"; -const UTILS_IMAGE = "ghcr.io/fnndsc/utils:fc56615"; +const UTILS_IMAGE = "ghcr.io/fnndsc/utils:7c65939"; function main() { runUtils("testing/sample_dicoms", ["make", "neuro"]); diff --git a/testing/miniChRIS b/testing/miniChRIS index 53f0d1a40..a70318e5c 160000 --- a/testing/miniChRIS +++ b/testing/miniChRIS @@ -1 +1 @@ -Subproject commit 53f0d1a40f9c4ac3d214af99d11996fc545f237e +Subproject commit a70318e5c6c6ce3d5e9bba82302ba67d490bd0f8 From a93f3dbe1970f861bca779b51b7dac3e74fa716c Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Wed, 11 Sep 2024 22:26:50 -0400 Subject: [PATCH 182/337] Disable end-to-end testing in GHA --- .github/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d10262d6a..bae86034d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,6 +33,7 @@ jobs: test-public: name: Tests (public testing server) runs-on: ubuntu-22.04 + if: false # FIXME disabled for now because tests not updated for CUBE version 6 steps: - name: Checkout uses: actions/checkout@v4 @@ -72,6 +73,7 @@ jobs: test-local: name: Tests (local testing server) runs-on: ubuntu-22.04 + if: false # FIXME disabled for now because tests not updated for CUBE version 6 steps: - name: Checkout uses: actions/checkout@v4 From 12d13fe0f8902b22d4ccfda72d50f08c03de62a3 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 12 Sep 2024 10:37:25 -0400 Subject: [PATCH 183/337] feat: Fix the owner_username field in the Library Table --- src/components/CreateFeed/CreateFeed.tsx | 2 +- src/components/CreateFeed/DataPacks.tsx | 4 ++-- src/components/NewLibrary/components/FolderCard.tsx | 2 -- src/components/NewLibrary/components/LibraryTable.tsx | 5 ++--- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/components/CreateFeed/CreateFeed.tsx b/src/components/CreateFeed/CreateFeed.tsx index 87e36e2eb..f02ec3039 100644 --- a/src/components/CreateFeed/CreateFeed.tsx +++ b/src/components/CreateFeed/CreateFeed.tsx @@ -8,13 +8,13 @@ import { WizardStep, } from "@patternfly/react-core"; import { useQueryClient } from "@tanstack/react-query"; -import { notification } from "../Antd"; import * as React from "react"; import { useContext } from "react"; import { catchError } from "../../api/common"; import { MainRouterContext } from "../../routes"; import { useTypedSelector } from "../../store/hooks"; import { AddNodeContext } from "../AddNode/context"; +import { notification } from "../Antd"; import { CodeBranchIcon } from "../Icons"; import PipelinesCopy from "../PipelinesCopy"; import { PipelineContext } from "../PipelinesCopy/context"; diff --git a/src/components/CreateFeed/DataPacks.tsx b/src/components/CreateFeed/DataPacks.tsx index 7134fd66b..5d2c6fa88 100644 --- a/src/components/CreateFeed/DataPacks.tsx +++ b/src/components/CreateFeed/DataPacks.tsx @@ -135,11 +135,11 @@ const DataPacks = ({ next }: { next: () => any }) => { ) { return; } - if (e.code == "Enter" && e.target.closest("DIV.pf-c-radio")) { + if (e.code === "Enter" && e.target.closest("DIV.pf-c-radio")) { e.preventDefault(); if (pluginMeta === undefined) handleOnChange(true, plugin); onNext(); - } else if (pluginMeta && e.code == "ArrowRight") { + } else if (pluginMeta && e.code === "ArrowRight") { onNext(); } else if (e.code === "ArrowLeft") { onBack(); diff --git a/src/components/NewLibrary/components/FolderCard.tsx b/src/components/NewLibrary/components/FolderCard.tsx index d50f1f6f2..6b1f0bc87 100644 --- a/src/components/NewLibrary/components/FolderCard.tsx +++ b/src/components/NewLibrary/components/FolderCard.tsx @@ -8,12 +8,10 @@ import { Split, SplitItem, } from "@patternfly/react-core"; -import { useQuery } from "@tanstack/react-query"; import { differenceInSeconds, format } from "date-fns"; import { isEmpty } from "lodash"; import { useContext, useEffect, useState } from "react"; import { Fragment } from "react/jsx-runtime"; -import ChrisAPIClient from "../../../api/chrisapiclient"; import { elipses } from "../../../api/common"; import { useTypedSelector } from "../../../store/hooks"; import { ThemeContext } from "../../DarkTheme/useTheme"; diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index af0636c74..cc8be8b07 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -3,7 +3,7 @@ import type { FileBrowserFolderFile, FileBrowserFolderLinkFile, } from "@fnndsc/chrisapi"; -import { Button } from "@patternfly/react-core"; +import { Button, Skeleton } from "@patternfly/react-core"; import { Caption, type ISortBy, @@ -17,7 +17,6 @@ import { Tr, } from "@patternfly/react-table"; import { Drawer, Tag } from "antd"; -import { Skeleton } from "@patternfly/react-core"; import { differenceInSeconds, format } from "date-fns"; import React, { useContext, useEffect, useRef, useState } from "react"; import { useNavigate } from "react-router"; @@ -338,7 +337,7 @@ const LibraryTable: React.FC<TableProps> = ({ resource={resource} name={getFolderName(resource, computedPath)} date={resource.data.creation_date} - owner=" " + owner={resource.data.owner_username} size={0} computedPath={computedPath} handleFolderClick={() => { From 86d54d3bb598955ead2649518678fe8f700d498b Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 12 Sep 2024 10:56:47 -0400 Subject: [PATCH 184/337] chore: Update cornerstone --- package-lock.json | 38 ++++++++++++++++++++++++++++++-------- package.json | 6 +++--- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2ea23a457..7c85aaf5b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,10 +8,10 @@ "name": "chrisui", "version": "0.0.0", "dependencies": { - "@cornerstonejs/core": "^1.82.4", - "@cornerstonejs/dicom-image-loader": "^1.82.4", + "@cornerstonejs/core": "^1.84.4", + "@cornerstonejs/dicom-image-loader": "^1.84.4", "@cornerstonejs/streaming-image-volume-loader": "^1.82.4", - "@cornerstonejs/tools": "^1.82.4", + "@cornerstonejs/tools": "^1.84.4", "@fnndsc/chrisapi": "^1.22.0", "@fontsource/inter": "^5.0.20", "@niivue/niivue": "^0.41.1", @@ -659,6 +659,8 @@ }, "node_modules/@cornerstonejs/codec-charls": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-charls/-/codec-charls-1.2.3.tgz", + "integrity": "sha512-qKUe6DN0dnGzhhfZLYhH9UZacMcudjxcaLXCrpxJImT/M/PQvZCT2rllu6VGJbWKJWG+dMVV2zmmleZcdJ7/cA==", "license": "MIT", "engines": { "node": ">=0.14" @@ -666,6 +668,8 @@ }, "node_modules/@cornerstonejs/codec-libjpeg-turbo-8bit": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-libjpeg-turbo-8bit/-/codec-libjpeg-turbo-8bit-1.2.2.tgz", + "integrity": "sha512-aAUMK2958YNpOb/7G6e2/aG7hExTiFTASlMt/v90XA0pRHdWiNg5ny4S5SAju0FbIw4zcMnR0qfY+yW3VG2ivg==", "license": "ISC", "engines": { "node": ">=0.14" @@ -673,6 +677,8 @@ }, "node_modules/@cornerstonejs/codec-openjpeg": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-openjpeg/-/codec-openjpeg-1.2.4.tgz", + "integrity": "sha512-UT2su6xZZnCPSuWf2ldzKa/2+guQ7BGgfBSKqxanggwJHh48gZqIAzekmsLyJHMMK5YDK+ti+fzvVJhBS3Xi/g==", "license": "MIT", "engines": { "node": ">=0.14" @@ -680,13 +686,17 @@ }, "node_modules/@cornerstonejs/codec-openjph": { "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz", + "integrity": "sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==", "license": "MIT", "engines": { "node": ">=0.14" } }, "node_modules/@cornerstonejs/core": { - "version": "1.84.1", + "version": "1.84.4", + "resolved": "https://registry.npmjs.org/@cornerstonejs/core/-/core-1.84.4.tgz", + "integrity": "sha512-+6Sa5EUWVbXqiR/+tHFzzMrMO8V2mAmi1oQt3iiBIm5roXzU++1smsckWgsRdZOgfHhQbHjkdEixlfuMGToiaw==", "license": "MIT", "dependencies": { "@kitware/vtk.js": "30.4.1", @@ -701,14 +711,16 @@ } }, "node_modules/@cornerstonejs/dicom-image-loader": { - "version": "1.84.1", + "version": "1.84.4", + "resolved": "https://registry.npmjs.org/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.84.4.tgz", + "integrity": "sha512-IFRKmau82ku0vaqAduc98HcObgCfeyzZdAfQ/HiYA4RfWMZSGJm9DQiZXW+VUzlzim+8HEdwOrKY79AK7GylLg==", "license": "MIT", "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", - "@cornerstonejs/core": "^1.84.1", + "@cornerstonejs/core": "^1.84.4", "dicom-parser": "^1.8.9", "pako": "^2.0.4", "uuid": "^9.0.0" @@ -716,6 +728,8 @@ }, "node_modules/@cornerstonejs/dicom-image-loader/node_modules/pako": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", "license": "(MIT AND Zlib)" }, "node_modules/@cornerstonejs/streaming-image-volume-loader": { @@ -731,10 +745,12 @@ } }, "node_modules/@cornerstonejs/tools": { - "version": "1.84.1", + "version": "1.84.4", + "resolved": "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-1.84.4.tgz", + "integrity": "sha512-p2G811Xoez88hhYvIzHqXwsCjT0laLJc0hDREUapxqjcgL8FbKsIq+Pn8pWT2z/eYBcOW5ocXxnTRAs6mFRpuA==", "license": "MIT", "dependencies": { - "@cornerstonejs/core": "^1.84.1", + "@cornerstonejs/core": "^1.84.4", "@icr/polyseg-wasm": "0.4.0", "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", @@ -816,6 +832,8 @@ }, "node_modules/@icr/polyseg-wasm": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@icr/polyseg-wasm/-/polyseg-wasm-0.4.0.tgz", + "integrity": "sha512-3sZmiwG8I0NaqPle0L7+V/ZexiR7IjIUFkUsaOoFI9rNuBGyyMMmxAxnCmqcDFtBDk9h+JEYJf6e3NnqlHi/HQ==", "license": "MIT", "engines": { "node": ">=0.14" @@ -1929,6 +1947,8 @@ }, "node_modules/@types/offscreencanvas": { "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", "license": "MIT" }, "node_modules/@types/parse-json": { @@ -5040,6 +5060,8 @@ }, "node_modules/lodash.get": { "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "license": "MIT" }, "node_modules/loose-envify": { diff --git a/package.json b/package.json index 41cfa20d0..90ac17035 100644 --- a/package.json +++ b/package.json @@ -38,10 +38,10 @@ "print-version": "node printVersion.js" }, "dependencies": { - "@cornerstonejs/core": "^1.82.4", - "@cornerstonejs/dicom-image-loader": "^1.82.4", + "@cornerstonejs/core": "^1.84.4", + "@cornerstonejs/dicom-image-loader": "^1.84.4", "@cornerstonejs/streaming-image-volume-loader": "^1.82.4", - "@cornerstonejs/tools": "^1.82.4", + "@cornerstonejs/tools": "^1.84.4", "@fnndsc/chrisapi": "^1.22.0", "@fontsource/inter": "^5.0.20", "@niivue/niivue": "^0.41.1", From aec814f30ee9d698dfb001fe59f05c167a726214 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 12 Sep 2024 12:26:01 -0400 Subject: [PATCH 185/337] fix: Continous polling in the feed table due to incorrect data handling --- src/components/CreateFeed/utils.ts | 12 +- .../FeedOutputBrowser/FeedOutputBrowser.tsx | 9 +- .../FeedOutputBrowser/FileBrowser.tsx | 42 ++++-- src/components/FeedOutputBrowser/types.ts | 13 +- .../FeedOutputBrowser/useFeedBrowser.tsx | 121 +++++++----------- src/components/Feeds/FeedListView.tsx | 4 +- src/components/Feeds/utilties.ts | 5 +- src/components/NewLibrary/index.tsx | 118 ++++++++--------- 8 files changed, 164 insertions(+), 160 deletions(-) diff --git a/src/components/CreateFeed/utils.ts b/src/components/CreateFeed/utils.ts index a55418407..a2803369f 100644 --- a/src/components/CreateFeed/utils.ts +++ b/src/components/CreateFeed/utils.ts @@ -1,9 +1,9 @@ -import type { PluginMeta, Tag, Pipeline } from "@fnndsc/chrisapi"; +import type { Pipeline, PluginMeta, Tag } from "@fnndsc/chrisapi"; import type { EventDataNode } from "rc-tree/lib/interface"; -import type { DataBreadcrumb } from "./types/feed"; -import { fetchFilesFromAPath } from "../FeedOutputBrowser/useFeedBrowser"; import ChrisAPIClient from "../../api/chrisapiclient"; import { fetchResource, fetchResources } from "../../api/common"; +import { fetchFolders } from "../NewLibrary"; +import type { DataBreadcrumb } from "./types/feed"; export const fetchTagList = async () => { const client = ChrisAPIClient.getClient(); @@ -71,11 +71,11 @@ export const generateTreeNodes = async ( isLeaf: boolean; checkable: boolean; }[] = []; - //@ts-ignore - const { folderFiles, linkFiles, children } = await fetchFilesFromAPath( + + const { subFoldersMap, linkFilesMap, filesMap } = await fetchFolders( treeNode.breadcrumb, ); - const items = [...folderFiles, ...linkFiles, ...children]; + const items = [...subFoldersMap, ...linkFilesMap, ...filesMap]; for (let i = 0; i < items.length; i++) { const item = items[i]; diff --git a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx index 5eca21fb5..9f7bc73ae 100644 --- a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx +++ b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx @@ -5,7 +5,7 @@ import { EmptyStateVariant, Title, } from "@patternfly/react-core"; -import { Alert, Spin } from "../Antd"; +import { Alert } from "../Antd"; import { SpinContainer } from "../Common"; import "./FeedOutputBrowser.css"; import FileBrowser from "./FileBrowser"; @@ -28,6 +28,9 @@ const FeedOutputBrowser: React.FC<FeedOutputBrowserProps> = () => { isError, error, currentPath, + fetchMore, + observerTarget, + handlePagination, } = useFeedBrowser(); return ( <div style={{ height: "100%" }} className="feed-output-browser"> @@ -39,6 +42,10 @@ const FeedOutputBrowser: React.FC<FeedOutputBrowserProps> = () => { handleFileClick={handleFileClick} pluginFilesPayload={pluginFilesPayload} currentPath={currentPath} + fetchMore={fetchMore} + observerTarget={observerTarget} + handlePagination={handlePagination} + isLoading={filesLoading} /> ) : statusTitle && statusTitles.includes(statusTitle) ? ( <FetchFilesLoader title="Plugin executing. Files will be fetched when plugin completes" /> diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 3cec9d8c8..f0cce9bf9 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -64,19 +64,21 @@ const FileBrowser = (props: FileBrowserProps) => { const handleDownloadMutation = useDownload(feed); const [api, contextHolder] = notification.useNotification(); const { isSuccess, isError, error: downloadError } = handleDownloadMutation; - const { pluginFilesPayload, handleFileClick, selected, - currentPath: additionalKey, + observerTarget, + fetchMore, + handlePagination, + isLoading, } = props; const selectedFile = useTypedSelector((state) => state.explorer.selectedFile); const drawerState = useTypedSelector((state) => state.drawers); const username = useTypedSelector((state) => state.user.username); - const { folderFiles, linkFiles, children, path } = pluginFilesPayload; - const breadcrumb = path.split("/"); + const { subFoldersMap, linkFilesMap, filesMap } = pluginFilesPayload; + const breadcrumb = additionalKey.split("/"); const currentPath = `home/${username}/feeds/feed_${feed?.data.id}/${selected?.data.plugin_name}_${selected?.data.id}/data`; useEffect(() => { @@ -203,17 +205,17 @@ const FileBrowser = (props: FileBrowserProps) => { type: OperationContext.FILEBROWSER, additionalKeys: [additionalKey], }} - computedPath={path} + computedPath={additionalKey} folderList={pluginFilesPayload.folderList} /> <div className="file-browser__header"> <div className="file-browser__header--breadcrumbContainer"> - <ClipboardCopyContainer path={path} /> + <ClipboardCopyContainer path={additionalKey} /> <Breadcrumb>{breadcrumb.map(generateBreadcrumb)}</Breadcrumb> </div> <div> - {path !== currentPath && + {additionalKey !== currentPath && selected.data.plugin_type === "fs" && ( <Tooltip content={<span>Go back to the base directory</span>} @@ -240,7 +242,7 @@ const FileBrowser = (props: FileBrowserProps) => { </Tr> </Thead> <Tbody> - {folderFiles.map((resource: FileBrowserFolderFile, index) => { + {filesMap.map((resource: FileBrowserFolderFile, index) => { return ( <FileRow rowIndex={index} @@ -250,7 +252,7 @@ const FileBrowser = (props: FileBrowserProps) => { date={resource.data.creation_date} owner={resource.data.owner_username} size={resource.data.fsize} - computedPath={path} + computedPath={additionalKey} handleFolderClick={() => { return; }} @@ -265,7 +267,7 @@ const FileBrowser = (props: FileBrowserProps) => { /> ); })} - {linkFiles.map( + {linkFilesMap.map( (resource: FileBrowserFolderLinkFile, index) => { return ( <LinkRow @@ -276,7 +278,7 @@ const FileBrowser = (props: FileBrowserProps) => { date={resource.data.creation_date} owner={resource.data.owner_username} size={resource.data.fsize} - computedPath={path} + computedPath={additionalKey} handleFolderClick={() => { return; }} @@ -288,17 +290,17 @@ const FileBrowser = (props: FileBrowserProps) => { }, )} - {children.map((resource: FileBrowserFolder, index) => { + {subFoldersMap.map((resource: FileBrowserFolder, index) => { return ( <FolderRow rowIndex={index} key={resource.data.path} resource={resource} - name={getFolderName(resource, path)} + name={getFolderName(resource, additionalKey)} date={resource.data.creation_date} owner=" " size={0} - computedPath={path} + computedPath={additionalKey} handleFolderClick={() => handleFileClick(resource.data.path) } @@ -310,6 +312,18 @@ const FileBrowser = (props: FileBrowserProps) => { })} </Tbody> </Table> + {fetchMore && !isLoading && ( + <Button onClick={handlePagination} variant="link"> + Load more data... + </Button> + )} + <div + style={{ + height: "1px", // Ensure it's visible to the observer + marginTop: "10px", // Ensure it's not blocked by other content + }} + ref={observerTarget} + /> </DrawerContentBody> )} </DrawerContent> diff --git a/src/components/FeedOutputBrowser/types.ts b/src/components/FeedOutputBrowser/types.ts index cfc997f95..bbd087d72 100644 --- a/src/components/FeedOutputBrowser/types.ts +++ b/src/components/FeedOutputBrowser/types.ts @@ -1,4 +1,5 @@ import type { + FileBrowserFolder, FileBrowserFolderFile, FileBrowserFolderLinkFile, FileBrowserFolderList, @@ -7,19 +8,21 @@ import type { import type { DataNode } from "../../store/explorer/types"; export interface FilesPayload { - folderFiles: FileBrowserFolderFile[]; - children: any[]; - linkFiles: FileBrowserFolderLinkFile[]; + filesMap: FileBrowserFolderFile[]; + subFoldersMap: FileBrowserFolder[]; + linkFilesMap: FileBrowserFolderLinkFile[]; folderList?: FileBrowserFolderList; - path: string; } export interface FileBrowserProps { pluginFilesPayload: FilesPayload; handleFileClick: (path: string) => void; selected: PluginInstance; - currentPath: string; + isLoading: boolean; + handlePagination: () => void; + fetchMore?: boolean; + observerTarget?: React.MutableRefObject<any>; } export interface FileBrowserState { diff --git a/src/components/FeedOutputBrowser/useFeedBrowser.tsx b/src/components/FeedOutputBrowser/useFeedBrowser.tsx index 3d134a91a..71ccc03bc 100644 --- a/src/components/FeedOutputBrowser/useFeedBrowser.tsx +++ b/src/components/FeedOutputBrowser/useFeedBrowser.tsx @@ -1,13 +1,7 @@ -import type { - FileBrowserFolderFile, - FileBrowserFolderLinkFile, -} from "@fnndsc/chrisapi"; -import { useQuery } from "@tanstack/react-query"; -import React from "react"; -import ChrisAPIClient from "../../api/chrisapiclient"; -import { catchError, fetchResource } from "../../api/common"; +import { keepPreviousData, useQuery } from "@tanstack/react-query"; +import { useEffect, useRef, useState } from "react"; import { useTypedSelector } from "../../store/hooks"; -import type { FilesPayload } from "./types"; +import { fetchFolders } from "../NewLibrary"; const status = ["finishedSuccessfully", "finishedWithError", "cancelled"]; @@ -19,67 +13,11 @@ const getInitialDownloadState = () => ({ fetchingFiles: false, }); -export const fetchFilesFromAPath = async ( - path: string, -): Promise<FilesPayload> => { - const client = ChrisAPIClient.getClient(); - const foldersList = await client.getFileBrowserFolders({ - path, - }); - - const folders = foldersList.getItems(); - - if (folders) { - const folder = folders[0]; - if (folder) { - const pagination = { limit: 100, offset: 0 }; - const fetchChildren = folder.getChildren; - const boundChildren = fetchChildren.bind(folder); - - try { - const { resource: children } = await fetchResource( - pagination, - boundChildren, - ); - const linkFilesFn = folder.getLinkFiles; - const boundLinkFilesFn = linkFilesFn.bind(folder); - const { resource: linkFiles } = - await fetchResource<FileBrowserFolderLinkFile>( - pagination, - boundLinkFilesFn, - ); - const filesFn = folder.getFiles; - const boundFilesFn = filesFn.bind(folder); - const { resource: folderFiles } = - await fetchResource<FileBrowserFolderFile>(pagination, boundFilesFn); - - return { - folderFiles: folderFiles, - linkFiles: linkFiles, - children: children, - folderList: foldersList, - path, - }; - } catch (error) { - const errorMessage = catchError(error).error_message; - throw new Error(errorMessage); - } - } - } - - return { - folderFiles: [], - linkFiles: [], - children: [], - folderList: undefined, - path, - }; -}; - export const useFeedBrowser = () => { const drawerState = useTypedSelector((state) => state.drawers); - const [download, setDownload] = React.useState(getInitialDownloadState); - const [currentPath, setCurrentPath] = React.useState(""); + const [download, setDownload] = useState(getInitialDownloadState); + const [currentPath, setCurrentPath] = useState(""); + const [pageNumber, setPageNumber] = useState(1); const pluginInstances = useTypedSelector( (state) => state.instance.pluginInstances, @@ -102,7 +40,7 @@ export const useFeedBrowser = () => { (statusTitle && status.includes(statusTitle)) ); - const queryKey = ["pluginFiles", currentPath]; + const queryKey = ["pluginFiles", currentPath, pageNumber]; const { data: pluginFilesPayload, @@ -111,11 +49,47 @@ export const useFeedBrowser = () => { error, } = useQuery({ queryKey: queryKey, - queryFn: () => fetchFilesFromAPath(currentPath), + queryFn: () => fetchFolders(currentPath, pageNumber), enabled: !!selected && !!currentPath && finished, + placeholderData: keepPreviousData, + structuralSharing: true, }); - React.useEffect(() => { + // Handle pagination by incrementing the page number + const handlePagination = () => { + setPageNumber((prevState) => prevState + 1); + }; + + const observerTarget = useRef(null); + + const fetchMore = + pluginFilesPayload?.foldersPagination.hasNextPage || + pluginFilesPayload?.filesPagination.hasNextPage || + pluginFilesPayload?.linksPagination.hasNextPage; + + // Set up an intersection observer to load more data when the user scrolls to the bottom of the page + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + if (entries[0].isIntersecting && fetchMore) { + handlePagination(); + } + }, + { threshold: 0.5 }, + ); + + if (observerTarget.current) { + observer.observe(observerTarget.current); + } + + return () => { + if (observerTarget.current) { + observer.unobserve(observerTarget.current); + } + }; + }, [fetchMore]); + + useEffect(() => { if ((statusTitle && status.includes(statusTitle)) || finished) { // User is trying to download a file before it is available if (download.error) { @@ -131,7 +105,7 @@ export const useFeedBrowser = () => { } }, [finished, pluginFilesPayload, statusTitle, download.error]); - React.useEffect(() => { + useEffect(() => { setCurrentPath(selected?.data.output_path); }, [selected]); @@ -154,5 +128,8 @@ export const useFeedBrowser = () => { filesStatus: drawerState.files, previewStatus: drawerState.preview, currentPath, + observerTarget, + fetchMore, + handlePagination, }; }; diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index d1308d372..cd64786c6 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -117,7 +117,9 @@ const TableSelectable: React.FC = () => { return { [feed.data.id]: { details: res } }; }, refetchInterval: (data: any) => { - const details = data?.[feed.data.id]?.details; + const state = data.state.data; + const details = state?.[feed.data.id]?.details; + if (!details) return false; if (details?.progress === 100 || details?.error === true) { return false; // Stop polling } diff --git a/src/components/Feeds/utilties.ts b/src/components/Feeds/utilties.ts index e9d4a17f7..86b0b9156 100644 --- a/src/components/Feeds/utilties.ts +++ b/src/components/Feeds/utilties.ts @@ -4,13 +4,13 @@ import type { } from "../../store/drawer/drawerSlice"; import { setDrawerState } from "../../store/drawer/drawerSlice"; -import ChrisAPIClient from "../../api/chrisapiclient"; import type { Feed, - PublicFeedList, FeedList, PluginInstance, + PublicFeedList, } from "@fnndsc/chrisapi"; +import ChrisAPIClient from "../../api/chrisapiclient"; import { fetchResource } from "../../api/common"; export const handleDrawerActions = ( @@ -182,6 +182,7 @@ const LOOKUP: Record<PluginInstanceStatus, number> = { export const getPluginInstanceDetails = async ( feed: Feed, ): Promise<PluginInstanceDetails> => { + console.log("getplugininstace called"); const details: PluginInstanceDetails = { size: 0, progress: 0, diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index 8c328779b..f6934879b 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -20,75 +20,75 @@ import LibraryTable from "./components/LibraryTable"; import Operations from "./components/Operations"; import { OperationContext } from "./context"; -const NewLibrary = () => { - // Fetch folders from the server - async function fetchFolders(computedPath: string, pageNumber: number) { - const client = ChrisAPIClient.getClient(); - await client.setUrls(); - const pagination = { - limit: pageNumber * 50, - offset: 0, - }; +// Fetch folders from the server +export async function fetchFolders(computedPath: string, pageNumber?: number) { + const client = ChrisAPIClient.getClient(); + await client.setUrls(); + const pagination = { + limit: pageNumber ? pageNumber * 50 : 100, + offset: 0, + }; - try { - const folderList = await client.getFileBrowserFolders({ - path: computedPath, - }); + try { + const folderList = await client.getFileBrowserFolders({ + path: computedPath, + }); - const folders = folderList.getItems(); - let subFoldersMap: FileBrowserFolder[] = []; - let linkFilesMap: FileBrowserFolderLinkFile[] = []; - let filesMap: FileBrowserFolderFile[] = []; - const initialPaginateValue = { - totalCount: 0, - hasNextPage: false, - }; - let filesPagination = initialPaginateValue; - let foldersPagination = initialPaginateValue; - let linksPagination = initialPaginateValue; + const folders = folderList.getItems(); + let subFoldersMap: FileBrowserFolder[] = []; + let linkFilesMap: FileBrowserFolderLinkFile[] = []; + let filesMap: FileBrowserFolderFile[] = []; + const initialPaginateValue = { + totalCount: 0, + hasNextPage: false, + }; + let filesPagination = initialPaginateValue; + let foldersPagination = initialPaginateValue; + let linksPagination = initialPaginateValue; - if (folders) { - const folder = folders[0]; + if (folders) { + const folder = folders[0]; - if (folder) { - const children = await folder.getChildren(pagination); - const linkFiles = await folder.getLinkFiles(pagination); - const folderFiles = await folder.getFiles(pagination); + if (folder) { + const children = await folder.getChildren(pagination); + const linkFiles = await folder.getLinkFiles(pagination); + const folderFiles = await folder.getFiles(pagination); - subFoldersMap = children.getItems(); - filesMap = folderFiles.getItems(); - linkFilesMap = linkFiles.getItems(); + subFoldersMap = children.getItems(); + filesMap = folderFiles.getItems(); + linkFilesMap = linkFiles.getItems(); - foldersPagination = { - totalCount: children.totalCount, - hasNextPage: children.hasNextPage, - }; - linksPagination = { - totalCount: linkFiles.totalCount, - hasNextPage: linkFiles.hasNextPage, - }; - filesPagination = { - totalCount: folderFiles.totalCount, - hasNextPage: folderFiles.hasNextPage, - }; - } + foldersPagination = { + totalCount: children.totalCount, + hasNextPage: children.hasNextPage, + }; + linksPagination = { + totalCount: linkFiles.totalCount, + hasNextPage: linkFiles.hasNextPage, + }; + filesPagination = { + totalCount: folderFiles.totalCount, + hasNextPage: folderFiles.hasNextPage, + }; } - - return { - subFoldersMap, - linkFilesMap, - filesMap, - filesPagination, - foldersPagination, - linksPagination, - folderList, // return folderList as you can make a post request to this resource to create a new folder - }; - } catch (e) { - // biome-ignore lint/complexity/noUselessCatch: <explanation> - throw e; } + + return { + subFoldersMap, + linkFilesMap, + filesMap, + filesPagination, + foldersPagination, + linksPagination, + folderList, // return folderList as you can make a post request to this resource to create a new folder + }; + } catch (e) { + // biome-ignore lint/complexity/noUselessCatch: <explanation> + throw e; } +} +const NewLibrary = () => { const { pathname } = useLocation(); const navigate = useNavigate(); const [pageNumber, setPageNumber] = useState(1); From 4af90d6397c5e540c2587ea6398470e43cc8b815 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 12 Sep 2024 15:15:35 -0400 Subject: [PATCH 186/337] fix: Bug fix in the Library page --- src/components/FeedOutputBrowser/FileBrowser.tsx | 2 +- src/components/Feeds/FeedListView.tsx | 2 +- src/components/Feeds/utilties.ts | 1 - .../NewLibrary/components/Operations.tsx | 15 +++++++++------ src/components/Preview/displays/DcmDisplay.tsx | 1 - 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index f0cce9bf9..0fcb56f7e 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -234,7 +234,7 @@ const FileBrowser = (props: FileBrowserProps) => { <Table variant="compact"> <Thead aria-label="file-browser-table"> <Tr> - <Th /> + <Th aria-label="file-selection-checkbox" /> <Th aria-label="file-name">{columnNames.name}</Th> <Th aria-label="file-creator">{columnNames.created}</Th> <Th aria-label="file-owner">{columnNames.creator}</Th> diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index cd64786c6..bd8d6892d 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -296,7 +296,7 @@ const TableSelectable: React.FC = () => { > <Thead> <Tr> - <Th /> + <Th aria-label="feed-selection-checkbox" /> {COLUMN_DEFINITIONS.map((column, columnIndex) => ( <Th key={column.id} sort={getSortParams(columnIndex)}> {column.label} diff --git a/src/components/Feeds/utilties.ts b/src/components/Feeds/utilties.ts index 86b0b9156..3b5c1ac0e 100644 --- a/src/components/Feeds/utilties.ts +++ b/src/components/Feeds/utilties.ts @@ -182,7 +182,6 @@ const LOOKUP: Record<PluginInstanceStatus, number> = { export const getPluginInstanceDetails = async ( feed: Feed, ): Promise<PluginInstanceDetails> => { - console.log("getplugininstace called"); const details: PluginInstanceDetails = { size: 0, progress: 0, diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index 0339ce00e..ba8de6d0e 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -59,12 +59,6 @@ interface OperationProps { }; } -const OPERATION_ITEMS = [ - { key: "newFolder", label: "New Folder", disabled: false }, - { key: "fileUpload", label: "File Upload", disabled: false }, - { key: "folderUpload", label: "Folder Upload", disabled: false }, -]; - const Operations = ({ origin, computedPath, @@ -76,8 +70,17 @@ const Operations = ({ const dispatch = useDispatch(); const isFeedsTable = matchPath({ path: "/feeds", end: true }, location.pathname) !== null; // This checks if the path matches and returns true or false + const OPERATION_ITEMS = useMemo( + () => [ + { key: "newFolder", label: "New Folder", disabled: false }, + { key: "fileUpload", label: "File Upload", disabled: false }, + { key: "folderUpload", label: "Folder Upload", disabled: false }, + ], + [], + ); if (isFeedsTable) { + console.log("Disabling"); OPERATION_ITEMS[0].disabled = true; } diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index f073a35b2..2ab9b63d4 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -37,7 +37,6 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { IStackViewport | undefined >(); const [renderingEngine, setRenderingEngine] = useState<RenderingEngine>(); - const dicomImageRef = useRef<HTMLDivElement>(null); const uniqueId = `${file?.data.id || v4()}`; const elementId = `cornerstone-element-${uniqueId}`; From 055464fc6686884e1f8f243f072ff823da92ace0 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 12 Sep 2024 17:16:06 -0400 Subject: [PATCH 187/337] feat: Update how previews are loaded --- src/api/filesystem.ts | 32 -------- src/api/model.ts | 11 +-- src/components/Preview/FileDetailView.tsx | 77 ++----------------- .../Preview/displays/CatchallDisplay.tsx | 10 +-- .../Preview/displays/DcmDisplay.tsx | 27 ++++--- .../Preview/displays/IframeDisplay.tsx | 55 ++++++------- .../Preview/displays/ImageDisplay.tsx | 56 ++++++++------ .../Preview/displays/JsonDisplay.tsx | 32 +++----- .../Preview/displays/NiiVueDisplay.tsx | 29 ++++--- .../Preview/displays/PdfDisplay.tsx | 46 +++++++---- .../Preview/displays/TextDisplay.tsx | 66 ++++++---------- .../Preview/displays/VideoDisplay.tsx | 45 ++++++++--- .../Preview/displays/ViewerDisplay.tsx | 4 +- 13 files changed, 214 insertions(+), 276 deletions(-) diff --git a/src/api/filesystem.ts b/src/api/filesystem.ts index 2b5fcf651..12dd4f301 100644 --- a/src/api/filesystem.ts +++ b/src/api/filesystem.ts @@ -1,38 +1,6 @@ import ChrisAPIClient from "./chrisapiclient"; import { fetchResource } from "./common"; -export const ls = async (path?: string) => { - let folders: any[] = []; - let files: any[] = []; - if (!path) return { folders, files }; - - try { - const client = ChrisAPIClient.getClient(); - const uploads = await client.getFileBrowserPaths({ - path, - }); - - folders = uploads.data?.[0].subfolders - ? JSON.parse(uploads.data[0].subfolders) - : []; - const pathList = await client.getFileBrowserPath(path); - - if (pathList) { - const pagination = { - limit: 100, - offset: 0, - }; - const fn = pathList.getFiles; - const boundFn = fn.bind(pathList); - const data = await fetchResource(pagination, boundFn); - files = data.resource; - } - return { folders, files }; - } catch (error) { - return { folders, files }; - } -}; - export const find = async (space?: string | null, search?: string | null) => { const client = ChrisAPIClient.getClient(); if (space === "feeds") { diff --git a/src/api/model.ts b/src/api/model.ts index 7ccb51dcf..733330e76 100644 --- a/src/api/model.ts +++ b/src/api/model.ts @@ -1,9 +1,9 @@ -import _ from "lodash"; import type { FileBrowserFolderFile, PACSFile, PluginInstance, } from "@fnndsc/chrisapi"; +import _ from "lodash"; export interface IActionTypeParam { type: string; @@ -12,6 +12,8 @@ export interface IActionTypeParam { error?: any; } +export type IFileBlob = PACSFile | FileBrowserFolderFile; + export type chrisId = number | string; export type NodeId = chrisId | undefined; @@ -164,13 +166,6 @@ export class TreeModel { } } -export interface IFileBlob { - blob?: Blob; - file?: FileBrowserFolderFile | PACSFile; - url?: string; - fileType: string; -} - // Description: Mapping for Viewer type by file type *Note: Should come from db // File type: Viewer component name export const fileViewerMap: any = { diff --git a/src/components/Preview/FileDetailView.tsx b/src/components/Preview/FileDetailView.tsx index 894faa080..4eb153a82 100644 --- a/src/components/Preview/FileDetailView.tsx +++ b/src/components/Preview/FileDetailView.tsx @@ -8,14 +8,12 @@ import { Tooltip, } from "@patternfly/react-core"; import ResetIcon from "@patternfly/react-icons/dist/esm/icons/history-icon"; -import { useMutation, useQuery } from "@tanstack/react-query"; -import { Alert } from "../Antd"; +import { useMutation } from "@tanstack/react-query"; import * as dicomParser from "dicom-parser"; import React, { Fragment, useCallback, useEffect, - useMemo, useState, type ReactElement, } from "react"; @@ -51,8 +49,6 @@ export interface ActionState { [key: string]: boolean | string; } -const fileTypes = ["nii", "dcm", "fsm", "crv", "smoothwm", "pial", "nii.gz"]; - const FileDetailView = (props: AllProps) => { const [tagInfo, setTagInfo] = useState<any>(); const [actionState, setActionState] = useState<ActionState>({ @@ -131,60 +127,9 @@ const FileDetailView = (props: AllProps) => { }); const { selectedFile, preview } = props; - - const fetchData = useCallback( - async (selectedFile?: FileBrowserFolderFile | PACSFile) => { - if (!selectedFile) { - throw new Error("Please select a file to preview"); - } - const fileName = selectedFile.data.fname; - const fileType = getFileExtension(fileName); - - if (props.isPublic && !fileTypes.includes(fileType)) { - return { - blob: undefined, - file: selectedFile, - fileType, - url: selectedFile?.collection.items[0].links[0].href, - }; - } - - try { - const blob = await selectedFile.getFileBlob(); - - if (blob.size > 500 * 1024 * 1024 && !fileTypes.includes(fileType)) { - throw new Error( - "Unsupported file format. File size exceeds 500mb and can lead to a browser crash if displayed as Text", - ); - } - return { - blob, - file: selectedFile, - fileType, - url: "", - }; - } catch (error: any) { - // biome-ignore lint/complexity/noUselessCatch: <explanation> - throw error; - } - }, - [selectedFile], - ); - - const queryKey = useMemo(() => ["preview", selectedFile], [selectedFile]); - - const { data, isLoading, isError, error } = useQuery({ - queryKey, - queryFn: () => fetchData(selectedFile), - staleTime: 5 * 60 * 1000, // Cache data for 5 minutes - retry: false, - }); - let viewerName = ""; - - if (data?.fileType) { - const { fileType } = data; - + const fileType = getFileExtension(selectedFile?.data.fname); + if (fileType) { if (!fileViewerMap[fileType]) { viewerName = "CatchallDisplay"; } else { @@ -193,8 +138,8 @@ const FileDetailView = (props: AllProps) => { } const handleEvents = (action: string, previouslyActive: string) => { - if (action === "TagInfo" && data) { - mutation.mutate(data.blob); + if (action === "TagInfo" && selectedFile) { + mutation.mutate(selectedFile); } const currentAction = actionState[action]; setActionState({ @@ -248,20 +193,12 @@ const FileDetailView = (props: AllProps) => { /> )} - {isLoading && ( - <SpinContainer title="Please wait as the file is being fetched..." /> - )} - - {isError && ( - <Alert closable type="error" description={error.message} /> - )} - - {data && ( + {selectedFile && ( <ViewerDisplay preview={preview} viewerName={viewerName} - fileItem={data} actionState={actionState} + selectedFile={selectedFile} /> )} </div> diff --git a/src/components/Preview/displays/CatchallDisplay.tsx b/src/components/Preview/displays/CatchallDisplay.tsx index 74e26ff77..7cade1051 100644 --- a/src/components/Preview/displays/CatchallDisplay.tsx +++ b/src/components/Preview/displays/CatchallDisplay.tsx @@ -1,22 +1,22 @@ import { memo } from "react"; import { Alert } from "../../Antd"; -import type { IFileBlob } from "../../../api/model"; +import { getFileExtension, type IFileBlob } from "../../../api/model"; type AllProps = { - fileItem: IFileBlob; + selectedFile?: IFileBlob; }; const CatchallDisplay: React.FunctionComponent<AllProps> = ( props: AllProps, ) => { const noPreviewMessage = () => { - const { fileItem } = props; - const ext = fileItem.fileType ? fileItem.fileType : ""; + const { selectedFile } = props; + const extension = getFileExtension(selectedFile?.data.fname); return ( <Alert type="info" - description={`No preview available for the filetype ${ext}`} + description={`No preview available for the filetype ${extension}`} /> ); }; diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 2ab9b63d4..bd971660a 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -22,23 +22,23 @@ import { removeTools, setUpTooling, } from "./dicomUtils/utils"; -import { _loadImageIntoBuffer } from "./dicomUtils/webImageLoader"; export type DcmImageProps = { - fileItem: IFileBlob; - preview?: string; + selectedFile?: IFileBlob; actionState: ActionState; + preview: string; }; const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { - const { fileItem, preview, actionState } = props; - const { file, blob } = fileItem; + console.log("Props", props); + const { selectedFile, actionState, preview } = props; + const [activeViewport, setActiveViewport] = useState< IStackViewport | undefined >(); const [renderingEngine, setRenderingEngine] = useState<RenderingEngine>(); const dicomImageRef = useRef<HTMLDivElement>(null); - const uniqueId = `${file?.data.id || v4()}`; + const uniqueId = `${selectedFile?.data.id || v4()}`; const elementId = `cornerstone-element-${uniqueId}`; const size = useSize(dicomImageRef); // Use the useSize hook with dicomImageRef @@ -78,28 +78,31 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { async function setupCornerstone() { const element = document.getElementById(elementId) as HTMLDivElement; - if (file && blob) { + if (selectedFile) { let imageID: string; - const extension = getFileExtension(file.data.fname); + const extension = getFileExtension(selectedFile.data.fname); await basicInit(); setUpTooling(uniqueId); if (extension === "dcm") { + const blob = await selectedFile.getFileBlob(); imageID = await loadDicomImage(blob); } else { const fileviewer = new FileViewerModel(); - const fileName = fileviewer.getFileName(file as FileBrowserFolderFile); - imageID = `web:${file.url}${fileName}`; + const fileName = fileviewer.getFileName( + selectedFile as FileBrowserFolderFile, + ); + imageID = `web:${selectedFile.url}${fileName}`; } const { viewport, renderingEngine: newRenderingEngine } = await displayDicomImage(element, imageID, uniqueId); setActiveViewport(viewport); setRenderingEngine(newRenderingEngine); - return file.data.fname; + return selectedFile.data.fname; } } const { isLoading } = useQuery({ - queryKey: ["cornerstone-preview", file, blob], + queryKey: ["cornerstone-preview", selectedFile], queryFn: () => setupCornerstone(), refetchOnMount: true, }); diff --git a/src/components/Preview/displays/IframeDisplay.tsx b/src/components/Preview/displays/IframeDisplay.tsx index 49744342e..776f72543 100644 --- a/src/components/Preview/displays/IframeDisplay.tsx +++ b/src/components/Preview/displays/IframeDisplay.tsx @@ -1,46 +1,47 @@ -import React, { Fragment } from "react"; -import type { IFileBlob } from "../../../api/model"; -type AllProps = { - fileItem: IFileBlob; +import React, { useEffect, useState, Fragment } from "react"; +import { getFileExtension, type IFileBlob } from "../../../api/model"; + +type IframeDisplayProps = { + selectedFile?: IFileBlob; }; -const IframeDisplay: React.FunctionComponent<AllProps> = (props: AllProps) => { - const { fileItem } = props; +const IframeDisplay: React.FC<IframeDisplayProps> = ({ selectedFile }) => { + const [url, setURL] = useState<string>(""); - let url = ""; + useEffect(() => { + const constructURL = async () => { + const fileType = getFileExtension(selectedFile?.data.fname || ""); + let constructedURL = selectedFile?.url || ""; + if (!constructedURL && selectedFile) { + const blob = await selectedFile.getFileBlob(); + if (blob) { + const type = fileType === "html" ? "text/html" : ""; + constructedURL = URL.createObjectURL(new Blob([blob], { type })); + } + } - if (fileItem.fileType === "html") { - url = fileItem.url - ? fileItem.url - : fileItem.blob - ? window.URL.createObjectURL( - new Blob([fileItem.blob], { type: "text/html" }), - ) - : ""; - } else { - url = fileItem.url - ? fileItem.url - : fileItem.blob - ? window.URL.createObjectURL(new Blob([fileItem.blob])) - : ""; - } + setURL(constructedURL); + }; + constructURL(); + return () => { + URL.revokeObjectURL(url); + }; + }, [selectedFile]); return ( <Fragment> <div className="iframe-container"> <iframe id="myframe" - key={fileItem?.file?.data.fname} + key={selectedFile?.data.fname} src={url} width="100%" height="100%" - title="Gallery" + title="File Display" /> </div> </Fragment> ); }; -const MemoedIframeDisplay = React.memo(IframeDisplay); - -export default MemoedIframeDisplay; +export default React.memo(IframeDisplay); diff --git a/src/components/Preview/displays/ImageDisplay.tsx b/src/components/Preview/displays/ImageDisplay.tsx index b6e8ccdee..86c77b145 100644 --- a/src/components/Preview/displays/ImageDisplay.tsx +++ b/src/components/Preview/displays/ImageDisplay.tsx @@ -2,43 +2,53 @@ import React, { useEffect, useState } from "react"; import type { IFileBlob } from "../../../api/model"; type AllProps = { - fileItem: IFileBlob; + selectedFile?: IFileBlob; }; -const ImageDisplay: React.FunctionComponent<AllProps> = (props: AllProps) => { - const { fileItem } = props; +const ImageDisplay: React.FunctionComponent<AllProps> = ({ selectedFile }) => { const [url, setUrl] = useState<string>(""); useEffect(() => { - if (fileItem.url) { - setUrl(fileItem.url); - } else if (fileItem.blob) { - // Specify the correct MIME type when creating the Blob - const blob = new Blob([fileItem.blob], { type: "image/png" }); - const objectUrl = URL.createObjectURL(blob); - setUrl(objectUrl); - - // Clean up the object URL when the component unmounts - return () => { - URL.revokeObjectURL(objectUrl); - }; + async function constructUrl() { + // Check if the selectedFile has a direct URL + if (selectedFile?.url) { + setUrl(selectedFile.url); + } else { + // Get the Blob if the file doesn't have a URL + const blob = await selectedFile?.getFileBlob(); + if (blob) { + // Create a Blob URL with the correct MIME type for images + const objectUrl = window.URL.createObjectURL( + new Blob([blob], { type: "image/png" }), + ); + setUrl(objectUrl); + + // Cleanup the object URL to avoid memory leaks + return () => { + URL.revokeObjectURL(objectUrl); + }; + } + } } - }, [fileItem]); + constructUrl(); + }, [selectedFile]); + + // Don't render if the URL isn't ready if (!url) return null; return ( - // biome-ignore lint/a11y/useKeyWithClickEvents: <explanation> <img - id={fileItem.file ? fileItem.file.data.fname : ""} + id={selectedFile?.data.fname || ""} src={url} - alt="" - // Prevent default behavior on click - onClick={(e) => e.preventDefault()} + alt={selectedFile?.data.fname || "image"} + onClick={(e) => e.preventDefault()} // Prevent default behavior on click + onKeyDown={(e) => e.preventDefault()} + style={{ maxWidth: "100%", height: "auto" }} // Responsive styling /> ); }; -const ImageDisplayMemoed = React.memo(ImageDisplay); +const MemoedImageDisplay = React.memo(ImageDisplay); -export default ImageDisplayMemoed; +export default MemoedImageDisplay; diff --git a/src/components/Preview/displays/JsonDisplay.tsx b/src/components/Preview/displays/JsonDisplay.tsx index 37eab7d37..5e577a7cc 100644 --- a/src/components/Preview/displays/JsonDisplay.tsx +++ b/src/components/Preview/displays/JsonDisplay.tsx @@ -5,37 +5,29 @@ import type { IFileBlob } from "../../../api/model"; import { ThemeContext } from "../../DarkTheme/useTheme"; type AllProps = { - fileItem: IFileBlob; + selectedFile?: IFileBlob; }; const JsonDisplay: React.FunctionComponent<AllProps> = (props: AllProps) => { const isDarkTheme = useContext(ThemeContext); const [blobText, setBlobText] = useState({}); - const { fileItem } = props; - const _isMounted = useRef(false); + const { selectedFile } = props; - const getBlobText = React.useCallback(() => { - const { blob } = fileItem; - if (blob) { + useEffect(() => { + async function getBlobText() { + console.log("SelectedFile", selectedFile); const reader = new FileReader(); reader.addEventListener("loadend", (e: any) => { const blobText = e.target.result; - if (_isMounted.current === true) setBlobText(JSON.parse(blobText)); + setBlobText(JSON.parse(blobText)); }); - reader.readAsText(blob); + const blob = await selectedFile?.getFileBlob(); + blob && reader.readAsText(blob); } - }, [fileItem]); - - useEffect(() => { - _isMounted.current = true; - getBlobText(); - - return () => { - _isMounted.current = false; - }; - }, [getBlobText]); - - getBlobText(); + if (selectedFile) { + getBlobText(); + } + }, [selectedFile]); return ( <> diff --git a/src/components/Preview/displays/NiiVueDisplay.tsx b/src/components/Preview/displays/NiiVueDisplay.tsx index 3e2534ea5..45864f957 100644 --- a/src/components/Preview/displays/NiiVueDisplay.tsx +++ b/src/components/Preview/displays/NiiVueDisplay.tsx @@ -1,13 +1,17 @@ import React from "react"; -import { IFileBlob } from "../../../api/model.ts"; -import { NVROptions, NVRVolume, FreeSurferColorLUT } from "niivue-react/src"; +import type { IFileBlob } from "../../../api/model.ts"; +import { + type NVROptions, + type NVRVolume, + FreeSurferColorLUT, +} from "niivue-react/src"; import SizedNiivueCanvas from "../../SizedNiivueCanvas"; import { SLICE_TYPE } from "@niivue/niivue"; import styles from "./NiiVueDisplay.module.css"; import { Collection } from "@fnndsc/chrisapi"; type NiiVueDisplayProps = { - fileItem: IFileBlob; + selectedFile?: IFileBlob; }; type PreviewOptions = Required< @@ -29,7 +33,7 @@ const SLICE_TYPES = { M: SLICE_TYPE.MULTIPLANAR, }; -const NiiVueDisplay: React.FC<NiiVueDisplayProps> = ({ fileItem }) => { +const NiiVueDisplay: React.FC<NiiVueDisplayProps> = ({ selectedFile }) => { const [freesurferLut, setFreesurferLut] = React.useState(false); const [sliceTypeName, setSliceTypeName] = React.useState<keyof typeof SLICE_TYPES>("M"); @@ -46,11 +50,11 @@ const NiiVueDisplay: React.FC<NiiVueDisplayProps> = ({ fileItem }) => { crosshairWidth: sliceTypeName === "M" ? 0.5 : 0, }; - if (fileItem.blob !== undefined && fileItem.file !== undefined) { + if (selectedFile !== undefined) { volumes.push({ // NiiVue gets the file extension from name - name: fileItem.file.data.fname, - url: stupidlyGetFileResourceUrl(fileItem), + name: selectedFile.data.fname, + url: stupidlyGetFileResourceUrl(selectedFile), colormap: "gray", colormapLabel: freesurferLut ? FreeSurferColorLUT : null, }); @@ -70,10 +74,15 @@ const NiiVueDisplay: React.FC<NiiVueDisplayProps> = ({ fileItem }) => { ) : ( <div className={styles.container}> <div className={styles.controlBar}> - <button onClick={() => setFreesurferLut(!freesurferLut)}> + <button + type="button" + onClick={() => setFreesurferLut(!freesurferLut)} + > {freesurferLut ? "FreeSurfer" : "gray"} </button> - <button onClick={rotateSliceType}>{sliceTypeName}</button> + <button type="button" onClick={rotateSliceType}> + {sliceTypeName} + </button> {freesurferLut && <span>{crosshairText}</span>} </div> <SizedNiivueCanvas @@ -98,7 +107,7 @@ const NiiVueDisplay: React.FC<NiiVueDisplayProps> = ({ fileItem }) => { * retrieve the file itself. So the file is retrieved a total of two times, * even though it should only be retrieved once. */ -function stupidlyGetFileResourceUrl({ file }: IFileBlob): string { +function stupidlyGetFileResourceUrl(file: IFileBlob): string { return Collection.getLinkRelationUrls( file?.collection.items[0], "file_resource", diff --git a/src/components/Preview/displays/PdfDisplay.tsx b/src/components/Preview/displays/PdfDisplay.tsx index e2e4615bc..6098ef77f 100644 --- a/src/components/Preview/displays/PdfDisplay.tsx +++ b/src/components/Preview/displays/PdfDisplay.tsx @@ -1,29 +1,49 @@ -import type React from "react"; +import React, { useEffect, useState } from "react"; import type { IFileBlob } from "../../../api/model"; type AllProps = { - fileItem: IFileBlob; + selectedFile?: IFileBlob; }; -const PdfDisplay: React.FC<AllProps> = ({ fileItem }: AllProps) => { - const url = fileItem.url - ? fileItem.url - : fileItem.blob - ? window.URL.createObjectURL( - new Blob([fileItem.blob], { type: "application/pdf" }), - ) - : ""; +const PdfDisplay: React.FC<AllProps> = ({ selectedFile }: AllProps) => { + const [url, setUrl] = useState<string>(""); + + useEffect(() => { + async function constructURL() { + if (selectedFile?.url) { + setUrl(selectedFile.url); + } else { + const blob = await selectedFile?.getFileBlob(); + if (blob) { + const objectUrl = window.URL.createObjectURL( + new Blob([blob], { type: "application/pdf" }), + ); + setUrl(objectUrl); + + // Clean up the URL when the component unmounts + return () => { + window.URL.revokeObjectURL(objectUrl); + }; + } + } + } + + constructURL(); + }, [selectedFile]); + + if (!url) return null; + return ( <div className="iframe-container"> <iframe - key={fileItem.file?.data.fname} + key={selectedFile?.data.fname} src={url} width="100%" height="100%" - title="Gallery" + title="PDF Display" /> </div> ); }; -export default PdfDisplay; +export default React.memo(PdfDisplay); diff --git a/src/components/Preview/displays/TextDisplay.tsx b/src/components/Preview/displays/TextDisplay.tsx index 7dbf53a53..0e98de5c2 100644 --- a/src/components/Preview/displays/TextDisplay.tsx +++ b/src/components/Preview/displays/TextDisplay.tsx @@ -3,65 +3,47 @@ import type { IFileBlob } from "../../../api/model"; import useSize from "../../FeedTree/useSize"; type AllProps = { - fileItem: IFileBlob; + selectedFile?: IFileBlob; }; const TextDisplay: React.FunctionComponent<AllProps> = (props: AllProps) => { const divRef = React.useRef(null); - const { fileItem } = props; + const { selectedFile } = props; useSize(divRef); - React.useEffect(() => { - const textDisplay = document.getElementById("text-display"); - - if (textDisplay) { - const reader = new FileReader(); - - reader.addEventListener( - "load", - () => { - //@ts-ignore - textDisplay.innerText = reader.result; - }, - false, - ); - - if (fileItem.blob) { - reader.readAsText(fileItem.blob); - } - } - }, [fileItem]); - React.useEffect(() => { const textDisplay = document.getElementById("text-display"); if (textDisplay) { const displayContent = async () => { - if (fileItem.blob) { - const reader = new FileReader(); - reader.addEventListener( - "load", - () => { - //@ts-ignore - textDisplay.innerText = reader.result; - }, - false, - ); - reader.readAsText(fileItem.blob); - } else if (fileItem.url) { - try { - const response = await fetch(fileItem.url); - const text = await response.text(); - textDisplay.innerText = text; - } catch (error) { - console.error("Failed to fetch text content from URL:", error); + if (selectedFile) { + if (selectedFile.url) { + try { + const response = await fetch(selectedFile.url); + const text = await response.text(); + textDisplay.innerText = text; + } catch (error) { + console.error("Failed to fetch text content from URL:", error); + } + } else { + const reader = new FileReader(); + reader.addEventListener( + "load", + () => { + //@ts-ignore + textDisplay.innerText = reader.result; + }, + false, + ); + const blob = await selectedFile.getFileBlob(); + reader.readAsText(blob); } } }; displayContent(); } - }, [fileItem]); + }, [selectedFile]); return ( <Fragment> diff --git a/src/components/Preview/displays/VideoDisplay.tsx b/src/components/Preview/displays/VideoDisplay.tsx index 15994332f..ebfea032a 100644 --- a/src/components/Preview/displays/VideoDisplay.tsx +++ b/src/components/Preview/displays/VideoDisplay.tsx @@ -1,28 +1,49 @@ +import React, { useEffect, useState } from "react"; import type { IFileBlob } from "../../../api/model"; type AllProps = { - fileItem: IFileBlob; + selectedFile?: IFileBlob; }; -const VideoDisplay = (props: AllProps) => { - const { fileItem } = props; - const { blob, url, fileType } = fileItem; - const urlToFetch = url - ? url - : blob - ? window.URL.createObjectURL(new Blob([blob], { type: blob.type })) - : ""; +const VideoDisplay: React.FC<AllProps> = ({ selectedFile }: AllProps) => { + const [url, setUrl] = useState<string>(""); + const [sourceType, setSourceType] = useState<string>(""); - const sourceType = url ? `video/${fileType}` : blob ? blob.type : ""; + useEffect(() => { + async function constructURL() { + if (selectedFile?.url) { + setUrl(selectedFile.url); + setSourceType(`video/${selectedFile.data.fname.split(".").pop()}`); + } else { + const blob = await selectedFile?.getFileBlob(); + if (blob) { + const objectUrl = window.URL.createObjectURL( + new Blob([blob], { type: blob.type }), + ); + setUrl(objectUrl); + setSourceType(blob.type); + + // Clean up the object URL when the component unmounts + return () => { + window.URL.revokeObjectURL(objectUrl); + }; + } + } + } + + constructURL(); + }, [selectedFile]); + + if (!url) return null; return ( // biome-ignore lint/a11y/useMediaCaption: <explanation> <video controls width="90%" height="90%"> - <source src={urlToFetch} type={sourceType} /> + <source src={url} type={sourceType} /> {/* Fallback message for browsers that do not support video playback */} Your browser does not support the video tag. </video> ); }; -export default VideoDisplay; +export default React.memo(VideoDisplay); diff --git a/src/components/Preview/displays/ViewerDisplay.tsx b/src/components/Preview/displays/ViewerDisplay.tsx index c169584e8..bda49d83a 100644 --- a/src/components/Preview/displays/ViewerDisplay.tsx +++ b/src/components/Preview/displays/ViewerDisplay.tsx @@ -1,5 +1,4 @@ import type * as React from "react"; -import type { IFileBlob } from "../../../api/model"; import type { ActionState } from "../FileDetailView"; import { CatchallDisplay, @@ -13,6 +12,7 @@ import { VideoDisplay, XtkDisplay, } from "./index"; +import type { FileBrowserFolderFile, PACSFile } from "@fnndsc/chrisapi"; const components = { JsonDisplay, @@ -29,9 +29,9 @@ const components = { interface ViewerDisplayProps { viewerName: string; - fileItem: IFileBlob; preview?: string; actionState: ActionState; + selectedFile: FileBrowserFolderFile | PACSFile; } const ViewerDisplay: React.FC<ViewerDisplayProps> = ( From 24e357211cf9af84eca7b5f2dd8e24e7826486c1 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 13 Sep 2024 11:27:33 -0400 Subject: [PATCH 188/337] feat: Update how previews are fetched --- .../Preview/displays/CatchallDisplay.tsx | 1 - .../Preview/displays/IframeDisplay.tsx | 19 ++++----- .../Preview/displays/ImageDisplay.tsx | 41 +++++++++++-------- .../Preview/displays/JsonDisplay.tsx | 1 - .../Preview/displays/PdfDisplay.tsx | 27 ++++++------ .../Preview/displays/TextDisplay.tsx | 31 +++++--------- .../Preview/displays/VideoDisplay.tsx | 29 ++++++------- 7 files changed, 66 insertions(+), 83 deletions(-) diff --git a/src/components/Preview/displays/CatchallDisplay.tsx b/src/components/Preview/displays/CatchallDisplay.tsx index 7cade1051..204dcaa30 100644 --- a/src/components/Preview/displays/CatchallDisplay.tsx +++ b/src/components/Preview/displays/CatchallDisplay.tsx @@ -12,7 +12,6 @@ const CatchallDisplay: React.FunctionComponent<AllProps> = ( const noPreviewMessage = () => { const { selectedFile } = props; const extension = getFileExtension(selectedFile?.data.fname); - return ( <Alert type="info" diff --git a/src/components/Preview/displays/IframeDisplay.tsx b/src/components/Preview/displays/IframeDisplay.tsx index 776f72543..b85a47201 100644 --- a/src/components/Preview/displays/IframeDisplay.tsx +++ b/src/components/Preview/displays/IframeDisplay.tsx @@ -5,23 +5,22 @@ type IframeDisplayProps = { selectedFile?: IFileBlob; }; -const IframeDisplay: React.FC<IframeDisplayProps> = ({ selectedFile }) => { +const IframeDisplay: React.FC<IframeDisplayProps> = ({ + selectedFile, +}: IframeDisplayProps) => { const [url, setURL] = useState<string>(""); useEffect(() => { const constructURL = async () => { - const fileType = getFileExtension(selectedFile?.data.fname || ""); - let constructedURL = selectedFile?.url || ""; - if (!constructedURL && selectedFile) { - const blob = await selectedFile.getFileBlob(); - if (blob) { - const type = fileType === "html" ? "text/html" : ""; - constructedURL = URL.createObjectURL(new Blob([blob], { type })); - } - } + if (!selectedFile) return; + const fileType = getFileExtension(selectedFile.data.fname); + const blob = await selectedFile.getFileBlob(); + const type = fileType === "html" ? "text/html" : ""; + const constructedURL = URL.createObjectURL(new Blob([blob], { type })); setURL(constructedURL); }; + constructURL(); return () => { URL.revokeObjectURL(url); diff --git a/src/components/Preview/displays/ImageDisplay.tsx b/src/components/Preview/displays/ImageDisplay.tsx index 86c77b145..8ff4a62fb 100644 --- a/src/components/Preview/displays/ImageDisplay.tsx +++ b/src/components/Preview/displays/ImageDisplay.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from "react"; -import type { IFileBlob } from "../../../api/model"; +import { getFileExtension, type IFileBlob } from "../../../api/model"; type AllProps = { selectedFile?: IFileBlob; @@ -10,24 +10,29 @@ const ImageDisplay: React.FunctionComponent<AllProps> = ({ selectedFile }) => { useEffect(() => { async function constructUrl() { - // Check if the selectedFile has a direct URL - if (selectedFile?.url) { - setUrl(selectedFile.url); - } else { - // Get the Blob if the file doesn't have a URL - const blob = await selectedFile?.getFileBlob(); - if (blob) { - // Create a Blob URL with the correct MIME type for images - const objectUrl = window.URL.createObjectURL( - new Blob([blob], { type: "image/png" }), - ); - setUrl(objectUrl); - - // Cleanup the object URL to avoid memory leaks - return () => { - URL.revokeObjectURL(objectUrl); - }; + if (!selectedFile) return; + + // Get the Blob if the file doesn't have a URL + const blob = await selectedFile?.getFileBlob(); + if (blob) { + let type = ""; + + const fileType = getFileExtension(selectedFile.data.fname); + if (fileType === "png") { + type = "image/png"; + } + if (fileType === "jpg") { + type = "image/jpg"; } + // Create a Blob URL with the correct MIME type for images + const objectUrl = window.URL.createObjectURL( + new Blob([blob], { type }), + ); + setUrl(objectUrl); + // Cleanup the object URL to avoid memory leaks + return () => { + URL.revokeObjectURL(objectUrl); + }; } } diff --git a/src/components/Preview/displays/JsonDisplay.tsx b/src/components/Preview/displays/JsonDisplay.tsx index 5e577a7cc..e16fa4552 100644 --- a/src/components/Preview/displays/JsonDisplay.tsx +++ b/src/components/Preview/displays/JsonDisplay.tsx @@ -15,7 +15,6 @@ const JsonDisplay: React.FunctionComponent<AllProps> = (props: AllProps) => { useEffect(() => { async function getBlobText() { - console.log("SelectedFile", selectedFile); const reader = new FileReader(); reader.addEventListener("loadend", (e: any) => { const blobText = e.target.result; diff --git a/src/components/Preview/displays/PdfDisplay.tsx b/src/components/Preview/displays/PdfDisplay.tsx index 6098ef77f..f968848ff 100644 --- a/src/components/Preview/displays/PdfDisplay.tsx +++ b/src/components/Preview/displays/PdfDisplay.tsx @@ -10,21 +10,18 @@ const PdfDisplay: React.FC<AllProps> = ({ selectedFile }: AllProps) => { useEffect(() => { async function constructURL() { - if (selectedFile?.url) { - setUrl(selectedFile.url); - } else { - const blob = await selectedFile?.getFileBlob(); - if (blob) { - const objectUrl = window.URL.createObjectURL( - new Blob([blob], { type: "application/pdf" }), - ); - setUrl(objectUrl); - - // Clean up the URL when the component unmounts - return () => { - window.URL.revokeObjectURL(objectUrl); - }; - } + if (!selectedFile) return; + const blob = await selectedFile?.getFileBlob(); + if (blob) { + const objectUrl = window.URL.createObjectURL( + new Blob([blob], { type: "application/pdf" }), + ); + setUrl(objectUrl); + + // Clean up the URL when the component unmounts + return () => { + window.URL.revokeObjectURL(objectUrl); + }; } } diff --git a/src/components/Preview/displays/TextDisplay.tsx b/src/components/Preview/displays/TextDisplay.tsx index 0e98de5c2..8c498db9d 100644 --- a/src/components/Preview/displays/TextDisplay.tsx +++ b/src/components/Preview/displays/TextDisplay.tsx @@ -17,27 +17,16 @@ const TextDisplay: React.FunctionComponent<AllProps> = (props: AllProps) => { if (textDisplay) { const displayContent = async () => { if (selectedFile) { - if (selectedFile.url) { - try { - const response = await fetch(selectedFile.url); - const text = await response.text(); - textDisplay.innerText = text; - } catch (error) { - console.error("Failed to fetch text content from URL:", error); - } - } else { - const reader = new FileReader(); - reader.addEventListener( - "load", - () => { - //@ts-ignore - textDisplay.innerText = reader.result; - }, - false, - ); - const blob = await selectedFile.getFileBlob(); - reader.readAsText(blob); - } + const reader = new FileReader(); + reader.addEventListener( + "load", + () => { + textDisplay.innerText = reader.result as string; + }, + false, + ); + const blob = await selectedFile.getFileBlob(); + reader.readAsText(blob); } }; diff --git a/src/components/Preview/displays/VideoDisplay.tsx b/src/components/Preview/displays/VideoDisplay.tsx index ebfea032a..3468050ea 100644 --- a/src/components/Preview/displays/VideoDisplay.tsx +++ b/src/components/Preview/displays/VideoDisplay.tsx @@ -11,23 +11,18 @@ const VideoDisplay: React.FC<AllProps> = ({ selectedFile }: AllProps) => { useEffect(() => { async function constructURL() { - if (selectedFile?.url) { - setUrl(selectedFile.url); - setSourceType(`video/${selectedFile.data.fname.split(".").pop()}`); - } else { - const blob = await selectedFile?.getFileBlob(); - if (blob) { - const objectUrl = window.URL.createObjectURL( - new Blob([blob], { type: blob.type }), - ); - setUrl(objectUrl); - setSourceType(blob.type); - - // Clean up the object URL when the component unmounts - return () => { - window.URL.revokeObjectURL(objectUrl); - }; - } + const blob = await selectedFile?.getFileBlob(); + if (blob) { + const objectUrl = window.URL.createObjectURL( + new Blob([blob], { type: blob.type }), + ); + setUrl(objectUrl); + setSourceType(blob.type); + + // Clean up the object URL when the component unmounts + return () => { + window.URL.revokeObjectURL(objectUrl); + }; } } From 997dc6be1c8611140841f222e33d6649819f89e5 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 13 Sep 2024 12:48:55 -0400 Subject: [PATCH 189/337] feat: Implement stack scroll for dicom images --- src/components/CreateFeed/ChrisFileSelect.tsx | 4 +- src/components/CreateFeed/LocalFileUpload.tsx | 4 +- .../FeedOutputBrowser/FileBrowser.tsx | 1 + src/components/FeedTree/DropdownMenu.tsx | 2 +- src/components/FeedTree/FeedGraph.tsx | 2 - src/components/Preview/FileDetailView.tsx | 9 ++- .../Preview/displays/DcmDisplay.tsx | 59 +++++++++++++++++-- .../Preview/displays/ImageDisplay.tsx | 1 - .../Preview/displays/NiiVueDisplay.tsx | 10 ++-- .../Preview/displays/ViewerDisplay.tsx | 2 + .../Preview/displays/dicomUtils/utils.ts | 2 + 11 files changed, 77 insertions(+), 19 deletions(-) diff --git a/src/components/CreateFeed/ChrisFileSelect.tsx b/src/components/CreateFeed/ChrisFileSelect.tsx index b5c12a28a..558aeb1f9 100644 --- a/src/components/CreateFeed/ChrisFileSelect.tsx +++ b/src/components/CreateFeed/ChrisFileSelect.tsx @@ -117,9 +117,9 @@ const ChrisFileSelect: React.FC<ChrisFileSelectProp> = ({ const handleKeyDown = useCallback( (e: any) => { if (e.target.closest("INPUT")) return; - if (chrisFiles.length > 0 && e.code == "ArrowRight") { + if (chrisFiles.length > 0 && e.code === "ArrowRight") { onNext(); - } else if (e.code == "ArrowLeft") { + } else if (e.code === "ArrowLeft") { onBack(); } }, diff --git a/src/components/CreateFeed/LocalFileUpload.tsx b/src/components/CreateFeed/LocalFileUpload.tsx index 12eafa36c..2c19d78a3 100644 --- a/src/components/CreateFeed/LocalFileUpload.tsx +++ b/src/components/CreateFeed/LocalFileUpload.tsx @@ -64,9 +64,9 @@ const FileUploadComponent = ({ }: FileUploadProps) => { const handleKeyDown = useCallback( (e: any) => { - if (e.code == "ArrowLeft") { + if (e.code === "ArrowLeft") { onBack(); - } else if (e.code == "ArrowRight" && localFiles.length > 0) { + } else if (e.code === "ArrowRight" && localFiles.length > 0) { onNext(); } }, diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 0fcb56f7e..b182894ce 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -172,6 +172,7 @@ const FileBrowser = (props: FileBrowserProps) => { selectedFile={selectedFile} preview="large" isPublic={feed?.data.public} + list={pluginFilesPayload.filesMap} /> )} {drawerState.preview.currentlyActive === "xtk" && <XtkViewer />} diff --git a/src/components/FeedTree/DropdownMenu.tsx b/src/components/FeedTree/DropdownMenu.tsx index 733eaac2f..598eca003 100644 --- a/src/components/FeedTree/DropdownMenu.tsx +++ b/src/components/FeedTree/DropdownMenu.tsx @@ -12,13 +12,13 @@ const DropdownMenu = ({ children: React.ReactElement; handleZip: () => void; }) => { + const dispatch = useDispatch(); const { selectedPlugin } = useTypedSelector((state) => { return state.instance; }); const cancelled = selectedPlugin?.data.status === "cancelled" || selectedPlugin?.data.status === "finishedWithError"; - const dispatch = useDispatch(); const items: MenuProps["items"] = [ { key: "1", diff --git a/src/components/FeedTree/FeedGraph.tsx b/src/components/FeedTree/FeedGraph.tsx index 18efee88d..99ec1b727 100644 --- a/src/components/FeedTree/FeedGraph.tsx +++ b/src/components/FeedTree/FeedGraph.tsx @@ -116,9 +116,7 @@ const FeedGraph = (props: IFeedProps) => { </div> <> <ForceGraph2D - //@ts-ignore height={size.height || 500} - //@ts-ignore width={size.width || 500} ref={fgRef} graphData={graphData} diff --git a/src/components/Preview/FileDetailView.tsx b/src/components/Preview/FileDetailView.tsx index 4eb153a82..d4672f46d 100644 --- a/src/components/Preview/FileDetailView.tsx +++ b/src/components/Preview/FileDetailView.tsx @@ -18,7 +18,11 @@ import React, { type ReactElement, } from "react"; import { ErrorBoundary } from "react-error-boundary"; -import { fileViewerMap, getFileExtension } from "../../api/model"; +import { + type IFileBlob, + fileViewerMap, + getFileExtension, +} from "../../api/model"; import { useTypedSelector } from "../../store/hooks"; import { SpinContainer } from "../Common"; import { @@ -43,6 +47,7 @@ interface AllProps { handlePrevious?: () => void; gallery?: boolean; isPublic?: boolean; + list?: IFileBlob[]; } export interface ActionState { @@ -199,6 +204,8 @@ const FileDetailView = (props: AllProps) => { viewerName={viewerName} actionState={actionState} selectedFile={selectedFile} + // Optional for dicom scrolling + list={props.list} /> )} </div> diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index bd971660a..4432900d0 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -27,15 +27,15 @@ export type DcmImageProps = { selectedFile?: IFileBlob; actionState: ActionState; preview: string; + list?: IFileBlob[]; }; const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { - console.log("Props", props); - const { selectedFile, actionState, preview } = props; - + const { selectedFile, actionState, preview, list } = props; const [activeViewport, setActiveViewport] = useState< IStackViewport | undefined >(); + const [imageStack, setImageStack] = useState<string[]>([]); const [renderingEngine, setRenderingEngine] = useState<RenderingEngine>(); const dicomImageRef = useRef<HTMLDivElement>(null); const uniqueId = `${selectedFile?.data.id || v4()}`; @@ -45,9 +45,7 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { const handleResize = () => { // Update the element with elementId when the size of dicomImageRef changes if (dicomImageRef.current && size) { - //@ts-ignore const parentWidth = size.width; - //@ts-ignore const parentHeight = size.height; const element = document.getElementById(elementId); if (element) { @@ -87,6 +85,9 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { const blob = await selectedFile.getFileBlob(); imageID = await loadDicomImage(blob); } else { + // Code to view png and jpg file types in cornerstone. Currently we are using the default image display so this code is redundant. + + // This code should be deleted in the future. const fileviewer = new FileViewerModel(); const fileName = fileviewer.getFileName( selectedFile as FileBrowserFolderFile, @@ -97,6 +98,7 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { await displayDicomImage(element, imageID, uniqueId); setActiveViewport(viewport); setRenderingEngine(newRenderingEngine); + setImageStack([imageID]); return selectedFile.data.fname; } } @@ -105,6 +107,7 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { queryKey: ["cornerstone-preview", selectedFile], queryFn: () => setupCornerstone(), refetchOnMount: true, + enabled: !!selectedFile, }); useEffect(() => { @@ -117,6 +120,52 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { handleResize(); }, [size]); + const loadMoreImages = async (signal: AbortSignal) => { + const newImageStack = []; + if (list) { + for (const file of list) { + if (signal.aborted) return; + const extension = getFileExtension(file.data.fname); + let imageId: string; + if (extension === "dcm") { + const blob = await file.getFileBlob(); + imageId = await loadDicomImage(blob); // Load and generate the image ID + } else { + const fileviewer = new FileViewerModel(); + const fileName = fileviewer.getFileName( + file as FileBrowserFolderFile, + ); + imageId = `web:${file.url}${fileName}`; + } + newImageStack.push(imageId); // Add the new image ID to the stack + } + setImageStack(newImageStack); + + if (activeViewport) { + await activeViewport.setStack(newImageStack); + activeViewport.render(); + } + } + }; + + useEffect(() => { + const controller = new AbortController(); + const signal = controller.signal; + if (list) { + if ( + imageStack.length > 0 && + imageStack.length !== list.length && + activeViewport + ) { + loadMoreImages(signal); + } + } + + return () => { + controller.abort(); // Abort loading images on unmount + }; + }, [list, activeViewport]); + return ( <> {isLoading && <SpinContainer title="Displaying image..." />} diff --git a/src/components/Preview/displays/ImageDisplay.tsx b/src/components/Preview/displays/ImageDisplay.tsx index 8ff4a62fb..833d409a1 100644 --- a/src/components/Preview/displays/ImageDisplay.tsx +++ b/src/components/Preview/displays/ImageDisplay.tsx @@ -16,7 +16,6 @@ const ImageDisplay: React.FunctionComponent<AllProps> = ({ selectedFile }) => { const blob = await selectedFile?.getFileBlob(); if (blob) { let type = ""; - const fileType = getFileExtension(selectedFile.data.fname); if (fileType === "png") { type = "image/png"; diff --git a/src/components/Preview/displays/NiiVueDisplay.tsx b/src/components/Preview/displays/NiiVueDisplay.tsx index 45864f957..d1a58e797 100644 --- a/src/components/Preview/displays/NiiVueDisplay.tsx +++ b/src/components/Preview/displays/NiiVueDisplay.tsx @@ -1,14 +1,14 @@ -import React from "react"; -import type { IFileBlob } from "../../../api/model.ts"; +import { Collection } from "@fnndsc/chrisapi"; +import { SLICE_TYPE } from "@niivue/niivue"; import { + FreeSurferColorLUT, type NVROptions, type NVRVolume, - FreeSurferColorLUT, } from "niivue-react/src"; +import React from "react"; +import type { IFileBlob } from "../../../api/model.ts"; import SizedNiivueCanvas from "../../SizedNiivueCanvas"; -import { SLICE_TYPE } from "@niivue/niivue"; import styles from "./NiiVueDisplay.module.css"; -import { Collection } from "@fnndsc/chrisapi"; type NiiVueDisplayProps = { selectedFile?: IFileBlob; diff --git a/src/components/Preview/displays/ViewerDisplay.tsx b/src/components/Preview/displays/ViewerDisplay.tsx index bda49d83a..49cebb2c8 100644 --- a/src/components/Preview/displays/ViewerDisplay.tsx +++ b/src/components/Preview/displays/ViewerDisplay.tsx @@ -13,6 +13,7 @@ import { XtkDisplay, } from "./index"; import type { FileBrowserFolderFile, PACSFile } from "@fnndsc/chrisapi"; +import type { IFileBlob } from "../../../api/model"; const components = { JsonDisplay, @@ -32,6 +33,7 @@ interface ViewerDisplayProps { preview?: string; actionState: ActionState; selectedFile: FileBrowserFolderFile | PACSFile; + list?: IFileBlob[]; } const ViewerDisplay: React.FC<ViewerDisplayProps> = ( diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index e0d1be416..7acac18a9 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -280,6 +280,8 @@ export const displayDicomImage = async ( await viewport.setStack(imageIds); cornerstoneTools.utilities.stackPrefetch.enable(viewport.element); viewport.render(); + // Set the stack scroll mouse wheel tool + toolGroup?.setToolActive(StackScrollMouseWheelTool.toolName); return { viewport, From d0d7dd2d6f340eba23300b391c42252aa2249e7e Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 13 Sep 2024 14:27:55 -0400 Subject: [PATCH 190/337] feat: Add dicom scrolling to the library table --- src/components/NewLibrary/components/LibraryTable.tsx | 6 +++++- src/components/NewLibrary/components/Operations.tsx | 1 - src/components/Preview/displays/DcmDisplay.tsx | 8 +++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index cc8be8b07..2dcb8d5b9 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -306,7 +306,11 @@ const LibraryTable: React.FC<TableProps> = ({ placement="right" > {selectedFile && ( - <FileDetailView selectedFile={selectedFile} preview="large" /> + <FileDetailView + selectedFile={selectedFile} + preview="large" + list={data.files} + /> )} </Drawer> <Table diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index ba8de6d0e..953202e99 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -80,7 +80,6 @@ const Operations = ({ ); if (isFeedsTable) { - console.log("Disabling"); OPERATION_ITEMS[0].disabled = true; } diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 4432900d0..c209e5068 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -99,6 +99,7 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { setActiveViewport(viewport); setRenderingEngine(newRenderingEngine); setImageStack([imageID]); + return selectedFile.data.fname; } } @@ -131,11 +132,7 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { const blob = await file.getFileBlob(); imageId = await loadDicomImage(blob); // Load and generate the image ID } else { - const fileviewer = new FileViewerModel(); - const fileName = fileviewer.getFileName( - file as FileBrowserFolderFile, - ); - imageId = `web:${file.url}${fileName}`; + continue; } newImageStack.push(imageId); // Add the new image ID to the stack } @@ -169,6 +166,7 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { return ( <> {isLoading && <SpinContainer title="Displaying image..." />} + <div id="content" ref={dicomImageRef} From f9754d46114950260bd5b72b8d27d0074d27c844 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 13 Sep 2024 14:41:26 -0400 Subject: [PATCH 191/337] refactor: General cleanup --- src/components/NewLibrary/components/LibraryTable.tsx | 2 +- src/components/Preview/displays/dicomUtils/utils.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 2dcb8d5b9..0a255437f 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -322,7 +322,7 @@ const LibraryTable: React.FC<TableProps> = ({ <Caption>Data Library</Caption> <Thead> <Tr> - <Th arial-label="Select a row" /> + <Th screenReaderText="Select a row" arial-label="Select a row" /> <Th sort={{ sortBy, onSort, columnIndex: 1 }} name="name"> {columnNames.name} </Th> diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index 7acac18a9..2ae6cb61c 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -280,6 +280,10 @@ export const displayDicomImage = async ( await viewport.setStack(imageIds); cornerstoneTools.utilities.stackPrefetch.enable(viewport.element); viewport.render(); + + viewport.element.addEventListener("cornerstoneimagerendered", () => { + const currentIndex = viewport.getCurrentImageIdIndex(); + }); // Set the stack scroll mouse wheel tool toolGroup?.setToolActive(StackScrollMouseWheelTool.toolName); From 5dc1248f73d41962a8beb3ac65e93a23fb974a7f Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Sun, 15 Sep 2024 21:20:32 -0400 Subject: [PATCH 192/337] Add LonkClient --- package-lock.json | 27 ++++++- package.json | 3 +- src/api/fp/chrisapi.ts | 84 ++++++++++----------- src/api/fp/fpFileBrowserFile.ts | 65 ---------------- src/api/fp/helpers.test.ts | 41 ++++++++++ src/api/lonk/client.test.ts | 106 ++++++++++++++++++++++++++ src/api/lonk/client.ts | 129 ++++++++++++++++++++++++++++++++ src/api/lonk/de.ts | 53 +++++++++++++ src/api/lonk/index.ts | 11 +++ src/api/lonk/seriesMap.test.ts | 11 +++ src/api/lonk/seriesMap.ts | 34 +++++++++ src/api/lonk/types.ts | 92 +++++++++++++++++++++++ 12 files changed, 544 insertions(+), 112 deletions(-) delete mode 100644 src/api/fp/fpFileBrowserFile.ts create mode 100644 src/api/fp/helpers.test.ts create mode 100644 src/api/lonk/client.test.ts create mode 100644 src/api/lonk/client.ts create mode 100644 src/api/lonk/de.ts create mode 100644 src/api/lonk/index.ts create mode 100644 src/api/lonk/seriesMap.test.ts create mode 100644 src/api/lonk/seriesMap.ts create mode 100644 src/api/lonk/types.ts diff --git a/package-lock.json b/package-lock.json index a080cbab4..5db811a7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,7 +94,8 @@ "rollup-plugin-node-builtins": "^2.1.2", "vite": "^5.3.2", "vite-plugin-istanbul": "^6.0.2", - "vitest": "^2.0.5" + "vitest": "^2.0.5", + "vitest-websocket-mock": "^0.4.0" } }, "node_modules/@ampproject/remapping": { @@ -6469,6 +6470,16 @@ "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", "license": "MIT" }, + "node_modules/mock-socket": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.3.1.tgz", + "integrity": "sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -9875,6 +9886,20 @@ } } }, + "node_modules/vitest-websocket-mock": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/vitest-websocket-mock/-/vitest-websocket-mock-0.4.0.tgz", + "integrity": "sha512-tGnOwE2nC8jfioQXDrX+lZ8EVrF+IO2NVqe1vV9h945W/hlR0S6ZYbMqCJGG3Nyd//c5XSe1IGLD2ZgE2D1I7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "^2.0.3", + "mock-socket": "^9.2.1" + }, + "peerDependencies": { + "vitest": ">=2" + } + }, "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", diff --git a/package.json b/package.json index 7cf98cf7e..87c6be441 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,8 @@ "rollup-plugin-node-builtins": "^2.1.2", "vite": "^5.3.2", "vite-plugin-istanbul": "^6.0.2", - "vitest": "^2.0.5" + "vitest": "^2.0.5", + "vitest-websocket-mock": "^0.4.0" }, "type": "module" } diff --git a/src/api/fp/chrisapi.ts b/src/api/fp/chrisapi.ts index df3ad7fa0..21c7fc1df 100644 --- a/src/api/fp/chrisapi.ts +++ b/src/api/fp/chrisapi.ts @@ -1,17 +1,15 @@ import Client, { AllPluginInstanceList, + DownloadToken, Feed, FeedPluginInstanceList, - FileBrowserPath, - FileBrowserPathFileList, PluginInstance, PublicFeedList, } from "@fnndsc/chrisapi"; import * as TE from "fp-ts/TaskEither"; import * as E from "fp-ts/Either"; -import * as Console from "fp-ts/Console"; import { pipe } from "fp-ts/function"; -import FpFileBrowserFile from "./fpFileBrowserFile"; +import LonkClient, { LonkHandlers } from "../lonk"; /** * fp-ts friendly wrapper for @fnndsc/chrisapi @@ -27,7 +25,7 @@ class FpClient { ...params: Parameters<Client["getPluginInstance"]> ): TE.TaskEither<Error, PluginInstance> { return TE.tryCatch( - () => this.client.getPluginInstance(...params), + () => this.client.getPluginInstance(...params).then(notNull), E.toError, ); } @@ -48,6 +46,7 @@ class FpClient { }, }; if (this.client.auth.token) { + // @ts-ignore options.headers.Authorization = `Token ${this.client.auth.token}`; } return pipe( @@ -115,55 +114,50 @@ class FpClient { return TE.tryCatch(() => feed.getPluginInstances(...params), E.toError); } + public createDownloadToken( + ...params: Parameters<Client["createDownloadToken"]> + ): TE.TaskEither<Error, DownloadToken> { + return TE.tryCatch( + () => this.client.createDownloadToken(...params).then(notNull), + E.toError, + ); + } + /** - * A wrapper which calles `getFileBrowserPath` then `getFiles`, - * and processes the returned objects to have a more sane type. - * - * Pretty much gives you back what CUBE would return from - * `api/v1/filebrowser-files/.../` with HTTP header `Accept: application/json` + * Create a WebSockets connection to the LONK-WS endpoint. * - * Pagination is not implemented, hence the name "get **few** files under"... + * https://chrisproject.org/docs/oxidicom/lonk-ws */ - public getFewFilesUnder( - ...args: Parameters<Client["getFileBrowserPath"]> - ): TE.TaskEither<Error, ReadonlyArray<FpFileBrowserFile>> { + public connectPacsNotifications({ + onDone, + onProgress, + onError, + timeout, + }: LonkHandlers & { timeout?: number }): TE.TaskEither<Error, LonkClient> { return pipe( - this.getFileBrowserPath(...args), - TE.flatMap((fb) => FpClient.filebrowserGetFiles(fb, { limit: 100 })), - TE.tapIO((list) => { - if (list.hasNextPage) { - return Console.warn( - `Not all elements from ${list.url} were fetched, ` + - "and pagination not implemented.", - ); - } - return () => undefined; + this.createDownloadToken(timeout), + TE.map((downloadToken) => { + const url = getWebsocketUrl(downloadToken); + const ws = new WebSocket(url); + return new LonkClient({ ws, onDone, onProgress, onError }); }), - TE.map(saneReturnOfFileBrowserPathFileList), - ); - } - - public getFileBrowserPath( - ...args: Parameters<Client["getFileBrowserPath"]> - ): TE.TaskEither<Error, FileBrowserPath> { - return TE.tryCatch( - () => this.client.getFileBrowserPath(...args), - E.toError, ); } +} - public static filebrowserGetFiles( - fbp: FileBrowserPath, - ...params: Parameters<FileBrowserPath["getFiles"]> - ): TE.TaskEither<Error, FileBrowserPathFileList> { - return TE.tryCatch(() => fbp.getFiles(...params), E.toError); - } +function getWebsocketUrl(downloadTokenResponse: DownloadToken): string { + const token = downloadTokenResponse.data.token; + return downloadTokenResponse.url + .replace(/^http(s?):\/\//, (_match, s) => `ws${s}://`) + .replace(/v1\/downloadtokens\/\d+\//, `v1/pacs/progress/?token=${token}`); } -function saneReturnOfFileBrowserPathFileList( - fbpfl: FileBrowserPathFileList, -): ReadonlyArray<FpFileBrowserFile> { - return fbpfl.getItems()!.map((file) => new FpFileBrowserFile(file)); +function notNull<T>(x: T | null): T { + if (x === null) { + throw Error(); + } + return x; } -export { FpClient, saneReturnOfFileBrowserPathFileList, FpFileBrowserFile }; +export default FpClient; +export { FpClient, getWebsocketUrl }; diff --git a/src/api/fp/fpFileBrowserFile.ts b/src/api/fp/fpFileBrowserFile.ts deleted file mode 100644 index 856517bcd..000000000 --- a/src/api/fp/fpFileBrowserFile.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Collection, FileBrowserPathFile } from "@fnndsc/chrisapi"; -import * as TE from "fp-ts/TaskEither"; -import * as E from "fp-ts/Either"; -import { pipe } from "fp-ts/function"; - -/** - * A type-safe wrapper for `FileBrowserPathFile` which also handles - * the annoyances of Collection+JSON. - */ -class FpFileBrowserFile { - private readonly file: FileBrowserPathFile; - - constructor(file: FileBrowserPathFile) { - this.file = file; - } - - get creation_date(): string { - return this.file.data.creation_date; - } - - get fname(): string { - return this.file.data.fname; - } - - get fsize(): number { - return this.file.data.fsize; - } - - get file_resource() { - return Collection.getLinkRelationUrls( - this.file.collection.items[0], - "file_resource", - )[0]; - } - - get url() { - return Collection.getLinkRelationUrls( - this.file.collection.items[0], - "url", - )[0]; - } - - getFileBlob( - ...args: Parameters<FileBrowserPathFile["getFileBlob"]> - ): TE.TaskEither<Error, Blob> { - return TE.tryCatch(() => this.file.getFileBlob(...args), E.toError); - } - - /** - * Get the data of this file, assuming it is UTF-8 plaintext. - */ - getAsText( - ...args: Parameters<FileBrowserPathFile["getFileBlob"]> - ): TE.TaskEither<Error, string> { - return pipe( - this.getFileBlob(...args), - TE.flatMap((blob) => { - const task = () => blob.text(); - return TE.rightTask(task); - }), - ); - } -} - -export default FpFileBrowserFile; diff --git a/src/api/fp/helpers.test.ts b/src/api/fp/helpers.test.ts new file mode 100644 index 000000000..c3f662c0a --- /dev/null +++ b/src/api/fp/helpers.test.ts @@ -0,0 +1,41 @@ +import { test, expect } from "vitest"; +import { getWebsocketUrl } from "./chrisapi.ts"; + +test.each([ + [ + { + url: "http://example.com/api/v1/downloadtokens/9/", + auth: { + token: "fakeauthtoken", + }, + contentType: "application/vnd.collection+json", + data: { + id: 9, + creation_date: "2024-08-27T17:17:28.580683-04:00", + token: "nota.real.jwttoken", + owner_username: "chris", + }, + }, + "ws://example.com/api/v1/pacs/progress/?token=nota.real.jwttoken", + ], + [ + { + url: "https://example.com/api/v1/downloadtokens/9/", + auth: { + token: "fakeauthtoken", + }, + contentType: "application/vnd.collection+json", + data: { + id: 9, + creation_date: "2024-08-27T17:17:28.580683-04:00", + token: "stillnota.real.jwttoken", + owner_username: "chris", + }, + }, + "wss://example.com/api/v1/pacs/progress/?token=stillnota.real.jwttoken", + ], +])("getWebsocketUrl(%o, %s) -> %s", (downloadTokenResponse, expected) => { + // @ts-ignore + let actual = getWebsocketUrl(downloadTokenResponse); + expect(actual).toBe(expected); +}); diff --git a/src/api/lonk/client.test.ts b/src/api/lonk/client.test.ts new file mode 100644 index 000000000..ec6d828b2 --- /dev/null +++ b/src/api/lonk/client.test.ts @@ -0,0 +1,106 @@ +import { test, expect, vi } from "vitest"; +import LonkClient, { LonkHandlers } from "./client.ts"; +import WS from "vitest-websocket-mock"; + +test("LonkClient", async () => { + const handlers: LonkHandlers = { + onDone: vi.fn(), + onProgress: vi.fn(), + onError: vi.fn(), + }; + const [server, client] = await createMockubeWs(handlers); + const SeriesInstanceUID = "1.234.56789"; + const pacs_name = "MyPACS"; + + const subscriptionReceiveAndRespond = async () => { + await expect(server).toReceiveMessage({ + pacs_name, + SeriesInstanceUID, + action: "subscribe", + }); + server.send({ + pacs_name, + SeriesInstanceUID, + message: { subscribed: true }, + }); + }; + + await Promise.all([ + subscriptionReceiveAndRespond(), + client.subscribe(pacs_name, SeriesInstanceUID), + ]); + + server.send({ + pacs_name, + SeriesInstanceUID, + message: { + ndicom: 48, + }, + }); + expect(handlers.onProgress).toHaveBeenCalledOnce(); + expect(handlers.onProgress).toHaveBeenLastCalledWith( + pacs_name, + SeriesInstanceUID, + 48, + ); + + server.send({ + pacs_name, + SeriesInstanceUID, + message: { + ndicom: 88, + }, + }); + expect(handlers.onProgress).toHaveBeenCalledTimes(2); + expect(handlers.onProgress).toHaveBeenLastCalledWith( + pacs_name, + SeriesInstanceUID, + 88, + ); + + server.send({ + pacs_name, + SeriesInstanceUID, + message: { + error: "stuck in chimney", + }, + }); + expect(handlers.onError).toHaveBeenCalledOnce(); + expect(handlers.onError).toHaveBeenLastCalledWith( + pacs_name, + SeriesInstanceUID, + "stuck in chimney", + ); + + server.send({ + pacs_name, + SeriesInstanceUID, + message: { + done: true, + }, + }); + expect(handlers.onDone).toHaveBeenCalledOnce(); + expect(handlers.onDone).toHaveBeenLastCalledWith( + pacs_name, + SeriesInstanceUID, + ); +}); + +/** + * Create a mock WebSockets server and client. + */ +async function createMockubeWs( + handlers: LonkHandlers, +): Promise<[WS, LonkClient]> { + const url = "ws://localhost:32585"; + const server = new WS(url, { jsonProtocol: true }); + const ws = new WebSocket(url); + const client = new LonkClient({ ws, ...handlers }); + + let callback: null | (([server, client]: [WS, LonkClient]) => void) = null; + const promise: Promise<[WS, LonkClient]> = new Promise((resolve) => { + callback = resolve; + }); + ws.onopen = () => callback && callback([server, client]); + return promise; +} diff --git a/src/api/lonk/client.ts b/src/api/lonk/client.ts new file mode 100644 index 000000000..1c5a4f0ba --- /dev/null +++ b/src/api/lonk/client.ts @@ -0,0 +1,129 @@ +import { + Lonk, + LonkDone, + LonkError, + LonkHandlers, + LonkProgress, + LonkSubscription, + SeriesKey, +} from "./types.ts"; +import deserialize from "./de.ts"; +import { pipe } from "fp-ts/function"; +import * as E from "fp-ts/Either"; +import * as T from "fp-ts/Task"; +import SeriesMap from "./seriesMap.ts"; + +/** + * `LonkClient` wraps a {@link WebSocket}, routing incoming JSON messages + * to corresponding functions of {@link LonkHandlers}. + */ +class LonkClient { + private readonly ws: WebSocket; + private readonly pendingSubscriptions: SeriesMap<null | (() => SeriesKey)>; + + public constructor({ + ws, + onDone, + onProgress, + onError, + }: LonkHandlers & { ws: WebSocket }) { + this.pendingSubscriptions = new SeriesMap(); + this.ws = ws; + this.ws.onmessage = (msg) => { + pipe( + msg.data, + deserialize, + E.map((data) => + this.routeMessage({ data, onDone, onProgress, onError }), + ), + ); + }; + } + + /** + * Subscribe to notifications for a series. + */ + public subscribe( + pacs_name: string, + SeriesInstanceUID: string, + ): Promise<SeriesKey> { + let callback = null; + const callbackTask: Promise<SeriesKey> = new Promise((resolve) => { + callback = () => resolve({ SeriesInstanceUID, pacs_name }); + }); + this.pendingSubscriptions.set(pacs_name, SeriesInstanceUID, callback); + const data = { + SeriesInstanceUID, + pacs_name, + action: "subscribe", + }; + this.ws.send(JSON.stringify(data)); + return callbackTask; + } + + private routeMessage({ + data, + onDone, + onProgress, + onError, + }: LonkHandlers & { data: Lonk<any> }) { + const { SeriesInstanceUID, pacs_name, message } = data; + // note: for performance reasons, this if-else chain is in + // descending order of case frequency. + if (isProgress(message)) { + onProgress(pacs_name, SeriesInstanceUID, message.ndicom); + } else if (isDone(message)) { + onDone(pacs_name, SeriesInstanceUID); + } else if (isSubscribed(message)) { + this.handleSubscriptionSuccess(pacs_name, SeriesInstanceUID); + } else if (isError(message)) { + onError(pacs_name, SeriesInstanceUID, message.error); + } else { + console.warn(`Unrecognized message: ${JSON.stringify(message)}`); + } + } + + private handleSubscriptionSuccess( + pacs_name: string, + SeriesInstanceUID: string, + ) { + const callback = this.pendingSubscriptions.pop( + pacs_name, + SeriesInstanceUID, + ); + if (callback === null) { + console.warn( + "Got subscription confirmation, but never requested subscription", + { pacs_name, SeriesInstanceUID }, + ); + } else { + callback(); + } + } + + /** + * Close the websocket. + */ + public close() { + this.ws.close(); + } +} + +function isSubscribed(msg: { [key: string]: any }): msg is LonkSubscription { + return "subscribed" in msg && msg.subscribed === true; +} + +function isDone(msg: { [key: string]: any }): msg is LonkDone { + return "done" in msg && msg.done === true; +} + +function isProgress(msg: { [key: string]: any }): msg is LonkProgress { + return "ndicom" in msg && Number.isInteger(msg.ndicom); +} + +function isError(msg: { [key: string]: any }): msg is LonkError { + return "error" in msg; +} + +export default LonkClient; +export type { LonkHandlers }; diff --git a/src/api/lonk/de.ts b/src/api/lonk/de.ts new file mode 100644 index 000000000..eeecb8427 --- /dev/null +++ b/src/api/lonk/de.ts @@ -0,0 +1,53 @@ +/** + * LONK data deserialization using fp-ts. + */ + +import * as E from "fp-ts/Either"; +import { Lonk } from "./types.ts"; +import { pipe } from "fp-ts/function"; +import * as J from "fp-ts/Json"; + +function deserialize(data: any): E.Either<string, Lonk<any>> { + return pipe( + data, + J.parse, + E.mapLeft(() => "Could not parse message as JSON"), + E.flatMap(validateRecord), + E.flatMap(validateLonk), + ); +} + +function validateLonk(obj: J.JsonRecord): E.Either<string, Lonk<any>> { + if (typeof obj.pacs_name !== "string") { + return E.left(`Missing or invalid 'pacs_name' in ${JSON.stringify(obj)}`); + } + if (typeof obj.SeriesInstanceUID !== "string") { + return E.left( + `Missing or invalid 'SeriesInstanceUID' in ${JSON.stringify(obj)}`, + ); + } + if (typeof obj.message !== "object" || jIsArray(obj)) { + return E.left(`Missing or invalid 'message' in ${JSON.stringify(obj)}`); + } + // @ts-ignore proper JSON deserialization is too tedious in TypeScript + return E.right(obj); +} + +function validateRecord(obj: J.Json): E.Either<string, J.JsonRecord> { + if (obj === null) { + return E.left("obj is null"); + } + if (typeof obj !== "object") { + return E.left("not an object"); + } + if (jIsArray(obj)) { + return E.left("is an array, expected a JsonRecord"); + } + return E.right(obj); +} + +function jIsArray(obj: J.JsonArray | any): obj is J.JsonArray { + return Array.isArray(obj); +} + +export default deserialize; diff --git a/src/api/lonk/index.ts b/src/api/lonk/index.ts new file mode 100644 index 000000000..cb3914749 --- /dev/null +++ b/src/api/lonk/index.ts @@ -0,0 +1,11 @@ +/** + * "Light Oxidicom NotifiKations" over WebSockets (LONK-WS) client. + * + * https://chrisproject.org/docs/oxidicom/lonk-ws + */ + +import LonkClient from "./client.ts"; +import { LonkHandlers } from "./types.ts"; + +export default LonkClient; +export type { LonkHandlers }; diff --git a/src/api/lonk/seriesMap.test.ts b/src/api/lonk/seriesMap.test.ts new file mode 100644 index 000000000..5e276bca4 --- /dev/null +++ b/src/api/lonk/seriesMap.test.ts @@ -0,0 +1,11 @@ +import { test, expect } from "vitest"; +import SeriesMap from "./seriesMap.ts"; + +test("SeriesMap", () => { + const map = new SeriesMap(); + expect(map.pop("MyPACS", "12345")).toBeNull(); + const data = {}; + map.set("MyPACS", "12345", data); + expect(map.pop("MyPACS", "12345")).toBe(data); + expect(map.pop("MyPACS", "12345")).toBeNull(); +}); diff --git a/src/api/lonk/seriesMap.ts b/src/api/lonk/seriesMap.ts new file mode 100644 index 000000000..cfc3ed7d8 --- /dev/null +++ b/src/api/lonk/seriesMap.ts @@ -0,0 +1,34 @@ +/** + * A wrapper around {@link Map} where the key is (pacs_name, SeriesInstanceUID). + */ +class SeriesMap<T> { + private readonly map: Map<string, T>; + + public constructor() { + this.map = new Map(); + } + + /** + * Set a value for a DICOM series. + */ + public set(pacs_name: string, SeriesInstanceUID: string, value: T) { + const key = this.keyOf(SeriesInstanceUID, pacs_name); + this.map.set(key, value); + } + + /** + * Get and remove a value for a DICOM series. + */ + public pop(pacs_name: string, SeriesInstanceUID: string): T | null { + const key = this.keyOf(SeriesInstanceUID, pacs_name); + const value = this.map.get(key); + this.map.delete(key); + return value || null; + } + + private keyOf(pacs_name: string, SeriesInstanceUID: string): string { + return JSON.stringify({ SeriesInstanceUID, pacs_name }); + } +} + +export default SeriesMap; diff --git a/src/api/lonk/types.ts b/src/api/lonk/types.ts new file mode 100644 index 000000000..5aaeb666e --- /dev/null +++ b/src/api/lonk/types.ts @@ -0,0 +1,92 @@ +/** + * LONK-WS JSON types. + * + * Documentation: https://chrisproject.org/docs/oxidicom/lonk-ws#messages + * + * Reference implementation: + * https://github.com/FNNDSC/ChRIS_ultron_backEnd/blob/cf95993886c22530190c23807b57d525f9d51f99/chris_backend/pacsfiles/lonk.py#L45-L102 + */ + +/** + * The metadata which uniquely identifies a DICOM series. + */ +type SeriesKey = { + SeriesInstanceUID: string; + pacs_name: string; +}; + +/** + * LONK "progress" message. + */ +type LonkProgress = { + /** + * Number of DICOM files stored by *oxidicom* so far. + */ + ndicom: number; +}; + +/** + * LONK "error" message. + */ +type LonkError = { + /** + * Error message originating from *oxidicom*. + */ + error: string; +}; + +/** + * LONK "done" message. + */ +type LonkDone = { + done: true; +}; + +/** + * LONK-WS "subscription" message. + */ +type LonkSubscription = { + subscribed: true; +}; + +/** + * Oxidicom notification message data. + */ +type LonkMessageData = LonkDone | LonkProgress | LonkError | LonkSubscription; + +/** + * Notification from oxidicom about a DICOM series. + */ +type Lonk<T extends { [key: string]: any }> = { + SeriesInstanceUID: string; + pacs_name: string; + message: T; +}; + +/** + * Handler functions for the various types of LONK protocol messages. + */ +type LonkHandlers = { + onDone: (pacs_name: string, SeriesInstanceUID: string) => void; + onProgress: ( + pacs_name: string, + SeriesInstanceUID: string, + ndicom: number, + ) => void; + onError: ( + pacs_name: string, + SeriesInstanceUID: string, + error: string, + ) => void; +}; + +export type { + LonkDone, + LonkProgress, + LonkError, + LonkSubscription, + LonkMessageData, + Lonk, + LonkHandlers, + SeriesKey, +}; From 288aea3a61d85d4bbfb58a67980a06300cef9656 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Mon, 16 Sep 2024 04:48:13 -0400 Subject: [PATCH 193/337] Add new fp-ts PfdcmClient --- .env | 5 +- README.md | 11 + biome.json | 2 +- src/api/pfdcm/client.ts | 246 ++++++++++ .../pfdcm/generated/.openapi-generator-ignore | 23 + .../pfdcm/generated/.openapi-generator/FILES | 49 ++ .../generated/.openapi-generator/VERSION | 1 + src/api/pfdcm/generated/apis/DicomApi.ts | 76 ++++ .../apis/ListenerSubsystemServicesApi.ts | 303 +++++++++++++ .../pfdcm/generated/apis/PACSQRServicesApi.ts | 127 ++++++ .../generated/apis/PACSSetupServicesApi.ts | 198 ++++++++ .../apis/PfdcmEnvironmentalDetailApi.ts | 100 ++++ .../generated/apis/SMDBSetupServicesApi.ts | 305 +++++++++++++ src/api/pfdcm/generated/apis/index.ts | 8 + src/api/pfdcm/generated/index.ts | 5 + src/api/pfdcm/generated/models/AboutModel.ts | 76 ++++ .../BodyPACSPypxApiV1PACSSyncPypxPost.ts | 92 ++++ ...CSServiceHandlerApiV1PACSThreadPypxPost.ts | 92 ++++ ...CSobjPortUpdateApiV1PACSservicePortPost.ts | 77 ++++ src/api/pfdcm/generated/models/DcmtkCore.ts | 106 +++++ .../pfdcm/generated/models/DcmtkDBPutModel.ts | 68 +++ .../generated/models/DcmtkDBReturnModel.ts | 101 +++++ src/api/pfdcm/generated/models/Dicom.ts | 60 +++ src/api/pfdcm/generated/models/EchoModel.ts | 61 +++ .../generated/models/HTTPValidationError.ts | 67 +++ src/api/pfdcm/generated/models/HelloModel.ts | 97 ++++ .../generated/models/ListenerDBreturnModel.ts | 83 ++++ .../generated/models/ListenerHandlerStatus.ts | 61 +++ .../pfdcm/generated/models/LocationInner.ts | 42 ++ .../models/ModelsListenerModelTime.ts | 61 +++ .../models/ModelsListenerModelValueStr.ts | 60 +++ .../models/ModelsPacsQRmodelValueStr.ts | 60 +++ .../models/ModelsPacsSetupModelTime.ts | 61 +++ .../models/ModelsPacsSetupModelValueStr.ts | 60 +++ .../models/ModelsSmdbSetupModelValueStr.ts | 60 +++ src/api/pfdcm/generated/models/PACSasync.ts | 87 ++++ .../pfdcm/generated/models/PACSdbPutModel.ts | 68 +++ .../generated/models/PACSdbReturnModel.ts | 101 +++++ .../pfdcm/generated/models/PACSqueryCore.ts | 252 +++++++++++ .../pfdcm/generated/models/PACSsetupCore.ts | 92 ++++ .../pfdcm/generated/models/SMDBFsConfig.ts | 83 ++++ src/api/pfdcm/generated/models/SMDBFsCore.ts | 61 +++ .../generated/models/SMDBFsReturnModel.ts | 85 ++++ .../pfdcm/generated/models/SMDBcubeConfig.ts | 83 ++++ .../pfdcm/generated/models/SMDBcubeCore.ts | 79 ++++ .../generated/models/SMDBcubeReturnModel.ts | 85 ++++ .../pfdcm/generated/models/SMDBswiftConfig.ts | 83 ++++ .../pfdcm/generated/models/SMDBswiftCore.ts | 79 ++++ .../pfdcm/generated/models/SysInfoModel.ts | 148 ++++++ .../pfdcm/generated/models/ValidationError.ts | 86 ++++ src/api/pfdcm/generated/models/XinetdCore.ts | 124 +++++ .../generated/models/XinetdDBPutModel.ts | 68 +++ .../generated/models/XinetdDBReturnModel.ts | 101 +++++ src/api/pfdcm/generated/models/index.ts | 40 ++ src/api/pfdcm/generated/runtime.ts | 426 ++++++++++++++++++ src/api/pfdcm/index.test.ts | 38 ++ src/api/pfdcm/index.ts | 3 + src/api/pfdcm/models.ts | 88 ++++ src/components/Pacs/pfdcmClient.tsx | 2 +- 59 files changed, 5262 insertions(+), 4 deletions(-) create mode 100644 src/api/pfdcm/client.ts create mode 100644 src/api/pfdcm/generated/.openapi-generator-ignore create mode 100644 src/api/pfdcm/generated/.openapi-generator/FILES create mode 100644 src/api/pfdcm/generated/.openapi-generator/VERSION create mode 100644 src/api/pfdcm/generated/apis/DicomApi.ts create mode 100644 src/api/pfdcm/generated/apis/ListenerSubsystemServicesApi.ts create mode 100644 src/api/pfdcm/generated/apis/PACSQRServicesApi.ts create mode 100644 src/api/pfdcm/generated/apis/PACSSetupServicesApi.ts create mode 100644 src/api/pfdcm/generated/apis/PfdcmEnvironmentalDetailApi.ts create mode 100644 src/api/pfdcm/generated/apis/SMDBSetupServicesApi.ts create mode 100644 src/api/pfdcm/generated/apis/index.ts create mode 100644 src/api/pfdcm/generated/index.ts create mode 100644 src/api/pfdcm/generated/models/AboutModel.ts create mode 100644 src/api/pfdcm/generated/models/BodyPACSPypxApiV1PACSSyncPypxPost.ts create mode 100644 src/api/pfdcm/generated/models/BodyPACSServiceHandlerApiV1PACSThreadPypxPost.ts create mode 100644 src/api/pfdcm/generated/models/BodyPACSobjPortUpdateApiV1PACSservicePortPost.ts create mode 100644 src/api/pfdcm/generated/models/DcmtkCore.ts create mode 100644 src/api/pfdcm/generated/models/DcmtkDBPutModel.ts create mode 100644 src/api/pfdcm/generated/models/DcmtkDBReturnModel.ts create mode 100644 src/api/pfdcm/generated/models/Dicom.ts create mode 100644 src/api/pfdcm/generated/models/EchoModel.ts create mode 100644 src/api/pfdcm/generated/models/HTTPValidationError.ts create mode 100644 src/api/pfdcm/generated/models/HelloModel.ts create mode 100644 src/api/pfdcm/generated/models/ListenerDBreturnModel.ts create mode 100644 src/api/pfdcm/generated/models/ListenerHandlerStatus.ts create mode 100644 src/api/pfdcm/generated/models/LocationInner.ts create mode 100644 src/api/pfdcm/generated/models/ModelsListenerModelTime.ts create mode 100644 src/api/pfdcm/generated/models/ModelsListenerModelValueStr.ts create mode 100644 src/api/pfdcm/generated/models/ModelsPacsQRmodelValueStr.ts create mode 100644 src/api/pfdcm/generated/models/ModelsPacsSetupModelTime.ts create mode 100644 src/api/pfdcm/generated/models/ModelsPacsSetupModelValueStr.ts create mode 100644 src/api/pfdcm/generated/models/ModelsSmdbSetupModelValueStr.ts create mode 100644 src/api/pfdcm/generated/models/PACSasync.ts create mode 100644 src/api/pfdcm/generated/models/PACSdbPutModel.ts create mode 100644 src/api/pfdcm/generated/models/PACSdbReturnModel.ts create mode 100644 src/api/pfdcm/generated/models/PACSqueryCore.ts create mode 100644 src/api/pfdcm/generated/models/PACSsetupCore.ts create mode 100644 src/api/pfdcm/generated/models/SMDBFsConfig.ts create mode 100644 src/api/pfdcm/generated/models/SMDBFsCore.ts create mode 100644 src/api/pfdcm/generated/models/SMDBFsReturnModel.ts create mode 100644 src/api/pfdcm/generated/models/SMDBcubeConfig.ts create mode 100644 src/api/pfdcm/generated/models/SMDBcubeCore.ts create mode 100644 src/api/pfdcm/generated/models/SMDBcubeReturnModel.ts create mode 100644 src/api/pfdcm/generated/models/SMDBswiftConfig.ts create mode 100644 src/api/pfdcm/generated/models/SMDBswiftCore.ts create mode 100644 src/api/pfdcm/generated/models/SysInfoModel.ts create mode 100644 src/api/pfdcm/generated/models/ValidationError.ts create mode 100644 src/api/pfdcm/generated/models/XinetdCore.ts create mode 100644 src/api/pfdcm/generated/models/XinetdDBPutModel.ts create mode 100644 src/api/pfdcm/generated/models/XinetdDBReturnModel.ts create mode 100644 src/api/pfdcm/generated/models/index.ts create mode 100644 src/api/pfdcm/generated/runtime.ts create mode 100644 src/api/pfdcm/index.test.ts create mode 100644 src/api/pfdcm/index.ts create mode 100644 src/api/pfdcm/models.ts diff --git a/.env b/.env index 1a5679867..684c225fb 100644 --- a/.env +++ b/.env @@ -8,7 +8,8 @@ VITE_CHRIS_UI_AUTH_URL="http://localhost:8000/api/v1/auth-token/" VITE_ALPHA_FEATURES='production' # Set PFDCM_URL to the root url of the running pfdcm instance -VITE_PFDCM_URL="http://localhost:4005/" +# note: must *not* have trailing slash +VITE_PFDCM_URL="http://localhost:4005" # (optional) set URL of an OHIF browser which has the same studies as the PFDCM # VITE_OHIF_URL="http://localhost:8042/ohif/" @@ -18,4 +19,4 @@ VITE_PFDCM_SWIFTKEY="local" VITE_SOURCEMAP='false' # Set URL for the store if you want to see it in the sidebar -VITE_CHRIS_STORE_URL= "http://rc-live.tch.harvard.edu:32222/api/v1/" \ No newline at end of file +VITE_CHRIS_STORE_URL= "http://rc-live.tch.harvard.edu:32222/api/v1/" diff --git a/README.md b/README.md index ff14c6d2d..5dd705fc6 100644 --- a/README.md +++ b/README.md @@ -133,6 +133,17 @@ npm run test:e2e:local # run tests using "local" backend For more information, consult the wiki: https://github.com/FNNDSC/ChRIS_ui/wiki/E2E-Testing-with-Playwright +## Pfdcm Client + +The code in `src/api/pfdcm/generated` were automatically generated using the [OpenAPI generator](https://openapi-generator.tech). + +```shell +docker run --rm --net=host -u "$(id -u):$(id -g)" \ + -v "$(npm prefix)/src:/src" \ + docker.io/openapitools/openapi-generator-cli:v7.8.0 \ + generate -g typescript-fetch -i http://localhost:4005/openapi.json -o /src/api/pfdcm/generated +``` + <!-- Image Links --> [license-badge]: https://img.shields.io/github/license/fnndsc/chris_ui.svg diff --git a/biome.json b/biome.json index 667c21416..ac80de028 100644 --- a/biome.json +++ b/biome.json @@ -10,7 +10,7 @@ "tsconfig*.json", "testing/*.mjs" ], - "ignore": ["package-lock.json"] + "ignore": ["package-lock.json", "pfdcm/generated"] }, "organizeImports": { "enabled": true diff --git a/src/api/pfdcm/client.ts b/src/api/pfdcm/client.ts new file mode 100644 index 000000000..0214a63e5 --- /dev/null +++ b/src/api/pfdcm/client.ts @@ -0,0 +1,246 @@ +/** + * Wrapper for the OpenAPI-generated client, providing better typing + * and a fp-ts API. + */ + +import * as TE from "fp-ts/TaskEither"; +import * as E from "fp-ts/Either"; +import { + Configuration, + PACSPypxApiV1PACSSyncPypxPostRequest, + PACSQRServicesApi, + PACSSetupServicesApi, + PACSqueryCore, + PACSServiceHandlerApiV1PACSThreadPypxPostRequest, + PACSasync, +} from "./generated"; +import { pipe } from "fp-ts/function"; +import { PypxFind, PypxTag, Series, StudyAndSeries } from "./models.ts"; +import { parse as parseDate } from "date-fns"; + +/** + * PFDCM client. + */ +class PfdcmClient { + private readonly servicesClient: PACSSetupServicesApi; + private readonly qrClient: PACSQRServicesApi; + constructor(configuration?: Configuration) { + this.servicesClient = new PACSSetupServicesApi(configuration); + this.qrClient = new PACSQRServicesApi(configuration); + } + + /** + * Get list of PACS services which this PFDCM is configured to speak with. + */ + public getPacsServices(): TE.TaskEither<Error, ReadonlyArray<string>> { + return TE.tryCatch( + () => this.servicesClient.serviceListGetApiV1PACSserviceListGet(), + E.toError, + ); + } + + private find( + service: string, + query: PACSqueryCore, + ): TE.TaskEither<Error, PypxFind> { + const params: PACSPypxApiV1PACSSyncPypxPostRequest = { + bodyPACSPypxApiV1PACSSyncPypxPost: { + pACSservice: { + value: service, + }, + listenerService: { + value: "default", + }, + pACSdirective: query, + }, + }; + return pipe( + TE.tryCatch( + () => this.qrClient.pACSPypxApiV1PACSSyncPypxPost(params), + E.toError, + ), + TE.flatMap(validateFindResponseData), + TE.flatMap(validateStatusIsTrue), + ); + } + + /** + * Search for PACS data. + * @param service which PACS service to search for. See {@link PfdcmClient.getPacsServices} + * @param query PACS query + */ + public query( + service: string, + query: PACSqueryCore, + ): TE.TaskEither<Error, ReadonlyArray<StudyAndSeries>> { + return pipe(this.find(service, query), TE.map(simplifyResponse)); + } + + public retrieve( + service: string, + query: PACSqueryCore, + ): TE.TaskEither<Error, PACSasync> { + const params: PACSServiceHandlerApiV1PACSThreadPypxPostRequest = { + bodyPACSServiceHandlerApiV1PACSThreadPypxPost: { + pACSservice: { + value: service, + }, + listenerService: { + value: "default", + }, + pACSdirective: { + ...query, + withFeedBack: true, + then: "retrieve", + }, + }, + }; + return pipe( + TE.tryCatch( + () => this.qrClient.pACSServiceHandlerApiV1PACSThreadPypxPost(params), + E.toError, + ), + TE.flatMap((data) => { + // @ts-ignore OpenAPI spec of PFDCM is incomplete + if (data.response.job.status) { + return TE.right(data); + } + const error = new Error("PYPX job status is missing or false"); + return TE.left(error); + }), + ); + } +} + +function validateFindResponseData(data: any): TE.TaskEither<Error, PypxFind> { + if (isFindResponseData(data)) { + return TE.right(data); + } + const error = new Error("Invalid response from PFDCM"); + return TE.left(error); +} + +function isFindResponseData(data: any): data is PypxFind { + return ( + typeof data.status === "boolean" && "message" in data && "pypx" in data + ); +} + +/** + * Validate that all the "status" fields are `true` + * (this is a convention that Rudolph uses for error handling + * instead of HTTP status codes, exceptions, and/or monads). + */ +function validateStatusIsTrue(data: PypxFind): TE.TaskEither<Error, PypxFind> { + if (!data.status) { + const error = new Error("PFDCM response status=false"); + return TE.left(error); + } + if (data.pypx.status !== "success") { + const error = new Error("PFDCM response pypx.status=false"); + return TE.left(error); + } + for (const study of data.pypx.data) { + if (!Array.isArray(study.series)) { + continue; + } + for (const series of study.series) { + if (series.status.value !== "success") { + const error = new Error( + `PFDCM response pypx...status is false for SeriesInstanceUID=${series?.SeriesInstanceUID?.value}`, + ); + return TE.left(error); + } + } + } + return TE.right(data); +} + +/** + * Re-organizes the data from pypx's response. + */ +function simplifyResponse(data: PypxFind): ReadonlyArray<StudyAndSeries> { + return data.pypx.data.map(simplifyPypxStudyData); +} + +function simplifyPypxStudyData(data: { + [key: string]: PypxTag | ReadonlyArray<{ [key: string]: PypxTag }>; +}): StudyAndSeries { + const study = { + SpecificCharacterSet: getValue(data, "SpecificCharacterSet"), + StudyDate: getValue(data, "StudyDate"), + AccessionNumber: getValue(data, "AccessionNumber"), + RetrieveAETitle: getValue(data, "RetrieveAETitle"), + ModalitiesInStudy: getValue(data, "ModalitiesInStudy"), + StudyDescription: getValue(data, "StudyDescription"), + PatientName: getValue(data, "PatientName"), + PatientID: getValue(data, "PatientID"), + PatientBirthDate: + "value" in data.PatientBirthDate + ? parseDicomDate(data.PatientBirthDate) + : null, + PatientSex: getValue(data, "PatientSex"), + PatientAge: parseFloat(getValue(data, "PatientAge")), + ProtocolName: getValue(data, "ProtocolName"), + AcquisitionProtocolName: getValue(data, "AcquisitionProtocolName"), + AcquisitionProtocolDescription: getValue( + data, + "AcquisitionProtocolDescription", + ), + StudyInstanceUID: getValue(data, "StudyInstanceUID"), + NumberOfStudyRelatedSeries: getValue(data, "NumberOfStudyRelatedSeries"), + PerformedStationAETitle: getValue(data, "PerformedStationAETitle"), + }; + const series = Array.isArray(data.series) + ? data.series.map(simplifyPypxSeriesData) + : []; + return { study, series }; +} + +function getValue( + data: { [key: string]: PypxTag | ReadonlyArray<{ [key: string]: PypxTag }> }, + name: string, +): string { + if ("value" in data[name]) { + return "" + data[name].value; + } + return ""; +} + +function simplifyPypxSeriesData(data: { [key: string]: PypxTag }): Series { + return { + SpecificCharacterSet: "" + data.SpecificCharacterSet.value, + StudyDate: "" + data.StudyDate.value, + SeriesDate: "" + data.SeriesDate.value, + AccessionNumber: "" + data.AccessionNumber.value, + RetrieveAETitle: "" + data.RetrieveAETitle.value, + Modality: "" + data.Modality.value, + StudyDescription: "" + data.StudyDescription.value, + SeriesDescription: "" + data.SeriesDescription.value, + PatientName: "" + data.PatientName.value, + PatientID: "" + data.PatientID.value, + PatientBirthDate: parseDicomDate(data.PatientBirthDate), + PatientSex: "" + data.PatientSex.value, + PatientAge: parseFloat("" + data.PatientAge.value), + ProtocolName: "" + data.ProtocolName.value, + AcquisitionProtocolName: "" + data.AcquisitionProtocolName.value, + AcquisitionProtocolDescription: + "" + data.AcquisitionProtocolDescription.value, + StudyInstanceUID: "" + data.StudyInstanceUID.value, + SeriesInstanceUID: "" + data.SeriesInstanceUID.value, + NumberOfSeriesRelatedInstances: + "" + data.NumberOfSeriesRelatedInstances.value, + PerformedStationAETitle: "" + data.PerformedStationAETitle.value, + }; +} + +/** + * Parse a DICOM DateString (DS), which is in YYYYMMDD format. + * + * https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.2.html + */ +function parseDicomDate(tag: PypxTag): Date { + return parseDate("" + tag.value, "yyyyMMdd", new Date()); +} + +export { PfdcmClient }; diff --git a/src/api/pfdcm/generated/.openapi-generator-ignore b/src/api/pfdcm/generated/.openapi-generator-ignore new file mode 100644 index 000000000..7484ee590 --- /dev/null +++ b/src/api/pfdcm/generated/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/src/api/pfdcm/generated/.openapi-generator/FILES b/src/api/pfdcm/generated/.openapi-generator/FILES new file mode 100644 index 000000000..f0703c692 --- /dev/null +++ b/src/api/pfdcm/generated/.openapi-generator/FILES @@ -0,0 +1,49 @@ +.openapi-generator-ignore +apis/DicomApi.ts +apis/ListenerSubsystemServicesApi.ts +apis/PACSQRServicesApi.ts +apis/PACSSetupServicesApi.ts +apis/PfdcmEnvironmentalDetailApi.ts +apis/SMDBSetupServicesApi.ts +apis/index.ts +index.ts +models/AboutModel.ts +models/BodyPACSPypxApiV1PACSSyncPypxPost.ts +models/BodyPACSServiceHandlerApiV1PACSThreadPypxPost.ts +models/BodyPACSobjPortUpdateApiV1PACSservicePortPost.ts +models/DcmtkCore.ts +models/DcmtkDBPutModel.ts +models/DcmtkDBReturnModel.ts +models/Dicom.ts +models/EchoModel.ts +models/HTTPValidationError.ts +models/HelloModel.ts +models/ListenerDBreturnModel.ts +models/ListenerHandlerStatus.ts +models/LocationInner.ts +models/ModelsListenerModelTime.ts +models/ModelsListenerModelValueStr.ts +models/ModelsPacsQRmodelValueStr.ts +models/ModelsPacsSetupModelTime.ts +models/ModelsPacsSetupModelValueStr.ts +models/ModelsSmdbSetupModelValueStr.ts +models/PACSasync.ts +models/PACSdbPutModel.ts +models/PACSdbReturnModel.ts +models/PACSqueryCore.ts +models/PACSsetupCore.ts +models/SMDBFsConfig.ts +models/SMDBFsCore.ts +models/SMDBFsReturnModel.ts +models/SMDBcubeConfig.ts +models/SMDBcubeCore.ts +models/SMDBcubeReturnModel.ts +models/SMDBswiftConfig.ts +models/SMDBswiftCore.ts +models/SysInfoModel.ts +models/ValidationError.ts +models/XinetdCore.ts +models/XinetdDBPutModel.ts +models/XinetdDBReturnModel.ts +models/index.ts +runtime.ts diff --git a/src/api/pfdcm/generated/.openapi-generator/VERSION b/src/api/pfdcm/generated/.openapi-generator/VERSION new file mode 100644 index 000000000..09a6d3084 --- /dev/null +++ b/src/api/pfdcm/generated/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.8.0 diff --git a/src/api/pfdcm/generated/apis/DicomApi.ts b/src/api/pfdcm/generated/apis/DicomApi.ts new file mode 100644 index 000000000..bdca8314f --- /dev/null +++ b/src/api/pfdcm/generated/apis/DicomApi.ts @@ -0,0 +1,76 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import * as runtime from '../runtime'; +import type { + Dicom, + HTTPValidationError, +} from '../models/index'; +import { + DicomFromJSON, + DicomToJSON, + HTTPValidationErrorFromJSON, + HTTPValidationErrorToJSON, +} from '../models/index'; + +export interface ReadDicomApiV1DicomGetRequest { + mrn: number; +} + +/** + * + */ +export class DicomApi extends runtime.BaseAPI { + + /** + * Fake meaningless response + * Get dicom images for a patient. + */ + async readDicomApiV1DicomGetRaw(requestParameters: ReadDicomApiV1DicomGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Dicom>> { + if (requestParameters['mrn'] == null) { + throw new runtime.RequiredError( + 'mrn', + 'Required parameter "mrn" was null or undefined when calling readDicomApiV1DicomGet().' + ); + } + + const queryParameters: any = {}; + + if (requestParameters['mrn'] != null) { + queryParameters['mrn'] = requestParameters['mrn']; + } + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/api/v1/dicom/`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => DicomFromJSON(jsonValue)); + } + + /** + * Fake meaningless response + * Get dicom images for a patient. + */ + async readDicomApiV1DicomGet(requestParameters: ReadDicomApiV1DicomGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Dicom> { + const response = await this.readDicomApiV1DicomGetRaw(requestParameters, initOverrides); + return await response.value(); + } + +} diff --git a/src/api/pfdcm/generated/apis/ListenerSubsystemServicesApi.ts b/src/api/pfdcm/generated/apis/ListenerSubsystemServicesApi.ts new file mode 100644 index 000000000..f65195e4d --- /dev/null +++ b/src/api/pfdcm/generated/apis/ListenerSubsystemServicesApi.ts @@ -0,0 +1,303 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import * as runtime from '../runtime'; +import type { + DcmtkDBPutModel, + DcmtkDBReturnModel, + HTTPValidationError, + ListenerDBreturnModel, + ListenerHandlerStatus, + ModelsListenerModelValueStr, + XinetdDBPutModel, + XinetdDBReturnModel, +} from '../models/index'; +import { + DcmtkDBPutModelFromJSON, + DcmtkDBPutModelToJSON, + DcmtkDBReturnModelFromJSON, + DcmtkDBReturnModelToJSON, + HTTPValidationErrorFromJSON, + HTTPValidationErrorToJSON, + ListenerDBreturnModelFromJSON, + ListenerDBreturnModelToJSON, + ListenerHandlerStatusFromJSON, + ListenerHandlerStatusToJSON, + ModelsListenerModelValueStrFromJSON, + ModelsListenerModelValueStrToJSON, + XinetdDBPutModelFromJSON, + XinetdDBPutModelToJSON, + XinetdDBReturnModelFromJSON, + XinetdDBReturnModelToJSON, +} from '../models/index'; + +export interface ItemPutDcmtkApiV1ListenerListenerObjNameDcmtkPutRequest { + listenerObjName: string; + dcmtkDBPutModel: DcmtkDBPutModel; +} + +export interface ItemPutXinetdApiV1ListenerListenerObjNameXinetdPutRequest { + listenerObjName: string; + xinetdDBPutModel: XinetdDBPutModel; +} + +export interface ListenerGetApiV1ListenerListenerObjNameGetRequest { + listenerObjName: string; +} + +export interface ListenerInitializeApiV1ListenerInitializePostRequest { + modelsListenerModelValueStr: ModelsListenerModelValueStr; +} + +export interface ListenerStatusGetApiV1ListenerStatusListenerObjNameGetRequest { + listenerObjName: string; +} + +/** + * + */ +export class ListenerSubsystemServicesApi extends runtime.BaseAPI { + + /** + * PUT an entire dcmtk object. If the object already exists, overwrite. If it does not exist, append to the space of available objects. Note that overwriting an existing object will replace ALL the `info` fields, thus leaving a default of `\"string\"` will literally put the text `string` for a specific field. Parameters ---------- - `listenerObjName` : internal name of (new) object - `dcmtkInfo` : new values for object internals + * PUT a dcmtk update + */ + async itemPutDcmtkApiV1ListenerListenerObjNameDcmtkPutRaw(requestParameters: ItemPutDcmtkApiV1ListenerListenerObjNameDcmtkPutRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<DcmtkDBReturnModel>> { + if (requestParameters['listenerObjName'] == null) { + throw new runtime.RequiredError( + 'listenerObjName', + 'Required parameter "listenerObjName" was null or undefined when calling itemPutDcmtkApiV1ListenerListenerObjNameDcmtkPut().' + ); + } + + if (requestParameters['dcmtkDBPutModel'] == null) { + throw new runtime.RequiredError( + 'dcmtkDBPutModel', + 'Required parameter "dcmtkDBPutModel" was null or undefined when calling itemPutDcmtkApiV1ListenerListenerObjNameDcmtkPut().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request({ + path: `/api/v1/listener/{listenerObjName}/dcmtk/`.replace(`{${"listenerObjName"}}`, encodeURIComponent(String(requestParameters['listenerObjName']))), + method: 'PUT', + headers: headerParameters, + query: queryParameters, + body: DcmtkDBPutModelToJSON(requestParameters['dcmtkDBPutModel']), + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => DcmtkDBReturnModelFromJSON(jsonValue)); + } + + /** + * PUT an entire dcmtk object. If the object already exists, overwrite. If it does not exist, append to the space of available objects. Note that overwriting an existing object will replace ALL the `info` fields, thus leaving a default of `\"string\"` will literally put the text `string` for a specific field. Parameters ---------- - `listenerObjName` : internal name of (new) object - `dcmtkInfo` : new values for object internals + * PUT a dcmtk update + */ + async itemPutDcmtkApiV1ListenerListenerObjNameDcmtkPut(requestParameters: ItemPutDcmtkApiV1ListenerListenerObjNameDcmtkPutRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<DcmtkDBReturnModel> { + const response = await this.itemPutDcmtkApiV1ListenerListenerObjNameDcmtkPutRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * PUT an entire xinetd object. If the object already exists, overwrite. If it does not exist, append to the space of available objects. Note that overwriting an existing object will replace ALL the `info` fields, thus leaving a default of `\"string\"` will literally put the text `string` for a specific field. Parameters ---------- - `listenerObjName` : internal name of (new) object - `xinetdInfo` : new values for object internals + * PUT an xinetd update + */ + async itemPutXinetdApiV1ListenerListenerObjNameXinetdPutRaw(requestParameters: ItemPutXinetdApiV1ListenerListenerObjNameXinetdPutRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<XinetdDBReturnModel>> { + if (requestParameters['listenerObjName'] == null) { + throw new runtime.RequiredError( + 'listenerObjName', + 'Required parameter "listenerObjName" was null or undefined when calling itemPutXinetdApiV1ListenerListenerObjNameXinetdPut().' + ); + } + + if (requestParameters['xinetdDBPutModel'] == null) { + throw new runtime.RequiredError( + 'xinetdDBPutModel', + 'Required parameter "xinetdDBPutModel" was null or undefined when calling itemPutXinetdApiV1ListenerListenerObjNameXinetdPut().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request({ + path: `/api/v1/listener/{listenerObjName}/xinetd/`.replace(`{${"listenerObjName"}}`, encodeURIComponent(String(requestParameters['listenerObjName']))), + method: 'PUT', + headers: headerParameters, + query: queryParameters, + body: XinetdDBPutModelToJSON(requestParameters['xinetdDBPutModel']), + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => XinetdDBReturnModelFromJSON(jsonValue)); + } + + /** + * PUT an entire xinetd object. If the object already exists, overwrite. If it does not exist, append to the space of available objects. Note that overwriting an existing object will replace ALL the `info` fields, thus leaving a default of `\"string\"` will literally put the text `string` for a specific field. Parameters ---------- - `listenerObjName` : internal name of (new) object - `xinetdInfo` : new values for object internals + * PUT an xinetd update + */ + async itemPutXinetdApiV1ListenerListenerObjNameXinetdPut(requestParameters: ItemPutXinetdApiV1ListenerListenerObjNameXinetdPutRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<XinetdDBReturnModel> { + const response = await this.itemPutXinetdApiV1ListenerListenerObjNameXinetdPutRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * GET the information pertinent to a `listenerObjName` (for a list of valid `listenerObjName` GET the `serviceList`) + * GET information for a given listener object + */ + async listenerGetApiV1ListenerListenerObjNameGetRaw(requestParameters: ListenerGetApiV1ListenerListenerObjNameGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ListenerDBreturnModel>> { + if (requestParameters['listenerObjName'] == null) { + throw new runtime.RequiredError( + 'listenerObjName', + 'Required parameter "listenerObjName" was null or undefined when calling listenerGetApiV1ListenerListenerObjNameGet().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/api/v1/listener/{listenerObjName}/`.replace(`{${"listenerObjName"}}`, encodeURIComponent(String(requestParameters['listenerObjName']))), + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => ListenerDBreturnModelFromJSON(jsonValue)); + } + + /** + * GET the information pertinent to a `listenerObjName` (for a list of valid `listenerObjName` GET the `serviceList`) + * GET information for a given listener object + */ + async listenerGetApiV1ListenerListenerObjNameGet(requestParameters: ListenerGetApiV1ListenerListenerObjNameGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ListenerDBreturnModel> { + const response = await this.listenerGetApiV1ListenerListenerObjNameGetRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * Initialize the listener service for the object __objToInitialize__. Parameters ---------- - `objToInitialize`: name of the listener object to initialize Return ------ - dictionary response from the initialization process NOTE: A return / response model is not specified since the return from the call is variable. + * POST a signal to the listener `objToInitialize`, triggering a self initialization + */ + async listenerInitializeApiV1ListenerInitializePostRaw(requestParameters: ListenerInitializeApiV1ListenerInitializePostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<any>> { + if (requestParameters['modelsListenerModelValueStr'] == null) { + throw new runtime.RequiredError( + 'modelsListenerModelValueStr', + 'Required parameter "modelsListenerModelValueStr" was null or undefined when calling listenerInitializeApiV1ListenerInitializePost().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request({ + path: `/api/v1/listener/initialize/`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + body: ModelsListenerModelValueStrToJSON(requestParameters['modelsListenerModelValueStr']), + }, initOverrides); + + if (this.isJsonMime(response.headers.get('content-type'))) { + return new runtime.JSONApiResponse<any>(response); + } else { + return new runtime.TextApiResponse(response) as any; + } + } + + /** + * Initialize the listener service for the object __objToInitialize__. Parameters ---------- - `objToInitialize`: name of the listener object to initialize Return ------ - dictionary response from the initialization process NOTE: A return / response model is not specified since the return from the call is variable. + * POST a signal to the listener `objToInitialize`, triggering a self initialization + */ + async listenerInitializeApiV1ListenerInitializePost(requestParameters: ListenerInitializeApiV1ListenerInitializePostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<any> { + const response = await this.listenerInitializeApiV1ListenerInitializePostRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * GET the listener susystem information pertinent to a `listenerObjName`. This information indicates if the subsystem has been initialized and therefore if it is ready to accept incoming data. (for a list of valid `listenerObjName` GET the `serviceList`) + * GET the listener subsystem status of a given listener object + */ + async listenerStatusGetApiV1ListenerStatusListenerObjNameGetRaw(requestParameters: ListenerStatusGetApiV1ListenerStatusListenerObjNameGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ListenerHandlerStatus>> { + if (requestParameters['listenerObjName'] == null) { + throw new runtime.RequiredError( + 'listenerObjName', + 'Required parameter "listenerObjName" was null or undefined when calling listenerStatusGetApiV1ListenerStatusListenerObjNameGet().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/api/v1/listener/status/{listenerObjName}/`.replace(`{${"listenerObjName"}}`, encodeURIComponent(String(requestParameters['listenerObjName']))), + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => ListenerHandlerStatusFromJSON(jsonValue)); + } + + /** + * GET the listener susystem information pertinent to a `listenerObjName`. This information indicates if the subsystem has been initialized and therefore if it is ready to accept incoming data. (for a list of valid `listenerObjName` GET the `serviceList`) + * GET the listener subsystem status of a given listener object + */ + async listenerStatusGetApiV1ListenerStatusListenerObjNameGet(requestParameters: ListenerStatusGetApiV1ListenerStatusListenerObjNameGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ListenerHandlerStatus> { + const response = await this.listenerStatusGetApiV1ListenerStatusListenerObjNameGetRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * GET the list of configured PACS services + * GET the list of configured listener services + */ + async serviceListGetApiV1ListenerListGetRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<any>>> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/api/v1/listener/list/`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse<any>(response); + } + + /** + * GET the list of configured PACS services + * GET the list of configured listener services + */ + async serviceListGetApiV1ListenerListGet(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<any>> { + const response = await this.serviceListGetApiV1ListenerListGetRaw(initOverrides); + return await response.value(); + } + +} diff --git a/src/api/pfdcm/generated/apis/PACSQRServicesApi.ts b/src/api/pfdcm/generated/apis/PACSQRServicesApi.ts new file mode 100644 index 000000000..3fc64594c --- /dev/null +++ b/src/api/pfdcm/generated/apis/PACSQRServicesApi.ts @@ -0,0 +1,127 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import * as runtime from '../runtime'; +import type { + BodyPACSPypxApiV1PACSSyncPypxPost, + BodyPACSServiceHandlerApiV1PACSThreadPypxPost, + HTTPValidationError, + PACSasync, +} from '../models/index'; +import { + BodyPACSPypxApiV1PACSSyncPypxPostFromJSON, + BodyPACSPypxApiV1PACSSyncPypxPostToJSON, + BodyPACSServiceHandlerApiV1PACSThreadPypxPostFromJSON, + BodyPACSServiceHandlerApiV1PACSThreadPypxPostToJSON, + HTTPValidationErrorFromJSON, + HTTPValidationErrorToJSON, + PACSasyncFromJSON, + PACSasyncToJSON, +} from '../models/index'; + +export interface PACSPypxApiV1PACSSyncPypxPostRequest { + bodyPACSPypxApiV1PACSSyncPypxPost: BodyPACSPypxApiV1PACSSyncPypxPost; +} + +export interface PACSServiceHandlerApiV1PACSThreadPypxPostRequest { + bodyPACSServiceHandlerApiV1PACSThreadPypxPost: BodyPACSServiceHandlerApiV1PACSThreadPypxPost; +} + +/** + * + */ +export class PACSQRServicesApi extends runtime.BaseAPI { + + /** + * POST a retrieve to the `PACSservice`, and capture return communication using the `listenerService`. The client will only receive a return payload when the PACSdirective has completed its remote execution. Parameters ---------- - `PACSservice`: name of the internal PACS service to query - `listenerService`: name of the listener service to use locally - `PACSdirective`: the pypx directive object Return ------ - PACSqueryReturnModel + * Use this API route for STATUS operations and any others that block but which are \"short lived\". Since this is a synchronous operation, the call will only return on successful completion of the remote directive. + */ + async pACSPypxApiV1PACSSyncPypxPostRaw(requestParameters: PACSPypxApiV1PACSSyncPypxPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<any>> { + if (requestParameters['bodyPACSPypxApiV1PACSSyncPypxPost'] == null) { + throw new runtime.RequiredError( + 'bodyPACSPypxApiV1PACSSyncPypxPost', + 'Required parameter "bodyPACSPypxApiV1PACSSyncPypxPost" was null or undefined when calling pACSPypxApiV1PACSSyncPypxPost().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request({ + path: `/api/v1/PACS/sync/pypx/`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + body: BodyPACSPypxApiV1PACSSyncPypxPostToJSON(requestParameters['bodyPACSPypxApiV1PACSSyncPypxPost']), + }, initOverrides); + + if (this.isJsonMime(response.headers.get('content-type'))) { + return new runtime.JSONApiResponse<any>(response); + } else { + return new runtime.TextApiResponse(response) as any; + } + } + + /** + * POST a retrieve to the `PACSservice`, and capture return communication using the `listenerService`. The client will only receive a return payload when the PACSdirective has completed its remote execution. Parameters ---------- - `PACSservice`: name of the internal PACS service to query - `listenerService`: name of the listener service to use locally - `PACSdirective`: the pypx directive object Return ------ - PACSqueryReturnModel + * Use this API route for STATUS operations and any others that block but which are \"short lived\". Since this is a synchronous operation, the call will only return on successful completion of the remote directive. + */ + async pACSPypxApiV1PACSSyncPypxPost(requestParameters: PACSPypxApiV1PACSSyncPypxPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<any> { + const response = await this.pACSPypxApiV1PACSSyncPypxPostRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * Handler into PACS calls for long-lived compute (retrieve/push/register) This is very thin and simple dispatching service that will either use the find module API, or will call the find module script. Anectodal testing has shown that the API calls might fail, possibly due to thread pool exhaustion? At time of writing, the CLI calls seem more reliable since they introduce a single-queue concept by explicitly waiting for a CLI px-find process to finish. While this means that status calls are somewhat blocked when a RPR job is in flight, for multiple series pulls, the retrieve/push/register workflow proceeds correctly. Args: PACSservice (pacsQRmodel.ValueStr): The PACS with which to communicate listenerService (pacsQRmodel.ValueStr): The listener service that receives PACS comms PACSdirective (pacsQRmodel.PACSqueryCore): The instructions to the PACS + * Use this API route for RETRIEVE, PUSH, REGISTER operations and any others that might be possibly \"long lived\". The actual processing is dispatched to a separate thread so that the client receives a return immediately. Clients should use a STATUS request on the same payload to determine realtime status of the operation. + */ + async pACSServiceHandlerApiV1PACSThreadPypxPostRaw(requestParameters: PACSServiceHandlerApiV1PACSThreadPypxPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PACSasync>> { + if (requestParameters['bodyPACSServiceHandlerApiV1PACSThreadPypxPost'] == null) { + throw new runtime.RequiredError( + 'bodyPACSServiceHandlerApiV1PACSThreadPypxPost', + 'Required parameter "bodyPACSServiceHandlerApiV1PACSThreadPypxPost" was null or undefined when calling pACSServiceHandlerApiV1PACSThreadPypxPost().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request({ + path: `/api/v1/PACS/thread/pypx/`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + body: BodyPACSServiceHandlerApiV1PACSThreadPypxPostToJSON(requestParameters['bodyPACSServiceHandlerApiV1PACSThreadPypxPost']), + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => PACSasyncFromJSON(jsonValue)); + } + + /** + * Handler into PACS calls for long-lived compute (retrieve/push/register) This is very thin and simple dispatching service that will either use the find module API, or will call the find module script. Anectodal testing has shown that the API calls might fail, possibly due to thread pool exhaustion? At time of writing, the CLI calls seem more reliable since they introduce a single-queue concept by explicitly waiting for a CLI px-find process to finish. While this means that status calls are somewhat blocked when a RPR job is in flight, for multiple series pulls, the retrieve/push/register workflow proceeds correctly. Args: PACSservice (pacsQRmodel.ValueStr): The PACS with which to communicate listenerService (pacsQRmodel.ValueStr): The listener service that receives PACS comms PACSdirective (pacsQRmodel.PACSqueryCore): The instructions to the PACS + * Use this API route for RETRIEVE, PUSH, REGISTER operations and any others that might be possibly \"long lived\". The actual processing is dispatched to a separate thread so that the client receives a return immediately. Clients should use a STATUS request on the same payload to determine realtime status of the operation. + */ + async pACSServiceHandlerApiV1PACSThreadPypxPost(requestParameters: PACSServiceHandlerApiV1PACSThreadPypxPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PACSasync> { + const response = await this.pACSServiceHandlerApiV1PACSThreadPypxPostRaw(requestParameters, initOverrides); + return await response.value(); + } + +} diff --git a/src/api/pfdcm/generated/apis/PACSSetupServicesApi.ts b/src/api/pfdcm/generated/apis/PACSSetupServicesApi.ts new file mode 100644 index 000000000..0d463fc33 --- /dev/null +++ b/src/api/pfdcm/generated/apis/PACSSetupServicesApi.ts @@ -0,0 +1,198 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import * as runtime from '../runtime'; +import type { + BodyPACSobjPortUpdateApiV1PACSservicePortPost, + HTTPValidationError, + PACSdbPutModel, + PACSdbReturnModel, +} from '../models/index'; +import { + BodyPACSobjPortUpdateApiV1PACSservicePortPostFromJSON, + BodyPACSobjPortUpdateApiV1PACSservicePortPostToJSON, + HTTPValidationErrorFromJSON, + HTTPValidationErrorToJSON, + PACSdbPutModelFromJSON, + PACSdbPutModelToJSON, + PACSdbReturnModelFromJSON, + PACSdbReturnModelToJSON, +} from '../models/index'; + +export interface PACSobjPortUpdateApiV1PACSservicePortPostRequest { + bodyPACSobjPortUpdateApiV1PACSservicePortPost: BodyPACSobjPortUpdateApiV1PACSservicePortPost; +} + +export interface PacsSetupGetApiV1PACSservicePACSobjNameGetRequest { + pACSobjName: string; +} + +export interface PacsSetupPutApiV1PACSservicePACSobjNamePutRequest { + pACSobjName: string; + pACSdbPutModel: PACSdbPutModel; +} + +/** + * + */ +export class PACSSetupServicesApi extends runtime.BaseAPI { + + /** + * Update the `server_port` of a given __objToUpdate__. This method is more exemplar than actually useful. Parameters ---------- - `objToUpdate`: name of the internal PACS object to update - `newPort`: port value string to re-assign in the internal object Return ------ - updated model of the `objToUpdate` + * POST a change to the listener `port` of the PACS `objToUpdate` + */ + async pACSobjPortUpdateApiV1PACSservicePortPostRaw(requestParameters: PACSobjPortUpdateApiV1PACSservicePortPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PACSdbReturnModel>> { + if (requestParameters['bodyPACSobjPortUpdateApiV1PACSservicePortPost'] == null) { + throw new runtime.RequiredError( + 'bodyPACSobjPortUpdateApiV1PACSservicePortPost', + 'Required parameter "bodyPACSobjPortUpdateApiV1PACSservicePortPost" was null or undefined when calling pACSobjPortUpdateApiV1PACSservicePortPost().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request({ + path: `/api/v1/PACSservice/port/`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + body: BodyPACSobjPortUpdateApiV1PACSservicePortPostToJSON(requestParameters['bodyPACSobjPortUpdateApiV1PACSservicePortPost']), + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => PACSdbReturnModelFromJSON(jsonValue)); + } + + /** + * Update the `server_port` of a given __objToUpdate__. This method is more exemplar than actually useful. Parameters ---------- - `objToUpdate`: name of the internal PACS object to update - `newPort`: port value string to re-assign in the internal object Return ------ - updated model of the `objToUpdate` + * POST a change to the listener `port` of the PACS `objToUpdate` + */ + async pACSobjPortUpdateApiV1PACSservicePortPost(requestParameters: PACSobjPortUpdateApiV1PACSservicePortPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PACSdbReturnModel> { + const response = await this.pACSobjPortUpdateApiV1PACSservicePortPostRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * GET the setup info pertinent to a `pacsSetup` + * GET the information for a given PACS + */ + async pacsSetupGetApiV1PACSservicePACSobjNameGetRaw(requestParameters: PacsSetupGetApiV1PACSservicePACSobjNameGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PACSdbReturnModel>> { + if (requestParameters['pACSobjName'] == null) { + throw new runtime.RequiredError( + 'pACSobjName', + 'Required parameter "pACSobjName" was null or undefined when calling pacsSetupGetApiV1PACSservicePACSobjNameGet().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/api/v1/PACSservice/{PACSobjName}/`.replace(`{${"PACSobjName"}}`, encodeURIComponent(String(requestParameters['pACSobjName']))), + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => PACSdbReturnModelFromJSON(jsonValue)); + } + + /** + * GET the setup info pertinent to a `pacsSetup` + * GET the information for a given PACS + */ + async pacsSetupGetApiV1PACSservicePACSobjNameGet(requestParameters: PacsSetupGetApiV1PACSservicePACSobjNameGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PACSdbReturnModel> { + const response = await this.pacsSetupGetApiV1PACSservicePACSobjNameGetRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * PUT an entire object. If the object already exists, overwrite. If it does not exist, append to the space of available objects. Note that overwriting an existing object will replace ALL the `info` fields, thus leaving a default of `\"string\"` will literally put the text `string` for a specific field. Parameters ---------- - `PACSobjName` : internal name of (new) object - `PACSsetupData` : new values for object internals + * PUT information to a (possibly new) PACS object + */ + async pacsSetupPutApiV1PACSservicePACSobjNamePutRaw(requestParameters: PacsSetupPutApiV1PACSservicePACSobjNamePutRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PACSdbReturnModel>> { + if (requestParameters['pACSobjName'] == null) { + throw new runtime.RequiredError( + 'pACSobjName', + 'Required parameter "pACSobjName" was null or undefined when calling pacsSetupPutApiV1PACSservicePACSobjNamePut().' + ); + } + + if (requestParameters['pACSdbPutModel'] == null) { + throw new runtime.RequiredError( + 'pACSdbPutModel', + 'Required parameter "pACSdbPutModel" was null or undefined when calling pacsSetupPutApiV1PACSservicePACSobjNamePut().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request({ + path: `/api/v1/PACSservice/{PACSobjName}/`.replace(`{${"PACSobjName"}}`, encodeURIComponent(String(requestParameters['pACSobjName']))), + method: 'PUT', + headers: headerParameters, + query: queryParameters, + body: PACSdbPutModelToJSON(requestParameters['pACSdbPutModel']), + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => PACSdbReturnModelFromJSON(jsonValue)); + } + + /** + * PUT an entire object. If the object already exists, overwrite. If it does not exist, append to the space of available objects. Note that overwriting an existing object will replace ALL the `info` fields, thus leaving a default of `\"string\"` will literally put the text `string` for a specific field. Parameters ---------- - `PACSobjName` : internal name of (new) object - `PACSsetupData` : new values for object internals + * PUT information to a (possibly new) PACS object + */ + async pacsSetupPutApiV1PACSservicePACSobjNamePut(requestParameters: PacsSetupPutApiV1PACSservicePACSobjNamePutRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PACSdbReturnModel> { + const response = await this.pacsSetupPutApiV1PACSservicePACSobjNamePutRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * GET the list of configured PACS services + * GET the list of configured PACS services + */ + async serviceListGetApiV1PACSserviceListGetRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<any>>> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/api/v1/PACSservice/list/`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse<any>(response); + } + + /** + * GET the list of configured PACS services + * GET the list of configured PACS services + */ + async serviceListGetApiV1PACSserviceListGet(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<any>> { + const response = await this.serviceListGetApiV1PACSserviceListGetRaw(initOverrides); + return await response.value(); + } + +} diff --git a/src/api/pfdcm/generated/apis/PfdcmEnvironmentalDetailApi.ts b/src/api/pfdcm/generated/apis/PfdcmEnvironmentalDetailApi.ts new file mode 100644 index 000000000..7d001e6b4 --- /dev/null +++ b/src/api/pfdcm/generated/apis/PfdcmEnvironmentalDetailApi.ts @@ -0,0 +1,100 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import * as runtime from '../runtime'; +import type { + AboutModel, + HTTPValidationError, + HelloModel, +} from '../models/index'; +import { + AboutModelFromJSON, + AboutModelToJSON, + HTTPValidationErrorFromJSON, + HTTPValidationErrorToJSON, + HelloModelFromJSON, + HelloModelToJSON, +} from '../models/index'; + +export interface ReadHelloApiV1HelloGetRequest { + echoBack?: string; +} + +/** + * + */ +export class PfdcmEnvironmentalDetailApi extends runtime.BaseAPI { + + /** + * A description of this service. + * Read About + */ + async readAboutApiV1AboutGetRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<AboutModel>> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/api/v1/about/`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => AboutModelFromJSON(jsonValue)); + } + + /** + * A description of this service. + * Read About + */ + async readAboutApiV1AboutGet(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<AboutModel> { + const response = await this.readAboutApiV1AboutGetRaw(initOverrides); + return await response.value(); + } + + /** + * Produce some information like the OG pfcon + * Read Hello + */ + async readHelloApiV1HelloGetRaw(requestParameters: ReadHelloApiV1HelloGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<HelloModel>> { + const queryParameters: any = {}; + + if (requestParameters['echoBack'] != null) { + queryParameters['echoBack'] = requestParameters['echoBack']; + } + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/api/v1/hello/`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => HelloModelFromJSON(jsonValue)); + } + + /** + * Produce some information like the OG pfcon + * Read Hello + */ + async readHelloApiV1HelloGet(requestParameters: ReadHelloApiV1HelloGetRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<HelloModel> { + const response = await this.readHelloApiV1HelloGetRaw(requestParameters, initOverrides); + return await response.value(); + } + +} diff --git a/src/api/pfdcm/generated/apis/SMDBSetupServicesApi.ts b/src/api/pfdcm/generated/apis/SMDBSetupServicesApi.ts new file mode 100644 index 000000000..555438937 --- /dev/null +++ b/src/api/pfdcm/generated/apis/SMDBSetupServicesApi.ts @@ -0,0 +1,305 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import * as runtime from '../runtime'; +import type { + HTTPValidationError, + SMDBFsConfig, + SMDBFsReturnModel, + SMDBcubeConfig, + SMDBcubeReturnModel, + SMDBswiftConfig, +} from '../models/index'; +import { + HTTPValidationErrorFromJSON, + HTTPValidationErrorToJSON, + SMDBFsConfigFromJSON, + SMDBFsConfigToJSON, + SMDBFsReturnModelFromJSON, + SMDBFsReturnModelToJSON, + SMDBcubeConfigFromJSON, + SMDBcubeConfigToJSON, + SMDBcubeReturnModelFromJSON, + SMDBcubeReturnModelToJSON, + SMDBswiftConfigFromJSON, + SMDBswiftConfigToJSON, +} from '../models/index'; + +export interface CubeResourceGetApiV1SMDBCUBECubeResourceGetRequest { + cubeResource: string; +} + +export interface SMDBobjCubeUpdateApiV1SMDBCUBEPostRequest { + sMDBcubeConfig: SMDBcubeConfig; +} + +export interface SMDBobjFsUpdateApiV1SMDBFSPostRequest { + sMDBFsConfig: SMDBFsConfig; +} + +export interface SMDBobjSwiftUpdateApiV1SMDBSwiftPostRequest { + sMDBswiftConfig: SMDBswiftConfig; +} + +export interface StorageResourceGetApiV1SMDBStorageStorageResourceGetRequest { + storageResource: string; +} + +/** + * + */ +export class SMDBSetupServicesApi extends runtime.BaseAPI { + + /** + * GET the list of configured SMDB CUBE services + * GET the list of configured SMDB CUBE services + */ + async cubeListGetApiV1SMDBCUBEListGetRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<any>>> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/api/v1/SMDB/CUBE/list/`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse<any>(response); + } + + /** + * GET the list of configured SMDB CUBE services + * GET the list of configured SMDB CUBE services + */ + async cubeListGetApiV1SMDBCUBEListGet(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<any>> { + const response = await this.cubeListGetApiV1SMDBCUBEListGetRaw(initOverrides); + return await response.value(); + } + + /** + * GET detail info on a given SMDB CUBE resource + * GET detail on a specific CUBE resource + */ + async cubeResourceGetApiV1SMDBCUBECubeResourceGetRaw(requestParameters: CubeResourceGetApiV1SMDBCUBECubeResourceGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SMDBcubeReturnModel>> { + if (requestParameters['cubeResource'] == null) { + throw new runtime.RequiredError( + 'cubeResource', + 'Required parameter "cubeResource" was null or undefined when calling cubeResourceGetApiV1SMDBCUBECubeResourceGet().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/api/v1/SMDB/CUBE/{cubeResource}/`.replace(`{${"cubeResource"}}`, encodeURIComponent(String(requestParameters['cubeResource']))), + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => SMDBcubeReturnModelFromJSON(jsonValue)); + } + + /** + * GET detail info on a given SMDB CUBE resource + * GET detail on a specific CUBE resource + */ + async cubeResourceGetApiV1SMDBCUBECubeResourceGet(requestParameters: CubeResourceGetApiV1SMDBCUBECubeResourceGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SMDBcubeReturnModel> { + const response = await this.cubeResourceGetApiV1SMDBCUBECubeResourceGetRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * Update a CUBE resource within the SMDB module. Parameters ---------- - `swiftData`: an object with a name that defines a CUBE resource Return ------ - updated `CUBEdata` + * POST an update to a CUBE resource in the pypx SMDB object + */ + async sMDBobjCubeUpdateApiV1SMDBCUBEPostRaw(requestParameters: SMDBobjCubeUpdateApiV1SMDBCUBEPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SMDBcubeReturnModel>> { + if (requestParameters['sMDBcubeConfig'] == null) { + throw new runtime.RequiredError( + 'sMDBcubeConfig', + 'Required parameter "sMDBcubeConfig" was null or undefined when calling sMDBobjCubeUpdateApiV1SMDBCUBEPost().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request({ + path: `/api/v1/SMDB/CUBE/`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + body: SMDBcubeConfigToJSON(requestParameters['sMDBcubeConfig']), + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => SMDBcubeReturnModelFromJSON(jsonValue)); + } + + /** + * Update a CUBE resource within the SMDB module. Parameters ---------- - `swiftData`: an object with a name that defines a CUBE resource Return ------ - updated `CUBEdata` + * POST an update to a CUBE resource in the pypx SMDB object + */ + async sMDBobjCubeUpdateApiV1SMDBCUBEPost(requestParameters: SMDBobjCubeUpdateApiV1SMDBCUBEPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SMDBcubeReturnModel> { + const response = await this.sMDBobjCubeUpdateApiV1SMDBCUBEPostRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * Update a FS storage resource within the SMDB module. Parameters ---------- - `FSData`: an object with a name that defines a swift resource Return ------ - updated `FSData` + * POST an update to a FS storage resource in the pypx SMDB object + */ + async sMDBobjFsUpdateApiV1SMDBFSPostRaw(requestParameters: SMDBobjFsUpdateApiV1SMDBFSPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SMDBFsReturnModel>> { + if (requestParameters['sMDBFsConfig'] == null) { + throw new runtime.RequiredError( + 'sMDBFsConfig', + 'Required parameter "sMDBFsConfig" was null or undefined when calling sMDBobjFsUpdateApiV1SMDBFSPost().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request({ + path: `/api/v1/SMDB/FS/`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + body: SMDBFsConfigToJSON(requestParameters['sMDBFsConfig']), + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => SMDBFsReturnModelFromJSON(jsonValue)); + } + + /** + * Update a FS storage resource within the SMDB module. Parameters ---------- - `FSData`: an object with a name that defines a swift resource Return ------ - updated `FSData` + * POST an update to a FS storage resource in the pypx SMDB object + */ + async sMDBobjFsUpdateApiV1SMDBFSPost(requestParameters: SMDBobjFsUpdateApiV1SMDBFSPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SMDBFsReturnModel> { + const response = await this.sMDBobjFsUpdateApiV1SMDBFSPostRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * Update a swift resource within the SMDB module. Parameters ---------- - `swiftData`: an object with a name that defines a swift resource Return ------ - updated `swiftData` + * POST an update to a swift resource in the pypx SMDB object + */ + async sMDBobjSwiftUpdateApiV1SMDBSwiftPostRaw(requestParameters: SMDBobjSwiftUpdateApiV1SMDBSwiftPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<object>> { + if (requestParameters['sMDBswiftConfig'] == null) { + throw new runtime.RequiredError( + 'sMDBswiftConfig', + 'Required parameter "sMDBswiftConfig" was null or undefined when calling sMDBobjSwiftUpdateApiV1SMDBSwiftPost().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request({ + path: `/api/v1/SMDB/swift/`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + body: SMDBswiftConfigToJSON(requestParameters['sMDBswiftConfig']), + }, initOverrides); + + return new runtime.JSONApiResponse<any>(response); + } + + /** + * Update a swift resource within the SMDB module. Parameters ---------- - `swiftData`: an object with a name that defines a swift resource Return ------ - updated `swiftData` + * POST an update to a swift resource in the pypx SMDB object + */ + async sMDBobjSwiftUpdateApiV1SMDBSwiftPost(requestParameters: SMDBobjSwiftUpdateApiV1SMDBSwiftPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<object> { + const response = await this.sMDBobjSwiftUpdateApiV1SMDBSwiftPostRaw(requestParameters, initOverrides); + return await response.value(); + } + + /** + * GET the list of configured SMDB storage services + * GET the list of configured SMDB storage services + */ + async storageListGetApiV1SMDBStorageListGetRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<any>>> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/api/v1/SMDB/storage/list/`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse<any>(response); + } + + /** + * GET the list of configured SMDB storage services + * GET the list of configured SMDB storage services + */ + async storageListGetApiV1SMDBStorageListGet(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<any>> { + const response = await this.storageListGetApiV1SMDBStorageListGetRaw(initOverrides); + return await response.value(); + } + + /** + * GET detail info on a given SMDB storage resource + * GET detail on a specific storage resource + */ + async storageResourceGetApiV1SMDBStorageStorageResourceGetRaw(requestParameters: StorageResourceGetApiV1SMDBStorageStorageResourceGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<object>> { + if (requestParameters['storageResource'] == null) { + throw new runtime.RequiredError( + 'storageResource', + 'Required parameter "storageResource" was null or undefined when calling storageResourceGetApiV1SMDBStorageStorageResourceGet().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/api/v1/SMDB/storage/{storageResource}/`.replace(`{${"storageResource"}}`, encodeURIComponent(String(requestParameters['storageResource']))), + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse<any>(response); + } + + /** + * GET detail info on a given SMDB storage resource + * GET detail on a specific storage resource + */ + async storageResourceGetApiV1SMDBStorageStorageResourceGet(requestParameters: StorageResourceGetApiV1SMDBStorageStorageResourceGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<object> { + const response = await this.storageResourceGetApiV1SMDBStorageStorageResourceGetRaw(requestParameters, initOverrides); + return await response.value(); + } + +} diff --git a/src/api/pfdcm/generated/apis/index.ts b/src/api/pfdcm/generated/apis/index.ts new file mode 100644 index 000000000..4c1bb7d95 --- /dev/null +++ b/src/api/pfdcm/generated/apis/index.ts @@ -0,0 +1,8 @@ +/* tslint:disable */ +/* eslint-disable */ +export * from './DicomApi'; +export * from './ListenerSubsystemServicesApi'; +export * from './PACSQRServicesApi'; +export * from './PACSSetupServicesApi'; +export * from './PfdcmEnvironmentalDetailApi'; +export * from './SMDBSetupServicesApi'; diff --git a/src/api/pfdcm/generated/index.ts b/src/api/pfdcm/generated/index.ts new file mode 100644 index 000000000..bebe8bbbe --- /dev/null +++ b/src/api/pfdcm/generated/index.ts @@ -0,0 +1,5 @@ +/* tslint:disable */ +/* eslint-disable */ +export * from './runtime'; +export * from './apis/index'; +export * from './models/index'; diff --git a/src/api/pfdcm/generated/models/AboutModel.ts b/src/api/pfdcm/generated/models/AboutModel.ts new file mode 100644 index 000000000..cc372b602 --- /dev/null +++ b/src/api/pfdcm/generated/models/AboutModel.ts @@ -0,0 +1,76 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface AboutModel + */ +export interface AboutModel { + /** + * + * @type {string} + * @memberof AboutModel + */ + name?: string; + /** + * + * @type {string} + * @memberof AboutModel + */ + about?: string; + /** + * + * @type {string} + * @memberof AboutModel + */ + version?: string; +} + +/** + * Check if a given object implements the AboutModel interface. + */ +export function instanceOfAboutModel(value: object): value is AboutModel { + return true; +} + +export function AboutModelFromJSON(json: any): AboutModel { + return AboutModelFromJSONTyped(json, false); +} + +export function AboutModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): AboutModel { + if (json == null) { + return json; + } + return { + + 'name': json['name'] == null ? undefined : json['name'], + 'about': json['about'] == null ? undefined : json['about'], + 'version': json['version'] == null ? undefined : json['version'], + }; +} + +export function AboutModelToJSON(value?: AboutModel | null): any { + if (value == null) { + return value; + } + return { + + 'name': value['name'], + 'about': value['about'], + 'version': value['version'], + }; +} + diff --git a/src/api/pfdcm/generated/models/BodyPACSPypxApiV1PACSSyncPypxPost.ts b/src/api/pfdcm/generated/models/BodyPACSPypxApiV1PACSSyncPypxPost.ts new file mode 100644 index 000000000..fc5ef707a --- /dev/null +++ b/src/api/pfdcm/generated/models/BodyPACSPypxApiV1PACSSyncPypxPost.ts @@ -0,0 +1,92 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { PACSqueryCore } from './PACSqueryCore'; +import { + PACSqueryCoreFromJSON, + PACSqueryCoreFromJSONTyped, + PACSqueryCoreToJSON, +} from './PACSqueryCore'; +import type { ModelsPacsQRmodelValueStr } from './ModelsPacsQRmodelValueStr'; +import { + ModelsPacsQRmodelValueStrFromJSON, + ModelsPacsQRmodelValueStrFromJSONTyped, + ModelsPacsQRmodelValueStrToJSON, +} from './ModelsPacsQRmodelValueStr'; + +/** + * + * @export + * @interface BodyPACSPypxApiV1PACSSyncPypxPost + */ +export interface BodyPACSPypxApiV1PACSSyncPypxPost { + /** + * + * @type {ModelsPacsQRmodelValueStr} + * @memberof BodyPACSPypxApiV1PACSSyncPypxPost + */ + pACSservice: ModelsPacsQRmodelValueStr; + /** + * + * @type {ModelsPacsQRmodelValueStr} + * @memberof BodyPACSPypxApiV1PACSSyncPypxPost + */ + listenerService: ModelsPacsQRmodelValueStr; + /** + * + * @type {PACSqueryCore} + * @memberof BodyPACSPypxApiV1PACSSyncPypxPost + */ + pACSdirective: PACSqueryCore; +} + +/** + * Check if a given object implements the BodyPACSPypxApiV1PACSSyncPypxPost interface. + */ +export function instanceOfBodyPACSPypxApiV1PACSSyncPypxPost(value: object): value is BodyPACSPypxApiV1PACSSyncPypxPost { + if (!('pACSservice' in value) || value['pACSservice'] === undefined) return false; + if (!('listenerService' in value) || value['listenerService'] === undefined) return false; + if (!('pACSdirective' in value) || value['pACSdirective'] === undefined) return false; + return true; +} + +export function BodyPACSPypxApiV1PACSSyncPypxPostFromJSON(json: any): BodyPACSPypxApiV1PACSSyncPypxPost { + return BodyPACSPypxApiV1PACSSyncPypxPostFromJSONTyped(json, false); +} + +export function BodyPACSPypxApiV1PACSSyncPypxPostFromJSONTyped(json: any, ignoreDiscriminator: boolean): BodyPACSPypxApiV1PACSSyncPypxPost { + if (json == null) { + return json; + } + return { + + 'pACSservice': ModelsPacsQRmodelValueStrFromJSON(json['PACSservice']), + 'listenerService': ModelsPacsQRmodelValueStrFromJSON(json['listenerService']), + 'pACSdirective': PACSqueryCoreFromJSON(json['PACSdirective']), + }; +} + +export function BodyPACSPypxApiV1PACSSyncPypxPostToJSON(value?: BodyPACSPypxApiV1PACSSyncPypxPost | null): any { + if (value == null) { + return value; + } + return { + + 'PACSservice': ModelsPacsQRmodelValueStrToJSON(value['pACSservice']), + 'listenerService': ModelsPacsQRmodelValueStrToJSON(value['listenerService']), + 'PACSdirective': PACSqueryCoreToJSON(value['pACSdirective']), + }; +} + diff --git a/src/api/pfdcm/generated/models/BodyPACSServiceHandlerApiV1PACSThreadPypxPost.ts b/src/api/pfdcm/generated/models/BodyPACSServiceHandlerApiV1PACSThreadPypxPost.ts new file mode 100644 index 000000000..dd9b1085f --- /dev/null +++ b/src/api/pfdcm/generated/models/BodyPACSServiceHandlerApiV1PACSThreadPypxPost.ts @@ -0,0 +1,92 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { PACSqueryCore } from './PACSqueryCore'; +import { + PACSqueryCoreFromJSON, + PACSqueryCoreFromJSONTyped, + PACSqueryCoreToJSON, +} from './PACSqueryCore'; +import type { ModelsPacsQRmodelValueStr } from './ModelsPacsQRmodelValueStr'; +import { + ModelsPacsQRmodelValueStrFromJSON, + ModelsPacsQRmodelValueStrFromJSONTyped, + ModelsPacsQRmodelValueStrToJSON, +} from './ModelsPacsQRmodelValueStr'; + +/** + * + * @export + * @interface BodyPACSServiceHandlerApiV1PACSThreadPypxPost + */ +export interface BodyPACSServiceHandlerApiV1PACSThreadPypxPost { + /** + * + * @type {ModelsPacsQRmodelValueStr} + * @memberof BodyPACSServiceHandlerApiV1PACSThreadPypxPost + */ + pACSservice: ModelsPacsQRmodelValueStr; + /** + * + * @type {ModelsPacsQRmodelValueStr} + * @memberof BodyPACSServiceHandlerApiV1PACSThreadPypxPost + */ + listenerService: ModelsPacsQRmodelValueStr; + /** + * + * @type {PACSqueryCore} + * @memberof BodyPACSServiceHandlerApiV1PACSThreadPypxPost + */ + pACSdirective: PACSqueryCore; +} + +/** + * Check if a given object implements the BodyPACSServiceHandlerApiV1PACSThreadPypxPost interface. + */ +export function instanceOfBodyPACSServiceHandlerApiV1PACSThreadPypxPost(value: object): value is BodyPACSServiceHandlerApiV1PACSThreadPypxPost { + if (!('pACSservice' in value) || value['pACSservice'] === undefined) return false; + if (!('listenerService' in value) || value['listenerService'] === undefined) return false; + if (!('pACSdirective' in value) || value['pACSdirective'] === undefined) return false; + return true; +} + +export function BodyPACSServiceHandlerApiV1PACSThreadPypxPostFromJSON(json: any): BodyPACSServiceHandlerApiV1PACSThreadPypxPost { + return BodyPACSServiceHandlerApiV1PACSThreadPypxPostFromJSONTyped(json, false); +} + +export function BodyPACSServiceHandlerApiV1PACSThreadPypxPostFromJSONTyped(json: any, ignoreDiscriminator: boolean): BodyPACSServiceHandlerApiV1PACSThreadPypxPost { + if (json == null) { + return json; + } + return { + + 'pACSservice': ModelsPacsQRmodelValueStrFromJSON(json['PACSservice']), + 'listenerService': ModelsPacsQRmodelValueStrFromJSON(json['listenerService']), + 'pACSdirective': PACSqueryCoreFromJSON(json['PACSdirective']), + }; +} + +export function BodyPACSServiceHandlerApiV1PACSThreadPypxPostToJSON(value?: BodyPACSServiceHandlerApiV1PACSThreadPypxPost | null): any { + if (value == null) { + return value; + } + return { + + 'PACSservice': ModelsPacsQRmodelValueStrToJSON(value['pACSservice']), + 'listenerService': ModelsPacsQRmodelValueStrToJSON(value['listenerService']), + 'PACSdirective': PACSqueryCoreToJSON(value['pACSdirective']), + }; +} + diff --git a/src/api/pfdcm/generated/models/BodyPACSobjPortUpdateApiV1PACSservicePortPost.ts b/src/api/pfdcm/generated/models/BodyPACSobjPortUpdateApiV1PACSservicePortPost.ts new file mode 100644 index 000000000..b139ee347 --- /dev/null +++ b/src/api/pfdcm/generated/models/BodyPACSobjPortUpdateApiV1PACSservicePortPost.ts @@ -0,0 +1,77 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ModelsPacsSetupModelValueStr } from './ModelsPacsSetupModelValueStr'; +import { + ModelsPacsSetupModelValueStrFromJSON, + ModelsPacsSetupModelValueStrFromJSONTyped, + ModelsPacsSetupModelValueStrToJSON, +} from './ModelsPacsSetupModelValueStr'; + +/** + * + * @export + * @interface BodyPACSobjPortUpdateApiV1PACSservicePortPost + */ +export interface BodyPACSobjPortUpdateApiV1PACSservicePortPost { + /** + * + * @type {ModelsPacsSetupModelValueStr} + * @memberof BodyPACSobjPortUpdateApiV1PACSservicePortPost + */ + objToUpdate: ModelsPacsSetupModelValueStr; + /** + * + * @type {ModelsPacsSetupModelValueStr} + * @memberof BodyPACSobjPortUpdateApiV1PACSservicePortPost + */ + newPort: ModelsPacsSetupModelValueStr; +} + +/** + * Check if a given object implements the BodyPACSobjPortUpdateApiV1PACSservicePortPost interface. + */ +export function instanceOfBodyPACSobjPortUpdateApiV1PACSservicePortPost(value: object): value is BodyPACSobjPortUpdateApiV1PACSservicePortPost { + if (!('objToUpdate' in value) || value['objToUpdate'] === undefined) return false; + if (!('newPort' in value) || value['newPort'] === undefined) return false; + return true; +} + +export function BodyPACSobjPortUpdateApiV1PACSservicePortPostFromJSON(json: any): BodyPACSobjPortUpdateApiV1PACSservicePortPost { + return BodyPACSobjPortUpdateApiV1PACSservicePortPostFromJSONTyped(json, false); +} + +export function BodyPACSobjPortUpdateApiV1PACSservicePortPostFromJSONTyped(json: any, ignoreDiscriminator: boolean): BodyPACSobjPortUpdateApiV1PACSservicePortPost { + if (json == null) { + return json; + } + return { + + 'objToUpdate': ModelsPacsSetupModelValueStrFromJSON(json['objToUpdate']), + 'newPort': ModelsPacsSetupModelValueStrFromJSON(json['newPort']), + }; +} + +export function BodyPACSobjPortUpdateApiV1PACSservicePortPostToJSON(value?: BodyPACSobjPortUpdateApiV1PACSservicePortPost | null): any { + if (value == null) { + return value; + } + return { + + 'objToUpdate': ModelsPacsSetupModelValueStrToJSON(value['objToUpdate']), + 'newPort': ModelsPacsSetupModelValueStrToJSON(value['newPort']), + }; +} + diff --git a/src/api/pfdcm/generated/models/DcmtkCore.ts b/src/api/pfdcm/generated/models/DcmtkCore.ts new file mode 100644 index 000000000..dfc5011f1 --- /dev/null +++ b/src/api/pfdcm/generated/models/DcmtkCore.ts @@ -0,0 +1,106 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface DcmtkCore + */ +export interface DcmtkCore { + /** + * + * @type {string} + * @memberof DcmtkCore + */ + storescu: string; + /** + * + * @type {string} + * @memberof DcmtkCore + */ + storescp: string; + /** + * + * @type {string} + * @memberof DcmtkCore + */ + findscu: string; + /** + * + * @type {string} + * @memberof DcmtkCore + */ + movescu: string; + /** + * + * @type {string} + * @memberof DcmtkCore + */ + echoscu: string; + /** + * + * @type {string} + * @memberof DcmtkCore + */ + receiver: string; +} + +/** + * Check if a given object implements the DcmtkCore interface. + */ +export function instanceOfDcmtkCore(value: object): value is DcmtkCore { + if (!('storescu' in value) || value['storescu'] === undefined) return false; + if (!('storescp' in value) || value['storescp'] === undefined) return false; + if (!('findscu' in value) || value['findscu'] === undefined) return false; + if (!('movescu' in value) || value['movescu'] === undefined) return false; + if (!('echoscu' in value) || value['echoscu'] === undefined) return false; + if (!('receiver' in value) || value['receiver'] === undefined) return false; + return true; +} + +export function DcmtkCoreFromJSON(json: any): DcmtkCore { + return DcmtkCoreFromJSONTyped(json, false); +} + +export function DcmtkCoreFromJSONTyped(json: any, ignoreDiscriminator: boolean): DcmtkCore { + if (json == null) { + return json; + } + return { + + 'storescu': json['storescu'], + 'storescp': json['storescp'], + 'findscu': json['findscu'], + 'movescu': json['movescu'], + 'echoscu': json['echoscu'], + 'receiver': json['receiver'], + }; +} + +export function DcmtkCoreToJSON(value?: DcmtkCore | null): any { + if (value == null) { + return value; + } + return { + + 'storescu': value['storescu'], + 'storescp': value['storescp'], + 'findscu': value['findscu'], + 'movescu': value['movescu'], + 'echoscu': value['echoscu'], + 'receiver': value['receiver'], + }; +} + diff --git a/src/api/pfdcm/generated/models/DcmtkDBPutModel.ts b/src/api/pfdcm/generated/models/DcmtkDBPutModel.ts new file mode 100644 index 000000000..5f3dd82ae --- /dev/null +++ b/src/api/pfdcm/generated/models/DcmtkDBPutModel.ts @@ -0,0 +1,68 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { DcmtkCore } from './DcmtkCore'; +import { + DcmtkCoreFromJSON, + DcmtkCoreFromJSONTyped, + DcmtkCoreToJSON, +} from './DcmtkCore'; + +/** + * + * @export + * @interface DcmtkDBPutModel + */ +export interface DcmtkDBPutModel { + /** + * + * @type {DcmtkCore} + * @memberof DcmtkDBPutModel + */ + info: DcmtkCore; +} + +/** + * Check if a given object implements the DcmtkDBPutModel interface. + */ +export function instanceOfDcmtkDBPutModel(value: object): value is DcmtkDBPutModel { + if (!('info' in value) || value['info'] === undefined) return false; + return true; +} + +export function DcmtkDBPutModelFromJSON(json: any): DcmtkDBPutModel { + return DcmtkDBPutModelFromJSONTyped(json, false); +} + +export function DcmtkDBPutModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): DcmtkDBPutModel { + if (json == null) { + return json; + } + return { + + 'info': DcmtkCoreFromJSON(json['info']), + }; +} + +export function DcmtkDBPutModelToJSON(value?: DcmtkDBPutModel | null): any { + if (value == null) { + return value; + } + return { + + 'info': DcmtkCoreToJSON(value['info']), + }; +} + diff --git a/src/api/pfdcm/generated/models/DcmtkDBReturnModel.ts b/src/api/pfdcm/generated/models/DcmtkDBReturnModel.ts new file mode 100644 index 000000000..ca92687ef --- /dev/null +++ b/src/api/pfdcm/generated/models/DcmtkDBReturnModel.ts @@ -0,0 +1,101 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ModelsListenerModelTime } from './ModelsListenerModelTime'; +import { + ModelsListenerModelTimeFromJSON, + ModelsListenerModelTimeFromJSONTyped, + ModelsListenerModelTimeToJSON, +} from './ModelsListenerModelTime'; +import type { DcmtkCore } from './DcmtkCore'; +import { + DcmtkCoreFromJSON, + DcmtkCoreFromJSONTyped, + DcmtkCoreToJSON, +} from './DcmtkCore'; + +/** + * + * @export + * @interface DcmtkDBReturnModel + */ +export interface DcmtkDBReturnModel { + /** + * + * @type {DcmtkCore} + * @memberof DcmtkDBReturnModel + */ + info: DcmtkCore; + /** + * + * @type {ModelsListenerModelTime} + * @memberof DcmtkDBReturnModel + */ + timeCreated: ModelsListenerModelTime; + /** + * + * @type {ModelsListenerModelTime} + * @memberof DcmtkDBReturnModel + */ + timeModified: ModelsListenerModelTime; + /** + * + * @type {string} + * @memberof DcmtkDBReturnModel + */ + message: string; +} + +/** + * Check if a given object implements the DcmtkDBReturnModel interface. + */ +export function instanceOfDcmtkDBReturnModel(value: object): value is DcmtkDBReturnModel { + if (!('info' in value) || value['info'] === undefined) return false; + if (!('timeCreated' in value) || value['timeCreated'] === undefined) return false; + if (!('timeModified' in value) || value['timeModified'] === undefined) return false; + if (!('message' in value) || value['message'] === undefined) return false; + return true; +} + +export function DcmtkDBReturnModelFromJSON(json: any): DcmtkDBReturnModel { + return DcmtkDBReturnModelFromJSONTyped(json, false); +} + +export function DcmtkDBReturnModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): DcmtkDBReturnModel { + if (json == null) { + return json; + } + return { + + 'info': DcmtkCoreFromJSON(json['info']), + 'timeCreated': ModelsListenerModelTimeFromJSON(json['time_created']), + 'timeModified': ModelsListenerModelTimeFromJSON(json['time_modified']), + 'message': json['message'], + }; +} + +export function DcmtkDBReturnModelToJSON(value?: DcmtkDBReturnModel | null): any { + if (value == null) { + return value; + } + return { + + 'info': DcmtkCoreToJSON(value['info']), + 'time_created': ModelsListenerModelTimeToJSON(value['timeCreated']), + 'time_modified': ModelsListenerModelTimeToJSON(value['timeModified']), + 'message': value['message'], + }; +} + diff --git a/src/api/pfdcm/generated/models/Dicom.ts b/src/api/pfdcm/generated/models/Dicom.ts new file mode 100644 index 000000000..8e1c840ae --- /dev/null +++ b/src/api/pfdcm/generated/models/Dicom.ts @@ -0,0 +1,60 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * Not actually a DICOM, just some JSON. + * @export + * @interface Dicom + */ +export interface Dicom { + /** + * A longer sentence about nothing much + * @type {string} + * @memberof Dicom + */ + aCoolPicture?: string; +} + +/** + * Check if a given object implements the Dicom interface. + */ +export function instanceOfDicom(value: object): value is Dicom { + return true; +} + +export function DicomFromJSON(json: any): Dicom { + return DicomFromJSONTyped(json, false); +} + +export function DicomFromJSONTyped(json: any, ignoreDiscriminator: boolean): Dicom { + if (json == null) { + return json; + } + return { + + 'aCoolPicture': json['a_cool_picture'] == null ? undefined : json['a_cool_picture'], + }; +} + +export function DicomToJSON(value?: Dicom | null): any { + if (value == null) { + return value; + } + return { + + 'a_cool_picture': value['aCoolPicture'], + }; +} + diff --git a/src/api/pfdcm/generated/models/EchoModel.ts b/src/api/pfdcm/generated/models/EchoModel.ts new file mode 100644 index 000000000..78c2f39d1 --- /dev/null +++ b/src/api/pfdcm/generated/models/EchoModel.ts @@ -0,0 +1,61 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * Simply echo back whatever is POSTed to this API endpoing + * @export + * @interface EchoModel + */ +export interface EchoModel { + /** + * + * @type {string} + * @memberof EchoModel + */ + msg: string; +} + +/** + * Check if a given object implements the EchoModel interface. + */ +export function instanceOfEchoModel(value: object): value is EchoModel { + if (!('msg' in value) || value['msg'] === undefined) return false; + return true; +} + +export function EchoModelFromJSON(json: any): EchoModel { + return EchoModelFromJSONTyped(json, false); +} + +export function EchoModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): EchoModel { + if (json == null) { + return json; + } + return { + + 'msg': json['msg'], + }; +} + +export function EchoModelToJSON(value?: EchoModel | null): any { + if (value == null) { + return value; + } + return { + + 'msg': value['msg'], + }; +} + diff --git a/src/api/pfdcm/generated/models/HTTPValidationError.ts b/src/api/pfdcm/generated/models/HTTPValidationError.ts new file mode 100644 index 000000000..3547980fc --- /dev/null +++ b/src/api/pfdcm/generated/models/HTTPValidationError.ts @@ -0,0 +1,67 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ValidationError } from './ValidationError'; +import { + ValidationErrorFromJSON, + ValidationErrorFromJSONTyped, + ValidationErrorToJSON, +} from './ValidationError'; + +/** + * + * @export + * @interface HTTPValidationError + */ +export interface HTTPValidationError { + /** + * + * @type {Array<ValidationError>} + * @memberof HTTPValidationError + */ + detail?: Array<ValidationError>; +} + +/** + * Check if a given object implements the HTTPValidationError interface. + */ +export function instanceOfHTTPValidationError(value: object): value is HTTPValidationError { + return true; +} + +export function HTTPValidationErrorFromJSON(json: any): HTTPValidationError { + return HTTPValidationErrorFromJSONTyped(json, false); +} + +export function HTTPValidationErrorFromJSONTyped(json: any, ignoreDiscriminator: boolean): HTTPValidationError { + if (json == null) { + return json; + } + return { + + 'detail': json['detail'] == null ? undefined : ((json['detail'] as Array<any>).map(ValidationErrorFromJSON)), + }; +} + +export function HTTPValidationErrorToJSON(value?: HTTPValidationError | null): any { + if (value == null) { + return value; + } + return { + + 'detail': value['detail'] == null ? undefined : ((value['detail'] as Array<any>).map(ValidationErrorToJSON)), + }; +} + diff --git a/src/api/pfdcm/generated/models/HelloModel.ts b/src/api/pfdcm/generated/models/HelloModel.ts new file mode 100644 index 000000000..b3af2d260 --- /dev/null +++ b/src/api/pfdcm/generated/models/HelloModel.ts @@ -0,0 +1,97 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { SysInfoModel } from './SysInfoModel'; +import { + SysInfoModelFromJSON, + SysInfoModelFromJSONTyped, + SysInfoModelToJSON, +} from './SysInfoModel'; +import type { EchoModel } from './EchoModel'; +import { + EchoModelFromJSON, + EchoModelFromJSONTyped, + EchoModelToJSON, +} from './EchoModel'; + +/** + * The model describing the relevant "hello" data + * @export + * @interface HelloModel + */ +export interface HelloModel { + /** + * + * @type {string} + * @memberof HelloModel + */ + name?: string; + /** + * + * @type {string} + * @memberof HelloModel + */ + version?: string; + /** + * + * @type {SysInfoModel} + * @memberof HelloModel + */ + sysinfo?: SysInfoModel; + /** + * + * @type {EchoModel} + * @memberof HelloModel + */ + echoBack?: EchoModel; +} + +/** + * Check if a given object implements the HelloModel interface. + */ +export function instanceOfHelloModel(value: object): value is HelloModel { + return true; +} + +export function HelloModelFromJSON(json: any): HelloModel { + return HelloModelFromJSONTyped(json, false); +} + +export function HelloModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): HelloModel { + if (json == null) { + return json; + } + return { + + 'name': json['name'] == null ? undefined : json['name'], + 'version': json['version'] == null ? undefined : json['version'], + 'sysinfo': json['sysinfo'] == null ? undefined : SysInfoModelFromJSON(json['sysinfo']), + 'echoBack': json['echoBack'] == null ? undefined : EchoModelFromJSON(json['echoBack']), + }; +} + +export function HelloModelToJSON(value?: HelloModel | null): any { + if (value == null) { + return value; + } + return { + + 'name': value['name'], + 'version': value['version'], + 'sysinfo': SysInfoModelToJSON(value['sysinfo']), + 'echoBack': EchoModelToJSON(value['echoBack']), + }; +} + diff --git a/src/api/pfdcm/generated/models/ListenerDBreturnModel.ts b/src/api/pfdcm/generated/models/ListenerDBreturnModel.ts new file mode 100644 index 000000000..dd2ed6429 --- /dev/null +++ b/src/api/pfdcm/generated/models/ListenerDBreturnModel.ts @@ -0,0 +1,83 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { XinetdDBReturnModel } from './XinetdDBReturnModel'; +import { + XinetdDBReturnModelFromJSON, + XinetdDBReturnModelFromJSONTyped, + XinetdDBReturnModelToJSON, +} from './XinetdDBReturnModel'; +import type { DcmtkDBReturnModel } from './DcmtkDBReturnModel'; +import { + DcmtkDBReturnModelFromJSON, + DcmtkDBReturnModelFromJSONTyped, + DcmtkDBReturnModelToJSON, +} from './DcmtkDBReturnModel'; + +/** + * A full model that is returned from a call to the DB + * @export + * @interface ListenerDBreturnModel + */ +export interface ListenerDBreturnModel { + /** + * + * @type {XinetdDBReturnModel} + * @memberof ListenerDBreturnModel + */ + xinetd: XinetdDBReturnModel; + /** + * + * @type {DcmtkDBReturnModel} + * @memberof ListenerDBreturnModel + */ + dcmtk: DcmtkDBReturnModel; +} + +/** + * Check if a given object implements the ListenerDBreturnModel interface. + */ +export function instanceOfListenerDBreturnModel(value: object): value is ListenerDBreturnModel { + if (!('xinetd' in value) || value['xinetd'] === undefined) return false; + if (!('dcmtk' in value) || value['dcmtk'] === undefined) return false; + return true; +} + +export function ListenerDBreturnModelFromJSON(json: any): ListenerDBreturnModel { + return ListenerDBreturnModelFromJSONTyped(json, false); +} + +export function ListenerDBreturnModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): ListenerDBreturnModel { + if (json == null) { + return json; + } + return { + + 'xinetd': XinetdDBReturnModelFromJSON(json['xinetd']), + 'dcmtk': DcmtkDBReturnModelFromJSON(json['dcmtk']), + }; +} + +export function ListenerDBreturnModelToJSON(value?: ListenerDBreturnModel | null): any { + if (value == null) { + return value; + } + return { + + 'xinetd': XinetdDBReturnModelToJSON(value['xinetd']), + 'dcmtk': DcmtkDBReturnModelToJSON(value['dcmtk']), + }; +} + diff --git a/src/api/pfdcm/generated/models/ListenerHandlerStatus.ts b/src/api/pfdcm/generated/models/ListenerHandlerStatus.ts new file mode 100644 index 000000000..5e5e5d5d0 --- /dev/null +++ b/src/api/pfdcm/generated/models/ListenerHandlerStatus.ts @@ -0,0 +1,61 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface ListenerHandlerStatus + */ +export interface ListenerHandlerStatus { + /** + * + * @type {boolean} + * @memberof ListenerHandlerStatus + */ + status: boolean; +} + +/** + * Check if a given object implements the ListenerHandlerStatus interface. + */ +export function instanceOfListenerHandlerStatus(value: object): value is ListenerHandlerStatus { + if (!('status' in value) || value['status'] === undefined) return false; + return true; +} + +export function ListenerHandlerStatusFromJSON(json: any): ListenerHandlerStatus { + return ListenerHandlerStatusFromJSONTyped(json, false); +} + +export function ListenerHandlerStatusFromJSONTyped(json: any, ignoreDiscriminator: boolean): ListenerHandlerStatus { + if (json == null) { + return json; + } + return { + + 'status': json['status'], + }; +} + +export function ListenerHandlerStatusToJSON(value?: ListenerHandlerStatus | null): any { + if (value == null) { + return value; + } + return { + + 'status': value['status'], + }; +} + diff --git a/src/api/pfdcm/generated/models/LocationInner.ts b/src/api/pfdcm/generated/models/LocationInner.ts new file mode 100644 index 000000000..769423a85 --- /dev/null +++ b/src/api/pfdcm/generated/models/LocationInner.ts @@ -0,0 +1,42 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface LocationInner + */ +export interface LocationInner { +} + +/** + * Check if a given object implements the LocationInner interface. + */ +export function instanceOfLocationInner(value: object): value is LocationInner { + return true; +} + +export function LocationInnerFromJSON(json: any): LocationInner { + return LocationInnerFromJSONTyped(json, false); +} + +export function LocationInnerFromJSONTyped(json: any, ignoreDiscriminator: boolean): LocationInner { + return json; +} + +export function LocationInnerToJSON(value?: LocationInner | null): any { + return value; +} + diff --git a/src/api/pfdcm/generated/models/ModelsListenerModelTime.ts b/src/api/pfdcm/generated/models/ModelsListenerModelTime.ts new file mode 100644 index 000000000..65d0d5d87 --- /dev/null +++ b/src/api/pfdcm/generated/models/ModelsListenerModelTime.ts @@ -0,0 +1,61 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * A simple model that has a time string field + * @export + * @interface ModelsListenerModelTime + */ +export interface ModelsListenerModelTime { + /** + * + * @type {string} + * @memberof ModelsListenerModelTime + */ + time: string; +} + +/** + * Check if a given object implements the ModelsListenerModelTime interface. + */ +export function instanceOfModelsListenerModelTime(value: object): value is ModelsListenerModelTime { + if (!('time' in value) || value['time'] === undefined) return false; + return true; +} + +export function ModelsListenerModelTimeFromJSON(json: any): ModelsListenerModelTime { + return ModelsListenerModelTimeFromJSONTyped(json, false); +} + +export function ModelsListenerModelTimeFromJSONTyped(json: any, ignoreDiscriminator: boolean): ModelsListenerModelTime { + if (json == null) { + return json; + } + return { + + 'time': json['time'], + }; +} + +export function ModelsListenerModelTimeToJSON(value?: ModelsListenerModelTime | null): any { + if (value == null) { + return value; + } + return { + + 'time': value['time'], + }; +} + diff --git a/src/api/pfdcm/generated/models/ModelsListenerModelValueStr.ts b/src/api/pfdcm/generated/models/ModelsListenerModelValueStr.ts new file mode 100644 index 000000000..38aa2a83a --- /dev/null +++ b/src/api/pfdcm/generated/models/ModelsListenerModelValueStr.ts @@ -0,0 +1,60 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface ModelsListenerModelValueStr + */ +export interface ModelsListenerModelValueStr { + /** + * + * @type {string} + * @memberof ModelsListenerModelValueStr + */ + value?: string; +} + +/** + * Check if a given object implements the ModelsListenerModelValueStr interface. + */ +export function instanceOfModelsListenerModelValueStr(value: object): value is ModelsListenerModelValueStr { + return true; +} + +export function ModelsListenerModelValueStrFromJSON(json: any): ModelsListenerModelValueStr { + return ModelsListenerModelValueStrFromJSONTyped(json, false); +} + +export function ModelsListenerModelValueStrFromJSONTyped(json: any, ignoreDiscriminator: boolean): ModelsListenerModelValueStr { + if (json == null) { + return json; + } + return { + + 'value': json['value'] == null ? undefined : json['value'], + }; +} + +export function ModelsListenerModelValueStrToJSON(value?: ModelsListenerModelValueStr | null): any { + if (value == null) { + return value; + } + return { + + 'value': value['value'], + }; +} + diff --git a/src/api/pfdcm/generated/models/ModelsPacsQRmodelValueStr.ts b/src/api/pfdcm/generated/models/ModelsPacsQRmodelValueStr.ts new file mode 100644 index 000000000..19f0bb8a9 --- /dev/null +++ b/src/api/pfdcm/generated/models/ModelsPacsQRmodelValueStr.ts @@ -0,0 +1,60 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface ModelsPacsQRmodelValueStr + */ +export interface ModelsPacsQRmodelValueStr { + /** + * + * @type {string} + * @memberof ModelsPacsQRmodelValueStr + */ + value?: string; +} + +/** + * Check if a given object implements the ModelsPacsQRmodelValueStr interface. + */ +export function instanceOfModelsPacsQRmodelValueStr(value: object): value is ModelsPacsQRmodelValueStr { + return true; +} + +export function ModelsPacsQRmodelValueStrFromJSON(json: any): ModelsPacsQRmodelValueStr { + return ModelsPacsQRmodelValueStrFromJSONTyped(json, false); +} + +export function ModelsPacsQRmodelValueStrFromJSONTyped(json: any, ignoreDiscriminator: boolean): ModelsPacsQRmodelValueStr { + if (json == null) { + return json; + } + return { + + 'value': json['value'] == null ? undefined : json['value'], + }; +} + +export function ModelsPacsQRmodelValueStrToJSON(value?: ModelsPacsQRmodelValueStr | null): any { + if (value == null) { + return value; + } + return { + + 'value': value['value'], + }; +} + diff --git a/src/api/pfdcm/generated/models/ModelsPacsSetupModelTime.ts b/src/api/pfdcm/generated/models/ModelsPacsSetupModelTime.ts new file mode 100644 index 000000000..ab5e686aa --- /dev/null +++ b/src/api/pfdcm/generated/models/ModelsPacsSetupModelTime.ts @@ -0,0 +1,61 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * A simple model that has a time string field + * @export + * @interface ModelsPacsSetupModelTime + */ +export interface ModelsPacsSetupModelTime { + /** + * + * @type {string} + * @memberof ModelsPacsSetupModelTime + */ + time: string; +} + +/** + * Check if a given object implements the ModelsPacsSetupModelTime interface. + */ +export function instanceOfModelsPacsSetupModelTime(value: object): value is ModelsPacsSetupModelTime { + if (!('time' in value) || value['time'] === undefined) return false; + return true; +} + +export function ModelsPacsSetupModelTimeFromJSON(json: any): ModelsPacsSetupModelTime { + return ModelsPacsSetupModelTimeFromJSONTyped(json, false); +} + +export function ModelsPacsSetupModelTimeFromJSONTyped(json: any, ignoreDiscriminator: boolean): ModelsPacsSetupModelTime { + if (json == null) { + return json; + } + return { + + 'time': json['time'], + }; +} + +export function ModelsPacsSetupModelTimeToJSON(value?: ModelsPacsSetupModelTime | null): any { + if (value == null) { + return value; + } + return { + + 'time': value['time'], + }; +} + diff --git a/src/api/pfdcm/generated/models/ModelsPacsSetupModelValueStr.ts b/src/api/pfdcm/generated/models/ModelsPacsSetupModelValueStr.ts new file mode 100644 index 000000000..ba3f1ff20 --- /dev/null +++ b/src/api/pfdcm/generated/models/ModelsPacsSetupModelValueStr.ts @@ -0,0 +1,60 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface ModelsPacsSetupModelValueStr + */ +export interface ModelsPacsSetupModelValueStr { + /** + * + * @type {string} + * @memberof ModelsPacsSetupModelValueStr + */ + value?: string; +} + +/** + * Check if a given object implements the ModelsPacsSetupModelValueStr interface. + */ +export function instanceOfModelsPacsSetupModelValueStr(value: object): value is ModelsPacsSetupModelValueStr { + return true; +} + +export function ModelsPacsSetupModelValueStrFromJSON(json: any): ModelsPacsSetupModelValueStr { + return ModelsPacsSetupModelValueStrFromJSONTyped(json, false); +} + +export function ModelsPacsSetupModelValueStrFromJSONTyped(json: any, ignoreDiscriminator: boolean): ModelsPacsSetupModelValueStr { + if (json == null) { + return json; + } + return { + + 'value': json['value'] == null ? undefined : json['value'], + }; +} + +export function ModelsPacsSetupModelValueStrToJSON(value?: ModelsPacsSetupModelValueStr | null): any { + if (value == null) { + return value; + } + return { + + 'value': value['value'], + }; +} + diff --git a/src/api/pfdcm/generated/models/ModelsSmdbSetupModelValueStr.ts b/src/api/pfdcm/generated/models/ModelsSmdbSetupModelValueStr.ts new file mode 100644 index 000000000..169f10f83 --- /dev/null +++ b/src/api/pfdcm/generated/models/ModelsSmdbSetupModelValueStr.ts @@ -0,0 +1,60 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface ModelsSmdbSetupModelValueStr + */ +export interface ModelsSmdbSetupModelValueStr { + /** + * + * @type {string} + * @memberof ModelsSmdbSetupModelValueStr + */ + value?: string; +} + +/** + * Check if a given object implements the ModelsSmdbSetupModelValueStr interface. + */ +export function instanceOfModelsSmdbSetupModelValueStr(value: object): value is ModelsSmdbSetupModelValueStr { + return true; +} + +export function ModelsSmdbSetupModelValueStrFromJSON(json: any): ModelsSmdbSetupModelValueStr { + return ModelsSmdbSetupModelValueStrFromJSONTyped(json, false); +} + +export function ModelsSmdbSetupModelValueStrFromJSONTyped(json: any, ignoreDiscriminator: boolean): ModelsSmdbSetupModelValueStr { + if (json == null) { + return json; + } + return { + + 'value': json['value'] == null ? undefined : json['value'], + }; +} + +export function ModelsSmdbSetupModelValueStrToJSON(value?: ModelsSmdbSetupModelValueStr | null): any { + if (value == null) { + return value; + } + return { + + 'value': value['value'], + }; +} + diff --git a/src/api/pfdcm/generated/models/PACSasync.ts b/src/api/pfdcm/generated/models/PACSasync.ts new file mode 100644 index 000000000..ba5a89467 --- /dev/null +++ b/src/api/pfdcm/generated/models/PACSasync.ts @@ -0,0 +1,87 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * A model returned when an async PACS directive is indicated + * @export + * @interface PACSasync + */ +export interface PACSasync { + /** + * + * @type {string} + * @memberof PACSasync + */ + directiveType?: string; + /** + * + * @type {object} + * @memberof PACSasync + */ + response: object; + /** + * + * @type {string} + * @memberof PACSasync + */ + timestamp: string; + /** + * + * @type {object} + * @memberof PACSasync + */ + pACSdirective: object; +} + +/** + * Check if a given object implements the PACSasync interface. + */ +export function instanceOfPACSasync(value: object): value is PACSasync { + if (!('response' in value) || value['response'] === undefined) return false; + if (!('timestamp' in value) || value['timestamp'] === undefined) return false; + if (!('pACSdirective' in value) || value['pACSdirective'] === undefined) return false; + return true; +} + +export function PACSasyncFromJSON(json: any): PACSasync { + return PACSasyncFromJSONTyped(json, false); +} + +export function PACSasyncFromJSONTyped(json: any, ignoreDiscriminator: boolean): PACSasync { + if (json == null) { + return json; + } + return { + + 'directiveType': json['directiveType'] == null ? undefined : json['directiveType'], + 'response': json['response'], + 'timestamp': json['timestamp'], + 'pACSdirective': json['PACSdirective'], + }; +} + +export function PACSasyncToJSON(value?: PACSasync | null): any { + if (value == null) { + return value; + } + return { + + 'directiveType': value['directiveType'], + 'response': value['response'], + 'timestamp': value['timestamp'], + 'PACSdirective': value['pACSdirective'], + }; +} + diff --git a/src/api/pfdcm/generated/models/PACSdbPutModel.ts b/src/api/pfdcm/generated/models/PACSdbPutModel.ts new file mode 100644 index 000000000..27b7d39d0 --- /dev/null +++ b/src/api/pfdcm/generated/models/PACSdbPutModel.ts @@ -0,0 +1,68 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { PACSsetupCore } from './PACSsetupCore'; +import { + PACSsetupCoreFromJSON, + PACSsetupCoreFromJSONTyped, + PACSsetupCoreToJSON, +} from './PACSsetupCore'; + +/** + * Model that illustrates what to PUT to the DB + * @export + * @interface PACSdbPutModel + */ +export interface PACSdbPutModel { + /** + * + * @type {PACSsetupCore} + * @memberof PACSdbPutModel + */ + info: PACSsetupCore; +} + +/** + * Check if a given object implements the PACSdbPutModel interface. + */ +export function instanceOfPACSdbPutModel(value: object): value is PACSdbPutModel { + if (!('info' in value) || value['info'] === undefined) return false; + return true; +} + +export function PACSdbPutModelFromJSON(json: any): PACSdbPutModel { + return PACSdbPutModelFromJSONTyped(json, false); +} + +export function PACSdbPutModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): PACSdbPutModel { + if (json == null) { + return json; + } + return { + + 'info': PACSsetupCoreFromJSON(json['info']), + }; +} + +export function PACSdbPutModelToJSON(value?: PACSdbPutModel | null): any { + if (value == null) { + return value; + } + return { + + 'info': PACSsetupCoreToJSON(value['info']), + }; +} + diff --git a/src/api/pfdcm/generated/models/PACSdbReturnModel.ts b/src/api/pfdcm/generated/models/PACSdbReturnModel.ts new file mode 100644 index 000000000..3e3b9de65 --- /dev/null +++ b/src/api/pfdcm/generated/models/PACSdbReturnModel.ts @@ -0,0 +1,101 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ModelsPacsSetupModelTime } from './ModelsPacsSetupModelTime'; +import { + ModelsPacsSetupModelTimeFromJSON, + ModelsPacsSetupModelTimeFromJSONTyped, + ModelsPacsSetupModelTimeToJSON, +} from './ModelsPacsSetupModelTime'; +import type { PACSsetupCore } from './PACSsetupCore'; +import { + PACSsetupCoreFromJSON, + PACSsetupCoreFromJSONTyped, + PACSsetupCoreToJSON, +} from './PACSsetupCore'; + +/** + * A full model that is returned from a call to the DB + * @export + * @interface PACSdbReturnModel + */ +export interface PACSdbReturnModel { + /** + * + * @type {PACSsetupCore} + * @memberof PACSdbReturnModel + */ + info: PACSsetupCore; + /** + * + * @type {ModelsPacsSetupModelTime} + * @memberof PACSdbReturnModel + */ + timeCreated: ModelsPacsSetupModelTime; + /** + * + * @type {ModelsPacsSetupModelTime} + * @memberof PACSdbReturnModel + */ + timeModified: ModelsPacsSetupModelTime; + /** + * + * @type {string} + * @memberof PACSdbReturnModel + */ + message: string; +} + +/** + * Check if a given object implements the PACSdbReturnModel interface. + */ +export function instanceOfPACSdbReturnModel(value: object): value is PACSdbReturnModel { + if (!('info' in value) || value['info'] === undefined) return false; + if (!('timeCreated' in value) || value['timeCreated'] === undefined) return false; + if (!('timeModified' in value) || value['timeModified'] === undefined) return false; + if (!('message' in value) || value['message'] === undefined) return false; + return true; +} + +export function PACSdbReturnModelFromJSON(json: any): PACSdbReturnModel { + return PACSdbReturnModelFromJSONTyped(json, false); +} + +export function PACSdbReturnModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): PACSdbReturnModel { + if (json == null) { + return json; + } + return { + + 'info': PACSsetupCoreFromJSON(json['info']), + 'timeCreated': ModelsPacsSetupModelTimeFromJSON(json['time_created']), + 'timeModified': ModelsPacsSetupModelTimeFromJSON(json['time_modified']), + 'message': json['message'], + }; +} + +export function PACSdbReturnModelToJSON(value?: PACSdbReturnModel | null): any { + if (value == null) { + return value; + } + return { + + 'info': PACSsetupCoreToJSON(value['info']), + 'time_created': ModelsPacsSetupModelTimeToJSON(value['timeCreated']), + 'time_modified': ModelsPacsSetupModelTimeToJSON(value['timeModified']), + 'message': value['message'], + }; +} + diff --git a/src/api/pfdcm/generated/models/PACSqueryCore.ts b/src/api/pfdcm/generated/models/PACSqueryCore.ts new file mode 100644 index 000000000..aa894839f --- /dev/null +++ b/src/api/pfdcm/generated/models/PACSqueryCore.ts @@ -0,0 +1,252 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * The PACS Query model + * @export + * @interface PACSqueryCore + */ +export interface PACSqueryCore { + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + accessionNumber?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + patientID?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + patientName?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + patientBirthDate?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + patientAge?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + patientSex?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + studyDate?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + studyDescription?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + studyInstanceUID?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + modality?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + modalitiesInStudy?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + performedStationAETitle?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + numberOfSeriesRelatedInstances?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + instanceNumber?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + seriesDate?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + seriesDescription?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + seriesInstanceUID?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + protocolName?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + acquisitionProtocolDescription?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + acquisitionProtocolName?: string; + /** + * + * @type {boolean} + * @memberof PACSqueryCore + */ + withFeedBack?: boolean; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + then?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + thenArgs?: string; + /** + * + * @type {string} + * @memberof PACSqueryCore + */ + dblogbasepath?: string; + /** + * + * @type {boolean} + * @memberof PACSqueryCore + */ + jsonResponse?: boolean; +} + +/** + * Check if a given object implements the PACSqueryCore interface. + */ +export function instanceOfPACSqueryCore(value: object): value is PACSqueryCore { + return true; +} + +export function PACSqueryCoreFromJSON(json: any): PACSqueryCore { + return PACSqueryCoreFromJSONTyped(json, false); +} + +export function PACSqueryCoreFromJSONTyped(json: any, ignoreDiscriminator: boolean): PACSqueryCore { + if (json == null) { + return json; + } + return { + + 'accessionNumber': json['AccessionNumber'] == null ? undefined : json['AccessionNumber'], + 'patientID': json['PatientID'] == null ? undefined : json['PatientID'], + 'patientName': json['PatientName'] == null ? undefined : json['PatientName'], + 'patientBirthDate': json['PatientBirthDate'] == null ? undefined : json['PatientBirthDate'], + 'patientAge': json['PatientAge'] == null ? undefined : json['PatientAge'], + 'patientSex': json['PatientSex'] == null ? undefined : json['PatientSex'], + 'studyDate': json['StudyDate'] == null ? undefined : json['StudyDate'], + 'studyDescription': json['StudyDescription'] == null ? undefined : json['StudyDescription'], + 'studyInstanceUID': json['StudyInstanceUID'] == null ? undefined : json['StudyInstanceUID'], + 'modality': json['Modality'] == null ? undefined : json['Modality'], + 'modalitiesInStudy': json['ModalitiesInStudy'] == null ? undefined : json['ModalitiesInStudy'], + 'performedStationAETitle': json['PerformedStationAETitle'] == null ? undefined : json['PerformedStationAETitle'], + 'numberOfSeriesRelatedInstances': json['NumberOfSeriesRelatedInstances'] == null ? undefined : json['NumberOfSeriesRelatedInstances'], + 'instanceNumber': json['InstanceNumber'] == null ? undefined : json['InstanceNumber'], + 'seriesDate': json['SeriesDate'] == null ? undefined : json['SeriesDate'], + 'seriesDescription': json['SeriesDescription'] == null ? undefined : json['SeriesDescription'], + 'seriesInstanceUID': json['SeriesInstanceUID'] == null ? undefined : json['SeriesInstanceUID'], + 'protocolName': json['ProtocolName'] == null ? undefined : json['ProtocolName'], + 'acquisitionProtocolDescription': json['AcquisitionProtocolDescription'] == null ? undefined : json['AcquisitionProtocolDescription'], + 'acquisitionProtocolName': json['AcquisitionProtocolName'] == null ? undefined : json['AcquisitionProtocolName'], + 'withFeedBack': json['withFeedBack'] == null ? undefined : json['withFeedBack'], + 'then': json['then'] == null ? undefined : json['then'], + 'thenArgs': json['thenArgs'] == null ? undefined : json['thenArgs'], + 'dblogbasepath': json['dblogbasepath'] == null ? undefined : json['dblogbasepath'], + 'jsonResponse': json['json_response'] == null ? undefined : json['json_response'], + }; +} + +export function PACSqueryCoreToJSON(value?: PACSqueryCore | null): any { + if (value == null) { + return value; + } + return { + + 'AccessionNumber': value['accessionNumber'], + 'PatientID': value['patientID'], + 'PatientName': value['patientName'], + 'PatientBirthDate': value['patientBirthDate'], + 'PatientAge': value['patientAge'], + 'PatientSex': value['patientSex'], + 'StudyDate': value['studyDate'], + 'StudyDescription': value['studyDescription'], + 'StudyInstanceUID': value['studyInstanceUID'], + 'Modality': value['modality'], + 'ModalitiesInStudy': value['modalitiesInStudy'], + 'PerformedStationAETitle': value['performedStationAETitle'], + 'NumberOfSeriesRelatedInstances': value['numberOfSeriesRelatedInstances'], + 'InstanceNumber': value['instanceNumber'], + 'SeriesDate': value['seriesDate'], + 'SeriesDescription': value['seriesDescription'], + 'SeriesInstanceUID': value['seriesInstanceUID'], + 'ProtocolName': value['protocolName'], + 'AcquisitionProtocolDescription': value['acquisitionProtocolDescription'], + 'AcquisitionProtocolName': value['acquisitionProtocolName'], + 'withFeedBack': value['withFeedBack'], + 'then': value['then'], + 'thenArgs': value['thenArgs'], + 'dblogbasepath': value['dblogbasepath'], + 'json_response': value['jsonResponse'], + }; +} + diff --git a/src/api/pfdcm/generated/models/PACSsetupCore.ts b/src/api/pfdcm/generated/models/PACSsetupCore.ts new file mode 100644 index 000000000..60f529b21 --- /dev/null +++ b/src/api/pfdcm/generated/models/PACSsetupCore.ts @@ -0,0 +1,92 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * The PACS service model + * @export + * @interface PACSsetupCore + */ +export interface PACSsetupCore { + /** + * + * @type {string} + * @memberof PACSsetupCore + */ + aet?: string; + /** + * + * @type {string} + * @memberof PACSsetupCore + */ + aetListener?: string; + /** + * + * @type {string} + * @memberof PACSsetupCore + */ + aec?: string; + /** + * + * @type {string} + * @memberof PACSsetupCore + */ + serverIP?: string; + /** + * + * @type {string} + * @memberof PACSsetupCore + */ + serverPort?: string; +} + +/** + * Check if a given object implements the PACSsetupCore interface. + */ +export function instanceOfPACSsetupCore(value: object): value is PACSsetupCore { + return true; +} + +export function PACSsetupCoreFromJSON(json: any): PACSsetupCore { + return PACSsetupCoreFromJSONTyped(json, false); +} + +export function PACSsetupCoreFromJSONTyped(json: any, ignoreDiscriminator: boolean): PACSsetupCore { + if (json == null) { + return json; + } + return { + + 'aet': json['aet'] == null ? undefined : json['aet'], + 'aetListener': json['aet_listener'] == null ? undefined : json['aet_listener'], + 'aec': json['aec'] == null ? undefined : json['aec'], + 'serverIP': json['serverIP'] == null ? undefined : json['serverIP'], + 'serverPort': json['serverPort'] == null ? undefined : json['serverPort'], + }; +} + +export function PACSsetupCoreToJSON(value?: PACSsetupCore | null): any { + if (value == null) { + return value; + } + return { + + 'aet': value['aet'], + 'aet_listener': value['aetListener'], + 'aec': value['aec'], + 'serverIP': value['serverIP'], + 'serverPort': value['serverPort'], + }; +} + diff --git a/src/api/pfdcm/generated/models/SMDBFsConfig.ts b/src/api/pfdcm/generated/models/SMDBFsConfig.ts new file mode 100644 index 000000000..fe2f0aab1 --- /dev/null +++ b/src/api/pfdcm/generated/models/SMDBFsConfig.ts @@ -0,0 +1,83 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ModelsSmdbSetupModelValueStr } from './ModelsSmdbSetupModelValueStr'; +import { + ModelsSmdbSetupModelValueStrFromJSON, + ModelsSmdbSetupModelValueStrFromJSONTyped, + ModelsSmdbSetupModelValueStrToJSON, +} from './ModelsSmdbSetupModelValueStr'; +import type { SMDBFsCore } from './SMDBFsCore'; +import { + SMDBFsCoreFromJSON, + SMDBFsCoreFromJSONTyped, + SMDBFsCoreToJSON, +} from './SMDBFsCore'; + +/** + * The SMDB FS key config model + * @export + * @interface SMDBFsConfig + */ +export interface SMDBFsConfig { + /** + * + * @type {ModelsSmdbSetupModelValueStr} + * @memberof SMDBFsConfig + */ + fsKeyName: ModelsSmdbSetupModelValueStr; + /** + * + * @type {SMDBFsCore} + * @memberof SMDBFsConfig + */ + fsInfo: SMDBFsCore; +} + +/** + * Check if a given object implements the SMDBFsConfig interface. + */ +export function instanceOfSMDBFsConfig(value: object): value is SMDBFsConfig { + if (!('fsKeyName' in value) || value['fsKeyName'] === undefined) return false; + if (!('fsInfo' in value) || value['fsInfo'] === undefined) return false; + return true; +} + +export function SMDBFsConfigFromJSON(json: any): SMDBFsConfig { + return SMDBFsConfigFromJSONTyped(json, false); +} + +export function SMDBFsConfigFromJSONTyped(json: any, ignoreDiscriminator: boolean): SMDBFsConfig { + if (json == null) { + return json; + } + return { + + 'fsKeyName': ModelsSmdbSetupModelValueStrFromJSON(json['fsKeyName']), + 'fsInfo': SMDBFsCoreFromJSON(json['fsInfo']), + }; +} + +export function SMDBFsConfigToJSON(value?: SMDBFsConfig | null): any { + if (value == null) { + return value; + } + return { + + 'fsKeyName': ModelsSmdbSetupModelValueStrToJSON(value['fsKeyName']), + 'fsInfo': SMDBFsCoreToJSON(value['fsInfo']), + }; +} + diff --git a/src/api/pfdcm/generated/models/SMDBFsCore.ts b/src/api/pfdcm/generated/models/SMDBFsCore.ts new file mode 100644 index 000000000..485db73db --- /dev/null +++ b/src/api/pfdcm/generated/models/SMDBFsCore.ts @@ -0,0 +1,61 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * The SMDB file system service model + * @export + * @interface SMDBFsCore + */ +export interface SMDBFsCore { + /** + * + * @type {string} + * @memberof SMDBFsCore + */ + storepath: string; +} + +/** + * Check if a given object implements the SMDBFsCore interface. + */ +export function instanceOfSMDBFsCore(value: object): value is SMDBFsCore { + if (!('storepath' in value) || value['storepath'] === undefined) return false; + return true; +} + +export function SMDBFsCoreFromJSON(json: any): SMDBFsCore { + return SMDBFsCoreFromJSONTyped(json, false); +} + +export function SMDBFsCoreFromJSONTyped(json: any, ignoreDiscriminator: boolean): SMDBFsCore { + if (json == null) { + return json; + } + return { + + 'storepath': json['storepath'], + }; +} + +export function SMDBFsCoreToJSON(value?: SMDBFsCore | null): any { + if (value == null) { + return value; + } + return { + + 'storepath': value['storepath'], + }; +} + diff --git a/src/api/pfdcm/generated/models/SMDBFsReturnModel.ts b/src/api/pfdcm/generated/models/SMDBFsReturnModel.ts new file mode 100644 index 000000000..4e248dca8 --- /dev/null +++ b/src/api/pfdcm/generated/models/SMDBFsReturnModel.ts @@ -0,0 +1,85 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { SMDBFsCore } from './SMDBFsCore'; +import { + SMDBFsCoreFromJSON, + SMDBFsCoreFromJSONTyped, + SMDBFsCoreToJSON, +} from './SMDBFsCore'; + +/** + * A full model that is returned from a call to the DB + * @export + * @interface SMDBFsReturnModel + */ +export interface SMDBFsReturnModel { + /** + * + * @type {boolean} + * @memberof SMDBFsReturnModel + */ + status?: boolean; + /** + * + * @type {string} + * @memberof SMDBFsReturnModel + */ + fsKeyName: string; + /** + * + * @type {SMDBFsCore} + * @memberof SMDBFsReturnModel + */ + fsInfo: SMDBFsCore; +} + +/** + * Check if a given object implements the SMDBFsReturnModel interface. + */ +export function instanceOfSMDBFsReturnModel(value: object): value is SMDBFsReturnModel { + if (!('fsKeyName' in value) || value['fsKeyName'] === undefined) return false; + if (!('fsInfo' in value) || value['fsInfo'] === undefined) return false; + return true; +} + +export function SMDBFsReturnModelFromJSON(json: any): SMDBFsReturnModel { + return SMDBFsReturnModelFromJSONTyped(json, false); +} + +export function SMDBFsReturnModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): SMDBFsReturnModel { + if (json == null) { + return json; + } + return { + + 'status': json['status'] == null ? undefined : json['status'], + 'fsKeyName': json['fsKeyName'], + 'fsInfo': SMDBFsCoreFromJSON(json['fsInfo']), + }; +} + +export function SMDBFsReturnModelToJSON(value?: SMDBFsReturnModel | null): any { + if (value == null) { + return value; + } + return { + + 'status': value['status'], + 'fsKeyName': value['fsKeyName'], + 'fsInfo': SMDBFsCoreToJSON(value['fsInfo']), + }; +} + diff --git a/src/api/pfdcm/generated/models/SMDBcubeConfig.ts b/src/api/pfdcm/generated/models/SMDBcubeConfig.ts new file mode 100644 index 000000000..5668d959a --- /dev/null +++ b/src/api/pfdcm/generated/models/SMDBcubeConfig.ts @@ -0,0 +1,83 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ModelsSmdbSetupModelValueStr } from './ModelsSmdbSetupModelValueStr'; +import { + ModelsSmdbSetupModelValueStrFromJSON, + ModelsSmdbSetupModelValueStrFromJSONTyped, + ModelsSmdbSetupModelValueStrToJSON, +} from './ModelsSmdbSetupModelValueStr'; +import type { SMDBcubeCore } from './SMDBcubeCore'; +import { + SMDBcubeCoreFromJSON, + SMDBcubeCoreFromJSONTyped, + SMDBcubeCoreToJSON, +} from './SMDBcubeCore'; + +/** + * The SMDB cube key config model + * @export + * @interface SMDBcubeConfig + */ +export interface SMDBcubeConfig { + /** + * + * @type {ModelsSmdbSetupModelValueStr} + * @memberof SMDBcubeConfig + */ + cubeKeyName: ModelsSmdbSetupModelValueStr; + /** + * + * @type {SMDBcubeCore} + * @memberof SMDBcubeConfig + */ + cubeInfo: SMDBcubeCore; +} + +/** + * Check if a given object implements the SMDBcubeConfig interface. + */ +export function instanceOfSMDBcubeConfig(value: object): value is SMDBcubeConfig { + if (!('cubeKeyName' in value) || value['cubeKeyName'] === undefined) return false; + if (!('cubeInfo' in value) || value['cubeInfo'] === undefined) return false; + return true; +} + +export function SMDBcubeConfigFromJSON(json: any): SMDBcubeConfig { + return SMDBcubeConfigFromJSONTyped(json, false); +} + +export function SMDBcubeConfigFromJSONTyped(json: any, ignoreDiscriminator: boolean): SMDBcubeConfig { + if (json == null) { + return json; + } + return { + + 'cubeKeyName': ModelsSmdbSetupModelValueStrFromJSON(json['cubeKeyName']), + 'cubeInfo': SMDBcubeCoreFromJSON(json['cubeInfo']), + }; +} + +export function SMDBcubeConfigToJSON(value?: SMDBcubeConfig | null): any { + if (value == null) { + return value; + } + return { + + 'cubeKeyName': ModelsSmdbSetupModelValueStrToJSON(value['cubeKeyName']), + 'cubeInfo': SMDBcubeCoreToJSON(value['cubeInfo']), + }; +} + diff --git a/src/api/pfdcm/generated/models/SMDBcubeCore.ts b/src/api/pfdcm/generated/models/SMDBcubeCore.ts new file mode 100644 index 000000000..845ebd857 --- /dev/null +++ b/src/api/pfdcm/generated/models/SMDBcubeCore.ts @@ -0,0 +1,79 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * The SMDB cube service model + * @export + * @interface SMDBcubeCore + */ +export interface SMDBcubeCore { + /** + * + * @type {string} + * @memberof SMDBcubeCore + */ + url: string; + /** + * + * @type {string} + * @memberof SMDBcubeCore + */ + username: string; + /** + * + * @type {string} + * @memberof SMDBcubeCore + */ + password: string; +} + +/** + * Check if a given object implements the SMDBcubeCore interface. + */ +export function instanceOfSMDBcubeCore(value: object): value is SMDBcubeCore { + if (!('url' in value) || value['url'] === undefined) return false; + if (!('username' in value) || value['username'] === undefined) return false; + if (!('password' in value) || value['password'] === undefined) return false; + return true; +} + +export function SMDBcubeCoreFromJSON(json: any): SMDBcubeCore { + return SMDBcubeCoreFromJSONTyped(json, false); +} + +export function SMDBcubeCoreFromJSONTyped(json: any, ignoreDiscriminator: boolean): SMDBcubeCore { + if (json == null) { + return json; + } + return { + + 'url': json['url'], + 'username': json['username'], + 'password': json['password'], + }; +} + +export function SMDBcubeCoreToJSON(value?: SMDBcubeCore | null): any { + if (value == null) { + return value; + } + return { + + 'url': value['url'], + 'username': value['username'], + 'password': value['password'], + }; +} + diff --git a/src/api/pfdcm/generated/models/SMDBcubeReturnModel.ts b/src/api/pfdcm/generated/models/SMDBcubeReturnModel.ts new file mode 100644 index 000000000..a09dc5543 --- /dev/null +++ b/src/api/pfdcm/generated/models/SMDBcubeReturnModel.ts @@ -0,0 +1,85 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { SMDBcubeCore } from './SMDBcubeCore'; +import { + SMDBcubeCoreFromJSON, + SMDBcubeCoreFromJSONTyped, + SMDBcubeCoreToJSON, +} from './SMDBcubeCore'; + +/** + * A full model that is returned from a call to the DB + * @export + * @interface SMDBcubeReturnModel + */ +export interface SMDBcubeReturnModel { + /** + * + * @type {boolean} + * @memberof SMDBcubeReturnModel + */ + status?: boolean; + /** + * + * @type {string} + * @memberof SMDBcubeReturnModel + */ + cubeKeyName: string; + /** + * + * @type {SMDBcubeCore} + * @memberof SMDBcubeReturnModel + */ + cubeInfo: SMDBcubeCore; +} + +/** + * Check if a given object implements the SMDBcubeReturnModel interface. + */ +export function instanceOfSMDBcubeReturnModel(value: object): value is SMDBcubeReturnModel { + if (!('cubeKeyName' in value) || value['cubeKeyName'] === undefined) return false; + if (!('cubeInfo' in value) || value['cubeInfo'] === undefined) return false; + return true; +} + +export function SMDBcubeReturnModelFromJSON(json: any): SMDBcubeReturnModel { + return SMDBcubeReturnModelFromJSONTyped(json, false); +} + +export function SMDBcubeReturnModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): SMDBcubeReturnModel { + if (json == null) { + return json; + } + return { + + 'status': json['status'] == null ? undefined : json['status'], + 'cubeKeyName': json['cubeKeyName'], + 'cubeInfo': SMDBcubeCoreFromJSON(json['cubeInfo']), + }; +} + +export function SMDBcubeReturnModelToJSON(value?: SMDBcubeReturnModel | null): any { + if (value == null) { + return value; + } + return { + + 'status': value['status'], + 'cubeKeyName': value['cubeKeyName'], + 'cubeInfo': SMDBcubeCoreToJSON(value['cubeInfo']), + }; +} + diff --git a/src/api/pfdcm/generated/models/SMDBswiftConfig.ts b/src/api/pfdcm/generated/models/SMDBswiftConfig.ts new file mode 100644 index 000000000..59ee1a641 --- /dev/null +++ b/src/api/pfdcm/generated/models/SMDBswiftConfig.ts @@ -0,0 +1,83 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ModelsSmdbSetupModelValueStr } from './ModelsSmdbSetupModelValueStr'; +import { + ModelsSmdbSetupModelValueStrFromJSON, + ModelsSmdbSetupModelValueStrFromJSONTyped, + ModelsSmdbSetupModelValueStrToJSON, +} from './ModelsSmdbSetupModelValueStr'; +import type { SMDBswiftCore } from './SMDBswiftCore'; +import { + SMDBswiftCoreFromJSON, + SMDBswiftCoreFromJSONTyped, + SMDBswiftCoreToJSON, +} from './SMDBswiftCore'; + +/** + * The SMDB swift key config model + * @export + * @interface SMDBswiftConfig + */ +export interface SMDBswiftConfig { + /** + * + * @type {ModelsSmdbSetupModelValueStr} + * @memberof SMDBswiftConfig + */ + swiftKeyName: ModelsSmdbSetupModelValueStr; + /** + * + * @type {SMDBswiftCore} + * @memberof SMDBswiftConfig + */ + swiftInfo: SMDBswiftCore; +} + +/** + * Check if a given object implements the SMDBswiftConfig interface. + */ +export function instanceOfSMDBswiftConfig(value: object): value is SMDBswiftConfig { + if (!('swiftKeyName' in value) || value['swiftKeyName'] === undefined) return false; + if (!('swiftInfo' in value) || value['swiftInfo'] === undefined) return false; + return true; +} + +export function SMDBswiftConfigFromJSON(json: any): SMDBswiftConfig { + return SMDBswiftConfigFromJSONTyped(json, false); +} + +export function SMDBswiftConfigFromJSONTyped(json: any, ignoreDiscriminator: boolean): SMDBswiftConfig { + if (json == null) { + return json; + } + return { + + 'swiftKeyName': ModelsSmdbSetupModelValueStrFromJSON(json['swiftKeyName']), + 'swiftInfo': SMDBswiftCoreFromJSON(json['swiftInfo']), + }; +} + +export function SMDBswiftConfigToJSON(value?: SMDBswiftConfig | null): any { + if (value == null) { + return value; + } + return { + + 'swiftKeyName': ModelsSmdbSetupModelValueStrToJSON(value['swiftKeyName']), + 'swiftInfo': SMDBswiftCoreToJSON(value['swiftInfo']), + }; +} + diff --git a/src/api/pfdcm/generated/models/SMDBswiftCore.ts b/src/api/pfdcm/generated/models/SMDBswiftCore.ts new file mode 100644 index 000000000..cd8dca4ae --- /dev/null +++ b/src/api/pfdcm/generated/models/SMDBswiftCore.ts @@ -0,0 +1,79 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * The SMDB swift service model + * @export + * @interface SMDBswiftCore + */ +export interface SMDBswiftCore { + /** + * + * @type {string} + * @memberof SMDBswiftCore + */ + ip: string; + /** + * + * @type {string} + * @memberof SMDBswiftCore + */ + port: string; + /** + * + * @type {string} + * @memberof SMDBswiftCore + */ + login: string; +} + +/** + * Check if a given object implements the SMDBswiftCore interface. + */ +export function instanceOfSMDBswiftCore(value: object): value is SMDBswiftCore { + if (!('ip' in value) || value['ip'] === undefined) return false; + if (!('port' in value) || value['port'] === undefined) return false; + if (!('login' in value) || value['login'] === undefined) return false; + return true; +} + +export function SMDBswiftCoreFromJSON(json: any): SMDBswiftCore { + return SMDBswiftCoreFromJSONTyped(json, false); +} + +export function SMDBswiftCoreFromJSONTyped(json: any, ignoreDiscriminator: boolean): SMDBswiftCore { + if (json == null) { + return json; + } + return { + + 'ip': json['ip'], + 'port': json['port'], + 'login': json['login'], + }; +} + +export function SMDBswiftCoreToJSON(value?: SMDBswiftCore | null): any { + if (value == null) { + return value; + } + return { + + 'ip': value['ip'], + 'port': value['port'], + 'login': value['login'], + }; +} + diff --git a/src/api/pfdcm/generated/models/SysInfoModel.ts b/src/api/pfdcm/generated/models/SysInfoModel.ts new file mode 100644 index 000000000..0411adf6b --- /dev/null +++ b/src/api/pfdcm/generated/models/SysInfoModel.ts @@ -0,0 +1,148 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * For the most part, copied from + * https://github.com/FNNDSC/pfcon/blob/87f5da953be7c2cc80542bef0e67727dda1b4958/pfcon/pfcon.py#L601-611 + * + * Provides information about the environment in which the service + * is currently running. + * @export + * @interface SysInfoModel + */ +export interface SysInfoModel { + /** + * + * @type {string} + * @memberof SysInfoModel + */ + system?: string; + /** + * + * @type {string} + * @memberof SysInfoModel + */ + machine?: string; + /** + * Uname output, converted from object to list + * @type {Array<string>} + * @memberof SysInfoModel + */ + uname?: Array<string>; + /** + * + * @type {string} + * @memberof SysInfoModel + */ + platform?: string; + /** + * + * @type {string} + * @memberof SysInfoModel + */ + version: string; + /** + * Actually a NamedTuple but I'm not typing it out + * @type {Array<any>} + * @memberof SysInfoModel + */ + memory: Array<any>; + /** + * + * @type {number} + * @memberof SysInfoModel + */ + cpucount?: number; + /** + * Average system load over last 1, 5, and 15 minutes + * @type {Array<any>} + * @memberof SysInfoModel + */ + loadavg: Array<any>; + /** + * + * @type {number} + * @memberof SysInfoModel + */ + cpuPercent: number; + /** + * + * @type {string} + * @memberof SysInfoModel + */ + hostname?: string; + /** + * + * @type {string} + * @memberof SysInfoModel + */ + inet?: string; +} + +/** + * Check if a given object implements the SysInfoModel interface. + */ +export function instanceOfSysInfoModel(value: object): value is SysInfoModel { + if (!('version' in value) || value['version'] === undefined) return false; + if (!('memory' in value) || value['memory'] === undefined) return false; + if (!('loadavg' in value) || value['loadavg'] === undefined) return false; + if (!('cpuPercent' in value) || value['cpuPercent'] === undefined) return false; + return true; +} + +export function SysInfoModelFromJSON(json: any): SysInfoModel { + return SysInfoModelFromJSONTyped(json, false); +} + +export function SysInfoModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): SysInfoModel { + if (json == null) { + return json; + } + return { + + 'system': json['system'] == null ? undefined : json['system'], + 'machine': json['machine'] == null ? undefined : json['machine'], + 'uname': json['uname'] == null ? undefined : json['uname'], + 'platform': json['platform'] == null ? undefined : json['platform'], + 'version': json['version'], + 'memory': json['memory'], + 'cpucount': json['cpucount'] == null ? undefined : json['cpucount'], + 'loadavg': json['loadavg'], + 'cpuPercent': json['cpu_percent'], + 'hostname': json['hostname'] == null ? undefined : json['hostname'], + 'inet': json['inet'] == null ? undefined : json['inet'], + }; +} + +export function SysInfoModelToJSON(value?: SysInfoModel | null): any { + if (value == null) { + return value; + } + return { + + 'system': value['system'], + 'machine': value['machine'], + 'uname': value['uname'], + 'platform': value['platform'], + 'version': value['version'], + 'memory': value['memory'], + 'cpucount': value['cpucount'], + 'loadavg': value['loadavg'], + 'cpu_percent': value['cpuPercent'], + 'hostname': value['hostname'], + 'inet': value['inet'], + }; +} + diff --git a/src/api/pfdcm/generated/models/ValidationError.ts b/src/api/pfdcm/generated/models/ValidationError.ts new file mode 100644 index 000000000..2355a36ea --- /dev/null +++ b/src/api/pfdcm/generated/models/ValidationError.ts @@ -0,0 +1,86 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { LocationInner } from './LocationInner'; +import { + LocationInnerFromJSON, + LocationInnerFromJSONTyped, + LocationInnerToJSON, +} from './LocationInner'; + +/** + * + * @export + * @interface ValidationError + */ +export interface ValidationError { + /** + * + * @type {Array<LocationInner>} + * @memberof ValidationError + */ + loc: Array<LocationInner>; + /** + * + * @type {string} + * @memberof ValidationError + */ + msg: string; + /** + * + * @type {string} + * @memberof ValidationError + */ + type: string; +} + +/** + * Check if a given object implements the ValidationError interface. + */ +export function instanceOfValidationError(value: object): value is ValidationError { + if (!('loc' in value) || value['loc'] === undefined) return false; + if (!('msg' in value) || value['msg'] === undefined) return false; + if (!('type' in value) || value['type'] === undefined) return false; + return true; +} + +export function ValidationErrorFromJSON(json: any): ValidationError { + return ValidationErrorFromJSONTyped(json, false); +} + +export function ValidationErrorFromJSONTyped(json: any, ignoreDiscriminator: boolean): ValidationError { + if (json == null) { + return json; + } + return { + + 'loc': ((json['loc'] as Array<any>).map(LocationInnerFromJSON)), + 'msg': json['msg'], + 'type': json['type'], + }; +} + +export function ValidationErrorToJSON(value?: ValidationError | null): any { + if (value == null) { + return value; + } + return { + + 'loc': ((value['loc'] as Array<any>).map(LocationInnerToJSON)), + 'msg': value['msg'], + 'type': value['type'], + }; +} + diff --git a/src/api/pfdcm/generated/models/XinetdCore.ts b/src/api/pfdcm/generated/models/XinetdCore.ts new file mode 100644 index 000000000..bb66f4c72 --- /dev/null +++ b/src/api/pfdcm/generated/models/XinetdCore.ts @@ -0,0 +1,124 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * The core data model + * @export + * @interface XinetdCore + */ +export interface XinetdCore { + /** + * + * @type {string} + * @memberof XinetdCore + */ + servicePort: string; + /** + * + * @type {string} + * @memberof XinetdCore + */ + tmpDir: string; + /** + * + * @type {string} + * @memberof XinetdCore + */ + logDir: string; + /** + * + * @type {string} + * @memberof XinetdCore + */ + dataDir: string; + /** + * + * @type {string} + * @memberof XinetdCore + */ + listener: string; + /** + * + * @type {string} + * @memberof XinetdCore + */ + patientMapDir: string; + /** + * + * @type {string} + * @memberof XinetdCore + */ + studyMapDir: string; + /** + * + * @type {string} + * @memberof XinetdCore + */ + seriesMapDir: string; +} + +/** + * Check if a given object implements the XinetdCore interface. + */ +export function instanceOfXinetdCore(value: object): value is XinetdCore { + if (!('servicePort' in value) || value['servicePort'] === undefined) return false; + if (!('tmpDir' in value) || value['tmpDir'] === undefined) return false; + if (!('logDir' in value) || value['logDir'] === undefined) return false; + if (!('dataDir' in value) || value['dataDir'] === undefined) return false; + if (!('listener' in value) || value['listener'] === undefined) return false; + if (!('patientMapDir' in value) || value['patientMapDir'] === undefined) return false; + if (!('studyMapDir' in value) || value['studyMapDir'] === undefined) return false; + if (!('seriesMapDir' in value) || value['seriesMapDir'] === undefined) return false; + return true; +} + +export function XinetdCoreFromJSON(json: any): XinetdCore { + return XinetdCoreFromJSONTyped(json, false); +} + +export function XinetdCoreFromJSONTyped(json: any, ignoreDiscriminator: boolean): XinetdCore { + if (json == null) { + return json; + } + return { + + 'servicePort': json['servicePort'], + 'tmpDir': json['tmpDir'], + 'logDir': json['logDir'], + 'dataDir': json['dataDir'], + 'listener': json['listener'], + 'patientMapDir': json['patient_mapDir'], + 'studyMapDir': json['study_mapDir'], + 'seriesMapDir': json['series_mapDir'], + }; +} + +export function XinetdCoreToJSON(value?: XinetdCore | null): any { + if (value == null) { + return value; + } + return { + + 'servicePort': value['servicePort'], + 'tmpDir': value['tmpDir'], + 'logDir': value['logDir'], + 'dataDir': value['dataDir'], + 'listener': value['listener'], + 'patient_mapDir': value['patientMapDir'], + 'study_mapDir': value['studyMapDir'], + 'series_mapDir': value['seriesMapDir'], + }; +} + diff --git a/src/api/pfdcm/generated/models/XinetdDBPutModel.ts b/src/api/pfdcm/generated/models/XinetdDBPutModel.ts new file mode 100644 index 000000000..42df069aa --- /dev/null +++ b/src/api/pfdcm/generated/models/XinetdDBPutModel.ts @@ -0,0 +1,68 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { XinetdCore } from './XinetdCore'; +import { + XinetdCoreFromJSON, + XinetdCoreFromJSONTyped, + XinetdCoreToJSON, +} from './XinetdCore'; + +/** + * + * @export + * @interface XinetdDBPutModel + */ +export interface XinetdDBPutModel { + /** + * + * @type {XinetdCore} + * @memberof XinetdDBPutModel + */ + info: XinetdCore; +} + +/** + * Check if a given object implements the XinetdDBPutModel interface. + */ +export function instanceOfXinetdDBPutModel(value: object): value is XinetdDBPutModel { + if (!('info' in value) || value['info'] === undefined) return false; + return true; +} + +export function XinetdDBPutModelFromJSON(json: any): XinetdDBPutModel { + return XinetdDBPutModelFromJSONTyped(json, false); +} + +export function XinetdDBPutModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): XinetdDBPutModel { + if (json == null) { + return json; + } + return { + + 'info': XinetdCoreFromJSON(json['info']), + }; +} + +export function XinetdDBPutModelToJSON(value?: XinetdDBPutModel | null): any { + if (value == null) { + return value; + } + return { + + 'info': XinetdCoreToJSON(value['info']), + }; +} + diff --git a/src/api/pfdcm/generated/models/XinetdDBReturnModel.ts b/src/api/pfdcm/generated/models/XinetdDBReturnModel.ts new file mode 100644 index 000000000..5a1e54384 --- /dev/null +++ b/src/api/pfdcm/generated/models/XinetdDBReturnModel.ts @@ -0,0 +1,101 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ModelsListenerModelTime } from './ModelsListenerModelTime'; +import { + ModelsListenerModelTimeFromJSON, + ModelsListenerModelTimeFromJSONTyped, + ModelsListenerModelTimeToJSON, +} from './ModelsListenerModelTime'; +import type { XinetdCore } from './XinetdCore'; +import { + XinetdCoreFromJSON, + XinetdCoreFromJSONTyped, + XinetdCoreToJSON, +} from './XinetdCore'; + +/** + * + * @export + * @interface XinetdDBReturnModel + */ +export interface XinetdDBReturnModel { + /** + * + * @type {XinetdCore} + * @memberof XinetdDBReturnModel + */ + info: XinetdCore; + /** + * + * @type {ModelsListenerModelTime} + * @memberof XinetdDBReturnModel + */ + timeCreated: ModelsListenerModelTime; + /** + * + * @type {ModelsListenerModelTime} + * @memberof XinetdDBReturnModel + */ + timeModified: ModelsListenerModelTime; + /** + * + * @type {string} + * @memberof XinetdDBReturnModel + */ + message: string; +} + +/** + * Check if a given object implements the XinetdDBReturnModel interface. + */ +export function instanceOfXinetdDBReturnModel(value: object): value is XinetdDBReturnModel { + if (!('info' in value) || value['info'] === undefined) return false; + if (!('timeCreated' in value) || value['timeCreated'] === undefined) return false; + if (!('timeModified' in value) || value['timeModified'] === undefined) return false; + if (!('message' in value) || value['message'] === undefined) return false; + return true; +} + +export function XinetdDBReturnModelFromJSON(json: any): XinetdDBReturnModel { + return XinetdDBReturnModelFromJSONTyped(json, false); +} + +export function XinetdDBReturnModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): XinetdDBReturnModel { + if (json == null) { + return json; + } + return { + + 'info': XinetdCoreFromJSON(json['info']), + 'timeCreated': ModelsListenerModelTimeFromJSON(json['time_created']), + 'timeModified': ModelsListenerModelTimeFromJSON(json['time_modified']), + 'message': json['message'], + }; +} + +export function XinetdDBReturnModelToJSON(value?: XinetdDBReturnModel | null): any { + if (value == null) { + return value; + } + return { + + 'info': XinetdCoreToJSON(value['info']), + 'time_created': ModelsListenerModelTimeToJSON(value['timeCreated']), + 'time_modified': ModelsListenerModelTimeToJSON(value['timeModified']), + 'message': value['message'], + }; +} + diff --git a/src/api/pfdcm/generated/models/index.ts b/src/api/pfdcm/generated/models/index.ts new file mode 100644 index 000000000..e1fb462d3 --- /dev/null +++ b/src/api/pfdcm/generated/models/index.ts @@ -0,0 +1,40 @@ +/* tslint:disable */ +/* eslint-disable */ +export * from './AboutModel'; +export * from './BodyPACSPypxApiV1PACSSyncPypxPost'; +export * from './BodyPACSServiceHandlerApiV1PACSThreadPypxPost'; +export * from './BodyPACSobjPortUpdateApiV1PACSservicePortPost'; +export * from './DcmtkCore'; +export * from './DcmtkDBPutModel'; +export * from './DcmtkDBReturnModel'; +export * from './Dicom'; +export * from './EchoModel'; +export * from './HTTPValidationError'; +export * from './HelloModel'; +export * from './ListenerDBreturnModel'; +export * from './ListenerHandlerStatus'; +export * from './LocationInner'; +export * from './ModelsListenerModelTime'; +export * from './ModelsListenerModelValueStr'; +export * from './ModelsPacsQRmodelValueStr'; +export * from './ModelsPacsSetupModelTime'; +export * from './ModelsPacsSetupModelValueStr'; +export * from './ModelsSmdbSetupModelValueStr'; +export * from './PACSasync'; +export * from './PACSdbPutModel'; +export * from './PACSdbReturnModel'; +export * from './PACSqueryCore'; +export * from './PACSsetupCore'; +export * from './SMDBFsConfig'; +export * from './SMDBFsCore'; +export * from './SMDBFsReturnModel'; +export * from './SMDBcubeConfig'; +export * from './SMDBcubeCore'; +export * from './SMDBcubeReturnModel'; +export * from './SMDBswiftConfig'; +export * from './SMDBswiftCore'; +export * from './SysInfoModel'; +export * from './ValidationError'; +export * from './XinetdCore'; +export * from './XinetdDBPutModel'; +export * from './XinetdDBReturnModel'; diff --git a/src/api/pfdcm/generated/runtime.ts b/src/api/pfdcm/generated/runtime.ts new file mode 100644 index 000000000..1e066c3d4 --- /dev/null +++ b/src/api/pfdcm/generated/runtime.ts @@ -0,0 +1,426 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * pfdcm + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 3.1.2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export const BASE_PATH = "http://localhost".replace(/\/+$/, ""); + +export interface ConfigurationParameters { + basePath?: string; // override base path + fetchApi?: FetchAPI; // override for fetch implementation + middleware?: Middleware[]; // middleware to apply before/after fetch requests + queryParamsStringify?: (params: HTTPQuery) => string; // stringify function for query strings + username?: string; // parameter for basic security + password?: string; // parameter for basic security + apiKey?: string | Promise<string> | ((name: string) => string | Promise<string>); // parameter for apiKey security + accessToken?: string | Promise<string> | ((name?: string, scopes?: string[]) => string | Promise<string>); // parameter for oauth2 security + headers?: HTTPHeaders; //header params we want to use on every request + credentials?: RequestCredentials; //value for the credentials param we want to use on each request +} + +export class Configuration { + constructor(private configuration: ConfigurationParameters = {}) {} + + set config(configuration: Configuration) { + this.configuration = configuration; + } + + get basePath(): string { + return this.configuration.basePath != null ? this.configuration.basePath : BASE_PATH; + } + + get fetchApi(): FetchAPI | undefined { + return this.configuration.fetchApi; + } + + get middleware(): Middleware[] { + return this.configuration.middleware || []; + } + + get queryParamsStringify(): (params: HTTPQuery) => string { + return this.configuration.queryParamsStringify || querystring; + } + + get username(): string | undefined { + return this.configuration.username; + } + + get password(): string | undefined { + return this.configuration.password; + } + + get apiKey(): ((name: string) => string | Promise<string>) | undefined { + const apiKey = this.configuration.apiKey; + if (apiKey) { + return typeof apiKey === 'function' ? apiKey : () => apiKey; + } + return undefined; + } + + get accessToken(): ((name?: string, scopes?: string[]) => string | Promise<string>) | undefined { + const accessToken = this.configuration.accessToken; + if (accessToken) { + return typeof accessToken === 'function' ? accessToken : async () => accessToken; + } + return undefined; + } + + get headers(): HTTPHeaders | undefined { + return this.configuration.headers; + } + + get credentials(): RequestCredentials | undefined { + return this.configuration.credentials; + } +} + +export const DefaultConfig = new Configuration(); + +/** + * This is the base class for all generated API classes. + */ +export class BaseAPI { + + private static readonly jsonRegex = new RegExp('^(:?application\/json|[^;/ \t]+\/[^;/ \t]+[+]json)[ \t]*(:?;.*)?$', 'i'); + private middleware: Middleware[]; + + constructor(protected configuration = DefaultConfig) { + this.middleware = configuration.middleware; + } + + withMiddleware<T extends BaseAPI>(this: T, ...middlewares: Middleware[]) { + const next = this.clone<T>(); + next.middleware = next.middleware.concat(...middlewares); + return next; + } + + withPreMiddleware<T extends BaseAPI>(this: T, ...preMiddlewares: Array<Middleware['pre']>) { + const middlewares = preMiddlewares.map((pre) => ({ pre })); + return this.withMiddleware<T>(...middlewares); + } + + withPostMiddleware<T extends BaseAPI>(this: T, ...postMiddlewares: Array<Middleware['post']>) { + const middlewares = postMiddlewares.map((post) => ({ post })); + return this.withMiddleware<T>(...middlewares); + } + + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + * application/vnd.company+json + * @param mime - MIME (Multipurpose Internet Mail Extensions) + * @return True if the given MIME is JSON, false otherwise. + */ + protected isJsonMime(mime: string | null | undefined): boolean { + if (!mime) { + return false; + } + return BaseAPI.jsonRegex.test(mime); + } + + protected async request(context: RequestOpts, initOverrides?: RequestInit | InitOverrideFunction): Promise<Response> { + const { url, init } = await this.createFetchParams(context, initOverrides); + const response = await this.fetchApi(url, init); + if (response && (response.status >= 200 && response.status < 300)) { + return response; + } + throw new ResponseError(response, 'Response returned an error code'); + } + + private async createFetchParams(context: RequestOpts, initOverrides?: RequestInit | InitOverrideFunction) { + let url = this.configuration.basePath + context.path; + if (context.query !== undefined && Object.keys(context.query).length !== 0) { + // only add the querystring to the URL if there are query parameters. + // this is done to avoid urls ending with a "?" character which buggy webservers + // do not handle correctly sometimes. + url += '?' + this.configuration.queryParamsStringify(context.query); + } + + const headers = Object.assign({}, this.configuration.headers, context.headers); + Object.keys(headers).forEach(key => headers[key] === undefined ? delete headers[key] : {}); + + const initOverrideFn = + typeof initOverrides === "function" + ? initOverrides + : async () => initOverrides; + + const initParams = { + method: context.method, + headers, + body: context.body, + credentials: this.configuration.credentials, + }; + + const overriddenInit: RequestInit = { + ...initParams, + ...(await initOverrideFn({ + init: initParams, + context, + })) + }; + + let body: any; + if (isFormData(overriddenInit.body) + || (overriddenInit.body instanceof URLSearchParams) + || isBlob(overriddenInit.body)) { + body = overriddenInit.body; + } else if (this.isJsonMime(headers['Content-Type'])) { + body = JSON.stringify(overriddenInit.body); + } else { + body = overriddenInit.body; + } + + const init: RequestInit = { + ...overriddenInit, + body + }; + + return { url, init }; + } + + private fetchApi = async (url: string, init: RequestInit) => { + let fetchParams = { url, init }; + for (const middleware of this.middleware) { + if (middleware.pre) { + fetchParams = await middleware.pre({ + fetch: this.fetchApi, + ...fetchParams, + }) || fetchParams; + } + } + let response: Response | undefined = undefined; + try { + response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); + } catch (e) { + for (const middleware of this.middleware) { + if (middleware.onError) { + response = await middleware.onError({ + fetch: this.fetchApi, + url: fetchParams.url, + init: fetchParams.init, + error: e, + response: response ? response.clone() : undefined, + }) || response; + } + } + if (response === undefined) { + if (e instanceof Error) { + throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response'); + } else { + throw e; + } + } + } + for (const middleware of this.middleware) { + if (middleware.post) { + response = await middleware.post({ + fetch: this.fetchApi, + url: fetchParams.url, + init: fetchParams.init, + response: response.clone(), + }) || response; + } + } + return response; + } + + /** + * Create a shallow clone of `this` by constructing a new instance + * and then shallow cloning data members. + */ + private clone<T extends BaseAPI>(this: T): T { + const constructor = this.constructor as any; + const next = new constructor(this.configuration); + next.middleware = this.middleware.slice(); + return next; + } +}; + +function isBlob(value: any): value is Blob { + return typeof Blob !== 'undefined' && value instanceof Blob; +} + +function isFormData(value: any): value is FormData { + return typeof FormData !== "undefined" && value instanceof FormData; +} + +export class ResponseError extends Error { + override name: "ResponseError" = "ResponseError"; + constructor(public response: Response, msg?: string) { + super(msg); + } +} + +export class FetchError extends Error { + override name: "FetchError" = "FetchError"; + constructor(public cause: Error, msg?: string) { + super(msg); + } +} + +export class RequiredError extends Error { + override name: "RequiredError" = "RequiredError"; + constructor(public field: string, msg?: string) { + super(msg); + } +} + +export const COLLECTION_FORMATS = { + csv: ",", + ssv: " ", + tsv: "\t", + pipes: "|", +}; + +export type FetchAPI = WindowOrWorkerGlobalScope['fetch']; + +export type Json = any; +export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD'; +export type HTTPHeaders = { [key: string]: string }; +export type HTTPQuery = { [key: string]: string | number | null | boolean | Array<string | number | null | boolean> | Set<string | number | null | boolean> | HTTPQuery }; +export type HTTPBody = Json | FormData | URLSearchParams; +export type HTTPRequestInit = { headers?: HTTPHeaders; method: HTTPMethod; credentials?: RequestCredentials; body?: HTTPBody }; +export type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original'; + +export type InitOverrideFunction = (requestContext: { init: HTTPRequestInit, context: RequestOpts }) => Promise<RequestInit> + +export interface FetchParams { + url: string; + init: RequestInit; +} + +export interface RequestOpts { + path: string; + method: HTTPMethod; + headers: HTTPHeaders; + query?: HTTPQuery; + body?: HTTPBody; +} + +export function querystring(params: HTTPQuery, prefix: string = ''): string { + return Object.keys(params) + .map(key => querystringSingleKey(key, params[key], prefix)) + .filter(part => part.length > 0) + .join('&'); +} + +function querystringSingleKey(key: string, value: string | number | null | undefined | boolean | Array<string | number | null | boolean> | Set<string | number | null | boolean> | HTTPQuery, keyPrefix: string = ''): string { + const fullKey = keyPrefix + (keyPrefix.length ? `[${key}]` : key); + if (value instanceof Array) { + const multiValue = value.map(singleValue => encodeURIComponent(String(singleValue))) + .join(`&${encodeURIComponent(fullKey)}=`); + return `${encodeURIComponent(fullKey)}=${multiValue}`; + } + if (value instanceof Set) { + const valueAsArray = Array.from(value); + return querystringSingleKey(key, valueAsArray, keyPrefix); + } + if (value instanceof Date) { + return `${encodeURIComponent(fullKey)}=${encodeURIComponent(value.toISOString())}`; + } + if (value instanceof Object) { + return querystring(value as HTTPQuery, fullKey); + } + return `${encodeURIComponent(fullKey)}=${encodeURIComponent(String(value))}`; +} + +export function mapValues(data: any, fn: (item: any) => any) { + return Object.keys(data).reduce( + (acc, key) => ({ ...acc, [key]: fn(data[key]) }), + {} + ); +} + +export function canConsumeForm(consumes: Consume[]): boolean { + for (const consume of consumes) { + if ('multipart/form-data' === consume.contentType) { + return true; + } + } + return false; +} + +export interface Consume { + contentType: string; +} + +export interface RequestContext { + fetch: FetchAPI; + url: string; + init: RequestInit; +} + +export interface ResponseContext { + fetch: FetchAPI; + url: string; + init: RequestInit; + response: Response; +} + +export interface ErrorContext { + fetch: FetchAPI; + url: string; + init: RequestInit; + error: unknown; + response?: Response; +} + +export interface Middleware { + pre?(context: RequestContext): Promise<FetchParams | void>; + post?(context: ResponseContext): Promise<Response | void>; + onError?(context: ErrorContext): Promise<Response | void>; +} + +export interface ApiResponse<T> { + raw: Response; + value(): Promise<T>; +} + +export interface ResponseTransformer<T> { + (json: any): T; +} + +export class JSONApiResponse<T> { + constructor(public raw: Response, private transformer: ResponseTransformer<T> = (jsonValue: any) => jsonValue) {} + + async value(): Promise<T> { + return this.transformer(await this.raw.json()); + } +} + +export class VoidApiResponse { + constructor(public raw: Response) {} + + async value(): Promise<void> { + return undefined; + } +} + +export class BlobApiResponse { + constructor(public raw: Response) {} + + async value(): Promise<Blob> { + return await this.raw.blob(); + }; +} + +export class TextApiResponse { + constructor(public raw: Response) {} + + async value(): Promise<string> { + return await this.raw.text(); + }; +} diff --git a/src/api/pfdcm/index.test.ts b/src/api/pfdcm/index.test.ts new file mode 100644 index 000000000..3fb28ea70 --- /dev/null +++ b/src/api/pfdcm/index.test.ts @@ -0,0 +1,38 @@ +import { test, expect } from "vitest"; +import { PfdcmClient, Configuration } from "./index.ts"; +import { pipe } from "fp-ts/function"; +import * as TE from "fp-ts/TaskEither"; +import { PfdcmEnvironmentalDetailApi } from "./generated"; + +test("PfdcmClient", async (context) => { + const url = process.env.VITE_PFDCM_URL; + // const url = 'http://localhost:8088' + const configuration = new Configuration({ basePath: url }); + try { + const pfdcmDetailClient = new PfdcmEnvironmentalDetailApi(configuration); + const hello = await pfdcmDetailClient.readHelloApiV1HelloGet(); + expect(hello.name).toBe("pfdcm_hello"); + } catch (e) { + // pfdcm 'hello' endpoint not working, is pfdcm online? + context.skip(); + } + + const client = new PfdcmClient(configuration); + const getServices = pipe(client.getPacsServices(), TE.toUnion); + expect(await getServices()).toContain("MINICHRISORTHANC"); + + const query = { patientID: "1449c1d" }; + const queryAndAssertStudies = pipe( + client.query("MINICHRISORTHANC", query), + TE.mapLeft((e) => expect(e).toBeNull()), + TE.map((list) => { + const { study, series } = list[0]; + expect(study.PatientName).toBe("anonymized"); + expect(study.PatientBirthDate).toStrictEqual(new Date(2009, 6, 1)); + expect(series.map((s) => s.SeriesDescription.trim())).toContain( + "SAG MPRAGE 220 FOV", + ); + }), + ); + await queryAndAssertStudies(); +}); diff --git a/src/api/pfdcm/index.ts b/src/api/pfdcm/index.ts new file mode 100644 index 000000000..9f75cddcd --- /dev/null +++ b/src/api/pfdcm/index.ts @@ -0,0 +1,3 @@ +export { Configuration } from "./generated"; +export { PfdcmClient } from "./client"; +export type { PACSqueryCore } from "./generated"; diff --git a/src/api/pfdcm/models.ts b/src/api/pfdcm/models.ts new file mode 100644 index 000000000..abd937ff2 --- /dev/null +++ b/src/api/pfdcm/models.ts @@ -0,0 +1,88 @@ +import { PACSqueryCore } from "./generated"; + +type PypxTag = { + tag: 0 | string; + value: 0 | string; + label: string; +}; + +type Pypx = { + status: "success" | "error"; + command: string; + data: ReadonlyArray<{ + [key: string]: PypxTag | ReadonlyArray<{ [key: string]: PypxTag }>; + }>; + args: PACSqueryCore; +}; + +/** + * PFDCM "find" endpoint response, in its unprocessed and ugly original form. + * + * See https://github.com/FNNDSC/pfdcm/blob/3.1.22/pfdcm/controllers/pacsQRcontroller.py#L171-L176 + */ +type PypxFind = { + status: boolean; + find: {}; + message: string; + PACSdirective: PACSqueryCore; + pypx: Pypx; +}; + +/** + * DICOM study metadata. + */ +type Study = { + SpecificCharacterSet: string; + StudyDate: string; + AccessionNumber: string; + RetrieveAETitle: string; + ModalitiesInStudy: string; + StudyDescription: string; + PatientName: string; + PatientID: string; + PatientBirthDate: Date | null; + PatientSex: string; + PatientAge: number | null; + ProtocolName: string; + AcquisitionProtocolName: string; + AcquisitionProtocolDescription: string; + StudyInstanceUID: string; + NumberOfStudyRelatedSeries: string; + PerformedStationAETitle: string; +}; + +/** + * DICOM series metadata. + */ +type Series = { + SpecificCharacterSet: string; + StudyDate: string; + SeriesDate: string; + AccessionNumber: string; + RetrieveAETitle: string; + Modality: string; + StudyDescription: string; + SeriesDescription: string; + PatientName: string; + PatientID: string; + PatientBirthDate: Date | null; + PatientSex: string; + PatientAge: number | null; + ProtocolName: string; + AcquisitionProtocolName: string; + AcquisitionProtocolDescription: string; + StudyInstanceUID: string; + SeriesInstanceUID: string; + NumberOfSeriesRelatedInstances: string; + PerformedStationAETitle: string; +}; + +/** + * PACS query response data. + */ +type StudyAndSeries = { + study: Study; + series: ReadonlyArray<Series>; +}; + +export type { PypxFind, Pypx, PypxTag, Study, Series, StudyAndSeries }; diff --git a/src/components/Pacs/pfdcmClient.tsx b/src/components/Pacs/pfdcmClient.tsx index a8e39c8e6..bb5c50f9f 100644 --- a/src/components/Pacs/pfdcmClient.tsx +++ b/src/components/Pacs/pfdcmClient.tsx @@ -19,7 +19,7 @@ class PfdcmClient { private readonly url: string; constructor() { - this.url = import.meta.env.VITE_PFDCM_URL || ""; + this.url = import.meta.env.VITE_PFDCM_URL + "/" || ""; } async getPacsServices(): Promise<ReadonlyArray<string>> { From 090efc645c1e670a7a1fb208ad1adfa8ca62cb23 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Mon, 16 Sep 2024 14:55:30 -0400 Subject: [PATCH 194/337] feat: Implement the scroll feature in Dicom Display --- .../FeedOutputBrowser/FeedOutputBrowser.tsx | 6 +- .../FeedOutputBrowser/FileBrowser.tsx | 4 + .../FeedOutputBrowser/useFeedBrowser.tsx | 2 +- .../NewLibrary/components/FileCard.tsx | 31 ++++++- .../NewLibrary/components/LibraryTable.tsx | 9 ++ src/components/NewLibrary/index.tsx | 15 +++- src/components/Preview/FileDetailView.tsx | 10 ++- .../Preview/displays/DcmDisplay.tsx | 90 +++++++++++++++---- .../Preview/displays/ViewerDisplay.tsx | 3 + .../Preview/displays/dicomUtils/utils.ts | 7 +- 10 files changed, 146 insertions(+), 31 deletions(-) diff --git a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx index 9f7bc73ae..b7e7fda0b 100644 --- a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx +++ b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx @@ -34,8 +34,8 @@ const FeedOutputBrowser: React.FC<FeedOutputBrowserProps> = () => { } = useFeedBrowser(); return ( <div style={{ height: "100%" }} className="feed-output-browser"> - {filesLoading ? ( - <SpinContainer title="Fetching Files..." /> + {statusTitle && statusTitles.includes(statusTitle) ? ( + <FetchFilesLoader title="Plugin executing. Files will be fetched when plugin completes" /> ) : pluginFilesPayload && selected && !isError ? ( <FileBrowser selected={selected} @@ -47,8 +47,6 @@ const FeedOutputBrowser: React.FC<FeedOutputBrowserProps> = () => { handlePagination={handlePagination} isLoading={filesLoading} /> - ) : statusTitle && statusTitles.includes(statusTitle) ? ( - <FetchFilesLoader title="Plugin executing. Files will be fetched when plugin completes" /> ) : isError ? ( <Alert type="error" description={error?.message} /> ) : ( diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index b182894ce..769e39f07 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -74,6 +74,7 @@ const FileBrowser = (props: FileBrowserProps) => { handlePagination, isLoading, } = props; + const selectedFile = useTypedSelector((state) => state.explorer.selectedFile); const drawerState = useTypedSelector((state) => state.drawers); const username = useTypedSelector((state) => state.user.username); @@ -173,6 +174,9 @@ const FileBrowser = (props: FileBrowserProps) => { preview="large" isPublic={feed?.data.public} list={pluginFilesPayload.filesMap} + fetchMore={fetchMore} + handlePagination={handlePagination} + filesLoading={isLoading} /> )} {drawerState.preview.currentlyActive === "xtk" && <XtkViewer />} diff --git a/src/components/FeedOutputBrowser/useFeedBrowser.tsx b/src/components/FeedOutputBrowser/useFeedBrowser.tsx index 71ccc03bc..c8e175ba7 100644 --- a/src/components/FeedOutputBrowser/useFeedBrowser.tsx +++ b/src/components/FeedOutputBrowser/useFeedBrowser.tsx @@ -44,7 +44,7 @@ export const useFeedBrowser = () => { const { data: pluginFilesPayload, - isLoading: filesLoading, + isFetching: filesLoading, isError, error, } = useQuery({ diff --git a/src/components/NewLibrary/components/FileCard.tsx b/src/components/NewLibrary/components/FileCard.tsx index 080e3bfae..eaa0a3513 100644 --- a/src/components/NewLibrary/components/FileCard.tsx +++ b/src/components/NewLibrary/components/FileCard.tsx @@ -154,11 +154,20 @@ type FilesCardProps = { files: FileBrowserFolderFile[]; computedPath: string; pagination?: Pagination; + // For dicom scrolling + list?: FileBrowserFolderFile[]; + fetchMore?: boolean; + handlePagination?: () => void; + filesLoading?: boolean; }; export const FilesCard: React.FC<FilesCardProps> = ({ files, computedPath, + list, + fetchMore, + handlePagination, + filesLoading, }) => ( <> {files.map((file) => ( @@ -166,6 +175,10 @@ export const FilesCard: React.FC<FilesCardProps> = ({ key={file.data.fname} file={file} computedPath={computedPath} + list={list} + fetchMore={fetchMore} + filesLoading={filesLoading} + handlePagination={handlePagination} /> ))} </> @@ -174,6 +187,11 @@ export const FilesCard: React.FC<FilesCardProps> = ({ type SubFileCardProps = { file: FileBrowserFolderFile; computedPath: string; + // For dicom scrolling + list?: FileBrowserFolderFile[]; + fetchMore?: boolean; + handlePagination?: () => void; + filesLoading?: boolean; }; export const getFileName = ( @@ -185,6 +203,10 @@ export const getFileName = ( export const SubFileCard: React.FC<SubFileCardProps> = ({ file, computedPath, + list, + fetchMore, + handlePagination, + filesLoading, }) => { const { isDarkTheme } = useContext(ThemeContext); const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); @@ -296,7 +318,14 @@ export const SubFileCard: React.FC<SubFileCardProps> = ({ isOpen={preview} onClose={() => setIsPreview(false)} > - <FileDetailView selectedFile={file} preview="large" /> + <FileDetailView + selectedFile={file} + preview="large" + list={list} + fetchMore={fetchMore} + handlePagination={handlePagination} + filesLoading={filesLoading} + /> </Modal> </> ); diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 0a255437f..7ba54b028 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -42,6 +42,9 @@ interface TableProps { }; computedPath: string; handleFolderClick: (folderName: string) => void; + fetchMore?: boolean; + handlePagination?: () => void; + filesLoading?: boolean; } const columnNames = { @@ -236,6 +239,9 @@ const LibraryTable: React.FC<TableProps> = ({ data, computedPath, handleFolderClick, + fetchMore, + handlePagination, + filesLoading, }) => { const navigate = useNavigate(); const [preview, setShowPreview] = useState(false); @@ -310,6 +316,9 @@ const LibraryTable: React.FC<TableProps> = ({ selectedFile={selectedFile} preview="large" list={data.files} + fetchMore={fetchMore} + handlePagination={handlePagination} + filesLoading={filesLoading} /> )} </Drawer> diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index f6934879b..c70630b6d 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -99,7 +99,7 @@ const NewLibrary = () => { const currentPathSplit = decodedPath.split("/library/")[1]; const computedPath = currentPathSplit || "/"; const queryKey = ["library_folders", computedPath, pageNumber]; - const { data, isLoading, isError, error } = useQuery({ + const { data, isFetching, isError, error } = useQuery({ queryKey: queryKey, queryFn: () => fetchFolders(computedPath, pageNumber), placeholderData: keepPreviousData, @@ -186,7 +186,7 @@ const NewLibrary = () => { </PageSection> <PageSection style={{ paddingBlockStart: "0" }}> - {isLoading && <SpinContainer title="Fetching Resources..." />} + {isFetching && <SpinContainer title="Fetching Resources..." />} {isError && <Alert type="error" description={error.message} />} {/* Render based on currentLayout */} @@ -207,8 +207,11 @@ const NewLibrary = () => { }} handleFolderClick={handleFolderClick} computedPath={computedPath} + fetchMore={fetchMore} + handlePagination={handlePagination} + filesLoading={isFetching} /> - {fetchMore && !isLoading && ( + {fetchMore && !isFetching && ( <Button onClick={handlePagination} variant="link"> Load more data... </Button> @@ -247,8 +250,12 @@ const NewLibrary = () => { files={data?.filesMap || []} computedPath={computedPath} pagination={data?.filesPagination} + list={data?.filesMap} + fetchMore={fetchMore} + handlePagination={handlePagination} + filesLoading={isFetching} /> - {fetchMore && !isLoading && ( + {fetchMore && !isFetching && ( <Button onClick={handlePagination} variant="link"> Load more data... </Button> diff --git a/src/components/Preview/FileDetailView.tsx b/src/components/Preview/FileDetailView.tsx index d4672f46d..f3421fd9a 100644 --- a/src/components/Preview/FileDetailView.tsx +++ b/src/components/Preview/FileDetailView.tsx @@ -47,7 +47,11 @@ interface AllProps { handlePrevious?: () => void; gallery?: boolean; isPublic?: boolean; + // These props enable pagination and fetch on scroll list?: IFileBlob[]; + fetchMore?: boolean; + handlePagination?: () => void; + filesLoading?: boolean; } export interface ActionState { @@ -131,7 +135,8 @@ const FileDetailView = (props: AllProps) => { }, }); - const { selectedFile, preview } = props; + const { selectedFile, preview, fetchMore, handlePagination, filesLoading } = + props; let viewerName = ""; const fileType = getFileExtension(selectedFile?.data.fname); if (fileType) { @@ -206,6 +211,9 @@ const FileDetailView = (props: AllProps) => { selectedFile={selectedFile} // Optional for dicom scrolling list={props.list} + fetchMore={fetchMore} + handlePagination={handlePagination} + filesLoading={filesLoading} /> )} </div> diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index c209e5068..e6d1e0a15 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -12,6 +12,7 @@ import { SpinContainer } from "../../Common"; import useSize from "../../FeedTree/useSize"; import type { ActionState } from "../FileDetailView"; import { + events, type IStackViewport, basicInit, cleanupCornerstoneTooling, @@ -28,15 +29,29 @@ export type DcmImageProps = { actionState: ActionState; preview: string; list?: IFileBlob[]; + fetchMore?: boolean; + handlePagination?: () => void; + filesLoading?: boolean; }; const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { - const { selectedFile, actionState, preview, list } = props; + const { + selectedFile, + actionState, + preview, + list, + fetchMore, + handlePagination, + filesLoading, + } = props; const [activeViewport, setActiveViewport] = useState< IStackViewport | undefined >(); + + const [currentImageIndex, setCurrentImageIndex] = useState(0); const [imageStack, setImageStack] = useState<string[]>([]); const [renderingEngine, setRenderingEngine] = useState<RenderingEngine>(); + const [isLoadingMore, setIsLoadingMore] = useState(false); const dicomImageRef = useRef<HTMLDivElement>(null); const uniqueId = `${selectedFile?.data.id || v4()}`; const elementId = `cornerstone-element-${uniqueId}`; @@ -86,7 +101,6 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { imageID = await loadDicomImage(blob); } else { // Code to view png and jpg file types in cornerstone. Currently we are using the default image display so this code is redundant. - // This code should be deleted in the future. const fileviewer = new FileViewerModel(); const fileName = fileviewer.getFileName( @@ -122,27 +136,27 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { }, [size]); const loadMoreImages = async (signal: AbortSignal) => { - const newImageStack = []; + setIsLoadingMore(true); + const newImageStack = [...imageStack]; if (list) { - for (const file of list) { - if (signal.aborted) return; - const extension = getFileExtension(file.data.fname); - let imageId: string; - if (extension === "dcm") { - const blob = await file.getFileBlob(); - imageId = await loadDicomImage(blob); // Load and generate the image ID - } else { - continue; + for (const file of list.slice(imageStack.length)) { + if (signal.aborted) { + setIsLoadingMore(false); + return; } + const blob = await file.getFileBlob(); + const imageId = await loadDicomImage(blob); // Load and generate the image ID newImageStack.push(imageId); // Add the new image ID to the stack } setImageStack(newImageStack); if (activeViewport) { - await activeViewport.setStack(newImageStack); + const currentIndex = activeViewport.getCurrentImageIdIndex(); + await activeViewport.setStack(newImageStack, currentIndex); activeViewport.render(); } } + setIsLoadingMore(false); }; useEffect(() => { @@ -161,17 +175,63 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { return () => { controller.abort(); // Abort loading images on unmount }; - }, [list, activeViewport]); + }, [list, fetchMore, activeViewport]); + + useEffect(() => { + if (activeViewport && list) { + const element = activeViewport.element; + + const handleImageRendered = (_event: any) => { + const newIndex = activeViewport.getCurrentImageIdIndex(); + setCurrentImageIndex(newIndex + 1); + }; + + const handleFetchMoreImages = (_event: any) => { + const id = activeViewport.getCurrentImageIdIndex(); + if ( + id >= Math.floor(imageStack.length / 3) && + list.length === imageStack.length && + fetchMore && + handlePagination && + !filesLoading && + !isLoadingMore + ) { + handlePagination(); + } + }; + + element.addEventListener(events.IMAGE_RENDERED, handleImageRendered); + element.addEventListener( + events.STACK_VIEWPORT_SCROLL, + handleFetchMoreImages, + ); + + return () => { + element.removeEventListener(events.IMAGE_RENDERED, handleImageRendered); + element.removeEventListener( + events.STACK_VIEWPORT_SCROLL, + handleFetchMoreImages, + ); + }; + } + }, [activeViewport, imageStack, fetchMore, handlePagination]); return ( <> {isLoading && <SpinContainer title="Displaying image..." />} - <div id="content" ref={dicomImageRef} className={preview === "large" ? "dcm-preview" : ""} > + <div> + {isLoadingMore ? ( + <i>Loading More Images...</i> + ) : ( + `Images Loaded: ${currentImageIndex}/${imageStack.length}` + )} + </div> + <div id={elementId} /> </div> </> diff --git a/src/components/Preview/displays/ViewerDisplay.tsx b/src/components/Preview/displays/ViewerDisplay.tsx index 49cebb2c8..f33537dc7 100644 --- a/src/components/Preview/displays/ViewerDisplay.tsx +++ b/src/components/Preview/displays/ViewerDisplay.tsx @@ -34,6 +34,9 @@ interface ViewerDisplayProps { actionState: ActionState; selectedFile: FileBrowserFolderFile | PACSFile; list?: IFileBlob[]; + fetchMore?: boolean; + handlePagination?: () => void; + filesLoading?: boolean; } const ViewerDisplay: React.FC<ViewerDisplayProps> = ( diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index 2ae6cb61c..d719c6b34 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -6,6 +6,7 @@ import { init, metaData, volumeLoader, + EVENTS, } from "@cornerstonejs/core"; import * as cornerstone from "@cornerstonejs/core"; import cornerstonejsDICOMImageLoader from "@cornerstonejs/dicom-image-loader"; @@ -43,6 +44,7 @@ const { Enums: csToolsEnums, } = cornerstoneTools; const { MouseBindings } = csToolsEnums; +export const events = EVENTS; let toolGroup: CornerstoneToolTypes.IToolGroup | undefined; @@ -206,7 +208,6 @@ interface DisplayArea { imagePoint: ImagePoint; canvasPoint: ImagePoint; }; - // storeAsInitialCamera?: boolean; } interface ViewportInputOptions { @@ -238,7 +239,6 @@ function createDisplayArea( imagePoint, canvasPoint, }, - // storeAsInitialCamera: true, }, }; } @@ -281,9 +281,6 @@ export const displayDicomImage = async ( cornerstoneTools.utilities.stackPrefetch.enable(viewport.element); viewport.render(); - viewport.element.addEventListener("cornerstoneimagerendered", () => { - const currentIndex = viewport.getCurrentImageIdIndex(); - }); // Set the stack scroll mouse wheel tool toolGroup?.setToolActive(StackScrollMouseWheelTool.toolName); From 827f252653a111005e7170b02562d055017a3fe1 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Mon, 16 Sep 2024 16:20:17 -0400 Subject: [PATCH 195/337] feat: Updates to the dicom viewer --- .../FeedOutputBrowser/FileBrowser.tsx | 1 - .../NewLibrary/components/LibraryTable.tsx | 2 + src/components/Preview/FileDetailView.tsx | 31 ++++++++---- src/components/Preview/HelperComponent.tsx | 48 ++++++++++++++----- .../Preview/displays/dicomUtils/utils.ts | 2 + 5 files changed, 61 insertions(+), 23 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 769e39f07..95dc6f85c 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -172,7 +172,6 @@ const FileBrowser = (props: FileBrowserProps) => { gallery={true} selectedFile={selectedFile} preview="large" - isPublic={feed?.data.public} list={pluginFilesPayload.filesMap} fetchMore={fetchMore} handlePagination={handlePagination} diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 7ba54b028..14881de07 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -313,12 +313,14 @@ const LibraryTable: React.FC<TableProps> = ({ > {selectedFile && ( <FileDetailView + gallery={true} selectedFile={selectedFile} preview="large" list={data.files} fetchMore={fetchMore} handlePagination={handlePagination} filesLoading={filesLoading} + isDrawer={true} /> )} </Drawer> diff --git a/src/components/Preview/FileDetailView.tsx b/src/components/Preview/FileDetailView.tsx index f3421fd9a..ad8f00185 100644 --- a/src/components/Preview/FileDetailView.tsx +++ b/src/components/Preview/FileDetailView.tsx @@ -19,9 +19,9 @@ import React, { } from "react"; import { ErrorBoundary } from "react-error-boundary"; import { - type IFileBlob, fileViewerMap, getFileExtension, + type IFileBlob, } from "../../api/model"; import { useTypedSelector } from "../../store/hooks"; import { SpinContainer } from "../Common"; @@ -46,12 +46,12 @@ interface AllProps { handleNext?: () => void; handlePrevious?: () => void; gallery?: boolean; - isPublic?: boolean; // These props enable pagination and fetch on scroll list?: IFileBlob[]; fetchMore?: boolean; handlePagination?: () => void; filesLoading?: boolean; + isDrawer?: boolean; } export interface ActionState { @@ -103,9 +103,7 @@ const FileDetailView = (props: AllProps) => { reader.onloadend = async () => { try { if (reader.result) { - //@ts-ignore - const byteArray = new Uint8Array(reader.result); - //@ts-ignore + const byteArray = new Uint8Array(reader.result as ArrayBuffer); const testOutput: any[] = []; const output: any[] = []; const dataSet = dicomParser.parseDicom(byteArray); @@ -124,19 +122,33 @@ const FileDetailView = (props: AllProps) => { }; if (result) { - reader.readAsArrayBuffer(result); + const blob = await selectedFile?.getFileBlob(); + if (blob) { + reader.readAsArrayBuffer(blob); + } else { + throw new Error("Failed to parse the file for dicom tags"); + } } }, []); const mutation = useMutation({ - mutationFn: displayTagInfo, + mutationFn: async (selectedFile: FileBrowserFolderFile | PACSFile) => { + await displayTagInfo(selectedFile); + }, + onError: (error: any) => { setParsingError(error.message); }, }); - const { selectedFile, preview, fetchMore, handlePagination, filesLoading } = - props; + const { + selectedFile, + preview, + fetchMore, + handlePagination, + filesLoading, + isDrawer, + } = props; let viewerName = ""; const fileType = getFileExtension(selectedFile?.data.fname); if (fileType) { @@ -219,6 +231,7 @@ const FileDetailView = (props: AllProps) => { </div> <TagInfoModal + isDrawer={true} handleModalToggle={(actionState, toolState) => { const previouslyActive = Object.keys(actionState)[0]; handleModalToggle(actionState, toolState, previouslyActive); diff --git a/src/components/Preview/HelperComponent.tsx b/src/components/Preview/HelperComponent.tsx index 513b5494c..73bc0f0df 100644 --- a/src/components/Preview/HelperComponent.tsx +++ b/src/components/Preview/HelperComponent.tsx @@ -1,8 +1,8 @@ +import type { FileBrowserFolderFile } from "@fnndsc/chrisapi"; import { Button, Modal, ModalVariant, Tooltip } from "@patternfly/react-core"; import type { ReactNode } from "react"; -import type { FileBrowserFolderFile } from "@fnndsc/chrisapi"; import ReactJson from "react-json-view"; -import { Alert } from "../Antd"; +import { Alert, Drawer } from "../Antd"; import { SpinContainer } from "../Common"; export const GalleryButtonContainer = ({ @@ -49,24 +49,17 @@ export const TagInfoModal = ({ handleModalToggle, parsingError, output, + isDrawer = false, }: { isModalOpen: boolean; handleModalToggle: (event: string, value: boolean) => void; parsingError: string; output?: any[]; file?: FileBrowserFolderFile; + isDrawer?: boolean; }) => { - return ( - <Modal - aria-label="tag info" - onEscapePress={() => { - handleModalToggle("TagInfo", !isModalOpen); - }} - variant={ModalVariant.large} - title="Dicom Tag" - isOpen={isModalOpen} - onClose={() => handleModalToggle("TagInfo", !isModalOpen)} - > + const content = ( + <> {parsingError ? ( <Alert closable type="error" description={parsingError} /> ) : output && Object.keys(output).length > 0 ? ( @@ -82,6 +75,35 @@ export const TagInfoModal = ({ ) : ( <SpinContainer title="Fetching Dicom Tags" /> )} + </> + ); + + if (isDrawer) { + return ( + <Drawer + title="Dicom Tag" + placement="right" + onClose={() => handleModalToggle("TagInfo", !isModalOpen)} + open={isModalOpen} + width={720} // You can adjust this value as needed + > + {content} + </Drawer> + ); + } + + return ( + <Modal + aria-label="tag info" + onEscapePress={() => { + handleModalToggle("TagInfo", !isModalOpen); + }} + variant={ModalVariant.large} + title="Dicom Tag" + isOpen={isModalOpen} + onClose={() => handleModalToggle("TagInfo", !isModalOpen)} + > + {content} </Modal> ); }; diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index d719c6b34..2f4703161 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -182,6 +182,8 @@ export const handleEvents = ( const previousTool = actionState.previouslyActive as string; const id = toolGroup?.id; + if (activeTool === "TagInfo") return; + if (id) { toolGroup?.setToolPassive(previousTool); if (activeTool === "Reset") { From b5434b55334eac725873c1cd819a41956708432c Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Mon, 16 Sep 2024 16:24:18 -0400 Subject: [PATCH 196/337] feat: Update the position of the image count --- src/components/Preview/displays/DcmDisplay.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index e6d1e0a15..0e8b9d96c 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -224,7 +224,14 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { ref={dicomImageRef} className={preview === "large" ? "dcm-preview" : ""} > - <div> + <div + style={{ + position: "absolute", + top: "0.5em", + left: "0.5em", + zIndex: "99999", + }} + > {isLoadingMore ? ( <i>Loading More Images...</i> ) : ( From 5d5b49fce945377f6d99701d545158b9ba90c102 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 17 Sep 2024 14:59:04 -0400 Subject: [PATCH 197/337] feat: replace npm with pnpm --- .github/workflows/test.yml | 33 +- package-lock.json | 9252 ----------------------------------- package.json | 67 +- pnpm-lock.yaml | 9143 ++++++++++++++++++++++++++++++++++ src/store/resources/saga.ts | 8 +- src/types/index.d.ts | 3 - 6 files changed, 9200 insertions(+), 9306 deletions(-) delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d10262d6a..a82d0f5fe 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,12 +18,16 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20.17 - cache: 'npm' + cache: 'pnpm' + - name: Install pnpm + run: npm install -g pnpm + - name: Install dependencies - run: npm ci + run: pnpm install --frozen-lockfile + - name: Unit tests - run: npm test + run: pnpm test # note to self: the sections test-public and test-local should be almost the same, except: # - local testing needs git submodules @@ -42,15 +46,18 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20.17 - cache: 'npm' + cache: 'pnpm' + + - name: Install pnpm + run: npm install -g pnpm - name: Install dependencies - run: npm ci + run: pnpm install --frozen-lockfile - name: Install Playwright Browsers run: npx playwright install --with-deps - name: End-to-End tests env: TEST_SAFARI: yes - run: npm run test:e2e + run: pnpm run test:e2e - uses: actions/upload-artifact@v4 if: always() with: @@ -60,7 +67,7 @@ jobs: - name: Report coverage id: report if: always() - run: npm run test:lcov + run: pnpm run test:lcov - name: Upload E2E test coverage if: steps.report.outcome == 'success' uses: codecov/codecov-action@v4 @@ -82,17 +89,19 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20.17 - cache: 'npm' + cache: 'pnpm' + - name: Install pnpm + run: npm install -g pnpm - name: Install dependencies - run: npm ci + run: pnpm install --frozen-lockfile - name: Install Playwright Browsers run: npx playwright install --with-deps - name: Setup tests - run: npm run test:prepare + run: pnpm run test:prepare - name: End-to-End tests env: TEST_SAFARI: yes - run: npm run test:e2e:local + run: pnpm run test:e2e:local - uses: actions/upload-artifact@v4 if: always() with: @@ -102,7 +111,7 @@ jobs: - name: Report coverage id: report if: always() - run: npm run test:lcov + run: pnpm run test:lcov - name: Upload E2E test coverage if: steps.report.outcome == 'success' uses: codecov/codecov-action@v4 diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 7c85aaf5b..000000000 --- a/package-lock.json +++ /dev/null @@ -1,9252 +0,0 @@ -{ - "name": "chrisui", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "chrisui", - "version": "0.0.0", - "dependencies": { - "@cornerstonejs/core": "^1.84.4", - "@cornerstonejs/dicom-image-loader": "^1.84.4", - "@cornerstonejs/streaming-image-volume-loader": "^1.82.4", - "@cornerstonejs/tools": "^1.84.4", - "@fnndsc/chrisapi": "^1.22.0", - "@fontsource/inter": "^5.0.20", - "@niivue/niivue": "^0.41.1", - "@patternfly/react-catalog-view-extension": "^5.0.0", - "@patternfly/react-charts": "^7.3.0", - "@patternfly/react-core": "^5.3.4", - "@patternfly/react-log-viewer": "^5.2.0", - "@patternfly/react-table": "^5.3.4", - "@react-hook/resize-observer": "^2.0.1", - "@reduxjs/toolkit": "^2.2.7", - "@tanstack/react-query": "^5.51.1", - "@types/d3-shape": "^3.1.6", - "@types/d3-zoom": "^3.0.8", - "antd": "^5.20.3", - "axios": "^1.7.2", - "d3-hierarchy": "^1.1.9", - "d3-selection": "^3.0.0", - "d3-shape": "^3.2.0", - "d3-zoom": "^3.0.0", - "date-fns": "^3.6.0", - "dicom-parser": "^1.8.21", - "email-validator": "^2.0.4", - "fp-ts": "^2.16.8", - "hammerjs": "^2.0.8", - "immer": "^10.1.1", - "lodash": "^4.17.21", - "marked": "^13.0.2", - "micromark": "^4.0.0", - "micromark-extension-gfm": "^3.0.0", - "niivue-react": "github:niivue/niivue-react", - "p-queue": "^8.0.1", - "pako": "^1.0.11", - "preval.macro": "^5.0.0", - "query-string": "^9.0.0", - "rc-tree": "^5.8.0", - "react": "^18.3.1", - "react-activity": "^2.1.3", - "react-bootstrap-typeahead": "^6.2.3", - "react-cookie": "^7.1.4", - "react-dom": "^18.3.1", - "react-dropzone": "^14.2.3", - "react-error-boundary": "^4.0.13", - "react-force-graph-2d": "^1.25.3", - "react-json-view": "^1.21.3", - "react-lazylog": "^4.5.3", - "react-redux": "^9.1.0", - "react-router": "^6.21.3", - "react-router-dom": "^6.24.0", - "redux-saga": "^1.3.0", - "rusha": "^0.8.14", - "sanitize-html": "^2.11.0", - "shlex": "^2.1.2", - "sirv-cli": "^2.0.2", - "typescript": "^5.5.3", - "use-ackee": "^3.0.1", - "use-immer": "^0.10.0", - "uuid": "^9.0.1", - "vite-plugin-babel-macros": "^1.0.6" - }, - "devDependencies": { - "@biomejs/biome": "1.8.3", - "@faker-js/faker": "^8.4.0", - "@playwright/test": "^1.41.2", - "@redux-devtools/extension": "^3.3.0", - "@types/d3-hierarchy": "^1.1.7", - "@types/d3-selection": "^1.4.3", - "@types/lodash": "^4.14.202", - "@types/node": "^20.11.5", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.0", - "@types/redux-logger": "^3.0.11", - "@types/uuid": "^9.0.6", - "@vitejs/plugin-react-swc": "^3.5.0", - "@vitest/coverage-v8": "^2.0.5", - "happy-dom": "^15.0.0", - "lefthook": "^1.6.1", - "nyc": "^17.0.0", - "playwright": "^1.41.2", - "redux-devtools-extension": "^2.13.9", - "redux-logger": "^3.0.6", - "rollup-plugin-node-builtins": "^2.0.0", - "vite": "^5.3.2", - "vite-plugin-istanbul": "^6.0.2", - "vitest": "^2.0.5" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@ant-design/colors": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "@ctrl/tinycolor": "^3.6.1" - } - }, - "node_modules/@ant-design/cssinjs": { - "version": "1.21.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "@emotion/hash": "^0.8.0", - "@emotion/unitless": "^0.7.5", - "classnames": "^2.3.1", - "csstype": "^3.1.3", - "rc-util": "^5.35.0", - "stylis": "^4.3.3" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/cssinjs-utils": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "@ant-design/cssinjs": "^1.21.0", - "@babel/runtime": "^7.23.2", - "rc-util": "^5.38.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@ant-design/cssinjs-utils/node_modules/@babel/runtime": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ant-design/fast-color": { - "version": "2.0.6", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.7" - }, - "engines": { - "node": ">=8.x" - } - }, - "node_modules/@ant-design/fast-color/node_modules/@babel/runtime": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ant-design/icons": { - "version": "5.4.0", - "license": "MIT", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/icons-svg": { - "version": "4.4.2", - "license": "MIT" - }, - "node_modules/@ant-design/icons/node_modules/@babel/runtime": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ant-design/react-slick": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.4", - "classnames": "^2.2.5", - "json2mq": "^0.2.0", - "resize-observer-polyfill": "^1.5.1", - "throttle-debounce": "^5.0.0" - }, - "peerDependencies": { - "react": ">=16.9.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.25.4", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.25.2", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.4", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.25.0", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.4" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.22.11", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.0", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.4", - "@babel/parser": "^7.25.4", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.4", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@biomejs/biome": { - "version": "1.8.3", - "dev": true, - "hasInstallScript": true, - "license": "MIT OR Apache-2.0", - "bin": { - "biome": "bin/biome" - }, - "engines": { - "node": ">=14.21.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/biome" - }, - "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "1.8.3", - "@biomejs/cli-darwin-x64": "1.8.3", - "@biomejs/cli-linux-arm64": "1.8.3", - "@biomejs/cli-linux-arm64-musl": "1.8.3", - "@biomejs/cli-linux-x64": "1.8.3", - "@biomejs/cli-linux-x64-musl": "1.8.3", - "@biomejs/cli-win32-arm64": "1.8.3", - "@biomejs/cli-win32-x64": "1.8.3" - } - }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-darwin-arm64": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.3.tgz", - "integrity": "sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-darwin-x64": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.3.tgz", - "integrity": "sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-linux-arm64": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.3.tgz", - "integrity": "sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.3.tgz", - "integrity": "sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-linux-x64-musl": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", - "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-win32-arm64": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", - "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/biome/node_modules/@biomejs/cli-win32-x64": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", - "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64": { - "version": "1.8.3", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@cornerstonejs/codec-charls": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-charls/-/codec-charls-1.2.3.tgz", - "integrity": "sha512-qKUe6DN0dnGzhhfZLYhH9UZacMcudjxcaLXCrpxJImT/M/PQvZCT2rllu6VGJbWKJWG+dMVV2zmmleZcdJ7/cA==", - "license": "MIT", - "engines": { - "node": ">=0.14" - } - }, - "node_modules/@cornerstonejs/codec-libjpeg-turbo-8bit": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-libjpeg-turbo-8bit/-/codec-libjpeg-turbo-8bit-1.2.2.tgz", - "integrity": "sha512-aAUMK2958YNpOb/7G6e2/aG7hExTiFTASlMt/v90XA0pRHdWiNg5ny4S5SAju0FbIw4zcMnR0qfY+yW3VG2ivg==", - "license": "ISC", - "engines": { - "node": ">=0.14" - } - }, - "node_modules/@cornerstonejs/codec-openjpeg": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-openjpeg/-/codec-openjpeg-1.2.4.tgz", - "integrity": "sha512-UT2su6xZZnCPSuWf2ldzKa/2+guQ7BGgfBSKqxanggwJHh48gZqIAzekmsLyJHMMK5YDK+ti+fzvVJhBS3Xi/g==", - "license": "MIT", - "engines": { - "node": ">=0.14" - } - }, - "node_modules/@cornerstonejs/codec-openjph": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz", - "integrity": "sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==", - "license": "MIT", - "engines": { - "node": ">=0.14" - } - }, - "node_modules/@cornerstonejs/core": { - "version": "1.84.4", - "resolved": "https://registry.npmjs.org/@cornerstonejs/core/-/core-1.84.4.tgz", - "integrity": "sha512-+6Sa5EUWVbXqiR/+tHFzzMrMO8V2mAmi1oQt3iiBIm5roXzU++1smsckWgsRdZOgfHhQbHjkdEixlfuMGToiaw==", - "license": "MIT", - "dependencies": { - "@kitware/vtk.js": "30.4.1", - "comlink": "^4.4.1", - "detect-gpu": "^5.0.22", - "gl-matrix": "^3.4.3", - "lodash.clonedeep": "4.5.0" - }, - "funding": { - "type": "individual", - "url": "https://ohif.org/donate" - } - }, - "node_modules/@cornerstonejs/dicom-image-loader": { - "version": "1.84.4", - "resolved": "https://registry.npmjs.org/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.84.4.tgz", - "integrity": "sha512-IFRKmau82ku0vaqAduc98HcObgCfeyzZdAfQ/HiYA4RfWMZSGJm9DQiZXW+VUzlzim+8HEdwOrKY79AK7GylLg==", - "license": "MIT", - "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", - "@cornerstonejs/core": "^1.84.4", - "dicom-parser": "^1.8.9", - "pako": "^2.0.4", - "uuid": "^9.0.0" - } - }, - "node_modules/@cornerstonejs/dicom-image-loader/node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", - "license": "(MIT AND Zlib)" - }, - "node_modules/@cornerstonejs/streaming-image-volume-loader": { - "version": "1.84.1", - "license": "MIT", - "dependencies": { - "@cornerstonejs/core": "^1.84.1", - "comlink": "^4.4.1" - }, - "funding": { - "type": "individual", - "url": "https://ohif.org/donate" - } - }, - "node_modules/@cornerstonejs/tools": { - "version": "1.84.4", - "resolved": "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-1.84.4.tgz", - "integrity": "sha512-p2G811Xoez88hhYvIzHqXwsCjT0laLJc0hDREUapxqjcgL8FbKsIq+Pn8pWT2z/eYBcOW5ocXxnTRAs6mFRpuA==", - "license": "MIT", - "dependencies": { - "@cornerstonejs/core": "^1.84.4", - "@icr/polyseg-wasm": "0.4.0", - "@types/offscreencanvas": "2019.7.3", - "comlink": "^4.4.1", - "lodash.clonedeep": "4.5.0", - "lodash.get": "^4.4.2" - }, - "funding": { - "type": "individual", - "url": "https://ohif.org/donate" - }, - "peerDependencies": { - "@icr/polyseg-wasm": "0.4.0", - "@kitware/vtk.js": "30.4.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" - } - }, - "node_modules/@ctrl/tinycolor": { - "version": "3.6.1", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/@emotion/hash": { - "version": "0.8.0", - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.7.5", - "license": "MIT" - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@faker-js/faker": { - "version": "8.4.1", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } - ], - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=6.14.13" - } - }, - "node_modules/@fnndsc/chrisapi": { - "version": "1.22.0", - "license": "MIT", - "dependencies": { - "axios": "^1.6.8", - "core-js": "^3.36.1" - } - }, - "node_modules/@fontsource/inter": { - "version": "5.0.20", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.0.20.tgz", - "integrity": "sha512-rtw2F7xfM7rJmmnncXnR4ADr5wXsp4GyN1O1jmQJ1PMjAK+bm620/ZkQkeOYOkGoa09OksGinOeMA+Mkt6K9PQ==", - "license": "OFL-1.1" - }, - "node_modules/@icr/polyseg-wasm": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@icr/polyseg-wasm/-/polyseg-wasm-0.4.0.tgz", - "integrity": "sha512-3sZmiwG8I0NaqPle0L7+V/ZexiR7IjIUFkUsaOoFI9rNuBGyyMMmxAxnCmqcDFtBDk9h+JEYJf6e3NnqlHi/HQ==", - "license": "MIT", - "engines": { - "node": ">=0.14" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "dev": true, - "license": "ISC", - "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" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kitware/vtk.js": { - "version": "30.4.1", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "7.22.11", - "@types/webxr": "^0.5.5", - "commander": "9.2.0", - "d3-scale": "4.0.2", - "fast-deep-equal": "^3.1.3", - "fflate": "0.7.3", - "gl-matrix": "3.4.3", - "globalthis": "1.0.3", - "seedrandom": "3.0.5", - "shader-loader": "1.3.1", - "shelljs": "0.8.5", - "spark-md5": "3.0.2", - "stream-browserify": "3.0.0", - "webworker-promise": "0.5.0", - "worker-loader": "3.0.8", - "xmlbuilder2": "3.0.2" - }, - "bin": { - "vtkDataConverter": "Utilities/DataGenerator/convert-cli.js", - "xml2json": "Utilities/XMLConverter/xml2json-cli.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.17.10", - "autoprefixer": "^10.4.7", - "wslink": ">=1.1.0 || ^2.0.0" - } - }, - "node_modules/@lukeed/csprng": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@lukeed/uuid": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "@lukeed/csprng": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@mattiasbuelens/web-streams-polyfill": { - "version": "0.2.1", - "license": "MIT", - "dependencies": { - "@types/whatwg-streams": "^0.0.7" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@niivue/niivue": { - "version": "0.41.1", - "license": "BSD-2-Clause", - "dependencies": { - "@lukeed/uuid": "^2.0.1", - "@ungap/structured-clone": "^1.2.0", - "array-equal": "^1.0.2", - "daikon": "^1.2.46", - "fflate": "^0.8.2", - "gl-matrix": "^3.4.3", - "nifti-reader-js": "^0.6.8", - "rxjs": "^7.8.1" - }, - "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.13.2" - } - }, - "node_modules/@niivue/niivue/node_modules/fflate": { - "version": "0.8.2", - "license": "MIT" - }, - "node_modules/@oozcitak/dom": { - "version": "1.15.10", - "license": "MIT", - "dependencies": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/url": "1.0.4", - "@oozcitak/util": "8.3.8" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/@oozcitak/infra": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "@oozcitak/util": "8.3.8" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@oozcitak/url": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/@oozcitak/util": { - "version": "8.3.8", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/@patternfly/react-catalog-view-extension": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@patternfly/react-core": "^5.0.0", - "@patternfly/react-styles": "^5.0.0" - }, - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" - } - }, - "node_modules/@patternfly/react-charts": { - "version": "7.4.0", - "license": "MIT", - "dependencies": { - "@patternfly/react-styles": "^5.4.0", - "@patternfly/react-tokens": "^5.4.0", - "hoist-non-react-statics": "^3.3.2", - "lodash": "^4.17.21", - "tslib": "^2.6.3", - "victory-area": "^37.0.2", - "victory-axis": "^37.0.2", - "victory-bar": "^37.0.2", - "victory-box-plot": "^37.0.2", - "victory-chart": "^37.0.2", - "victory-core": "^37.0.2", - "victory-create-container": "^37.0.2", - "victory-cursor-container": "^37.0.2", - "victory-group": "^37.0.2", - "victory-legend": "^37.0.2", - "victory-line": "^37.0.2", - "victory-pie": "^37.0.2", - "victory-scatter": "^37.0.2", - "victory-stack": "^37.0.2", - "victory-tooltip": "^37.0.2", - "victory-voronoi-container": "^37.0.2", - "victory-zoom-container": "^37.0.2" - }, - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" - } - }, - "node_modules/@patternfly/react-core": { - "version": "5.4.0", - "license": "MIT", - "dependencies": { - "@patternfly/react-icons": "^5.4.0", - "@patternfly/react-styles": "^5.4.0", - "@patternfly/react-tokens": "^5.4.0", - "focus-trap": "7.5.4", - "react-dropzone": "^14.2.3", - "tslib": "^2.6.3" - }, - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" - } - }, - "node_modules/@patternfly/react-icons": { - "version": "5.4.0", - "license": "MIT", - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" - } - }, - "node_modules/@patternfly/react-log-viewer": { - "version": "5.3.0", - "license": "MIT", - "dependencies": { - "@patternfly/react-core": "^5.0.0", - "@patternfly/react-icons": "^5.0.0", - "@patternfly/react-styles": "^5.0.0", - "memoize-one": "^5.1.0" - }, - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" - } - }, - "node_modules/@patternfly/react-styles": { - "version": "5.4.0", - "license": "MIT" - }, - "node_modules/@patternfly/react-table": { - "version": "5.4.0", - "license": "MIT", - "dependencies": { - "@patternfly/react-core": "^5.4.0", - "@patternfly/react-icons": "^5.4.0", - "@patternfly/react-styles": "^5.4.0", - "@patternfly/react-tokens": "^5.4.0", - "lodash": "^4.17.21", - "tslib": "^2.6.3" - }, - "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" - } - }, - "node_modules/@patternfly/react-tokens": { - "version": "5.4.0", - "license": "MIT" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@playwright/test": { - "version": "1.46.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright": "1.46.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.25", - "license": "MIT" - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rc-component/async-validator": { - "version": "5.0.4", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.4" - }, - "engines": { - "node": ">=14.x" - } - }, - "node_modules/@rc-component/async-validator/node_modules/@babel/runtime": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@rc-component/color-picker": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "@ant-design/fast-color": "^2.0.6", - "@babel/runtime": "^7.23.6", - "classnames": "^2.2.6", - "rc-util": "^5.38.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/color-picker/node_modules/@babel/runtime": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@rc-component/context": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "rc-util": "^5.27.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/mini-decimal": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.0" - }, - "engines": { - "node": ">=8.x" - } - }, - "node_modules/@rc-component/mutate-observer": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/portal": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/qrcode": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.7", - "classnames": "^2.3.2", - "rc-util": "^5.38.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/qrcode/node_modules/@babel/runtime": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@rc-component/tour": { - "version": "1.15.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.0", - "@rc-component/portal": "^1.0.0-9", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/trigger": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.2", - "@rc-component/portal": "^1.1.0", - "classnames": "^2.3.2", - "rc-motion": "^2.0.0", - "rc-resize-observer": "^1.3.1", - "rc-util": "^5.38.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/trigger/node_modules/@babel/runtime": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@react-hook/latest": { - "version": "1.0.3", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/@react-hook/passive-layout-effect": { - "version": "1.2.1", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/@react-hook/resize-observer": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "@react-hook/latest": "^1.0.2", - "@react-hook/passive-layout-effect": "^1.2.0" - }, - "peerDependencies": { - "react": ">=18" - } - }, - "node_modules/@redux-devtools/extension": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.2", - "immutable": "^4.3.4" - }, - "peerDependencies": { - "redux": "^3.1.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/@redux-devtools/extension/node_modules/@babel/runtime": { - "version": "7.25.4", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@redux-saga/core": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.6.3", - "@redux-saga/deferred": "^1.2.1", - "@redux-saga/delay-p": "^1.2.1", - "@redux-saga/is": "^1.1.3", - "@redux-saga/symbols": "^1.1.3", - "@redux-saga/types": "^1.2.1", - "typescript-tuple": "^2.2.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/redux-saga" - } - }, - "node_modules/@redux-saga/deferred": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/@redux-saga/delay-p": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "@redux-saga/symbols": "^1.1.3" - } - }, - "node_modules/@redux-saga/is": { - "version": "1.1.3", - "license": "MIT", - "dependencies": { - "@redux-saga/symbols": "^1.1.3", - "@redux-saga/types": "^1.2.1" - } - }, - "node_modules/@redux-saga/symbols": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/@redux-saga/types": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/@reduxjs/toolkit": { - "version": "2.2.7", - "license": "MIT", - "dependencies": { - "immer": "^10.0.3", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } - } - }, - "node_modules/@remix-run/router": { - "version": "1.19.1", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@restart/hooks": { - "version": "0.4.16", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.1", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@swc/core": { - "version": "1.7.21", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.12" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.21", - "@swc/core-darwin-x64": "1.7.21", - "@swc/core-linux-arm-gnueabihf": "1.7.21", - "@swc/core-linux-arm64-gnu": "1.7.21", - "@swc/core-linux-arm64-musl": "1.7.21", - "@swc/core-linux-x64-gnu": "1.7.21", - "@swc/core-linux-x64-musl": "1.7.21", - "@swc/core-win32-arm64-msvc": "1.7.21", - "@swc/core-win32-ia32-msvc": "1.7.21", - "@swc/core-win32-x64-msvc": "1.7.21" - }, - "peerDependencies": { - "@swc/helpers": "*" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.21", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-darwin-arm64": { - "version": "1.7.21", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.21.tgz", - "integrity": "sha512-hh5uOZ7jWF66z2TRMhhXtWMQkssuPCSIZPy9VHf5KvZ46cX+5UeECDthchYklEVZQyy4Qr6oxfh4qff/5spoMA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-darwin-x64": { - "version": "1.7.21", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.21.tgz", - "integrity": "sha512-lTsPquqSierQ6jWiWM7NnYXXZGk9zx3NGkPLHjPbcH5BmyiauX0CC/YJYJx7YmS2InRLyALlGmidHkaF4JY28A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.21", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.21.tgz", - "integrity": "sha512-AgSd0fnSzAqCvWpzzZCq75z62JVGUkkXEOpfdi99jj/tryPy38KdXJtkVWJmufPXlRHokGTBitalk33WDJwsbA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.21", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.21.tgz", - "integrity": "sha512-l+jw6RQ4Y43/8dIst0c73uQE+W3kCWrCFqMqC/xIuE/iqHOnvYK6YbA1ffOct2dImkHzNiKuoehGqtQAc6cNaQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.21", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.21.tgz", - "integrity": "sha512-29KKZXrTo/c9F1JFL9WsNvCa6UCdIVhHP5EfuYhlKbn5/YmSsNFkuHdUtZFEd5U4+jiShXDmgGCtLW2d08LIwg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.21", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.21.tgz", - "integrity": "sha512-hYKLVeUTHqvFK628DFJEwxoX6p42T3HaQ4QjNtf3oKhiJWFh9iTRUrN/oCB5YI3R9WMkFkKh+99gZ/Dd0T5lsg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.21", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.21.tgz", - "integrity": "sha512-qyWAKW10aMBe6iUqeZ7NAJIswjfggVTUpDINpQGUJhz+pR71YZDidXgZXpaDB84YyDB2JAlRqd1YrLkl7CMiIw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.21", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.21.tgz", - "integrity": "sha512-cy61wS3wgH5mEwBiQ5w6/FnQrchBDAdPsSh0dKSzNmI+4K8hDxS8uzdBycWqJXO0cc+mA77SIlwZC3hP3Kum2g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core/node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.21", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.21.tgz", - "integrity": "sha512-/rexGItJURNJOdae+a48M+loT74nsEU+PyRRVAkZMKNRtLoYFAr0cpDlS5FodIgGunp/nqM0bst4H2w6Y05IKA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@swc/types": { - "version": "0.1.12", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.52.2", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.52.2", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.52.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.3", - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "license": "MIT" - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/@types/d3-hierarchy": { - "version": "1.1.11", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.0", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-selection": { - "version": "1.4.6", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.6", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "license": "MIT", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.7", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.16.2", - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.4", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/redux-logger": { - "version": "3.0.13", - "dev": true, - "license": "MIT", - "dependencies": { - "redux": "^5.0.0" - } - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/warning": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/@types/webxr": { - "version": "0.5.20", - "license": "MIT" - }, - "node_modules/@types/whatwg-streams": { - "version": "0.0.7", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/@vitejs/plugin-react-swc": { - "version": "3.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@swc/core": "^1.5.7" - }, - "peerDependencies": { - "vite": "^4 || ^5" - } - }, - "node_modules/@vitest/coverage-v8": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.5", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.10", - "magicast": "^0.3.4", - "std-env": "^3.7.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "2.0.5" - } - }, - "node_modules/@vitest/expect": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "2.0.5", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "magic-string": "^0.30.10", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@wearemothership/dicom-character-set": { - "version": "1.0.4-opt.1", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/accessor-fn": { - "version": "1.5.1", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/ackee-tracker": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "platform": "^1.3.6" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "license": "MIT", - "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" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/antd": { - "version": "5.20.3", - "license": "MIT", - "dependencies": { - "@ant-design/colors": "^7.1.0", - "@ant-design/cssinjs": "^1.21.0", - "@ant-design/cssinjs-utils": "^1.0.3", - "@ant-design/icons": "^5.4.0", - "@ant-design/react-slick": "~1.1.2", - "@babel/runtime": "^7.24.8", - "@ctrl/tinycolor": "^3.6.1", - "@rc-component/color-picker": "~2.0.1", - "@rc-component/mutate-observer": "^1.1.0", - "@rc-component/qrcode": "~1.0.0", - "@rc-component/tour": "~1.15.0", - "@rc-component/trigger": "^2.2.1", - "classnames": "^2.5.1", - "copy-to-clipboard": "^3.3.3", - "dayjs": "^1.11.11", - "rc-cascader": "~3.27.0", - "rc-checkbox": "~3.3.0", - "rc-collapse": "~3.7.3", - "rc-dialog": "~9.5.2", - "rc-drawer": "~7.2.0", - "rc-dropdown": "~4.2.0", - "rc-field-form": "~2.4.0", - "rc-image": "~7.9.0", - "rc-input": "~1.6.3", - "rc-input-number": "~9.2.0", - "rc-mentions": "~2.15.0", - "rc-menu": "~9.14.1", - "rc-motion": "^2.9.2", - "rc-notification": "~5.6.0", - "rc-pagination": "~4.2.0", - "rc-picker": "~4.6.13", - "rc-progress": "~4.0.0", - "rc-rate": "~2.13.0", - "rc-resize-observer": "^1.4.0", - "rc-segmented": "~2.3.0", - "rc-select": "~14.15.1", - "rc-slider": "~11.1.5", - "rc-steps": "~6.0.1", - "rc-switch": "~4.1.0", - "rc-table": "~7.45.7", - "rc-tabs": "~15.1.1", - "rc-textarea": "~1.8.1", - "rc-tooltip": "~6.2.0", - "rc-tree": "~5.8.8", - "rc-tree-select": "~5.22.1", - "rc-upload": "~4.7.0", - "rc-util": "^5.43.0", - "scroll-into-view-if-needed": "^3.1.0", - "throttle-debounce": "^5.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ant-design" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/antd/node_modules/@babel/runtime": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-equal": { - "version": "1.0.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/array-tree-filter": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/asap": { - "version": "2.0.6", - "license": "MIT" - }, - "node_modules/asn1.js": { - "version": "4.10.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/attr-accept": { - "version": "2.2.2", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "1.7.5", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-preval": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@types/babel__core": "^7.1.12", - "babel-plugin-macros": "^3.0.1", - "require-from-string": "^2.0.2" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/base16": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/bezier-js": { - "version": "6.1.4", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/Pomax/bezierjs/blob/master/FUNDING.md" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/browserslist": { - "version": "4.23.3", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-es6": { - "version": "4.9.3", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/cac": { - "version": "6.7.14", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/caching-transform/node_modules/make-dir": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caching-transform/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001653", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/canvas-color-tracker": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "tinycolor2": "^1.6.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chai": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/classnames": { - "version": "2.5.1", - "license": "MIT" - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comlink": { - "version": "4.4.1", - "license": "Apache-2.0" - }, - "node_modules/commander": { - "version": "9.2.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/compute-scroll-into-view": { - "version": "3.1.0", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/console-clear": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.6.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "license": "MIT", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, - "node_modules/core-js": { - "version": "3.38.1", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/cssfilter": { - "version": "0.0.10", - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/d3-array": { - "version": "3.2.4", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-binarytree": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force-3d": { - "version": "3.0.5", - "license": "MIT", - "dependencies": { - "d3-binarytree": "1", - "d3-dispatch": "1 - 3", - "d3-octree": "1", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "1.1.9", - "license": "BSD-3-Clause" - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-octree": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/d3-path": { - "version": "3.1.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/daikon": { - "version": "1.2.46", - "license": "MIT", - "dependencies": { - "@wearemothership/dicom-character-set": "^1.0.4-opt.1", - "fflate": "*", - "jpeg-lossless-decoder-js": "2.0.7", - "pako": "^2.1", - "xss": "1.0.14" - } - }, - "node_modules/daikon/node_modules/pako": { - "version": "2.1.0", - "license": "(MIT AND Zlib)" - }, - "node_modules/date-fns": { - "version": "3.6.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/dayjs": { - "version": "1.11.13", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.6", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decode-uri-component": { - "version": "0.4.1", - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/deep-diff": { - "version": "0.3.8", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delaunator": { - "version": "4.0.1", - "license": "ISC" - }, - "node_modules/delaunay-find": { - "version": "0.0.6", - "license": "ISC", - "dependencies": { - "delaunator": "^4.0.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/detect-gpu": { - "version": "5.0.45", - "license": "MIT", - "dependencies": { - "webgl-constants": "^1.1.1" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dicom-parser": { - "version": "1.8.21", - "license": "MIT" - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.13", - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.5.7", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/email-validator": { - "version": "2.0.4", - "engines": { - "node": ">4.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.21.5", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.1.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/fbemitter": { - "version": "3.0.0", - "license": "BSD-3-Clause", - "dependencies": { - "fbjs": "^3.0.0" - } - }, - "node_modules/fbjs": { - "version": "3.0.5", - "license": "MIT", - "dependencies": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^1.0.35" - } - }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/fetch-readablestream": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/fflate": { - "version": "0.7.3", - "license": "MIT" - }, - "node_modules/file-selector": { - "version": "0.6.0", - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/filter-obj": { - "version": "5.1.0", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flux": { - "version": "4.0.4", - "license": "BSD-3-Clause", - "dependencies": { - "fbemitter": "^3.0.0", - "fbjs": "^3.0.1" - }, - "peerDependencies": { - "react": "^15.0.2 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/focus-trap": { - "version": "7.5.4", - "license": "MIT", - "dependencies": { - "tabbable": "^6.2.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/force-graph": { - "version": "1.43.5", - "license": "MIT", - "dependencies": { - "@tweenjs/tween.js": "18 - 23", - "accessor-fn": "1", - "bezier-js": "3 - 6", - "canvas-color-tracker": "1", - "d3-array": "1 - 3", - "d3-drag": "2 - 3", - "d3-force-3d": "2 - 3", - "d3-scale": "1 - 4", - "d3-scale-chromatic": "1 - 3", - "d3-selection": "2 - 3", - "d3-zoom": "2 - 3", - "index-array-by": "1", - "kapsule": "^1.14", - "lodash-es": "4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fp-ts": { - "version": "2.16.9", - "license": "MIT" - }, - "node_modules/fromentries": { - "version": "1.3.2", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-port": { - "version": "3.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/get-stream": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gl-matrix": { - "version": "3.4.3", - "license": "MIT" - }, - "node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "license": "ISC" - }, - "node_modules/hammerjs": { - "version": "2.0.8", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/happy-dom": { - "version": "15.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.5.0", - "webidl-conversions": "^7.0.0", - "whatwg-mimetype": "^3.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/human-signals": { - "version": "5.0.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/immer": { - "version": "10.1.1", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/immutable": { - "version": "4.3.7", - "dev": true, - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/index-array-by": { - "version": "1.4.2", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/internmap": { - "version": "2.0.3", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/is-windows": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jerrypick": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/jpeg-lossless-decoder-js": { - "version": "2.0.7", - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "license": "ISC" - }, - "node_modules/json2mq": { - "version": "0.2.0", - "license": "MIT", - "dependencies": { - "string-convert": "^0.2.0" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kapsule": { - "version": "1.14.5", - "license": "MIT", - "dependencies": { - "lodash-es": "4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lefthook": { - "version": "1.7.14", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "lefthook": "bin/index.js" - }, - "optionalDependencies": { - "lefthook-darwin-arm64": "1.7.14", - "lefthook-darwin-x64": "1.7.14", - "lefthook-freebsd-arm64": "1.7.14", - "lefthook-freebsd-x64": "1.7.14", - "lefthook-linux-arm64": "1.7.14", - "lefthook-linux-x64": "1.7.14", - "lefthook-openbsd-arm64": "1.7.14", - "lefthook-openbsd-x64": "1.7.14", - "lefthook-windows-arm64": "1.7.14", - "lefthook-windows-x64": "1.7.14" - } - }, - "node_modules/lefthook-linux-x64": { - "version": "1.7.14", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/lefthook/node_modules/lefthook-darwin-arm64": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.14.tgz", - "integrity": "sha512-3hNr04A8DSYZk0RBTdu8D/kkE3FHiNnexAEvuFOqLuf3EQhrrX1wxclGO0+tIk3s7nyh+iqpV69Xd+cb4Fnvpw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/lefthook/node_modules/lefthook-darwin-x64": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.14.tgz", - "integrity": "sha512-cXVsxTS2IRKKRyYFEMjAxf0a/31M1PkiNAjlJPXQPoAxxC1rbsvkxWL8vXhH4P0AL18zSYVBf9aTktYArgQGuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/lefthook/node_modules/lefthook-freebsd-arm64": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.14.tgz", - "integrity": "sha512-rhx2ZkbWD6SkOXLc5/xyN1fu0uL9MLYBYKKg5T0rLRVwqqr9aYKZ+1Rru/5oL8utH1qkQyiwQkcjnKkyHwSjPg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/lefthook/node_modules/lefthook-freebsd-x64": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.14.tgz", - "integrity": "sha512-WeVPDm7JB1Crchc7OQ3uLiRfLlhwwX3N2662DPguMresps2r79dUO97LhHMzd+l1RKIqZIgnU+j5fKFI+cmw4w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/lefthook/node_modules/lefthook-linux-arm64": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.14.tgz", - "integrity": "sha512-IUvxJBfLDVComNc1Djk4VYUJsSAtdwfTvwpNxfaG2qb31VNvF6PPdp43bgpgqzV8O0KDCMm/sn0hlZ00GTuy2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/lefthook/node_modules/lefthook-openbsd-arm64": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-1.7.14.tgz", - "integrity": "sha512-Mq5GgjzDMiFin+Ucm52nizvvDQM1o+MnL/P+FDbBq253BIJGDJK+qEuQBgEQndE9bUyAP4qiHb+R6jz5fbpAlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/lefthook/node_modules/lefthook-openbsd-x64": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-1.7.14.tgz", - "integrity": "sha512-enbPte9MAYU2JHkcvUBRJrXI6JMVcQqJHN+F8yKOJLFBnthoR0ZUuSTzqAMOivj/wgncHkYPqOWIo1UfB+HpGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/lefthook/node_modules/lefthook-windows-arm64": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.14.tgz", - "integrity": "sha512-M9QbTs+Je0SRKC2c/0X8OQsme6glFrKxQoxWMFCN02S6nNLiHqP4vsHphJFU+wnAwv4KE8I1YKT5iMxde0Ejlg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/lefthook/node_modules/lefthook-windows-x64": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.14.tgz", - "integrity": "sha512-40Mx+a44kPZUF/AXV45EIgw03FANTXMFDBR1Ib8qYbSaf1cWqJtfeQs9R5Ea0EdqxXkGprzwZ+yUFFjjfOFIoQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" - }, - "node_modules/loader-utils": { - "version": "1.4.2", - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/loader-utils/node_modules/json5": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/local-access": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "license": "MIT" - }, - "node_modules/lodash.curry": { - "version": "4.1.1", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "license": "MIT" - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.flow": { - "version": "3.5.0", - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/magicast": { - "version": "0.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "13.0.3", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/micromark": { - "version": "4.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mitt": { - "version": "1.2.0", - "license": "MIT" - }, - "node_modules/mri": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.7", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nifti-reader-js": { - "version": "0.6.8", - "license": "MIT", - "dependencies": { - "fflate": "*" - } - }, - "node_modules/niivue-react": { - "resolved": "git+ssh://git@github.com/niivue/niivue-react.git#d7734b88359b61356fec5bfa302e02536e0a1134", - "dependencies": { - "dequal": "^2.0.3" - }, - "peerDependencies": { - "@niivue/niivue": "^0.44.2", - "react": "^17 || ^18", - "typescript": "^5.0.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-preload": { - "version": "0.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.18", - "license": "MIT" - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc": { - "version": "17.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^6.0.2", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/nyc/node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/nyc/node_modules/make-dir": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/nyc/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nyc/node_modules/test-exclude": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-queue": { - "version": "8.0.1", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "6.1.2", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/pako": { - "version": "1.0.11", - "license": "(MIT AND Zlib)" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.7", - "dev": true, - "license": "ISC", - "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "hash-base": "~3.0", - "pbkdf2": "^3.1.2", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-srcset": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "dev": true, - "license": "ISC" - }, - "node_modules/path-type": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/picocolors": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/platform": { - "version": "1.3.6", - "license": "MIT" - }, - "node_modules/playwright": { - "version": "1.46.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.46.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.46.1", - "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/postcss": { - "version": "8.4.41", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/preval.macro": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "babel-plugin-preval": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/process-es6": { - "version": "0.11.6", - "dev": true, - "license": "MIT" - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/promise": { - "version": "7.3.1", - "license": "MIT", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-color": { - "version": "1.3.0", - "license": "MIT" - }, - "node_modules/query-string": { - "version": "9.1.0", - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.4.1", - "filter-obj": "^5.1.0", - "split-on-first": "^3.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rc-cascader": { - "version": "3.27.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "array-tree-filter": "^2.1.0", - "classnames": "^2.3.1", - "rc-select": "~14.15.0", - "rc-tree": "~5.8.1", - "rc-util": "^5.37.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-checkbox": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.3.2", - "rc-util": "^5.25.2" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-collapse": { - "version": "3.7.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.3.4", - "rc-util": "^5.27.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-dialog": { - "version": "9.5.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/portal": "^1.0.0-8", - "classnames": "^2.2.6", - "rc-motion": "^2.3.0", - "rc-util": "^5.21.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-drawer": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@rc-component/portal": "^1.1.1", - "classnames": "^2.2.6", - "rc-motion": "^2.6.1", - "rc-util": "^5.38.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-drawer/node_modules/@babel/runtime": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/rc-dropdown": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.2.6", - "rc-util": "^5.17.0" - }, - "peerDependencies": { - "react": ">=16.11.0", - "react-dom": ">=16.11.0" - } - }, - "node_modules/rc-field-form": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.0", - "@rc-component/async-validator": "^5.0.3", - "rc-util": "^5.32.2" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-image": { - "version": "7.9.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.2", - "@rc-component/portal": "^1.0.2", - "classnames": "^2.2.6", - "rc-dialog": "~9.5.2", - "rc-motion": "^2.6.2", - "rc-util": "^5.34.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-input": { - "version": "1.6.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.18.1" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/rc-input-number": { - "version": "9.2.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/mini-decimal": "^1.0.1", - "classnames": "^2.2.5", - "rc-input": "~1.6.0", - "rc-util": "^5.40.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-mentions": { - "version": "2.15.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.22.5", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.2.6", - "rc-input": "~1.6.0", - "rc-menu": "~9.14.0", - "rc-textarea": "~1.8.0", - "rc-util": "^5.34.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-menu": { - "version": "9.14.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/trigger": "^2.0.0", - "classnames": "2.x", - "rc-motion": "^2.4.3", - "rc-overflow": "^1.3.1", - "rc-util": "^5.27.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-motion": { - "version": "2.9.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.43.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-notification": { - "version": "5.6.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.9.0", - "rc-util": "^5.20.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-overflow": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.37.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-pagination": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.3.2", - "rc-util": "^5.38.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-picker": { - "version": "4.6.14", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.7", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.2.1", - "rc-overflow": "^1.3.2", - "rc-resize-observer": "^1.4.0", - "rc-util": "^5.43.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "date-fns": ">= 2.x", - "dayjs": ">= 1.x", - "luxon": ">= 3.x", - "moment": ">= 2.x", - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - }, - "peerDependenciesMeta": { - "date-fns": { - "optional": true - }, - "dayjs": { - "optional": true - }, - "luxon": { - "optional": true - }, - "moment": { - "optional": true - } - } - }, - "node_modules/rc-picker/node_modules/@babel/runtime": { - "version": "7.25.4", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/rc-progress": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-util": "^5.16.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-rate": { - "version": "2.13.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.0.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-resize-observer": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.7", - "classnames": "^2.2.1", - "rc-util": "^5.38.0", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-segmented": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-motion": "^2.4.4", - "rc-util": "^5.17.0" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/rc-select": { - "version": "14.15.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/trigger": "^2.1.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-overflow": "^1.3.1", - "rc-util": "^5.16.1", - "rc-virtual-list": "^3.5.2" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-slider": { - "version": "11.1.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.36.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-steps": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.16.7", - "classnames": "^2.2.3", - "rc-util": "^5.16.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-switch": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0", - "classnames": "^2.2.1", - "rc-util": "^5.30.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-table": { - "version": "7.45.7", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/context": "^1.4.0", - "classnames": "^2.2.5", - "rc-resize-observer": "^1.1.0", - "rc-util": "^5.37.0", - "rc-virtual-list": "^3.14.2" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tabs": { - "version": "15.1.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.2", - "classnames": "2.x", - "rc-dropdown": "~4.2.0", - "rc-menu": "~9.14.0", - "rc-motion": "^2.6.2", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.34.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-textarea": { - "version": "1.8.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-input": "~1.6.0", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.27.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tooltip": { - "version": "6.2.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.2", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.3.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-tree": { - "version": "5.8.8", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-util": "^5.16.1", - "rc-virtual-list": "^3.5.1" - }, - "engines": { - "node": ">=10.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-tree-select": { - "version": "5.22.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-select": "~14.15.0", - "rc-tree": "~5.8.1", - "rc-util": "^5.16.1" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/rc-upload": { - "version": "4.7.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "classnames": "^2.2.5", - "rc-util": "^5.2.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-util": { - "version": "5.43.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "react-is": "^18.2.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-util/node_modules/react-is": { - "version": "18.3.1", - "license": "MIT" - }, - "node_modules/rc-virtual-list": { - "version": "3.14.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.0", - "classnames": "^2.2.6", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.36.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-activity": { - "version": "2.1.3", - "license": "MIT", - "peerDependencies": { - "react": ">= 15.0.0", - "react-dom": ">= 15.0.0" - } - }, - "node_modules/react-base16-styling": { - "version": "0.6.0", - "license": "MIT", - "dependencies": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" - } - }, - "node_modules/react-bootstrap-typeahead": { - "version": "6.3.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.14.6", - "@popperjs/core": "^2.10.2", - "@restart/hooks": "^0.4.0", - "classnames": "^2.2.0", - "fast-deep-equal": "^3.1.1", - "invariant": "^2.2.1", - "lodash.debounce": "^4.0.8", - "prop-types": "^15.5.8", - "react-overlays": "^5.2.0", - "react-popper": "^2.2.5", - "scroll-into-view-if-needed": "^3.1.0", - "warning": "^4.0.1" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/react-cookie": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.5", - "hoist-non-react-statics": "^3.3.2", - "universal-cookie": "^7.0.0" - }, - "peerDependencies": { - "react": ">= 16.3.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dropzone": { - "version": "14.2.3", - "license": "MIT", - "dependencies": { - "attr-accept": "^2.2.2", - "file-selector": "^0.6.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "react": ">= 16.8 || 18.0.0" - } - }, - "node_modules/react-error-boundary": { - "version": "4.0.13", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "license": "MIT" - }, - "node_modules/react-force-graph-2d": { - "version": "1.25.5", - "license": "MIT", - "dependencies": { - "force-graph": "1", - "prop-types": "15", - "react-kapsule": "2" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/react-json-view": { - "version": "1.21.3", - "license": "MIT", - "dependencies": { - "flux": "^4.0.1", - "react-base16-styling": "^0.6.0", - "react-lifecycles-compat": "^3.0.4", - "react-textarea-autosize": "^8.3.2" - }, - "peerDependencies": { - "react": "^17.0.0 || ^16.3.0 || ^15.5.4", - "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" - } - }, - "node_modules/react-kapsule": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "fromentries": "^1.3.2", - "jerrypick": "^1.1.1" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, - "node_modules/react-lazylog": { - "version": "4.5.3", - "license": "MPL-2.0", - "dependencies": { - "@mattiasbuelens/web-streams-polyfill": "^0.2.0", - "fetch-readablestream": "^0.2.0", - "immutable": "^3.8.2", - "mitt": "^1.1.2", - "prop-types": "^15.6.1", - "react-string-replace": "^0.4.1", - "react-virtualized": "^9.21.0", - "text-encoding-utf-8": "^1.0.1", - "whatwg-fetch": "^2.0.4" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "node_modules/react-lazylog/node_modules/immutable": { - "version": "3.8.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "license": "MIT" - }, - "node_modules/react-overlays": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.8", - "@popperjs/core": "^2.11.6", - "@restart/hooks": "^0.4.7", - "@types/warning": "^3.0.0", - "dom-helpers": "^5.2.0", - "prop-types": "^15.7.2", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": ">=16.3.0", - "react-dom": ">=16.3.0" - } - }, - "node_modules/react-popper": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - }, - "peerDependencies": { - "@popperjs/core": "^2.0.0", - "react": "^16.8.0 || ^17 || ^18", - "react-dom": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/react-redux": { - "version": "9.1.2", - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.3", - "use-sync-external-store": "^1.0.0" - }, - "peerDependencies": { - "@types/react": "^18.2.25", - "react": "^18.0", - "redux": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-router": { - "version": "6.26.1", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.19.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.26.1", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.19.1", - "react-router": "6.26.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-string-replace": { - "version": "0.4.4", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.4" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/react-textarea-autosize": { - "version": "8.5.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.13", - "use-composed-ref": "^1.3.0", - "use-latest": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-virtualized": { - "version": "9.22.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.7.2", - "clsx": "^1.0.4", - "dom-helpers": "^5.1.3", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "dev": true, - "license": "MIT", - "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" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/rechoir": { - "version": "0.6.2", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/redux": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/redux-devtools-extension": { - "version": "2.13.9", - "dev": true, - "license": "MIT", - "peerDependencies": { - "redux": "^3.1.0 || ^4.0.0" - } - }, - "node_modules/redux-logger": { - "version": "3.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-diff": "^0.3.5" - } - }, - "node_modules/redux-saga": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "@redux-saga/core": "^1.3.0" - } - }, - "node_modules/redux-thunk": { - "version": "3.1.0", - "license": "MIT", - "peerDependencies": { - "redux": "^5.0.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "license": "MIT" - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/reselect": { - "version": "5.1.1", - "license": "MIT" - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.8", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rollup": { - "version": "4.21.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.1", - "@rollup/rollup-android-arm64": "4.21.1", - "@rollup/rollup-darwin-arm64": "4.21.1", - "@rollup/rollup-darwin-x64": "4.21.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.1", - "@rollup/rollup-linux-arm-musleabihf": "4.21.1", - "@rollup/rollup-linux-arm64-gnu": "4.21.1", - "@rollup/rollup-linux-arm64-musl": "4.21.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.1", - "@rollup/rollup-linux-riscv64-gnu": "4.21.1", - "@rollup/rollup-linux-s390x-gnu": "4.21.1", - "@rollup/rollup-linux-x64-gnu": "4.21.1", - "@rollup/rollup-linux-x64-musl": "4.21.1", - "@rollup/rollup-win32-arm64-msvc": "4.21.1", - "@rollup/rollup-win32-ia32-msvc": "4.21.1", - "@rollup/rollup-win32-x64-msvc": "4.21.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-node-builtins": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.0.0.tgz", - "integrity": "sha512-jvsEYNf5U95YttEQbs5c6H7YSMYGs3SWA8/MfnlQ9ddijsgYbq8uKx4WQ1J8Zyrq+tgPF0Quu48PURrlcMZWoQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "buffer-es6": "^4.9.2", - "crypto-browserify": "^3.11.0", - "process-es6": "^0.11.2" - } - }, - "node_modules/rollup/node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.1.tgz", - "integrity": "sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.1.tgz", - "integrity": "sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.1.tgz", - "integrity": "sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.1.tgz", - "integrity": "sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.1.tgz", - "integrity": "sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.1.tgz", - "integrity": "sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.1.tgz", - "integrity": "sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.1.tgz", - "integrity": "sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.1.tgz", - "integrity": "sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.1.tgz", - "integrity": "sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.1.tgz", - "integrity": "sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.1.tgz", - "integrity": "sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.1.tgz", - "integrity": "sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.1.tgz", - "integrity": "sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.1.tgz", - "integrity": "sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/rollup/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/rusha": { - "version": "0.8.14", - "license": "MIT" - }, - "node_modules/rxjs": { - "version": "7.8.1", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/sanitize-html": { - "version": "2.13.0", - "license": "MIT", - "dependencies": { - "deepmerge": "^4.2.2", - "escape-string-regexp": "^4.0.0", - "htmlparser2": "^8.0.0", - "is-plain-object": "^5.0.0", - "parse-srcset": "^1.0.2", - "postcss": "^8.3.11" - } - }, - "node_modules/sanitize-html/node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/scroll-into-view-if-needed": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "compute-scroll-into-view": "^3.0.2" - } - }, - "node_modules/seedrandom": { - "version": "3.0.5", - "license": "MIT" - }, - "node_modules/semiver": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "license": "MIT" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "dev": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shader-loader": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "license": "BSD-3-Clause", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shlex": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/siginfo": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "node_modules/sirv": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sirv-cli": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "console-clear": "^1.1.0", - "get-port": "^3.2.0", - "kleur": "^4.1.4", - "local-access": "^1.0.1", - "sade": "^1.6.0", - "semiver": "^1.0.0", - "sirv": "^2.0.0", - "tinydate": "^1.0.0" - }, - "bin": { - "sirv": "bin.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spark-md5": { - "version": "3.0.2", - "license": "(WTFPL OR MIT)" - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/make-dir": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/spawn-wrap/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/split-on-first": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "license": "BSD-3-Clause" - }, - "node_modules/stackback": { - "version": "0.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.7.0", - "dev": true, - "license": "MIT" - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/string-convert": { - "version": "0.2.1", - "license": "MIT" - }, - "node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylis": { - "version": "4.3.4", - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "license": "MIT" - }, - "node_modules/test-exclude": { - "version": "7.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/test-exclude/node_modules/foreground-child": { - "version": "3.3.0", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "10.4.5", - "dev": true, - "license": "ISC", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/text-encoding-utf-8": { - "version": "1.0.2" - }, - "node_modules/throttle-debounce": { - "version": "5.0.2", - "license": "MIT", - "engines": { - "node": ">=12.22" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "license": "MIT" - }, - "node_modules/tinydate": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/tinypool": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/totalist": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/tslib": { - "version": "2.7.0", - "license": "0BSD" - }, - "node_modules/type-fest": { - "version": "0.8.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-compare": { - "version": "0.0.2", - "license": "MIT", - "dependencies": { - "typescript-logic": "^0.0.0" - } - }, - "node_modules/typescript-logic": { - "version": "0.0.0", - "license": "MIT" - }, - "node_modules/typescript-tuple": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "typescript-compare": "^0.0.2" - } - }, - "node_modules/ua-parser-js": { - "version": "1.0.38", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/uncontrollable": { - "version": "7.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "license": "MIT" - }, - "node_modules/universal-cookie": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "@types/cookie": "^0.6.0", - "cookie": "^0.6.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.0", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-ackee": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "ackee-tracker": "^5.1.0" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-composed-ref": { - "version": "1.3.0", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-immer": { - "version": "0.10.0", - "license": "MIT", - "peerDependencies": { - "immer": ">=8.0.0", - "react": "^16.8.0 || ^17.0.1 || ^18.0.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-latest": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "use-isomorphic-layout-effect": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.2", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/victory-area": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2", - "victory-vendor": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-axis": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-bar": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2", - "victory-vendor": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-box-plot": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2", - "victory-vendor": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-brush-container": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "react-fast-compare": "^3.2.0", - "victory-core": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-chart": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "react-fast-compare": "^3.2.0", - "victory-axis": "^37.0.2", - "victory-core": "^37.0.2", - "victory-polar-axis": "^37.0.2", - "victory-shared-events": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-core": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.21", - "react-fast-compare": "^3.2.0", - "victory-vendor": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-create-container": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-brush-container": "^37.0.2", - "victory-core": "^37.0.2", - "victory-cursor-container": "^37.0.2", - "victory-selection-container": "^37.0.2", - "victory-voronoi-container": "^37.0.2", - "victory-zoom-container": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-cursor-container": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-group": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "react-fast-compare": "^3.2.0", - "victory-core": "^37.0.2", - "victory-shared-events": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-legend": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-line": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2", - "victory-vendor": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-pie": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2", - "victory-vendor": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-polar-axis": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-scatter": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-selection-container": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-shared-events": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.19", - "react-fast-compare": "^3.2.0", - "victory-core": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-stack": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "react-fast-compare": "^3.2.0", - "victory-core": "^37.0.2", - "victory-shared-events": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-tooltip": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-vendor": { - "version": "37.0.2", - "license": "MIT AND ISC", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, - "node_modules/victory-voronoi-container": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "delaunay-find": "0.0.6", - "lodash": "^4.17.19", - "react-fast-compare": "^3.2.0", - "victory-core": "^37.0.2", - "victory-tooltip": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-zoom-container": { - "version": "37.0.2", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.19", - "victory-core": "^37.0.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/vite": { - "version": "5.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.41", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.5", - "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-babel-macros": { - "version": "1.0.6", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.17.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7", - "@types/babel__core": "^7.1.18", - "babel-plugin-macros": "^3.1.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "vite": ">=2" - } - }, - "node_modules/vite-plugin-istanbul": { - "version": "6.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.1.0", - "espree": "^10.0.1", - "istanbul-lib-instrument": "^6.0.2", - "picocolors": "^1.0.0", - "source-map": "^0.7.4", - "test-exclude": "^6.0.0" - }, - "peerDependencies": { - "vite": ">=4 <=6" - } - }, - "node_modules/vite-plugin-istanbul/node_modules/test-exclude": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/vitest": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.5", - "@vitest/pretty-format": "^2.0.5", - "@vitest/runner": "2.0.5", - "@vitest/snapshot": "2.0.5", - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", - "pathe": "^1.1.2", - "std-env": "^3.7.0", - "tinybench": "^2.8.0", - "tinypool": "^1.0.0", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.0.5", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.5", - "@vitest/ui": "2.0.5", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/warning": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/webgl-constants": { - "version": "1.1.1" - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/webworker-promise": { - "version": "0.5.0", - "license": "MIT" - }, - "node_modules/whatwg-fetch": { - "version": "2.0.4", - "license": "MIT" - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/whatwg-url/node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/worker-loader": { - "version": "3.0.8", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/worker-loader/node_modules/loader-utils": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/write-file-atomic/node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/xmlbuilder2": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "@oozcitak/dom": "1.15.10", - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8", - "@types/node": "*", - "js-yaml": "3.14.0" - }, - "engines": { - "node": ">=12.0" - } - }, - "node_modules/xmlbuilder2/node_modules/js-yaml": { - "version": "3.14.0", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/xss": { - "version": "1.0.14", - "license": "MIT", - "dependencies": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - }, - "bin": { - "xss": "bin/xss" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/xss/node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "node_modules/y18n": { - "version": "4.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/yallist": { - "version": "3.1.1", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "15.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - } - } -} diff --git a/package.json b/package.json index 90ac17035..1e51ec89b 100644 --- a/package.json +++ b/package.json @@ -4,25 +4,25 @@ "version": "0.0.0", "scripts": { "start": "sirv dist --host --port ${PORT:=8080} --single --etag --quiet", - "__start": "# npm start command is used by s2i in OpenShift as the deployment command", - "dev": "npm run dev:local", - "dev:local": "npm run test:prepare && vite", + "__start": "# pnpm start command is used by s2i in OpenShift as the deployment command", + "dev": "pnpm run dev:local", + "dev:local": "pnpm run test:prepare && vite", "dev:public": "vite -c testing/publicCUBE/vite.config.ts", "dev:metal": "vite", "build": "vite build", "test": "vitest", "__test:prepare:comment": "# test:prepare runs CUBE locally and loads sample DICOM data into the PACS.", - "test:prepare": "npm run minichris:up && npm run get-dicoms && npm run minichris:wipe", + "test:prepare": "pnpm run minichris:up && pnpm run get-dicoms && pnpm run minichris:wipe", "test:e2e": "playwright test -c playwright.config.ts", - "test:e2e:local": "env TEST_LOCAL=yes npm run test:e2e", + "test:e2e:local": "env TEST_LOCAL=yes pnpm run test:e2e", "test:report": "nyc report --reporter=text", "test:lcov": "nyc report --reporter=lcov", "test:ui": "playwright test -c playwright.config.ts --ui", - "test:ui:local": "env TEST_LOCAL=yes npm run test:ui", - "test:codegen": "playwright codegen $(npm run -s get-running-url)", - "test:codegen:mobile": "playwright codegen --device 'Pixel 5' $(npm run -s get-running-url)", + "test:ui:local": "env TEST_LOCAL=yes pnpm run test:ui", + "test:codegen": "playwright codegen $(pnpm run -s get-running-url)", + "test:codegen:mobile": "playwright codegen --device 'Pixel 5' $(pnpm run -s get-running-url)", "__minichris:comment": "# The minichris:* commands are for running a ChRIS backend locally", - "minichris:up": "cd testing/miniChRIS && docker compose --profile pacs up -d && cd - && npm run chrisomatic", + "minichris:up": "cd testing/miniChRIS && docker compose --profile pacs up -d && cd - && pnpm run chrisomatic", "minichris:down": "cd testing/miniChRIS && ./unmake.sh", "minichris:wipe": "./testing/miniChRIS/scripts/clear_pacsfiles.sh", "chrisomatic": "testing/chrisomatic.sh", @@ -40,35 +40,35 @@ "dependencies": { "@cornerstonejs/core": "^1.84.4", "@cornerstonejs/dicom-image-loader": "^1.84.4", - "@cornerstonejs/streaming-image-volume-loader": "^1.82.4", + "@cornerstonejs/streaming-image-volume-loader": "^1.84.4", "@cornerstonejs/tools": "^1.84.4", "@fnndsc/chrisapi": "^1.22.0", "@fontsource/inter": "^5.0.20", - "@niivue/niivue": "^0.41.1", + "@niivue/niivue": "0.44.2", "@patternfly/react-catalog-view-extension": "^5.0.0", "@patternfly/react-charts": "^7.3.0", "@patternfly/react-core": "^5.3.4", + "@patternfly/react-icons": "^5.4.0", "@patternfly/react-log-viewer": "^5.2.0", + "@patternfly/react-styles": "^5.4.0", "@patternfly/react-table": "^5.3.4", "@react-hook/resize-observer": "^2.0.1", "@reduxjs/toolkit": "^2.2.7", - "@tanstack/react-query": "^5.51.1", - "@types/d3-shape": "^3.1.6", - "@types/d3-zoom": "^3.0.8", - "antd": "^5.20.3", + "@tanstack/react-query": "^5.56.2", + "antd": "^5.20.6", "axios": "^1.7.2", - "d3-hierarchy": "^1.1.9", + "d3-hierarchy": "^3.1.2", "d3-selection": "^3.0.0", "d3-shape": "^3.2.0", "d3-zoom": "^3.0.0", - "date-fns": "^3.6.0", + "date-fns": "^4.1.0", "dicom-parser": "^1.8.21", "email-validator": "^2.0.4", "fp-ts": "^2.16.8", "hammerjs": "^2.0.8", "immer": "^10.1.1", "lodash": "^4.17.21", - "marked": "^13.0.2", + "marked": "14.1.2", "micromark": "^4.0.0", "micromark-extension-gfm": "^3.0.0", "niivue-react": "github:niivue/niivue-react", @@ -88,44 +88,45 @@ "react-json-view": "^1.21.3", "react-lazylog": "^4.5.3", "react-redux": "^9.1.0", - "react-router": "^6.21.3", - "react-router-dom": "^6.24.0", + "react-router": "^6.26.2", + "react-router-dom": "^6.26.2", "redux-saga": "^1.3.0", "rusha": "^0.8.14", "sanitize-html": "^2.11.0", "shlex": "^2.1.2", "sirv-cli": "^2.0.2", - "typescript": "^5.5.3", + "typescript": "^5.6.2", "use-ackee": "^3.0.1", "use-immer": "^0.10.0", - "uuid": "^9.0.1", + "uuid": "^10.0.0", "vite-plugin-babel-macros": "^1.0.6" }, "devDependencies": { - "@biomejs/biome": "1.8.3", - "@faker-js/faker": "^8.4.0", + "@biomejs/biome": "1.9.1", + "@faker-js/faker": "^9.0.1", "@playwright/test": "^1.41.2", "@redux-devtools/extension": "^3.3.0", - "@types/d3-hierarchy": "^1.1.7", - "@types/d3-selection": "^1.4.3", + "@types/d3-hierarchy": "3.1.7", + "@types/d3-selection": "3.0.10", + "@types/d3-shape": "^3.1.6", + "@types/d3-zoom": "^3.0.8", "@types/lodash": "^4.14.202", - "@types/node": "^20.11.5", + "@types/node": "^22.5.5", "@types/react": "^18.3.1", "@types/react-dom": "^18.3.0", "@types/redux-logger": "^3.0.11", - "@types/uuid": "^9.0.6", + "@types/uuid": "10.0.0", "@vitejs/plugin-react-swc": "^3.5.0", - "@vitest/coverage-v8": "^2.0.5", + "@vitest/coverage-v8": "2.1.1", "happy-dom": "^15.0.0", "lefthook": "^1.6.1", "nyc": "^17.0.0", "playwright": "^1.41.2", - "redux-devtools-extension": "^2.13.9", - "redux-logger": "^3.0.6", + "redux-logger": "4.0.0", "rollup-plugin-node-builtins": "^2.0.0", - "vite": "^5.3.2", + "vite": "5.4.6", "vite-plugin-istanbul": "^6.0.2", - "vitest": "^2.0.5" + "vitest": "2.1.1" }, "type": "module" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..b71909eb7 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,9143 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@cornerstonejs/core': + specifier: ^1.84.4 + version: 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + '@cornerstonejs/dicom-image-loader': + specifier: ^1.84.4 + version: 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + '@cornerstonejs/streaming-image-volume-loader': + specifier: ^1.84.4 + version: 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + '@cornerstonejs/tools': + specifier: ^1.84.4 + version: 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@icr/polyseg-wasm@0.4.0)(@kitware/vtk.js@30.4.1(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(autoprefixer@10.4.20(postcss@8.4.47))(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)(webpack@5.94.0)(wslink@2.2.1) + '@fnndsc/chrisapi': + specifier: ^1.22.0 + version: 1.22.0 + '@fontsource/inter': + specifier: ^5.0.20 + version: 5.0.20 + '@niivue/niivue': + specifier: 0.44.2 + version: 0.44.2 + '@patternfly/react-catalog-view-extension': + specifier: ^5.0.0 + version: 5.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-charts': + specifier: ^7.3.0 + version: 7.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-core': + specifier: ^5.3.4 + version: 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-icons': + specifier: ^5.4.0 + version: 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-log-viewer': + specifier: ^5.2.0 + version: 5.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-styles': + specifier: ^5.4.0 + version: 5.4.0 + '@patternfly/react-table': + specifier: ^5.3.4 + version: 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-hook/resize-observer': + specifier: ^2.0.1 + version: 2.0.2(react@18.3.1) + '@reduxjs/toolkit': + specifier: ^2.2.7 + version: 2.2.7(react-redux@9.1.2(@types/react@18.3.4)(react@18.3.1)(redux@5.0.1))(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) + antd: + specifier: ^5.20.6 + version: 5.20.6(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + axios: + specifier: ^1.7.2 + version: 1.7.5 + d3-hierarchy: + specifier: ^3.1.2 + version: 3.1.2 + d3-selection: + specifier: ^3.0.0 + version: 3.0.0 + d3-shape: + specifier: ^3.2.0 + version: 3.2.0 + d3-zoom: + specifier: ^3.0.0 + version: 3.0.0 + date-fns: + specifier: ^4.1.0 + version: 4.1.0 + dicom-parser: + specifier: ^1.8.21 + version: 1.8.21 + email-validator: + specifier: ^2.0.4 + version: 2.0.4 + fp-ts: + specifier: ^2.16.8 + version: 2.16.9 + hammerjs: + specifier: ^2.0.8 + version: 2.0.8 + immer: + specifier: ^10.1.1 + version: 10.1.1 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + marked: + specifier: 14.1.2 + version: 14.1.2 + micromark: + specifier: ^4.0.0 + version: 4.0.0 + micromark-extension-gfm: + specifier: ^3.0.0 + version: 3.0.0 + niivue-react: + specifier: github:niivue/niivue-react + version: https://codeload.github.com/niivue/niivue-react/tar.gz/d7734b88359b61356fec5bfa302e02536e0a1134(@niivue/niivue@0.44.2)(react@18.3.1)(typescript@5.6.2) + p-queue: + specifier: ^8.0.1 + version: 8.0.1 + pako: + specifier: ^1.0.11 + version: 1.0.11 + preval.macro: + specifier: ^5.0.0 + version: 5.0.0 + query-string: + specifier: ^9.0.0 + version: 9.1.0 + rc-tree: + specifier: ^5.8.0 + version: 5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-activity: + specifier: ^2.1.3 + version: 2.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-bootstrap-typeahead: + specifier: ^6.2.3 + version: 6.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-cookie: + specifier: ^7.1.4 + version: 7.2.0(react@18.3.1) + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-dropzone: + specifier: ^14.2.3 + version: 14.2.3(react@18.3.1) + react-error-boundary: + specifier: ^4.0.13 + version: 4.0.13(react@18.3.1) + react-force-graph-2d: + specifier: ^1.25.3 + version: 1.25.5(react@18.3.1) + react-json-view: + specifier: ^1.21.3 + version: 1.21.3(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-lazylog: + specifier: ^4.5.3 + version: 4.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-redux: + specifier: ^9.1.0 + version: 9.1.2(@types/react@18.3.4)(react@18.3.1)(redux@5.0.1) + react-router: + specifier: ^6.26.2 + version: 6.26.2(react@18.3.1) + react-router-dom: + specifier: ^6.26.2 + version: 6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + redux-saga: + specifier: ^1.3.0 + version: 1.3.0 + rusha: + specifier: ^0.8.14 + version: 0.8.14 + sanitize-html: + specifier: ^2.11.0 + version: 2.13.0 + shlex: + specifier: ^2.1.2 + version: 2.1.2 + sirv-cli: + specifier: ^2.0.2 + version: 2.0.2 + typescript: + specifier: ^5.6.2 + version: 5.6.2 + use-ackee: + specifier: ^3.0.1 + version: 3.1.0(react@18.3.1) + use-immer: + specifier: ^0.10.0 + version: 0.10.0(immer@10.1.1)(react@18.3.1) + uuid: + specifier: ^10.0.0 + version: 10.0.0 + vite-plugin-babel-macros: + specifier: ^1.0.6 + version: 1.0.6(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0)) + devDependencies: + '@biomejs/biome': + specifier: 1.9.1 + version: 1.9.1 + '@faker-js/faker': + specifier: ^9.0.1 + version: 9.0.1 + '@playwright/test': + specifier: ^1.41.2 + version: 1.46.1 + '@redux-devtools/extension': + specifier: ^3.3.0 + version: 3.3.0(redux@5.0.1) + '@types/d3-hierarchy': + specifier: 3.1.7 + version: 3.1.7 + '@types/d3-selection': + specifier: 3.0.10 + version: 3.0.10 + '@types/d3-shape': + specifier: ^3.1.6 + version: 3.1.6 + '@types/d3-zoom': + specifier: ^3.0.8 + version: 3.0.8 + '@types/lodash': + specifier: ^4.14.202 + version: 4.17.7 + '@types/node': + specifier: ^22.5.5 + version: 22.5.5 + '@types/react': + specifier: ^18.3.1 + version: 18.3.4 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@types/redux-logger': + specifier: ^3.0.11 + version: 3.0.13 + '@types/uuid': + specifier: 10.0.0 + version: 10.0.0 + '@vitejs/plugin-react-swc': + specifier: ^3.5.0 + version: 3.7.0(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0)) + '@vitest/coverage-v8': + specifier: 2.1.1 + version: 2.1.1(vitest@2.1.1(@types/node@22.5.5)(happy-dom@15.0.0)(terser@5.33.0)) + happy-dom: + specifier: ^15.0.0 + version: 15.0.0 + lefthook: + specifier: ^1.6.1 + version: 1.7.14 + nyc: + specifier: ^17.0.0 + version: 17.0.0 + playwright: + specifier: ^1.41.2 + version: 1.46.1 + redux-logger: + specifier: 4.0.0 + version: 4.0.0 + rollup-plugin-node-builtins: + specifier: ^2.0.0 + version: 2.0.0 + vite: + specifier: 5.4.6 + version: 5.4.6(@types/node@22.5.5)(terser@5.33.0) + vite-plugin-istanbul: + specifier: ^6.0.2 + version: 6.0.2(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0)) + vitest: + specifier: 2.1.1 + version: 2.1.1(@types/node@22.5.5)(happy-dom@15.0.0)(terser@5.33.0) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@ant-design/colors@7.1.0': + resolution: {integrity: sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==} + + '@ant-design/cssinjs-utils@1.1.0': + resolution: {integrity: sha512-E9nOWObXx7Dy7hdyuYlOFaer/LtPO7oyZVxZphh0CYEslr5EmhJPM3WI0Q2RBHRtYg6dSNqeSK73kvZjPN3IMQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@ant-design/cssinjs@1.21.1': + resolution: {integrity: sha512-tyWnlK+XH7Bumd0byfbCiZNK43HEubMoCcu9VxwsAwiHdHTgWa+tMN0/yvxa+e8EzuFP1WdUNNPclRpVtD33lg==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@ant-design/fast-color@2.0.6': + resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==} + engines: {node: '>=8.x'} + + '@ant-design/icons-svg@4.4.2': + resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + + '@ant-design/icons@5.4.0': + resolution: {integrity: sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@ant-design/react-slick@1.1.2': + resolution: {integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==} + peerDependencies: + react: '>=16.9.0' + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.25.4': + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.25.5': + resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.4': + resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.25.2': + resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.2': + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-member-expression-to-functions@7.24.8': + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.24.7': + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.25.0': + resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.25.0': + resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.25.0': + resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.25.4': + resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3': + resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0': + resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0': + resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7': + resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0': + resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3': + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.25.6': + resolution: {integrity: sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.25.6': + resolution: {integrity: sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.4': + resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.24.7': + resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.25.4': + resolution: {integrity: sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.24.7': + resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.24.7': + resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.25.0': + resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.25.4': + resolution: {integrity: sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.24.7': + resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.25.4': + resolution: {integrity: sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.24.7': + resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.24.8': + resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.24.7': + resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.24.7': + resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0': + resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.24.7': + resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.24.7': + resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.24.7': + resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.24.7': + resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.25.1': + resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.24.7': + resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.25.2': + resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.24.7': + resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.24.7': + resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.24.7': + resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.24.8': + resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.25.0': + resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.24.7': + resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7': + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.24.7': + resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7': + resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.24.7': + resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.24.7': + resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.24.7': + resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.24.7': + resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.24.8': + resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.24.7': + resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.25.4': + resolution: {integrity: sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.24.7': + resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.24.7': + resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.24.7': + resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-reserved-words@7.24.7': + resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.24.7': + resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.24.7': + resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.24.7': + resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.24.7': + resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.24.8': + resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.24.7': + resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.24.7': + resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.24.7': + resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.25.4': + resolution: {integrity: sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.25.4': + resolution: {integrity: sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/regjsgen@0.8.0': + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + '@babel/runtime@7.22.11': + resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.25.4': + resolution: {integrity: sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.4': + resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.25.4': + resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@biomejs/biome@1.9.1': + resolution: {integrity: sha512-Ps0Rg0zg3B1zpx+zQHMz5b0n0PBNCAaXttHEDTVrJD5YXR6Uj3T+abTDgeS3wsu4z5i2whqcE1lZxGyWH4bZYg==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.9.1': + resolution: {integrity: sha512-js0brHswq/BoeKgfSEUJYOjUOlML6p65Nantti+PsoQ61u9+YVGIZ7325LK7iUpDH8KVJT+Bx7K2b/6Q//W1Pw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.9.1': + resolution: {integrity: sha512-2zVyjUg5rN0k8XrytkubQWLbp2r/AS5wPhXs4vgVjvqbLnzo32EGX8p61gzroF2dH9DCUCfskdrigCGqNdEbpg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.9.1': + resolution: {integrity: sha512-L/JmXKvhsZ1lTgqOr3tWkzuY/NRppdIscHeC9aaiR72WjnBgJS94mawl9BWmGB3aWBc0q6oSDWnBS7617EMMmA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.9.1': + resolution: {integrity: sha512-QgxwfnG+r2aer5RNGR67Ey91Tv7xXW8E9YckHhwuyWjdLEvKWkrSJrhVG/6ub0kVvTSNkYOuT/7/jMOFBuUbRA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.9.1': + resolution: {integrity: sha512-gY+eFLIAW45v3WicQHicvjRfA0ntMZHx7h937bXwBMFNFoKmB6rMi6+fKQ6/hiS6juhsFxZdZIz20m15s49J6A==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.9.1': + resolution: {integrity: sha512-F0INygtzI2L2n2R1KtYHGr3YWDt9Up1zrUluwembM+iJ1dXN3qzlSb7deFUsSJm4FaIPriqs6Xa56ukdQW6UeQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.9.1': + resolution: {integrity: sha512-7Jahxar3OB+aTPOgXisMJmMKMsjcK+UmdlG3UIOQjzN/ZFEsPV+GT3bfrVjZDQaCw/zes0Cqd7VTWFjFTC/+MQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.9.1': + resolution: {integrity: sha512-liSRWjWzFhyG7s1jg/Bbv9FL+ha/CEd5tFO3+dFIJNplL4TnvAivtyfRVi/tu/pNjISbV1k9JwdBewtAKAgA0w==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@cornerstonejs/codec-charls@1.2.3': + resolution: {integrity: sha512-qKUe6DN0dnGzhhfZLYhH9UZacMcudjxcaLXCrpxJImT/M/PQvZCT2rllu6VGJbWKJWG+dMVV2zmmleZcdJ7/cA==} + engines: {node: '>=0.14'} + + '@cornerstonejs/codec-libjpeg-turbo-8bit@1.2.2': + resolution: {integrity: sha512-aAUMK2958YNpOb/7G6e2/aG7hExTiFTASlMt/v90XA0pRHdWiNg5ny4S5SAju0FbIw4zcMnR0qfY+yW3VG2ivg==} + engines: {node: '>=0.14'} + + '@cornerstonejs/codec-openjpeg@1.2.4': + resolution: {integrity: sha512-UT2su6xZZnCPSuWf2ldzKa/2+guQ7BGgfBSKqxanggwJHh48gZqIAzekmsLyJHMMK5YDK+ti+fzvVJhBS3Xi/g==} + engines: {node: '>=0.14'} + + '@cornerstonejs/codec-openjph@2.4.5': + resolution: {integrity: sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==} + engines: {node: '>=0.14'} + + '@cornerstonejs/core@1.84.4': + resolution: {integrity: sha512-+6Sa5EUWVbXqiR/+tHFzzMrMO8V2mAmi1oQt3iiBIm5roXzU++1smsckWgsRdZOgfHhQbHjkdEixlfuMGToiaw==} + + '@cornerstonejs/dicom-image-loader@1.84.4': + resolution: {integrity: sha512-IFRKmau82ku0vaqAduc98HcObgCfeyzZdAfQ/HiYA4RfWMZSGJm9DQiZXW+VUzlzim+8HEdwOrKY79AK7GylLg==} + + '@cornerstonejs/streaming-image-volume-loader@1.84.4': + resolution: {integrity: sha512-pspEAliroIAWk27MBcK2fc2Mm4M9SkbntXZJZMyiH42zufncm627HpJ4nzDHYkceNfyy+ifZynrH1/uF73QWDQ==} + + '@cornerstonejs/tools@1.84.4': + resolution: {integrity: sha512-p2G811Xoez88hhYvIzHqXwsCjT0laLJc0hDREUapxqjcgL8FbKsIq+Pn8pWT2z/eYBcOW5ocXxnTRAs6mFRpuA==} + peerDependencies: + '@icr/polyseg-wasm': 0.4.0 + '@kitware/vtk.js': 30.4.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 + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@emotion/hash@0.8.0': + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + + '@emotion/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@faker-js/faker@9.0.1': + resolution: {integrity: sha512-4mDeYIgM3By7X6t5E6eYwLAa+2h4DeZDF7thhzIg6XB76jeEvMwadYAMCFJL/R4AnEBcAUO9+gL0vhy3s+qvZA==} + engines: {node: '>=18.0.0', npm: '>=9.0.0'} + + '@fnndsc/chrisapi@1.22.0': + resolution: {integrity: sha512-npmjbFouPcQn56P6KAHUCFKS2VGf168VlqWzyzencbZQHNbTB6pMzw+LKTO3Xt9ShYy1iNrdelhr41HaP+AlCQ==} + + '@fontsource/inter@5.0.20': + resolution: {integrity: sha512-rtw2F7xfM7rJmmnncXnR4ADr5wXsp4GyN1O1jmQJ1PMjAK+bm620/ZkQkeOYOkGoa09OksGinOeMA+Mkt6K9PQ==} + + '@icr/polyseg-wasm@0.4.0': + resolution: {integrity: sha512-3sZmiwG8I0NaqPle0L7+V/ZexiR7IjIUFkUsaOoFI9rNuBGyyMMmxAxnCmqcDFtBDk9h+JEYJf6e3NnqlHi/HQ==} + engines: {node: '>=0.14'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@kitware/vtk.js@30.4.1': + resolution: {integrity: sha512-jBJFm8AyWpJjNFFBadXyvBwegdD9M6WRdxmIb+x/MVpCyA5lEZSMemhiMn71oKsznaEe5Pjv2VDVJWmwK0vhUg==} + hasBin: true + peerDependencies: + '@babel/preset-env': ^7.17.10 + autoprefixer: ^10.4.7 + wslink: '>=1.1.0 || ^2.0.0' + + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + + '@lukeed/uuid@2.0.1': + resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} + engines: {node: '>=8'} + + '@mattiasbuelens/web-streams-polyfill@0.2.1': + resolution: {integrity: sha512-oKuFCQFa3W7Hj7zKn0+4ypI8JFm4ZKIoncwAC6wd5WwFW2sL7O1hpPoJdSWpynQ4DJ4lQ6MvFoVDmCLilonDFg==} + engines: {node: '>= 8'} + deprecated: moved to web-streams-polyfill@2.0.0 + + '@msgpack/msgpack@2.8.0': + resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} + engines: {node: '>= 10'} + + '@niivue/niivue@0.44.2': + resolution: {integrity: sha512-ddShcApln/xJQa1dIo7DPpcRPoabBA6n7Wy8gtwA1S6srhZn2PdaPep1VEqdS82ufbFier0SRFE4lVzt7/ZDKw==} + + '@oozcitak/dom@1.15.10': + resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} + engines: {node: '>=8.0'} + + '@oozcitak/infra@1.0.8': + resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} + engines: {node: '>=6.0'} + + '@oozcitak/url@1.0.4': + resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} + engines: {node: '>=8.0'} + + '@oozcitak/util@8.3.8': + resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} + engines: {node: '>=8.0'} + + '@patternfly/react-catalog-view-extension@5.0.0': + resolution: {integrity: sha512-Sg0iLAVhE7wAwBJERNdYp6peMO4THG7ez3xvMXEWh2biXghIv9XVj5BEy0TssihMxZa/pRMdROzcv3QZ9m24Yg==} + peerDependencies: + react: ^17 || ^18 + react-dom: ^17 || ^18 + + '@patternfly/react-charts@7.4.0': + resolution: {integrity: sha512-2nvjoGw+ndAwiSFds041wMb4c1BnflyWLAutyC1kYTawhlKrSDGsd4heKWmquzg7GTLBzr1w6YbxKv2i2l7Z7g==} + peerDependencies: + react: ^17 || ^18 + react-dom: ^17 || ^18 + + '@patternfly/react-core@5.4.0': + resolution: {integrity: sha512-Tz2Y9V4G2pnwrylc/4/FyxIRFvxiA8BEBIG6UBwXxrstnJmJaHgAIy6QJdJmERzVx3GVDz6/rM0PnMqa5R6auQ==} + peerDependencies: + react: ^17 || ^18 + react-dom: ^17 || ^18 + + '@patternfly/react-icons@5.4.0': + resolution: {integrity: sha512-2M3qN/naultvRHeG2laJMmoIroFCGAyfwTVrnCjSkG6/KnRoXV0+dqd+Xrh7xzpzvIJB1klvifC0oX42cEkDrA==} + peerDependencies: + react: ^17 || ^18 + react-dom: ^17 || ^18 + + '@patternfly/react-log-viewer@5.3.0': + resolution: {integrity: sha512-6jzhxwJwllLdX3jpoGdzIhvhPTfYuC6B+KuN2Laf7Iuioeig8bOMzJZFh6VXg+aBGd9j4JGv2dYryDsbDsTLvw==} + peerDependencies: + react: ^17 || ^18 + react-dom: ^17 || ^18 + + '@patternfly/react-styles@5.4.0': + resolution: {integrity: sha512-4ZE0s6LkX/0KsN0FOeogrDoj18m+BPA73YKnabZGB4SDRzrBNeBh2a6bSt546ZseEjkoJ+S81kOG0G8YckPQYg==} + + '@patternfly/react-table@5.4.0': + resolution: {integrity: sha512-HkXxVEPeI6nRVSUSHb5BungF41IfjB8W2VqaA3SX+6fGxQAW0e/Hb58ctUdPR2VJ/S2YZFcIcqCCWQtQEf+xKA==} + peerDependencies: + react: ^17 || ^18 + react-dom: ^17 || ^18 + + '@patternfly/react-tokens@5.4.0': + resolution: {integrity: sha512-KONkwCVOMyklhuuaYeYgcAsGtCBQXnsBGZeolhOdSzr2Mj0RVSW0oMrQPgZuPVzhhC/kbqgClHJJl6xuG9xheA==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@playwright/test@1.46.1': + resolution: {integrity: sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==} + engines: {node: '>=18'} + hasBin: true + + '@polka/url@1.0.0-next.25': + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@rc-component/async-validator@5.0.4': + resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==} + engines: {node: '>=14.x'} + + '@rc-component/color-picker@2.0.1': + resolution: {integrity: sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/context@1.4.0': + resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/mini-decimal@1.1.0': + resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==} + engines: {node: '>=8.x'} + + '@rc-component/mutate-observer@1.1.0': + resolution: {integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/portal@1.1.2': + resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/qrcode@1.0.0': + resolution: {integrity: sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/tour@1.15.1': + resolution: {integrity: sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/trigger@2.2.3': + resolution: {integrity: sha512-X1oFIpKoXAMXNDYCviOmTfuNuYxE4h5laBsyCqVAVMjNHxoF3/uiyA7XdegK1XbCvBbCZ6P6byWrEoDRpKL8+A==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@react-hook/latest@1.0.3': + resolution: {integrity: sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==} + peerDependencies: + react: '>=16.8' + + '@react-hook/passive-layout-effect@1.2.1': + resolution: {integrity: sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==} + peerDependencies: + react: '>=16.8' + + '@react-hook/resize-observer@2.0.2': + resolution: {integrity: sha512-tzKKzxNpfE5TWmxuv+5Ae3IF58n0FQgQaWJmcbYkjXTRZATXxClnTprQ2uuYygYTpu1pqbBskpwMpj6jpT1djA==} + peerDependencies: + react: '>=18' + + '@redux-devtools/extension@3.3.0': + resolution: {integrity: sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g==} + peerDependencies: + redux: ^3.1.0 || ^4.0.0 || ^5.0.0 + + '@redux-saga/core@1.3.0': + resolution: {integrity: sha512-L+i+qIGuyWn7CIg7k1MteHGfttKPmxwZR5E7OsGikCL2LzYA0RERlaUY00Y3P3ZV2EYgrsYlBrGs6cJP5OKKqA==} + + '@redux-saga/deferred@1.2.1': + resolution: {integrity: sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==} + + '@redux-saga/delay-p@1.2.1': + resolution: {integrity: sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==} + + '@redux-saga/is@1.1.3': + resolution: {integrity: sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==} + + '@redux-saga/symbols@1.1.3': + resolution: {integrity: sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==} + + '@redux-saga/types@1.2.1': + resolution: {integrity: sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==} + + '@reduxjs/toolkit@2.2.7': + resolution: {integrity: sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + + '@remix-run/router@1.19.2': + resolution: {integrity: sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==} + engines: {node: '>=14.0.0'} + + '@restart/hooks@0.4.16': + resolution: {integrity: sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==} + peerDependencies: + react: '>=16.8.0' + + '@rollup/rollup-android-arm-eabi@4.21.1': + resolution: {integrity: sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.21.1': + resolution: {integrity: sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.21.1': + resolution: {integrity: sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.21.1': + resolution: {integrity: sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.21.1': + resolution: {integrity: sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.21.1': + resolution: {integrity: sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.21.1': + resolution: {integrity: sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.21.1': + resolution: {integrity: sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.1': + resolution: {integrity: sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.21.1': + resolution: {integrity: sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.21.1': + resolution: {integrity: sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.21.1': + resolution: {integrity: sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.21.1': + resolution: {integrity: sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.21.1': + resolution: {integrity: sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.21.1': + resolution: {integrity: sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.21.1': + resolution: {integrity: sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==} + cpu: [x64] + os: [win32] + + '@swc/core-darwin-arm64@1.7.21': + resolution: {integrity: sha512-hh5uOZ7jWF66z2TRMhhXtWMQkssuPCSIZPy9VHf5KvZ46cX+5UeECDthchYklEVZQyy4Qr6oxfh4qff/5spoMA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.7.21': + resolution: {integrity: sha512-lTsPquqSierQ6jWiWM7NnYXXZGk9zx3NGkPLHjPbcH5BmyiauX0CC/YJYJx7YmS2InRLyALlGmidHkaF4JY28A==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.7.21': + resolution: {integrity: sha512-AgSd0fnSzAqCvWpzzZCq75z62JVGUkkXEOpfdi99jj/tryPy38KdXJtkVWJmufPXlRHokGTBitalk33WDJwsbA==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.7.21': + resolution: {integrity: sha512-l+jw6RQ4Y43/8dIst0c73uQE+W3kCWrCFqMqC/xIuE/iqHOnvYK6YbA1ffOct2dImkHzNiKuoehGqtQAc6cNaQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.7.21': + resolution: {integrity: sha512-29KKZXrTo/c9F1JFL9WsNvCa6UCdIVhHP5EfuYhlKbn5/YmSsNFkuHdUtZFEd5U4+jiShXDmgGCtLW2d08LIwg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.7.21': + resolution: {integrity: sha512-HsP3JwddvQj5HvnjmOr+Bd5plEm6ccpfP5wUlm3hywzvdVkj+yR29bmD7UwpV/1zCQ60Ry35a7mXhKI6HQxFgw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.7.21': + resolution: {integrity: sha512-hYKLVeUTHqvFK628DFJEwxoX6p42T3HaQ4QjNtf3oKhiJWFh9iTRUrN/oCB5YI3R9WMkFkKh+99gZ/Dd0T5lsg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.7.21': + resolution: {integrity: sha512-qyWAKW10aMBe6iUqeZ7NAJIswjfggVTUpDINpQGUJhz+pR71YZDidXgZXpaDB84YyDB2JAlRqd1YrLkl7CMiIw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.7.21': + resolution: {integrity: sha512-cy61wS3wgH5mEwBiQ5w6/FnQrchBDAdPsSh0dKSzNmI+4K8hDxS8uzdBycWqJXO0cc+mA77SIlwZC3hP3Kum2g==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.7.21': + resolution: {integrity: sha512-/rexGItJURNJOdae+a48M+loT74nsEU+PyRRVAkZMKNRtLoYFAr0cpDlS5FodIgGunp/nqM0bst4H2w6Y05IKA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.7.21': + resolution: {integrity: sha512-7/cN0SZ+y2V6e0hsDD8koGR0QVh7Jl3r756bwaHLLSN+kReoUb/yVcLsA8iTn90JLME3DkQK4CPjxDCQiyMXNg==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.12': + resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} + + '@tanstack/query-core@5.56.2': + resolution: {integrity: sha512-gor0RI3/R5rVV3gXfddh1MM+hgl0Z4G7tj6Xxpq6p2I03NGPaJ8dITY9Gz05zYYb/EJq9vPas/T4wn9EaDPd4Q==} + + '@tanstack/react-query@5.56.2': + resolution: {integrity: sha512-SR0GzHVo6yzhN72pnRhkEFRAHMsUo5ZPzAxfTMvUxFIDVS6W9LYUp6nXW3fcHVdg0ZJl8opSH85jqahvm6DSVg==} + peerDependencies: + react: ^18 || ^19 + + '@tweenjs/tween.js@23.1.3': + resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.0': + resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-selection@3.0.10': + resolution: {integrity: sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==} + + '@types/d3-shape@3.1.6': + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + + '@types/d3-time@3.0.3': + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/hoist-non-react-statics@3.3.5': + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/lodash@4.17.7': + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@22.5.5': + resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} + + '@types/offscreencanvas@2019.7.3': + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react@18.3.4': + resolution: {integrity: sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==} + + '@types/redux-logger@3.0.13': + resolution: {integrity: sha512-jylqZXQfMxahkuPcO8J12AKSSCQngdEWQrw7UiLUJzMBcv1r4Qg77P6mjGLjM27e5gFQDPD8vwUMJ9AyVxFSsg==} + + '@types/use-sync-external-store@0.0.3': + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + + '@types/warning@3.0.3': + resolution: {integrity: sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==} + + '@types/webxr@0.5.20': + resolution: {integrity: sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==} + + '@types/whatwg-streams@0.0.7': + resolution: {integrity: sha512-6sDiSEP6DWcY2ZolsJ2s39ZmsoGQ7KVwBDI3sESQsEm9P2dHTcqnDIHRZFRNtLCzWp7hCFGqYbw5GyfpQnJ01A==} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitejs/plugin-react-swc@3.7.0': + resolution: {integrity: sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==} + peerDependencies: + vite: ^4 || ^5 + + '@vitest/coverage-v8@2.1.1': + resolution: {integrity: sha512-md/A7A3c42oTT8JUHSqjP5uKTWJejzUW4jalpvs+rZ27gsURsMU8DEb+8Jf8C6Kj2gwfSHJqobDNBuoqlm0cFw==} + peerDependencies: + '@vitest/browser': 2.1.1 + vitest: 2.1.1 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@2.1.1': + resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} + + '@vitest/mocker@2.1.1': + resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} + peerDependencies: + '@vitest/spy': 2.1.1 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.1': + resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} + + '@vitest/runner@2.1.1': + resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} + + '@vitest/snapshot@2.1.1': + resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} + + '@vitest/spy@2.1.1': + resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} + + '@vitest/utils@2.1.1': + resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} + + '@wearemothership/dicom-character-set@1.0.4-opt.1': + resolution: {integrity: sha512-stqhnpawYHY2UZKj4RHTF71ab3q3z8S1SO9ToQKjsHQwowUdFVo6YFea93psFux3yqNbRlQjwoCdPjHcD0YQzw==} + engines: {node: '>=10'} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + accessor-fn@1.5.1: + resolution: {integrity: sha512-zZpFYBqIL1Aqg+f2qmYHJ8+yIZF7/tP6PUGx2/QM0uGPSO5UegpinmkNwDohxWtOj586BpMPVRUjce2HI6xB3A==} + engines: {node: '>=12'} + + ackee-tracker@5.1.0: + resolution: {integrity: sha512-A7iKkGyUnEXuOzxultQB7hnm4bStYCo1c38MYRRihBfqUP8AImhtZOODb00t9xrXs/BTsg06bz1MKpXeMs9sYw==} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + antd@5.20.6: + resolution: {integrity: sha512-TZFmNenHlh26DelHCJbkB+x1OVulIKsN1f/CnAd2NxZLysXqRvSuLUeHcgccqAnxTy7B03GZ6i1tocGxPCNjgA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + append-transform@2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + + array-tree-filter@2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + attr-accept@2.2.2: + resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} + engines: {node: '>=4'} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + axios@1.7.5: + resolution: {integrity: sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-preval@5.1.0: + resolution: {integrity: sha512-G5R+xmo5LS41A4UyZjOjV0mp9AvkuCyUOAJ6TOv/jTZS+VKh7L7HUDRcCSOb0YCM/u0fFarh7Diz0wjY8rFNFg==} + engines: {node: '>=10', npm: '>=6'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base16@1.0.0: + resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} + + bezier-js@6.1.4: + resolution: {integrity: sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + + browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-es6@4.9.3: + resolution: {integrity: sha512-Ibt+oXxhmeYJSsCkODPqNpPmyegefiD8rfutH1NYGhMZQhSp95Rz7haemgnJ6dxa6LT+JLLbtgOMORRluwKktw==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + caching-transform@4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001653: + resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==} + + canvas-color-tracker@1.2.2: + resolution: {integrity: sha512-r+u/Ft2ka4Rj274Ts4L9bhYZLuMvbuJ/yL4seP0s+Pi+i9CM0caD+Sd//yseS5EVBJ2SKSmq36h2mNYUCdmTfA==} + engines: {node: '>=12'} + + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comlink@4.4.1: + resolution: {integrity: sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@9.2.0: + resolution: {integrity: sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==} + engines: {node: ^12.20.0 || >=14} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compute-scroll-into-view@3.1.0: + resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + console-clear@1.1.1: + resolution: {integrity: sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==} + engines: {node: '>=4'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + core-js-compat@3.38.1: + resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} + + core-js@3.38.1: + resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + + cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-binarytree@1.0.2: + resolution: {integrity: sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-force-3d@3.0.5: + resolution: {integrity: sha512-tdwhAhoTYZY/a6eo9nR7HP3xSW/C6XvJTbeRpR92nlPzH6OiE+4MliN9feuSFd0tPtEUo+191qOhCTWx3NYifg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-octree@1.0.2: + resolution: {integrity: sha512-Qxg4oirJrNXauiuC94uKMbgxwnhdda9xRLl9ihq45srlJ4Ga3CSgqGcAL8iW7N5CIv4Oz8x3E734ulxyvHPvwA==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + daikon@1.2.46: + resolution: {integrity: sha512-S8dTTlsWYTH3LQztjTW9KnNvxDeL2mr2cau0auLdYMJe4TrocYP1PmidHizO3rXUs+gXpBWI1PQ2qvB4b21QFw==} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + decode-uri-component@0.4.1: + resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} + engines: {node: '>=14.16'} + + deep-diff@0.3.8: + resolution: {integrity: sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-require-extensions@3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} + engines: {node: '>=8'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delaunator@4.0.1: + resolution: {integrity: sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==} + + delaunay-find@0.0.6: + resolution: {integrity: sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + + detect-gpu@5.0.45: + resolution: {integrity: sha512-59oJS71ODAVPGMjBfyHPPOnM9efOhJpOliQZ8I1UG4p440PjYCVYWgAgY+BiO3JPe/BXbRzPAn+XbVqIESXkDQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dicom-parser@1.8.21: + resolution: {integrity: sha512-lYCweHQDsC8UFpXErPlg86Px2A8bay0HiUY+wzoG3xv5GzgqVHU3lziwSc/Gzn7VV7y2KeP072SzCviuOoU02w==} + + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + + elliptic@6.5.7: + resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} + + email-validator@2.0.4: + resolution: {integrity: sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==} + engines: {node: '>4.0'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fbemitter@3.0.0: + resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} + + fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + + fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + + fetch-readablestream@0.2.0: + resolution: {integrity: sha512-qu4mXWf4wus4idBIN/kVH+XSer8IZ9CwHP+Pd7DL7TuKNC1hP7ykon4kkBjwJF3EMX2WsFp4hH7gU7CyL7ucXw==} + + fflate@0.7.3: + resolution: {integrity: sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + file-selector@0.6.0: + resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} + engines: {node: '>= 12'} + + filter-obj@5.1.0: + resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} + engines: {node: '>=14.16'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + flux@4.0.4: + resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} + peerDependencies: + react: ^15.0.2 || ^16.0.0 || ^17.0.0 + + focus-trap@7.5.4: + resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + force-graph@1.43.5: + resolution: {integrity: sha512-HveLELh9yhZXO/QOfaFS38vlwJZ/3sKu+jarfXzRmbmihSOH/BbRWnUvmg8wLFiYy6h4HlH4lkRfZRccHYmXgA==} + engines: {node: '>=12'} + + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fp-ts@2.16.9: + resolution: {integrity: sha512-+I2+FnVB+tVaxcYyQkHUq7ZdKScaBlX53A41mxQtpIccsfyv8PzdzP7fzp2AY832T4aoK6UZ5WRX/ebGd8uZuQ==} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-port@3.2.0: + resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} + engines: {node: '>=4'} + + gl-matrix@3.4.3: + resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hammerjs@2.0.8: + resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==} + engines: {node: '>=0.8.0'} + + happy-dom@15.0.0: + resolution: {integrity: sha512-DsvANUcxxY20iCo3Yllm7dqwzPVPduGfVFxa7mONwMBLczFeQgkN0LpDir1kIY322JMh+hrcPV3aGLyHCESDlA==} + engines: {node: '>=18.0.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + hash-base@3.0.4: + resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + + immutable@3.8.2: + resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==} + engines: {node: '>=0.10.0'} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + index-array-by@1.4.2: + resolution: {integrity: sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jerrypick@1.1.1: + resolution: {integrity: sha512-XTtedPYEyVp4t6hJrXuRKr/jHj8SC4z+4K0b396PMkov6muL+i8IIamJIvZWe3jUspgIJak0P+BaWKawMYNBLg==} + engines: {node: '>=12'} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jpeg-lossless-decoder-js@2.0.7: + resolution: {integrity: sha512-tbZlhFkKmx+JaqVMkq47SKWGuXLkIaV8fTbnhO39dYEnQrSShLGuLCGb0n6ntXjtmk6oAWGiIriWOLwj9od0yQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.0: + resolution: {integrity: sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==} + hasBin: true + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json2mq@0.2.0: + resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + kapsule@1.14.5: + resolution: {integrity: sha512-H0iSpTynUzZw3tgraDmReprpFRmH5oP5GPmaNsurSwLx2H5iCpOMIkp5q+sfhB4Tz/UJd1E1IbEE9Z6ksnJ6RA==} + engines: {node: '>=12'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + lefthook-darwin-arm64@1.7.14: + resolution: {integrity: sha512-3hNr04A8DSYZk0RBTdu8D/kkE3FHiNnexAEvuFOqLuf3EQhrrX1wxclGO0+tIk3s7nyh+iqpV69Xd+cb4Fnvpw==} + cpu: [arm64] + os: [darwin] + + lefthook-darwin-x64@1.7.14: + resolution: {integrity: sha512-cXVsxTS2IRKKRyYFEMjAxf0a/31M1PkiNAjlJPXQPoAxxC1rbsvkxWL8vXhH4P0AL18zSYVBf9aTktYArgQGuA==} + cpu: [x64] + os: [darwin] + + lefthook-freebsd-arm64@1.7.14: + resolution: {integrity: sha512-rhx2ZkbWD6SkOXLc5/xyN1fu0uL9MLYBYKKg5T0rLRVwqqr9aYKZ+1Rru/5oL8utH1qkQyiwQkcjnKkyHwSjPg==} + cpu: [arm64] + os: [freebsd] + + lefthook-freebsd-x64@1.7.14: + resolution: {integrity: sha512-WeVPDm7JB1Crchc7OQ3uLiRfLlhwwX3N2662DPguMresps2r79dUO97LhHMzd+l1RKIqZIgnU+j5fKFI+cmw4w==} + cpu: [x64] + os: [freebsd] + + lefthook-linux-arm64@1.7.14: + resolution: {integrity: sha512-IUvxJBfLDVComNc1Djk4VYUJsSAtdwfTvwpNxfaG2qb31VNvF6PPdp43bgpgqzV8O0KDCMm/sn0hlZ00GTuy2A==} + cpu: [arm64] + os: [linux] + + lefthook-linux-x64@1.7.14: + resolution: {integrity: sha512-jCNjVk+9iaFSwlFH4RM7SI05tpdty0vPzSTsABXUQwdmKdt1hPWhnUsEhCU03ik33UmpfmXUK9pLFgStT7W5rw==} + cpu: [x64] + os: [linux] + + lefthook-openbsd-arm64@1.7.14: + resolution: {integrity: sha512-Mq5GgjzDMiFin+Ucm52nizvvDQM1o+MnL/P+FDbBq253BIJGDJK+qEuQBgEQndE9bUyAP4qiHb+R6jz5fbpAlA==} + cpu: [arm64] + os: [openbsd] + + lefthook-openbsd-x64@1.7.14: + resolution: {integrity: sha512-enbPte9MAYU2JHkcvUBRJrXI6JMVcQqJHN+F8yKOJLFBnthoR0ZUuSTzqAMOivj/wgncHkYPqOWIo1UfB+HpGw==} + cpu: [x64] + os: [openbsd] + + lefthook-windows-arm64@1.7.14: + resolution: {integrity: sha512-M9QbTs+Je0SRKC2c/0X8OQsme6glFrKxQoxWMFCN02S6nNLiHqP4vsHphJFU+wnAwv4KE8I1YKT5iMxde0Ejlg==} + cpu: [arm64] + os: [win32] + + lefthook-windows-x64@1.7.14: + resolution: {integrity: sha512-40Mx+a44kPZUF/AXV45EIgw03FANTXMFDBR1Ib8qYbSaf1cWqJtfeQs9R5Ea0EdqxXkGprzwZ+yUFFjjfOFIoQ==} + cpu: [x64] + os: [win32] + + lefthook@1.7.14: + resolution: {integrity: sha512-GIMJm3HPksrHyXgu9OYX3r9QKM10hxoeiI45+7KhJKvAWChDtGqMZ5EPQuTMVsXu5IwggQL9QJLhDfk54WOXEw==} + hasBin: true + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + local-access@1.1.0: + resolution: {integrity: sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + + lodash.flow@3.5.0: + resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + marked@14.1.2: + resolution: {integrity: sha512-f3r0yqpz31VXiDB/wj9GaOB0a2PRLQl6vJmXiFrniNwjkKdvakqJRULhjFKJpxOchlCRiG5fcacoUZY5Xa6PEQ==} + engines: {node: '>= 18'} + hasBin: true + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + micromark-core-commonmark@2.0.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mitt@1.2.0: + resolution: {integrity: sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nifti-reader-js@0.6.8: + resolution: {integrity: sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==} + + niivue-react@https://codeload.github.com/niivue/niivue-react/tar.gz/d7734b88359b61356fec5bfa302e02536e0a1134: + resolution: {tarball: https://codeload.github.com/niivue/niivue-react/tar.gz/d7734b88359b61356fec5bfa302e02536e0a1134} + version: 0.0.0 + peerDependencies: + '@niivue/niivue': ^0.44.2 + react: ^17 || ^18 + typescript: ^5.0.0 + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + nyc@17.0.0: + resolution: {integrity: sha512-ISp44nqNCaPugLLGGfknzQwSwt10SSS5IMoPR7GLoMAyS18Iw5js8U7ga2VF9lYuMZ42gOHr3UddZw4WZltxKg==} + engines: {node: '>=18'} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + + p-queue@8.0.1: + resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} + engines: {node: '>=18'} + + p-timeout@6.1.2: + resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} + engines: {node: '>=14.16'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-srcset@1.0.2: + resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + platform@1.3.6: + resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} + + playwright-core@1.46.1: + resolution: {integrity: sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.46.1: + resolution: {integrity: sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==} + engines: {node: '>=18'} + hasBin: true + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} + + preval.macro@5.0.0: + resolution: {integrity: sha512-+OZRqZYx1pjZ7H5Jis8bPFXkiT7lwA46UzAT4IjuzFVKwkJK+TwIx1TCqrqNCf8U3e5O12mEJEz1BXslkCLWfQ==} + engines: {node: '>=10'} + + process-es6@0.11.6: + resolution: {integrity: sha512-GYBRQtL4v3wgigq10Pv58jmTbFXlIiTbSfgnNqZLY0ldUPqy1rRxDI5fCjoCpnM6TqmHQI8ydzTBXW86OYc0gA==} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-on-spawn@1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} + + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-color@1.3.0: + resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} + + query-string@9.1.0: + resolution: {integrity: sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==} + engines: {node: '>=18'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + + rc-cascader@3.28.1: + resolution: {integrity: sha512-9+8oHIMWVLHxuaapDiqFNmD9KSyKN/P4bo9x/MBuDbyTqP8f2/POmmZxdXWBO3yq/uE3pKyQCXYNUxrNfHRv2A==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-checkbox@3.3.0: + resolution: {integrity: sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-collapse@3.7.3: + resolution: {integrity: sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-dialog@9.5.2: + resolution: {integrity: sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-drawer@7.2.0: + resolution: {integrity: sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-dropdown@4.2.0: + resolution: {integrity: sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + + rc-field-form@2.4.0: + resolution: {integrity: sha512-XZ/lF9iqf9HXApIHQHqzJK5v2w4mkUMsVqAzOyWVzoiwwXEavY6Tpuw7HavgzIoD+huVff4JghSGcgEfX6eycg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-image@7.9.0: + resolution: {integrity: sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-input-number@9.2.0: + resolution: {integrity: sha512-5XZFhBCV5f9UQ62AZ2hFbEY8iZT/dm23Q1kAg0H8EvOgD3UDbYYJAayoVIkM3lQaCqYAW5gV0yV3vjw1XtzWHg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-input@1.6.3: + resolution: {integrity: sha512-wI4NzuqBS8vvKr8cljsvnTUqItMfG1QbJoxovCgL+DX4eVUcHIjVwharwevIxyy7H/jbLryh+K7ysnJr23aWIA==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + rc-mentions@2.15.0: + resolution: {integrity: sha512-f5v5i7VdqvBDXbphoqcQWmXDif2Msd2arritVoWybrVDuHE6nQ7XCYsybHbV//WylooK52BFDouFvyaRDtXZEw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-menu@9.14.1: + resolution: {integrity: sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-motion@2.9.2: + resolution: {integrity: sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-notification@5.6.1: + resolution: {integrity: sha512-Q4ZKES3IBxWmpNnlDiMFYoH6D7MJ1L3n3gp59pnpaMI8gm9Vj+gVRxdInvoYjBoZvEOenxb9MbbKvnFhzJpgvA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-overflow@1.3.2: + resolution: {integrity: sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-pagination@4.2.0: + resolution: {integrity: sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-picker@4.6.14: + resolution: {integrity: sha512-7DuTfUFdkxmsNpWQ0TWv6FPGna5e6KKC4nxtx3x9xhumLz7jb3fhlDdWQvqEL6tpt9DOb1+N5j+wB+lDOSS9kg==} + engines: {node: '>=8.x'} + peerDependencies: + date-fns: '>= 2.x' + dayjs: '>= 1.x' + luxon: '>= 3.x' + moment: '>= 2.x' + react: '>=16.9.0' + react-dom: '>=16.9.0' + peerDependenciesMeta: + date-fns: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + + rc-progress@4.0.0: + resolution: {integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-rate@2.13.0: + resolution: {integrity: sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-resize-observer@1.4.0: + resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-segmented@2.3.0: + resolution: {integrity: sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + rc-select@14.15.2: + resolution: {integrity: sha512-oNoXlaFmpqXYcQDzcPVLrEqS2J9c+/+oJuGrlXeVVX/gVgrbHa5YcyiRUXRydFjyuA7GP3elRuLF7Y3Tfwltlw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + + rc-slider@11.1.6: + resolution: {integrity: sha512-LACAaXM0hi+4x4ErDGZLy7weIQwmBIVbIgPE+eDHiHkyzMvKjWHraCG8/B22Y/tCQUPAsP02wBhKhth7mH2PIw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-steps@6.0.1: + resolution: {integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-switch@4.1.0: + resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-table@7.45.7: + resolution: {integrity: sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tabs@15.1.1: + resolution: {integrity: sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-textarea@1.8.1: + resolution: {integrity: sha512-bm36N2ZqwZAP60ZQg2OY9mPdqWC+m6UTjHc+CqEZOxb3Ia29BGHazY/s5bI8M4113CkqTzhtFUDNA078ZiOx3Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tooltip@6.2.0: + resolution: {integrity: sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tree-select@5.23.0: + resolution: {integrity: sha512-aQGi2tFSRw1WbXv0UVXPzHm09E0cSvUVZMLxQtMv3rnZZpNmdRXWrnd9QkLNlVH31F+X5rgghmdSFF3yZW0N9A==} + peerDependencies: + react: '*' + react-dom: '*' + + rc-tree@5.8.8: + resolution: {integrity: sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==} + engines: {node: '>=10.x'} + peerDependencies: + react: '*' + react-dom: '*' + + rc-tree@5.9.0: + resolution: {integrity: sha512-CPrgOvm9d/9E+izTONKSngNzQdIEjMox2PBufWjS1wf7vxtvmCWzK1SlpHbRY6IaBfJIeZ+88RkcIevf729cRg==} + engines: {node: '>=10.x'} + peerDependencies: + react: '*' + react-dom: '*' + + rc-upload@4.7.0: + resolution: {integrity: sha512-eUwxYNHlsYe5vYhKFAUGrQG95JrnPzY+BmPi1Daq39fWNl/eOc7v4UODuWrVp2LFkQBuV3cMCG/I68iub6oBrg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-util@5.43.0: + resolution: {integrity: sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-virtual-list@3.14.5: + resolution: {integrity: sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + react-activity@2.1.3: + resolution: {integrity: sha512-BdZuwZ4frK+tkjjERtzT0HxbHUN5/hIe9BBL9Ac/kgVOJ0bXjJpz417cQ7XxGSA27I+fsHCNRrFQ1cux61vHDQ==} + peerDependencies: + react: '>= 15.0.0' + react-dom: '>= 15.0.0' + + react-base16-styling@0.6.0: + resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} + + react-bootstrap-typeahead@6.3.2: + resolution: {integrity: sha512-N5Mb0WlSSMcD7Z0pcCypILgIuECybev0hl4lsnCa5lbXTnN4QdkuHLGuTLSlXBwm1ZMFpOc2SnsdSRgeFiF+Ow==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + react-cookie@7.2.0: + resolution: {integrity: sha512-mqhPERUyfOljq5yJ4woDFI33bjEtigsl8JDJdPPeNhr0eSVZmBc/2Vdf8mFxOUktQxhxTR1T+uF0/FRTZyBEgw==} + peerDependencies: + react: '>= 16.3.0' + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-dropzone@14.2.3: + resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8 || 18.0.0' + + react-error-boundary@4.0.13: + resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} + peerDependencies: + react: '>=16.13.1' + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-force-graph-2d@1.25.5: + resolution: {integrity: sha512-3u8WjZZorpwZSDs3n3QeOS9ZoxFPM+IR9SStYJVQ/qKECydMHarxnf7ynV/MKJbC6kUsc60soD0V+Uq/r2vz7Q==} + engines: {node: '>=12'} + peerDependencies: + react: '*' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-json-view@1.21.3: + resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} + peerDependencies: + react: ^17.0.0 || ^16.3.0 || ^15.5.4 + react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 + + react-kapsule@2.4.0: + resolution: {integrity: sha512-w4Yv9CgWdj8kWGQEPNWFGJJ08dYEZHZpiaFR/DgZjCMBNqv9wus2Gy1qvHVJmJbzvAZbq6jdvFC+NYzEqAlNhQ==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.13.1' + + react-lazylog@4.5.3: + resolution: {integrity: sha512-lyov32A/4BqihgXgtNXTHCajXSXkYHPlIEmV8RbYjHIMxCFSnmtdg4kDCI3vATz7dURtiFTvrw5yonHnrS+NNg==} + peerDependencies: + react: '>=16.3.0' + + react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + + react-overlays@5.2.1: + resolution: {integrity: sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==} + peerDependencies: + react: '>=16.3.0' + react-dom: '>=16.3.0' + + react-popper@2.3.0: + resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} + peerDependencies: + '@popperjs/core': ^2.0.0 + react: ^16.8.0 || ^17 || ^18 + react-dom: ^16.8.0 || ^17 || ^18 + + react-redux@9.1.2: + resolution: {integrity: sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==} + peerDependencies: + '@types/react': ^18.2.25 + react: ^18.0 + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + redux: + optional: true + + react-router-dom@6.26.2: + resolution: {integrity: sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.26.2: + resolution: {integrity: sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-string-replace@0.4.4: + resolution: {integrity: sha512-FAMkhxmDpCsGTwTZg7p/2v+/GTmxAp73so3fbSvlAcBBX36ujiGRNEaM/1u+jiYQrArhns+7eE92g2pi5E5FUA==} + engines: {node: '>=0.12.0'} + + react-textarea-autosize@8.5.3: + resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-virtualized@9.22.5: + resolution: {integrity: sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==} + peerDependencies: + react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 + react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + redux-logger@4.0.0: + resolution: {integrity: sha512-dl+5mQjk70HIlrgOgPMAL0d0hOhBTPQcG5zPPlPZKa/Yf4lU6A37mv3Xqn3lFp0eUguSApIa2GD/YJVOIQQi5A==} + + redux-saga@1.3.0: + resolution: {integrity: sha512-J9RvCeAZXSTAibFY0kGw6Iy4EdyDNW7k6Q+liwX+bsck7QVsU78zz8vpBRweEfANxnnlG/xGGeOvf6r8UXzNJQ==} + + redux-thunk@3.1.0: + resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} + peerDependencies: + redux: ^5.0.0 + + redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + + release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + reselect@5.1.1: + resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rollup-plugin-node-builtins@2.0.0: + resolution: {integrity: sha512-jvsEYNf5U95YttEQbs5c6H7YSMYGs3SWA8/MfnlQ9ddijsgYbq8uKx4WQ1J8Zyrq+tgPF0Quu48PURrlcMZWoQ==} + + rollup@4.21.1: + resolution: {integrity: sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rusha@0.8.14: + resolution: {integrity: sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + sanitize-html@2.13.0: + resolution: {integrity: sha512-Xff91Z+4Mz5QiNSLdLWwjgBDm5b1RU6xBT0+12rapjiaR7SwfRdjw8f+6Rir2MXKLrDicRFHdb51hGOAxmsUIA==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + + semiver@1.1.0: + resolution: {integrity: sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==} + engines: {node: '>=6'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + shader-loader@1.3.1: + resolution: {integrity: sha512-dt8F9K0x4rjmaFyHh7rNDfpt4LUiR64zhNIEwp2WbE99B3z4ALuvvmhftkElg93dUD6sTmv/aXa/z9SJiEddcA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + shlex@2.1.2: + resolution: {integrity: sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv-cli@2.0.2: + resolution: {integrity: sha512-OtSJDwxsF1NWHc7ps3Sa0s+dPtP15iQNJzfKVz+MxkEo3z72mCD+yu30ct79rPr0CaV1HXSOBp+MIY5uIhHZ1A==} + engines: {node: '>= 10'} + hasBin: true + + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + spark-md5@3.0.2: + resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} + + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + + split-on-first@3.0.0: + resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} + engines: {node: '>=12'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + string-convert@0.2.1: + resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + stylis@4.3.4: + resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.33.0: + resolution: {integrity: sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + + throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} + engines: {node: '>=12.22'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + + tinydate@1.3.0: + resolution: {integrity: sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==} + engines: {node: '>=4'} + + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} + engines: {node: '>=14.0.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typescript-compare@0.0.2: + resolution: {integrity: sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==} + + typescript-logic@0.0.0: + resolution: {integrity: sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==} + + typescript-tuple@2.2.1: + resolution: {integrity: sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==} + + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@1.0.38: + resolution: {integrity: sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==} + + uncontrollable@7.2.1: + resolution: {integrity: sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==} + peerDependencies: + react: '>=15.0.0' + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + universal-cookie@7.2.0: + resolution: {integrity: sha512-PvcyflJAYACJKr28HABxkGemML5vafHmiL4ICe3e+BEKXRMt0GaFLZhAwgv637kFFnnfiSJ8e6jknrKkMrU+PQ==} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-ackee@3.1.0: + resolution: {integrity: sha512-RPX51I/Ak6dtNW0aXY6GM/LJ899OU4qoKes/CTGj9+4Qoz9PO7I14BX8Rw6vmlbVvQzZ6WIb01sg7vU/kYEQOw==} + engines: {node: '>= 14'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-composed-ref@1.3.0: + resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-immer@0.10.0: + resolution: {integrity: sha512-/eVwNR4TG9Tm/dd+aHYLLaI0FLfYKlkTqKMkn78Ah/EYVzWd/zJIgpkdoFEKbhQJOGo8XN7/mWrTx0exp1c+Ug==} + peerDependencies: + immer: '>=8.0.0' + react: ^16.8.0 || ^17.0.1 || ^18.0.0 + + use-isomorphic-layout-effect@1.1.2: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-latest@1.2.1: + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + victory-area@37.0.2: + resolution: {integrity: sha512-KEuJiBg/VQq1CSQe8U1Gk1eI/sMm+Y4WGveKkx9lXvgPHqxXog2Of+j+q1ZY0bXVrb9vAlIuJHPg4Oq+UQRUYw==} + peerDependencies: + react: '>=16.6.0' + + victory-axis@37.0.2: + resolution: {integrity: sha512-tmjq43m7hto7NblaJwPiSloilFIlmZ4UMt91yv0dBUlM8sexRTE8g/fAvnioTblVEec/t91sqQBoLta5VZnWIQ==} + peerDependencies: + react: '>=16.6.0' + + victory-bar@37.0.2: + resolution: {integrity: sha512-ofezvu4NYkxaQZuLJSnQVsgQKO+869IEYZQuIvc7EtiLrVSznNygqcDrZzLJ+0q6ZxGRIJ/1cdEgaz2dS40ukQ==} + peerDependencies: + react: '>=16.6.0' + + victory-box-plot@37.0.2: + resolution: {integrity: sha512-NzhxPRXues5F3Ay3JRLAnDBGrSC3940KmFHtc14F0Y+KDmwMDa15c2MBME9Rhg6SOvKL/o+jGzYX8ohE3k94kA==} + peerDependencies: + react: '>=16.6.0' + + victory-brush-container@37.0.2: + resolution: {integrity: sha512-eZBarKzkGw1fM3n1FSGo5MAE7o4ZM3a87aSSRuIK4aMgGxaZkxKV4y219WCIIDeYw6U4l7T+tDXSw71XbXGG3g==} + peerDependencies: + react: '>=16.6.0' + + victory-chart@37.0.2: + resolution: {integrity: sha512-OpNvSzypQyhyJtBYAcx+9vJZTry2HssBJVT5Yui1NrT4IcHTuw02z5Zg/RYFgADloqraA+TsVzZbJQcfD/j6MA==} + peerDependencies: + react: '>=16.6.0' + + victory-core@37.0.2: + resolution: {integrity: sha512-B3A3yCanjskShZTFtA1Bp8BLXniaTtjzaKHOChjCkay8oRkWjGMy0aZdCL7ezfUWVHAaFUIw248PgqApMn1K/w==} + peerDependencies: + react: '>=16.6.0' + + victory-create-container@37.0.2: + resolution: {integrity: sha512-cojSUT/TWunznM3rMlchlYZ+QdTLKHQE519ZQdomA04rKdU+rK/X+XaeMHDWZVRZHp4YrfUmR7OfOb4AHBTm7w==} + peerDependencies: + react: '>=16.6.0' + + victory-cursor-container@37.0.2: + resolution: {integrity: sha512-07PB8XNYi9AqnwZjCxQ6gKcJip6p2fwUT1+aHYDUAy/ncL6xBZD4t3sXErPHT3ha/itx7I861OsehDLZCjnkHA==} + peerDependencies: + react: '>=16.6.0' + + victory-group@37.0.2: + resolution: {integrity: sha512-uBU3PdndeOxE5E+LVoVnT3ciJNwlTj99Deh178AARJ3jKuuH3hJ7Fnw+tgQjQNMdRuKKxILJdddd9ouktLTJJA==} + peerDependencies: + react: '>=16.6.0' + + victory-legend@37.0.2: + resolution: {integrity: sha512-mbScaQepyvLVghyRSxsccZwpf3LTz434GuWIh5aFQcP8pTrGT+9V8Wtw6N6W/4MxHBznh1sGZbI755k+IM2oNQ==} + peerDependencies: + react: '>=16.6.0' + + victory-line@37.0.2: + resolution: {integrity: sha512-b0Jj9uYGzWhA3KCbzjvraxKfP3gB+sqzaU/r2JQdICug0isGQHnng3vW40RNveEjE6CfIEHGZdylSCAbjAFhzQ==} + peerDependencies: + react: '>=16.6.0' + + victory-pie@37.0.2: + resolution: {integrity: sha512-rdaL7Or5BU/368xLoe8FThekxx9ICgwmtaUc2Lt1w8uklt6S3SBMbAoL2lmr5IutZf55HYRX64vM3TGqWjD3+w==} + peerDependencies: + react: '>=16.6.0' + + victory-polar-axis@37.0.2: + resolution: {integrity: sha512-qqIk9fFYuL9G/RzHoXB/9ZI6DkKHdfdczI2vdl2rl0KdzAcfd9Eosa9EHmnTh/9ijPJvYi++1ul1WQNRWXBVSg==} + peerDependencies: + react: '>=16.6.0' + + victory-scatter@37.0.2: + resolution: {integrity: sha512-BY83Y+D3enHqPvHAt3HrEaT5ckmcj3vq3QJ28e1b6DhlbGWoS/DEmhf5OiHF+wCBSSDBOkAyq1uTXSbcHKyLXQ==} + peerDependencies: + react: '>=16.6.0' + + victory-selection-container@37.0.2: + resolution: {integrity: sha512-HgLmGTIZNdlpZ081ZowJAoUYE69q4p9sB0h8FBKbM7xPDXfH9Eh6MZ5RIfoen9GdB4Hz0He4vQZIU5OOK3TNDQ==} + peerDependencies: + react: '>=16.6.0' + + victory-shared-events@37.0.2: + resolution: {integrity: sha512-1U1yljfsFs3fGJmoSZt1j/ZgdV4tf2hWhue2Xixn71ZEYFBlsF6hY3gXI5EzRji1QhHa3mnar17wrgr++H+CWQ==} + peerDependencies: + react: '>=16.6.0' + + victory-stack@37.0.2: + resolution: {integrity: sha512-CbinJJxkN7WT6XJ8EWZLXiibqHGU++rKqyh95jo01U+FZ7QOu5l0qf7OxfEnmEWGLF3J5hcMEOSX22lrdtxl+A==} + peerDependencies: + react: '>=16.6.0' + + victory-tooltip@37.0.2: + resolution: {integrity: sha512-UYne2i9in8bwxz0z6+kknvZbKVbMdfapQnISDBBWfmqWVHirsxNGJUFaSrHMqEBdNtTCXLd0vNhADJxIUKGtqA==} + peerDependencies: + react: '>=16.6.0' + + victory-vendor@37.0.2: + resolution: {integrity: sha512-Mjs+00QR256itUM/jVqGJkAw5OADpwjQj7sOEqLqJQfnj9uuf7cPto1KCjrS5d+E6lb0mE5kYwUfzBq0BrMa8Q==} + + victory-voronoi-container@37.0.2: + resolution: {integrity: sha512-iqx/35Rx9vMDKkHw+2xibAF8OT4MTHZk9GG7sPxnlYWoZqDSuuaqR5SmrHosDmw2oqXbj7AqG2wqfxmbMp7ZhA==} + peerDependencies: + react: '>=16.6.0' + + victory-zoom-container@37.0.2: + resolution: {integrity: sha512-CCTm7EgCtFKBduEgJjYTokC13sy0LmLC3Eczb967n7IZUUrIaNQsyGajW3gH5wbof4zeHSpuZghRGPUB2DVQ1Q==} + peerDependencies: + react: '>=16.6.0' + + vite-node@2.1.1: + resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-babel-macros@1.0.6: + resolution: {integrity: sha512-7cCT8jtu5UjpE46pH7RyVltWw5FbhDAtQliZ6QGqRNR5RUZKdAsB0CDjuF+VBoDpnl0KuESPu22SoNqXRYYWyQ==} + engines: {node: '>=16'} + peerDependencies: + vite: '>=2' + + vite-plugin-istanbul@6.0.2: + resolution: {integrity: sha512-0/sKwjEEIwbEyl43xX7onX3dIbMJAsigNsKyyVPalG1oRFo5jn3qkJbS2PUfp9wrr3piy1eT6qRoeeum2p4B2A==} + peerDependencies: + vite: '>=4 <=6' + + vite@5.4.6: + resolution: {integrity: sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@2.1.1: + resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.1 + '@vitest/ui': 2.1.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + + webgl-constants@1.1.1: + resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.94.0: + resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + webworker-promise@0.5.0: + resolution: {integrity: sha512-14iR79jHAV7ozwvbfif+3wCaApT3I1g8Lo0rJZrwAu6wxZGx/08Y8KXz6as6ZLNUEEufeiEBBYrqyDBClXOsEw==} + + whatwg-fetch@2.0.4: + resolution: {integrity: sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + worker-loader@3.0.8: + resolution: {integrity: sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + wslink@2.2.1: + resolution: {integrity: sha512-kBhNNW7RtVBY1e6WZJvp/XvYHUkWTJupq1FhG5FAv9f6Do868zsaV+SPM1kD7pcHxF/d8IcmzCP5Ty1m8pIVFQ==} + + xmlbuilder2@3.0.2: + resolution: {integrity: sha512-h4MUawGY21CTdhV4xm3DG9dgsqyhDkZvVJBx88beqX8wJs3VgyGQgAn5VreHuae6unTQxh115aMK5InCVmOIKw==} + engines: {node: '>=12.0'} + + xss@1.0.14: + resolution: {integrity: sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==} + engines: {node: '>= 0.10.0'} + hasBin: true + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@ant-design/colors@7.1.0': + dependencies: + '@ctrl/tinycolor': 3.6.1 + + '@ant-design/cssinjs-utils@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@ant-design/cssinjs': 1.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.25.4 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@ant-design/cssinjs@1.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.4 + '@emotion/hash': 0.8.0 + '@emotion/unitless': 0.7.5 + classnames: 2.5.1 + csstype: 3.1.3 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + stylis: 4.3.4 + + '@ant-design/fast-color@2.0.6': + dependencies: + '@babel/runtime': 7.25.4 + + '@ant-design/icons-svg@4.4.2': {} + + '@ant-design/icons@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@ant-design/colors': 7.1.0 + '@ant-design/icons-svg': 4.4.2 + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@ant-design/react-slick@1.1.2(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + json2mq: 0.2.0 + react: 18.3.1 + resize-observer-polyfill: 1.5.1 + throttle-debounce: 5.0.2 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/compat-data@7.25.4': {} + + '@babel/core@7.25.2': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.5 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.4 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + convert-source-map: 2.0.0 + debug: 4.3.6 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.25.5': + dependencies: + '@babel/types': 7.25.4 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.24.7': + dependencies: + '@babel/types': 7.25.4 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + dependencies: + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-compilation-targets@7.25.2': + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/traverse': 7.25.4 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + regexpu-core: 5.3.2 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + debug: 4.3.6 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.24.8': + dependencies: + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.24.7': + dependencies: + '@babel/types': 7.25.4 + + '@babel/helper-plugin-utils@7.24.8': {} + + '@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-wrap-function': 7.25.0 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + dependencies: + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helper-wrap-function@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.4 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.25.4': + dependencies: + '@babel/types': 7.25.4 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-assertions@7.25.6(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-async-generator-functions@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-class-properties@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/traverse': 7.25.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/template': 7.25.0 + + '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + + '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + + '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + + '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-private-methods@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-sets-regex@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/preset-env@7.25.4(@babel/core@7.25.2)': + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.25.6(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.25.4(@babel/core@7.25.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/types': 7.25.4 + esutils: 2.0.3 + + '@babel/regjsgen@0.8.0': {} + + '@babel/runtime@7.22.11': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/runtime@7.25.4': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 + + '@babel/traverse@7.25.4': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.5 + '@babel/parser': 7.25.4 + '@babel/template': 7.25.0 + '@babel/types': 7.25.4 + debug: 4.3.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.25.4': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@biomejs/biome@1.9.1': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.1 + '@biomejs/cli-darwin-x64': 1.9.1 + '@biomejs/cli-linux-arm64': 1.9.1 + '@biomejs/cli-linux-arm64-musl': 1.9.1 + '@biomejs/cli-linux-x64': 1.9.1 + '@biomejs/cli-linux-x64-musl': 1.9.1 + '@biomejs/cli-win32-arm64': 1.9.1 + '@biomejs/cli-win32-x64': 1.9.1 + + '@biomejs/cli-darwin-arm64@1.9.1': + optional: true + + '@biomejs/cli-darwin-x64@1.9.1': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.9.1': + optional: true + + '@biomejs/cli-linux-arm64@1.9.1': + optional: true + + '@biomejs/cli-linux-x64-musl@1.9.1': + optional: true + + '@biomejs/cli-linux-x64@1.9.1': + optional: true + + '@biomejs/cli-win32-arm64@1.9.1': + optional: true + + '@biomejs/cli-win32-x64@1.9.1': + optional: true + + '@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': {} + + '@cornerstonejs/core@1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1)': + dependencies: + '@kitware/vtk.js': 30.4.1(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + comlink: 4.4.1 + detect-gpu: 5.0.45 + gl-matrix: 3.4.3 + lodash.clonedeep: 4.5.0 + transitivePeerDependencies: + - '@babel/preset-env' + - autoprefixer + - webpack + - wslink + + '@cornerstonejs/dicom-image-loader@1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1)': + 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 + '@cornerstonejs/core': 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + dicom-parser: 1.8.21 + pako: 2.1.0 + uuid: 9.0.1 + transitivePeerDependencies: + - '@babel/preset-env' + - autoprefixer + - webpack + - wslink + + '@cornerstonejs/streaming-image-volume-loader@1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1)': + dependencies: + '@cornerstonejs/core': 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + comlink: 4.4.1 + transitivePeerDependencies: + - '@babel/preset-env' + - autoprefixer + - webpack + - wslink + + '@cornerstonejs/tools@1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@icr/polyseg-wasm@0.4.0)(@kitware/vtk.js@30.4.1(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(autoprefixer@10.4.20(postcss@8.4.47))(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)(webpack@5.94.0)(wslink@2.2.1)': + dependencies: + '@cornerstonejs/core': 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + '@icr/polyseg-wasm': 0.4.0 + '@kitware/vtk.js': 30.4.1(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + '@types/d3-array': 3.2.1 + '@types/d3-interpolate': 3.0.4 + '@types/offscreencanvas': 2019.7.3 + comlink: 4.4.1 + d3-array: 3.2.4 + d3-interpolate: 3.0.1 + gl-matrix: 3.4.3 + lodash.clonedeep: 4.5.0 + lodash.get: 4.4.2 + transitivePeerDependencies: + - '@babel/preset-env' + - autoprefixer + - webpack + - wslink + + '@ctrl/tinycolor@3.6.1': {} + + '@emotion/hash@0.8.0': {} + + '@emotion/unitless@0.7.5': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@faker-js/faker@9.0.1': {} + + '@fnndsc/chrisapi@1.22.0': + dependencies: + axios: 1.7.5 + core-js: 3.38.1 + transitivePeerDependencies: + - debug + + '@fontsource/inter@5.0.20': {} + + '@icr/polyseg-wasm@0.4.0': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@kitware/vtk.js@30.4.1(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1)': + dependencies: + '@babel/preset-env': 7.25.4(@babel/core@7.25.2) + '@babel/runtime': 7.22.11 + '@types/webxr': 0.5.20 + autoprefixer: 10.4.20(postcss@8.4.47) + commander: 9.2.0 + d3-scale: 4.0.2 + fast-deep-equal: 3.1.3 + fflate: 0.7.3 + gl-matrix: 3.4.3 + globalthis: 1.0.3 + seedrandom: 3.0.5 + shader-loader: 1.3.1 + shelljs: 0.8.5 + spark-md5: 3.0.2 + stream-browserify: 3.0.0 + webworker-promise: 0.5.0 + worker-loader: 3.0.8(webpack@5.94.0) + wslink: 2.2.1 + xmlbuilder2: 3.0.2 + transitivePeerDependencies: + - webpack + + '@lukeed/csprng@1.1.0': {} + + '@lukeed/uuid@2.0.1': + dependencies: + '@lukeed/csprng': 1.1.0 + + '@mattiasbuelens/web-streams-polyfill@0.2.1': + dependencies: + '@types/whatwg-streams': 0.0.7 + + '@msgpack/msgpack@2.8.0': {} + + '@niivue/niivue@0.44.2': + dependencies: + '@lukeed/uuid': 2.0.1 + '@ungap/structured-clone': 1.2.0 + array-equal: 1.0.2 + daikon: 1.2.46 + fflate: 0.8.2 + gl-matrix: 3.4.3 + nifti-reader-js: 0.6.8 + rxjs: 7.8.1 + optionalDependencies: + '@rollup/rollup-linux-x64-gnu': 4.21.1 + + '@oozcitak/dom@1.15.10': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/url': 1.0.4 + '@oozcitak/util': 8.3.8 + + '@oozcitak/infra@1.0.8': + dependencies: + '@oozcitak/util': 8.3.8 + + '@oozcitak/url@1.0.4': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + + '@oozcitak/util@8.3.8': {} + + '@patternfly/react-catalog-view-extension@5.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@patternfly/react-core': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-styles': 5.4.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@patternfly/react-charts@7.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@patternfly/react-styles': 5.4.0 + '@patternfly/react-tokens': 5.4.0 + hoist-non-react-statics: 3.3.2 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.7.0 + victory-area: 37.0.2(react@18.3.1) + victory-axis: 37.0.2(react@18.3.1) + victory-bar: 37.0.2(react@18.3.1) + victory-box-plot: 37.0.2(react@18.3.1) + victory-chart: 37.0.2(react@18.3.1) + victory-core: 37.0.2(react@18.3.1) + victory-create-container: 37.0.2(react@18.3.1) + victory-cursor-container: 37.0.2(react@18.3.1) + victory-group: 37.0.2(react@18.3.1) + victory-legend: 37.0.2(react@18.3.1) + victory-line: 37.0.2(react@18.3.1) + victory-pie: 37.0.2(react@18.3.1) + victory-scatter: 37.0.2(react@18.3.1) + victory-stack: 37.0.2(react@18.3.1) + victory-tooltip: 37.0.2(react@18.3.1) + victory-voronoi-container: 37.0.2(react@18.3.1) + victory-zoom-container: 37.0.2(react@18.3.1) + + '@patternfly/react-core@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@patternfly/react-icons': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-styles': 5.4.0 + '@patternfly/react-tokens': 5.4.0 + focus-trap: 7.5.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-dropzone: 14.2.3(react@18.3.1) + tslib: 2.7.0 + + '@patternfly/react-icons@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@patternfly/react-log-viewer@5.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@patternfly/react-core': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-icons': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-styles': 5.4.0 + memoize-one: 5.2.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@patternfly/react-styles@5.4.0': {} + + '@patternfly/react-table@5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@patternfly/react-core': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-icons': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@patternfly/react-styles': 5.4.0 + '@patternfly/react-tokens': 5.4.0 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.7.0 + + '@patternfly/react-tokens@5.4.0': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@playwright/test@1.46.1': + dependencies: + playwright: 1.46.1 + + '@polka/url@1.0.0-next.25': {} + + '@popperjs/core@2.11.8': {} + + '@rc-component/async-validator@5.0.4': + dependencies: + '@babel/runtime': 7.25.4 + + '@rc-component/color-picker@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@ant-design/fast-color': 2.0.6 + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/context@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.4 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/mini-decimal@1.1.0': + dependencies: + '@babel/runtime': 7.25.4 + + '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/qrcode@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/tour@1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/trigger@2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-hook/latest@1.0.3(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-hook/passive-layout-effect@1.2.1(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-hook/resize-observer@2.0.2(react@18.3.1)': + dependencies: + '@react-hook/latest': 1.0.3(react@18.3.1) + '@react-hook/passive-layout-effect': 1.2.1(react@18.3.1) + react: 18.3.1 + + '@redux-devtools/extension@3.3.0(redux@5.0.1)': + dependencies: + '@babel/runtime': 7.25.4 + immutable: 4.3.7 + redux: 5.0.1 + + '@redux-saga/core@1.3.0': + dependencies: + '@babel/runtime': 7.25.4 + '@redux-saga/deferred': 1.2.1 + '@redux-saga/delay-p': 1.2.1 + '@redux-saga/is': 1.1.3 + '@redux-saga/symbols': 1.1.3 + '@redux-saga/types': 1.2.1 + typescript-tuple: 2.2.1 + + '@redux-saga/deferred@1.2.1': {} + + '@redux-saga/delay-p@1.2.1': + dependencies: + '@redux-saga/symbols': 1.1.3 + + '@redux-saga/is@1.1.3': + dependencies: + '@redux-saga/symbols': 1.1.3 + '@redux-saga/types': 1.2.1 + + '@redux-saga/symbols@1.1.3': {} + + '@redux-saga/types@1.2.1': {} + + '@reduxjs/toolkit@2.2.7(react-redux@9.1.2(@types/react@18.3.4)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': + dependencies: + immer: 10.1.1 + redux: 5.0.1 + redux-thunk: 3.1.0(redux@5.0.1) + reselect: 5.1.1 + optionalDependencies: + react: 18.3.1 + react-redux: 9.1.2(@types/react@18.3.4)(react@18.3.1)(redux@5.0.1) + + '@remix-run/router@1.19.2': {} + + '@restart/hooks@0.4.16(react@18.3.1)': + dependencies: + dequal: 2.0.3 + react: 18.3.1 + + '@rollup/rollup-android-arm-eabi@4.21.1': + optional: true + + '@rollup/rollup-android-arm64@4.21.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.21.1': + optional: true + + '@rollup/rollup-darwin-x64@4.21.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.21.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.21.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.21.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.21.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.21.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.21.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.21.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.21.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.21.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.21.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.21.1': + optional: true + + '@swc/core-darwin-arm64@1.7.21': + optional: true + + '@swc/core-darwin-x64@1.7.21': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.7.21': + optional: true + + '@swc/core-linux-arm64-gnu@1.7.21': + optional: true + + '@swc/core-linux-arm64-musl@1.7.21': + optional: true + + '@swc/core-linux-x64-gnu@1.7.21': + optional: true + + '@swc/core-linux-x64-musl@1.7.21': + optional: true + + '@swc/core-win32-arm64-msvc@1.7.21': + optional: true + + '@swc/core-win32-ia32-msvc@1.7.21': + optional: true + + '@swc/core-win32-x64-msvc@1.7.21': + optional: true + + '@swc/core@1.7.21': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.12 + optionalDependencies: + '@swc/core-darwin-arm64': 1.7.21 + '@swc/core-darwin-x64': 1.7.21 + '@swc/core-linux-arm-gnueabihf': 1.7.21 + '@swc/core-linux-arm64-gnu': 1.7.21 + '@swc/core-linux-arm64-musl': 1.7.21 + '@swc/core-linux-x64-gnu': 1.7.21 + '@swc/core-linux-x64-musl': 1.7.21 + '@swc/core-win32-arm64-msvc': 1.7.21 + '@swc/core-win32-ia32-msvc': 1.7.21 + '@swc/core-win32-x64-msvc': 1.7.21 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.12': + dependencies: + '@swc/counter': 0.1.3 + + '@tanstack/query-core@5.56.2': {} + + '@tanstack/react-query@5.56.2(react@18.3.1)': + dependencies: + '@tanstack/query-core': 5.56.2 + react: 18.3.1 + + '@tweenjs/tween.js@23.1.3': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.25.4 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.25.4 + + '@types/cookie@0.6.0': {} + + '@types/d3-array@3.2.1': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.0': {} + + '@types/d3-scale@4.0.8': + dependencies: + '@types/d3-time': 3.0.3 + + '@types/d3-selection@3.0.10': {} + + '@types/d3-shape@3.1.6': + dependencies: + '@types/d3-path': 3.1.0 + + '@types/d3-time@3.0.3': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.10 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/estree@1.0.5': {} + + '@types/hoist-non-react-statics@3.3.5': + dependencies: + '@types/react': 18.3.4 + hoist-non-react-statics: 3.3.2 + + '@types/json-schema@7.0.15': {} + + '@types/lodash@4.17.7': {} + + '@types/ms@0.7.34': {} + + '@types/node@22.5.5': + dependencies: + undici-types: 6.19.8 + + '@types/offscreencanvas@2019.7.3': {} + + '@types/parse-json@4.0.2': {} + + '@types/prop-types@15.7.12': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.4 + + '@types/react@18.3.4': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/redux-logger@3.0.13': + dependencies: + redux: 5.0.1 + + '@types/use-sync-external-store@0.0.3': {} + + '@types/uuid@10.0.0': {} + + '@types/warning@3.0.3': {} + + '@types/webxr@0.5.20': {} + + '@types/whatwg-streams@0.0.7': {} + + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-react-swc@3.7.0(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0))': + dependencies: + '@swc/core': 1.7.21 + vite: 5.4.6(@types/node@22.5.5)(terser@5.33.0) + transitivePeerDependencies: + - '@swc/helpers' + + '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@22.5.5)(happy-dom@15.0.0)(terser@5.33.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.6 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.11 + magicast: 0.3.5 + std-env: 3.7.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.1(@types/node@22.5.5)(happy-dom@15.0.0)(terser@5.33.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@2.1.1': + dependencies: + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0))': + dependencies: + '@vitest/spy': 2.1.1 + estree-walker: 3.0.3 + magic-string: 0.30.11 + optionalDependencies: + vite: 5.4.6(@types/node@22.5.5)(terser@5.33.0) + + '@vitest/pretty-format@2.1.1': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.1': + dependencies: + '@vitest/utils': 2.1.1 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.1': + dependencies: + '@vitest/pretty-format': 2.1.1 + magic-string: 0.30.11 + pathe: 1.1.2 + + '@vitest/spy@2.1.1': + dependencies: + tinyspy: 3.0.0 + + '@vitest/utils@2.1.1': + dependencies: + '@vitest/pretty-format': 2.1.1 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + + '@wearemothership/dicom-character-set@1.0.4-opt.1': {} + + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + + '@webassemblyjs/helper-wasm-section@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + '@webassemblyjs/wasm-gen@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + '@webassemblyjs/wasm-parser@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + accessor-fn@1.5.1: {} + + ackee-tracker@5.1.0: + dependencies: + platform: 1.3.6 + + acorn-import-attributes@1.9.5(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + antd@5.20.6(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@ant-design/colors': 7.1.0 + '@ant-design/cssinjs': 1.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/cssinjs-utils': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/icons': 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/react-slick': 1.1.2(react@18.3.1) + '@babel/runtime': 7.25.4 + '@ctrl/tinycolor': 3.6.1 + '@rc-component/color-picker': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/qrcode': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/tour': 1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + copy-to-clipboard: 3.3.3 + dayjs: 1.11.13 + rc-cascader: 3.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-checkbox: 3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-collapse: 3.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dialog: 9.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-drawer: 7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-field-form: 2.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-image: 7.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input: 1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input-number: 9.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-mentions: 2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-notification: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-pagination: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-picker: 4.6.14(date-fns@4.1.0)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-progress: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-rate: 2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-segmented: 2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-select: 14.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-slider: 11.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-steps: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-switch: 4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-table: 7.45.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tabs: 15.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-textarea: 1.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tooltip: 6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree-select: 5.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-upload: 4.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + scroll-into-view-if-needed: 3.1.0 + throttle-debounce: 5.0.2 + transitivePeerDependencies: + - date-fns + - luxon + - moment + + append-transform@2.0.0: + dependencies: + default-require-extensions: 3.0.1 + + archy@1.0.0: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + array-equal@1.0.2: {} + + array-tree-filter@2.1.0: {} + + asap@2.0.6: {} + + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + assertion-error@2.0.1: {} + + asynckit@0.4.0: {} + + attr-accept@2.2.2: {} + + autoprefixer@10.4.20(postcss@8.4.47): + dependencies: + browserslist: 4.23.3 + caniuse-lite: 1.0.30001653 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.0 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + axios@1.7.5: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.25.4 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + babel-plugin-preval@5.1.0: + dependencies: + '@babel/runtime': 7.25.4 + '@types/babel__core': 7.20.5 + babel-plugin-macros: 3.1.0 + require-from-string: 2.0.2 + + balanced-match@1.0.2: {} + + base16@1.0.0: {} + + bezier-js@6.1.4: {} + + big.js@5.2.2: {} + + bn.js@4.12.0: {} + + bn.js@5.2.1: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + brorand@1.1.0: {} + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-cipher@1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + + browserify-des@1.0.2: + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-rsa@4.1.0: + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + + browserify-sign@4.2.3: + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.7 + hash-base: 3.0.4 + inherits: 2.0.4 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001653 + electron-to-chromium: 1.5.13 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + buffer-es6@4.9.3: {} + + buffer-from@1.1.2: {} + + buffer-xor@1.0.3: {} + + cac@6.7.14: {} + + caching-transform@4.0.0: + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + caniuse-lite@1.0.30001653: {} + + canvas-color-tracker@1.2.2: + dependencies: + tinycolor2: 1.6.0 + + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + character-entities@2.0.2: {} + + check-error@2.1.1: {} + + chrome-trace-event@1.0.4: {} + + cipher-base@1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + classnames@2.5.1: {} + + clean-stack@2.2.0: {} + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + clsx@1.2.1: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comlink@4.4.1: {} + + commander@2.20.3: {} + + commander@9.2.0: {} + + commondir@1.0.1: {} + + compute-scroll-into-view@3.1.0: {} + + concat-map@0.0.1: {} + + console-clear@1.1.1: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie@0.6.0: {} + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + + core-js-compat@3.38.1: + dependencies: + browserslist: 4.23.3 + + core-js@3.38.1: {} + + core-util-is@1.0.3: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + create-ecdh@4.0.4: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.7 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + cross-fetch@3.1.8: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-browserify@3.12.0: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.3 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + + cssfilter@0.0.10: {} + + csstype@3.1.3: {} + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-binarytree@1.0.2: {} + + d3-color@3.1.0: {} + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-ease@3.0.1: {} + + d3-force-3d@3.0.5: + dependencies: + d3-binarytree: 1.0.2 + d3-dispatch: 3.0.1 + d3-octree: 1.0.2 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-octree@1.0.2: {} + + d3-path@3.1.0: {} + + d3-quadtree@3.0.1: {} + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + daikon@1.2.46: + dependencies: + '@wearemothership/dicom-character-set': 1.0.4-opt.1 + fflate: 0.8.2 + jpeg-lossless-decoder-js: 2.0.7 + pako: 2.1.0 + xss: 1.0.14 + + date-fns@4.1.0: {} + + dayjs@1.11.13: {} + + debug@4.3.6: + dependencies: + ms: 2.1.2 + + decamelize@1.2.0: {} + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + decode-uri-component@0.4.1: {} + + deep-diff@0.3.8: {} + + deep-eql@5.0.2: {} + + deepmerge@4.3.1: {} + + default-require-extensions@3.0.1: + dependencies: + strip-bom: 4.0.0 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delaunator@4.0.1: {} + + delaunay-find@0.0.6: + dependencies: + delaunator: 4.0.1 + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + detect-gpu@5.0.45: + dependencies: + webgl-constants: 1.1.1 + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dicom-parser@1.8.21: {} + + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.25.4 + csstype: 3.1.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.13: {} + + elliptic@6.5.7: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + email-validator@2.0.4: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-module-lexer@1.5.4: {} + + es6-error@4.1.1: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-visitor-keys@4.0.0: {} + + espree@10.1.0: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.0.0 + + esprima@4.0.1: {} + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + esutils@2.0.3: {} + + eventemitter3@5.0.1: {} + + events@3.3.0: {} + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fbemitter@3.0.0: + dependencies: + fbjs: 3.0.5 + transitivePeerDependencies: + - encoding + + fbjs-css-vars@1.0.2: {} + + fbjs@3.0.5: + dependencies: + cross-fetch: 3.1.8 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.38 + transitivePeerDependencies: + - encoding + + fetch-readablestream@0.2.0: {} + + fflate@0.7.3: {} + + fflate@0.8.2: {} + + file-selector@0.6.0: + dependencies: + tslib: 2.7.0 + + filter-obj@5.1.0: {} + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + flux@4.0.4(react@18.3.1): + dependencies: + fbemitter: 3.0.0 + fbjs: 3.0.5 + react: 18.3.1 + transitivePeerDependencies: + - encoding + + focus-trap@7.5.4: + dependencies: + tabbable: 6.2.0 + + follow-redirects@1.15.6: {} + + force-graph@1.43.5: + dependencies: + '@tweenjs/tween.js': 23.1.3 + accessor-fn: 1.5.1 + bezier-js: 6.1.4 + canvas-color-tracker: 1.2.2 + d3-array: 3.2.4 + d3-drag: 3.0.0 + d3-force-3d: 3.0.5 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + index-array-by: 1.4.2 + kapsule: 1.14.5 + lodash-es: 4.17.21 + + foreground-child@2.0.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fp-ts@2.16.9: {} + + fraction.js@4.3.7: {} + + fromentries@1.3.2: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.2: + optional: true + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-package-type@0.1.0: {} + + get-port@3.2.0: {} + + gl-matrix@3.4.3: {} + + glob-to-regexp@0.4.1: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globalthis@1.0.3: + dependencies: + define-properties: 1.2.1 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + hammerjs@2.0.8: {} + + happy-dom@15.0.0: + dependencies: + entities: 4.5.0 + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + hash-base@3.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasha@5.2.2: + dependencies: + is-stream: 2.0.1 + type-fest: 0.8.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + html-escaper@2.0.2: {} + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + + immer@10.1.1: {} + + immutable@3.8.2: {} + + immutable@4.3.7: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + index-array-by@1.4.2: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internmap@2.0.3: {} + + interpret@1.4.0: {} + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + is-arrayish@0.2.1: {} + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-fullwidth-code-point@3.0.0: {} + + is-plain-object@5.0.0: {} + + is-stream@2.0.1: {} + + is-typedarray@1.0.0: {} + + is-windows@1.0.2: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-hook@3.0.0: + dependencies: + append-transform: 2.0.0 + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.25.2 + '@babel/parser': 7.25.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-processinfo@2.0.3: + dependencies: + archy: 1.0.0 + cross-spawn: 7.0.3 + istanbul-lib-coverage: 3.2.2 + p-map: 3.0.0 + rimraf: 3.0.2 + uuid: 8.3.2 + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.3.6 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.6 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jerrypick@1.1.1: {} + + jest-worker@27.5.1: + dependencies: + '@types/node': 22.5.5 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jpeg-lossless-decoder-js@2.0.7: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.0: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsesc@0.5.0: {} + + jsesc@2.5.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stringify-safe@5.0.1: {} + + json2mq@0.2.0: + dependencies: + string-convert: 0.2.1 + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + kapsule@1.14.5: + dependencies: + lodash-es: 4.17.21 + + kleur@4.1.5: {} + + lefthook-darwin-arm64@1.7.14: + optional: true + + lefthook-darwin-x64@1.7.14: + optional: true + + lefthook-freebsd-arm64@1.7.14: + optional: true + + lefthook-freebsd-x64@1.7.14: + optional: true + + lefthook-linux-arm64@1.7.14: + optional: true + + lefthook-linux-x64@1.7.14: + optional: true + + lefthook-openbsd-arm64@1.7.14: + optional: true + + lefthook-openbsd-x64@1.7.14: + optional: true + + lefthook-windows-arm64@1.7.14: + optional: true + + lefthook-windows-x64@1.7.14: + optional: true + + lefthook@1.7.14: + optionalDependencies: + lefthook-darwin-arm64: 1.7.14 + lefthook-darwin-x64: 1.7.14 + lefthook-freebsd-arm64: 1.7.14 + lefthook-freebsd-x64: 1.7.14 + lefthook-linux-arm64: 1.7.14 + lefthook-linux-x64: 1.7.14 + lefthook-openbsd-arm64: 1.7.14 + lefthook-openbsd-x64: 1.7.14 + lefthook-windows-arm64: 1.7.14 + lefthook-windows-x64: 1.7.14 + + lines-and-columns@1.2.4: {} + + loader-runner@4.3.0: {} + + loader-utils@1.4.2: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + local-access@1.1.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash-es@4.17.21: {} + + lodash.clonedeep@4.5.0: {} + + lodash.curry@4.1.1: {} + + lodash.debounce@4.0.8: {} + + lodash.flattendeep@4.4.0: {} + + lodash.flow@3.5.0: {} + + lodash.get@4.4.2: {} + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 + source-map-js: 1.2.1 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + marked@14.1.2: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.0.4 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + memoize-one@5.2.1: {} + + merge-stream@2.0.0: {} + + micromark-core-commonmark@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + + micromark@4.0.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.6 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mitt@1.2.0: {} + + mri@1.2.0: {} + + mrmime@2.0.0: {} + + ms@2.1.2: {} + + nanoid@3.3.7: {} + + neo-async@2.6.2: {} + + nifti-reader-js@0.6.8: + dependencies: + fflate: 0.8.2 + + niivue-react@https://codeload.github.com/niivue/niivue-react/tar.gz/d7734b88359b61356fec5bfa302e02536e0a1134(@niivue/niivue@0.44.2)(react@18.3.1)(typescript@5.6.2): + dependencies: + '@niivue/niivue': 0.44.2 + dequal: 2.0.3 + react: 18.3.1 + typescript: 5.6.2 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-preload@0.2.1: + dependencies: + process-on-spawn: 1.0.0 + + node-releases@2.0.18: {} + + normalize-range@0.1.2: {} + + nyc@17.0.0: + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + caching-transform: 4.0.0 + convert-source-map: 1.9.0 + decamelize: 1.2.0 + find-cache-dir: 3.3.2 + find-up: 4.1.0 + foreground-child: 2.0.0 + get-package-type: 0.1.0 + glob: 7.2.3 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-hook: 3.0.0 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-processinfo: 2.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + make-dir: 3.1.0 + node-preload: 0.2.1 + p-map: 3.0.0 + process-on-spawn: 1.0.0 + resolve-from: 5.0.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + spawn-wrap: 2.0.0 + test-exclude: 6.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color + + object-assign@4.1.1: {} + + object-keys@1.1.1: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-map@3.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-queue@8.0.1: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.2 + + p-timeout@6.1.2: {} + + p-try@2.2.0: {} + + package-hash@4.0.0: + dependencies: + graceful-fs: 4.2.11 + hasha: 5.2.2 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + + package-json-from-dist@1.0.0: {} + + pako@1.0.11: {} + + pako@2.1.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-asn1@5.1.7: + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + hash-base: 3.0.4 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-srcset@1.0.2: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathval@2.0.0: {} + + pbkdf2@3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + picocolors@1.0.1: {} + + picocolors@1.1.0: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + platform@1.3.6: {} + + playwright-core@1.46.1: {} + + playwright@1.46.1: + dependencies: + playwright-core: 1.46.1 + optionalDependencies: + fsevents: 2.3.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.41: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + postcss@8.4.47: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 + + preval.macro@5.0.0: + dependencies: + babel-plugin-preval: 5.1.0 + + process-es6@0.11.6: {} + + process-nextick-args@2.0.1: {} + + process-on-spawn@1.0.0: + dependencies: + fromentries: 1.3.2 + + promise@7.3.1: + dependencies: + asap: 2.0.6 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proxy-from-env@1.1.0: {} + + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.7 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + punycode@2.3.1: {} + + pure-color@1.3.0: {} + + query-string@9.1.0: + dependencies: + decode-uri-component: 0.4.1 + filter-obj: 5.1.0 + split-on-first: 3.0.0 + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + randomfill@1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + rc-cascader@3.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + array-tree-filter: 2.1.0 + classnames: 2.5.1 + rc-select: 14.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-checkbox@3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-collapse@3.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-dialog@9.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-drawer@7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-dropdown@4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-field-form@2.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/async-validator': 5.0.4 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-image@7.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-dialog: 9.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-input-number@9.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/mini-decimal': 1.1.0 + classnames: 2.5.1 + rc-input: 1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-input@1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-mentions@2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-input: 1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-textarea: 1.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-menu@9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-motion@2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-notification@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-overflow@1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-pagination@4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-picker@4.6.14(date-fns@4.1.0)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + date-fns: 4.1.0 + dayjs: 1.11.13 + + rc-progress@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-rate@2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-resize-observer@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + resize-observer-polyfill: 1.5.1 + + rc-segmented@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-select@14.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-slider@11.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-steps@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-switch@4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-table@7.45.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/context': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-tabs@15.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-textarea@1.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-input: 1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-tooltip@6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-tree-select@5.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-select: 14.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-tree@5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-tree@5.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-upload@4.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-util@5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + + rc-virtual-list@3.14.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-activity@2.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-base16-styling@0.6.0: + dependencies: + base16: 1.0.0 + lodash.curry: 4.1.1 + lodash.flow: 3.5.0 + pure-color: 1.3.0 + + react-bootstrap-typeahead@6.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@popperjs/core': 2.11.8 + '@restart/hooks': 0.4.16(react@18.3.1) + classnames: 2.5.1 + fast-deep-equal: 3.1.3 + invariant: 2.2.4 + lodash.debounce: 4.0.8 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-overlays: 5.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + scroll-into-view-if-needed: 3.1.0 + warning: 4.0.3 + + react-cookie@7.2.0(react@18.3.1): + dependencies: + '@types/hoist-non-react-statics': 3.3.5 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + universal-cookie: 7.2.0 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-dropzone@14.2.3(react@18.3.1): + dependencies: + attr-accept: 2.2.2 + file-selector: 0.6.0 + prop-types: 15.8.1 + react: 18.3.1 + + react-error-boundary@4.0.13(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + react: 18.3.1 + + react-fast-compare@3.2.2: {} + + react-force-graph-2d@1.25.5(react@18.3.1): + dependencies: + force-graph: 1.43.5 + prop-types: 15.8.1 + react: 18.3.1 + react-kapsule: 2.4.0(react@18.3.1) + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-json-view@1.21.3(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + flux: 4.0.4(react@18.3.1) + react: 18.3.1 + react-base16-styling: 0.6.0 + react-dom: 18.3.1(react@18.3.1) + react-lifecycles-compat: 3.0.4 + react-textarea-autosize: 8.5.3(@types/react@18.3.4)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - encoding + + react-kapsule@2.4.0(react@18.3.1): + dependencies: + fromentries: 1.3.2 + jerrypick: 1.1.1 + react: 18.3.1 + + react-lazylog@4.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@mattiasbuelens/web-streams-polyfill': 0.2.1 + fetch-readablestream: 0.2.0 + immutable: 3.8.2 + mitt: 1.2.0 + prop-types: 15.8.1 + react: 18.3.1 + react-string-replace: 0.4.4 + react-virtualized: 9.22.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + text-encoding-utf-8: 1.0.2 + whatwg-fetch: 2.0.4 + transitivePeerDependencies: + - react-dom + + react-lifecycles-compat@3.0.4: {} + + react-overlays@5.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@popperjs/core': 2.11.8 + '@restart/hooks': 0.4.16(react@18.3.1) + '@types/warning': 3.0.3 + dom-helpers: 5.2.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + uncontrollable: 7.2.1(react@18.3.1) + warning: 4.0.3 + + react-popper@2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@popperjs/core': 2.11.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-fast-compare: 3.2.2 + warning: 4.0.3 + + react-redux@9.1.2(@types/react@18.3.4)(react@18.3.1)(redux@5.0.1): + dependencies: + '@types/use-sync-external-store': 0.0.3 + react: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.4 + redux: 5.0.1 + + react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.19.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.26.2(react@18.3.1) + + react-router@6.26.2(react@18.3.1): + dependencies: + '@remix-run/router': 1.19.2 + react: 18.3.1 + + react-string-replace@0.4.4: + dependencies: + lodash: 4.17.21 + + react-textarea-autosize@8.5.3(@types/react@18.3.4)(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + react: 18.3.1 + use-composed-ref: 1.3.0(react@18.3.1) + use-latest: 1.2.1(@types/react@18.3.4)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + + react-virtualized@9.22.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + clsx: 1.2.1 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-lifecycles-compat: 3.0.4 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + rechoir@0.6.2: + dependencies: + resolve: 1.22.8 + + redux-logger@4.0.0: + dependencies: + deep-diff: 0.3.8 + + redux-saga@1.3.0: + dependencies: + '@redux-saga/core': 1.3.0 + + redux-thunk@3.1.0(redux@5.0.1): + dependencies: + redux: 5.0.1 + + redux@5.0.1: {} + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.14.1: {} + + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.25.4 + + regexpu-core@5.3.2: + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + + regjsparser@0.9.1: + dependencies: + jsesc: 0.5.0 + + release-zalgo@1.0.0: + dependencies: + es6-error: 4.1.1 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-main-filename@2.0.0: {} + + reselect@5.1.1: {} + + resize-observer-polyfill@1.5.1: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + ripemd160@2.0.2: + dependencies: + hash-base: 3.0.4 + inherits: 2.0.4 + + rollup-plugin-node-builtins@2.0.0: + dependencies: + buffer-es6: 4.9.3 + crypto-browserify: 3.12.0 + process-es6: 0.11.6 + + rollup@4.21.1: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.21.1 + '@rollup/rollup-android-arm64': 4.21.1 + '@rollup/rollup-darwin-arm64': 4.21.1 + '@rollup/rollup-darwin-x64': 4.21.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.1 + '@rollup/rollup-linux-arm-musleabihf': 4.21.1 + '@rollup/rollup-linux-arm64-gnu': 4.21.1 + '@rollup/rollup-linux-arm64-musl': 4.21.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.1 + '@rollup/rollup-linux-riscv64-gnu': 4.21.1 + '@rollup/rollup-linux-s390x-gnu': 4.21.1 + '@rollup/rollup-linux-x64-gnu': 4.21.1 + '@rollup/rollup-linux-x64-musl': 4.21.1 + '@rollup/rollup-win32-arm64-msvc': 4.21.1 + '@rollup/rollup-win32-ia32-msvc': 4.21.1 + '@rollup/rollup-win32-x64-msvc': 4.21.1 + fsevents: 2.3.3 + + rusha@0.8.14: {} + + rxjs@7.8.1: + dependencies: + tslib: 2.7.0 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + sanitize-html@2.13.0: + dependencies: + deepmerge: 4.3.1 + escape-string-regexp: 4.0.0 + htmlparser2: 8.0.2 + is-plain-object: 5.0.0 + parse-srcset: 1.0.2 + postcss: 8.4.41 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.0 + + seedrandom@3.0.5: {} + + semiver@1.1.0: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + set-blocking@2.0.0: {} + + setimmediate@1.0.5: {} + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + shader-loader@1.3.1: + dependencies: + loader-utils: 1.4.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + shlex@2.1.2: {} + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sirv-cli@2.0.2: + dependencies: + console-clear: 1.1.1 + get-port: 3.2.0 + kleur: 4.1.5 + local-access: 1.1.0 + sade: 1.8.1 + semiver: 1.1.0 + sirv: 2.0.4 + tinydate: 1.3.0 + + sirv@2.0.4: + dependencies: + '@polka/url': 1.0.0-next.25 + mrmime: 2.0.0 + totalist: 3.0.1 + + source-map-js@1.2.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + spark-md5@3.0.2: {} + + spawn-wrap@2.0.0: + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + + split-on-first@3.0.0: {} + + sprintf-js@1.0.3: {} + + stackback@0.0.2: {} + + std-env@3.7.0: {} + + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + string-convert@0.2.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom@4.0.0: {} + + stylis@4.3.4: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tabbable@6.2.0: {} + + tapable@2.2.1: {} + + terser-webpack-plugin@5.3.10(webpack@5.94.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.33.0 + webpack: 5.94.0 + + terser@5.33.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.1 + commander: 2.20.3 + source-map-support: 0.5.21 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + + text-encoding-utf-8@1.0.2: {} + + throttle-debounce@5.0.2: {} + + tinybench@2.9.0: {} + + tinycolor2@1.6.0: {} + + tinydate@1.3.0: {} + + tinyexec@0.3.0: {} + + tinypool@1.0.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.0: {} + + to-fast-properties@2.0.0: {} + + toggle-selection@1.0.6: {} + + totalist@3.0.1: {} + + tr46@0.0.3: {} + + tslib@2.7.0: {} + + type-fest@0.8.1: {} + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + typescript-compare@0.0.2: + dependencies: + typescript-logic: 0.0.0 + + typescript-logic@0.0.0: {} + + typescript-tuple@2.2.1: + dependencies: + typescript-compare: 0.0.2 + + typescript@5.6.2: {} + + ua-parser-js@1.0.38: {} + + uncontrollable@7.2.1(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + '@types/react': 18.3.4 + invariant: 2.2.4 + react: 18.3.1 + react-lifecycles-compat: 3.0.4 + + undici-types@6.19.8: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + universal-cookie@7.2.0: + dependencies: + '@types/cookie': 0.6.0 + cookie: 0.6.0 + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-ackee@3.1.0(react@18.3.1): + dependencies: + ackee-tracker: 5.1.0 + react: 18.3.1 + + use-composed-ref@1.3.0(react@18.3.1): + dependencies: + react: 18.3.1 + + use-immer@0.10.0(immer@10.1.1)(react@18.3.1): + dependencies: + immer: 10.1.1 + react: 18.3.1 + + use-isomorphic-layout-effect@1.1.2(@types/react@18.3.4)(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.4 + + use-latest@1.2.1(@types/react@18.3.4)(react@18.3.1): + dependencies: + react: 18.3.1 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.4)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.4 + + use-sync-external-store@1.2.2(react@18.3.1): + dependencies: + react: 18.3.1 + + util-deprecate@1.0.2: {} + + uuid@10.0.0: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + victory-area@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + victory-vendor: 37.0.2 + + victory-axis@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + + victory-bar@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + victory-vendor: 37.0.2 + + victory-box-plot@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + victory-vendor: 37.0.2 + + victory-brush-container@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + react-fast-compare: 3.2.2 + victory-core: 37.0.2(react@18.3.1) + + victory-chart@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + react-fast-compare: 3.2.2 + victory-axis: 37.0.2(react@18.3.1) + victory-core: 37.0.2(react@18.3.1) + victory-polar-axis: 37.0.2(react@18.3.1) + victory-shared-events: 37.0.2(react@18.3.1) + + victory-core@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + react-fast-compare: 3.2.2 + victory-vendor: 37.0.2 + + victory-create-container@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-brush-container: 37.0.2(react@18.3.1) + victory-core: 37.0.2(react@18.3.1) + victory-cursor-container: 37.0.2(react@18.3.1) + victory-selection-container: 37.0.2(react@18.3.1) + victory-voronoi-container: 37.0.2(react@18.3.1) + victory-zoom-container: 37.0.2(react@18.3.1) + + victory-cursor-container@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + + victory-group@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + react-fast-compare: 3.2.2 + victory-core: 37.0.2(react@18.3.1) + victory-shared-events: 37.0.2(react@18.3.1) + + victory-legend@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + + victory-line@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + victory-vendor: 37.0.2 + + victory-pie@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + victory-vendor: 37.0.2 + + victory-polar-axis@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + + victory-scatter@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + + victory-selection-container@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + + victory-shared-events@37.0.2(react@18.3.1): + dependencies: + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + react: 18.3.1 + react-fast-compare: 3.2.2 + victory-core: 37.0.2(react@18.3.1) + + victory-stack@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + react-fast-compare: 3.2.2 + victory-core: 37.0.2(react@18.3.1) + victory-shared-events: 37.0.2(react@18.3.1) + + victory-tooltip@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + + victory-vendor@37.0.2: + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.8 + '@types/d3-shape': 3.1.6 + '@types/d3-time': 3.0.3 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + + victory-voronoi-container@37.0.2(react@18.3.1): + dependencies: + delaunay-find: 0.0.6 + lodash: 4.17.21 + react: 18.3.1 + react-fast-compare: 3.2.2 + victory-core: 37.0.2(react@18.3.1) + victory-tooltip: 37.0.2(react@18.3.1) + + victory-zoom-container@37.0.2(react@18.3.1): + dependencies: + lodash: 4.17.21 + react: 18.3.1 + victory-core: 37.0.2(react@18.3.1) + + vite-node@2.1.1(@types/node@22.5.5)(terser@5.33.0): + dependencies: + cac: 6.7.14 + debug: 4.3.6 + pathe: 1.1.2 + vite: 5.4.6(@types/node@22.5.5)(terser@5.33.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-plugin-babel-macros@1.0.6(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0)): + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) + '@types/babel__core': 7.20.5 + babel-plugin-macros: 3.1.0 + vite: 5.4.6(@types/node@22.5.5)(terser@5.33.0) + transitivePeerDependencies: + - supports-color + + vite-plugin-istanbul@6.0.2(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0)): + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + espree: 10.1.0 + istanbul-lib-instrument: 6.0.3 + picocolors: 1.0.1 + source-map: 0.7.4 + test-exclude: 6.0.0 + vite: 5.4.6(@types/node@22.5.5)(terser@5.33.0) + transitivePeerDependencies: + - supports-color + + vite@5.4.6(@types/node@22.5.5)(terser@5.33.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.21.1 + optionalDependencies: + '@types/node': 22.5.5 + fsevents: 2.3.3 + terser: 5.33.0 + + vitest@2.1.1(@types/node@22.5.5)(happy-dom@15.0.0)(terser@5.33.0): + dependencies: + '@vitest/expect': 2.1.1 + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0)) + '@vitest/pretty-format': 2.1.1 + '@vitest/runner': 2.1.1 + '@vitest/snapshot': 2.1.1 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + debug: 4.3.6 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.0 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.6(@types/node@22.5.5)(terser@5.33.0) + vite-node: 2.1.1(@types/node@22.5.5)(terser@5.33.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.5.5 + happy-dom: 15.0.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + warning@4.0.3: + dependencies: + loose-envify: 1.4.0 + + watchpack@2.4.2: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + webgl-constants@1.1.1: {} + + webidl-conversions@3.0.1: {} + + webidl-conversions@7.0.0: {} + + webpack-sources@3.2.3: {} + + webpack@5.94.0: + dependencies: + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.23.3 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.94.0) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webworker-promise@0.5.0: {} + + whatwg-fetch@2.0.4: {} + + whatwg-mimetype@3.0.0: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-module@2.0.1: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + worker-loader@3.0.8(webpack@5.94.0): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.94.0 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + wslink@2.2.1: + dependencies: + '@msgpack/msgpack': 2.8.0 + + xmlbuilder2@3.0.2: + dependencies: + '@oozcitak/dom': 1.15.10 + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + '@types/node': 22.5.5 + js-yaml: 3.14.0 + + xss@1.0.14: + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + + y18n@4.0.3: {} + + yallist@3.1.1: {} + + yaml@1.10.2: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 diff --git a/src/store/resources/saga.ts b/src/store/resources/saga.ts index 5ca5fc43f..f19b58977 100644 --- a/src/store/resources/saga.ts +++ b/src/store/resources/saga.ts @@ -1,9 +1,5 @@ -import type { - PluginInstance, - FileBrowserFolderFile, - FileBrowserFolderLinkFile, -} from "@fnndsc/chrisapi"; -import { all, delay, fork, put, takeEvery } from "@redux-saga/core/effects"; +import type { PluginInstance } from "@fnndsc/chrisapi"; +import { all, delay, fork, put, takeEvery } from "redux-saga/effects"; import { inflate, inflateRaw } from "pako"; import type { Task } from "redux-saga"; import ChrisAPIClient from "../../api/chrisapiclient"; diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 748f4d160..ad50fe05b 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -1,8 +1,5 @@ -declare module "keymirror"; declare module "pako"; declare module "@patternfly/react-log-viewer"; -declare module "cornerstone-core"; -declare module "cornerstone-tools"; declare module "xtk"; declare module "dicom-parser"; declare module "rusha"; From 1a4ef7c47beb739a0f65a6f5464fe1d8e5c7e66d Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 17 Sep 2024 15:11:36 -0400 Subject: [PATCH 198/337] feat: Update .gitignore and remove .npmrc --- .gitignore | 2 ++ .npmrc | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 .npmrc diff --git a/.gitignore b/.gitignore index ee831571d..471062221 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,5 @@ yarn-error.log* .cache/ .yarnrc dist/ +pnpm-lock.yaml +.pnpm-store/ \ No newline at end of file diff --git a/.npmrc b/.npmrc deleted file mode 100644 index e9ee3cb4d..000000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -legacy-peer-deps=true \ No newline at end of file From 6b01e808fac7e186e94c33217b937d88785d5bbc Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 17 Sep 2024 15:15:26 -0400 Subject: [PATCH 199/337] feat: upgrade npm dependencies --- package.json | 4 ++-- pnpm-lock.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 1e51ec89b..316b57072 100644 --- a/package.json +++ b/package.json @@ -47,9 +47,9 @@ "@niivue/niivue": "0.44.2", "@patternfly/react-catalog-view-extension": "^5.0.0", "@patternfly/react-charts": "^7.3.0", - "@patternfly/react-core": "^5.3.4", + "@patternfly/react-core": "^5.4.0", "@patternfly/react-icons": "^5.4.0", - "@patternfly/react-log-viewer": "^5.2.0", + "@patternfly/react-log-viewer": "^5.3.0", "@patternfly/react-styles": "^5.4.0", "@patternfly/react-table": "^5.3.4", "@react-hook/resize-observer": "^2.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b71909eb7..00b20ad4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,13 +36,13 @@ importers: specifier: ^7.3.0 version: 7.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@patternfly/react-core': - specifier: ^5.3.4 + specifier: ^5.4.0 version: 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@patternfly/react-icons': specifier: ^5.4.0 version: 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@patternfly/react-log-viewer': - specifier: ^5.2.0 + specifier: ^5.3.0 version: 5.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@patternfly/react-styles': specifier: ^5.4.0 From 06f1e13f62e8f57c5a50adfa250891eec3700abe Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 17 Sep 2024 15:48:33 -0400 Subject: [PATCH 200/337] update test.yml --- .github/workflows/test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a82d0f5fe..be17743e4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,7 +46,6 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20.17 - cache: 'pnpm' - name: Install pnpm run: npm install -g pnpm From faf6c26deb821b086cbd2ffd68940ee0632e3f9e Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 17 Sep 2024 15:52:35 -0400 Subject: [PATCH 201/337] feat: Update test.yml to work with pnpm --- .github/workflows/test.yml | 71 +++++++++++++++----------------------- 1 file changed, 27 insertions(+), 44 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index be17743e4..82e318603 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,49 +10,35 @@ jobs: name: Tests (unit tests) runs-on: ubuntu-22.04 steps: - - name: Checkout - uses: actions/checkout@v4 + - uses: actions/checkout@v4 with: fetch-depth: "0" # necessary for `npm run print-version` - - name: Install Node.js - uses: actions/setup-node@v4 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v4 with: node-version: 20.17 cache: 'pnpm' - - - name: Install pnpm - run: npm install -g pnpm - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Unit tests - run: pnpm test - - # note to self: the sections test-public and test-local should be almost the same, except: - # - local testing needs git submodules - # - `npm run test:e2e` v.s. `npm run test:e2e:local` - # - some names should be different + - run: pnpm install --frozen-lockfile + - run: pnpm test test-public: name: Tests (public testing server) runs-on: ubuntu-22.04 steps: - - name: Checkout - uses: actions/checkout@v4 + - uses: actions/checkout@v4 with: fetch-depth: "0" # necessary for `npm run print-version` - - name: Install Node.js - uses: actions/setup-node@v4 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v4 with: node-version: 20.17 - - - name: Install pnpm - run: npm install -g pnpm - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Install Playwright Browsers - run: npx playwright install --with-deps + cache: 'pnpm' + - run: pnpm install --frozen-lockfile + - run: npx playwright install --with-deps - name: End-to-End tests env: TEST_SAFARI: yes @@ -60,7 +46,7 @@ jobs: - uses: actions/upload-artifact@v4 if: always() with: - name: playwright-report + name: playwright-report-public path: playwright-report-public/ retention-days: 30 - name: Report coverage @@ -75,28 +61,25 @@ jobs: files: coverage/lcov.info flags: e2etests-public fail_ci_if_error: true + test-local: name: Tests (local testing server) runs-on: ubuntu-22.04 steps: - - name: Checkout - uses: actions/checkout@v4 + - uses: actions/checkout@v4 with: fetch-depth: "0" # necessary for `npm run print-version` submodules: "recursive" # necessary for miniChRIS and example-dicoms - - name: Install Node.js - uses: actions/setup-node@v4 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v4 with: node-version: 20.17 cache: 'pnpm' - - name: Install pnpm - run: npm install -g pnpm - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Install Playwright Browsers - run: npx playwright install --with-deps - - name: Setup tests - run: pnpm run test:prepare + - run: pnpm install --frozen-lockfile + - run: npx playwright install --with-deps + - run: pnpm run test:prepare - name: End-to-End tests env: TEST_SAFARI: yes @@ -104,7 +87,7 @@ jobs: - uses: actions/upload-artifact@v4 if: always() with: - name: playwright-report + name: playwright-report-local path: playwright-report-local/ retention-days: 30 - name: Report coverage @@ -118,4 +101,4 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} files: coverage/lcov.info flags: e2etests-local - fail_ci_if_error: true + fail_ci_if_error: true \ No newline at end of file From 5bf9da33f3e9bc641300987c4e940c085fef757c Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 17 Sep 2024 15:54:59 -0400 Subject: [PATCH 202/337] feat: minor cleanup --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 82e318603..324c868ed 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: with: node-version: 20.17 cache: 'pnpm' - - run: pnpm install --frozen-lockfile + - run: pnpm install - run: pnpm test test-public: @@ -37,7 +37,7 @@ jobs: with: node-version: 20.17 cache: 'pnpm' - - run: pnpm install --frozen-lockfile + - run: pnpm install - run: npx playwright install --with-deps - name: End-to-End tests env: @@ -77,7 +77,7 @@ jobs: with: node-version: 20.17 cache: 'pnpm' - - run: pnpm install --frozen-lockfile + - run: pnpm install - run: npx playwright install --with-deps - run: pnpm run test:prepare - name: End-to-End tests From f3848d3d7ff4586c18c17ff984b553b84d11fade Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 17 Sep 2024 16:09:46 -0400 Subject: [PATCH 203/337] feat: Cleanup outdated tests --- .github/workflows/test.yml | 4 +- tests/createAccount.spec.ts | 22 --------- tests/createFeed.spec.ts | 16 ------- tests/feedops.spec.ts | 30 ------------- tests/helpers/createFeedHelper.ts | 31 ------------- tests/library.spec.ts | 75 ------------------------------- 6 files changed, 2 insertions(+), 176 deletions(-) delete mode 100644 tests/createAccount.spec.ts delete mode 100644 tests/createFeed.spec.ts delete mode 100644 tests/feedops.spec.ts delete mode 100644 tests/helpers/createFeedHelper.ts delete mode 100644 tests/library.spec.ts diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 324c868ed..1017fd851 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,7 +46,7 @@ jobs: - uses: actions/upload-artifact@v4 if: always() with: - name: playwright-report-public + name: playwright-report path: playwright-report-public/ retention-days: 30 - name: Report coverage @@ -87,7 +87,7 @@ jobs: - uses: actions/upload-artifact@v4 if: always() with: - name: playwright-report-local + name: playwright-report path: playwright-report-local/ retention-days: 30 - name: Report coverage diff --git a/tests/createAccount.spec.ts b/tests/createAccount.spec.ts deleted file mode 100644 index 7c6da80ab..000000000 --- a/tests/createAccount.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { test, expect } from "./fixtures/notLoggedIn.ts"; -import createAccountHelper from "./helpers/createAccount.ts"; -import { faker } from "@faker-js/faker"; - -test("Can create new user accounts", async ({ page, baseURL }) => { - test.slow(); - - const username = faker.internet.userName(); - const email = faker.internet.email(); - const password = "testuser1234"; - await createAccountHelper("/", page, username, email, password); - - // account options menu should appear after being logged in - await page.getByRole("button", { name: username }).click(); - // account options menu should have a "Sign out" button - await page.getByRole("menuitem", { name: "Sign out" }).click(); - await expect( - page.getByRole("button", { name: "Login" }), - "login button should reappear after signing out", - ).toBeInViewport(); - // TODO make sure user's private data is no longer there -}); diff --git a/tests/createFeed.spec.ts b/tests/createFeed.spec.ts deleted file mode 100644 index 61148ed42..000000000 --- a/tests/createFeed.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { test, expect } from "./fixtures/loggedIn.ts"; -import { faker } from "@faker-js/faker"; -import createFeed from "./helpers/createFeedHelper.ts"; -import getProjectFile from "./helpers/projectFile.ts"; - -const SOME_FILE = getProjectFile("package-lock.json"); - -test("Can create a feed", async ({ page }) => { - test.slow(); - await page.goto("feeds?type=private"); - const animal = faker.animal.type(); - const feedName = `A study on ${animal}`; - await createFeed(page, feedName, SOME_FILE); - await expect(page.getByText("Feed Created Successfully")).toBeVisible(); - await expect(page.locator("tbody")).toContainText(feedName); -}); diff --git a/tests/feedops.spec.ts b/tests/feedops.spec.ts deleted file mode 100644 index 3aa4e517a..000000000 --- a/tests/feedops.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { test, expect } from "./fixtures/loggedIn.ts"; -import { faker } from "@faker-js/faker"; -import createFeed from "./helpers/createFeedHelper"; -import getProjectFile from "./helpers/projectFile.ts"; - -const SOME_FILE = getProjectFile("package-lock.json"); - -test("Can perform feed operations", async ({ page, isMobile }) => { - test.slow(); - await page.goto("feeds?type=private"); - const animal = faker.animal.type(); - const feedName = `A study on ${animal}`; - await createFeed(page, feedName, SOME_FILE); - // Add a timeout of 5000 milliseconds to wait for the "Feed Created Successfully" message - await page.waitForSelector(':text("Feed Created Successfully")'); - await page.getByRole("button").first().click(); - // Add a timeout of 5000 milliseconds to wait for the "tbody" to contain text - await expect(page.locator("tbody")).toContainText(feedName); - const labelName = `${feedName}-checkbox`; - if (isMobile) { - await page.getByLabel("Global Navigation").click(); - } - const firstCheckbox = page.locator(`[aria-label="${labelName}"]`).first(); - await firstCheckbox.check(); - - await page.getByLabel("feed-action").nth(4).click(); - await page.getByRole("button", { name: "Confirm" }).click({ timeout: 5000 }); - await page.locator('[aria-label="Loading Feed Table"]'); - await page.locator('[aria-label="Feed Table"]'); -}); diff --git a/tests/helpers/createFeedHelper.ts b/tests/helpers/createFeedHelper.ts deleted file mode 100644 index d9f4c2287..000000000 --- a/tests/helpers/createFeedHelper.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Page } from "playwright"; -import { expect } from "../fixtures/loggedIn"; -import { faker } from "@faker-js/faker"; - -async function createFeed(page: Page, feedName: string, SOME_FILE: string) { - await page.goto("feeds?type=private"); - const animal = faker.animal.type(); - const feedNote = `The ${animal} is a very noteworthy animal.`; - - await page.getByRole("button", { name: "Create Feed" }).click(); - await page.getByPlaceholder("e.g. Tractography Study").click(); - await page.getByPlaceholder("e.g. Tractography Study").fill(feedName); - await page.getByPlaceholder("Use this field to describe").click(); - await page.getByPlaceholder("Use this field to describe").fill(feedNote); - await page.getByRole("button", { name: "Next" }).click(); - - // Check if the next button is disabled. - const nextButton = page.getByRole("button", { name: "Next" }); - await expect(nextButton).toBeDisabled(); - await page.getByText("Upload New Data").click(); - const fileChooserPromise = page.waitForEvent("filechooser"); - await page.getByText("Drag 'n' drop some files here").click(); - const fileChooser = await fileChooserPromise; - - await fileChooser.setFiles(SOME_FILE); - await nextButton.click(); - await page.getByRole("button", { name: "Next", exact: true }).click(); - await page.getByRole("button", { name: "Create Analysis" }).click(); -} - -export default createFeed; diff --git a/tests/library.spec.ts b/tests/library.spec.ts deleted file mode 100644 index b45369b62..000000000 --- a/tests/library.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { test, expect } from "./fixtures/loggedIn.ts"; -import getProjectFile from "./helpers/projectFile.ts"; - -test("Tests File Uploads", async ({ page }) => { - //Avoids timeouts. - test.slow(); - await page.goto("library"); - - const modalSelector = "[role='dialog']"; - - // Click on the button to trigger the modal - await page.getByRole("button", { name: /upload/i }).click(); - - // Wait for the modal to appear - await page.waitForSelector(modalSelector); - - // Get a handle to the modal element - const modalElementHandle = await page.$(modalSelector); - - // Now you can interact with the modal as needed - // Example: assert that modal content is visible - - if (modalElementHandle) { - const isModalVisible = await modalElementHandle.isVisible(); - expect(isModalVisible).toBeTruthy(); - - const fileChooserPromise = page.waitForEvent("filechooser"); - await page.getByRole("button", { name: /upload files/i }).click(); - const fileChooser = await fileChooserPromise; - - const SOME_FILE = getProjectFile("package-lock.json"); - await fileChooser.setFiles(SOME_FILE); - - await page.waitForSelector("input[name='horizontal-form-name']"); - - // Extract the file name from the file-name div - const fileName = await page.$eval( - ".file-name-text", - (element: HTMLDivElement) => element.innerText, - ); - - // Check if the file name is 'package-lock.json' - expect(fileName).toBe("package-lock.json"); - - // Correct the selector for the "Push to File Storage" button - await page - .getByRole("button", { - name: /push to file storage/i, - }) - .click(); - - const username = await page.$eval( - ".pf-v5-c-menu-toggle__text", - (element) => element.textContent, - ); - - const directoryNameValue = await page.$eval( - "input[name='horizontal-form-name']", - (element: HTMLInputElement) => element.value, - ); - const expectedURL = `/library/${username}/uploads/${directoryNameValue}`; - - // Start waiting for the progress measure to be 100% - await page.waitForFunction(() => { - const progressMeasure = document.querySelector( - ".pf-v5-c-progress__measure", - ); - return progressMeasure && progressMeasure.textContent === "100%"; - }); - - // Click the close button to close the modal - await page.click("[aria-label='Close']"); - expect(page.url()).toContain(expectedURL); - } -}); From 86e791c181f1cf82922d0e7ab6a0dc97c9d0d7c8 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Mon, 16 Sep 2024 19:28:04 -0400 Subject: [PATCH 204/337] Begin rewriting Pacs --- .env | 3 + package-lock.json | 566 ++++++++++------ package.json | 5 +- src/App.tsx | 8 +- src/api/fp/chrisapi.ts | 29 +- src/api/fp/helpers.test.ts | 4 +- .../NiivueDatasetViewer.tsx | 2 +- .../components/SettingsTab.tsx | 2 +- .../NiivueDatasetViewer/content/footer.tsx | 2 +- src/components/Pacs/app.test.tsx | 86 +++ src/components/Pacs/app.tsx | 156 +++++ .../Pacs/components/ErrorScreen.tsx | 33 + .../Pacs/components/PatientCard.tsx | 153 ----- src/components/Pacs/components/SeriesCard.tsx | 629 ------------------ .../Pacs/components/SettingsComponents.tsx | 215 ------ src/components/Pacs/components/StudyCard.tsx | 366 ---------- src/components/Pacs/components/input.test.ts | 12 + src/components/Pacs/components/input.tsx | 192 ++++++ src/components/Pacs/components/loading.tsx | 22 + .../Pacs/components/usePullStudyHook.tsx | 124 ---- src/components/Pacs/components/utils.ts | 36 - src/components/Pacs/index.tsx | 580 +--------------- src/components/Pacs/pacs-copy.css | 123 ---- src/components/Pacs/pacs.tsx | 48 ++ src/components/Pacs/pfdcmClient.tsx | 100 --- src/components/Pacs/useSettings.tsx | 79 --- src/components/Wrapper/TitleComponent.tsx | 17 +- .../NiivueDatasetViewer => }/cssUtils.ts | 0 vitest.config.ts | 11 + vitest.setup.ts | 10 + 30 files changed, 1025 insertions(+), 2588 deletions(-) create mode 100644 src/components/Pacs/app.test.tsx create mode 100644 src/components/Pacs/app.tsx create mode 100644 src/components/Pacs/components/ErrorScreen.tsx delete mode 100644 src/components/Pacs/components/PatientCard.tsx delete mode 100644 src/components/Pacs/components/SeriesCard.tsx delete mode 100644 src/components/Pacs/components/SettingsComponents.tsx delete mode 100644 src/components/Pacs/components/StudyCard.tsx create mode 100644 src/components/Pacs/components/input.test.ts create mode 100644 src/components/Pacs/components/input.tsx create mode 100644 src/components/Pacs/components/loading.tsx delete mode 100644 src/components/Pacs/components/usePullStudyHook.tsx delete mode 100644 src/components/Pacs/components/utils.ts delete mode 100644 src/components/Pacs/pacs-copy.css create mode 100644 src/components/Pacs/pacs.tsx delete mode 100644 src/components/Pacs/pfdcmClient.tsx delete mode 100644 src/components/Pacs/useSettings.tsx rename src/{components/NiivueDatasetViewer => }/cssUtils.ts (100%) create mode 100644 vitest.setup.ts diff --git a/.env b/.env index 684c225fb..8d1ac18f1 100644 --- a/.env +++ b/.env @@ -18,5 +18,8 @@ VITE_PFDCM_CUBEKEY="local" VITE_PFDCM_SWIFTKEY="local" VITE_SOURCEMAP='false' +# URI for support requests +VITE_SUPPORT_URL='mailto:dev@babyMRI.org' + # Set URL for the store if you want to see it in the sidebar VITE_CHRIS_STORE_URL= "http://rc-live.tch.harvard.edu:32222/api/v1/" diff --git a/package-lock.json b/package-lock.json index 5db811a7b..725c15f65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -75,6 +75,9 @@ "@biomejs/biome": "1.8.3", "@faker-js/faker": "^8.4.0", "@playwright/test": "^1.41.2", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", "@types/d3-hierarchy": "^1.1.7", "@types/d3-selection": "^1.4.3", "@types/lodash": "^4.14.202", @@ -94,10 +97,17 @@ "rollup-plugin-node-builtins": "^2.1.2", "vite": "^5.3.2", "vite-plugin-istanbul": "^6.0.2", - "vitest": "^2.0.5", + "vitest": "^2.1.1", "vitest-websocket-mock": "^0.4.0" } }, + "node_modules/@adobe/css-tools": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -1801,12 +1811,198 @@ "react": "^18 || ^19" } }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", + "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", + "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@tweenjs/tween.js": { "version": "23.1.3", "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", "license": "MIT" }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2212,14 +2408,14 @@ } }, "node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.1.tgz", + "integrity": "sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", + "@vitest/spy": "2.1.1", + "@vitest/utils": "2.1.1", "chai": "^5.1.1", "tinyrainbow": "^1.2.0" }, @@ -2227,10 +2423,38 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/mocker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.1.tgz", + "integrity": "sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "^2.1.0-beta.1", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.11" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/spy": "2.1.1", + "msw": "^2.3.5", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, "node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz", + "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2241,13 +2465,13 @@ } }, "node_modules/@vitest/runner": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", - "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.1.tgz", + "integrity": "sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.0.5", + "@vitest/utils": "2.1.1", "pathe": "^1.1.2" }, "funding": { @@ -2255,14 +2479,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", - "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.1.tgz", + "integrity": "sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.0.5", - "magic-string": "^0.30.10", + "@vitest/pretty-format": "2.1.1", + "magic-string": "^0.30.11", "pathe": "^1.1.2" }, "funding": { @@ -2270,9 +2494,9 @@ } }, "node_modules/@vitest/spy": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.1.tgz", + "integrity": "sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==", "dev": true, "license": "MIT", "dependencies": { @@ -2283,14 +2507,13 @@ } }, "node_modules/@vitest/utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz", + "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", + "@vitest/pretty-format": "2.1.1", "loupe": "^3.1.1", "tinyrainbow": "^1.2.0" }, @@ -2534,6 +2757,16 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/array-equal": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", @@ -3342,6 +3575,13 @@ "node": "*" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, "node_modules/cssfilter": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", @@ -3858,6 +4098,13 @@ "dev": true, "license": "MIT" }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -4173,56 +4420,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4605,19 +4802,6 @@ "node": ">=4" } }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gl-matrix": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", @@ -4859,16 +5043,6 @@ "entities": "^4.4.0" } }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, "node_modules/idb-wrapper": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", @@ -5748,6 +5922,16 @@ "dev": true, "license": "MIT" }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/magic-string": { "version": "0.30.11", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", @@ -5816,13 +6000,6 @@ "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "license": "MIT" }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, "node_modules/micromark": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", @@ -6406,17 +6583,14 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/minimalistic-assert": { @@ -6581,35 +6755,6 @@ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "license": "MIT" }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/nyc": { "version": "17.0.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.0.0.tgz", @@ -6727,22 +6872,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -7093,6 +7222,41 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, "node_modules/preval.macro": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/preval.macro/-/preval.macro-5.0.0.tgz", @@ -8260,6 +8424,20 @@ "node": ">= 0.10" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", @@ -8957,17 +9135,17 @@ "node": ">=8" } }, - "node_modules/strip-final-newline": { + "node_modules/strip-indent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "min-indent": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, "node_modules/stylis": { @@ -9058,6 +9236,13 @@ "node": ">=4" } }, + "node_modules/tinyexec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", + "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", + "dev": true, + "license": "MIT" + }, "node_modules/tinypool": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", @@ -9079,9 +9264,9 @@ } }, "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, "license": "MIT", "engines": { @@ -9752,16 +9937,15 @@ } }, "node_modules/vite-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", - "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz", + "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.5", + "debug": "^4.3.6", "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", "vite": "^5.0.0" }, "bin": { @@ -9822,30 +10006,30 @@ } }, "node_modules/vitest": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", - "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz", + "integrity": "sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.5", - "@vitest/pretty-format": "^2.0.5", - "@vitest/runner": "2.0.5", - "@vitest/snapshot": "2.0.5", - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", + "@vitest/expect": "2.1.1", + "@vitest/mocker": "2.1.1", + "@vitest/pretty-format": "^2.1.1", + "@vitest/runner": "2.1.1", + "@vitest/snapshot": "2.1.1", + "@vitest/spy": "2.1.1", + "@vitest/utils": "2.1.1", "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", + "debug": "^4.3.6", + "magic-string": "^0.30.11", "pathe": "^1.1.2", "std-env": "^3.7.0", - "tinybench": "^2.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.0", "tinypool": "^1.0.0", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.0.5", + "vite-node": "2.1.1", "why-is-node-running": "^2.3.0" }, "bin": { @@ -9860,8 +10044,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.5", - "@vitest/ui": "2.0.5", + "@vitest/browser": "2.1.1", + "@vitest/ui": "2.1.1", "happy-dom": "*", "jsdom": "*" }, diff --git a/package.json b/package.json index 87c6be441..fa6df4e19 100644 --- a/package.json +++ b/package.json @@ -105,6 +105,9 @@ "@biomejs/biome": "1.8.3", "@faker-js/faker": "^8.4.0", "@playwright/test": "^1.41.2", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", "@types/d3-hierarchy": "^1.1.7", "@types/d3-selection": "^1.4.3", "@types/lodash": "^4.14.202", @@ -124,7 +127,7 @@ "rollup-plugin-node-builtins": "^2.1.2", "vite": "^5.3.2", "vite-plugin-istanbul": "^6.0.2", - "vitest": "^2.0.5", + "vitest": "^2.1.1", "vitest-websocket-mock": "^0.4.0" }, "type": "module" diff --git a/src/App.tsx b/src/App.tsx index 0f98b3133..64dfe0630 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,6 @@ import "@patternfly/react-core/dist/styles/base.css"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { ConfigProvider, theme } from "antd"; +import { ConfigProvider, App as AntdApp, theme } from "antd"; import { useContext } from "react"; import { CookiesProvider } from "react-cookie"; import { Provider } from "react-redux"; @@ -58,8 +58,10 @@ function App(props: AllProps) { : theme.defaultAlgorithm, }} > - <Cart /> - <Routes /> + <AntdApp> + <Cart /> + <Routes /> + </AntdApp> </ConfigProvider> </QueryClientProvider> </BrowserRouter> diff --git a/src/api/fp/chrisapi.ts b/src/api/fp/chrisapi.ts index 21c7fc1df..b860d1651 100644 --- a/src/api/fp/chrisapi.ts +++ b/src/api/fp/chrisapi.ts @@ -124,7 +124,7 @@ class FpClient { } /** - * Create a WebSockets connection to the LONK-WS endpoint. + * Connect a WebSocket to the LONK-WS endpoint. * * https://chrisproject.org/docs/oxidicom/lonk-ws */ @@ -136,10 +136,31 @@ class FpClient { }: LonkHandlers & { timeout?: number }): TE.TaskEither<Error, LonkClient> { return pipe( this.createDownloadToken(timeout), - TE.map((downloadToken) => { + TE.flatMap((downloadToken) => { const url = getWebsocketUrl(downloadToken); + let callback: ((c: E.Either<Error, LonkClient>) => void) | null = null; + let promise: Promise<E.Either<Error, LonkClient>> = new Promise( + (resolve) => (callback = resolve), + ); const ws = new WebSocket(url); - return new LonkClient({ ws, onDone, onProgress, onError }); + ws.onopen = () => + callback && + callback( + E.right(new LonkClient({ ws, onDone, onProgress, onError })), + ); + ws.onerror = (_ev) => + callback && + callback( + E.left( + new Error( + `There was an error connecting to the WebSocket at ${url}`, + ), + ), + ); + ws.onclose = () => + callback && + callback(E.left(new Error(`CUBE unexpectedly closed the WebSocket`))); + return () => promise; }), ); } @@ -149,7 +170,7 @@ function getWebsocketUrl(downloadTokenResponse: DownloadToken): string { const token = downloadTokenResponse.data.token; return downloadTokenResponse.url .replace(/^http(s?):\/\//, (_match, s) => `ws${s}://`) - .replace(/v1\/downloadtokens\/\d+\//, `v1/pacs/progress/?token=${token}`); + .replace(/v1\/downloadtokens\/\d+\//, `v1/pacs/ws/?token=${token}`); } function notNull<T>(x: T | null): T { diff --git a/src/api/fp/helpers.test.ts b/src/api/fp/helpers.test.ts index c3f662c0a..cc7181e96 100644 --- a/src/api/fp/helpers.test.ts +++ b/src/api/fp/helpers.test.ts @@ -16,7 +16,7 @@ test.each([ owner_username: "chris", }, }, - "ws://example.com/api/v1/pacs/progress/?token=nota.real.jwttoken", + "ws://example.com/api/v1/pacs/ws/?token=nota.real.jwttoken", ], [ { @@ -32,7 +32,7 @@ test.each([ owner_username: "chris", }, }, - "wss://example.com/api/v1/pacs/progress/?token=stillnota.real.jwttoken", + "wss://example.com/api/v1/pacs/ws/?token=stillnota.real.jwttoken", ], ])("getWebsocketUrl(%o, %s) -> %s", (downloadTokenResponse, expected) => { // @ts-ignore diff --git a/src/components/NiivueDatasetViewer/NiivueDatasetViewer.tsx b/src/components/NiivueDatasetViewer/NiivueDatasetViewer.tsx index 9fba2fbb2..483b65fc2 100644 --- a/src/components/NiivueDatasetViewer/NiivueDatasetViewer.tsx +++ b/src/components/NiivueDatasetViewer/NiivueDatasetViewer.tsx @@ -17,7 +17,7 @@ import { getDataset, getPreClient, } from "./client"; -import { flexRowSpaceBetween, hideOnMobile } from "./cssUtils"; +import { flexRowSpaceBetween, hideOnMobile } from "../../cssUtils.ts"; import { FpClient } from "../../api/fp/chrisapi"; import { pipe } from "fp-ts/function"; import * as TE from "fp-ts/TaskEither"; diff --git a/src/components/NiivueDatasetViewer/components/SettingsTab.tsx b/src/components/NiivueDatasetViewer/components/SettingsTab.tsx index eea783d71..65c529909 100644 --- a/src/components/NiivueDatasetViewer/components/SettingsTab.tsx +++ b/src/components/NiivueDatasetViewer/components/SettingsTab.tsx @@ -11,7 +11,7 @@ import { Switch, } from "@patternfly/react-core"; import RadiologcalConventionToggle from "./RadiologcalConventionToggle"; -import { hideOnDesktop } from "../cssUtils"; +import { hideOnDesktop } from "../../../cssUtils"; import Spacing from "@patternfly/react-styles/css/utilities/Spacing/spacing"; import { css } from "@patternfly/react-styles"; import SliceTypeButton from "./SliceTypeButton"; diff --git a/src/components/NiivueDatasetViewer/content/footer.tsx b/src/components/NiivueDatasetViewer/content/footer.tsx index 3cfa11d5d..355fc295d 100644 --- a/src/components/NiivueDatasetViewer/content/footer.tsx +++ b/src/components/NiivueDatasetViewer/content/footer.tsx @@ -1,4 +1,4 @@ -import { hideOnDesktop, hideOnMobileInline } from "../cssUtils.ts"; +import { hideOnDesktop, hideOnMobileInline } from "../../../cssUtils.ts"; import { Chip, Popover, TextContent } from "@patternfly/react-core"; import BUILD_VERSION from "../../../getBuildVersion.ts"; import { css } from "@patternfly/react-styles"; diff --git a/src/components/Pacs/app.test.tsx b/src/components/Pacs/app.test.tsx new file mode 100644 index 000000000..7ace09342 --- /dev/null +++ b/src/components/Pacs/app.test.tsx @@ -0,0 +1,86 @@ +import { cleanup, render, screen } from "@testing-library/react"; +import { expect, test, vi } from "vitest"; +import PacsQRApp from "./app.tsx"; +import * as TE from "fp-ts/TaskEither"; +import { Configuration as PfdcmConfig, PfdcmClient } from "../../api/pfdcm"; +import ChrisClient, { DownloadToken } from "@fnndsc/chrisapi"; +import WS from "vitest-websocket-mock"; + +test("PACS Q/R page can bootstrap", async () => { + const pfdcmClient = createPfdcmMock(TE.right(["BCH", "MGH", "BWH"])); + const [chrisClient, ws] = createWorkingMockPacsWs(32584); + + const getClientMocks = { + getChrisClient: vi.fn(() => chrisClient), + getPfdcmClient: vi.fn(() => pfdcmClient), + }; + render(<PacsQRApp {...getClientMocks} />); + + await ws.connected; + + await expect + .poll(() => screen.getByPlaceholderText("Search for DICOM studies by MRN")) + .toBeInTheDocument(); + + // First PACS service (besides 'default') should be automatically selected. + expect(screen.getByTitle("PACS service")).toHaveTextContent("BCH"); + + // component should close WebSocket connection when unmounted + cleanup(); + await ws.closed; +}); + +test("Shows error screen if PFDCM is offline", async () => { + const pfdcmClient = createPfdcmMock( + TE.left(new Error("I am an expected error")), + ); + const [chrisClient, _ws] = createWorkingMockPacsWs(32583); + + const getClientMocks = { + getChrisClient: vi.fn(() => chrisClient), + getPfdcmClient: vi.fn(() => pfdcmClient), + }; + render(<PacsQRApp {...getClientMocks} />); + + await expect + .poll(() => screen.getByText("I am an expected error")) + .toBeInTheDocument(); + expect( + screen.getByText(/PACS Q\/R application is currently unavailable/), + ).toBeInTheDocument(); +}); + +function createWorkingMockPacsWs( + port: number, + id: number = 55, +): [ChrisClient, WS] { + const fakeChrisHost = `localhost:${port}`; + const fakeChrisUrl = `http://${fakeChrisHost}/api/v1/`; + const fakeChrisAuth = { token: "12345" }; + vi.spyOn(DownloadToken.prototype, "data", "get").mockReturnValue({ + token: "abcdefgnotarealjwt", + }); + const fakeDownloadToken = new DownloadToken( + `${fakeChrisUrl}downloadtokens/${id}/`, + fakeChrisAuth, + ); + + const client = new ChrisClient(fakeChrisUrl, fakeChrisAuth); + client.createDownloadToken = vi.fn(async () => fakeDownloadToken); + + const ws = new WS( + `ws://${fakeChrisHost}/api/v1/pacs/ws/?token=abcdefgnotarealjwt`, + { jsonProtocol: true }, + ); + + return [client, ws]; +} + +function createPfdcmMock( + servicesReturn: ReturnType<PfdcmClient["getPacsServices"]>, +) { + const pfdcmConfig = new PfdcmConfig({ basePath: "https://example.com" }); + const pfdcmClient = new PfdcmClient(pfdcmConfig); + pfdcmClient.getPacsServices = vi.fn(() => servicesReturn); + return pfdcmClient; +} diff --git a/src/components/Pacs/app.tsx b/src/components/Pacs/app.tsx new file mode 100644 index 000000000..bb6fceeaa --- /dev/null +++ b/src/components/Pacs/app.tsx @@ -0,0 +1,156 @@ +/** + * The primary PACS Q/R UI code is found in ./pacs.tsx. This file defines a + * component which wraps the default export from ./pacs.tsx, bootstrapping + * the client objects it needs e.g. + * + * 1. Making an initial connection to PFDCM + * 2. Connecting to the PACS receive progress WebSocket, `api/v1/pacs/ws/` + * + * During bootstrapping, a loading screen is shown. + * If bootstrapping fails, an error screen is shown. + */ + +import React from "react"; +import { PfdcmClient } from "../../api/pfdcm"; +import Client from "@fnndsc/chrisapi"; +import LonkClient from "../../api/lonk"; +import { App, Typography } from "antd"; +import FpClient from "../../api/fp/chrisapi.ts"; +import * as TE from "fp-ts/TaskEither"; +import { pipe } from "fp-ts/function"; +import { PageSection } from "@patternfly/react-core"; +import PacsQR from "./pacs.tsx"; +import PacsLoadingScreen from "./components/loading.tsx"; +import ErrorScreen from "./components/ErrorScreen.tsx"; + +/** + * A title and paragraph. + */ +const ErrorNotificationBody: React.FC< + React.PropsWithChildren<{ title: string }> +> = ({ title, children }) => ( + <Typography> + <Typography.Title>{title}</Typography.Title> + <Typography.Paragraph>{children}</Typography.Paragraph> + </Typography> +); + +/** + * ChRIS_ui PACS Query and Retrieve application. + */ +const PacsQRApp: React.FC<{ + getPfdcmClient: () => PfdcmClient; + getChrisClient: () => Client; +}> = ({ getChrisClient, getPfdcmClient }) => { + const [services, setServices] = React.useState<ReadonlyArray<string>>([]); + const [service, setService] = React.useState<string | null>(null); + const [lonkClient, setLonkClient] = React.useState<LonkClient | null>(null); + const [error, setError] = React.useState<string | null>(null); + + const { message, notification, modal } = App.useApp(); + + const pushError = React.useMemo(() => { + return (title: string) => { + return (e: Error) => { + notification.error({ + message: ( + <ErrorNotificationBody title={title}> + {e.message} + </ErrorNotificationBody> + ), + }); + }; + }; + }, [notification]); + + const pfdcmClient = React.useMemo(getPfdcmClient, [getPfdcmClient]); + const chrisClient = React.useMemo(getChrisClient, [getChrisClient]); + + const fpClient = React.useMemo(() => { + return new FpClient(chrisClient); + }, [chrisClient]); + + /** + * Show an error screen with the error's message. + * + * Used to handle errors during necessary bootstrapping. + */ + const failWithError = TE.mapLeft((e: Error) => setError(e.message)); + + React.useEffect(() => { + document.title = "ChRIS PACS"; + }, []); + + React.useEffect(() => { + const getServicesPipeline = pipe( + pfdcmClient.getPacsServices(), + failWithError, + TE.map((services) => { + setServices(services); + const defaultService = getDefaultPacsService(services); + defaultService && setService(defaultService); + }), + ); + getServicesPipeline(); + }, [pfdcmClient, pushError]); + + React.useEffect(() => { + let lonkClientRef: LonkClient | null = null; + + const onDone = () => {}; // TODO + const onProgress = () => {}; // TODO + const onError = () => {}; // TODO + const connectWsPipeline = pipe( + fpClient.connectPacsNotifications({ onDone, onProgress, onError }), + failWithError, + TE.map((client) => (lonkClientRef = client)), + TE.map(setLonkClient), + ); + connectWsPipeline(); + + return () => lonkClientRef?.close(); + }, [fpClient, pushError]); + + return ( + <PageSection> + {error !== null ? ( + <ErrorScreen>{error}</ErrorScreen> + ) : services && service && lonkClient ? ( + <PacsQR + lonkClient={lonkClient} + fpClient={fpClient} + services={services} + service={service} + setService={setService} + pushError={pushError} + /> + ) : ( + <PacsLoadingScreen /> + )} + </PageSection> + ); +}; + +/** + * Selects the default PACS service (which is usually not the PACS service literally called "default"). + * + * 1. Selects the hard-coded "PACSDCM" + * 2. Attempts to select the first value which is not "default" (a useless, legacy pfdcm behavior) + * 3. Selects the first value + */ +function getDefaultPacsService(services: ReadonlyArray<string>): string | null { + if (services.includes("PACSDCM")) { + return "PACSDCM"; + } + for (const service of services) { + if (service !== "default") { + return service; + } + } + if (services) { + return services[0]; + } + return null; +} + +export default PacsQRApp; diff --git a/src/components/Pacs/components/ErrorScreen.tsx b/src/components/Pacs/components/ErrorScreen.tsx new file mode 100644 index 000000000..c69d06171 --- /dev/null +++ b/src/components/Pacs/components/ErrorScreen.tsx @@ -0,0 +1,33 @@ +import React from "react"; +import { + EmptyState, + EmptyStateBody, + EmptyStateHeader, + EmptyStateIcon, + Text, + TextContent, + TextVariants, +} from "@patternfly/react-core"; +import { ExclamationCircleIcon } from "../../Icons"; + +const ErrorScreen: React.FC<React.PropsWithChildren<{}>> = ({ children }) => ( + <EmptyState> + <EmptyStateHeader + titleText="PACS Connection Error" + headingLevel="h4" + icon={<EmptyStateIcon icon={ExclamationCircleIcon} />} + /> + <EmptyStateBody> + <TextContent> + <Text component={TextVariants.pre}>{children}</Text> + <Text component={TextVariants.p}> + The <em>ChRIS</em> PACS Q/R application is currently unavailable. + Please contact your <em>ChRIS</em> admin by clicking{" "} + <a href={import.meta.env.VITE_SUPPORT_URL}>here</a>. + </Text> + </TextContent> + </EmptyStateBody> + </EmptyState> +); + +export default ErrorScreen; diff --git a/src/components/Pacs/components/PatientCard.tsx b/src/components/Pacs/components/PatientCard.tsx deleted file mode 100644 index 66e9b4855..000000000 --- a/src/components/Pacs/components/PatientCard.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import { - Card, - CardHeader, - Grid, - GridItem, - Skeleton, - Tooltip, -} from "@patternfly/react-core"; -import { notification } from "../../Antd"; -import { format, parse } from "date-fns"; -import { useContext, useEffect, useState } from "react"; -import { PacsQueryContext } from "../context"; -import useSettings from "../useSettings"; -import { CardHeaderComponent } from "./SettingsComponents"; -import StudyCard from "./StudyCard"; - -function getPatientDetails(patientDetails: any) { - return { - PatientName: patientDetails.PatientName.value, - PatientID: patientDetails.PatientID.value, - PatientBirthDate: patientDetails.PatientBirthDate.value, - PatientSex: patientDetails.PatientSex.value, - }; -} - -const PatientCard = ({ queryResult }: { queryResult: any }) => { - const [api, contextHolder] = notification.useNotification(); - const { data, isLoading, error, isError } = useSettings(); - const { state } = useContext(PacsQueryContext); - const patient = queryResult[0]; - const patientDetails = getPatientDetails(patient); - const [isPatientExpanded, setIsPatientExpanded] = useState( - state.shouldDefaultExpanded || false, - ); - const { PatientID, PatientName, PatientBirthDate, PatientSex } = - patientDetails; - - useEffect(() => { - if (isError) { - api.error({ - message: error.message, - description: "Failed to load user preferences", - }); - } - }, [isError]); - - const parsedDate = parse(PatientBirthDate, "yyyyMMdd", new Date()); - - const formattedDate = Number.isNaN( - parsedDate.getTime(), - ) /* Check if parsedDate is a valid date */ - ? PatientBirthDate - : format(parsedDate, "MMMM d, yyyy"); - - const LatestDate = (dateStrings: string[]) => { - let latestStudy = parse(dateStrings[0], "yyyyMMdd", new Date()); - - for (const dateString of dateStrings) { - const currentDate = parse(dateString, "yyyyMMdd", new Date()); - - if (currentDate > latestStudy) { - latestStudy = currentDate; - } - } - - return latestStudy; - }; - - const userPreferences = data?.patient; - const userPreferencesArray = userPreferences && Object.keys(userPreferences); - - return ( - <> - <Card - isFlat={true} - isFullHeight={true} - isCompact={true} - isRounded={true} - isExpanded={isPatientExpanded} - > - {contextHolder} - <CardHeader - actions={{ - actions: <CardHeaderComponent resource={patient} type="patient" />, - }} - onExpand={() => setIsPatientExpanded(!isPatientExpanded)} - > - <Grid hasGutter style={{ width: "100%" }}> - {isLoading ? ( - <GridItem lg={4} md={4} sm={12}> - <Skeleton - width="100%" - height="100%" - screenreaderText="Loading contents" - /> - </GridItem> - ) : !isError && - userPreferences && - userPreferencesArray && - userPreferencesArray.length > 0 ? ( - userPreferencesArray.map((key: string) => ( - <GridItem key={key} lg={4} md={4} sm={12}> - <div>{key}</div> - <Tooltip content={patient[key] ? patient[key].value : "N/A"}> - <div className="hide-content"> - {patient[key] ? patient[key].value : "N/A"} - </div> - </Tooltip> - </GridItem> - )) - ) : ( - <> - <GridItem lg={4} md={4} sm={12}> - <div> - Patient Name: {PatientName.split("^").reverse().join(" ")} - </div> - <div>Patient MRN: {PatientID}</div> - </GridItem> - <GridItem lg={4} md={4} sm={12}> - <div>Patient Sex: {PatientSex}</div> - <div>Patient Birth Date: {formattedDate}</div> - </GridItem> - - <GridItem lg={4} md={4} sm={12} className="last-item-align"> - <div> - {queryResult.length}{" "} - {queryResult.length === 1 ? "study" : "studies"} - </div> - <div> - Latest Study Date:{" "} - {LatestDate( - queryResult.map((s: any) => s.StudyDate.value), - ).toDateString()} - </div> - </GridItem> - </> - )} - </Grid> - </CardHeader> - </Card> - {isPatientExpanded && - queryResult.map((result: any) => { - return ( - <div className="patient-studies" key={result.uid.value}> - <StudyCard study={result} /> - </div> - ); - })} - </> - ); -}; - -export default PatientCard; diff --git a/src/components/Pacs/components/SeriesCard.tsx b/src/components/Pacs/components/SeriesCard.tsx deleted file mode 100644 index 7e5d72bab..000000000 --- a/src/components/Pacs/components/SeriesCard.tsx +++ /dev/null @@ -1,629 +0,0 @@ -import type { PACSFile } from "@fnndsc/chrisapi"; -import { - Badge, - Button, - Card, - CardBody, - CardHeader, - HelperText, - HelperTextItem, - Modal, - ModalVariant, - Progress, - ProgressMeasureLocation, - ProgressSize, - ProgressVariant, - Skeleton, - Tooltip, - pluralize, -} from "@patternfly/react-core"; -import { useMutation, useQuery } from "@tanstack/react-query"; -import { Alert } from "../../Antd"; -import axios from "axios"; -import PQueue from "p-queue"; -import { useContext, useEffect, useState } from "react"; -import { useNavigate } from "react-router"; -import ChrisAPIClient from "../../../api/chrisapiclient"; -import { MainRouterContext } from "../../../routes"; -import { DotsIndicator } from "../../Common"; -import { - CodeBranchIcon, - DownloadIcon, - LibraryIcon, - PreviewIcon, -} from "../../Icons"; -import FileDetailView from "../../Preview/FileDetailView"; -import { PacsQueryContext, Types } from "../context"; -import PFDCMClient, { type DataFetchQuery } from "../pfdcmClient"; -import useSettings from "../useSettings"; -import { CardHeaderComponent } from "./SettingsComponents"; - -async function getPacsFile(file: PACSFile["data"]) { - const { id } = file; - const client = ChrisAPIClient.getClient(); - try { - const pacs_file = await client.getPACSFile(id); - return pacs_file; - } catch (e) { - if (e instanceof Error) { - throw new Error(e.message); - } - } -} - -async function getTestData( - pacsIdentifier: string, - pullQuery: DataFetchQuery, - protocolName?: string, - offset?: number, -) { - const cubeClient = ChrisAPIClient.getClient(); - try { - let url = `${ - import.meta.env.VITE_CHRIS_UI_URL - }pacsfiles/search/?pacs_identifier=${pacsIdentifier}&StudyInstanceUID=${ - pullQuery.StudyInstanceUID - }&SeriesInstanceUID=${pullQuery.SeriesInstanceUID}`; - - if (protocolName) { - url += `&ProtocolName=${protocolName}`; - } - if (offset) { - url += `&offset=${offset}`; - } - - const response = await axios.get(url, { - headers: { - Authorization: `Token ${cubeClient.auth.token}`, - }, - }); - - return response.data; - } catch (error) { - if (axios.isAxiosError(error)) { - if (error.response) { - throw new Error( - `Error: ${error.response.status} - ${error.response.data}`, - ); - } - if (error.request) { - throw new Error("Error: No response received from server."); - } - // Something else happened while setting up the request - - throw new Error(`Error: ${error.message}`); - } - - throw new Error("An unexpected error occurred."); - } -} - -function getLatestPACSFile(pacsFiles: PACSFile["data"][]) { - return pacsFiles.reduce((latestFile, currentFile) => { - const latestDate = new Date(latestFile.creation_date); - const currentDate = new Date(currentFile.creation_date); - - return currentDate > latestDate ? currentFile : latestFile; - }); -} - -/** - * The browser places a limit on the number of concurrent connections to the same domain, which can result in requests being blocked if too many are fired simultaneously. - * To manage this, we implement a queue system to control the concurrency of your async requests. - */ - -const queue = new PQueue({ concurrency: 10 }); // Set concurrency limit here - -const SeriesCardCopy = ({ series }: { series: any }) => { - const navigate = useNavigate(); - const { state, dispatch } = useContext(PacsQueryContext); - // Load user Preference Data - const { - data: userPreferenceData, - isLoading: userDataLoading, - isError: userDataError, - } = useSettings(); - const userPreferences = userPreferenceData?.series; - const userPreferencesArray = userPreferences && Object.keys(userPreferences); - - const createFeed = useContext(MainRouterContext).actions.createFeedWithData; - const { selectedPacsService, pullStudy, preview } = state; - const client = new PFDCMClient(); - const { - SeriesInstanceUID, - StudyInstanceUID, - NumberOfSeriesRelatedInstances, - AccessionNumber, - } = series; - const seriesInstances = +NumberOfSeriesRelatedInstances.value; - const studyInstanceUID = StudyInstanceUID.value; - const seriesInstanceUID = SeriesInstanceUID.value; - const accessionNumber = AccessionNumber.value; - - // disable the card completely in this case - const isDisabled = seriesInstances === 0; - // This flag controls the start/stop for polling cube for files and display progress indicators - const [isFetching, setIsFetching] = useState(false); - const [openSeriesPreview, setOpenSeriesPreview] = useState(false); - const [isPreviewFileAvailable, setIsPreviewFileAvailable] = useState(false); - const [filePreviewForViewer, setFilePreviewForViewer] = - useState<PACSFile | null>(null); - const [pacsFileError, setPacsFileError] = useState(""); - - const pullQuery: DataFetchQuery = { - StudyInstanceUID: studyInstanceUID, - SeriesInstanceUID: seriesInstanceUID, - }; - - // Handle Retrieve Request - const handleRetrieveMutation = useMutation({ - mutationFn: async () => { - try { - await client.findRetrieve(selectedPacsService, pullQuery); - setIsFetching(true); - } catch (e) { - // Don't poll if the request fails - // biome-ignore lint/complexity/noUselessCatch: <explanation> - throw e; - } - }, - }); - - const { - isPending: retrieveLoading, - isError: retrieveFetchError, - error: retrieveErrorMessage, - } = handleRetrieveMutation; - - // Polling cube files after a successful retrieve request from pfdcm; - - async function fetchCubeFiles() { - try { - if (isDisabled) { - // Cancel polling for files that have zero number of series instances - setIsFetching(false); - return { - fileToPreview: null, - totalCount: 0, - }; - } - - const middleValue = Math.floor(seriesInstances / 2); - - // Perform these three requests in parallel - const [response, seriesRelatedInstance, pushCountInstance] = - await Promise.all([ - queue.add(() => - getTestData( - selectedPacsService, - pullQuery, - "", - isPreviewFileAvailable ? middleValue : 0, - ), - ), - queue.add(() => - getTestData( - "org.fnndsc.oxidicom", - pullQuery, - "NumberOfSeriesRelatedInstances", - ), - ), - queue.add(() => - getTestData( - "org.fnndsc.oxidicom", - pullQuery, - "OxidicomAttemptedPushCount", - ), - ), - ]); - - // Process the response - const fileItems = response.results; - let fileToPreview: PACSFile | null = null; - if (fileItems.length > 0) { - fileToPreview = fileItems[0]; - } - - const totalFilesCount = response.count; - - if (totalFilesCount >= middleValue) { - // Pick the middle image of the stack for preview. Set to true if that file is available - setIsPreviewFileAvailable(true); - } - - // Get the series related instance in cube - const seriesRelatedInstanceList = seriesRelatedInstance.results; - const pushCountInstanceList = pushCountInstance.results; - - if (seriesRelatedInstanceList.length > 0) { - const seriesCountLatest = getLatestPACSFile(seriesRelatedInstanceList); - const seriesCount = +seriesCountLatest.SeriesDescription; - if (seriesCount !== seriesInstances) { - throw new Error( - "The number of series related instances in cube does not match the number in pfdcm.", - ); - } - } - - let pushCount = 0; - if (pushCountInstanceList.length > 0) { - const pushCountLatest = getLatestPACSFile(pushCountInstanceList); - pushCount = +pushCountLatest.SeriesDescription; - - if (pushCount > 0 && pushCount === totalFilesCount && isFetching) { - // This means oxidicom is done pushing as the push count file is available - // Cancel polling - setIsFetching(false); - } - } - - // Setting the study instance tracker if pull study is clicked - if (pullStudy?.[accessionNumber]) { - dispatch({ - type: Types.SET_STUDY_PULL_TRACKER, - payload: { - seriesInstanceUID: SeriesInstanceUID.value, - studyInstanceUID: accessionNumber, - currentProgress: !!( - seriesInstances === 0 || totalFilesCount === pushCount - ), - }, - }); - } - - return { - fileToPreview, - totalFilesCount, - }; - } catch (error) { - setIsFetching(false); - throw error; - } - } - - const { - data, - isPending: filesLoading, - isError: filesError, - error: filesErrorMessage, - } = useQuery({ - queryKey: [SeriesInstanceUID.value, StudyInstanceUID.value], - queryFn: fetchCubeFiles, - refetchInterval: () => { - // Only fetch after a successfull response from pfdcm - // Decrease polling frequency to avoid overwhelming cube with network requests - if (isFetching) return 1500; - return false; - }, - refetchOnMount: true, - }); - - // Retrieve this series if the pull study is clicked and the series is not already being retrieved. - useEffect(() => { - if (pullStudy[accessionNumber] && !isFetching) { - setIsFetching(true); - } - }, [pullStudy[accessionNumber]]); - - // Start polling from where the user left off in case the user refreshed the screen. - useEffect(() => { - if ( - data && - data.totalFilesCount > 0 && - data.totalFilesCount !== seriesInstances && - !isFetching - ) { - setIsFetching(true); - } - }, [data]); - - useEffect(() => { - // This is the preview all mode clicked on the study card - - async function fetchPacsFile() { - try { - const file = await getPacsFile(data?.fileToPreview); - - if (file) { - setFilePreviewForViewer(file); - } - } catch (e) { - //handle error - if (e instanceof Error) { - setPacsFileError(e.message); - } - } - } - - preview && data?.fileToPreview && fetchPacsFile(); - }, [preview]); - - // Error and loading state indicators for retrieving from pfdcm and polling cube for files. - const isResourceBeingFetched = filesLoading || retrieveLoading; - const resourceErrorFound = filesError || retrieveFetchError; - const errorMessages = filesErrorMessage - ? filesErrorMessage.message - : retrieveErrorMessage - ? retrieveErrorMessage.message - : ""; - - const helperText = ( - <HelperText> - <HelperTextItem variant="error">{errorMessages}</HelperTextItem> - </HelperText> - ); - - // This is opened when the 'preview' button is clicked - const largeFilePreview = filePreviewForViewer && ( - <Modal - variant={ModalVariant.large} - title="Preview" - aria-label="viewer" - isOpen={openSeriesPreview} - onClose={() => setOpenSeriesPreview(false)} - > - <FileDetailView - preview="large" - selectedFile={filePreviewForViewer as PACSFile} - /> - </Modal> - ); - - const filePreviewButton = ( - <div - style={{ - display: "flex", - marginRight: "0.5em", - marginTop: "1em", - }} - > - <Tooltip content="Create Feed"> - <Button - style={{ marginRight: "0.25em" }} - size="sm" - icon={<CodeBranchIcon />} - onClick={async () => { - if (data?.fileToPreview) { - try { - const file = await getPacsFile(data?.fileToPreview); - if (file) { - const cubeSeriesPath = file.data.fname - .split("/") - .slice(0, -1) - .join("/"); - createFeed([cubeSeriesPath]); - } - } catch (e) { - if (e instanceof Error) { - setPacsFileError(e.message); - } - } - } - }} - variant="tertiary" - /> - </Tooltip> - - <Tooltip content="See a Preview"> - <Button - style={{ marginRight: "0.25em" }} - size="sm" - icon={<PreviewIcon />} - onClick={async () => { - try { - const file = await getPacsFile(data?.fileToPreview); - if (file) { - setFilePreviewForViewer(file); - setOpenSeriesPreview(true); - } - } catch (e) { - if (e instanceof Error) { - setPacsFileError(e.message); - } - } - }} - variant="tertiary" - /> - </Tooltip> - - <Tooltip content="Review the dataset"> - <Button - size="sm" - icon={<LibraryIcon />} - variant="tertiary" - onClick={async () => { - if (data?.fileToPreview) { - try { - const file = await getPacsFile(data.fileToPreview); - if (file) { - const pathSplit = file.data.fname.split("/"); - const url = pathSplit - .slice(0, pathSplit.length - 1) - .join("/"); - navigate(`/library/${url}`); - } - } catch (e) { - // Handle Error - if (e instanceof Error) { - setPacsFileError(e.message); - } - } - } - }} - /> - </Tooltip> - </div> - ); - - const filePreviewLayout = ( - <CardBody style={{ position: "relative", height: "400px" }}> - <FileDetailView - preview="large" - selectedFile={filePreviewForViewer as PACSFile} - /> - <div className="series-actions"> - <div className="action-button-container"> - <span - style={{ - marginBottom: "1px", - }} - > - {series.SeriesDescription.value} - </span> - {filePreviewButton} - </div> - </div> - </CardBody> - ); - - const retrieveButton = ( - <Button - variant="tertiary" - icon={<DownloadIcon />} - size="sm" - onClick={() => { - handleRetrieveMutation.mutate(); - }} - // Only when the number of series related instances in a series is 0 - isDisabled={isDisabled} - /> - ); - - const rowLayout = ( - <CardHeader - actions={{ - actions: <CardHeaderComponent resource={series} type="series" />, - }} - className="flex-series-container" - > - {userDataLoading ? ( - <div className="flex-series-item"> - <Skeleton width="100%" height="100%" /> - </div> - ) : !userDataError && - userPreferences && - userPreferencesArray && - userPreferencesArray.length > 0 ? ( - userPreferencesArray.map((key: string) => ( - <div key={key} className="flex-series-item"> - <div className="study-detail-title hide-content"> - <span style={{ marginRight: "0.5em" }}>{key} </span> - </div> - <Tooltip content={series[key].value} position="auto"> - <div className="hide-content"> - {series[key] ? series[key].value : "N/A"} - </div> - </Tooltip> - </div> - )) - ) : ( - <> - <div className="flex-series-item"> - <Tooltip content={series.SeriesDescription.value} position="auto"> - <div className="hide-content"> - <span style={{ marginRight: "0.5em" }}> - {series.SeriesDescription.value} - </span>{" "} - </div> - </Tooltip> - - <div> - {pluralize( - +series.NumberOfSeriesRelatedInstances.value, - "file", - "files", - )} - </div> - </div> - - <div className="flex-series-item"> - <div>Modality</div> - <Badge key={series.SeriesInstanceUID.value}> - {series.Modality.value} - </Badge> - </div> - - <div className="flex-series-item"> - <div>Accession Number</div> - <Tooltip content={series.AccessionNumber.value} position="auto"> - <div className="hide-content"> - <span style={{ marginRight: "0.5em" }}> - {series.AccessionNumber.value} - </span>{" "} - </div> - </Tooltip> - </div> - </> - )} - - <div className="flex-series-item steps-container"> - {isResourceBeingFetched && !resourceErrorFound && !data ? ( - <DotsIndicator title="Fetching current status..." /> - ) : data ? ( - <Progress - className={`retrieve-progress ${ - data.totalFilesCount === seriesInstances && "progress-success" - } ${ - data.totalFilesCount < seriesInstances && - isFetching && - "progress-active" - }`} - title="Test" - aria-labelledby="Retrieve Progress" - value={data.totalFilesCount} - max={seriesInstances} - size={ProgressSize.sm} - helperText={resourceErrorFound ? helperText : ""} - variant={ - resourceErrorFound - ? ProgressVariant.danger - : data.totalFilesCount === seriesInstances - ? ProgressVariant.success - : undefined - } - measureLocation={ProgressMeasureLocation.top} - /> - ) : ( - resourceErrorFound && ( - <Alert - style={{ height: "100%" }} - closable - type="error" - message={errorMessages} - description={<span>{retrieveButton}</span>} - /> - ) - )} - </div> - - <div className="flex-series-item button-container"> - {((data && data.totalFilesCount <= 0 && !isFetching) || - resourceErrorFound) && ( - <Tooltip content="Retrieve Series">{retrieveButton}</Tooltip> - )} - {isFetching && data && data.totalFilesCount < 1 && ( - <DotsIndicator title="Retrieving the series" /> - )} - {data?.fileToPreview && filePreviewButton} - </div> - </CardHeader> - ); - - return ( - <Card - isDisabled={isDisabled} - isFlat={true} - isFullHeight={true} - isCompact={true} - isRounded={true} - > - {preview && data?.fileToPreview ? filePreviewLayout : rowLayout} - {data?.fileToPreview && largeFilePreview} - - {/* Error handling for fetching a pacs file for preview */} - {pacsFileError && <Alert type="error" description={pacsFileError} />} - </Card> - ); -}; - -export default SeriesCardCopy; diff --git a/src/components/Pacs/components/SettingsComponents.tsx b/src/components/Pacs/components/SettingsComponents.tsx deleted file mode 100644 index 0ed27e8ae..000000000 --- a/src/components/Pacs/components/SettingsComponents.tsx +++ /dev/null @@ -1,215 +0,0 @@ -import { Button, Checkbox } from "@patternfly/react-core"; -import { useQueryClient } from "@tanstack/react-query"; -import { Popover } from "../../Antd"; -import axios from "axios"; -import { useState } from "react"; -import ChrisApiClient from "../../../api/chrisapiclient"; -import { useTypedSelector } from "../../../store/hooks"; -import { NodeDetailsPanelIcon } from "../../Icons"; - -export const CardHeaderComponent = ({ - resource, - type, -}: { - resource: any; - type: string; -}) => { - const [settingsModal, setSettingsModal] = useState(false); - - return ( - <div> - <Popover - content={ - <SettingsComponent - resource={resource} - type={type} - handleModalClose={() => { - setSettingsModal(!settingsModal); - }} - /> - } - title="Study Card Configuration" - trigger="click" - open={settingsModal} - onOpenChange={() => { - setSettingsModal(!settingsModal); - }} - > - <Button - onClick={() => { - setSettingsModal(!settingsModal); - }} - variant="link" - icon={<NodeDetailsPanelIcon />} - /> - </Popover> - </div> - ); -}; - -export const SettingsComponent = ({ - resource, - type, - handleModalClose, -}: { - type: string; - resource: any; - handleModalClose: () => void; -}) => { - const queryClient = useQueryClient(); - const username = useTypedSelector((state) => state.user.username); - - const [recordDict, setRecordDict] = useState<Record<string, boolean>>({}); - - const handleChange = (key: string, checked: boolean) => { - if (!recordDict[key]) { - setRecordDict({ - ...recordDict, - [key]: checked, - }); - } else { - const newState = { ...recordDict }; - delete newState[key]; - setRecordDict(newState); - } - }; - - const saveUserData = async () => { - const url = `${import.meta.env.VITE_CHRIS_UI_URL}uploadedfiles/`; - - const client = ChrisApiClient.getClient(); - await client.setUrls(); - const formData = new FormData(); - const fileName = "settings.json"; - - const path = `${username}/uploads/config`; - const pathList = await client.getFileBrowserPath(path); - - try { - let existingContent: { - [key: string]: Record<string, boolean>; - } = {}; - if (pathList) { - const files = await pathList.getFiles(); - const fileItems = files.getItems(); - - if (fileItems) { - // Use Promise.all to wait for all async operations to complete - const fileContentArray = await Promise.all( - fileItems.map(async (_file) => { - const blob = await _file.getFileBlob(); - const reader = new FileReader(); - - // Use a Promise to wait for the reader.onload to complete - const readPromise = new Promise((resolve) => { - reader.onload = (e) => { - const contents = (e?.target?.result as string) || "{}"; - resolve(JSON.parse(contents)); - }; - }); - - reader.readAsText(blob); - - // Delete the file after processing - await _file._delete(); - - // Wait for the reader.onload to complete before moving to the next file - return await readPromise; - }), - ); - - existingContent = fileContentArray[0] as { - [key: string]: Record<string, boolean>; - }; - } - } - - const dataTransformed = { [type]: recordDict }; - - const data = JSON.stringify({ - ...existingContent, - ...dataTransformed, - }); - - formData.append("upload_path", `${username}/uploads/config/${fileName}`); - - formData.append( - "fname", - new Blob([data], { - type: "application/json", - }), - fileName, - ); - - const config = { - headers: { - Authorization: `Token ${client.auth.token}`, - }, - }; - - await axios.post(url, formData, config); - - queryClient.invalidateQueries({ - queryKey: ["metadata"], - }); - - setRecordDict({}); - handleModalClose(); - } catch (error) { - console.error("Error:", error); - } - }; - - return ( - <div> - {Object.entries(resource).map(([key]) => { - return ( - <div key={key} style={{ display: "flex", alignItems: "center" }}> - <Checkbox - id={key} - isChecked={recordDict[key] ? true : false} - onChange={(_event, checked: boolean) => { - handleChange(key, checked); - }} - aria-label={`Study ${key} Checkbox`} - /> - <div - style={{ - flex: "1", - display: "flex", - alignItems: "center", - marginLeft: "1rem", - fontWeight: "bold", - }} - > - {key} - </div> - </div> - ); - })} - - <Button - onClick={() => saveUserData()} - variant="secondary" - style={{ - marginTop: "1rem", - }} - > - Submit - </Button> - - <Button - style={{ - marginLeft: "1rem", - }} - variant="secondary" - onClick={async () => { - setRecordDict({}); - await saveUserData(); - }} - > - Reset to Default - </Button> - </div> - ); -}; diff --git a/src/components/Pacs/components/StudyCard.tsx b/src/components/Pacs/components/StudyCard.tsx deleted file mode 100644 index b2436df17..000000000 --- a/src/components/Pacs/components/StudyCard.tsx +++ /dev/null @@ -1,366 +0,0 @@ -import { - Badge, - Button, - Card, - CardHeader, - Grid, - GridItem, - Skeleton, - Tooltip, -} from "@patternfly/react-core"; -import { notification } from "antd"; -import { format, parse } from "date-fns"; -import { useContext, useEffect, useState } from "react"; -import { DotsIndicator } from "../../Common"; -import { - DownloadIcon, - PreviewIcon, - QuestionCircleIcon, - RetryIcon, - ThLargeIcon, -} from "../../Icons"; -import { PacsQueryContext, Types } from "../context"; -import PfdcmClient from "../pfdcmClient"; -import useSettings from "../useSettings"; -import SeriesCard from "./SeriesCard"; -import { CardHeaderComponent } from "./SettingsComponents"; -import usePullStudyHook from "./usePullStudyHook"; - -const StudyCardCopy = ({ study }: { study: any }) => { - const [api, contextHolder] = notification.useNotification(); - const { writeStatus, getStatus } = usePullStudyHook(); - const { data, isLoading, isError } = useSettings(); - const { state, dispatch } = useContext(PacsQueryContext); - const [isStudyExpanded, setIsStudyExpanded] = useState(false); - const [startPullStudy, setStartStudying] = useState(false); - const { preview, pullStudy, studyPullTracker, selectedPacsService } = state; - const userPreferences = data?.study; - const userPreferencesArray = userPreferences && Object.keys(userPreferences); - const accessionNumber = study.AccessionNumber.value; - const studyDate = study.StudyDate.value; - const parsedDate = parse(studyDate, "yyyyMMdd", new Date()); - const formattedDate = Number.isNaN( - parsedDate.getTime(), - ) /* Check if parsedDate is a valid date */ - ? studyDate - : format(parsedDate, "MMMM d, yyyy"); - - const clearState = async () => { - dispatch({ - type: Types.SET_PULL_STUDY, - payload: { - studyInstanceUID: accessionNumber, - status: false, - }, - }); - // stop tracking this status as an active pull - await writeStatus(accessionNumber, false); - }; - - useEffect(() => { - async function setUpStatus() { - if (studyPullTracker[accessionNumber] && pullStudy[accessionNumber]) { - const studyBeingTracked = studyPullTracker[accessionNumber]; - if (studyBeingTracked) { - let allSeriesBeingTracked = true; - for (const series in studyBeingTracked) { - const isSeriesDone = studyBeingTracked[series]; - if (!isSeriesDone) { - allSeriesBeingTracked = false; - break; - } - } - - // All series are being tracked and are complete - if ( - allSeriesBeingTracked && - study.series.length === Object.keys(studyBeingTracked).length - ) { - await clearState(); - } - } - } - } - - setUpStatus(); - }, [studyPullTracker[accessionNumber], pullStudy[accessionNumber]]); - - useEffect(() => { - async function fetchStatus() { - const status = await getStatus(accessionNumber); - if (status?.[accessionNumber]) { - setIsStudyExpanded(true); - dispatch({ - type: Types.SET_PULL_STUDY, - payload: { - studyInstanceUID: accessionNumber, - status: true, - }, - }); - } - } - // Fetch Status - fetchStatus(); - }, []); - - const retrieveStudy = async () => { - setStartStudying(true); - await writeStatus(study.AccessionNumber.value, true); - const client = new PfdcmClient(); - await client.findRetrieve(selectedPacsService, { - AccessionNumber: study.AccessionNumber.value, - }); - dispatch({ - type: Types.SET_PULL_STUDY, - payload: { - studyInstanceUID: accessionNumber, - status: true, - }, - }); - setStartStudying(false); - setIsStudyExpanded(true); - }; - - return ( - <> - {contextHolder} - <Card - isFlat={true} - isFullHeight={true} - isCompact={true} - isRounded={true} - isExpanded={isStudyExpanded} - isSelectable - isClickable - > - <CardHeader - actions={{ - actions: <CardHeaderComponent resource={study} type="study" />, - }} - className="flex-studies-container" - onExpand={() => setIsStudyExpanded(!isStudyExpanded)} - > - <> - {isLoading ? ( - <div className="flex-studies-item"> - <Skeleton - width="100%" - height="100%" - screenreaderText="Loading contents" - /> - </div> - ) : ( - <> - {!isError && - userPreferences && - userPreferencesArray && - userPreferencesArray.length > 0 ? ( - userPreferencesArray.map((key: string) => ( - <div key={key} className="flex-studies-item"> - <div className="study-detail-title">{key}</div> - <Tooltip content={study[key].value} position="auto"> - <div - style={{ - overflow: "hidden", - textOverflow: "ellipsis", - whiteSpace: "nowrap", - }} - > - <span style={{ marginRight: "0.5em" }}> - {study[key].value && study[key].value} - </span>{" "} - </div> - </Tooltip> - </div> - )) - ) : ( - <> - <div className="flex-studies-item"> - <Tooltip - content={study.StudyDescription.value} - position="auto" - > - <div - style={{ - overflow: "hidden", - textOverflow: "ellipsis", - whiteSpace: "nowrap", - }} - > - <span style={{ marginRight: "0.5em" }}> - {study.StudyDescription.value && - study.StudyDescription.value} - </span>{" "} - </div> - </Tooltip> - <div> - {study.NumberOfStudyRelatedSeries.value && - study.NumberOfStudyRelatedSeries.value}{" "} - series, {formattedDate} - </div> - </div> - <div className="flex-studies-item "> - <div className="study-detail-title"> - Modalities in Study - </div> - <div> - {study.ModalitiesInStudy.value - ?.split("\\") - .map((m: string, index: number) => ( - <Badge - style={{ margin: "auto 0.125em" }} - key={`${m}_${index}`} - > - {m} - </Badge> - ))} - </div> - </div> - <div className="flex-studies-item"> - <div className="study-detail-title">Accession Number</div> - {study.AccessionNumber.value?.startsWith("no value") ? ( - <Tooltip content={study.AccessionNumber}> - <QuestionCircleIcon /> - </Tooltip> - ) : ( - <div>{study.AccessionNumber.value}</div> - )} - </div> - <div className="flex-studies-item"> - <div className="study-detail-title">Station</div> - {study.PerformedStationAETitle.value?.startsWith( - "no value", - ) ? ( - <Tooltip content={study.PerformedStationAETitle.value}> - <QuestionCircleIcon /> - </Tooltip> - ) : ( - <div>{study.PerformedStationAETitle.value}</div> - )} - </div> - </> - )} - </> - )} - <div className="flex-studies-item button-container"> - {import.meta.env.VITE_OHIF_URL && ( - <Tooltip content="Open in OHIF"> - <Button - size="sm" - variant="secondary" - style={{ marginRight: "0.25em" }} - icon={<ThLargeIcon />} - component="a" - href={`${ - import.meta.env.VITE_OHIF_URL - }viewer?StudyInstanceUIDs=${study.StudyInstanceUID.value}`} - target="_blank" - /> - </Tooltip> - )} - <Tooltip - content={ - preview === true ? "Hide All Previews" : "Show All Previews" - } - > - <Button - size="sm" - variant="tertiary" - style={{ marginRight: "0.25em" }} - onClick={() => { - dispatch({ - type: Types.SET_SHOW_PREVIEW, - payload: { - preview: !preview, - }, - }); - - if (preview === false) { - setIsStudyExpanded(true); - } - }} - icon={<PreviewIcon />} - /> - </Tooltip> - - {pullStudy[accessionNumber] || startPullStudy ? ( - <> - <Tooltip content="Retry the pull if you see no progress"> - <Button - onClick={async () => { - await clearState(); - }} - variant="danger" - style={{ - marginLeft: "0.5em", - }} - size="sm" - icon={<RetryIcon />} - /> - </Tooltip> - <DotsIndicator title="Pulling Study..." /> - </> - ) : ( - <Tooltip content="Pull Study"> - <Button - onClick={async () => { - const status = await getStatus(accessionNumber); - if (status?.[accessionNumber]) { - api.info({ - message: "This study has already been pulled", - description: ( - <Button - variant="tertiary" - onClick={async () => { - await retrieveStudy(); - }} - > - Pull again? - </Button> - ), - duration: 4, - }); - setIsStudyExpanded(true); - } else { - await retrieveStudy(); - } - }} - variant="tertiary" - className="button-with-margin" - size="sm" - icon={<DownloadIcon />} - /> - </Tooltip> - )} - </div> - </> - </CardHeader> - </Card> - {isStudyExpanded && ( - <div className="patient-series"> - <Grid hasGutter> - {study.series.map((series: any) => { - return ( - <GridItem - key={series.SeriesInstanceUID.value} - rowSpan={1} - lg={12} - md={12} - sm={12} - xl={12} - > - <SeriesCard - key={series.SeriesInstanceUID.value} - series={series} - /> - </GridItem> - ); - })} - </Grid> - </div> - )} - </> - ); -}; - -export default StudyCardCopy; diff --git a/src/components/Pacs/components/input.test.ts b/src/components/Pacs/components/input.test.ts new file mode 100644 index 000000000..6c2510d04 --- /dev/null +++ b/src/components/Pacs/components/input.test.ts @@ -0,0 +1,12 @@ +import { test, expect } from "vitest"; +import { isQueryEmpty } from "./input.tsx"; + +test.each([ + [null, true], + [{}, true], + [{ patientID: "" }, true], + [{ patientID: "", AccessionNumber: "" }, true], + [{ patientID: "bob" }, false], +])("isQueryEmpty(%o) -> %b", (query, expected) => { + expect(isQueryEmpty(query)).toBe(expected); +}); diff --git a/src/components/Pacs/components/input.tsx b/src/components/Pacs/components/input.tsx new file mode 100644 index 000000000..ba4906fc0 --- /dev/null +++ b/src/components/Pacs/components/input.tsx @@ -0,0 +1,192 @@ +import React from "react"; +import { PACSqueryCore } from "../../../api/pfdcm"; +import { + Button, + Dropdown, + DropdownItem, + DropdownList, + Grid, + GridItem, + MenuToggle, + MenuToggleElement, + TextInputGroup, + TextInputGroupMain, + ToggleGroup, + ToggleGroupItem, +} from "@patternfly/react-core"; +import { hideOnDesktop, hideOnMobile } from "../../../cssUtils.ts"; +import { SearchIcon, TimesIcon } from "@patternfly/react-icons"; + +type InputFieldProps = { + setQuery: (query: PACSqueryCore) => void; + query: PACSqueryCore; + id?: string; + "aria-label"?: string; +}; + +type PacsInputProps = InputFieldProps & { + service: string; + services: ReadonlyArray<string>; + setService: (service: string) => void; +}; + +/** + * An input field for searching in PACS by MRN + */ +const MrnInput: React.FC<InputFieldProps> = ({ query, setQuery, ...props }) => { + const clearInput = () => setQuery({}); + + return ( + <TextInputGroup> + <TextInputGroupMain + icon={<SearchIcon />} + value={query.patientID || ""} + onChange={(_event, value) => + setQuery({ + patientID: value, + }) + } + name="mrnSearchInput" + placeholder="Search for DICOM studies by MRN" + /> + {!isQueryEmpty(query) && ( + <Button + variant="plain" + onClick={clearInput} + aria-label="Clear button and input" + > + <TimesIcon /> + </Button> + )} + </TextInputGroup> + ); +}; + +/** + * An advanced search input field for searching in PACS by PatientID, AccessionNumber, ... + */ +const AdvancedInput: React.FC<InputFieldProps> = ({ + query, + setQuery, + ...props +}) => { + return ( + <> + <h1>Advanced search not implemented.</h1> + </> + ); +}; + +type ServiceDropdownProps = { + service: string; + setService: (service: string) => void; + services: ReadonlyArray<string>; +}; + +const ServiceDropdown: React.FC<ServiceDropdownProps> = ({ + service, + services, + setService, +}) => { + const [isOpen, setIsOpen] = React.useState(false); + return ( + <Dropdown + isOpen={isOpen} + onSelect={(_e, value) => { + typeof value === "string" && setService(value); + setIsOpen(false); + }} + onOpenChange={(isOpen: boolean) => setIsOpen(isOpen)} + toggle={(toggleRef: React.Ref<MenuToggleElement>) => ( + <MenuToggle + ref={toggleRef} + onClick={() => setIsOpen((open) => !open)} + isExpanded={isOpen} + isFullWidth + title="PACS service" + > + {service} + </MenuToggle> + )} + > + <DropdownList> + {services.map((service) => ( + <DropdownItem value={service} key={service}> + {service} + </DropdownItem> + ))} + </DropdownList> + </Dropdown> + ); +}; + +/** + * A `<span>` which shows different text on mobile vs desktop layouts. + */ +const ScreenSizeSpan: React.FC<{ + mobile: React.ReactNode; + desktop: React.ReactNode; +}> = ({ mobile, desktop }) => ( + <> + <span className={hideOnDesktop}>{mobile}</span> + <span className={hideOnMobile}>{desktop}</span> + </> +); + +const PacsInput: React.FC<PacsInputProps> = ({ + service, + services, + setService, + ...props +}) => { + const [advancedSearch, setAdvancedSearch] = React.useState(false); + + const InputElement = advancedSearch ? AdvancedInput : MrnInput; + + const advancedSearchToggle = ( + <ToggleGroup> + <ToggleGroupItem + text={<ScreenSizeSpan mobile="MRN" desktop="MRN Search" />} + isSelected={!advancedSearch} + onChange={() => setAdvancedSearch(false)} + /> + <ToggleGroupItem + text={<ScreenSizeSpan mobile="Advanced" desktop="Advanced Search" />} + isSelected={advancedSearch} + onChange={() => setAdvancedSearch(true)} + /> + </ToggleGroup> + ); + + const serviceDropdown = ( + <ServiceDropdown + services={services} + service={service} + setService={setService} + /> + ); + + return ( + <Grid> + <GridItem span={6} md={3}> + {advancedSearchToggle} + </GridItem> + <GridItem span={6} md={3} order={{ md: "2" }}> + {serviceDropdown} + </GridItem> + <GridItem span={12} md={6}> + <InputElement {...props} /> + </GridItem> + </Grid> + ); +}; + +function isQueryEmpty(query: { [key: string]: any } | null): boolean { + return ( + query === null || + Object.values(query).findIndex((value) => `${value}`.length > 0) === -1 + ); +} + +export default PacsInput; +export { isQueryEmpty }; diff --git a/src/components/Pacs/components/loading.tsx b/src/components/Pacs/components/loading.tsx new file mode 100644 index 000000000..40677f75e --- /dev/null +++ b/src/components/Pacs/components/loading.tsx @@ -0,0 +1,22 @@ +import { Skeleton } from "@patternfly/react-core"; +import Spacing from "@patternfly/react-styles/css/utilities/Spacing/spacing"; + +const PacsLoadingScreen = () => ( + <> + <Skeleton + height="50px" + className={Spacing.mb_4xl} + screenreaderText="Loading ChRIS PACS query and retrieve app" + /> + <Skeleton height="40px" width="90%" className={Spacing.mbSm} /> + <Skeleton height="40px" width="90%" className={Spacing.mbSm} /> + <br /> + <Skeleton height="40px" width="90%" className={Spacing.mbSm} /> + <Skeleton height="40px" width="90%" className={Spacing.mbSm} /> + <br /> + <Skeleton height="40px" width="90%" className={Spacing.mbSm} /> + <Skeleton height="40px" width="90%" className={Spacing.mbSm} /> + </> +); + +export default PacsLoadingScreen; diff --git a/src/components/Pacs/components/usePullStudyHook.tsx b/src/components/Pacs/components/usePullStudyHook.tsx deleted file mode 100644 index 21506d3d8..000000000 --- a/src/components/Pacs/components/usePullStudyHook.tsx +++ /dev/null @@ -1,124 +0,0 @@ -import ChrisAPIClient from "../../../api/chrisapiclient"; -import axios from "axios"; -import { useTypedSelector } from "../../../store/hooks"; -import { catchError } from "../../../api/common"; - -const usePullStudyHook = () => { - const userName = useTypedSelector((state) => state.user.username); - const url = `${import.meta.env.VITE_CHRIS_UI_URL}uploadedfiles/`; - const client = ChrisAPIClient.getClient(); - const token = client.auth.token; - - const writeStatus = async (accessionNumber: string, type: boolean) => { - try { - const status = await getStatus(accessionNumber); - // delete this file - await deleteFile(accessionNumber); - // delete this file if it already exists - const client = ChrisAPIClient.getClient(); - const path = `${userName}/uploads/pacs/${accessionNumber}`; - const fileName = "pacsStatus.json"; - const formData = new FormData(); - - const data = JSON.stringify({ - ...status, - [accessionNumber]: type, - }); - formData.append("upload_path", `${path}/${fileName}`); - formData.append( - "fname", - new Blob([data], { - type: "application/json", - }), - ); - - const config = { - headers: { - Authorization: `Token ${client.auth.token}`, - }, - }; - - const response = await axios.post(url, formData, config); - return response; - } catch (error) { - const error_message = catchError(error).error_message; - throw new Error(error_message); - } - }; - - const deleteFile = async (accessionNumber: string) => { - const file = await getFile(accessionNumber); - if (file) { - const url = file.url; - await axios.delete(url, { - headers: { - Authorization: `Token ${token}`, - }, - }); - } - }; - - const getFile = async (accessionNumber: string) => { - const client = ChrisAPIClient.getClient(); - const path = `${userName}/uploads/pacs/${accessionNumber}/pacsStatus.json`; - const url = `${ - import.meta.env.VITE_CHRIS_UI_URL - }uploadedfiles/search?fname_exact=${path}`; - - try { - const response = await axios.get(url, { - headers: { - "Content-Type": "application/json", - Authorization: `Token ${client.auth.token}`, - }, - }); - - // If there is more than file don't write. Something has corrupted - if (response.data.results.length <= 1) { - const file = response.data.results[0]; - return file; - } - throw new Error("Failed to fetch the file..."); - } catch (error) { - if (error instanceof Error) { - throw new Error(error.message); - } - const error_message = catchError(error).error_message; - throw new Error(error_message); - } - }; - - const getStatus = async (accessionNumber: string) => { - try { - const client = ChrisAPIClient.getClient(); - // Get this file first - const file = await getFile(accessionNumber); - if (file) { - // file already exists; - try { - const response = await axios.get(file.file_resource, { - headers: { - "Content-Type": "blob", - Authorization: `Token ${client.auth.token}`, - }, - }); - - if (response?.data) { - return response.data; - } - } catch (error) { - if (error instanceof Error) throw new Error(error.message); - } - } - } catch (error) { - if (error instanceof Error) throw new Error(error.message); - } - }; - - return { - writeStatus, - getStatus, - deleteFile, - }; -}; -export default usePullStudyHook; diff --git a/src/components/Pacs/components/utils.ts b/src/components/Pacs/components/utils.ts deleted file mode 100644 index 87c242bef..000000000 --- a/src/components/Pacs/components/utils.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { parse, format } from "date-fns"; - -export const formatStudyDate = (studyDateString: string) => { - // Parse the input string to a Date object - const parsedDate = parse(studyDateString, "yyyyMMdd", new Date()); - - // Format the Date object to 'MMMM d yyyy' format (e.g., 'December 6 2011') - const formattedDate = format(parsedDate, "MMMM d yyyy"); - - // Determine the day part of the formatted date - const day: any = format(parsedDate, "d"); - - // Add 'st', 'nd', 'rd', or 'th' to the day part of the formatted date - const dayWithSuffix = getDayWithSuffix(day); - - return formattedDate.replace(day, dayWithSuffix); -}; - -const getDayWithSuffix = (day: number) => { - if (day >= 11 && day <= 13) { - return `${day}th`; - } - - const lastDigit = day % 10; - - switch (lastDigit) { - case 1: - return `${day}st`; - case 2: - return `${day}nd`; - case 3: - return `${day}rd`; - default: - return `${day}th`; - } -}; diff --git a/src/components/Pacs/index.tsx b/src/components/Pacs/index.tsx index 294865ac2..21a0f1da0 100644 --- a/src/components/Pacs/index.tsx +++ b/src/components/Pacs/index.tsx @@ -1,563 +1,27 @@ -import { - Button, - Dropdown, - DropdownItem, - DropdownList, - Grid, - GridItem, - MenuToggle, - PageSection, - Split, - SplitItem, - TextInput, -} from "@patternfly/react-core"; -import SearchIcon from "@patternfly/react-icons/dist/esm/icons/search-icon"; -import { Alert, Spin } from "../Antd"; -import * as React from "react"; -import { useNavigate } from "react-router"; -import { useSearchParams } from "react-router-dom"; -import { pluralize } from "../../api/common"; -import { EmptyStateComponent, SpinContainer } from "../Common"; -import WrapperConnect from "../Wrapper"; -import PatientCard from "./components/PatientCard"; -import { PacsQueryContext, PacsQueryProvider, Types } from "./context"; -import "./pacs-copy.css"; -import PfdcmClient from "./pfdcmClient"; -import { DownloadIcon } from "../Icons"; +import Wrapper from "../Wrapper"; +import { Configuration as PfdcmConfig, PfdcmClient } from "../../api/pfdcm"; -const dropdownMatch: { [key: string]: string } = { - PatientID: "Patient MRN", - PatientName: "Patient Name", - AccessionNumber: "Accession Number", -}; - -const PacsCopy = () => { - React.useEffect(() => { - document.title = "My Library"; - }, []); - - return ( - <WrapperConnect> - <PageSection> - <PacsQueryProvider> - <QueryBuilder /> - <Results /> - </PacsQueryProvider> - </PageSection> - </WrapperConnect> - ); -}; - -export default PacsCopy; - -const client = new PfdcmClient(); -const actions = ["Patient MRN", "Patient Name", "Accession Number"]; - -const QueryBuilder = () => { - const navigate = useNavigate(); - const [searchParams] = useSearchParams(); - - const { state, dispatch } = React.useContext(PacsQueryContext); - const [queryOpen, setQueryOpen] = React.useState(false); - const [value, setValue] = React.useState(""); - const [pacsListOpen, setPacsListOpen] = React.useState(false); - const [errorState, setErrorState] = React.useState(""); - - const { pacsServices, selectedPacsService, currentQueryType, queryResult } = - state; - - const service = searchParams.get("service"); - const queryType = searchParams.get("queryType"); - const searchValue = searchParams.get("value"); - - const responseCache = React.useRef(new Map()); - - const handleSubmitQuery = React.useCallback( - async ( - navigateToDifferentRoute: boolean, - currentQueryType: string, - value: string, - selectedPacsService = "default", - ) => { - const cacheKey = `${currentQueryType}-${value}-${selectedPacsService}`; - // Check if the response for the query is already cached - if (responseCache.current.has(cacheKey)) { - return; - } - // Cache the response - responseCache.current.set(cacheKey, 1); - - if (value.length > 0 && currentQueryType) { - // Reset Search Results in the state first to avoid duplication if search button is hit twice or if the page is refreshed - // and the ui is trying to construct the page with url search params - dispatch({ - type: Types.RESET_SEARCH_RESULTS, - payload: null, - }); - - const csv = value.trim().split(/[,\s]+/); - - dispatch({ - type: Types.SET_LOADING_SPINNER, - payload: { - status: true, - text: `Fetching ${csv.length} ${pluralize("result", csv.length)} `, - }, - }); - - const responses = []; - - for (const value of csv) { - try { - const response = await client.find( - { - [currentQueryType]: value.trimStart().trimEnd(), - }, - selectedPacsService, - ); - response && responses.push(response); - dispatch({ - type: Types.SET_LOADING_SPINNER, - payload: { - status: true, - text: `Completed ${responses.length} of ${csv.length} searches`, - }, - }); - - dispatch({ - type: Types.SET_SEARCH_RESULT, - payload: { - queryResult: response, - }, - }); - } catch (error: any) { - setErrorState(error.message); - dispatch({ - type: Types.SET_LOADING_SPINNER, - payload: { - status: true, - text: `Completed ${responses.length} of ${csv.length} searches. Found an error for value ${value}`, - }, - }); - } - } - - dispatch({ - type: Types.SET_LOADING_SPINNER, - payload: { - status: false, - text: "Search Complete", - }, - }); - - if (navigateToDifferentRoute) { - navigate( - `/pacs?queryType=${currentQueryType}&value=${value}&service=${selectedPacsService}`, - ); - } - } else { - setErrorState( - "Please ensure PACS service, Search Value, and the Query Type are all selected.", - ); - } - }, - [dispatch, navigate], - ); - - React.useEffect(() => { - client - .getPacsServices() - .then((list) => { - if (list) { - dispatch({ - type: Types.SET_LIST_PACS_SERVICES, - payload: { - pacsServices: list, - }, - }); - - const selectedPacsService = getDefaultPacsService(list); - - if (!service && selectedPacsService) { - dispatch({ - type: Types.SET_SELECTED_PACS_SERVICE, - payload: { selectedPacsService }, - }); - } - } - }) - .catch((error: any) => { - setErrorState(error.message); - }); - }, [dispatch, service]); - - React.useEffect(() => { - const fetchData = async () => { - if (queryType && searchValue && service) { - dispatch({ - type: Types.SET_SELECTED_PACS_SERVICE, - payload: { selectedPacsService: service }, - }); - - dispatch({ - type: Types.SET_CURRENT_QUERY_TYPE, - payload: { currentQueryType: queryType }, - }); - - if (queryResult.length === 0) { - setValue(searchValue); - await handleSubmitQuery(false, queryType, searchValue, service); - } - } - }; - - fetchData(); - }, []); - - const onToggle = () => { - setQueryOpen(!queryOpen); - }; - - const onTogglePacsList = () => { - setPacsListOpen(!pacsListOpen); - }; - - const queryBy = (action: string) => { - onToggle(); - switch (action) { - case "Patient MRN": { - dispatch({ - type: Types.SET_CURRENT_QUERY_TYPE, - payload: { - currentQueryType: "PatientID", - }, - }); - break; - } - case "Patient Name": { - dispatch({ - type: Types.SET_CURRENT_QUERY_TYPE, - payload: { - currentQueryType: "PatientName", - }, - }); - break; - } - - case "Accession Number": { - dispatch({ - type: Types.SET_CURRENT_QUERY_TYPE, - payload: { - currentQueryType: "AccessionNumber", - }, - }); - break; - } - default: - return; - } - }; - - return ( - <Grid hasGutter id="pacs-query-builder"> - <GridItem lg={12}> - <Split id="search" style={{ width: "100%" }}> - <SplitItem> - <Dropdown - isOpen={queryOpen} - id="query type" - aria-label="query type" - toggle={(toggleRef) => { - return ( - <MenuToggle onClick={onToggle} ref={toggleRef}> - <div style={{ fontWeight: 600 }}> - {currentQueryType - ? dropdownMatch[currentQueryType] - : "Query By"} - </div> - </MenuToggle> - ); - }} - > - <DropdownList> - {actions.map((action) => { - return ( - <DropdownItem onClick={() => queryBy(action)} key={action}> - {action} - </DropdownItem> - ); - })} - </DropdownList> - </Dropdown> - </SplitItem> - <SplitItem isFilled> - <TextInput - customIcon={<SearchIcon />} - value={value} - aria-label="Query" - onKeyDown={(e) => { - e.key === "Enter" && - handleSubmitQuery( - true, - currentQueryType, - value, - selectedPacsService, - ); - }} - onChange={(_event, value) => setValue(value)} - /> - </SplitItem> - <SplitItem> - <Dropdown - isOpen={pacsListOpen} - id="pacs list" - aria-label="pacs list" - toggle={(toggleRef) => { - return ( - <MenuToggle onClick={onTogglePacsList} ref={toggleRef}> - <div> - {selectedPacsService - ? selectedPacsService - : "Select a PACS Service"} - </div> - </MenuToggle> - ); - }} - > - <DropdownList> - {pacsServices ? ( - pacsServices.map((service: string) => { - return ( - <DropdownItem - key={service} - isActive={selectedPacsService === service} - onClick={() => { - dispatch({ - type: Types.SET_SELECTED_PACS_SERVICE, - payload: { - selectedPacsService: service, - }, - }); - onTogglePacsList(); - }} - > - {service} - </DropdownItem> - ); - }) - ) : ( - <DropdownItem>No service available</DropdownItem> - )} - </DropdownList> - </Dropdown> - </SplitItem> - <SplitItem - style={{ - marginLeft: "1em", - }} - > - <Button - onClick={() => { - handleSubmitQuery( - true, - currentQueryType, - value, - selectedPacsService, - ); - }} - > - Search - </Button> - </SplitItem> - </Split> - </GridItem> - {errorState && ( - <GridItem lg={12}> - <Alert - onClose={() => { - setErrorState(""); - }} - closable - type="error" - description={errorState} - /> - </GridItem> - )} - </Grid> - ); -}; - -// Utility function to flatten a nested object, focusing on 'label' and 'value' -const flattenObject = (obj: any, _parent = "", res: any = {}): any => { - for (const key in obj) { - // biome-ignore lint/suspicious/noPrototypeBuiltins: <explanation> - if (obj.hasOwnProperty(key)) { - if ( - typeof obj[key] === "object" && - obj[key] !== null && - !Array.isArray(obj[key]) - ) { - if (obj[key].label && obj[key].value !== undefined) { - res[obj[key].label] = obj[key].value; - } else { - flattenObject(obj[key], key, res); - } - } else if (Array.isArray(obj[key])) { - obj[key].forEach((item: any, index: number) => { - flattenObject(item, `${key}[${index}]`, res); - }); - } else { - res[key] = obj[key]; - } - } - } - return res; -}; - -// Utility function to convert JSON array to CSV -const jsonToCSV = (jsonArray: any[]): string | null => { - if (!jsonArray || !jsonArray.length) { - return null; - } - - // Flatten each JSON object in the array - const flattenedArray = jsonArray.map((item) => flattenObject(item)); - - // Extract keys (header row) - const keys = Object.keys(flattenedArray[0]); - const csvRows: string[] = []; - - // Add the header row - csvRows.push(keys.join(",")); - - // Add the data rows - flattenedArray.forEach((item) => { - const values = keys.map( - (key) => `"${item[key] !== undefined ? item[key] : ""}"`, - ); - csvRows.push(values.join(",")); - }); - - return csvRows.join("\n"); -}; - -const Results: React.FC = () => { - const { state } = React.useContext(PacsQueryContext); - const [exporting, setExporting] = React.useState(false); - - const { queryResult, fetchingResults } = state; - - const exportAsCSV = (): void => { - setExporting(true); - // Flatten the data arrays from all query results, including empty data results - const allData = queryResult.flatMap((result: any) => { - if (result.data.length > 0) { - return result.data; - } - // Include empty result with a message and relevant patient info - return [ - { - PatientID: result.args.PatientID, - PatientName: result.args.PatientName, - AccessionNumber: result.args.AccessionNumber, - Message: "No results found", - }, - ]; - }); - - const csvData = jsonToCSV(allData); - setExporting(false); - - if (csvData) { - // Create a blob - const blob = new Blob([csvData], { type: "text/csv;charset=utf-8;" }); - - // Create a link element - const link = document.createElement("a"); - link.href = URL.createObjectURL(blob); - link.download = "search_results.csv"; - - // Append the link to the document body and click it to trigger download - document.body.appendChild(link); - link.click(); - - // Remove the link element from the document - document.body.removeChild(link); - } - }; - - return ( - <div> - {fetchingResults.status && <SpinContainer title={fetchingResults.text} />} - {queryResult.length > 0 && ( - <div - style={{ - marginTop: "0.5em", - display: "flex", - justifyContent: "flex-end", - }} - > - <Button - size="sm" - variant="secondary" - icon={exporting ? <Spin /> : <DownloadIcon />} - onClick={() => exportAsCSV()} - style={{ marginLeft: 0 }} - > - {exporting ? "Exporting as CSV..." : "Export as CSV"} - </Button> - </div> - )} - {queryResult.length > 0 && - queryResult.map((result: any, index: number) => { - if (result && result.data.length > 0) { - return ( - <div - key={`result_${ - // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> - index - }`} - className="result-grid" - > - <PatientCard queryResult={result.data} /> - </div> - ); - } - return ( - <EmptyStateComponent - key={`result${ - // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> - index - }`} - title={`No results found for : ${result.args.PatientID} ${result.args.PatientName} ${result.args.AccessionNumber}`} - /> - ); - })} - {!fetchingResults.status && queryResult.length === 0 && ( - <EmptyStateComponent title="Please enter a search term to see results" /> - )} - </div> - ); -}; +import ChrisAPIClient from "../../api/chrisapiclient.ts"; +import PacsQRApp from "./app.tsx"; /** - * Selects the default PACS service (which is usually not the PACS service literally called "default"). - * - * 1. Selects the hard-coded "PACSDCM" - * 2. Attempts to select the first value which is not "default" (a useless, legacy pfdcm behavior) - * 3. Selects the first value + * Get a PFDCM client for the URL specified by the environment variable + * `VITE_PFDCM_URL`. */ -function getDefaultPacsService(services: ReadonlyArray<string>): string | null { - if (services.includes("PACSDCM")) { - return "PACSDCM"; - } - for (const service of services) { - if (service !== "default") { - return service; - } - } - if (services) { - return services[0]; - } - return null; +function getEnvPfdcmClient(): PfdcmClient { + const config = new PfdcmConfig({ + basePath: import.meta.env.VITE_PFDCM_URL, + }); + return new PfdcmClient(config); } + +const WrappedPacsQRApp = () => ( + <Wrapper> + <PacsQRApp + getChrisClient={ChrisAPIClient.getClient} + getPfdcmClient={getEnvPfdcmClient} + /> + </Wrapper> +); + +export default WrappedPacsQRApp; diff --git a/src/components/Pacs/pacs-copy.css b/src/components/Pacs/pacs-copy.css deleted file mode 100644 index 5aa12075d..000000000 --- a/src/components/Pacs/pacs-copy.css +++ /dev/null @@ -1,123 +0,0 @@ -.result-grid, -.patient-studies, -.patient-series { - margin-top: 1em; -} - - - -.patient-studies, -.patient-series { - padding: 1em 2em; - border-right: 0.5px solid lightgray; - border-left: 0.5px solid lightgray; -} - -.pf-v5-c-card__header-main { - flex: 1; - display: flex; - flex-flow: wrap; - justify-content: space-between; -} - -@media (min-width: 769px) { - .last-item-align { - text-align: right; - } -} - -.series-grid { - margin-top: 1rem; -} - -.flex-studies-item { - width: 18%; - margin-left: 0.5em; -} - -.button-with-margin { - margin-top: 0.25em; -} - -.flex-series-item { - width: 15%; - margin-left: 1em; -} - -.steps-container { - flex: 2; -} - -.flex-series-item.button-container { - flex: 1; - margin-left: 1.5em; -} - -@media (max-width: 600px) { - .flex-series-item { - width: 100%; /* Set full width for all elements on smaller screens */ - } - - .flex-series-item.steps-container { - flex: 1; /* Adjust the flex value for steps container on smaller screens */ - } - - .flex-series-item.button-container { - flex: 1; /* Adjust the flex value for button container on smaller screens */ - } -} - -.hide-content { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - - -.retrieve-progress { - .pf-v5-c-progress__description { - display:none !important; - } -} - - -.series-actions { - z-index:1; - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - display: flex; - justify-content: center; - align-items: center; - opacity: 0; - visibility: hiddem; - transition: opacity 0.3s, visibility 0.3s; -} - -.series-actions:hover { - z-index: 1; - opacity: 1; - visibility: visible; -} - -.action-button-container { - display: flex; - align-items: center; - flex-direction:column; -} - -.progress-active { - .pf-v5-c-progress__indicator{ - background-color: #BEE1F4 - } -} - -.progress-success{ - .pf-v5-c-progress__indicator{ - background-color:#0066CC; - } -} - - diff --git a/src/components/Pacs/pacs.tsx b/src/components/Pacs/pacs.tsx new file mode 100644 index 000000000..e4736692d --- /dev/null +++ b/src/components/Pacs/pacs.tsx @@ -0,0 +1,48 @@ +import LonkClient from "../../api/lonk"; +import FpClient from "../../api/fp/chrisapi.ts"; +import React from "react"; +import { PACSqueryCore } from "../../api/pfdcm"; +import PacsInput from "./components/input.tsx"; + +type PacsQRProps = { + lonkClient: LonkClient; + fpClient: FpClient; + services: ReadonlyArray<string>; + service: string; + setService: (service: string) => void; + pushError: (title: string) => (e: Error) => void; +}; + +/** + * PACS Query and Retrieve component. + * + * This component has a text input field for specifying a PACS query, + * and provides functionality for: + * + * - searching for DICOM studies and series + * - pulling DICOM series data into *ChRIS* + */ +const PacsQR: React.FC<PacsQRProps> = ({ + lonkClient, + fpClient, + services, + service, + setService, +}) => { + const [query, setQuery] = React.useState<PACSqueryCore>({}); + + return ( + <> + <PacsInput + query={query} + setQuery={setQuery} + services={services} + service={service} + setService={setService} + id="pacsqr-input" + /> + </> + ); +}; + +export default PacsQR; diff --git a/src/components/Pacs/pfdcmClient.tsx b/src/components/Pacs/pfdcmClient.tsx deleted file mode 100644 index bb5c50f9f..000000000 --- a/src/components/Pacs/pfdcmClient.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import type { AxiosRequestConfig } from "axios"; -import axios from "axios"; -import React from "react"; - -export interface ImageStatusType { - title: string; - description: string; - status: string; - icon?: React.ReactNode; -} - -export interface DataFetchQuery { - SeriesInstanceUID?: string; - StudyInstanceUID?: string; - AccessionNumber?: string; -} - -class PfdcmClient { - private readonly url: string; - - constructor() { - this.url = import.meta.env.VITE_PFDCM_URL + "/" || ""; - } - - async getPacsServices(): Promise<ReadonlyArray<string>> { - try { - if (!this.url) { - throw new Error( - "Failed to find a PFDCM Service. Please use the Pacs Query Retrieve at this link: http://chris-next.tch.harvard.edu:2222", - ); - } - - const url = `${this.url}api/v1/PACSservice/list/`; - const response = await axios.get(url); - return response.data; - // setting error as unknown for better type safety - } catch (error: unknown) { - throw error; - } - } - - async find(query: any, selectedPacsService: string) { - const RequestConfig: AxiosRequestConfig = { - url: `${this.url}api/v1/PACS/sync/pypx/`, - method: "POST", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - }, - data: { - PACSservice: { value: selectedPacsService }, - listenerService: { value: "default" }, - PACSdirective: query, - }, - }; - - try { - const response = (await axios(RequestConfig)).data; - - const { pypx, status } = response; - if (status) { - return pypx; - } - } catch (error: unknown) { - throw error; - } - } - - async findRetrieve(pacsService: string, query: DataFetchQuery) { - const RequestConfig: AxiosRequestConfig = { - url: `${this.url}api/v1/PACS/thread/pypx/`, - method: "POST", - timeout: 10000, //10s - timeoutErrorMessage: "Error Request Timeout out", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - }, - data: { - PACSservice: { - value: pacsService, - }, - listenerService: { value: "default" }, - PACSdirective: { - ...query, - withFeedBack: true, - then: "retrieve", - }, - }, - }; - - try { - const response = await axios(RequestConfig); - return response.data.timestamp; - } catch (error: unknown) { - throw error; - } - } -} -export default PfdcmClient; diff --git a/src/components/Pacs/useSettings.tsx b/src/components/Pacs/useSettings.tsx deleted file mode 100644 index 261a95668..000000000 --- a/src/components/Pacs/useSettings.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import ChrisAPIClient from "../../api/chrisapiclient"; -import { useTypedSelector } from "../../store/hooks"; - -const useSettings = () => { - async function fetchData(username?: string | null) { - const client = ChrisAPIClient.getClient(); - const path = `${username}/uploads/config`; - const pathList = await client.getFileBrowserPath(path); - - if (!pathList) { - return null; - } - - const files = await pathList.getFiles(); - const fileItems = files.getItems(); - - if (!fileItems) { - return null; - } - - try { - // Use Promise.all to wait for all async operations to complete - const fileContents = await Promise.all( - fileItems.map(async (_file) => { - const blob = await _file.getFileBlob(); - const reader = new FileReader(); - - // Use a Promise to wait for the reader.onload to complete - const readPromise = new Promise((resolve, reject) => { - reader.onload = (e) => { - try { - const value = e.target ? e.target.result : ("{}" as any); - const contents = JSON.parse(value); - resolve(contents); - } catch (parseError: any) { - // Handle JSON parsing error - reject(new Error(`Error parsing JSON: ${parseError.message}`)); - } - }; - }); - - reader.readAsText(blob); - - // Wait for the reader.onload to complete before moving to the next file - return await readPromise; - }), - ); - - return fileContents[0]; - } catch (error: any) { - throw new Error( - error.message || "An error occurred while processing files", - ); - } - } - - const username = useTypedSelector((state) => state.user.username); - - const { - isLoading, - data, - error, - isError, - }: { - isLoading: boolean; - data?: { - [key: string]: Record<string, boolean>; - }; - error: any; - isError: boolean; - } = useQuery({ - queryKey: ["metadata"], - queryFn: async () => await fetchData(username), - }); - - return { data, isLoading, error, isError }; -}; -export default useSettings; diff --git a/src/components/Wrapper/TitleComponent.tsx b/src/components/Wrapper/TitleComponent.tsx index 152624ba1..212993640 100644 --- a/src/components/Wrapper/TitleComponent.tsx +++ b/src/components/Wrapper/TitleComponent.tsx @@ -11,6 +11,7 @@ import { import { useFetchFeed } from "../Feeds/useFetchFeed"; import { useTypedSelector } from "../../store/hooks"; import { CodeBranchIcon } from "../Icons"; +import React from "react"; const FeedsNameComponent = () => { const { feedCount, loadingFeedState } = useFeedListData(); @@ -52,6 +53,19 @@ const FeedsDetailComponent = ({ id }: { id?: string }) => { ); }; +const PacsNameComponent = () => { + return ( + <Title level={4} style={{ marginBottom: 0 }}> + PACS Query and Retrieve + + ); +}; + +const TITLE_COMPONENTS: { [key: string]: () => React.ReactElement } = { + "/feeds": () => , + "/pacs": () => , +}; + const TitleComponent = () => { const location = useLocation(); @@ -62,7 +76,8 @@ const TitleComponent = () => { return ; } - return location.pathname === "/feeds" ? : null; + const titleFn = TITLE_COMPONENTS[location.pathname]; + return titleFn && titleFn(); }; export default TitleComponent; diff --git a/src/components/NiivueDatasetViewer/cssUtils.ts b/src/cssUtils.ts similarity index 100% rename from src/components/NiivueDatasetViewer/cssUtils.ts rename to src/cssUtils.ts diff --git a/vitest.config.ts b/vitest.config.ts index dcd990ac3..23ac111d4 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -7,6 +7,7 @@ export default mergeConfig( test: { include: ["src/**/*.{test,spec}.?(c|m)[jt]s?(x)"], environment: "happy-dom", + setupFiles: ["./vitest.setup.ts"], restoreMocks: true, // coverage for unit testing not enabled, because we have none! @@ -15,6 +16,16 @@ export default mergeConfig( // include: ["src/**"], // reportsDirectory: "./coverage-vitest", // }, + + server: { + deps: { + inline: [ + // workaround for 'Unknown file extension ".css"' + // See https://github.com/vitest-dev/vitest/discussions/6138 + "@patternfly/react-styles", + ], + }, + }, }, }), ); diff --git a/vitest.setup.ts b/vitest.setup.ts new file mode 100644 index 000000000..7c342c0ee --- /dev/null +++ b/vitest.setup.ts @@ -0,0 +1,10 @@ +// Copied from +// https://github.com/vitest-dev/vitest/blob/7d028cb37d3e964a37899559b640bcb3a13acda7/examples/react/vitest.setup.ts + +import '@testing-library/jest-dom/vitest' +import { cleanup } from '@testing-library/react' +import { afterEach } from 'vitest' + +afterEach(() => { + cleanup() +}) From 5991eda30ad60a4e6f6f869f5712afdf0651e2ed Mon Sep 17 00:00:00 2001 From: Jennings Zhang Date: Tue, 17 Sep 2024 17:39:51 -0400 Subject: [PATCH 205/337] Fix font styling conflict by antd App component --- src/App.tsx | 6 ++++-- src/app.css | 9 ++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 64dfe0630..3ddd573d1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -59,8 +59,10 @@ function App(props: AllProps) { }} > - - +
+ + +
diff --git a/src/app.css b/src/app.css index 825e3930a..80e1c8506 100644 --- a/src/app.css +++ b/src/app.css @@ -67,7 +67,7 @@ width: 20px; height: 20px; font-size:12px; - + } .large-button { @@ -83,3 +83,10 @@ justify-content: center !important; align-items: center !important; } + +.patternfly-font { + font-family: var(--pf-v5-global--FontFamily--text); + font-size: var(--pf-v5-global--FontSize--md); + line-height: var(--pf-v5-global--LineHeight--md); + font-weight: var(--pf-v5-global--FontWeight--normal); +} From a847ebc4b4ef0f05e5e2117370a2ff88d64d0a05 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 18 Sep 2024 10:12:09 -0400 Subject: [PATCH 206/337] refactor: Refactor the code for TitleComponent --- src/components/Common/index.tsx | 24 ++- src/components/ComputePage/index.tsx | 22 ++- src/components/Dashboard/index.tsx | 23 ++- src/components/DisplayPage/index.tsx | 26 +-- src/components/Feeds/FeedListView.tsx | 29 +++- src/components/Feeds/FeedView.tsx | 16 +- src/components/NewLibrary/index.tsx | 24 ++- src/components/PipelinesPage/index.tsx | 8 +- src/components/PluginCatalog/index.tsx | 25 ++- src/components/Store/index.tsx | 13 +- src/components/Wrapper/Header.tsx | 8 +- src/components/Wrapper/TitleComponent.tsx | 196 ---------------------- src/components/Wrapper/Toolbar.tsx | 8 +- src/components/Wrapper/index.tsx | 11 +- 14 files changed, 193 insertions(+), 240 deletions(-) delete mode 100644 src/components/Wrapper/TitleComponent.tsx diff --git a/src/components/Common/index.tsx b/src/components/Common/index.tsx index d2346b39e..e1a4b8053 100644 --- a/src/components/Common/index.tsx +++ b/src/components/Common/index.tsx @@ -20,6 +20,9 @@ import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; import { Alert, Popover, Spin, Typography } from "antd"; import React, { type ReactNode, useState } from "react"; import Dots from "react-activity/dist/Dots"; +import "react-activity/dist/library.css"; +import { Cookies } from "react-cookie"; +import ReactJson from "react-json-view"; import { ArchiveIcon, CubesIcon, @@ -32,9 +35,6 @@ import { InfoIcon as InfoIconComponent, SearchIcon, } from "../Icons"; -import "react-activity/dist/library.css"; -import { Cookies } from "react-cookie"; -import ReactJson from "react-json-view"; import "./common.css"; export const EmptyStateComponent = ({ title }: { title?: string }) => { @@ -435,3 +435,21 @@ export const TableEmptyState: React.FunctionComponent = ({
Data Library
); + +const { Paragraph } = Typography; + +// Component for displaying name and description +export const InfoSection: React.FC<{ + title: string; + content?: React.ReactNode; +}> = ({ title, content }) => ( + {content}} + /> +); diff --git a/src/components/ComputePage/index.tsx b/src/components/ComputePage/index.tsx index e8aa7376a..2f0455412 100644 --- a/src/components/ComputePage/index.tsx +++ b/src/components/ComputePage/index.tsx @@ -1,18 +1,32 @@ import { PageSection } from "@patternfly/react-core"; import React from "react"; -import { Typography } from "../Antd"; -import { InfoIcon } from "../Common"; +import { InfoSection } from "../Common"; import WrapperConnect from "../Wrapper"; import ComputeCatalog from "./ComputeCatalog"; -const { Paragraph } = Typography; +const TitleComponent = ( + + This page presents the available Compute environments that are + known to ChRIS. These denote computers and clusters/clouds that can be + selected to run various plugins and pipelines. The special{" "} + host environment is always available and is the actual server + that is running ChRIS. It is generally not recommended to run intensive + computation on the host environment. Adding new Compute to + ChRIS is typically enabled by using the separate ChRIS admin interface. + + } + /> +); const ComputePage = () => { React.useEffect(() => { document.title = "Compute Catalog"; }, []); return ( - + diff --git a/src/components/Dashboard/index.tsx b/src/components/Dashboard/index.tsx index 22c8d59ad..c2405164e 100644 --- a/src/components/Dashboard/index.tsx +++ b/src/components/Dashboard/index.tsx @@ -1,7 +1,9 @@ -import React from "react"; +import { CatalogTile } from "@patternfly/react-catalog-view-extension"; import { Grid, GridItem, PageSection } from "@patternfly/react-core"; +import React from "react"; +import BUILD_VERSION from "../../getBuildVersion"; +import { InfoSection } from "../Common"; import WrapperConnect from "../Wrapper"; -import { CatalogTile } from "@patternfly/react-catalog-view-extension"; import "./dashboard.css"; const DashboardPage = () => { @@ -9,8 +11,23 @@ const DashboardPage = () => { document.title = "Overview"; }, []); + const TitleComponent = ( + + Retrieve, analyze, and visualize any data using a powerful + cloud computing platform: ChRIS. Let's get started. +

+ Build: {BUILD_VERSION} +

+ + } + /> + ); + return ( - + diff --git a/src/components/DisplayPage/index.tsx b/src/components/DisplayPage/index.tsx index aa183f7d6..862ea2374 100644 --- a/src/components/DisplayPage/index.tsx +++ b/src/components/DisplayPage/index.tsx @@ -1,22 +1,22 @@ -import React from "react"; -import { PluginMeta } from "@fnndsc/chrisapi"; +import type { PluginMeta } from "@fnndsc/chrisapi"; import { - Pagination, - Grid, - TextInput, - GridItem, - Dropdown, - MenuToggle, - DropdownItem, - DropdownList, Badge, Card, CardBody, + Dropdown, + DropdownItem, + DropdownList, + Grid, + GridItem, + MenuToggle, + Pagination, Split, SplitItem, + TextInput, } from "@patternfly/react-core"; -import { Link } from "react-router-dom"; import { format } from "date-fns"; +import React from "react"; +import { Link } from "react-router-dom"; import { EmptyStateComponent, SpinContainer } from "../Common"; import { SearchIcon } from "../Icons"; import "./display-page.css"; @@ -101,8 +101,8 @@ const DisplayPage = ({ }: DisplayPageInterface) => { const { perPage, page, itemCount } = pageState; const [isDropdownOpen, setIsDropdownOpen] = React.useState(false); - const isPlugin = title === "Plugins" ? true : false; - const isCompute = title === "Compute" ? true : false; + const isPlugin = title === "Plugins"; + const isCompute = title === "Compute"; const [dropdownValue, setDropdownValue] = React.useState( isPlugin ? PluginQueryTypes.NAME[0] : ComputeQueryTypes.NAME[0], ); diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index bd8d6892d..b87d77ecb 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -14,8 +14,15 @@ import { type ToggleGroupItemProps, Tooltip, } from "@patternfly/react-core"; -import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; -import { SortByDirection } from "@patternfly/react-table"; +import { + SortByDirection, + Table, + Tbody, + Td, + Th, + Thead, + Tr, +} from "@patternfly/react-table"; import { useQueries } from "@tanstack/react-query"; import { format } from "date-fns"; import { debounce } from "lodash"; @@ -25,6 +32,7 @@ import { useNavigate } from "react-router"; import { useTypedSelector } from "../../store/hooks"; import { AddNodeProvider } from "../AddNode/context"; import { Typography } from "../Antd"; +import { InfoSection } from "../Common"; import CreateFeed from "../CreateFeed/CreateFeed"; import { CreateFeedProvider } from "../CreateFeed/context"; import { ThemeContext } from "../DarkTheme/useTheme"; @@ -227,8 +235,23 @@ const TableSelectable: React.FC = () => { ); }; + const feedCountText = + !feedCount && loadingFeedState + ? "Fetching..." + : feedCount === -1 + ? 0 + : feedCount; + const TitleComponent = ( + + ); + return ( - +
{ const drawerState = useTypedSelector((state) => state.drawers); @@ -141,8 +146,17 @@ const FeedView: React.FC = () => { ); + const TitleComponent = ( + + <CodeBranchIcon style={{ marginRight: "0.25em" }} /> + <Tooltip content={feed?.data.name}> + <span>{feed ? elipses(feed?.data.name, 40) : ""}</span> + </Tooltip> + + ); + return ( - + {contextHolder} { return null; } + // Library name component + + const TitleComponent = ( + + The Library provides a card-focused mechanism for browsing, viewing, + and interacting with data in the ChRIS system. A card is analogous to + a file or folder in a conventional filesystem, and multiple cards can + be grouped into a shopping cart to allow for bulk operations. Simply + long press and release a card to add it to the cart. Bulk operations + include: Download (which will copy all cart contents to your + local filesystem), Delete (which will permanently remove all + data in the cards from ChRIS), and Create which will seed a new + analysis with a new root node containing each card as a subdirectory. + + } + /> + ); + return ( - + { React.useEffect(() => { document.title = "Pipelines Catalog"; }, []); return ( - + }> diff --git a/src/components/PluginCatalog/index.tsx b/src/components/PluginCatalog/index.tsx index e2e82c717..84ddf68db 100644 --- a/src/components/PluginCatalog/index.tsx +++ b/src/components/PluginCatalog/index.tsx @@ -1,16 +1,37 @@ +import { PageSection } from "@patternfly/react-core"; import React from "react"; import WrapperConnect from "../Wrapper"; import PluginCatalog from "./PluginCatalog"; -import { PageSection } from "@patternfly/react-core"; import "./plugin-catalog.css"; +import { InfoSection } from "../Common"; const CatalogPage = () => { React.useEffect(() => { document.title = "Analysis Catalog"; }, []); + const TitleComponent = ( + + ChRIS is a platform that runs Plugins. A plugin is a single + application (similar to apps on a mobile device). Examples of + ChRIS Plugins are applications that analyze images (like{" "} + pl-fshack that runs + a neuro image analysis program called{" "} + FreeSurfer). Other{" "} + Plugins perform operations like zipping files, converting + medical images from DICOM to jpg, etc. On this page you can browse{" "} + Plugins available for you to use. For more options, consult the{" "} + ChRIS store. + + } + /> + ); + return ( - + diff --git a/src/components/Store/index.tsx b/src/components/Store/index.tsx index 2e2e9daeb..49b3b75f3 100644 --- a/src/components/Store/index.tsx +++ b/src/components/Store/index.tsx @@ -37,12 +37,13 @@ import { Alert, Spin, notification } from "../Antd"; import { SpinContainer } from "../Common"; import { CheckCircleIcon, SearchIcon } from "../Icons"; import "../SinglePlugin/singlePlugin.css"; -import WrapperConnect from "../Wrapper"; +import { InfoSection } from "../Common"; import { fetchPluginForMeta, fetchPluginMetas, handleInstallPlugin, } from "../PipelinesCopy/utils"; +import WrapperConnect from "../Wrapper"; const Store = () => { const isStaff = useTypedSelector((state) => state.user.isStaff); @@ -216,8 +217,16 @@ const Store = () => { } }, [handleInstallMutation.isSuccess, handleInstallMutation.isError, api]); + // Store catalog component + const TitleComponent = ( + + ); + return ( - + {contextHolder} void; + titleComponent?: React.ReactElement; } export default function Header(props: IHeaderProps) { @@ -24,7 +26,11 @@ export default function Header(props: IHeaderProps) { }; const pageToolbar = ( - + ); return ( diff --git a/src/components/Wrapper/TitleComponent.tsx b/src/components/Wrapper/TitleComponent.tsx deleted file mode 100644 index 474a24d85..000000000 --- a/src/components/Wrapper/TitleComponent.tsx +++ /dev/null @@ -1,196 +0,0 @@ -import { Tooltip } from "@patternfly/react-core"; -import { Typography } from "antd"; -import { matchPath, useLocation } from "react-router"; -import { elipses } from "../../api/common"; -import BUILD_VERSION from "../../getBuildVersion"; -import { useTypedSelector } from "../../store/hooks"; -import { InfoIcon } from "../Common"; -import { - useFeedListData, - useSearchQueryParams, -} from "../Feeds/useFeedListData"; -import { useFetchFeed } from "../Feeds/useFetchFeed"; -import { CodeBranchIcon } from "../Icons"; - -const { Paragraph, Title } = Typography; - -// Component for displaying name and description -const InfoSection: React.FC<{ title: string; content: React.ReactNode }> = ({ - title, - content, -}) => ( - {content}} - /> -); - -// Feeds name component -const FeedsNameComponent: React.FC = () => { - const { feedCount, loadingFeedState } = useFeedListData(); - const feedCountText = - !feedCount && loadingFeedState - ? "Fetching..." - : feedCount === -1 - ? 0 - : feedCount; - - return ( - - ); -}; - -// Library name component -const LibraryNameComponent: React.FC = () => ( - - The Library provides a card-focused mechanism for browsing, viewing, and - interacting with data in the ChRIS system. A card is analogous to a file - or folder in a conventional filesystem, and multiple cards can be - grouped into a shopping cart to allow for bulk operations. Simply long - press and release a card to add it to the cart. Bulk operations include:{" "} - Download (which will copy all cart contents to your local - filesystem), Delete (which will permanently remove all data in - the cards from ChRIS), and Create which will seed a new analysis - with a new root node containing each card as a subdirectory. - - } - /> -); - -// Overview name component -const OverviewNameComponent: React.FC = () => ( - - Retrieve, analyze, and visualize any data using a powerful cloud - computing platform: ChRIS. Let's get started. -

- Build: {BUILD_VERSION} -

- - } - /> -); - -// Plugin catalog component -const PluginCatalogComponent: React.FC = () => ( - - ChRIS is a platform that runs Plugins. A plugin is a single - application (similar to apps on a mobile device). Examples of - ChRIS Plugins are applications that analyze images (like{" "} - pl-fshack that runs a - neuro image analysis program called{" "} - FreeSurfer). Other{" "} - Plugins perform operations like zipping files, converting medical - images from DICOM to jpg, etc. On this page you can browse{" "} - Plugins available for you to use. For more options, consult the{" "} - ChRIS store. - - } - /> -); - -// Compute catalog component -const ComputeCatalogComponent: React.FC = () => ( - - This page presents the available Compute environments that are - known to ChRIS. These denote computers and clusters/clouds that can be - selected to run various plugins and pipelines. The special{" "} - host environment is always available and is the actual server - that is running ChRIS. It is generally not recommended to run intensive - computation on the host environment. Adding new Compute to - ChRIS is typically enabled by using the separate ChRIS admin interface. - - } - /> -); - -// Pipeline catalog component -const PipelineCatalogComponent: React.FC = () => ( - - Pipelines - -); - -// Store catalog component -const StoreCatalogComponent: React.FC = () => ( - -); - -// Configuration for path mappings -const pathToComponentMap: Record = { - "/feeds": FeedsNameComponent, - "/": OverviewNameComponent, - "/catalog": PluginCatalogComponent, - "/compute": ComputeCatalogComponent, - "/pipelines": PipelineCatalogComponent, - "/store": StoreCatalogComponent, -}; - -// Feeds detail component -const FeedsDetailComponent: React.FC<{ id?: string }> = ({ id }) => { - const query = useSearchQueryParams(); - const type = query.get("type"); - const isLoggedIn = useTypedSelector((state) => state.user.isLoggedIn); - - const { feed } = useFetchFeed(id, type, isLoggedIn); - - if (!feed) { - return null; - } - - return ( - - <CodeBranchIcon style={{ marginRight: "0.25em" }} /> - <Tooltip content={feed?.data.name}> - <span>{elipses(feed?.data.name, 40)}</span> - </Tooltip> - - ); -}; - -// Title component to dynamically map location to the appropriate component -const TitleComponent: React.FC = () => { - const location = useLocation(); - - // Check if the current location matches specific paths - const feedMatch = matchPath("/feeds/:id", location.pathname); - const libraryMatch = matchPath("/library/*", location.pathname); - - if (feedMatch) { - const { id } = feedMatch.params; - return ; - } - - if (libraryMatch) { - return ; - } - - const Component = pathToComponentMap[location.pathname]; - return Component ? : null; -}; - -export default TitleComponent; diff --git a/src/components/Wrapper/Toolbar.tsx b/src/components/Wrapper/Toolbar.tsx index e1255c86a..d39ee07e2 100644 --- a/src/components/Wrapper/Toolbar.tsx +++ b/src/components/Wrapper/Toolbar.tsx @@ -20,17 +20,17 @@ import { ThemeContext } from "../DarkTheme/useTheme"; import FeedDetails from "../FeedDetails"; import CartNotify from "./CartNotify"; import { clearCartOnLogout } from "../../store/cart/cartSlice"; -import TitleComponent from "./TitleComponent"; type ToolbarComponentProps = { showToolbar: boolean; + titleComponent?: React.ReactElement; token?: string | null; }; const ToolbarComponent: React.FC = ( props: ToolbarComponentProps, ) => { - const { token } = props; + const { token, titleComponent } = props; const dispatch = useDispatch(); const drawerState = useTypedSelector((state) => state.drawers); const fullScreen = drawerState?.preview.open && drawerState.preview.maximized; @@ -92,9 +92,7 @@ const ToolbarComponent: React.FC = ( width: "100%", }} > - - - + {titleComponent && titleComponent} {/* Center */} {props.showToolbar && !fullScreen && } diff --git a/src/components/Wrapper/index.tsx b/src/components/Wrapper/index.tsx index 68b92d932..612b09291 100644 --- a/src/components/Wrapper/index.tsx +++ b/src/components/Wrapper/index.tsx @@ -9,10 +9,11 @@ import { setIsNavOpen } from "../../store/ui/uiSlice"; type WrapperProps = { children: React.ReactElement[] | React.ReactElement; + titleComponent?: React.ReactElement; }; const Wrapper = (props: WrapperProps) => { - const { children } = props; + const { children, titleComponent } = props; const dispatch = useDispatch(); const { isNavOpen, sidebarActiveItem } = useTypedSelector( (state) => state.ui, @@ -47,7 +48,13 @@ const Wrapper = (props: WrapperProps) => { return ( } + header={ +
+ } sidebar={sidebar} > {" "} From bb5b3fdab5d282a15649e78573db4ec3b5522198 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 18 Sep 2024 14:29:36 -0400 Subject: [PATCH 207/337] feat: Rename Files, Folders and Links --- .../NewLibrary/components/ContextMenu.tsx | 6 +- .../NewLibrary/components/LibraryTable.tsx | 1 + .../NewLibrary/components/Operations.tsx | 6 +- .../NewLibrary/utils/useOperations.tsx | 86 ++++++++++++++----- 4 files changed, 75 insertions(+), 24 deletions(-) diff --git a/src/components/NewLibrary/components/ContextMenu.tsx b/src/components/NewLibrary/components/ContextMenu.tsx index c8cbbf61e..9152fd7d7 100644 --- a/src/components/NewLibrary/components/ContextMenu.tsx +++ b/src/components/NewLibrary/components/ContextMenu.tsx @@ -48,7 +48,6 @@ export const FolderContextMenu = (props: ContextMenuProps) => { key: "rename", label: "Rename", icon: , - disabled: !isFeedsTable, }, { key: "delete", label: "Delete", icon: }, ]; @@ -57,7 +56,10 @@ export const FolderContextMenu = (props: ContextMenuProps) => { <> setModalState({ isOpen: false, type: "" })} + onClose={() => { + handleModalSubmitMutation.reset(); + setModalState({ isOpen: false, type: "" }); + }} onSubmit={(inputValue, additionalValues) => handleModalSubmitMutation.mutate({ inputValue, diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 14881de07..a2be4e652 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -148,6 +148,7 @@ const BaseRow: React.FC = ({ additionalKeys: [computedPath], }} key={path} + computedPath={computedPath} > handleOperations(operationKey)} variant="tertiary" aria-label={ariaLabel} - isDisabled={operationKey === "rename" && !isFeedsTable} /> ); @@ -222,7 +221,10 @@ const Operations = ({ <> setModalState({ isOpen: false, type: "" })} + onClose={() => { + handleModalSubmitMutation.reset(); + setModalState({ isOpen: false, type: "" }); + }} onSubmit={(inputValue, additionalValues) => handleModalSubmitMutation.mutate({ inputValue, additionalValues }) } diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index 35007ccc1..e5a7120b3 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -1,5 +1,7 @@ import type { FileBrowserFolder, + FileBrowserFolderFile, + FileBrowserFolderLinkFile, FileBrowserFolderList, } from "@fnndsc/chrisapi"; import { useMutation } from "@tanstack/react-query"; @@ -169,30 +171,74 @@ export const useFolderOperations = ( } }; - const renameFolder = async (inputValue: string) => { + const renameFolder = async (inputValue: string): Promise => { handleOrigin(origin); - if (createFeed) { - // Renaming a feed - for (const { payload } of selectedPaths) { - try { - // This code is temporary - const fileName = getFolderName( - payload as FileBrowserFolder, - payload.data.path, - ); - const feed = await fetchFeedForPath(fileName); - if (feed) { - await feed.put({ - name: inputValue, - }); - } - } catch (error: any) { - const error_message = catchError(error).error_message; - throw new Error(error_message); + + for (const { payload, type } of selectedPaths) { + try { + if (createFeed) { + await handleFeedCreation(payload as FileBrowserFolder, inputValue); + } else { + await handlePathRename(payload, type, inputValue); } + } catch (error) { + handleRenameError(error); } - invalidateQueries(); } + + invalidateQueries(); + }; + + const handleFeedCreation = async ( + payload: FileBrowserFolder, + inputValue: string, + ): Promise => { + const fileName = getFolderName(payload, payload.data.path); + const feed = await fetchFeedForPath(fileName); + if (feed) { + await feed.put({ name: inputValue }); + } + }; + + const handlePathRename = async ( + payload: + | FileBrowserFolder + | FileBrowserFolderFile + | FileBrowserFolderLinkFile, + type: string, + inputValue: string, + ): Promise => { + const newPath = `${computedPath}/${inputValue}`; + switch (type) { + case "folder": + await (payload as FileBrowserFolder).put({ + //@ts-ignore + path: newPath, + }); + break; + case "file": + await (payload as FileBrowserFolderFile).put({ + new_file_path: newPath, + }); + break; + case "link": + await (payload as FileBrowserFolderLinkFile).put({ + new_link_file_path: newPath, + }); + break; + default: + throw new Error(`Unsupported type: ${type}`); + } + }; + + const handleRenameError = (error: any): void => { + if (error.response?.data) { + const { path, new_link_file_path, new_file_path } = error.response.data; + if (path) throw new Error(path[0]); + if (new_link_file_path) throw new Error(new_link_file_path[0]); + if (new_file_path) throw new Error(new_file_path); + } + throw error; // If it's not a known error, rethrow it }; const handleModalSubmit = async ( From fb1e3042065bce4ab37edb93ab52f28a215b5655 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 18 Sep 2024 15:12:19 -0400 Subject: [PATCH 208/337] feat: Update data fetching and error handling in the Library Table --- .../FeedOutputBrowser/FileBrowser.tsx | 13 +- .../NewLibrary/components/LibraryTable.tsx | 22 +- .../NewLibrary/components/Operations.tsx | 2 +- src/components/NewLibrary/index.tsx | 207 ++++++++---------- .../NewLibrary/utils/useOperations.tsx | 8 +- 5 files changed, 122 insertions(+), 130 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 95dc6f85c..d997430b0 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -183,6 +183,11 @@ const FileBrowser = (props: FileBrowserProps) => { ); + const origin = { + type: OperationContext.FILEBROWSER, + additionalKeys: [additionalKey], + }; + return ( {contextHolder} @@ -205,10 +210,7 @@ const FileBrowser = (props: FileBrowserProps) => { @@ -268,6 +270,7 @@ const FileBrowser = (props: FileBrowserProps) => { !drawerState.preview.open && dispatch(setFilePreviewPanel()); }} + origin={origin} /> ); })} @@ -289,6 +292,7 @@ const FileBrowser = (props: FileBrowserProps) => { handleFileClick={() => { handleFileClick(resource.data.path); }} + origin={origin} /> ); }, @@ -311,6 +315,7 @@ const FileBrowser = (props: FileBrowserProps) => { handleFileClick={() => { return; }} + origin={origin} /> ); })} diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index a2be4e652..4b70395b4 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -69,6 +69,10 @@ interface RowProps { computedPath: string; handleFolderClick: () => void; handleFileClick: () => void; + origin: { + type: OperationContext; + additionalKeys: string[]; + }; } const BaseRow: React.FC = ({ @@ -82,6 +86,7 @@ const BaseRow: React.FC = ({ computedPath, handleFolderClick, handleFileClick, + origin, }) => { const { handlers } = useLongPress(); const { handleOnClick, handleCheckboxChange } = handlers; @@ -142,14 +147,7 @@ const BaseRow: React.FC = ({ : resource.data.fname; return ( - + = ({ } }; + const origin = { + type: OperationContext.LIBRARY, + additionalKeys: [computedPath], + }; + return ( = ({ handleFileClick={() => { return; }} + origin={origin} /> ))} {data.files.map((resource: FileBrowserFolderFile, index) => ( @@ -381,6 +385,7 @@ const LibraryTable: React.FC = ({ handleFileClick={() => { handleFileClick(resource); }} + origin={origin} /> ))} {data.linkFiles.map((resource: FileBrowserFolderLinkFile, index) => ( @@ -399,6 +404,7 @@ const LibraryTable: React.FC = ({ handleFileClick={() => { navigate(resource.data.path); }} + origin={origin} /> ))} diff --git a/src/components/NewLibrary/components/Operations.tsx b/src/components/NewLibrary/components/Operations.tsx index f8b474196..42f955c30 100644 --- a/src/components/NewLibrary/components/Operations.tsx +++ b/src/components/NewLibrary/components/Operations.tsx @@ -428,7 +428,7 @@ export const AddModal = ({ )} {indicators.isError && ( - throw e; + errorMessages.push("Failed to load folder list."); + return { errorMessages }; // return errors in case the request fails entirely } } const NewLibrary = () => { + const [api, contextHolder] = notification.useNotification(); const { pathname } = useLocation(); const navigate = useNavigate(); const [pageNumber, setPageNumber] = useState(1); @@ -107,7 +127,7 @@ const NewLibrary = () => { structuralSharing: true, }); - // Redirect to /library/home/username if the pathname is /library and this is the first load of the page + // Redirect to /library/home/username if the pathname is /library and this is the first load of the page useEffect(() => { if (isFirstLoad && pathname === "/library") { navigate(`/library/home/${username}`, { replace: true }); @@ -115,53 +135,38 @@ const NewLibrary = () => { } }, [isFirstLoad, pathname, username, navigate]); - const fetchMore = - data?.foldersPagination.hasNextPage || - data?.filesPagination.hasNextPage || - data?.linksPagination.hasNextPage; - - // Set up an intersection observer to load more data when the user scrolls to the bottom of the page + // Show error notifications useEffect(() => { - const observer = new IntersectionObserver( - (entries) => { - if (entries[0].isIntersecting && fetchMore) { - handlePagination(); - } - }, - { threshold: 0.5 }, - ); - - if (observerTarget.current) { - observer.observe(observerTarget.current); + if (data?.errorMessages && data.errorMessages.length > 0) { + data.errorMessages.forEach((msg: string) => { + api.error({ + message: "Error", + description: msg, + }); + }); } + }, [data?.errorMessages]); - return () => { - if (observerTarget.current) { - observer.unobserve(observerTarget.current); - } - }; - }, [fetchMore]); + const fetchMore = + data?.foldersPagination?.hasNextPage || + data?.filesPagination?.hasNextPage || + data?.linksPagination?.hasNextPage; - // Debounce the folder click event to avoid multiple clicks const handleFolderClick = debounce((folder: string) => { const url = `${decodedPath}/${folder}`; navigate(url); }, 500); - // Handle pagination by incrementing the page number const handlePagination = () => { setPageNumber((prevState) => prevState + 1); }; const observerTarget = useRef(null); - // Prevent initial render if redirecting if (isFirstLoad && pathname === "/library") { return null; } - // Library name component - const TitleComponent = ( { The Library provides a card-focused mechanism for browsing, viewing, and interacting with data in the ChRIS system. A card is analogous to a file or folder in a conventional filesystem, and multiple cards can - be grouped into a shopping cart to allow for bulk operations. Simply - long press and release a card to add it to the cart. Bulk operations - include: Download (which will copy all cart contents to your - local filesystem), Delete (which will permanently remove all - data in the cards from ChRIS), and Create which will seed a new - analysis with a new root node containing each card as a subdirectory. + be grouped into a shopping cart to allow for bulk operations. } /> @@ -183,11 +183,8 @@ const NewLibrary = () => { return ( - + {contextHolder} + { }} computedPath={computedPath} folderList={data?.folderList} - customStyle={{ toolbarItem: { paddingInlineStart: "0" } }} /> - { @@ -210,14 +205,12 @@ const NewLibrary = () => { {isFetching && } {isError && } - {/* Render based on currentLayout */} {currentLayout === "list" ? ( <> - {data && - data.subFoldersMap.length === 0 && - data.linkFilesMap.length === 0 && - data.filesMap.length === 0 ? ( + {data?.subFoldersMap?.length === 0 && + data?.linkFilesMap?.length === 0 && + data?.filesMap?.length === 0 ? ( ) : ( <> @@ -231,7 +224,6 @@ const NewLibrary = () => { computedPath={computedPath} fetchMore={fetchMore} handlePagination={handlePagination} - filesLoading={isFetching} /> {fetchMore && !isFetching && ( )}
)} ) : ( - <> - {data && - data.subFoldersMap.length === 0 && - data.linkFilesMap.length === 0 && - data.filesMap.length === 0 ? ( - - ) : ( - - - - - {fetchMore && !isFetching && ( - - )} -
- + + + + + {fetchMore && !isFetching && ( + )} - +
+ )} diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index e5a7120b3..68a5e88dc 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -8,8 +8,9 @@ import { useMutation } from "@tanstack/react-query"; import { useRef, useState } from "react"; import { useDispatch } from "react-redux"; import ChrisAPIClient from "../../../api/chrisapiclient"; -import { catchError, getFileName } from "../../../api/common"; +import { getFileName } from "../../../api/common"; import { + clearSelectedPaths, setToggleCart, startAnonymize, startDownload, @@ -209,6 +210,8 @@ export const useFolderOperations = ( inputValue: string, ): Promise => { const newPath = `${computedPath}/${inputValue}`; + const oldPath = type === "folder" ? payload.data.path : payload.data.fname; + switch (type) { case "folder": await (payload as FileBrowserFolder).put({ @@ -229,6 +232,7 @@ export const useFolderOperations = ( default: throw new Error(`Unsupported type: ${type}`); } + dispatch(clearSelectedPaths(oldPath)); }; const handleRenameError = (error: any): void => { @@ -238,7 +242,7 @@ export const useFolderOperations = ( if (new_link_file_path) throw new Error(new_link_file_path[0]); if (new_file_path) throw new Error(new_file_path); } - throw error; // If it's not a known error, rethrow it + throw new Error("Failed to rename this folder"); // If it's not a known error, rethrow it }; const handleModalSubmit = async ( From d44f3874087c8544523ecb6575d24bcb541a59d3 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Thu, 19 Sep 2024 08:57:14 -0400 Subject: [PATCH 209/337] feat: Update the renaming of files and folders in the card view --- src/components/NewLibrary/components/FileCard.tsx | 3 ++- src/components/NewLibrary/components/FolderCard.tsx | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/NewLibrary/components/FileCard.tsx b/src/components/NewLibrary/components/FileCard.tsx index eaa0a3513..068c80e58 100644 --- a/src/components/NewLibrary/components/FileCard.tsx +++ b/src/components/NewLibrary/components/FileCard.tsx @@ -56,6 +56,7 @@ type ComponentProps = { const PresentationComponent: React.FC = ({ name, origin, + computedPath, date, onClick, onNavigate, @@ -67,7 +68,7 @@ const PresentationComponent: React.FC = ({ bgRow, }) => ( - + = (props) => { type: OperationContext.LIBRARY, additionalKeys: [computedPath], }} + computedPath={computedPath} > Date: Thu, 19 Sep 2024 09:06:18 -0400 Subject: [PATCH 210/337] refactor: Cleanup --- src/components/FeedOutputBrowser/FileBrowser.tsx | 6 +++--- src/components/FeedOutputBrowser/types.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index d997430b0..27c73910b 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -248,7 +248,7 @@ const FileBrowser = (props: FileBrowserProps) => { - {filesMap.map((resource: FileBrowserFolderFile, index) => { + {filesMap?.map((resource: FileBrowserFolderFile, index) => { return ( { /> ); })} - {linkFilesMap.map( + {linkFilesMap?.map( (resource: FileBrowserFolderLinkFile, index) => { return ( { }, )} - {subFoldersMap.map((resource: FileBrowserFolder, index) => { + {subFoldersMap?.map((resource: FileBrowserFolder, index) => { return ( Date: Thu, 19 Sep 2024 09:23:30 -0400 Subject: [PATCH 211/337] feat: Update download saga to remove hard coded lookup for zip file --- src/store/cart/downloadSaga.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/store/cart/downloadSaga.ts b/src/store/cart/downloadSaga.ts index 2f9d68e36..5bfa2daf6 100644 --- a/src/store/cart/downloadSaga.ts +++ b/src/store/cart/downloadSaga.ts @@ -179,7 +179,12 @@ function* downloadFolder( if (!fileItems) { throw new Error("Failed to find the zip file"); } - const fileToZip = fileItems[0]; + const fileToZip = fileItems.find((file) => + file.data.fname.endsWith(".zip"), + ); + if (!fileToZip) { + throw new Error("Failed to find a .zip file in the folder"); + } yield downloadFile(fileToZip); } else { throw new Error(`Failed to find a folder for this path: ${filePath}`); From c375e6d2f2f4b9e290ce41e79081fdf377f4aff9 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Thu, 19 Sep 2024 09:46:22 -0400 Subject: [PATCH 212/337] refactor: Cleanup code --- src/components/CreateFeed/BasicInformation.tsx | 11 +++-------- .../SinglePlugin/PluginCatalogComponents.tsx | 10 +++------- src/components/SinglePlugin/index.tsx | 3 ++- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/components/CreateFeed/BasicInformation.tsx b/src/components/CreateFeed/BasicInformation.tsx index ff2599480..6da03d8c2 100644 --- a/src/components/CreateFeed/BasicInformation.tsx +++ b/src/components/CreateFeed/BasicInformation.tsx @@ -1,10 +1,5 @@ -import React, { - useState, - useEffect, - useContext, - useRef, - useCallback, -} from "react"; +import type React from "react"; +import { useState, useEffect, useContext, useRef, useCallback } from "react"; import { Form, FormGroup, @@ -14,7 +9,7 @@ import { } from "@patternfly/react-core"; import { Typeahead } from "react-bootstrap-typeahead"; import { CreateFeedContext } from "./context"; -import { Tag } from "@fnndsc/chrisapi"; +import type { Tag } from "@fnndsc/chrisapi"; import { Types } from "./types/feed"; import { fetchTagList } from "./utils"; diff --git a/src/components/SinglePlugin/PluginCatalogComponents.tsx b/src/components/SinglePlugin/PluginCatalogComponents.tsx index 44f97d1dd..5c7c09648 100644 --- a/src/components/SinglePlugin/PluginCatalogComponents.tsx +++ b/src/components/SinglePlugin/PluginCatalogComponents.tsx @@ -1,4 +1,4 @@ -import { Plugin, PluginInstance, PluginMeta } from "@fnndsc/chrisapi"; +import type { Plugin, PluginInstance, PluginMeta } from "@fnndsc/chrisapi"; import { ActionGroup, Badge, @@ -145,9 +145,7 @@ export const DropdownPluginVersions = ({ key={plugin.data.id} name={plugin.data.version} value={plugin.data.version} - autoFocus={ - plugin.data.version === parameterPayload?.version ? true : false - } + autoFocus={plugin.data.version === parameterPayload?.version} > {plugin.data.version} @@ -293,9 +291,7 @@ export const HeaderCardPlugin = ({ Resources}> {parameterPayload && ( - <> - - + )} diff --git a/src/components/SinglePlugin/index.tsx b/src/components/SinglePlugin/index.tsx index 99164587b..0fea0ed7a 100644 --- a/src/components/SinglePlugin/index.tsx +++ b/src/components/SinglePlugin/index.tsx @@ -170,6 +170,8 @@ const SinglePlugin = () => { {isLoading || isFetching ? ( + ) : isError ? ( + ) : data ? ( <> @@ -185,7 +187,6 @@ const SinglePlugin = () => { ) : ( )} - {isError && } ); }; From d689af0003fc806ca451629e4a32a5b241a82398 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Thu, 19 Sep 2024 10:07:02 -0400 Subject: [PATCH 213/337] feat: Disallow folder uploads when the file upload option is selected --- .../NewLibrary/utils/useOperations.tsx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/components/NewLibrary/utils/useOperations.tsx b/src/components/NewLibrary/utils/useOperations.tsx index 68a5e88dc..dde51ca2a 100644 --- a/src/components/NewLibrary/utils/useOperations.tsx +++ b/src/components/NewLibrary/utils/useOperations.tsx @@ -26,6 +26,7 @@ import { type OriginState, useOperationsContext } from "../context"; import useDeletePayload from "../utils/useDeletePayload"; import { fetchFeedForPath } from "./longpress"; import useFeedOperations from "./useFeedOperations"; +import { isEmpty } from "lodash"; export interface ModalState { type: string; @@ -83,16 +84,27 @@ export const useFolderOperations = ( isFolder: boolean, name?: string, ) => { + // Process the origin data if applicable handleOrigin(origin); + // Convert selected files to an array for easier manipulation const files = Array.from(event.target.files || []); + // Check if the input is a file selection, but a folder was mistakenly uploaded + if (!isFolder && files.length > 0 && isEmpty(files[0].type)) { + alert( + "Folder selection is not allowed in file upload mode. Please select files only.", + ); + resetInputField(fileInputRef); // Clean up file input + return; + } + // Generate a unique name based on the timestamp and the provided name (if any) const uniqueName = name ? `${name}_${getCurrentTimestamp()}` : getCurrentTimestamp(); - + // Determine the upload path based on the user's preferences (creating a new feed or using an existing path) const uploadPath = createFeed ? `home/${username}/uploads/${uniqueName}` : computedPath; - + // Dispatch the upload action with all relevant details dispatch( startUpload({ files, @@ -103,7 +115,7 @@ export const useFolderOperations = ( nameForFeed: name, }), ); - + // Reset the input field after each upload to allow for subsequent uploads resetInputField(isFolder ? folderInputRef : fileInputRef); }; From a79c0467f51b455ad4f3ce016e241b1915962795 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Thu, 19 Sep 2024 10:29:39 -0400 Subject: [PATCH 214/337] refactor: Cleanup --- .../NewLibrary/components/LibraryTable.tsx | 34 +++---------------- .../utils/useNewResourceHighlight.tsx | 33 ++++++++++++++++++ 2 files changed, 38 insertions(+), 29 deletions(-) create mode 100644 src/components/NewLibrary/utils/useNewResourceHighlight.tsx diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 4b70395b4..23a9f5e5a 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -17,8 +17,8 @@ import { Tr, } from "@patternfly/react-table"; import { Drawer, Tag } from "antd"; -import { differenceInSeconds, format } from "date-fns"; -import React, { useContext, useEffect, useRef, useState } from "react"; +import { format } from "date-fns"; +import React, { useContext, useState } from "react"; import { useNavigate } from "react-router"; import { useTypedSelector } from "../../../store/hooks"; import { getIcon } from "../../Common"; @@ -30,6 +30,7 @@ import useLongPress, { getBackgroundRowColor, useAssociatedFeed, } from "../utils/longpress"; +import useNewResourceHighlight from "../utils/useNewResourceHighlight"; import { FolderContextMenu } from "./ContextMenu"; import { getFileName, getLinkFileName } from "./FileCard"; import { getFolderName } from "./FolderCard"; @@ -92,28 +93,7 @@ const BaseRow: React.FC = ({ const { handleOnClick, handleCheckboxChange } = handlers; const selectedPaths = useTypedSelector((state) => state.cart.selectedPaths); const isDarkTheme = useContext(ThemeContext).isDarkTheme; - const rowRef = useRef(null); // Create a ref for the row - - const secondsSinceCreation = differenceInSeconds(new Date(), new Date(date)); - const [isNewResource, setIsNewResource] = useState( - secondsSinceCreation <= 15, - ); - - useEffect(() => { - if (isNewResource && rowRef.current) { - rowRef.current.scrollIntoView({ - behavior: "smooth", - block: "center", - }); - - const timeoutId = setTimeout(() => { - setIsNewResource(false); - }, 10000); - - return () => clearTimeout(timeoutId); - } - }, [isNewResource]); - + const { isNewResource, scrollToNewResource } = useNewResourceHighlight(date); const isSelected = selectedPaths.length > 0 && selectedPaths.some((payload) => { @@ -124,13 +104,11 @@ const BaseRow: React.FC = ({ return payload.path === resource.data.fname; } }); - const shouldHighlight = isNewResource || isSelected; const highlightedBgRow = getBackgroundRowColor(shouldHighlight, isDarkTheme); const icon = getIcon(type, isDarkTheme, { marginRight: "0.5em", }); - const handleItem = () => { if (type === "folder") { handleFolderClick(); @@ -140,16 +118,14 @@ const BaseRow: React.FC = ({ handleFileClick(); } }; - const path = type === "folder" || type === "link" ? resource.data.path : resource.data.fname; - return ( { e.stopPropagation(); diff --git a/src/components/NewLibrary/utils/useNewResourceHighlight.tsx b/src/components/NewLibrary/utils/useNewResourceHighlight.tsx new file mode 100644 index 000000000..ca6525822 --- /dev/null +++ b/src/components/NewLibrary/utils/useNewResourceHighlight.tsx @@ -0,0 +1,33 @@ +import { useRef, useState, useEffect } from "react"; +import { differenceInSeconds } from "date-fns"; + +// Custom hook to handle new resource highlighting +const useNewResourceHighlight = (creationDate: string) => { + const rowRef = useRef(null); + const secondsSinceCreation = differenceInSeconds( + new Date(), + new Date(creationDate), + ); + const [isNewResource, setIsNewResource] = useState( + secondsSinceCreation <= 15, + ); + + useEffect(() => { + if (isNewResource && rowRef.current) { + rowRef.current.scrollIntoView({ + behavior: "smooth", + block: "center", + }); + + const timeoutId = setTimeout(() => { + setIsNewResource(false); + }, 10000); + + return () => clearTimeout(timeoutId); + } + }, [isNewResource]); + + return { isNewResource, scrollToNewResource: rowRef }; +}; + +export default useNewResourceHighlight; From bd7e31f4bde3d1f39e19b9f897851be13301b13a Mon Sep 17 00:00:00 2001 From: Chuan-Heng Hsiao Date: Fri, 20 Sep 2024 16:16:32 -0400 Subject: [PATCH 215/337] staging with tag --- .github/workflows/build.yml | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7b48e9ad8..6fe274938 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,7 +2,7 @@ name: build on: push: - branches: [ master ] + branches: [ master, staging ] jobs: build: @@ -36,14 +36,25 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Get postfix of latest + id: postfix_of_latest + run: | + if [[ $GITHUB_REF_TYPE == tag || $GITHUB_REF_NAME == master ]]; then + echo "Postfix of latest: ''" + echo "postfix_of_latest=" >> $GITHUB_OUTPUT + else + echo "Postfix of latest: -$GITHUB_REF_NAME" + echo "postfix_of_latest=-$GITHUB_REF_NAME" >> $GITHUB_OUTPUT + fi + - name: Build and push uses: docker/build-push-action@v5 with: tags: | - docker.io/fnndsc/chris_ui:latest - docker.io/fnndsc/chris_ui:${{ steps.info.outputs.version_string }} - ghcr.io/fnndsc/chris_ui:latest - ghcr.io/fnndsc/chris_ui:${{ steps.info.outputs.version_string }} + docker.io/fnndsc/chris_ui:latest${{ steps.postfix_of_latest.outputs.postfix_of_latest}} + docker.io/fnndsc/chris_ui:${{ steps.info.outputs.version_string }}${{ steps.postfix_of_latest.outputs.postfix_of_latest}} + ghcr.io/fnndsc/chris_ui:latest${{ steps.postfix_of_latest.outputs.postfix_of_latest}} + ghcr.io/fnndsc/chris_ui:${{ steps.info.outputs.version_string }}${{ steps.postfix_of_latest.outputs.postfix_of_latest}} context: . file: ./Dockerfile platforms: linux/amd64 From 0419bb7a7d2a94439ab7c21dc41bfb3de32684a7 Mon Sep 17 00:00:00 2001 From: Jennings Zhang Date: Fri, 20 Sep 2024 21:50:28 -0400 Subject: [PATCH 216/337] Change LonkClient to accept handlers via init --- src/api/fp/chrisapi.ts | 19 ++---- src/api/lonk/client.test.ts | 12 ++-- src/api/lonk/client.ts | 48 +++++++++----- src/components/Pacs/app.tsx | 66 +++++++------------ .../Pacs/components/PacsStudies.tsx | 13 ++++ src/components/Pacs/components/input.tsx | 3 +- src/components/Pacs/pacs.tsx | 45 ++++++++++--- 7 files changed, 116 insertions(+), 90 deletions(-) create mode 100644 src/components/Pacs/components/PacsStudies.tsx diff --git a/src/api/fp/chrisapi.ts b/src/api/fp/chrisapi.ts index b860d1651..93d6a1b7f 100644 --- a/src/api/fp/chrisapi.ts +++ b/src/api/fp/chrisapi.ts @@ -9,7 +9,7 @@ import Client, { import * as TE from "fp-ts/TaskEither"; import * as E from "fp-ts/Either"; import { pipe } from "fp-ts/function"; -import LonkClient, { LonkHandlers } from "../lonk"; +import LonkClient from "../lonk"; /** * fp-ts friendly wrapper for @fnndsc/chrisapi @@ -128,14 +128,11 @@ class FpClient { * * https://chrisproject.org/docs/oxidicom/lonk-ws */ - public connectPacsNotifications({ - onDone, - onProgress, - onError, - timeout, - }: LonkHandlers & { timeout?: number }): TE.TaskEither { + public connectPacsNotifications( + ...args: Parameters + ): TE.TaskEither { return pipe( - this.createDownloadToken(timeout), + this.createDownloadToken(...args), TE.flatMap((downloadToken) => { const url = getWebsocketUrl(downloadToken); let callback: ((c: E.Either) => void) | null = null; @@ -143,11 +140,7 @@ class FpClient { (resolve) => (callback = resolve), ); const ws = new WebSocket(url); - ws.onopen = () => - callback && - callback( - E.right(new LonkClient({ ws, onDone, onProgress, onError })), - ); + ws.onopen = () => callback && callback(E.right(new LonkClient(ws))); ws.onerror = (_ev) => callback && callback( diff --git a/src/api/lonk/client.test.ts b/src/api/lonk/client.test.ts index ec6d828b2..e6f746f35 100644 --- a/src/api/lonk/client.test.ts +++ b/src/api/lonk/client.test.ts @@ -8,7 +8,9 @@ test("LonkClient", async () => { onProgress: vi.fn(), onError: vi.fn(), }; - const [server, client] = await createMockubeWs(handlers); + const [server, client] = await createMockubeWs(32585); + client.init(handlers); + const SeriesInstanceUID = "1.234.56789"; const pacs_name = "MyPACS"; @@ -89,13 +91,11 @@ test("LonkClient", async () => { /** * Create a mock WebSockets server and client. */ -async function createMockubeWs( - handlers: LonkHandlers, -): Promise<[WS, LonkClient]> { - const url = "ws://localhost:32585"; +async function createMockubeWs(port: number): Promise<[WS, LonkClient]> { + const url = `ws://localhost:${port}`; const server = new WS(url, { jsonProtocol: true }); const ws = new WebSocket(url); - const client = new LonkClient({ ws, ...handlers }); + const client = new LonkClient(ws); let callback: null | (([server, client]: [WS, LonkClient]) => void) = null; const promise: Promise<[WS, LonkClient]> = new Promise((resolve) => { diff --git a/src/api/lonk/client.ts b/src/api/lonk/client.ts index 1c5a4f0ba..0784b36f0 100644 --- a/src/api/lonk/client.ts +++ b/src/api/lonk/client.ts @@ -10,7 +10,6 @@ import { import deserialize from "./de.ts"; import { pipe } from "fp-ts/function"; import * as E from "fp-ts/Either"; -import * as T from "fp-ts/Task"; import SeriesMap from "./seriesMap.ts"; /** @@ -20,26 +19,33 @@ import SeriesMap from "./seriesMap.ts"; class LonkClient { private readonly ws: WebSocket; private readonly pendingSubscriptions: SeriesMap SeriesKey)>; + private handlers: LonkHandlers | null; - public constructor({ - ws, - onDone, - onProgress, - onError, - }: LonkHandlers & { ws: WebSocket }) { + public constructor(ws: WebSocket) { + this.handlers = null; this.pendingSubscriptions = new SeriesMap(); this.ws = ws; this.ws.onmessage = (msg) => { pipe( msg.data, deserialize, - E.map((data) => - this.routeMessage({ data, onDone, onProgress, onError }), - ), + E.map((data) => this.routeMessage(data)), ); }; } + /** + * Configure this client with event handler functions. + * `init` must be called exactly once. + */ + public init(handlers: LonkHandlers): LonkClient { + if (this.handlers) { + throw new Error("LonkClient.init called more than once."); + } + this.handlers = handlers; + return this; + } + /** * Subscribe to notifications for a series. */ @@ -61,12 +67,11 @@ class LonkClient { return callbackTask; } - private routeMessage({ - data, - onDone, - onProgress, - onError, - }: LonkHandlers & { data: Lonk }) { + private routeMessage(data: Lonk) { + if (this.handlers === null) { + throw new Error("LonkClient.init has not been called yet."); + } + const { onProgress, onDone, onError } = this.handlers; const { SeriesInstanceUID, pacs_name, message } = data; // note: for performance reasons, this if-else chain is in // descending order of case frequency. @@ -102,11 +107,20 @@ class LonkClient { } /** - * Close the websocket. + * Close the WebSocket. */ public close() { this.ws.close(); } + + /** + * Set the WebSocket's `close` event listener. + * + * https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close_event + */ + public set onclose(onclose: WebSocket["onclose"]) { + this.ws.onclose = onclose; + } } function isSubscribed(msg: { [key: string]: any }): msg is LonkSubscription { diff --git a/src/components/Pacs/app.tsx b/src/components/Pacs/app.tsx index bb6fceeaa..472bcac9a 100644 --- a/src/components/Pacs/app.tsx +++ b/src/components/Pacs/app.tsx @@ -42,13 +42,18 @@ const PacsQRApp: React.FC<{ getPfdcmClient: () => PfdcmClient; getChrisClient: () => Client; }> = ({ getChrisClient, getPfdcmClient }) => { + /** + * List of PACS server names which can be queried. + */ const [services, setServices] = React.useState>([]); - const [service, setService] = React.useState(null); const [lonkClient, setLonkClient] = React.useState(null); const [error, setError] = React.useState(null); - const { message, notification, modal } = App.useApp(); + const { notification } = App.useApp(); + /** + * Show a notification for an error message. + */ const pushError = React.useMemo(() => { return (title: string) => { return (e: Error) => { @@ -63,13 +68,6 @@ const PacsQRApp: React.FC<{ }; }, [notification]); - const pfdcmClient = React.useMemo(getPfdcmClient, [getPfdcmClient]); - const chrisClient = React.useMemo(getChrisClient, [getChrisClient]); - - const fpClient = React.useMemo(() => { - return new FpClient(chrisClient); - }, [chrisClient]); - /** * Show an error screen with the error's message. * @@ -77,6 +75,13 @@ const PacsQRApp: React.FC<{ */ const failWithError = TE.mapLeft((e: Error) => setError(e.message)); + const pfdcmClient = React.useMemo(getPfdcmClient, [getPfdcmClient]); + const chrisClient = React.useMemo(getChrisClient, [getChrisClient]); + const fpClient = React.useMemo( + () => new FpClient(chrisClient), + [chrisClient], + ); + React.useEffect(() => { document.title = "ChRIS PACS"; }, []); @@ -85,25 +90,22 @@ const PacsQRApp: React.FC<{ const getServicesPipeline = pipe( pfdcmClient.getPacsServices(), failWithError, - TE.map((services) => { - setServices(services); - const defaultService = getDefaultPacsService(services); - defaultService && setService(defaultService); - }), + TE.map(setServices), ); getServicesPipeline(); }, [pfdcmClient, pushError]); React.useEffect(() => { let lonkClientRef: LonkClient | null = null; - - const onDone = () => {}; // TODO - const onProgress = () => {}; // TODO - const onError = () => {}; // TODO const connectWsPipeline = pipe( - fpClient.connectPacsNotifications({ onDone, onProgress, onError }), + fpClient.connectPacsNotifications(), failWithError, TE.map((client) => (lonkClientRef = client)), + TE.map((client) => { + client.onclose = () => + setError("WebSocket closed, please refresh the page."); + return client; + }), TE.map(setLonkClient), ); connectWsPipeline(); @@ -115,13 +117,11 @@ const PacsQRApp: React.FC<{ {error !== null ? ( {error} - ) : services && service && lonkClient ? ( + ) : services && lonkClient ? ( ) : ( @@ -131,26 +131,4 @@ const PacsQRApp: React.FC<{ ); }; -/** - * Selects the default PACS service (which is usually not the PACS service literally called "default"). - * - * 1. Selects the hard-coded "PACSDCM" - * 2. Attempts to select the first value which is not "default" (a useless, legacy pfdcm behavior) - * 3. Selects the first value - */ -function getDefaultPacsService(services: ReadonlyArray): string | null { - if (services.includes("PACSDCM")) { - return "PACSDCM"; - } - for (const service of services) { - if (service !== "default") { - return service; - } - } - if (services) { - return services[0]; - } - return null; -} - export default PacsQRApp; diff --git a/src/components/Pacs/components/PacsStudies.tsx b/src/components/Pacs/components/PacsStudies.tsx new file mode 100644 index 000000000..17cf41314 --- /dev/null +++ b/src/components/Pacs/components/PacsStudies.tsx @@ -0,0 +1,13 @@ +import { PacsStudy } from "../types.ts"; + +type PacsStudiesDisplayProps = { + studies: ReadonlyArray; + onSeriesPull: (pacs_name: string, SeriesInstanceUID: string) => void; + onStudyPull: (pacs_name: string, SeriesInstanceUID: string) => void; +}; + +const PacsStudiesDisplay: React.FC = ({}) => { + return <>hello, world; +}; + +export default PacsStudiesDisplay; diff --git a/src/components/Pacs/components/input.tsx b/src/components/Pacs/components/input.tsx index ba4906fc0..c0f8b0cd9 100644 --- a/src/components/Pacs/components/input.tsx +++ b/src/components/Pacs/components/input.tsx @@ -48,6 +48,7 @@ const MrnInput: React.FC = ({ query, setQuery, ...props }) => { } name="mrnSearchInput" placeholder="Search for DICOM studies by MRN" + {...props} /> {!isQueryEmpty(query) && ( - )} - + submitMrn(e.currentTarget.value)} + onSearch={submitMrn} + enterButton={true} + /> ); }; /** * An advanced search input field for searching in PACS by PatientID, AccessionNumber, ... */ -const AdvancedInput: React.FC = ({ - query, - setQuery, - ...props -}) => { +const AdvancedInput: React.FC = ({ onSubmit }) => { return ( <> -

Advanced search not implemented.

+

Advanced search not implemented.

); }; -type ServiceDropdownProps = { - service: string; - setService: (service: string) => void; - services: ReadonlyArray; -}; - -const ServiceDropdown: React.FC = ({ - service, - services, - setService, -}) => { - const [isOpen, setIsOpen] = React.useState(false); - return ( - { - typeof value === "string" && setService(value); - setIsOpen(false); - }} - onOpenChange={(isOpen: boolean) => setIsOpen(isOpen)} - toggle={(toggleRef: React.Ref) => ( - setIsOpen((open) => !open)} - isExpanded={isOpen} - isFullWidth - title="PACS service" - > - {service} - - )} - > - - {services.map((service) => ( - - {service} - - ))} - - - ); -}; - /** * A `` which shows different text on mobile vs desktop layouts. */ const ScreenSizeSpan: React.FC<{ mobile: React.ReactNode; desktop: React.ReactNode; -}> = ({ mobile, desktop }) => ( - <> - {mobile} - {desktop} - -); +}> = ({ mobile, desktop }) => { + const screens = Grid.useBreakpoint(); + return screens.md ? desktop : mobile; +}; + +const PacsInput: React.FC = ({ onSubmit, services }) => { + const searchParamHooks = useSearchParams(); + const [searchParams, setSearchParams] = searchParamHooks; + const [isAdvancedSearch, setIsAdvancedSearch] = useBooleanSearchParam( + searchParamHooks, + "advancedSearch", + ); -const PacsInput: React.FC = ({ - service, - services, - setService, - ...props -}) => { - const [advancedSearch, setAdvancedSearch] = React.useState(false); + const defaultService = React.useMemo( + () => getDefaultPacsService(services), + [services], + ); - const InputElement = advancedSearch ? AdvancedInput : MrnInput; + const service = searchParams.get("service") || defaultService; + const setService = (service: string) => + setSearchParams((searchParams) => { + searchParams.set("service", service); + return searchParams; + }); + const curriedOnSubmit = React.useMemo( + () => (query: PACSqueryCore) => onSubmit(service, query), + [service, onSubmit], + ); + const input = React.useMemo( + () => + isAdvancedSearch ? ( + + ) : ( + + ), + [isAdvancedSearch, curriedOnSubmit], + ); const advancedSearchToggle = ( - - } - isSelected={!advancedSearch} - onChange={() => setAdvancedSearch(false)} - /> - } - isSelected={advancedSearch} - onChange={() => setAdvancedSearch(true)} - /> - + , + value: false, + }, + { + label: , + value: true, + }, + ]} + value={isAdvancedSearch} + onChange={(e) => setIsAdvancedSearch(e.target.value)} + /> ); const serviceDropdown = ( - +
+ setPacsName(e.target.value)} + /> + setSeriesInstanceUID(e.target.value)} + /> + + +
{subscribedPacsName}
+
+ {subscribedSeriesUid} +
+ +
{unsubscribed}
+ + ); +}; + +test("LonkSubscriber", async () => { + const [client, server] = createMockCubePacsWs(32525); + const props = { + getClient: vi.fn(() => client), + onDone: vi.fn(), + onProgress: vi.fn(), + onError: vi.fn(), + onMessageError: vi.fn(), + }; + render(); + await server.connected; + expect(screen.getByTestId("readyState")).toHaveTextContent( + "" + ReadyState.OPEN, + ); + + const SeriesInstanceUID = "1.234.56789"; + const pacs_name = "MyPACS"; + + const subscriptionReceiveAndRespond = async () => { + await expect(server).toReceiveMessage({ + pacs_name, + SeriesInstanceUID, + action: "subscribe", + }); + server.send({ + pacs_name, + SeriesInstanceUID, + message: { subscribed: true }, + }); + }; + + const subscriptionPromise = subscriptionReceiveAndRespond(); + const pacsNameInput = screen.getByTestId("pacs_name"); + const seriesUidInput = screen.getByTestId("SeriesInstanceUID"); + const subscribeForm = screen.getByTestId("subscribe"); + fireEvent.change(pacsNameInput, { target: { value: pacs_name } }); + fireEvent.change(seriesUidInput, { target: { value: SeriesInstanceUID } }); + fireEvent.submit(subscribeForm); + await subscriptionPromise; + await expect + .poll(() => screen.getByTestId("subscribed-pacs_name")) + .toHaveTextContent(pacs_name); + await expect + .poll(() => screen.getByTestId("subscribed-SeriesInstanceUID")) + .toHaveTextContent(SeriesInstanceUID); + + server.send({ + pacs_name, + SeriesInstanceUID, + message: { + ndicom: 48, + }, + }); + expect(props.onProgress).toHaveBeenCalledOnce(); + expect(props.onProgress).toHaveBeenLastCalledWith( + pacs_name, + SeriesInstanceUID, + 48, + ); + + server.send({ + pacs_name, + SeriesInstanceUID, + message: { + ndicom: 88, + }, + }); + expect(props.onProgress).toHaveBeenCalledTimes(2); + expect(props.onProgress).toHaveBeenLastCalledWith( + pacs_name, + SeriesInstanceUID, + 88, + ); + + server.send({ + pacs_name, + SeriesInstanceUID, + message: { + error: "stuck in chimney", + }, + }); + expect(props.onError).toHaveBeenCalledOnce(); + expect(props.onError).toHaveBeenLastCalledWith( + pacs_name, + SeriesInstanceUID, + "stuck in chimney", + ); + + server.send({ + pacs_name, + SeriesInstanceUID, + message: { + done: true, + }, + }); + expect(props.onDone).toHaveBeenCalledOnce(); + expect(props.onDone).toHaveBeenLastCalledWith(pacs_name, SeriesInstanceUID); + + const bogusData = { bogus: "data" }; + server.send(bogusData); + expect(props.onMessageError).toHaveBeenCalledOnce(); + expect(props.onMessageError).toHaveBeenCalledWith( + JSON.stringify(bogusData), + `Missing or invalid 'message' in ${JSON.stringify(bogusData)}`, + ); + + fireEvent.click(screen.getByTestId("unsubscribe")); + await expect(server).toReceiveMessage({ + action: "unsubscribe", + }); + server.send({ message: { subscribed: false } }); + await expect + .poll(() => screen.getByTestId("unsubscribed")) + .toHaveTextContent("true"); + cleanup(); + await server.closed; +}); + +test.each([ + [ + { + url: "http://example.com/api/v1/downloadtokens/9/", + auth: { + token: "fakeauthtoken", + }, + contentType: "application/vnd.collection+json", + data: { + id: 9, + creation_date: "2024-08-27T17:17:28.580683-04:00", + token: "nota.real.jwttoken", + owner_username: "chris", + }, + }, + "ws://example.com/api/v1/pacs/ws/?token=nota.real.jwttoken", + ], + [ + { + url: "https://example.com/api/v1/downloadtokens/9/", + auth: { + token: "fakeauthtoken", + }, + contentType: "application/vnd.collection+json", + data: { + id: 9, + creation_date: "2024-08-27T17:17:28.580683-04:00", + token: "stillnota.real.jwttoken", + owner_username: "chris", + }, + }, + "wss://example.com/api/v1/pacs/ws/?token=stillnota.real.jwttoken", + ], +])("getWebsocketUrl(%o, %s) -> %s", (downloadTokenResponse, expected) => { + // @ts-ignore + let actual = getWebsocketUrl(downloadTokenResponse); + expect(actual).toBe(expected); +}); diff --git a/src/api/lonk/useLonk.ts b/src/api/lonk/useLonk.ts new file mode 100644 index 000000000..9d358c261 --- /dev/null +++ b/src/api/lonk/useLonk.ts @@ -0,0 +1,103 @@ +import Client, { DownloadToken } from "@fnndsc/chrisapi"; +import useWebSocket, { Options, ReadyState } from "react-use-websocket"; +import { LonkHandlers, SeriesKey } from "./types.ts"; +import React from "react"; +import LonkSubscriber from "./LonkSubscriber.ts"; + +/** + * A subset of the options which are passed through to {@link useWebSocket}. + */ +type AllowedOptions = Pick< + Options, + | "onOpen" + | "onClose" + | "onReconnectStop" + | "shouldReconnect" + | "reconnectInterval" + | "reconnectAttempts" + | "retryOnError" +>; + +type UseLonkParams = LonkHandlers & + AllowedOptions & { + client: Client; + onWebsocketError?: Options["onError"]; + }; + +type UseLonkHook = ReturnType & { + /** + * Subscribe to a DICOM series for receive progress notifications. + */ + subscribe: ( + pacs_name: string, + SeriesInstanceUID: string, + ) => Promise; + /** + * Unsubscribe from all notifications. + */ + unsubscribeAll: () => Promise; +}; + +/** + * Implementation of LONK-WS consumer as a React.js hook, based on + * {@link useWebSocket}. + * + * https://chrisproject.org/docs/oxidicom/lonk-ws + */ +function useLonk({ + client, + onDone, + onProgress, + onError, + onMessageError, + onWebsocketError, + ...options +}: UseLonkParams): UseLonkHook { + const getLonkUrl = React.useCallback(async () => { + const downloadToken = await client.createDownloadToken(); + return getWebsocketUrl(downloadToken); + }, [client, getWebsocketUrl]); + const handlers = { onDone, onProgress, onError, onMessageError }; + const [subscriber, _setSubscriber] = React.useState( + new LonkSubscriber(handlers), + ); + const onMessage = React.useCallback( + (event: MessageEvent) => { + subscriber.handle(event.data); + }, + [onProgress, onDone, onError], + ); + const hook = useWebSocket(getLonkUrl, { + ...options, + onError: onWebsocketError, + onMessage, + }); + + const subscribe = React.useCallback( + (pacs_name: string, SeriesInstanceUID: string) => + subscriber.subscribe(pacs_name, SeriesInstanceUID, hook), + [subscriber, hook], + ); + + const unsubscribeAll = React.useCallback( + () => subscriber.unsubscribeAll(hook), + [subscriber, hook], + ); + + return { + ...hook, + subscribe, + unsubscribeAll, + }; +} + +function getWebsocketUrl(downloadTokenResponse: DownloadToken): string { + const token = downloadTokenResponse.data.token; + return downloadTokenResponse.url + .replace(/^http(s?):\/\//, (_match, s) => `ws${s}://`) + .replace(/v1\/downloadtokens\/\d+\//, `v1/pacs/ws/?token=${token}`); +} + +export type { UseLonkParams }; +export { getWebsocketUrl }; +export default useLonk; diff --git a/src/api/testHelpers.ts b/src/api/testHelpers.ts new file mode 100644 index 000000000..cdc3c37e6 --- /dev/null +++ b/src/api/testHelpers.ts @@ -0,0 +1,34 @@ +import { vi } from "vitest"; +import ChrisClient, { DownloadToken } from "@fnndsc/chrisapi"; +import WS from "vitest-websocket-mock"; + +/** + * Helper function for mocking LONK-WS. + */ +function createMockCubePacsWs( + port: number, + id: number = 55, +): [ChrisClient, WS] { + const fakeChrisHost = `localhost:${port}`; + const fakeChrisUrl = `http://${fakeChrisHost}/api/v1/`; + const fakeChrisAuth = { token: "12345" }; + vi.spyOn(DownloadToken.prototype, "data", "get").mockReturnValue({ + token: "abcdefgnotarealjwt", + }); + const fakeDownloadToken = new DownloadToken( + `${fakeChrisUrl}downloadtokens/${id}/`, + fakeChrisAuth, + ); + + const client = new ChrisClient(fakeChrisUrl, fakeChrisAuth); + client.createDownloadToken = vi.fn(async () => fakeDownloadToken); + + const ws = new WS( + `ws://${fakeChrisHost}/api/v1/pacs/ws/?token=abcdefgnotarealjwt`, + { jsonProtocol: true }, + ); + + return [client, ws]; +} + +export { createMockCubePacsWs }; diff --git a/src/components/Pacs/PacsController.test.tsx b/src/components/Pacs/PacsController.test.tsx index a5d0ffaa8..86c0f5df4 100644 --- a/src/components/Pacs/PacsController.test.tsx +++ b/src/components/Pacs/PacsController.test.tsx @@ -1,15 +1,13 @@ import { cleanup, screen } from "@testing-library/react"; import { expect, test, vi } from "vitest"; import PacsQRApp from "./PacsController.tsx"; -import * as TE from "fp-ts/TaskEither"; import { Configuration as PfdcmConfig, PfdcmClient } from "../../api/pfdcm"; -import ChrisClient, { DownloadToken } from "@fnndsc/chrisapi"; -import WS from "vitest-websocket-mock"; import { renderWithProviders } from "../../store/testHelpers.tsx"; +import { createMockCubePacsWs } from "../../api/testHelpers.ts"; test("PACS Q/R page can bootstrap", async () => { - const pfdcmClient = createPfdcmMock(TE.right(["BCH", "MGH", "BWH"])); - const [chrisClient, ws] = createWorkingMockPacsWs(32584); + const pfdcmClient = createPfdcmMock(async () => ["BCH", "MGH", "BWH"]); + const [chrisClient, ws] = createMockCubePacsWs(32584); const getClientMocks = { getChrisClient: vi.fn(() => chrisClient), @@ -25,17 +23,13 @@ test("PACS Q/R page can bootstrap", async () => { // First PACS service (besides 'default') should be automatically selected. expect(screen.getByTitle("PACS service")).toHaveTextContent("BCH"); - - // component should close WebSocket connection when unmounted - cleanup(); - await ws.closed; }); test("Shows error screen if PFDCM is offline", async () => { - const pfdcmClient = createPfdcmMock( - TE.left(new Error("I am an expected error")), - ); - const [chrisClient, _ws] = createWorkingMockPacsWs(32583); + const pfdcmClient = createPfdcmMock(async () => { + throw new Error("I am an expected error"); + }); + const [chrisClient, _ws] = createMockCubePacsWs(32583); const getClientMocks = { getChrisClient: vi.fn(() => chrisClient), @@ -51,37 +45,9 @@ test("Shows error screen if PFDCM is offline", async () => { ).toBeInTheDocument(); }); -function createWorkingMockPacsWs( - port: number, - id: number = 55, -): [ChrisClient, WS] { - const fakeChrisHost = `localhost:${port}`; - const fakeChrisUrl = `http://${fakeChrisHost}/api/v1/`; - const fakeChrisAuth = { token: "12345" }; - vi.spyOn(DownloadToken.prototype, "data", "get").mockReturnValue({ - token: "abcdefgnotarealjwt", - }); - const fakeDownloadToken = new DownloadToken( - `${fakeChrisUrl}downloadtokens/${id}/`, - fakeChrisAuth, - ); - - const client = new ChrisClient(fakeChrisUrl, fakeChrisAuth); - client.createDownloadToken = vi.fn(async () => fakeDownloadToken); - - const ws = new WS( - `ws://${fakeChrisHost}/api/v1/pacs/ws/?token=abcdefgnotarealjwt`, - { jsonProtocol: true }, - ); - - return [client, ws]; -} - -function createPfdcmMock( - servicesReturn: ReturnType, -) { +function createPfdcmMock(getPacsServices: PfdcmClient["getPacsServices"]) { const pfdcmConfig = new PfdcmConfig({ basePath: "https://example.com" }); const pfdcmClient = new PfdcmClient(pfdcmConfig); - pfdcmClient.getPacsServices = vi.fn(() => servicesReturn); + pfdcmClient.getPacsServices = vi.fn(getPacsServices); return pfdcmClient; } diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index 7f2171831..f7d866c01 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -16,11 +16,7 @@ import React from "react"; import { PACSqueryCore, PfdcmClient } from "../../api/pfdcm"; import Client, { PACSSeries } from "@fnndsc/chrisapi"; -import LonkSubscriber from "../../api/lonk"; import { App } from "antd"; -import FpClient from "../../api/fp/chrisapi.ts"; -import * as TE from "fp-ts/TaskEither"; -import { pipe } from "fp-ts/function"; import { PageSection } from "@patternfly/react-core"; import PacsView from "./PacsView.tsx"; import PacsLoadingScreen from "./components/PacsLoadingScreen.tsx"; @@ -28,15 +24,18 @@ import ErrorScreen from "./components/ErrorScreen.tsx"; import { skipToken, useQueries, useQuery } from "@tanstack/react-query"; import joinStates, { SeriesQueryZip } from "./joinStates.ts"; import { + DEFAULT_RECEIVE_STATE, IPacsState, - SeriesReceiveState, ReceiveState, + SeriesReceiveState, StudyKey, } from "./types.ts"; import { DEFAULT_PREFERENCES } from "./defaultPreferences.ts"; import { zipPacsNameAndSeriesUids } from "./helpers.ts"; import { useImmer } from "use-immer"; import SeriesMap from "../../api/lonk/seriesMap.ts"; +import { useLonk } from "../../api/lonk"; +import { produce, WritableDraft } from "immer"; type PacsControllerProps = { getPfdcmClient: () => PfdcmClient; @@ -58,10 +57,6 @@ const PacsController: React.FC = ({ const pfdcmClient = React.useMemo(getPfdcmClient, [getPfdcmClient]); const chrisClient = React.useMemo(getChrisClient, [getChrisClient]); - const fpClient = React.useMemo( - () => new FpClient(chrisClient), - [chrisClient], - ); // ======================================== // STATE @@ -71,7 +66,11 @@ const PacsController: React.FC = ({ service?: string; query?: PACSqueryCore; }>({}); - const [wsError, setWsError] = React.useState(null); + + /** + * Indicates a fatal error with the WebSocket. + */ + const [wsError, setWsError] = React.useState(null); // TODO create a settings component for changing preferences const [preferences, setPreferences] = React.useState(DEFAULT_PREFERENCES); @@ -146,10 +145,100 @@ const PacsController: React.FC = ({ }, [preferences, studies]); const error = React.useMemo( - () => wsError || pfdcmServices.error, + () => wsError || pfdcmServices.error?.message, [wsError, pfdcmServices.error], ); + // ======================================== + // LONK WEBSOCKET + // ======================================== + + const getSeriesDescriptionOr = React.useCallback( + (pacs_name: string, SeriesInstanceUID: string) => { + if (!pfdcmStudies.data) { + return SeriesInstanceUID; + } + const series = pfdcmStudies.data + .flatMap((s) => s.series) + .find( + (s) => + s.SeriesInstanceUID === SeriesInstanceUID && + s.RetrieveAETitle === pacs_name, + ); + if (!series) { + return SeriesInstanceUID; + } + return series.SeriesDescription; + }, + [pfdcmStudies.data], + ); + + /** + * Update (or insert) the state of a series' reception. + */ + const updateReceiveState = React.useCallback( + ( + pacs_name: string, + SeriesInstanceUID: string, + recipe: (draft: WritableDraft) => void, + ) => + setReceiveState((draft) => { + const prevState = + draft.get(pacs_name, SeriesInstanceUID) || DEFAULT_RECEIVE_STATE; + const nextState = produce(prevState, recipe); + draft.set(pacs_name, SeriesInstanceUID, nextState); + }), + [setReceiveState], + ); + + const lonk = useLonk({ + client: chrisClient, + onDone(pacs_name: string, SeriesInstanceUID: string) { + updateReceiveState(pacs_name, SeriesInstanceUID, (draft) => { + draft.done = true; + }); + }, + onProgress(pacs_name: string, SeriesInstanceUID: string, ndicom: number) { + updateReceiveState(pacs_name, SeriesInstanceUID, (draft) => { + draft.receivedCount = ndicom; + }); + }, + onError(pacs_name: string, SeriesInstanceUID: string, error: string) { + updateReceiveState(pacs_name, SeriesInstanceUID, (draft) => { + draft.errors.push(error); + }); + const desc = getSeriesDescriptionOr(pacs_name, SeriesInstanceUID); + message.error( + <>There was an error while receiving the series "{desc}", + ); + }, + onMessageError(data: any, error: string) { + console.error("LONK message error", error, data); + message.error( + <> + A LONK error occurred, please check the console. + , + ); + }, + retryOnError: true, + reconnectAttempts: 3, + reconnectInterval: 3000, + shouldReconnect(e) { + return e.code < 400 || e.code > 499; + }, + onReconnectStop() { + setWsError(<>The WebSocket is disconnected.); + }, + onWebsocketError() { + message.error( + <>There was an error with the WebSocket. Reconnecting…, + ); + }, + onClose() { + message.error(<>The WebSocket was closed. Reconnecting…); + }, + }); + // ======================================== // CALLBACKS // ======================================== @@ -198,27 +287,20 @@ const PacsController: React.FC = ({ }; }, []); - // Connect to PACS progress websocket and respond to updates. + // Subscribe to all expanded series React.useEffect(() => { - let subscriber: LonkSubscriber | null = null; - const connectWsPipeline = pipe( - fpClient.connectPacsNotifications(), - TE.mapLeft(setWsError), - TE.map((s) => (subscriber = s)), - TE.map((s) => { - s.onclose = () => - message.error(<>WebSocket closed, please refresh the page.); - s.init({ - // TODO - onError: () => {}, - onDone: () => {}, - onProgress: () => {}, + for (const { pacs_name, SeriesInstanceUID } of expandedSeries) { + lonk + .subscribe(pacs_name, SeriesInstanceUID) + .then(({ pacs_name, SeriesInstanceUID }) => { + updateReceiveState(pacs_name, SeriesInstanceUID, (draft) => { + draft.subscribed = true; + }); }); - }), - ); - connectWsPipeline(); - return () => subscriber?.close(); - }, [fpClient, setWsError, message]); + } + // Note: we are subscribing to series, but never unsubscribing. + // This is mostly harmless. + }, [expandedSeries]); // ======================================== // RENDER @@ -227,7 +309,7 @@ const PacsController: React.FC = ({ return ( {error ? ( - {error.message} + {error} ) : pfdcmServices.data ? ( >>, -// ) { -// state.studies = pipe( -// action.payload, -// E.map((studies) => studies.map(newStudyState)), -// ); -// }, -// }, -// }); -// -// function newStudyState({ study, series }: StudyAndSeries): PacsStudyState { -// return { -// info: study, -// series: series.map((info) => { -// return { -// info, -// receivedCount: 0, -// error: [], -// pullState: SeriesPullState.READY, -// inCube: null, -// }; -// }), -// }; -// } -// -// export { context }; -// export default context.reducer; diff --git a/src/components/Pacs/joinStates.test.ts b/src/components/Pacs/joinStates.test.ts new file mode 100644 index 000000000..d6e283618 --- /dev/null +++ b/src/components/Pacs/joinStates.test.ts @@ -0,0 +1,104 @@ +import { expect, test } from "vitest"; +import { pullStateOf } from "./joinStates.ts"; +import { + DEFAULT_RECEIVE_STATE, + SeriesPullState, + SeriesReceiveState, +} from "./types.ts"; + +test.each(< + [ + SeriesReceiveState, + { isLoading: boolean; data: any } | undefined, + SeriesPullState, + ][] +>[ + [DEFAULT_RECEIVE_STATE, undefined, SeriesPullState.NOT_CHECKED], + [ + { + subscribed: true, + requested: false, + done: false, + receivedCount: 0, + errors: [], + }, + { + isLoading: true, + data: undefined, + }, + SeriesPullState.CHECKING, + ], + [ + { + subscribed: false, + requested: false, + done: false, + receivedCount: 0, + errors: [], + }, + { + isLoading: false, + data: null, + }, + SeriesPullState.CHECKING, + ], + [ + { + subscribed: true, + requested: false, + done: false, + receivedCount: 0, + errors: [], + }, + { + isLoading: false, + data: null, + }, + SeriesPullState.READY, + ], + [ + { + subscribed: true, + requested: true, + done: false, + receivedCount: 0, + errors: [], + }, + { + isLoading: false, + data: null, + }, + SeriesPullState.PULLING, + ], + [ + { + subscribed: true, + requested: true, + done: true, + receivedCount: 10, + errors: [], + }, + { + isLoading: false, + data: null, + }, + SeriesPullState.WAITING_OR_COMPLETE, + ], + [ + { + subscribed: true, + requested: true, + done: true, + receivedCount: 10, + errors: [], + }, + { + isLoading: false, + data: "some", + }, + SeriesPullState.WAITING_OR_COMPLETE, + ], +])("pullStateOf(%o, %o) -> %o", (state, result, expected) => { + const actual = pullStateOf(state, result); + expect(actual).toStrictEqual(expected); +}); diff --git a/src/components/Pacs/joinStates.ts b/src/components/Pacs/joinStates.ts index 15d991191..9fe48f198 100644 --- a/src/components/Pacs/joinStates.ts +++ b/src/components/Pacs/joinStates.ts @@ -58,21 +58,48 @@ function joinStates( }); } +/** + * State coalescence. + * + * It is assumed that ChRIS has the following behavior for each DICOM series: + * + * 1. ChRIS_ui subscribes to a series' notifications via LONK + * 2. ChRIS_ui checks CUBE whether a series exists in CUBE + * 3. When both subscription and existence check is complete, + * and the series does not exist in CUBE, ChRIS_ui is ready + * to pull the DICOM series. + * 4. During the reception of a DICOM series, `status.done === false` + * 5. After the reception of a DICOM series, ChRIS enters a "waiting" + * state while the task to register the DICOM series is enqueued + * or running. + * 6. The DICOM series will appear in CUBE after being registered. + */ function pullStateOf( state: SeriesReceiveState, - result?: PACSSeriesQueryResult, + result?: { isLoading: boolean; data: any }, ): SeriesPullState { if (!result) { + // request to check CUBE whether series exists has not been initiated return SeriesPullState.NOT_CHECKED; } - if (result.isLoading) { + if (!state.subscribed || result.isLoading) { + // either not subscribed yet, or request to check CUBE whether series + // exists is pending return SeriesPullState.CHECKING; } if (result.data === null) { + // checked, series DOES NOT exist in CUBE + if (state.done) { + // finished receiving by oxidicom, waiting for CUBE to register + return SeriesPullState.WAITING_OR_COMPLETE; + } + // either pulling or ready to pull return state.requested ? SeriesPullState.PULLING : SeriesPullState.READY; } + // checked, series DOES exist in CUBE. It is complete. return SeriesPullState.WAITING_OR_COMPLETE; } export type { SeriesQueryZip }; +export { pullStateOf }; export default joinStates; diff --git a/src/components/Pacs/types.ts b/src/components/Pacs/types.ts index 0fd163455..e3b7f5289 100644 --- a/src/components/Pacs/types.ts +++ b/src/components/Pacs/types.ts @@ -42,6 +42,10 @@ enum SeriesPullState { * The state of a DICOM series retrieval. */ type SeriesReceiveState = { + /** + * Whether this series has been subscribed to via LONK. + */ + subscribed: boolean; /** * Whether this series has been requested by PFDCM. */ @@ -61,6 +65,7 @@ type SeriesReceiveState = { }; const DEFAULT_RECEIVE_STATE: SeriesReceiveState = { + subscribed: false, requested: false, done: false, receivedCount: 0, diff --git a/src/store/testHelpers.tsx b/src/store/testHelpers.tsx index 2e392756b..0881e3a6e 100644 --- a/src/store/testHelpers.tsx +++ b/src/store/testHelpers.tsx @@ -7,6 +7,8 @@ import { ApplicationState } from "./root/applicationState.ts"; import { Provider } from "react-redux"; import { MemoryRouter } from "react-router"; import React from "react"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { App } from "antd"; // This type interface extends the default options for render from RTL, as well // as allows the user to specify other things such as initialState, store. @@ -29,9 +31,24 @@ export function renderWithProviders( ...renderOptions } = extendedRenderOptions; + const queryClient = new QueryClient({ + defaultOptions: { + queries: { + refetchOnWindowFocus: false, // default: true + refetchOnMount: false, + retry: false, + staleTime: 0, + }, + }, + }); + const Wrapper = ({ children }: React.PropsWithChildren) => ( - {children} + + + {children} + + ); From 1a66b2aaa890c0a9ef1705faa3020c215b4b8670 Mon Sep 17 00:00:00 2001 From: Jennings Zhang Date: Tue, 24 Sep 2024 11:51:29 -0400 Subject: [PATCH 245/337] Rename things + more documentation --- biome.json | 1 + src/components/Pacs/PacsController.test.tsx | 2 +- src/components/Pacs/PacsController.tsx | 61 +++++++++++++------ src/components/Pacs/joinStates.test.ts | 2 +- .../Pacs/{joinStates.ts => mergeStates.ts} | 30 +++------ vitest.setup.ts | 16 +++-- 6 files changed, 66 insertions(+), 46 deletions(-) rename src/components/Pacs/{joinStates.ts => mergeStates.ts} (72%) diff --git a/biome.json b/biome.json index ac80de028..4e93c86e1 100644 --- a/biome.json +++ b/biome.json @@ -7,6 +7,7 @@ "package.json", "biome.json", "*.config.ts", + "vitest.*.ts", "tsconfig*.json", "testing/*.mjs" ], diff --git a/src/components/Pacs/PacsController.test.tsx b/src/components/Pacs/PacsController.test.tsx index 86c0f5df4..5b9cc465e 100644 --- a/src/components/Pacs/PacsController.test.tsx +++ b/src/components/Pacs/PacsController.test.tsx @@ -1,4 +1,4 @@ -import { cleanup, screen } from "@testing-library/react"; +import { screen } from "@testing-library/react"; import { expect, test, vi } from "vitest"; import PacsQRApp from "./PacsController.tsx"; import { Configuration as PfdcmConfig, PfdcmClient } from "../../api/pfdcm"; diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index f7d866c01..5dc574baa 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -1,16 +1,7 @@ /** * The primary PACS Q/R UI code is found in ./PacsView.tsx. This file defines - * a component which wraps the default export from ./PacsView.tsx, which: - * - * 1. "bootstraps" the client objects it needs (see below) - * - * The PACS Q/R application needs to be "bootstrapped" which means: - * - * 1. Making an initial connection to PFDCM - * 2. Connecting to the PACS receive progress WebSocket, `api/v1/pacs/ws/` - * - * During bootstrapping, a loading screen is shown. - * If bootstrapping fails, an error screen is shown. + * a component which wraps the default export from ./PacsView.tsx, which + * manages effects and state. */ import React from "react"; @@ -22,7 +13,7 @@ import PacsView from "./PacsView.tsx"; import PacsLoadingScreen from "./components/PacsLoadingScreen.tsx"; import ErrorScreen from "./components/ErrorScreen.tsx"; import { skipToken, useQueries, useQuery } from "@tanstack/react-query"; -import joinStates, { SeriesQueryZip } from "./joinStates.ts"; +import mergeStates, { SeriesQueryZip } from "./mergeStates.ts"; import { DEFAULT_RECEIVE_STATE, IPacsState, @@ -43,7 +34,44 @@ type PacsControllerProps = { }; /** - * ChRIS_ui PACS Query and Retrieve controller + view. + * ChRIS_ui "PACS Query and Retrieve" controller + view. + * + * ## Purpose + * + * This component handles all the state and effects for {@link PacsView}, + * which includes: + * + * - Managing the CUBE and PFDCM client objects and making requests with them + * - Connecting to the progress notifications WebSocket at `api/v1/pacs/ws/` + * - Knowing the state of which DICOM series are received, receiving, or + * ready to receive. + * - Dispatching requests for querying and retrieving DICOM from PACS via PFDCM. + * + * ## Bootstrapping + * + * The PACS Q/R application needs to be "bootstrapped" which means: + * + * 1. Making an initial connection to PFDCM + * 2. Connecting to the PACS receive progress WebSocket, `api/v1/pacs/ws/` + * + * During bootstrapping, a loading screen is shown. If bootstrapping fails, + * an error screen is shown. + * + * ## PACS Retrieve Workflow + * + * ChRIS_ui and the rest of CUBE work together to implement the following + * behavior for each DICOM series: + * + * 1. ChRIS_ui subscribes to a series' notifications via LONK + * 2. ChRIS_ui checks CUBE whether a series exists in CUBE + * 3. When both subscription and existence check is complete, + * and the series does not exist in CUBE, ChRIS_ui is ready + * to pull the DICOM series. + * 4. During the reception of a DICOM series, `status.done === false` + * 5. After the reception of a DICOM series, ChRIS enters a "waiting" + * state while the task to register the DICOM series is enqueued + * or running. + * 6. The DICOM series will appear in CUBE after being registered. */ const PacsController: React.FC = ({ getChrisClient, @@ -137,8 +165,8 @@ const PacsController: React.FC = ({ if (!pfdcmStudies.data) { return null; } - return joinStates(pfdcmStudies.data, cubeSeriesQueryZip, receiveState); - }, [joinStates, pfdcmStudies, cubeSeriesQueryZip, receiveState]); + return mergeStates(pfdcmStudies.data, cubeSeriesQueryZip, receiveState); + }, [mergeStates, pfdcmStudies, cubeSeriesQueryZip, receiveState]); const state: IPacsState = React.useMemo(() => { return { preferences, studies }; @@ -234,9 +262,6 @@ const PacsController: React.FC = ({ <>There was an error with the WebSocket. Reconnecting…, ); }, - onClose() { - message.error(<>The WebSocket was closed. Reconnecting…); - }, }); // ======================================== diff --git a/src/components/Pacs/joinStates.test.ts b/src/components/Pacs/joinStates.test.ts index d6e283618..d81e160b6 100644 --- a/src/components/Pacs/joinStates.test.ts +++ b/src/components/Pacs/joinStates.test.ts @@ -1,5 +1,5 @@ import { expect, test } from "vitest"; -import { pullStateOf } from "./joinStates.ts"; +import { pullStateOf } from "./mergeStates.ts"; import { DEFAULT_RECEIVE_STATE, SeriesPullState, diff --git a/src/components/Pacs/joinStates.ts b/src/components/Pacs/mergeStates.ts similarity index 72% rename from src/components/Pacs/joinStates.ts rename to src/components/Pacs/mergeStates.ts index 9fe48f198..de63edd2c 100644 --- a/src/components/Pacs/joinStates.ts +++ b/src/components/Pacs/mergeStates.ts @@ -21,9 +21,9 @@ type SeriesQueryZip = { * Fragments of the state of a DICOM series exists remotely in three places: * PFDCM, CUBE, and LONK. * - * Join the states from those places into one mega-object. + * Merge the states from those places into one mega-object. */ -function joinStates( +function mergeStates( pfdcm: ReadonlyArray, cubeSeriesQuery: ReadonlyArray, receiveState: ReceiveState, @@ -59,35 +59,23 @@ function joinStates( } /** - * State coalescence. - * - * It is assumed that ChRIS has the following behavior for each DICOM series: - * - * 1. ChRIS_ui subscribes to a series' notifications via LONK - * 2. ChRIS_ui checks CUBE whether a series exists in CUBE - * 3. When both subscription and existence check is complete, - * and the series does not exist in CUBE, ChRIS_ui is ready - * to pull the DICOM series. - * 4. During the reception of a DICOM series, `status.done === false` - * 5. After the reception of a DICOM series, ChRIS enters a "waiting" - * state while the task to register the DICOM series is enqueued - * or running. - * 6. The DICOM series will appear in CUBE after being registered. + * State coalescence for the "PACS Retrieve Workflow" described in the + * tsdoc for {@link PacsController}. */ function pullStateOf( state: SeriesReceiveState, - result?: { isLoading: boolean; data: any }, + cubeQueryResult?: { isLoading: boolean; data: any }, ): SeriesPullState { - if (!result) { + if (!cubeQueryResult) { // request to check CUBE whether series exists has not been initiated return SeriesPullState.NOT_CHECKED; } - if (!state.subscribed || result.isLoading) { + if (!state.subscribed || cubeQueryResult.isLoading) { // either not subscribed yet, or request to check CUBE whether series // exists is pending return SeriesPullState.CHECKING; } - if (result.data === null) { + if (cubeQueryResult.data === null) { // checked, series DOES NOT exist in CUBE if (state.done) { // finished receiving by oxidicom, waiting for CUBE to register @@ -102,4 +90,4 @@ function pullStateOf( export type { SeriesQueryZip }; export { pullStateOf }; -export default joinStates; +export default mergeStates; diff --git a/vitest.setup.ts b/vitest.setup.ts index 7c342c0ee..9582bad03 100644 --- a/vitest.setup.ts +++ b/vitest.setup.ts @@ -1,10 +1,16 @@ // Copied from // https://github.com/vitest-dev/vitest/blob/7d028cb37d3e964a37899559b640bcb3a13acda7/examples/react/vitest.setup.ts -import '@testing-library/jest-dom/vitest' -import { cleanup } from '@testing-library/react' -import { afterEach } from 'vitest' +import "@testing-library/jest-dom/vitest"; +import { cleanup } from "@testing-library/react"; +import { afterEach } from "vitest"; afterEach(() => { - cleanup() -}) + /* + * Note: when `cleanup` is called, antd might throw false positive warnings: + * + * > Warning: [antd: Message] You are calling notice in render which will + * > break in React 18 concurrent mode. Please trigger in effect instead. + */ + cleanup(); +}); From 6d390592714897958afa39e38e15a8890290fe6f Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Tue, 24 Sep 2024 13:46:22 -0400 Subject: [PATCH 246/337] feat: update upload saga --- package.json | 44 +- pnpm-lock.yaml | 966 +++++++++++++++++++++++++++++++++-- src/store/cart/uploadSaga.ts | 25 +- vite.config.ts | 5 + 4 files changed, 961 insertions(+), 79 deletions(-) diff --git a/package.json b/package.json index 12dd0708c..640a34055 100644 --- a/package.json +++ b/package.json @@ -45,17 +45,17 @@ "@fontsource/inter": "^5.0.20", "@niivue/niivue": "0.44.2", "@patternfly/react-catalog-view-extension": "^5.0.0", - "@patternfly/react-charts": "^7.3.0", + "@patternfly/react-charts": "^7.4.0", "@patternfly/react-core": "^5.4.0", "@patternfly/react-icons": "^5.4.0", "@patternfly/react-log-viewer": "^5.3.0", "@patternfly/react-styles": "^5.4.0", - "@patternfly/react-table": "^5.3.4", - "@react-hook/resize-observer": "^2.0.1", + "@patternfly/react-table": "^5.4.0", + "@react-hook/resize-observer": "^2.0.2", "@reduxjs/toolkit": "^2.2.7", "@tanstack/react-query": "^5.56.2", "antd": "^5.20.6", - "axios": "^1.7.2", + "axios": "^1.7.5", "d3-hierarchy": "^3.1.2", "d3-selection": "^3.0.0", "d3-shape": "^3.2.0", @@ -63,7 +63,7 @@ "date-fns": "^4.1.0", "dicom-parser": "^1.8.21", "email-validator": "^2.0.4", - "fp-ts": "^2.16.8", + "fp-ts": "^2.16.9", "hammerjs": "^2.0.8", "immer": "^10.1.1", "lodash": "^4.17.21", @@ -74,27 +74,27 @@ "p-queue": "^8.0.1", "pako": "^1.0.11", "preval.macro": "^5.0.0", - "query-string": "^9.0.0", - "rc-tree": "^5.8.0", + "query-string": "^9.1.0", + "rc-tree": "^5.8.8", "react": "^18.3.1", "react-activity": "^2.1.3", - "react-bootstrap-typeahead": "^6.2.3", - "react-cookie": "^7.1.4", + "react-bootstrap-typeahead": "^6.3.2", + "react-cookie": "^7.2.0", "react-dom": "^18.3.1", "react-dropzone": "^14.2.3", "react-error-boundary": "^4.0.13", - "react-force-graph-2d": "^1.25.3", + "react-force-graph-2d": "^1.25.5", "react-json-view": "^1.21.3", "react-lazylog": "^4.5.3", - "react-redux": "^9.1.0", + "react-redux": "^9.1.2", "react-router": "^6.26.2", "react-router-dom": "^6.26.2", "redux-saga": "^1.3.0", "rusha": "^0.8.14", - "sanitize-html": "^2.11.0", + "sanitize-html": "^2.13.0", "shlex": "^2.1.2", "typescript": "^5.6.2", - "use-ackee": "^3.0.1", + "use-ackee": "^3.1.0", "use-immer": "^0.10.0", "uuid": "^10.0.0", "vite-plugin-babel-macros": "^1.0.6" @@ -102,28 +102,30 @@ "devDependencies": { "@biomejs/biome": "1.9.1", "@faker-js/faker": "^9.0.1", - "@playwright/test": "^1.41.2", + "@playwright/test": "^1.46.1", "@redux-devtools/extension": "^3.3.0", "@types/d3-hierarchy": "3.1.7", "@types/d3-selection": "3.0.10", "@types/d3-shape": "^3.1.6", "@types/d3-zoom": "^3.0.8", - "@types/lodash": "^4.14.202", + "@types/lodash": "^4.17.7", "@types/node": "^22.5.5", - "@types/react": "^18.3.1", + "@types/react": "^18.3.4", "@types/react-dom": "^18.3.0", - "@types/redux-logger": "^3.0.11", + "@types/redux-logger": "^3.0.13", "@types/uuid": "10.0.0", - "@vitejs/plugin-react-swc": "^3.5.0", + "@vitejs/plugin-react-swc": "^3.7.0", "@vitest/coverage-v8": "2.1.1", "happy-dom": "^15.0.0", - "lefthook": "^1.6.1", + "lefthook": "^1.7.14", "nyc": "^17.0.0", - "playwright": "^1.41.2", + "playwright": "^1.46.1", "redux-logger": "4.0.0", "vite": "5.4.6", "vite-plugin-istanbul": "^6.0.2", + "vite-plugin-node-polyfills": "^0.22.0", "vitest": "2.1.1" }, - "type": "module" + "type": "module", + "packageManager": "pnpm@9.11.0+sha512.0a203ffaed5a3f63242cd064c8fb5892366c103e328079318f78062f24ea8c9d50bc6a47aa3567cabefd824d170e78fa2745ed1f16b132e16436146b7688f19b" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c3f371d9..db6cd26d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,7 +33,7 @@ importers: specifier: ^5.0.0 version: 5.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@patternfly/react-charts': - specifier: ^7.3.0 + specifier: ^7.4.0 version: 7.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@patternfly/react-core': specifier: ^5.4.0 @@ -48,10 +48,10 @@ importers: specifier: ^5.4.0 version: 5.4.0 '@patternfly/react-table': - specifier: ^5.3.4 + specifier: ^5.4.0 version: 5.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-hook/resize-observer': - specifier: ^2.0.1 + specifier: ^2.0.2 version: 2.0.2(react@18.3.1) '@reduxjs/toolkit': specifier: ^2.2.7 @@ -63,7 +63,7 @@ importers: specifier: ^5.20.6 version: 5.20.6(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) axios: - specifier: ^1.7.2 + specifier: ^1.7.5 version: 1.7.5 d3-hierarchy: specifier: ^3.1.2 @@ -87,7 +87,7 @@ importers: specifier: ^2.0.4 version: 2.0.4 fp-ts: - specifier: ^2.16.8 + specifier: ^2.16.9 version: 2.16.9 hammerjs: specifier: ^2.0.8 @@ -120,10 +120,10 @@ importers: specifier: ^5.0.0 version: 5.0.0 query-string: - specifier: ^9.0.0 + specifier: ^9.1.0 version: 9.1.0 rc-tree: - specifier: ^5.8.0 + specifier: ^5.8.8 version: 5.8.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.3.1 @@ -132,10 +132,10 @@ importers: specifier: ^2.1.3 version: 2.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-bootstrap-typeahead: - specifier: ^6.2.3 + specifier: ^6.3.2 version: 6.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-cookie: - specifier: ^7.1.4 + specifier: ^7.2.0 version: 7.2.0(react@18.3.1) react-dom: specifier: ^18.3.1 @@ -147,7 +147,7 @@ importers: specifier: ^4.0.13 version: 4.0.13(react@18.3.1) react-force-graph-2d: - specifier: ^1.25.3 + specifier: ^1.25.5 version: 1.25.5(react@18.3.1) react-json-view: specifier: ^1.21.3 @@ -156,7 +156,7 @@ importers: specifier: ^4.5.3 version: 4.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-redux: - specifier: ^9.1.0 + specifier: ^9.1.2 version: 9.1.2(@types/react@18.3.4)(react@18.3.1)(redux@5.0.1) react-router: specifier: ^6.26.2 @@ -171,7 +171,7 @@ importers: specifier: ^0.8.14 version: 0.8.14 sanitize-html: - specifier: ^2.11.0 + specifier: ^2.13.0 version: 2.13.0 shlex: specifier: ^2.1.2 @@ -180,7 +180,7 @@ importers: specifier: ^5.6.2 version: 5.6.2 use-ackee: - specifier: ^3.0.1 + specifier: ^3.1.0 version: 3.1.0(react@18.3.1) use-immer: specifier: ^0.10.0 @@ -199,7 +199,7 @@ importers: specifier: ^9.0.1 version: 9.0.1 '@playwright/test': - specifier: ^1.41.2 + specifier: ^1.46.1 version: 1.46.1 '@redux-devtools/extension': specifier: ^3.3.0 @@ -217,25 +217,25 @@ importers: specifier: ^3.0.8 version: 3.0.8 '@types/lodash': - specifier: ^4.14.202 + specifier: ^4.17.7 version: 4.17.7 '@types/node': specifier: ^22.5.5 version: 22.5.5 '@types/react': - specifier: ^18.3.1 + specifier: ^18.3.4 version: 18.3.4 '@types/react-dom': specifier: ^18.3.0 version: 18.3.0 '@types/redux-logger': - specifier: ^3.0.11 + specifier: ^3.0.13 version: 3.0.13 '@types/uuid': specifier: 10.0.0 version: 10.0.0 '@vitejs/plugin-react-swc': - specifier: ^3.5.0 + specifier: ^3.7.0 version: 3.7.0(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0)) '@vitest/coverage-v8': specifier: 2.1.1 @@ -244,13 +244,13 @@ importers: specifier: ^15.0.0 version: 15.0.0 lefthook: - specifier: ^1.6.1 + specifier: ^1.7.14 version: 1.7.14 nyc: specifier: ^17.0.0 version: 17.0.0 playwright: - specifier: ^1.41.2 + specifier: ^1.46.1 version: 1.46.1 redux-logger: specifier: 4.0.0 @@ -261,6 +261,9 @@ importers: vite-plugin-istanbul: specifier: ^6.0.2 version: 6.0.2(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0)) + vite-plugin-node-polyfills: + specifier: ^0.22.0 + version: 0.22.0(rollup@4.21.1)(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0)) vitest: specifier: 2.1.1 version: 2.1.1(@types/node@22.5.5)(happy-dom@15.0.0)(terser@5.33.0) @@ -321,6 +324,10 @@ packages: resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} engines: {node: '>=6.9.0'} + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.24.7': resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} @@ -421,6 +428,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3': resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} engines: {node: '>=6.9.0'} @@ -881,6 +893,10 @@ packages: resolution: {integrity: sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.25.6': + resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} + engines: {node: '>=6.9.0'} + '@babel/template@7.25.0': resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} @@ -889,10 +905,18 @@ packages: resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.25.4': resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1391,6 +1415,24 @@ packages: peerDependencies: react: '>=16.8.0' + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.1.2': + resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.21.1': resolution: {integrity: sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==} cpu: [arm] @@ -1614,6 +1656,9 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/hoist-non-react-statics@3.3.5': resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} @@ -1629,6 +1674,9 @@ packages: '@types/node@22.5.5': resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} + '@types/node@22.6.1': + resolution: {integrity: sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==} + '@types/offscreencanvas@2019.7.3': resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} @@ -1843,6 +1891,12 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1861,6 +1915,10 @@ packages: peerDependencies: postcss: ^8.1.0 + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + axios@1.7.5: resolution: {integrity: sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==} @@ -1893,18 +1951,52 @@ packages: base16@1.0.0: resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + bezier-js@6.1.4: resolution: {integrity: sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==} big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + + browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} + + browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + browserslist@4.23.3: resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1913,6 +2005,15 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1921,6 +2022,10 @@ packages: resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} engines: {node: '>=8'} + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1932,6 +2037,9 @@ packages: caniuse-lite@1.0.30001653: resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==} + caniuse-lite@1.0.30001663: + resolution: {integrity: sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==} + canvas-color-tracker@1.2.2: resolution: {integrity: sha512-r+u/Ft2ka4Rj274Ts4L9bhYZLuMvbuJ/yL4seP0s+Pi+i9CM0caD+Sd//yseS5EVBJ2SKSmq36h2mNYUCdmTfA==} engines: {node: '>=12'} @@ -1955,6 +2063,9 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} + cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -2005,6 +2116,12 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + + constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -2024,10 +2141,25 @@ packages: core-js@3.38.1: resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-fetch@3.1.8: resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} @@ -2035,6 +2167,9 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + cssfilter@0.0.10: resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} @@ -2147,6 +2282,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -2195,6 +2339,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + detect-gpu@5.0.45: resolution: {integrity: sha512-59oJS71ODAVPGMjBfyHPPOnM9efOhJpOliQZ8I1UG4p440PjYCVYWgAgY+BiO3JPe/BXbRzPAn+XbVqIESXkDQ==} @@ -2204,12 +2351,19 @@ packages: dicom-parser@1.8.21: resolution: {integrity: sha512-lYCweHQDsC8UFpXErPlg86Px2A8bay0HiUY+wzoG3xv5GzgqVHU3lziwSc/Gzn7VV7y2KeP072SzCviuOoU02w==} + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + domain-browser@4.23.0: + resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} + engines: {node: '>=10'} + domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -2226,6 +2380,9 @@ packages: electron-to-chromium@1.5.13: resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + elliptic@6.5.7: + resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} + email-validator@2.0.4: resolution: {integrity: sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==} engines: {node: '>4.0'} @@ -2311,6 +2468,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -2325,6 +2485,9 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2365,6 +2528,10 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + flux@4.0.4: resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} peerDependencies: @@ -2382,6 +2549,9 @@ packages: debug: optional: true + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + force-graph@1.43.5: resolution: {integrity: sha512-HveLELh9yhZXO/QOfaFS38vlwJZ/3sKu+jarfXzRmbmihSOH/BbRWnUvmg8wLFiYy6h4HlH4lkRfZRccHYmXgA==} engines: {node: '>=12'} @@ -2497,6 +2667,21 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.0.4: + resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} + engines: {node: '>=4'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hasha@5.2.2: resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} engines: {node: '>=8'} @@ -2505,6 +2690,9 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -2514,6 +2702,12 @@ packages: htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + immer@10.1.1: resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} @@ -2558,9 +2752,17 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + is-core-module@2.15.1: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} @@ -2569,6 +2771,14 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -2577,6 +2787,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -2584,9 +2798,16 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isomorphic-timers-promises@1.0.1: + resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} + engines: {node: '>=10'} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -2751,6 +2972,10 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} @@ -2807,6 +3032,9 @@ packages: engines: {node: '>= 18'} hasBin: true + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} @@ -2894,6 +3122,10 @@ packages: micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -2902,6 +3134,12 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2922,6 +3160,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2957,6 +3198,10 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-stdlib-browser@1.2.1: + resolution: {integrity: sha512-dZezG3D88Lg22DwyjsDuUs7cCT/XGr8WwJgg/S3ZnkcWuPet2Tt/W1d2Eytb1Z73JpZv+XVCDI5TWv6UMRq0Gg==} + engines: {node: '>=10'} + normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} @@ -2970,21 +3215,44 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + p-map@3.0.0: resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} engines: {node: '>=8'} @@ -3018,6 +3286,10 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -3025,6 +3297,9 @@ packages: parse-srcset@1.0.2: resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3055,16 +3330,28 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + platform@1.3.6: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} @@ -3078,6 +3365,10 @@ packages: engines: {node: '>=18'} hasBin: true + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -3093,10 +3384,17 @@ packages: resolution: {integrity: sha512-+OZRqZYx1pjZ7H5Jis8bPFXkiT7lwA46UzAT4IjuzFVKwkJK+TwIx1TCqrqNCf8U3e5O12mEJEz1BXslkCLWfQ==} engines: {node: '>=10'} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-on-spawn@1.0.0: resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} engines: {node: '>=8'} + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} @@ -3106,6 +3404,12 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3113,13 +3417,24 @@ packages: pure-color@1.3.0: resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + query-string@9.1.0: resolution: {integrity: sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==} engines: {node: '>=18'} + querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + rc-cascader@3.28.1: resolution: {integrity: sha512-9+8oHIMWVLHxuaapDiqFNmD9KSyKN/P4bo9x/MBuDbyTqP8f2/POmmZxdXWBO3yq/uE3pKyQCXYNUxrNfHRv2A==} peerDependencies: @@ -3485,6 +3800,9 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -3566,6 +3884,9 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + rollup@4.21.1: resolution: {integrity: sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3614,9 +3935,17 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + shader-loader@1.3.1: resolution: {integrity: sha512-dt8F9K0x4rjmaFyHh7rNDfpt4LUiR64zhNIEwp2WbE99B3z4ALuvvmhftkElg93dUD6sTmv/aXa/z9SJiEddcA==} @@ -3636,6 +3965,10 @@ packages: shlex@2.1.2: resolution: {integrity: sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==} + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -3688,6 +4021,9 @@ packages: stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + string-convert@0.2.1: resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} @@ -3776,6 +4112,10 @@ packages: resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} engines: {node: '>=12.22'} + timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -3810,6 +4150,9 @@ packages: tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} @@ -3870,6 +4213,10 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + use-ackee@3.1.0: resolution: {integrity: sha512-RPX51I/Ak6dtNW0aXY6GM/LJ899OU4qoKes/CTGj9+4Qoz9PO7I14BX8Rw6vmlbVvQzZ6WIb01sg7vU/kYEQOw==} engines: {node: '>= 14'} @@ -3913,6 +4260,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true @@ -4049,6 +4399,11 @@ packages: peerDependencies: vite: '>=4 <=6' + vite-plugin-node-polyfills@0.22.0: + resolution: {integrity: sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + vite@5.4.6: resolution: {integrity: sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4105,6 +4460,9 @@ packages: jsdom: optional: true + vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + warning@4.0.3: resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} @@ -4152,6 +4510,10 @@ packages: which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -4198,6 +4560,10 @@ packages: engines: {node: '>= 0.10.0'} hasBin: true + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -4216,6 +4582,10 @@ packages: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + snapshots: '@ampproject/remapping@2.3.0': @@ -4306,14 +4676,21 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 + '@babel/generator@7.25.6': + dependencies: + '@babel/types': 7.25.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + '@babel/helper-annotate-as-pure@7.24.7': dependencies: - '@babel/types': 7.25.4 + '@babel/types': 7.25.6 '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': dependencies: - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -4333,7 +4710,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.24.7 '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/traverse': 7.25.4 + '@babel/traverse': 7.25.6 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -4350,7 +4727,7 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - debug: 4.3.6 + debug: 4.3.7 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -4358,8 +4735,8 @@ snapshots: '@babel/helper-member-expression-to-functions@7.24.8': dependencies: - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -4382,7 +4759,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.24.7': dependencies: - '@babel/types': 7.25.4 + '@babel/types': 7.25.6 '@babel/helper-plugin-utils@7.24.8': {} @@ -4391,7 +4768,7 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-wrap-function': 7.25.0 - '@babel/traverse': 7.25.4 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -4400,7 +4777,7 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/traverse': 7.25.4 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -4413,8 +4790,8 @@ snapshots: '@babel/helper-skip-transparent-expression-wrappers@7.24.7': dependencies: - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -4427,8 +4804,8 @@ snapshots: '@babel/helper-wrap-function@7.25.0': dependencies: '@babel/template': 7.25.0 - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -4448,11 +4825,15 @@ snapshots: dependencies: '@babel/types': 7.25.4 + '@babel/parser@7.25.6': + dependencies: + '@babel/types': 7.25.6 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.4 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -4479,7 +4860,7 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.4 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -4599,7 +4980,7 @@ snapshots: '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/traverse': 7.25.4 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -4646,7 +5027,7 @@ snapshots: '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) - '@babel/traverse': 7.25.4 + '@babel/traverse': 7.25.6 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -4712,7 +5093,7 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.4 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -4761,7 +5142,7 @@ snapshots: '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.4 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -5010,7 +5391,7 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/types': 7.25.4 + '@babel/types': 7.25.6 esutils: 2.0.3 '@babel/regjsgen@0.8.0': {} @@ -5023,6 +5404,10 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.25.6': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.25.0': dependencies: '@babel/code-frame': 7.24.7 @@ -5041,12 +5426,30 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.25.6': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.25.4': dependencies: '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@babel/types@7.25.6': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + '@bcoe/v8-coverage@0.2.3': {} '@biomejs/biome@1.9.1': @@ -5560,6 +5963,22 @@ snapshots: dequal: 2.0.3 react: 18.3.1 + '@rollup/plugin-inject@5.0.5(rollup@4.21.1)': + dependencies: + '@rollup/pluginutils': 5.1.2(rollup@4.21.1) + estree-walker: 2.0.2 + magic-string: 0.30.11 + optionalDependencies: + rollup: 4.21.1 + + '@rollup/pluginutils@5.1.2(rollup@4.21.1)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.21.1 + '@rollup/rollup-android-arm-eabi@4.21.1': optional: true @@ -5731,6 +6150,8 @@ snapshots: '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + '@types/hoist-non-react-statics@3.3.5': dependencies: '@types/react': 18.3.4 @@ -5746,6 +6167,10 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/node@22.6.1': + dependencies: + undici-types: 6.19.8 + '@types/offscreencanvas@2019.7.3': {} '@types/parse-json@4.0.2': {} @@ -6044,6 +6469,20 @@ snapshots: asap@2.0.6: {} + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + assert@2.1.0: + dependencies: + call-bind: 1.0.7 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.5 + util: 0.12.5 + assertion-error@2.0.1: {} asynckit@0.4.0: {} @@ -6053,13 +6492,17 @@ snapshots: autoprefixer@10.4.20(postcss@8.4.47): dependencies: browserslist: 4.23.3 - caniuse-lite: 1.0.30001653 + caniuse-lite: 1.0.30001663 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.0 postcss: 8.4.47 postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + axios@1.7.5: dependencies: follow-redirects: 1.15.6 @@ -6109,10 +6552,16 @@ snapshots: base16@1.0.0: {} + base64-js@1.5.1: {} + bezier-js@6.1.4: {} big.js@5.2.2: {} + bn.js@4.12.0: {} + + bn.js@5.2.1: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -6122,6 +6571,56 @@ snapshots: dependencies: balanced-match: 1.0.2 + brorand@1.1.0: {} + + browser-resolve@2.0.0: + dependencies: + resolve: 1.22.8 + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-cipher@1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + + browserify-des@1.0.2: + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-rsa@4.1.0: + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + + browserify-sign@4.2.3: + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.7 + hash-base: 3.0.4 + inherits: 2.0.4 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + browserify-zlib@0.2.0: + dependencies: + pako: 1.0.11 + browserslist@4.23.3: dependencies: caniuse-lite: 1.0.30001653 @@ -6131,6 +6630,15 @@ snapshots: buffer-from@1.1.2: {} + buffer-xor@1.0.3: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtin-status-codes@3.0.0: {} + cac@6.7.14: {} caching-transform@4.0.0: @@ -6140,12 +6648,22 @@ snapshots: package-hash: 4.0.0 write-file-atomic: 3.0.3 + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + callsites@3.1.0: {} camelcase@5.3.1: {} caniuse-lite@1.0.30001653: {} + caniuse-lite@1.0.30001663: {} + canvas-color-tracker@1.2.2: dependencies: tinycolor2: 1.6.0 @@ -6170,6 +6688,11 @@ snapshots: chrome-trace-event@1.0.4: {} + cipher-base@1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + classnames@2.5.1: {} clean-stack@2.2.0: {} @@ -6210,6 +6733,10 @@ snapshots: concat-map@0.0.1: {} + console-browserify@1.2.0: {} + + constants-browserify@1.0.0: {} + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -6226,6 +6753,8 @@ snapshots: core-js@3.38.1: {} + core-util-is@1.0.3: {} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 @@ -6234,6 +6763,30 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 + create-ecdh@4.0.4: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.7 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + create-require@1.1.1: {} + cross-fetch@3.1.8: dependencies: node-fetch: 2.7.0 @@ -6246,6 +6799,20 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypto-browserify@3.12.0: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.3 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + cssfilter@0.0.10: {} csstype@3.1.3: {} @@ -6351,6 +6918,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.3.7: + dependencies: + ms: 2.1.3 + decamelize@1.2.0: {} decode-named-character-reference@1.0.2: @@ -6391,6 +6962,11 @@ snapshots: dequal@2.0.3: {} + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + detect-gpu@5.0.45: dependencies: webgl-constants: 1.1.1 @@ -6401,6 +6977,12 @@ snapshots: dicom-parser@1.8.21: {} + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.25.4 @@ -6412,6 +6994,8 @@ snapshots: domhandler: 5.0.3 entities: 4.5.0 + domain-browser@4.23.0: {} + domelementtype@2.3.0: {} domhandler@5.0.3: @@ -6428,6 +7012,16 @@ snapshots: electron-to-chromium@1.5.13: {} + elliptic@6.5.7: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + email-validator@2.0.4: {} emoji-regex@8.0.0: {} @@ -6512,6 +7106,8 @@ snapshots: estraverse@5.3.0: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5 @@ -6522,6 +7118,11 @@ snapshots: events@3.3.0: {} + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + fast-deep-equal@3.1.3: {} fast-json-stable-stringify@2.1.0: {} @@ -6569,6 +7170,11 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + flux@4.0.4(react@18.3.1): dependencies: fbemitter: 3.0.0 @@ -6583,6 +7189,10 @@ snapshots: follow-redirects@1.15.6: {} + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + force-graph@1.43.5: dependencies: '@tweenjs/tween.js': 23.1.3 @@ -6702,6 +7312,26 @@ snapshots: has-symbols@1.0.3: {} + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hash-base@3.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + hash-base@3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + hasha@5.2.2: dependencies: is-stream: 2.0.1 @@ -6711,6 +7341,12 @@ snapshots: dependencies: function-bind: 1.1.2 + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -6724,6 +7360,10 @@ snapshots: domutils: 3.1.0 entities: 4.5.0 + https-browserify@1.0.0: {} + + ieee754@1.2.1: {} + immer@10.1.1: {} immutable@3.8.2: {} @@ -6756,24 +7396,48 @@ snapshots: dependencies: loose-envify: 1.4.0 + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + is-arrayish@0.2.1: {} + is-callable@1.2.7: {} + is-core-module@2.15.1: dependencies: hasown: 2.0.2 is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + is-plain-object@5.0.0: {} is-stream@2.0.1: {} + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + is-typedarray@1.0.0: {} is-windows@1.0.2: {} + isarray@1.0.0: {} + isexe@2.0.0: {} + isomorphic-timers-promises@1.0.1: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-hook@3.0.0: @@ -6836,7 +7500,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.5.5 + '@types/node': 22.6.1 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -6941,6 +7605,10 @@ snapshots: dependencies: p-locate: 4.1.0 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + lodash-es@4.17.21: {} lodash.clonedeep@4.5.0: {} @@ -6991,6 +7659,12 @@ snapshots: marked@14.1.2: {} + md5.js@1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + memoize-one@5.2.1: {} merge-stream@2.0.0: {} @@ -7179,12 +7853,21 @@ snapshots: transitivePeerDependencies: - supports-color + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + mime-db@1.52.0: {} mime-types@2.1.35: dependencies: mime-db: 1.52.0 + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -7201,6 +7884,8 @@ snapshots: ms@2.1.2: {} + ms@2.1.3: {} + nanoid@3.3.7: {} neo-async@2.6.2: {} @@ -7226,6 +7911,36 @@ snapshots: node-releases@2.0.18: {} + node-stdlib-browser@1.2.1: + dependencies: + assert: 2.1.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.7.1 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + create-require: 1.1.1 + crypto-browserify: 3.12.0 + domain-browser: 4.23.0 + events: 3.3.0 + https-browserify: 1.0.0 + isomorphic-timers-promises: 1.0.1 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + pkg-dir: 5.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 3.6.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.1.1 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + url: 0.11.4 + util: 0.12.5 + vm-browserify: 1.1.2 + normalize-range@0.1.2: {} nyc@17.0.0: @@ -7262,20 +7977,44 @@ snapshots: object-assign@4.1.1: {} + object-inspect@1.13.2: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + object-keys@1.1.1: {} + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 + os-browserify@0.3.0: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + p-map@3.0.0: dependencies: aggregate-error: 3.1.0 @@ -7306,6 +8045,15 @@ snapshots: dependencies: callsites: 3.1.0 + parse-asn1@5.1.7: + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + hash-base: 3.0.4 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.7 @@ -7315,6 +8063,8 @@ snapshots: parse-srcset@1.0.2: {} + path-browserify@1.0.1: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -7334,14 +8084,28 @@ snapshots: pathval@2.0.0: {} + pbkdf2@3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + picocolors@1.0.1: {} picocolors@1.1.0: {} + picomatch@2.3.1: {} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 + pkg-dir@5.0.0: + dependencies: + find-up: 5.0.0 + platform@1.3.6: {} playwright-core@1.46.1: {} @@ -7352,6 +8116,8 @@ snapshots: optionalDependencies: fsevents: 2.3.2 + possible-typed-array-names@1.0.0: {} + postcss-value-parser@4.2.0: {} postcss@8.4.41: @@ -7370,10 +8136,14 @@ snapshots: dependencies: babel-plugin-preval: 5.1.0 + process-nextick-args@2.0.1: {} + process-on-spawn@1.0.0: dependencies: fromentries: 1.3.2 + process@0.11.10: {} + promise@7.3.1: dependencies: asap: 2.0.6 @@ -7386,20 +8156,42 @@ snapshots: proxy-from-env@1.1.0: {} + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.7 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + punycode@1.4.1: {} + punycode@2.3.1: {} pure-color@1.3.0: {} + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + query-string@9.1.0: dependencies: decode-uri-component: 0.4.1 filter-obj: 5.1.0 split-on-first: 3.0.0 + querystring-es3@0.2.1: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 + randomfill@1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + rc-cascader@3.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.4 @@ -7902,6 +8694,16 @@ snapshots: dependencies: loose-envify: 1.4.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -7936,7 +8738,7 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.25.4 + '@babel/runtime': 7.25.6 regexpu-core@5.3.2: dependencies: @@ -7979,6 +8781,11 @@ snapshots: dependencies: glob: 7.2.3 + ripemd160@2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + rollup@4.21.1: dependencies: '@types/estree': 1.0.5 @@ -8046,8 +8853,22 @@ snapshots: set-blocking@2.0.0: {} + 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 + setimmediate@1.0.5: {} + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + shader-loader@1.3.1: dependencies: loader-utils: 1.4.2 @@ -8066,6 +8887,13 @@ snapshots: shlex@2.1.2: {} + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -8109,6 +8937,13 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + stream-http@3.2.0: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + string-convert@0.2.1: {} string-width@4.2.3: @@ -8189,6 +9024,10 @@ snapshots: throttle-debounce@5.0.2: {} + timers-browserify@2.0.12: + dependencies: + setimmediate: 1.0.5 + tinybench@2.9.0: {} tinycolor2@1.6.0: {} @@ -8209,6 +9048,8 @@ snapshots: tslib@2.7.0: {} + tty-browserify@0.0.1: {} + type-fest@0.8.1: {} typedarray-to-buffer@3.1.5: @@ -8265,6 +9106,11 @@ snapshots: dependencies: punycode: 2.3.1 + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.13.0 + use-ackee@3.1.0(react@18.3.1): dependencies: ackee-tracker: 5.1.0 @@ -8298,6 +9144,14 @@ snapshots: util-deprecate@1.0.2: {} + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + uuid@10.0.0: {} uuid@8.3.2: {} @@ -8512,6 +9366,14 @@ snapshots: transitivePeerDependencies: - supports-color + vite-plugin-node-polyfills@0.22.0(rollup@4.21.1)(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0)): + dependencies: + '@rollup/plugin-inject': 5.0.5(rollup@4.21.1) + node-stdlib-browser: 1.2.1 + vite: 5.4.6(@types/node@22.5.5)(terser@5.33.0) + transitivePeerDependencies: + - rollup + vite@5.4.6(@types/node@22.5.5)(terser@5.33.0): dependencies: esbuild: 0.21.5 @@ -8557,6 +9419,8 @@ snapshots: - supports-color - terser + vm-browserify@1.1.2: {} + warning@4.0.3: dependencies: loose-envify: 1.4.0 @@ -8576,7 +9440,7 @@ snapshots: webpack@5.94.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 @@ -8617,6 +9481,14 @@ snapshots: which-module@2.0.1: {} + which-typed-array@1.1.15: + 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@2.0.2: dependencies: isexe: 2.0.0 @@ -8676,6 +9548,8 @@ snapshots: commander: 2.20.3 cssfilter: 0.0.10 + xtend@4.0.2: {} + y18n@4.0.3: {} yallist@3.1.1: {} @@ -8700,3 +9574,5 @@ snapshots: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 + + yocto-queue@0.1.0: {} diff --git a/src/store/cart/uploadSaga.ts b/src/store/cart/uploadSaga.ts index 5aa096b64..a61be9a60 100644 --- a/src/store/cart/uploadSaga.ts +++ b/src/store/cart/uploadSaga.ts @@ -50,7 +50,6 @@ function createUploadChannel(config: any) { }) .catch((error) => { let message = "Unexpected Error while uploading the file"; - if (axios.isCancel(error)) { emitter({ cancelled: true }); } else if (axios.isAxiosError(error)) { @@ -139,19 +138,19 @@ function* uploadFileBatch( // We need to cancel the folder upload manually since it will upload other files in the list and they will all error out due to the path being an invalid path isFolder && folderController.abort(); - if (!isFolder) { - // No need to manually cancel the upload for a single file as the request will fail. - yield call( - handleUploadError, - isFolder, - name, - currentPath, - false, - lastError, - ); - } - break; } + if (!isFolder) { + // No need to manually cancel the upload for a single file as the request will fail. + yield call( + handleUploadError, + isFolder, + name, + currentPath, + true, + error, + ); + } + break; } if (progress !== undefined && !isFolder && !cancelled && !error) { diff --git a/vite.config.ts b/vite.config.ts index 3dc74396d..06556a08f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -2,11 +2,16 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react-swc"; import macrosPlugin from "vite-plugin-babel-macros"; import IstanbulPlugin from "vite-plugin-istanbul"; +import { nodePolyfills } from "vite-plugin-node-polyfills"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [ react(), + // Workaround for the ✘ [ERROR] Failed to resolve entry for package "fs". The package may have incorrect main/module/exports specified in its package.json. [plugin vite:dep-pre-bundle] + nodePolyfills({ + include: ["fs"], + }), macrosPlugin(), // used for getting version string ...(process.env.USE_BABEL_PLUGIN_ISTANBUL ? [ From 23c0a4a592fd1aad68068f21eb5303c8ed305248 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Tue, 24 Sep 2024 14:33:39 -0400 Subject: [PATCH 247/337] fix: Fix the pagination bug in the dicom scroll --- src/components/FeedOutputBrowser/useFeedBrowser.tsx | 6 +++--- src/components/NewLibrary/components/LibraryTable.tsx | 1 - src/components/NewLibrary/index.tsx | 2 ++ src/components/Preview/FileDetailView.tsx | 11 ++--------- src/components/Preview/displays/DcmDisplay.tsx | 4 +--- 5 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/components/FeedOutputBrowser/useFeedBrowser.tsx b/src/components/FeedOutputBrowser/useFeedBrowser.tsx index 261c65531..7270d5c47 100644 --- a/src/components/FeedOutputBrowser/useFeedBrowser.tsx +++ b/src/components/FeedOutputBrowser/useFeedBrowser.tsx @@ -63,9 +63,9 @@ export const useFeedBrowser = () => { const observerTarget = useRef(null); const fetchMore = - pluginFilesPayload?.foldersPagination.hasNextPage || - pluginFilesPayload?.filesPagination.hasNextPage || - pluginFilesPayload?.linksPagination.hasNextPage; + pluginFilesPayload?.foldersPagination?.hasNextPage || + pluginFilesPayload?.filesPagination?.hasNextPage || + pluginFilesPayload?.linksPagination?.hasNextPage; // Set up an intersection observer to load more data when the user scrolls to the bottom of the page useEffect(() => { diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 2f2677d85..74ce97516 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -300,7 +300,6 @@ const LibraryTable: React.FC = ({ fetchMore={fetchMore} handlePagination={handlePagination} filesLoading={filesLoading} - isDrawer={true} /> )} diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index 90eda3f1b..74d27ab4c 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -26,6 +26,7 @@ import { notification } from "../Antd"; export async function fetchFolders(computedPath: string, pageNumber?: number) { const client = ChrisAPIClient.getClient(); await client.setUrls(); + const pagination = { limit: pageNumber ? pageNumber * 50 : 100, offset: 0, @@ -224,6 +225,7 @@ const NewLibrary = () => { computedPath={computedPath} fetchMore={fetchMore} handlePagination={handlePagination} + filesLoading={isFetching} /> {fetchMore && !isFetching && (
@@ -117,10 +120,12 @@ const SeriesRow: React.FC = ({ disabled={pullState !== SeriesPullState.READY} color={buttonColor} > - {isLoading || errors.length === 0 ? ( - - ) : ( + {errors.length > 1 ? ( + ) : isLoading ? ( + <> + ) : ( + )} diff --git a/src/components/Pacs/components/StudyButtons.tsx b/src/components/Pacs/components/StudyButtons.tsx index 3f00e0a72..75089573e 100644 --- a/src/components/Pacs/components/StudyButtons.tsx +++ b/src/components/Pacs/components/StudyButtons.tsx @@ -41,6 +41,7 @@ const StudyButtons: React.FC = ({ disabled={isPulled} onClick={onRetrieve} > + {/* FIXME CLICKING THIS BUTTON SHOULD SET EXPANDED STATE TO TRUE, INSTEAD OF TOGGLING EXPANDED STATE. */} {isLoading || } diff --git a/src/components/Pacs/joinStates.test.ts b/src/components/Pacs/joinStates.test.ts index d81e160b6..e57d0bab2 100644 --- a/src/components/Pacs/joinStates.test.ts +++ b/src/components/Pacs/joinStates.test.ts @@ -2,6 +2,7 @@ import { expect, test } from "vitest"; import { pullStateOf } from "./mergeStates.ts"; import { DEFAULT_RECEIVE_STATE, + RequestState, SeriesPullState, SeriesReceiveState, } from "./types.ts"; @@ -9,96 +10,140 @@ import { test.each(< [ SeriesReceiveState, + RequestState | undefined, { isLoading: boolean; data: any } | undefined, SeriesPullState, + string, ][] >[ - [DEFAULT_RECEIVE_STATE, undefined, SeriesPullState.NOT_CHECKED], + [ + DEFAULT_RECEIVE_STATE, + undefined, + undefined, + SeriesPullState.NOT_CHECKED, + "base case", + ], [ { subscribed: true, - requested: false, done: false, receivedCount: 0, errors: [], }, + undefined, + undefined, + SeriesPullState.NOT_CHECKED, + "subscribed, but have not checked whether series exists in CUBE", + ], + [ + { + subscribed: true, + done: false, + receivedCount: 0, + errors: [], + }, + undefined, { isLoading: true, data: undefined, }, SeriesPullState.CHECKING, + "pending check on series' existence in CUBE", ], [ { subscribed: false, - requested: false, done: false, receivedCount: 0, errors: [], }, + undefined, { isLoading: false, data: null, }, SeriesPullState.CHECKING, + "checked and does not exist in CUBE, but not yet subscribed", ], [ { subscribed: true, - requested: false, done: false, receivedCount: 0, errors: [], }, + undefined, { isLoading: false, data: null, }, SeriesPullState.READY, + "subscribed and ready to pull", ], [ { subscribed: true, - requested: true, done: false, receivedCount: 0, errors: [], }, + RequestState.NOT_REQUESTED, + { + isLoading: false, + data: null, + }, + SeriesPullState.PULLING, + "user clicked a button to retrieve", + ], + [ + { + subscribed: true, + done: false, + receivedCount: 20, + errors: [], + }, + RequestState.REQUESTED, { isLoading: false, data: null, }, SeriesPullState.PULLING, + "pulling, some files received", ], [ { subscribed: true, - requested: true, done: true, receivedCount: 10, errors: [], }, + RequestState.REQUESTED, { isLoading: false, data: null, }, SeriesPullState.WAITING_OR_COMPLETE, + "pulled, not yet registered by CUBE", ], [ { subscribed: true, - requested: true, done: true, receivedCount: 10, errors: [], }, + RequestState.REQUESTED, { isLoading: false, data: "some", }, SeriesPullState.WAITING_OR_COMPLETE, + "pulled and in CUBE", ], -])("pullStateOf(%o, %o) -> %o", (state, result, expected) => { - const actual = pullStateOf(state, result); - expect(actual).toStrictEqual(expected); -}); +])( + "pullStateOf(%o, %o, %o) -> %o // %s", + (state, pacsRequest, result, expected) => { + const actual = pullStateOf(state, pacsRequest, result); + expect(actual).toStrictEqual(expected); + }, +); diff --git a/src/components/Pacs/mergeStates.ts b/src/components/Pacs/mergeStates.ts index de63edd2c..1f1eace37 100644 --- a/src/components/Pacs/mergeStates.ts +++ b/src/components/Pacs/mergeStates.ts @@ -1,12 +1,14 @@ import { DEFAULT_RECEIVE_STATE, + PacsPullRequestState, PacsStudyState, ReceiveState, + RequestState, SeriesKey, SeriesPullState, SeriesReceiveState, } from "./types.ts"; -import { StudyAndSeries } from "../../api/pfdcm/models.ts"; +import { Series, StudyAndSeries } from "../../api/pfdcm/models.ts"; import { UseQueryResult } from "@tanstack/react-query"; import { PACSSeries } from "@fnndsc/chrisapi"; @@ -25,6 +27,7 @@ type SeriesQueryZip = { */ function mergeStates( pfdcm: ReadonlyArray, + pullRequests: ReadonlyArray, cubeSeriesQuery: ReadonlyArray, receiveState: ReceiveState, ): PacsStudyState[] { @@ -46,11 +49,18 @@ function mergeStates( const state = receiveState.get(info.RetrieveAETitle, info.SeriesInstanceUID) || DEFAULT_RECEIVE_STATE; + const pullRequestsForSeries = pullRequests.findLast((pr) => + isRequestFor(pr, info), + ); return { info, receivedCount: state.receivedCount, errors: state.errors.concat(cubeErrors), - pullState: pullStateOf(state, cubeQueryResult), + pullState: pullStateOf( + state, + pullRequestsForSeries?.state, + cubeQueryResult, + ), inCube: cubeQueryResult?.data || null, }; }), @@ -58,12 +68,35 @@ function mergeStates( }); } +/** + * @returns `true` if the query matches the series. + */ +function isRequestFor( + { query, service }: PacsPullRequestState, + series: Series, +): boolean { + if (service !== series.RetrieveAETitle) { + return false; + } + if (query.seriesInstanceUID) { + return query.seriesInstanceUID === series.SeriesInstanceUID; + } + if (query.studyInstanceUID) { + return query.studyInstanceUID === series.StudyInstanceUID; + } + if (query.accessionNumber) { + return query.accessionNumber === series.AccessionNumber; + } + return false; +} + /** * State coalescence for the "PACS Retrieve Workflow" described in the * tsdoc for {@link PacsController}. */ function pullStateOf( state: SeriesReceiveState, + pacsRequest?: RequestState, cubeQueryResult?: { isLoading: boolean; data: any }, ): SeriesPullState { if (!cubeQueryResult) { @@ -81,8 +114,18 @@ function pullStateOf( // finished receiving by oxidicom, waiting for CUBE to register return SeriesPullState.WAITING_OR_COMPLETE; } - // either pulling or ready to pull - return state.requested ? SeriesPullState.PULLING : SeriesPullState.READY; + if (state.receivedCount > 0) { + // DICOM series is being received, even though it wasn't requested. + // It was probably requested in another window, or by another user, + // or pushed to us without a MOVE-SCU request. + return SeriesPullState.PULLING; + } + if (pacsRequest === undefined) { + // Series is not requested nor pulled and ready to be pulled. + return SeriesPullState.READY; + } + // Request to retrieve was sent to PFDCM, but no files received yet. + return SeriesPullState.PULLING; } // checked, series DOES exist in CUBE. It is complete. return SeriesPullState.WAITING_OR_COMPLETE; diff --git a/src/components/Pacs/types.ts b/src/components/Pacs/types.ts index e3b7f5289..79dadafe4 100644 --- a/src/components/Pacs/types.ts +++ b/src/components/Pacs/types.ts @@ -1,6 +1,7 @@ import { Series, Study } from "../../api/pfdcm/models.ts"; import { PACSSeries } from "@fnndsc/chrisapi"; import SeriesMap from "../../api/lonk/seriesMap.ts"; +import { PACSqueryCore } from "../../api/pfdcm"; type StudyKey = { pacs_name: string; @@ -38,6 +39,25 @@ enum SeriesPullState { WAITING_OR_COMPLETE, } +/** + * The states a request can be in. + */ +enum RequestState { + NOT_REQUESTED, + REQUESTING, + REQUESTED, +} + +/** + * The state of a PACS pull request. + */ +type PacsPullRequestState = { + state: RequestState; + error?: Error; + query: PACSqueryCore; + service: string; +}; + /** * The state of a DICOM series retrieval. */ @@ -46,10 +66,6 @@ type SeriesReceiveState = { * Whether this series has been subscribed to via LONK. */ subscribed: boolean; - /** - * Whether this series has been requested by PFDCM. - */ - requested: boolean; /** * Whether this series was reported as "done" by LONK. */ @@ -66,7 +82,6 @@ type SeriesReceiveState = { const DEFAULT_RECEIVE_STATE: SeriesReceiveState = { subscribed: false, - requested: false, done: false, receivedCount: 0, errors: [], @@ -82,9 +97,11 @@ type ReceiveState = SeriesMap; /** * The combined state of a DICOM series in PFDCM, CUBE, and LONK. */ -type PacsSeriesState = Pick & { +type PacsSeriesState = Pick & { + errors: ReadonlyArray; info: Series; inCube: PACSSeries | null; + pullState: SeriesPullState; }; /** @@ -118,7 +135,7 @@ interface IPacsState { studies: PacsStudyState[] | null; } -export { SeriesPullState, DEFAULT_RECEIVE_STATE }; +export { SeriesPullState, RequestState, DEFAULT_RECEIVE_STATE }; export type { StudyKey, SeriesKey, @@ -128,4 +145,5 @@ export type { PacsSeriesState, PacsStudyState, PacsPreferences, + PacsPullRequestState, }; diff --git a/src/main.tsx b/src/main.tsx index 124f67825..c9cbca60a 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -4,7 +4,9 @@ import App from "./App.tsx"; import { setupStore } from "./store/configureStore.ts"; import { ThemeContextProvider } from "./components/DarkTheme/useTheme.tsx"; import "@fontsource/inter/400.css"; // Defaults to weight 400. +import { enableMapSet } from "immer"; +enableMapSet(); const store = setupStore(); ReactDOM.createRoot(document.getElementById("root")!).render( diff --git a/tsconfig.app.json b/tsconfig.app.json index 1540cf3c9..c518cdc04 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -1,8 +1,8 @@ { "compilerOptions": { - "target": "ES2020", + "target": "ES2023", "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], + "lib": ["ES2023", "DOM", "DOM.Iterable"], "module": "ESNext", "skipLibCheck": true, diff --git a/tsconfig.json b/tsconfig.json index ef4a75c57..be2f44a7b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { - "target": "ES2021", + "target": "ES2023", "useDefineForClassFields": true, - "lib": ["ES2021", "DOM", "DOM.Iterable"], + "lib": ["ES2023", "DOM", "DOM.Iterable"], "module": "ESNext", "skipLibCheck": true, From 76c5a750350ae2f425347104c71a85c5a4ab6a6d Mon Sep 17 00:00:00 2001 From: Jennings Zhang Date: Wed, 25 Sep 2024 15:48:56 -0400 Subject: [PATCH 251/337] Pull study works, except for the last part. --- src/api/lonk/seriesMap.ts | 11 ++ src/components/Pacs/PacsController.tsx | 169 ++++++++++++++---- src/components/Pacs/PacsView.tsx | 25 +-- .../Pacs/components/PacsStudiesView.tsx | 6 + src/components/Pacs/components/SeriesList.tsx | 21 ++- .../Pacs/components/StudyButtons.tsx | 16 +- src/components/Pacs/curry.ts | 26 +++ src/components/Pacs/helpers.ts | 13 +- testing/miniChRIS | 2 +- 9 files changed, 232 insertions(+), 57 deletions(-) create mode 100644 src/components/Pacs/curry.ts diff --git a/src/api/lonk/seriesMap.ts b/src/api/lonk/seriesMap.ts index 7aa559003..55a2b0e79 100644 --- a/src/api/lonk/seriesMap.ts +++ b/src/api/lonk/seriesMap.ts @@ -41,6 +41,17 @@ class SeriesMap { private keyOf(pacs_name: string, SeriesInstanceUID: string): string { return JSON.stringify({ SeriesInstanceUID, pacs_name }); } + + /** + * Get the entries `[pacs_name, SeriesInstanceUID, value]` + */ + public entries(): [string, string, T][] { + // when we upgrade to TS 5.9, use Iterator.map instead of Array.map + return Array.from(this.map.entries()).map(([key, value]) => { + const { pacs_name, SeriesInstanceUID } = JSON.parse(key); + return [pacs_name, SeriesInstanceUID, value]; + }); + } } export default SeriesMap; diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index e9ff6110b..f408eb4a9 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -30,11 +30,17 @@ import { StudyKey, } from "./types.ts"; import { DEFAULT_PREFERENCES } from "./defaultPreferences.ts"; -import { zipPacsNameAndSeriesUids } from "./helpers.ts"; +import { toStudyKey, zipPacsNameAndSeriesUids } from "./helpers.ts"; import { useImmer } from "use-immer"; import SeriesMap from "../../api/lonk/seriesMap.ts"; import { useLonk } from "../../api/lonk"; import { produce, WritableDraft } from "immer"; +import { + isFromPacs, + sameSeriesInstanceUidAs, + sameStudyInstanceUidAs, +} from "./curry.ts"; +import { Study } from "../../api/pfdcm/models.ts"; type PacsControllerProps = { getPfdcmClient: () => PfdcmClient; @@ -101,29 +107,19 @@ const PacsController: React.FC = ({ // STATE // ======================================== - const [{ service, query }, setPacsQuery] = React.useState<{ - service?: string; - query?: PACSqueryCore; - }>({}); - /** * Indicates a fatal error with the WebSocket. */ const [wsError, setWsError] = React.useState(null); // TODO create a settings component for changing preferences const [preferences, setPreferences] = React.useState(DEFAULT_PREFERENCES); + /** * The state of DICOM series, according to LONK. */ const [receiveState, setReceiveState] = useImmer( new SeriesMap(), ); - /** - * Studies which have their series visible on-screen. - */ - const [expandedStudies, setExpandedStudies] = React.useState< - ReadonlyArray - >([]); /** * List of PACS queries which the user wants to pull. @@ -164,9 +160,14 @@ const PacsController: React.FC = ({ ); // ======================================== - // QUERIES AND DATA + // PFDCM QUERIES AND DATA // ======================================== + const [{ service, query }, setPacsQuery] = React.useState<{ + service?: string; + query?: PACSqueryCore; + }>({}); + /** * List of PACS servers which PFDCM can talk to. */ @@ -186,6 +187,26 @@ const PacsController: React.FC = ({ queryFn: service && query ? () => pfdcmClient.query(service, query) : skipToken, }); + + // ======================================== + // EXPANDED STUDIES AND SERIES STATE + // ======================================== + + /** + * Studies which have their series visible on-screen. + */ + const [expandedStudies, setExpandedStudies] = useImmer< + ReadonlyArray + >([]); + + /** + * The StudyInstanceUIDs of all expanded studies. + */ + const expandedStudyUids = React.useMemo( + () => expandedStudies.map((s) => s.StudyInstanceUID), + [expandedStudies], + ); + /** * List of series which are currently visible on-screen. */ @@ -194,6 +215,61 @@ const PacsController: React.FC = ({ [expandedStudies, pfdcmStudies.data], ); + const changeExpandedStudies = React.useCallback( + (pacs_name: string, StudyInstanceUIDs: ReadonlyArray) => { + setExpandedStudies( + StudyInstanceUIDs.map((StudyInstanceUID) => ({ + StudyInstanceUID, + pacs_name, + })), + ); + }, + [setExpandedStudies], + ); + + const appendExpandedStudies = React.useCallback( + (studies: Pick[]) => + setExpandedStudies((draft) => { + draft.push(...studies.map(toStudyKey)); + }), + [setExpandedStudies], + ); + + /** + * Expand the studies of the query. + */ + const expandStudiesFor = React.useCallback( + (pacs_name: string, query: PACSqueryCore) => { + if (!pfdcmStudies.data) { + throw new Error( + "Expanding studies is not currently possible because we do not " + + "have data from PFDCM yet.", + ); + } + if (query.seriesInstanceUID) { + const studies = pfdcmStudies.data + .filter(isFromPacs(pacs_name)) + .flatMap((study) => study.series) + .filter(sameSeriesInstanceUidAs(query)); + appendExpandedStudies(studies); + return; + } + if (!query.seriesInstanceUID && query.studyInstanceUID) { + const studies = pfdcmStudies.data + .filter(isFromPacs(pacs_name)) + .map((s) => s.study) + .filter(sameStudyInstanceUidAs(query)); + appendExpandedStudies(studies); + return; + } + }, + [pfdcmStudies.data, appendExpandedStudies], + ); + + // ======================================== + // CUBE QUERIES AND DATA + // ======================================== + /** * Check whether CUBE has any of the series that are expanded. */ @@ -227,6 +303,37 @@ const PacsController: React.FC = ({ })), [expandedSeries, cubeSeriesQuery], ); + // + // /** + // * Poll CUBE for the existence of DICOM series which have been reported as + // * "done" by LONK. It is necessary to poll CUBE because there will be a delay + // * between when LONK reports the series as "done" and when CUBE will run the + // * celery task of finally registering the series. + // */ + // const finalCheckNeedingSeries = useQueries({ + // queries: React.useMemo( + // () => + // receiveState.entries().map(([pacs_name, SeriesInstanceUID, state]) => ({ + // queryKey: [ + // "finalCheckNeedingSeries", + // pacs_name, + // SeriesInstanceUID, + // state, + // ], + // queryFn: async () => { + // const search = { pacs_name, SeriesInstanceUID, limit: 1 }; + // const list = await chrisClient.getPACSSeriesList(search); + // const items = list.getItems() as ReadonlyArray; + // if (items.length === 0) { + // throw Error("not found"); + // } + // return items[0]; + // }, + // enabled: state.done, // TODO CANCEL POLLING ONCE WE FOUND THE FILE. + // })), + // [receiveState], + // ), + // }); /** * Combined states of PFDCM, LONK, and CUBE into one object. @@ -356,24 +463,13 @@ const PacsController: React.FC = ({ [setPacsQuery], ); - const onStudyExpand = React.useCallback( - (pacs_name: string, StudyInstanceUIDs: ReadonlyArray) => { - setExpandedStudies( - StudyInstanceUIDs.map((StudyInstanceUID) => ({ - StudyInstanceUID, - pacs_name, - })), - ); - }, - [setExpandedStudies], - ); - // ======================================== // PACS RETRIEVAL // ======================================== const onRetrieve = React.useCallback( (service: string, query: PACSqueryCore) => { + expandStudiesFor(service, query); setPullRequests((draft) => { // indicate that the user requests for something to be retrieved. draft.push({ @@ -383,7 +479,7 @@ const PacsController: React.FC = ({ }); }); }, - [setPullRequests], + [setPullRequests, expandStudiesFor], ); /** @@ -437,12 +533,9 @@ const PacsController: React.FC = ({ if (pullRequest.state !== RequestState.NOT_REQUESTED) { return false; } - if (!studies) { - return false; - } if ( pullRequest.query.studyInstanceUID && - !pullRequest.query.seriesInstanceUID + !("seriesInstanceUID" in pullRequest.query) ) { return shouldPullStudy( pullRequest.service, @@ -457,7 +550,7 @@ const PacsController: React.FC = ({ } return false; }, - [studies], + [shouldPullStudy, shouldPullSeries], ); /** @@ -474,13 +567,22 @@ const PacsController: React.FC = ({ updatePullRequestState(service, query, { error: error }), onSuccess: (_, { service, query }) => updatePullRequestState(service, query, { state: RequestState.REQUESTED }), + onSettled: (data, error, variables, context) => { + console.dir({ + event: "settled", + data, + error, + variables, + context, + }); + }, }); React.useEffect(() => { pullRequests .filter(shouldSendPullRequest) .forEach((pr) => pullFromPacs.mutate(pr)); - }, [pullRequests]); + }, [pullRequests, shouldSendPullRequest]); // ======================================== // EFFECTS @@ -524,7 +626,8 @@ const PacsController: React.FC = ({ services={pfdcmServices.data} onSubmit={onSubmit} onRetrieve={onRetrieve} - onStudyExpand={onStudyExpand} + expandedStudyUids={expandedStudyUids} + onStudyExpand={changeExpandedStudies} isLoadingStudies={pfdcmStudies.isLoading} /> ) : ( diff --git a/src/components/Pacs/PacsView.tsx b/src/components/Pacs/PacsView.tsx index 0912673bb..046f8f1c1 100644 --- a/src/components/Pacs/PacsView.tsx +++ b/src/components/Pacs/PacsView.tsx @@ -1,21 +1,24 @@ import React from "react"; import PacsInput, { PacsInputProps } from "./components/PacsInput.tsx"; -import PacsStudiesView from "./components/PacsStudiesView.tsx"; +import PacsStudiesView, { + PacsStudiesViewProps, +} from "./components/PacsStudiesView.tsx"; import { getDefaultPacsService } from "./components/helpers.ts"; import { useSearchParams } from "react-router-dom"; import { PACSqueryCore } from "../../api/pfdcm"; import { Empty, Flex, Spin } from "antd"; import { IPacsState } from "./types.ts"; -type PacsViewProps = Pick & { - onRetrieve: (service: string, query: PACSqueryCore) => void; - onStudyExpand: ( - service: string, - StudyInstanceUIDs: ReadonlyArray, - ) => void; - state: IPacsState; - isLoadingStudies?: boolean; -}; +type PacsViewProps = Pick & + Pick & { + onRetrieve: (service: string, query: PACSqueryCore) => void; + onStudyExpand: ( + service: string, + StudyInstanceUIDs: ReadonlyArray, + ) => void; + state: IPacsState; + isLoadingStudies?: boolean; + }; /** * PACS Query and Retrieve view component. @@ -28,6 +31,7 @@ const PacsView: React.FC = ({ services, onSubmit, onRetrieve, + expandedStudyUids, onStudyExpand, isLoadingStudies, }) => { @@ -69,6 +73,7 @@ const PacsView: React.FC = ({ preferences={preferences} studies={studies} onRetrieve={curriedOnRetrieve} + expandedStudyUids={expandedStudyUids} onStudyExpand={curriedOnStudyExpand} /> diff --git a/src/components/Pacs/components/PacsStudiesView.tsx b/src/components/Pacs/components/PacsStudiesView.tsx index 501fb9fa9..5c4e929ca 100644 --- a/src/components/Pacs/components/PacsStudiesView.tsx +++ b/src/components/Pacs/components/PacsStudiesView.tsx @@ -10,12 +10,17 @@ type PacsStudiesViewProps = { preferences: PacsPreferences; studies: PacsStudyState[]; onRetrieve: (query: PACSqueryCore) => void; + /** + * List of StudyInstanceUIDs which should be expanded. + */ + expandedStudyUids?: string[]; onStudyExpand?: (StudyInstanceUIDs: ReadonlyArray) => void; }; const PacsStudiesView: React.FC = ({ studies, onRetrieve, + expandedStudyUids, onStudyExpand, preferences, }) => { @@ -66,6 +71,7 @@ const PacsStudiesView: React.FC = ({ studies.length === 1 ? [studies[0].info.StudyInstanceUID] : [] } onChange={onChange} + activeKey={expandedStudyUids} /> {numPatients === 1 ? "1 patient, " : `${numPatients} patients, `} diff --git a/src/components/Pacs/components/SeriesList.tsx b/src/components/Pacs/components/SeriesList.tsx index e1d6ff5e0..16d73b019 100644 --- a/src/components/Pacs/components/SeriesList.tsx +++ b/src/components/Pacs/components/SeriesList.tsx @@ -78,6 +78,18 @@ const SeriesRow: React.FC = ({ return "default"; }, [errors, pullState]); + const percentDone = React.useMemo(() => { + if (inCube) { + return 100; + } + if (pullState === SeriesPullState.WAITING_OR_COMPLETE) { + return 99; + } + return ( + (99 * receivedCount) / (info.NumberOfSeriesRelatedInstances || Infinity) + ); + }, [inCube, pullState, receivedCount, info.NumberOfSeriesRelatedInstances]); + return ( = ({
`${Math.round(n ?? 0)}%`} + percent={percentDone} + status={errors.length > 0 ? "exception" : undefined} />
diff --git a/src/components/Pacs/components/StudyButtons.tsx b/src/components/Pacs/components/StudyButtons.tsx index 75089573e..91d4500d7 100644 --- a/src/components/Pacs/components/StudyButtons.tsx +++ b/src/components/Pacs/components/StudyButtons.tsx @@ -16,12 +16,12 @@ const StudyButtons: React.FC = ({ tooltipPlacement = "left", onRetrieve, }) => ( - // TODO add "Create feed" button + // NOTE: buttons should call event.stopPropagation() Checking availability... + <>Working… ) : isPulled ? ( <> This study is already pulled in ChRIS. @@ -39,15 +39,21 @@ const StudyButtons: React.FC = ({ type="primary" loading={isLoading} disabled={isPulled} - onClick={onRetrieve} + onClick={(event) => { + event.stopPropagation(); + onRetrieve && onRetrieve(); + }} > - {/* FIXME CLICKING THIS BUTTON SHOULD SET EXPANDED STATE TO TRUE, INSTEAD OF TOGGLING EXPANDED STATE. */} {isLoading || } {ohifUrl && ( - diff --git a/src/components/Pacs/curry.ts b/src/components/Pacs/curry.ts new file mode 100644 index 000000000..2246c1ee3 --- /dev/null +++ b/src/components/Pacs/curry.ts @@ -0,0 +1,26 @@ +/** + * Some trivial curried functions for making array map/filter code more legible. + */ + +import { Series, Study } from "../../api/pfdcm/models.ts"; +import { PACSqueryCore } from "../../api/pfdcm"; + +function isFromPacs( + pacs_name: string, +): (s: { study: Pick }) => boolean { + return (s) => s.study.RetrieveAETitle === pacs_name; +} + +function sameSeriesInstanceUidAs( + query: Pick, +): (s: Pick) => boolean { + return (s) => s.SeriesInstanceUID === query.seriesInstanceUID; +} + +function sameStudyInstanceUidAs( + query: Pick, +): (s: Pick) => boolean { + return (s) => s.StudyInstanceUID === query.studyInstanceUID; +} + +export { isFromPacs, sameSeriesInstanceUidAs, sameStudyInstanceUidAs }; diff --git a/src/components/Pacs/helpers.ts b/src/components/Pacs/helpers.ts index 2d4051c3a..91915f268 100644 --- a/src/components/Pacs/helpers.ts +++ b/src/components/Pacs/helpers.ts @@ -1,5 +1,5 @@ import { SeriesKey, StudyKey } from "./types.ts"; -import { StudyAndSeries } from "../../api/pfdcm/models.ts"; +import { Study, StudyAndSeries } from "../../api/pfdcm/models.ts"; /** * A type subset of {@link StudyAndSeries}. @@ -43,5 +43,14 @@ function zipPacsNameAndSeriesUids( ); } +function toStudyKey( + s: Pick, +): StudyKey { + return { + StudyInstanceUID: s.StudyInstanceUID, + pacs_name: s.RetrieveAETitle, + }; +} + export type { StudyAndSeriesUidOnly }; -export { zipPacsNameAndSeriesUids }; +export { zipPacsNameAndSeriesUids, toStudyKey }; diff --git a/testing/miniChRIS b/testing/miniChRIS index a70318e5c..d5d2a28ad 160000 --- a/testing/miniChRIS +++ b/testing/miniChRIS @@ -1 +1 @@ -Subproject commit a70318e5c6c6ce3d5e9bba82302ba67d490bd0f8 +Subproject commit d5d2a28adc09e5a42df96c4e5fcd198f63c90260 From 684d06a71ec678a147e87923c0862fd946be652f Mon Sep 17 00:00:00 2001 From: Jennings Zhang Date: Wed, 25 Sep 2024 16:14:05 -0400 Subject: [PATCH 252/337] Allow /srv to be non-empty --- docker-entrypoint.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index cb5175702..eb717cb1d 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -36,8 +36,7 @@ source "$env_file" target=/srv if find "$target" -mindepth 1 | grep -q .; then - echo "error: $target not empty, refusing to overwrite." - exit 1 + >&2 echo "WARNING: $target is not empty, it might contain out-of-date or otherwise stray files. If you just restarted this container, you can ignore this warning." fi # create directories in target folder From 6e75b2b90e8002ce3aee21bee87e4b2a894c1d07 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 25 Sep 2024 16:39:19 -0400 Subject: [PATCH 253/337] feat: Update dcm display for single frame and multiframe --- .../Preview/displays/DcmDisplay.tsx | 137 ++++++++++-------- .../Preview/displays/dicomUtils/utils.ts | 19 ++- 2 files changed, 87 insertions(+), 69 deletions(-) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index d168775ab..afb672a26 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -1,13 +1,8 @@ import type { RenderingEngine } from "@cornerstonejs/core"; -import type { FileBrowserFolderFile } from "@fnndsc/chrisapi"; import { useQuery } from "@tanstack/react-query"; import { useEffect, useRef, useState } from "react"; import { v4 } from "uuid"; -import { - FileViewerModel, - type IFileBlob, - getFileExtension, -} from "../../../api/model"; +import { type IFileBlob, getFileExtension } from "../../../api/model"; import { SpinContainer } from "../../Common"; import useSize from "../../FeedTree/useSize"; import type { ActionState } from "../FileDetailView"; @@ -49,9 +44,11 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { >(); const [currentImageIndex, setCurrentImageIndex] = useState(0); + const [multiFrameDisplay, setMultiframeDisplay] = useState(false); const [imageStack, setImageStack] = useState([]); const [renderingEngine, setRenderingEngine] = useState(); const [isLoadingMore, setIsLoadingMore] = useState(false); + const [totalImagesProcessed, setTotalImagesProcessed] = useState(0); const dicomImageRef = useRef(null); const uniqueId = `${selectedFile?.data.id || v4()}`; const elementId = `cornerstone-element-${uniqueId}`; @@ -92,28 +89,26 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { async function setupCornerstone() { const element = document.getElementById(elementId) as HTMLDivElement; if (selectedFile) { - let imageID: string; - const extension = getFileExtension(selectedFile.data.fname); await basicInit(); setUpTooling(uniqueId); - if (extension === "dcm") { - const blob = await selectedFile.getFileBlob(); - imageID = await loadDicomImage(blob); - } else { - // Code to view png and jpg file types in cornerstone. Currently we are using the default image display so this code is redundant. - // This code should be deleted in the future. - const fileviewer = new FileViewerModel(); - const fileName = fileviewer.getFileName( - selectedFile as FileBrowserFolderFile, - ); - imageID = `web:${selectedFile.url}${fileName}`; - } + const blob = await selectedFile.getFileBlob(); + const imageData = await loadDicomImage(blob); + const imageID = imageData.imageID; + const framesCount = imageData.framesCount; + const newImageStack = + framesCount > 1 + ? Array.from( + { length: framesCount }, + (_, i) => `${imageID}?frame=${i}`, + ) + : [imageID]; const { viewport, renderingEngine: newRenderingEngine } = - await displayDicomImage(element, imageID, uniqueId); + await displayDicomImage(element, newImageStack[0], uniqueId); + setMultiframeDisplay(framesCount > 1); setActiveViewport(viewport); setRenderingEngine(newRenderingEngine); - setImageStack([imageID]); - + setImageStack(newImageStack); + setTotalImagesProcessed(1); return selectedFile.data.fname; } } @@ -121,7 +116,6 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { const { isLoading } = useQuery({ queryKey: ["cornerstone-preview", selectedFile], queryFn: () => setupCornerstone(), - refetchOnMount: true, enabled: !!selectedFile, }); @@ -137,24 +131,42 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { const loadMoreImages = async (signal: AbortSignal) => { setIsLoadingMore(true); - const newImageStack = [...imageStack]; - if (list) { - for (const file of list.slice(imageStack.length)) { - if (signal.aborted) { - setIsLoadingMore(false); - return; - } - const blob = await file.getFileBlob(); - const imageId = await loadDicomImage(blob); // Load and generate the image ID - newImageStack.push(imageId); // Add the new image ID to the stack - } - setImageStack(newImageStack); + if (list && !multiFrameDisplay) { + if ( + imageStack.length > 0 && + imageStack.length !== list.length && + activeViewport + ) { + const newImageStack = []; + const filesSlice = list.slice(imageStack.length); + let imagesProcessed = totalImagesProcessed; + for (const file of filesSlice) { + imagesProcessed += 1; + if (signal.aborted) { + setIsLoadingMore(false); + return; + } + const extension = getFileExtension(file.data.fname); - if (activeViewport) { - const currentIndex = activeViewport.getCurrentImageIdIndex(); - await activeViewport.setStack(newImageStack, currentIndex); - activeViewport.render(); + if (extension !== "dcm") { + continue; + } + const blob = await file.getFileBlob(); + const imageData = await loadDicomImage(blob); // Load and generate the image ID + const imageID = imageData.imageID; + newImageStack.push(imageID); // Add the new image ID to the stack + } + setImageStack(newImageStack); + setTotalImagesProcessed(imagesProcessed); + if (activeViewport) { + const currentIndex = activeViewport.getCurrentImageIdIndex(); + await activeViewport.setStack(newImageStack, currentIndex); + activeViewport.render(); + } } + } else if (multiFrameDisplay && activeViewport) { + await activeViewport.setStack(imageStack); + activeViewport.render(); } setIsLoadingMore(false); }; @@ -162,41 +174,34 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { useEffect(() => { const controller = new AbortController(); const signal = controller.signal; - if (list) { - if ( - imageStack.length > 0 && - imageStack.length !== list.length && - activeViewport - ) { - loadMoreImages(signal); - } + if (!isLoading) { + loadMoreImages(signal); } - return () => { controller.abort(); // Abort loading images on unmount }; - }, [list, fetchMore, activeViewport]); + }, [isLoading, list, multiFrameDisplay]); useEffect(() => { if (activeViewport && list) { const element = activeViewport.element; - const handleImageRendered = (_event: any) => { const newIndex = activeViewport.getCurrentImageIdIndex(); setCurrentImageIndex(newIndex + 1); }; - const handleFetchMoreImages = (_event: any) => { - const id = activeViewport.getCurrentImageIdIndex(); - if ( - id >= Math.floor(imageStack.length / 2) && - list.length === imageStack.length && - fetchMore && - handlePagination && - !filesLoading && - !isLoadingMore - ) { - handlePagination(); + if (!multiFrameDisplay) { + const id = activeViewport.getCurrentImageIdIndex(); + if ( + id >= Math.floor(imageStack.length / 2) && + fetchMore && + handlePagination && + !filesLoading && + !isLoadingMore && + totalImagesProcessed === list.length + ) { + handlePagination(); + } } }; element.addEventListener(events.IMAGE_RENDERED, handleImageRendered); @@ -212,7 +217,13 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { ); }; } - }, [activeViewport, imageStack, fetchMore, handlePagination]); + }, [ + activeViewport, + imageStack, + fetchMore, + handlePagination, + multiFrameDisplay, + ]); return ( <> diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index 2f4703161..ba9ea42b2 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -198,8 +198,19 @@ export const handleEvents = ( } }; -export const loadDicomImage = (blob: Blob) => { - return cornerstonejsDICOMImageLoader.wadouri.fileManager.add(blob); +export const loadDicomImage = async (blob: Blob) => { + const imageID = cornerstonejsDICOMImageLoader.wadouri.fileManager.add(blob); + const image = await cornerstone.imageLoader.loadImage(imageID); + + // Detect if the DICOM is a multi-frame image + //@ts-ignore + const numberOfFrames = image.data.string("x00280008"); + const framesCount = numberOfFrames ? Number.parseInt(numberOfFrames, 10) : 1; + + return { + imageID, + framesCount, + }; }; type ImagePoint = [number, number]; @@ -269,7 +280,6 @@ export const displayDicomImage = async ( type: ViewportType.STACK, element, }; - renderingEngine.enableElement(viewportInput); toolGroup?.addViewport(viewportId, renderingEngineId); const viewport = ( @@ -278,14 +288,11 @@ export const displayDicomImage = async ( const displayArea: ViewportInputOptions = createDisplayArea(1, 0.5); viewport.setOptions(displayArea, true); viewport.setProperties(displayArea); - await viewport.setStack(imageIds); cornerstoneTools.utilities.stackPrefetch.enable(viewport.element); viewport.render(); - // Set the stack scroll mouse wheel tool toolGroup?.setToolActive(StackScrollMouseWheelTool.toolName); - return { viewport, renderingEngine, From 60cbe9d81b70b27da01b6851f7f500a859223093 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 25 Sep 2024 18:00:28 -0400 Subject: [PATCH 254/337] feat: Temp workout for dcm scroll bug --- .../Preview/displays/DcmDisplay.tsx | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index afb672a26..95ca12bb8 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -137,17 +137,25 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { imageStack.length !== list.length && activeViewport ) { - const newImageStack = []; - const filesSlice = list.slice(imageStack.length); + // Find the index of the current image ID in the list + const currentImageIndexInList = list.findIndex((file) => { + return file.data.fname === selectedFile?.data.fname; + }); + console.log("List", list, currentImageIndexInList); + const filesToLoad = [ + ...list.slice(0, currentImageIndexInList), // Files before the current image + ...list.slice(currentImageIndexInList + 1), // Files after the current image + ]; + console.log("filestoLoad", filesToLoad); + const newImageStack = [...imageStack]; let imagesProcessed = totalImagesProcessed; - for (const file of filesSlice) { + for (const file of filesToLoad) { imagesProcessed += 1; if (signal.aborted) { setIsLoadingMore(false); return; } const extension = getFileExtension(file.data.fname); - if (extension !== "dcm") { continue; } @@ -192,13 +200,20 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { const handleFetchMoreImages = (_event: any) => { if (!multiFrameDisplay) { const id = activeViewport.getCurrentImageIdIndex(); + console.log( + id >= Math.floor(imageStack.length / 2) && + fetchMore && + handlePagination && + !filesLoading && + totalImagesProcessed === list.length, + "TotalImagesProcessed", + totalImagesProcessed, + ); if ( id >= Math.floor(imageStack.length / 2) && fetchMore && handlePagination && - !filesLoading && - !isLoadingMore && - totalImagesProcessed === list.length + !filesLoading ) { handlePagination(); } From ad7fba4ff2701faec3f5c19435eb870d3c4b0a23 Mon Sep 17 00:00:00 2001 From: Jennings Zhang Date: Wed, 25 Sep 2024 23:38:04 -0400 Subject: [PATCH 255/337] Everything working! I think... --- src/api/lonk/seriesMap.ts | 8 +- src/components/Pacs/PacsController.tsx | 134 ++++++++++-------- .../Pacs/components/PacsStudiesView.test.tsx | 0 .../Pacs/components/PacsStudiesView.tsx | 2 +- ...joinStates.test.ts => mergeStates.test.ts} | 41 +++++- src/components/Pacs/mergeStates.ts | 76 +++++++--- src/components/Pacs/types.ts | 20 ++- testing/miniChRIS | 2 +- 8 files changed, 193 insertions(+), 90 deletions(-) create mode 100644 src/components/Pacs/components/PacsStudiesView.test.tsx rename src/components/Pacs/{joinStates.test.ts => mergeStates.test.ts} (69%) diff --git a/src/api/lonk/seriesMap.ts b/src/api/lonk/seriesMap.ts index 55a2b0e79..da00743d0 100644 --- a/src/api/lonk/seriesMap.ts +++ b/src/api/lonk/seriesMap.ts @@ -16,7 +16,7 @@ class SeriesMap { * Get a value for a DICOM series. */ public get(pacs_name: string, SeriesInstanceUID: string): T | undefined { - const key = this.keyOf(SeriesInstanceUID, pacs_name); + const key = this.keyOf(pacs_name, SeriesInstanceUID); return this.map.get(key); } @@ -24,7 +24,7 @@ class SeriesMap { * Set a value for a DICOM series. */ public set(pacs_name: string, SeriesInstanceUID: string, value: T) { - const key = this.keyOf(SeriesInstanceUID, pacs_name); + const key = this.keyOf(pacs_name, SeriesInstanceUID); this.map.set(key, value); } @@ -32,14 +32,14 @@ class SeriesMap { * Get and remove a value for a DICOM series. */ public pop(pacs_name: string, SeriesInstanceUID: string): T | null { - const key = this.keyOf(SeriesInstanceUID, pacs_name); + const key = this.keyOf(pacs_name, SeriesInstanceUID); const value = this.map.get(key); this.map.delete(key); return value || null; } private keyOf(pacs_name: string, SeriesInstanceUID: string): string { - return JSON.stringify({ SeriesInstanceUID, pacs_name }); + return JSON.stringify({ pacs_name, SeriesInstanceUID }); } /** diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index f408eb4a9..33c77f4fb 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -18,13 +18,14 @@ import { useQueries, useQuery, } from "@tanstack/react-query"; -import mergeStates, { SeriesQueryZip } from "./mergeStates.ts"; +import { mergeStates, createCubeSeriesQueryUidMap } from "./mergeStates.ts"; import { DEFAULT_RECEIVE_STATE, IPacsState, PacsPullRequestState, ReceiveState, RequestState, + SeriesNotRegisteredError, SeriesPullState, SeriesReceiveState, StudyKey, @@ -270,10 +271,18 @@ const PacsController: React.FC = ({ // CUBE QUERIES AND DATA // ======================================== + // We have two instances of `useQueries` for checking whether DICOM series + // exists in CUBE: + // + // `cubeSeriesQueries`: initial check for existence when series is expanded, + // runs once. + // `lastCheckQueries`: final check for existence when series is done being + // received by oxidicom, polls repeatedly until found. + /** * Check whether CUBE has any of the series that are expanded. */ - const cubeSeriesQuery = useQueries({ + const cubeSeriesQueries = useQueries({ queries: expandedSeries.map((series) => ({ queryKey: ["cubeSeries", chrisClient.url, series], queryFn: async () => { @@ -281,59 +290,69 @@ const PacsController: React.FC = ({ limit: 1, ...series, }); - const items: PACSSeries[] | null = list.getItems(); + const items = list.getItems() as PACSSeries[]; // https://github.com/FNNDSC/fnndsc/issues/101 - if (items === null) { - return null; - } - return items[0] || null; + return items[0] ?? null; }, })), }); /** - * Zip together elements of `cubeSeriesQuery` and the parameters used for - * each element. + * Poll CUBE for the existence of DICOM series which have been reported as + * "done" by LONK. It is necessary to poll CUBE because there will be a delay + * between when LONK reports the series as "done" and when CUBE will run the + * celery task of finally registering the series. */ - const cubeSeriesQueryZip: ReadonlyArray = React.useMemo( - () => - expandedSeries.map((search, i) => ({ - search, - result: cubeSeriesQuery[i], - })), - [expandedSeries, cubeSeriesQuery], - ); - // - // /** - // * Poll CUBE for the existence of DICOM series which have been reported as - // * "done" by LONK. It is necessary to poll CUBE because there will be a delay - // * between when LONK reports the series as "done" and when CUBE will run the - // * celery task of finally registering the series. - // */ - // const finalCheckNeedingSeries = useQueries({ - // queries: React.useMemo( - // () => - // receiveState.entries().map(([pacs_name, SeriesInstanceUID, state]) => ({ - // queryKey: [ - // "finalCheckNeedingSeries", - // pacs_name, - // SeriesInstanceUID, - // state, - // ], - // queryFn: async () => { - // const search = { pacs_name, SeriesInstanceUID, limit: 1 }; - // const list = await chrisClient.getPACSSeriesList(search); - // const items = list.getItems() as ReadonlyArray; - // if (items.length === 0) { - // throw Error("not found"); - // } - // return items[0]; - // }, - // enabled: state.done, // TODO CANCEL POLLING ONCE WE FOUND THE FILE. - // })), - // [receiveState], - // ), - // }); + const lastCheckQueries = useQueries({ + queries: React.useMemo( + () => + receiveState.entries().map(([pacs_name, SeriesInstanceUID, state]) => ({ + queryKey: [ + "lastCheckCubeSeriesRegistration", + pacs_name, + SeriesInstanceUID, + ], + queryFn: async () => { + const search = { pacs_name, SeriesInstanceUID, limit: 1 }; + const list = await chrisClient.getPACSSeriesList(search); + const items = list.getItems() as ReadonlyArray; + if (items.length === 0) { + throw new SeriesNotRegisteredError(pacs_name, SeriesInstanceUID); + } + return items[0]; + }, + enabled: state.done, + retry: 300, + retryDelay: 2000, // TODO use environment variable + })), + [receiveState], + ), + }); + + /** + * Map for all the CUBE queries for PACSSeries existence. + */ + const allCubeSeriesQueryMap = React.useMemo(() => { + const lastCheckParams = receiveState + .entries() + .map(([pacs_name, SeriesInstanceUID]) => ({ + pacs_name, + SeriesInstanceUID, + })); + const lastCheckQueriesMap = createCubeSeriesQueryUidMap( + lastCheckParams, + lastCheckQueries, + ); + const firstCheckQueriesMap = createCubeSeriesQueryUidMap( + expandedSeries, + cubeSeriesQueries, + ); + return new Map([...firstCheckQueriesMap, ...lastCheckQueriesMap]); + }, [receiveState, lastCheckQueries, expandedSeries, cubeSeriesQueries]); + + // ======================================== + // COMBINED STATE OF EVERYTHING + // ======================================== /** * Combined states of PFDCM, LONK, and CUBE into one object. @@ -345,10 +364,16 @@ const PacsController: React.FC = ({ return mergeStates( pfdcmStudies.data, pullRequests, - cubeSeriesQueryZip, + allCubeSeriesQueryMap, receiveState, ); - }, [mergeStates, pfdcmStudies, cubeSeriesQueryZip, receiveState]); + }, [ + mergeStates, + pfdcmStudies.data, + pullRequests, + allCubeSeriesQueryMap, + receiveState, + ]); /** * Entire state of the Pacs Q/R application. @@ -567,15 +592,6 @@ const PacsController: React.FC = ({ updatePullRequestState(service, query, { error: error }), onSuccess: (_, { service, query }) => updatePullRequestState(service, query, { state: RequestState.REQUESTED }), - onSettled: (data, error, variables, context) => { - console.dir({ - event: "settled", - data, - error, - variables, - context, - }); - }, }); React.useEffect(() => { diff --git a/src/components/Pacs/components/PacsStudiesView.test.tsx b/src/components/Pacs/components/PacsStudiesView.test.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/components/Pacs/components/PacsStudiesView.tsx b/src/components/Pacs/components/PacsStudiesView.tsx index 5c4e929ca..8d81a12d6 100644 --- a/src/components/Pacs/components/PacsStudiesView.tsx +++ b/src/components/Pacs/components/PacsStudiesView.tsx @@ -34,7 +34,7 @@ const PacsStudiesView: React.FC = ({ isPulled={ series.length === 0 ? true - : !series.find(({ inCube }) => inCube === null) + : series.every(({ inCube }) => inCube !== null) } isLoading={ series.length === 0 ? false : !!series.find(isSeriesLoading) diff --git a/src/components/Pacs/joinStates.test.ts b/src/components/Pacs/mergeStates.test.ts similarity index 69% rename from src/components/Pacs/joinStates.test.ts rename to src/components/Pacs/mergeStates.test.ts index e57d0bab2..c07afa1a9 100644 --- a/src/components/Pacs/joinStates.test.ts +++ b/src/components/Pacs/mergeStates.test.ts @@ -1,8 +1,14 @@ import { expect, test } from "vitest"; -import { pullStateOf } from "./mergeStates.ts"; +import { + createCubeSeriesQueryUidMap, + pullStateOf, + UseQueryResultLike, +} from "./mergeStates.ts"; import { DEFAULT_RECEIVE_STATE, RequestState, + SeriesKey, + SeriesNotRegisteredError, SeriesPullState, SeriesReceiveState, } from "./types.ts"; @@ -147,3 +153,36 @@ test.each(< expect(actual).toStrictEqual(expected); }, ); + +test("createCubeSeriesQueryUidMap", () => { + const params: ReadonlyArray = [ + { pacs_name: "MyPACS", SeriesInstanceUID: "1.2.345" }, + { pacs_name: "MyPACS", SeriesInstanceUID: "1.2.678" }, + { pacs_name: "MyPACS", SeriesInstanceUID: "1.2.910" }, + { pacs_name: "MyPACS", SeriesInstanceUID: "1.2.123" }, + ]; + const queries: ReadonlyArray = [ + { + isError: false, + error: null, + }, + { + isError: true, + error: new Error("i am some other error"), + }, + { + isError: true, + error: new SeriesNotRegisteredError("MyPACS", "1.2.910"), + }, + { + isError: false, + error: null, + }, + ]; + const actual = createCubeSeriesQueryUidMap(params, queries); + expect(actual.get(params[0].SeriesInstanceUID)).toBe(queries[0]); + expect(actual.get(params[1].SeriesInstanceUID)).toBe(queries[1]); + expect(actual.get(params[3].SeriesInstanceUID)).toBe(queries[3]); + expect(actual.size).toBe(3); + expect(actual.values()).not.toContain(queries[2]); +}); diff --git a/src/components/Pacs/mergeStates.ts b/src/components/Pacs/mergeStates.ts index 1f1eace37..ddfbef958 100644 --- a/src/components/Pacs/mergeStates.ts +++ b/src/components/Pacs/mergeStates.ts @@ -5,49 +5,46 @@ import { ReceiveState, RequestState, SeriesKey, + SeriesNotRegisteredError, SeriesPullState, SeriesReceiveState, } from "./types.ts"; import { Series, StudyAndSeries } from "../../api/pfdcm/models.ts"; -import { UseQueryResult } from "@tanstack/react-query"; +import { useQuery, UseQueryResult } from "@tanstack/react-query"; import { PACSSeries } from "@fnndsc/chrisapi"; -type PACSSeriesQueryResult = UseQueryResult; - -type SeriesQueryZip = { - search: SeriesKey; - result: PACSSeriesQueryResult; -}; +type UseQueryResultLike = Partial< + Pick +>; /** * Fragments of the state of a DICOM series exists remotely in three places: * PFDCM, CUBE, and LONK. * * Merge the states from those places into one mega-object. + * + * @param pfdcm PACS query response from PFDCM + * @param pullRequests state of the PACS pull requests to PFDCM + * @param cubeQueryMap mapping of `SeriesInstanceUID` to queries for respective + * {@link PACSSeries} in CUBE (hint: call + * {@link createCubeSeriesQueryUidMap}) + * @param receiveState state of DICOM receive operation conveyed via LONK */ function mergeStates( pfdcm: ReadonlyArray, pullRequests: ReadonlyArray, - cubeSeriesQuery: ReadonlyArray, + cubeQueryMap: Map>, receiveState: ReceiveState, ): PacsStudyState[] { - const cubeSeriesMap = new Map( - cubeSeriesQuery.map(({ search, result }) => [ - search.SeriesInstanceUID, - result, - ]), - ); return pfdcm.map(({ study, series }) => { return { info: study, series: series.map((info) => { - const cubeQueryResult = cubeSeriesMap.get(info.SeriesInstanceUID); - const cubeErrors = - cubeQueryResult && cubeQueryResult.error - ? [cubeQueryResult.error.message] - : []; + const cubeQueryResult = cubeQueryMap.get(info.SeriesInstanceUID); + const cubeError = cubeQueryResult?.error; + const cubeErrors = cubeError ? [cubeError.message] : []; const state = - receiveState.get(info.RetrieveAETitle, info.SeriesInstanceUID) || + receiveState.get(info.RetrieveAETitle, info.SeriesInstanceUID) ?? DEFAULT_RECEIVE_STATE; const pullRequestsForSeries = pullRequests.findLast((pr) => isRequestFor(pr, info), @@ -68,6 +65,40 @@ function mergeStates( }); } +/** + * Reshape queries and the parameters used for each query to a map + * where the key is `SeriesInstanceUID`. + * + * Also removes entries where the query is pending or the error is + * {@link SeriesNotRegisteredError}. + * + * @param params {@link useQuery} parameters + * @param queries the React "hook" returned by {@link useQuery} + */ +function createCubeSeriesQueryUidMap( + params: ReadonlyArray, + queries: ReadonlyArray, +): Map { + const entries = zipArray(params, queries) + .filter(([_, query]) => !query.isPending && !isNotRegisteredError(query)) + .map(([p, q]): [string, T] => [p.SeriesInstanceUID, q]); + return new Map(entries); +} + +function zipArray( + a: ReadonlyArray, + b: ReadonlyArray, +): ReadonlyArray<[A, B]> { + if (a.length !== b.length) { + throw new Error(`Array lengths are different (${a.length} != ${b.length})`); + } + return a.map((item, i) => [item, b[i]]); +} + +function isNotRegisteredError(q: UseQueryResultLike): boolean { + return Boolean(q.isError) && q.error instanceof SeriesNotRegisteredError; +} + /** * @returns `true` if the query matches the series. */ @@ -131,6 +162,5 @@ function pullStateOf( return SeriesPullState.WAITING_OR_COMPLETE; } -export type { SeriesQueryZip }; -export { pullStateOf }; -export default mergeStates; +export type { UseQueryResultLike }; +export { mergeStates, pullStateOf, createCubeSeriesQueryUidMap }; diff --git a/src/components/Pacs/types.ts b/src/components/Pacs/types.ts index 79dadafe4..1a39e010a 100644 --- a/src/components/Pacs/types.ts +++ b/src/components/Pacs/types.ts @@ -13,6 +13,19 @@ type SeriesKey = { SeriesInstanceUID: string; }; +/** + * Indicates DICOM series has not yet been registered by CUBE. + */ +class SeriesNotRegisteredError extends Error { + public readonly pacs_name: string; + public readonly SeriesInstanceUID: string; + public constructor(pacs_name: string, SeriesInstanceUID: string) { + super(); + this.pacs_name = pacs_name; + this.SeriesInstanceUID = SeriesInstanceUID; + } +} + /** * The states which a DICOM series can be in. */ @@ -135,7 +148,12 @@ interface IPacsState { studies: PacsStudyState[] | null; } -export { SeriesPullState, RequestState, DEFAULT_RECEIVE_STATE }; +export { + SeriesPullState, + RequestState, + DEFAULT_RECEIVE_STATE, + SeriesNotRegisteredError, +}; export type { StudyKey, SeriesKey, diff --git a/testing/miniChRIS b/testing/miniChRIS index d5d2a28ad..f71bfc274 160000 --- a/testing/miniChRIS +++ b/testing/miniChRIS @@ -1 +1 @@ -Subproject commit d5d2a28adc09e5a42df96c4e5fcd198f63c90260 +Subproject commit f71bfc27455cd87802208a3041647b1bc31b5ede From a74ae257711d7e37f6e80b807d20cef95df870ac Mon Sep 17 00:00:00 2001 From: Jennings Zhang Date: Thu, 26 Sep 2024 00:09:07 -0400 Subject: [PATCH 256/337] Customize progress bar theme --- src/App.tsx | 10 ++++++++++ src/components/Pacs/components/SeriesList.tsx | 6 +++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index f316263e5..0c579847d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -60,6 +60,16 @@ function App(props: AllProps) { algorithm: isDarkTheme ? theme.darkAlgorithm : theme.defaultAlgorithm, + token: { + // var(--pf-v5-global--primary-color--200) + colorSuccess: "#004080", + }, + components: { + Progress: { + // var(--pf-v5-global--primary-color--100) + defaultColor: "#0066CC", + }, + }, }} > diff --git a/src/components/Pacs/components/SeriesList.tsx b/src/components/Pacs/components/SeriesList.tsx index 16d73b019..084276bdf 100644 --- a/src/components/Pacs/components/SeriesList.tsx +++ b/src/components/Pacs/components/SeriesList.tsx @@ -115,11 +115,14 @@ const SeriesRow: React.FC = ({
+ {/* TODO Progress 100% text color should be changed from dark blue */} `${Math.round(n ?? 0)}%`} percent={percentDone} - status={errors.length > 0 ? "exception" : undefined} + status={ + errors.length > 0 ? "exception" : inCube ? "success" : "normal" + } />
@@ -129,6 +132,7 @@ const SeriesRow: React.FC = ({ disabled={pullState !== SeriesPullState.READY} color={buttonColor} > + {/* TODO Button width is different if isLoading */} {errors.length > 1 ? ( ) : isLoading ? ( From 2df2851611811480cf20ef37cfc466e3b5b04721 Mon Sep 17 00:00:00 2001 From: Jennings Zhang Date: Thu, 26 Sep 2024 00:28:32 -0400 Subject: [PATCH 257/337] Implement series pull --- src/components/Pacs/PacsController.tsx | 2 +- .../Pacs/components/PacsStudiesView.tsx | 13 +++++- src/components/Pacs/components/SeriesList.tsx | 40 ++++++++++++------- src/components/Pacs/types.ts | 10 ++--- 4 files changed, 43 insertions(+), 22 deletions(-) diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index 33c77f4fb..705858005 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -544,7 +544,7 @@ const PacsController: React.FC = ({ ({ info, pullState }) => info.RetrieveAETitle === pacs_name && info.SeriesInstanceUID === SeriesInstanceUID && - pullState === SeriesPullState.READY, + pullState === SeriesPullState.PULLING, ) !== -1, [allSeries], ); diff --git a/src/components/Pacs/components/PacsStudiesView.tsx b/src/components/Pacs/components/PacsStudiesView.tsx index 8d81a12d6..b4ba3bace 100644 --- a/src/components/Pacs/components/PacsStudiesView.tsx +++ b/src/components/Pacs/components/PacsStudiesView.tsx @@ -47,7 +47,18 @@ const PacsStudiesView: React.FC = ({ } > ), - children: , + children: ( + + onRetrieve({ + patientID: info.PatientID, + seriesInstanceUID: info.SeriesInstanceUID, + }) + } + /> + ), }; }); }, [studies]); diff --git a/src/components/Pacs/components/SeriesList.tsx b/src/components/Pacs/components/SeriesList.tsx index 084276bdf..61d741950 100644 --- a/src/components/Pacs/components/SeriesList.tsx +++ b/src/components/Pacs/components/SeriesList.tsx @@ -16,13 +16,15 @@ import styles from "./SeriesList.module.css"; import React from "react"; import { isSeriesLoading } from "./helpers.ts"; -type SeriesTableProps = { +type SeriesListProps = { states: PacsSeriesState[]; showUid?: boolean; + onRetrieve?: (state: PacsSeriesState) => void; }; type SeriesRowProps = PacsSeriesState & { showUid?: boolean; + onRetrieve?: () => void; }; const SeriesRow: React.FC = ({ @@ -32,6 +34,7 @@ const SeriesRow: React.FC = ({ inCube, receivedCount, showUid, + onRetrieve, }) => { const isLoading = React.useMemo( () => isSeriesLoading({ pullState, inCube }), @@ -131,6 +134,7 @@ const SeriesRow: React.FC = ({ loading={isLoading} disabled={pullState !== SeriesPullState.READY} color={buttonColor} + onClick={onRetrieve} > {/* TODO Button width is different if isLoading */} {errors.length > 1 ? ( @@ -154,19 +158,25 @@ const SeriesRow: React.FC = ({ ); }; -const SeriesList: React.FC = ({ states, showUid }) => { - return ( - ( - - - - )} - rowKey={(state) => state.info.SeriesInstanceUID} - size="small" - /> - ); -}; +const SeriesList: React.FC = ({ + states, + showUid, + onRetrieve, +}) => ( + ( + + onRetrieve && onRetrieve(s)} + {...s} + /> + + )} + rowKey={(state) => state.info.SeriesInstanceUID} + size="small" + /> +); export default SeriesList; diff --git a/src/components/Pacs/types.ts b/src/components/Pacs/types.ts index 1a39e010a..64d54b6c8 100644 --- a/src/components/Pacs/types.ts +++ b/src/components/Pacs/types.ts @@ -33,23 +33,23 @@ enum SeriesPullState { /** * Unknown whether series is available in CUBE. */ - NOT_CHECKED, + NOT_CHECKED = "not checked", /** * Currently checking for availability in CUBE. */ - CHECKING, + CHECKING = "checking", /** * Ready to be pulled. */ - READY, + READY = "ready", /** * Being pulled by oxidicom. */ - PULLING, + PULLING = "pulling", /** * Done being received by oxidicom, but may or not yet ready in CUBE. */ - WAITING_OR_COMPLETE, + WAITING_OR_COMPLETE = "waiting or complete", } /** From e8ddeef454abf74905fa4ab4d28cc5e345c8270b Mon Sep 17 00:00:00 2001 From: Jennings Zhang Date: Thu, 26 Sep 2024 00:44:35 -0400 Subject: [PATCH 258/337] Fix crash on invalid StudyDate --- src/components/Pacs/components/StudyDetails.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/components/Pacs/components/StudyDetails.tsx b/src/components/Pacs/components/StudyDetails.tsx index 2c1b68d72..e0dc62383 100644 --- a/src/components/Pacs/components/StudyDetails.tsx +++ b/src/components/Pacs/components/StudyDetails.tsx @@ -14,7 +14,7 @@ const StudyDetails: React.FC<{ Study "{study.StudyDescription}"{" "} - on {study.StudyDate ? format(study.StudyDate, dateFormat) : "unknown"}{" "} + on {formatDate(study.StudyDate, dateFormat)}{" "} {study.AccessionNumber && !study.AccessionNumber.includes("no value provided") && ( <>(AccessionNumber: {study.AccessionNumber}) @@ -72,4 +72,16 @@ function formatPypxSex(dicomSex: string) { } } +function formatDate(date: Date | undefined | null, dateFormat: string) { + if (!date) { + return "unknown date"; + } + try { + return format(date, dateFormat); + } catch (_e) { + // invalid date + return "unknown date"; + } +} + export default StudyDetails; From 27db1fc2aa42329d2be6d275dedf54e209863717 Mon Sep 17 00:00:00 2001 From: Jennings Zhang Date: Thu, 26 Sep 2024 00:57:24 -0400 Subject: [PATCH 259/337] Add test stub --- src/components/Pacs/components/PacsStudiesView.test.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/Pacs/components/PacsStudiesView.test.tsx b/src/components/Pacs/components/PacsStudiesView.test.tsx index e69de29bb..2df7e20e2 100644 --- a/src/components/Pacs/components/PacsStudiesView.test.tsx +++ b/src/components/Pacs/components/PacsStudiesView.test.tsx @@ -0,0 +1,3 @@ +import { test, expect } from "vitest"; + +test.skip("PacsStudiesView", () => {}); From 1d0131c8b1e5749d0f25799eca43699950eeb4af Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Thu, 26 Sep 2024 12:30:27 -0400 Subject: [PATCH 260/337] feat: Improve lazy loading of files in cornerstone --- .../Preview/displays/DcmDisplay.tsx | 114 ++++++++++-------- 1 file changed, 61 insertions(+), 53 deletions(-) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 95ca12bb8..13d338664 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -42,13 +42,13 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { const [activeViewport, setActiveViewport] = useState< IStackViewport | undefined >(); - const [currentImageIndex, setCurrentImageIndex] = useState(0); const [multiFrameDisplay, setMultiframeDisplay] = useState(false); const [imageStack, setImageStack] = useState([]); const [renderingEngine, setRenderingEngine] = useState(); + const [loadedIndexes, setLoadedIndexes] = useState>(new Set()); const [isLoadingMore, setIsLoadingMore] = useState(false); - const [totalImagesProcessed, setTotalImagesProcessed] = useState(0); + const [lastProcessedIndex, setLastProcessedIndex] = useState(0); const dicomImageRef = useRef(null); const uniqueId = `${selectedFile?.data.id || v4()}`; const elementId = `cornerstone-element-${uniqueId}`; @@ -108,7 +108,14 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { setActiveViewport(viewport); setRenderingEngine(newRenderingEngine); setImageStack(newImageStack); - setTotalImagesProcessed(1); + const currentIndex = list?.findIndex( + (file) => file.data.fname === selectedFile.data.fname, + ); + if (currentIndex) { + const newSet = new Set(loadedIndexes); + setLoadedIndexes(newSet.add(currentIndex)); + setLastProcessedIndex(currentIndex); + } return selectedFile.data.fname; } } @@ -129,54 +136,63 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { handleResize(); }, [size]); - const loadMoreImages = async (signal: AbortSignal) => { + const loadImage = async (file: IFileBlob): Promise => { + const fileName = file.data.fname; + const extension = getFileExtension(fileName); + if (extension !== "dcm") return null; + const blob = await file.getFileBlob(); + const imageData = await loadDicomImage(blob); + return imageData.imageID; + }; + + const loadImagesInDirection = async ( + direction: "forward" | "backward", + signal: AbortSignal, + ) => { setIsLoadingMore(true); if (list && !multiFrameDisplay) { - if ( - imageStack.length > 0 && - imageStack.length !== list.length && - activeViewport - ) { - // Find the index of the current image ID in the list - const currentImageIndexInList = list.findIndex((file) => { - return file.data.fname === selectedFile?.data.fname; - }); - console.log("List", list, currentImageIndexInList); - const filesToLoad = [ - ...list.slice(0, currentImageIndexInList), // Files before the current image - ...list.slice(currentImageIndexInList + 1), // Files after the current image - ]; - console.log("filestoLoad", filesToLoad); - const newImageStack = [...imageStack]; - let imagesProcessed = totalImagesProcessed; - for (const file of filesToLoad) { - imagesProcessed += 1; - if (signal.aborted) { - setIsLoadingMore(false); - return; + const newImageStack = [...imageStack]; + const step = direction === "forward" ? 1 : -1; + const endCondition = (i: number) => + direction === "forward" ? i < list.length : i >= 0; + const startIndex = + direction === "forward" + ? lastProcessedIndex + 1 + : lastProcessedIndex - 1; + const newLoadedIndexes = new Set(loadedIndexes); + for (let i = startIndex; endCondition(i) && !signal.aborted; i += step) { + if (newLoadedIndexes.has(i)) continue; + const imageID = await loadImage(list[i]); + if (imageID) { + if (direction === "forward") { + newImageStack.push(imageID); + } else { + newImageStack.unshift(imageID); } - const extension = getFileExtension(file.data.fname); - if (extension !== "dcm") { - continue; - } - const blob = await file.getFileBlob(); - const imageData = await loadDicomImage(blob); // Load and generate the image ID - const imageID = imageData.imageID; - newImageStack.push(imageID); // Add the new image ID to the stack - } - setImageStack(newImageStack); - setTotalImagesProcessed(imagesProcessed); - if (activeViewport) { - const currentIndex = activeViewport.getCurrentImageIdIndex(); - await activeViewport.setStack(newImageStack, currentIndex); - activeViewport.render(); + newLoadedIndexes.add(i); } } - } else if (multiFrameDisplay && activeViewport) { + setImageStack([...newImageStack]); + setLoadedIndexes(new Set(newLoadedIndexes)); + setLastProcessedIndex(direction === "forward" ? list.length - 1 : 0); + if (activeViewport) { + await activeViewport.setStack(newImageStack, currentImageIndex); + activeViewport.render(); + } + } + setIsLoadingMore(false); + }; + + const loadMoreImages = async (signal: AbortSignal) => { + if (multiFrameDisplay && activeViewport) { await activeViewport.setStack(imageStack); activeViewport.render(); + } else { + await Promise.all([ + loadImagesInDirection("forward", signal), + loadImagesInDirection("backward", signal), + ]); } - setIsLoadingMore(false); }; useEffect(() => { @@ -200,20 +216,12 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { const handleFetchMoreImages = (_event: any) => { if (!multiFrameDisplay) { const id = activeViewport.getCurrentImageIdIndex(); - console.log( - id >= Math.floor(imageStack.length / 2) && - fetchMore && - handlePagination && - !filesLoading && - totalImagesProcessed === list.length, - "TotalImagesProcessed", - totalImagesProcessed, - ); if ( id >= Math.floor(imageStack.length / 2) && fetchMore && handlePagination && - !filesLoading + !filesLoading && + lastProcessedIndex === list.length - 1 ) { handlePagination(); } From 5f99267938351bee7ee6027a16505eec65b4eac2 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Thu, 26 Sep 2024 17:29:01 -0400 Subject: [PATCH 261/337] fix: Fix the bug in dicom scrolling --- .../Preview/displays/DcmDisplay.tsx | 189 +++++++++--------- 1 file changed, 90 insertions(+), 99 deletions(-) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 13d338664..958318744 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -12,12 +12,12 @@ import { basicInit, cleanupCornerstoneTooling, displayDicomImage, - handleEvents, loadDicomImage, registerToolingOnce, removeTools, setUpTooling, } from "./dicomUtils/utils"; +import { handleEvents } from "./dicomUtils/utils"; export type DcmImageProps = { selectedFile?: IFileBlob; @@ -39,6 +39,7 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { handlePagination, filesLoading, } = props; + const [activeViewport, setActiveViewport] = useState< IStackViewport | undefined >(); @@ -46,16 +47,15 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { const [multiFrameDisplay, setMultiframeDisplay] = useState(false); const [imageStack, setImageStack] = useState([]); const [renderingEngine, setRenderingEngine] = useState(); - const [loadedIndexes, setLoadedIndexes] = useState>(new Set()); - const [isLoadingMore, setIsLoadingMore] = useState(false); - const [lastProcessedIndex, setLastProcessedIndex] = useState(0); + const [isLoadingImages, setIsLoadingImages] = useState(true); + const [lastProcessedIndex, setLastProcessedIndex] = useState(0); // Track last processed file index + const dicomImageRef = useRef(null); const uniqueId = `${selectedFile?.data.id || v4()}`; const elementId = `cornerstone-element-${uniqueId}`; - const size = useSize(dicomImageRef); // Use the useSize hook with dicomImageRef + const size = useSize(dicomImageRef); const handleResize = () => { - // Update the element with elementId when the size of dicomImageRef changes if (dicomImageRef.current && size) { const parentWidth = size.width; const parentHeight = size.height; @@ -74,10 +74,9 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { return () => { window.removeEventListener("resize", handleResize); }; - }, []); + }, [size, renderingEngine, activeViewport]); useEffect(() => { - //Global registration needs to happen once registerToolingOnce(); return () => { renderingEngine?.destroy(); @@ -102,27 +101,22 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { (_, i) => `${imageID}?frame=${i}`, ) : [imageID]; + const { viewport, renderingEngine: newRenderingEngine } = await displayDicomImage(element, newImageStack[0], uniqueId); + setMultiframeDisplay(framesCount > 1); setActiveViewport(viewport); setRenderingEngine(newRenderingEngine); setImageStack(newImageStack); - const currentIndex = list?.findIndex( - (file) => file.data.fname === selectedFile.data.fname, - ); - if (currentIndex) { - const newSet = new Set(loadedIndexes); - setLoadedIndexes(newSet.add(currentIndex)); - setLastProcessedIndex(currentIndex); - } + setIsLoadingImages(false); return selectedFile.data.fname; } } const { isLoading } = useQuery({ queryKey: ["cornerstone-preview", selectedFile], - queryFn: () => setupCornerstone(), + queryFn: setupCornerstone, enabled: !!selectedFile, }); @@ -145,112 +139,114 @@ const DcmDisplay: React.FC = (props: DcmImageProps) => { return imageData.imageID; }; - const loadImagesInDirection = async ( - direction: "forward" | "backward", - signal: AbortSignal, - ) => { - setIsLoadingMore(true); - if (list && !multiFrameDisplay) { - const newImageStack = [...imageStack]; - const step = direction === "forward" ? 1 : -1; - const endCondition = (i: number) => - direction === "forward" ? i < list.length : i >= 0; - const startIndex = - direction === "forward" - ? lastProcessedIndex + 1 - : lastProcessedIndex - 1; - const newLoadedIndexes = new Set(loadedIndexes); - for (let i = startIndex; endCondition(i) && !signal.aborted; i += step) { - if (newLoadedIndexes.has(i)) continue; - const imageID = await loadImage(list[i]); - if (imageID) { - if (direction === "forward") { - newImageStack.push(imageID); - } else { - newImageStack.unshift(imageID); + async function* imageBatchGenerator( + start: number, + end: number, + skipIndex: number, + ) { + if (list) { + for (let i = start; i < end; i++) { + // Skip already loaded file + if (i === skipIndex) continue; + + const file = list[i]; + if (file) { + const imageID = await loadImage(file); + if (imageID) { + yield imageID; // Yield the image ID one by one } - newLoadedIndexes.add(i); } } - setImageStack([...newImageStack]); - setLoadedIndexes(new Set(newLoadedIndexes)); - setLastProcessedIndex(direction === "forward" ? list.length - 1 : 0); + } + } + + const loadImagesInBatches = async ( + start: number, + end: number, + skipIndex: number, + ) => { + const generator = imageBatchGenerator(start, end, skipIndex); + const newImageStack: string[] = []; // Temporary stack to hold new images + + for await (const newImage of generator) { + newImageStack.push(newImage); + } + + // Once all images are loaded, update the imageStack and the viewport + setImageStack((prevStack) => { + const updatedStack = [...prevStack, ...newImageStack]; + + // Update the viewport with the entire stack if (activeViewport) { - await activeViewport.setStack(newImageStack, currentImageIndex); + const currentIndex = activeViewport.getCurrentImageIdIndex(); + activeViewport.setStack(updatedStack, currentIndex); activeViewport.render(); } + + return updatedStack; // Update the state with the full stack + }); + }; + + const loadAllImages = async () => { + if (list && !multiFrameDisplay && !isLoading) { + const selectedIndex = list.findIndex( + (file) => file.data.fname === selectedFile?.data.fname, + ); + await loadImagesInBatches(lastProcessedIndex, list.length, selectedIndex); + setLastProcessedIndex(list.length); // Update the last processed index } - setIsLoadingMore(false); }; - const loadMoreImages = async (signal: AbortSignal) => { - if (multiFrameDisplay && activeViewport) { - await activeViewport.setStack(imageStack); + const loadMultiFrames = async () => { + if (activeViewport) { + const currentIndex = activeViewport.getCurrentImageIdIndex(); + await activeViewport.setStack(imageStack, currentIndex); activeViewport.render(); - } else { - await Promise.all([ - loadImagesInDirection("forward", signal), - loadImagesInDirection("backward", signal), - ]); } }; useEffect(() => { - const controller = new AbortController(); - const signal = controller.signal; - if (!isLoading) { - loadMoreImages(signal); + if (list && !multiFrameDisplay) { + loadAllImages(); + } else if (multiFrameDisplay) { + loadMultiFrames(); } - return () => { - controller.abort(); // Abort loading images on unmount - }; - }, [isLoading, list, multiFrameDisplay]); + }, [isLoading, list, activeViewport, multiFrameDisplay]); useEffect(() => { - if (activeViewport && list) { + if ( + list && + fetchMore && + handlePagination && + !filesLoading && + lastProcessedIndex === list.length - 1 + ) { + handlePagination(); + } + }, [fetchMore, handlePagination, filesLoading]); + + useEffect(() => { + if (activeViewport && list && handlePagination) { const element = activeViewport.element; - const handleImageRendered = (_event: any) => { + const handleImageRendered = () => { const newIndex = activeViewport.getCurrentImageIdIndex(); setCurrentImageIndex(newIndex + 1); - }; - const handleFetchMoreImages = (_event: any) => { - if (!multiFrameDisplay) { - const id = activeViewport.getCurrentImageIdIndex(); - if ( - id >= Math.floor(imageStack.length / 2) && - fetchMore && - handlePagination && - !filesLoading && - lastProcessedIndex === list.length - 1 - ) { - handlePagination(); - } + if (newIndex >= list.length - 5 && fetchMore && !filesLoading) { + handlePagination(); } }; element.addEventListener(events.IMAGE_RENDERED, handleImageRendered); - element.addEventListener( - events.STACK_VIEWPORT_SCROLL, - handleFetchMoreImages, - ); return () => { element.removeEventListener(events.IMAGE_RENDERED, handleImageRendered); - element.removeEventListener( - events.STACK_VIEWPORT_SCROLL, - handleFetchMoreImages, - ); }; } - }, [ - activeViewport, - imageStack, - fetchMore, - handlePagination, - multiFrameDisplay, - ]); + }, [activeViewport, imageStack, fetchMore, filesLoading]); return ( <> - {isLoading && } + {(isLoading || isLoadingImages) && ( + + )}
= (props: DcmImageProps) => { zIndex: "99999", }} > - {isLoadingMore ? ( - Loading More Images... - ) : ( - `Images Loaded: ${currentImageIndex}/${imageStack.length}` - )} + {`Images Loaded: ${currentImageIndex}/${imageStack.length}`}
-
From 4f94174f0ef261afd865a2bce3aecd7a5c35322a Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Fri, 27 Sep 2024 14:27:46 -0400 Subject: [PATCH 262/337] feat: Update the pipeline page to read from the configured url --- src/components/PipelinesCopy/PipelineUpload.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/PipelinesCopy/PipelineUpload.tsx b/src/components/PipelinesCopy/PipelineUpload.tsx index 6be197c44..daf58fc41 100644 --- a/src/components/PipelinesCopy/PipelineUpload.tsx +++ b/src/components/PipelinesCopy/PipelineUpload.tsx @@ -11,6 +11,7 @@ import { uploadPipelineSourceFile, extractPluginInfo, } from "./utils"; +import { Cookies } from "react-cookie"; interface Notification { type: "warning" | "success" | "info" | "error" | undefined; @@ -22,6 +23,7 @@ const PipelineUpload = ({ }: { fetchPipelinesAgain: () => void; }) => { + const cookies = new Cookies(); const fileInput = useRef(null); const [notification, setNotification] = useState({ type: undefined, @@ -40,7 +42,8 @@ const PipelineUpload = ({ description: `Installing plugin: ${name} version: ${version}`, }); - const storeUrl = import.meta.env.VITE_CHRIS_STORE_URL; + const storeUrl = + cookies.get("configure_url") || import.meta.env.VITE_CHRIS_STORE_URL; if (!storeUrl) { throw new Error("Failed to connect to a remote store"); } From d3a0301b56582c6e5a5edbe5f3ee268921a1ad3a Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Fri, 27 Sep 2024 14:41:03 -0400 Subject: [PATCH 263/337] feat: Error Handling in the pipelines page --- .../PipelinesCopy/PipelineUpload.tsx | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/components/PipelinesCopy/PipelineUpload.tsx b/src/components/PipelinesCopy/PipelineUpload.tsx index daf58fc41..98268a6c5 100644 --- a/src/components/PipelinesCopy/PipelineUpload.tsx +++ b/src/components/PipelinesCopy/PipelineUpload.tsx @@ -98,6 +98,9 @@ const PipelineUpload = ({ retryUploadFile = false; // Exit the loop if the upload was successful } catch (error) { + // Set retryUploadFile to false for unexpected errors + retryUploadFile = false; + if (axios.isAxiosError(error)) { const errorDictionary = error.response?.data; @@ -109,14 +112,11 @@ const PipelineUpload = ({ type: "error", description: `Error: ${message}.`, }); - retryUploadFile = false; - } - - if (!isEmpty(errorDictionary?.plugin_tree)) { - // This handles the case when the pipeline has plugins with versions missing in the store. CUBE throws missing plugin errors one at a time, so we reattempt the upload and install the missing plugins until the pipeline is uploaded successfully. + } else if (!isEmpty(errorDictionary?.plugin_tree)) { + // Handle missing plugin errors, reattempt the upload if possible const plugin_tree_errors = errorDictionary.plugin_tree; - // Extract the missing plugin's name and version from the error message const extractedInfo = extractPluginInfo(plugin_tree_errors[0]); + if (extractedInfo) { const { name, version } = extractedInfo; @@ -126,24 +126,35 @@ const PipelineUpload = ({ }); try { - // Attempt to install the plugin from the registered store + // Attempt to install the plugin await installPlugin(name, version); + // Retry file upload after successful plugin installation + retryUploadFile = true; // Allow retrying if plugin installation succeeds } catch (installError: any) { setNotification({ type: "error", description: `Failed to install plugin "${name}" version "${version}". ${installError.message}. You may need to connect to a different store to install this plugin.`, }); - retryUploadFile = false; // Stop retrying if plugin installation fails } + } else { + setNotification({ + type: "error", + description: `${plugin_tree_errors[0]}`, + }); } + } else { + // Handle unexpected errors + setNotification({ + type: "error", + description: "An unexpected error occurred", + }); } } else { - // Handle unexpected errors + // Handle non-Axios errors setNotification({ type: "error", description: "An unexpected error occurred", }); - retryUploadFile = false; } } } @@ -156,6 +167,8 @@ const PipelineUpload = ({ } }; + console.log("Notification", notification); + return (
- @@ -294,18 +263,22 @@ const Store = () => { isOpen={configureStore} variant="small" aria-label="Configure a store" - onClose={() => { - setConfigureStore(!configureStore); - }} + onClose={() => setConfigureStore(false)} > { - setConfigureStoreValue(value); - }} + id="temp_url" + value={tempURLValue} + defaultValue="http://rc-live.tch.harvard.edu:32222/api/v1/" + onChange={(_e, value) => setTempURLValue(value)} name="configureStore" + onKeyDown={(e) => { + if (e.key === "Enter") { + e.preventDefault(); + handleStoreURLConfiguration(tempURLValue); + } + }} /> @@ -314,26 +287,10 @@ const Store = () => { - - @@ -343,37 +300,18 @@ const Store = () => {
- You are currently viewing plugins fetched from{" "} - {configureStoreValue || import.meta.env.VITE_CHRIS_STORE_URL} + You are currently viewing plugins fetched from {configureURL}
- + { -

+

{plugin.data.name}

@@ -421,32 +354,20 @@ const Store = () => {
{plugin.data.title}
-
{plugin.data.authors}
-

+

{format( new Date(plugin.data.modification_date), "do MMMM, yyyy", )}

-

+

Version:{" "} { - setVersion({ - [plugin.data.id]: selectedVersion, - }); + setVersion({ [plugin.data.id]: selectedVersion }); }} currentVersion={ version[plugin.data.id] || plugin.data.version @@ -454,7 +375,6 @@ const Store = () => { plugins={plugin.data.plugins} />

- {isInstalled ? (
{ }} > - {" "}
Installed
@@ -481,15 +398,13 @@ const Store = () => { installingPlugin?.data.id === plugin.data.id && handleInstallMutation.isPending && } - style={{ - marginTop: "1em", - }} + style={{ marginTop: "1em" }} onClick={() => { setInstallingPlugin(plugin); if (isStaff) { handleSave(plugin); } else { - setEnterAdminCred(!enterAdminCred); + setEnterAdminCred(true); } }} > From bc7635718e24fed078f0510ba7d77cbbeaf73ec3 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Mon, 30 Sep 2024 18:34:51 -0400 Subject: [PATCH 267/337] feat: Update the Store --- .../PipelinesCopy/PipelineUpload.tsx | 46 ++- src/components/PipelinesCopy/context.tsx | 2 +- src/components/PipelinesCopy/index.tsx | 2 +- src/components/PipelinesCopy/utils.ts | 13 +- src/components/Store/index.tsx | 373 +++++++++++------- 5 files changed, 283 insertions(+), 153 deletions(-) diff --git a/src/components/PipelinesCopy/PipelineUpload.tsx b/src/components/PipelinesCopy/PipelineUpload.tsx index 3854fe724..71cf47de0 100644 --- a/src/components/PipelinesCopy/PipelineUpload.tsx +++ b/src/components/PipelinesCopy/PipelineUpload.tsx @@ -1,18 +1,18 @@ import Client from "@fnndsc/chrisapi"; import { Button } from "@patternfly/react-core"; -import { Alert } from "../Antd"; import axios from "axios"; import { isEmpty } from "lodash"; import { useRef, useState } from "react"; +import { Cookies } from "react-cookie"; import ChrisAPIClient from "../../api/chrisapiclient"; +import { Alert } from "../Antd"; import { fetchPluginMetasFromStore, handleInstallPlugin, - uploadPipelineSourceFile, - extractPluginInfo, -} from "./utils"; -import { Cookies } from "react-cookie"; - +} from "../PipelinesCopy/utils"; +import { uploadPipelineSourceFile } from "./utils"; +import { extractPluginInfo } from "./utils"; +import { useAppSelector } from "../../store/hooks"; interface Notification { type: "warning" | "success" | "info" | "error" | undefined; description: string; @@ -23,6 +23,7 @@ const PipelineUpload = ({ }: { fetchPipelinesAgain: () => void; }) => { + const isStaff = useAppSelector((state) => state.user.isStaff); const cookies = new Cookies(); const fileInput = useRef(null); const [notification, setNotification] = useState({ @@ -57,12 +58,37 @@ const PipelineUpload = ({ version, ); - // This feature is only available to logged-in users with a valid token - // If you have a token, install the plugin by making a request to the admin URL + // Read values from cookies + const admin_username = cookies.get("admin_username"); + const admin_password = cookies.get("admin_password"); + const compute_resource = cookies.get("compute_resource") || "host"; // Default to 'host' if not set + + // This feature is available to logged-in users or with admin credentials const client = ChrisAPIClient.getClient(); - const nonAdminCredentials = `Token ${client.auth.token}`; + + let authorization: string; + + if (isStaff) { + // Use the token if the user is logged in + authorization = `Token ${client.auth.token}`; + } else if (admin_username && admin_password) { + // Use admin credentials if available + const adminCredentials = btoa( + `${admin_username.trim()}:${admin_password.trim()}`, + ); + authorization = `Basic ${adminCredentials}`; + } else { + throw new Error( + "Please log in or provide admin credentials to install the plugin.", + ); + } + try { - await handleInstallPlugin(nonAdminCredentials, selectedPlugin); + await handleInstallPlugin( + authorization, + selectedPlugin, + compute_resource, + ); } catch (e) { // biome-ignore lint/complexity/noUselessCatch: throw e; diff --git a/src/components/PipelinesCopy/context.tsx b/src/components/PipelinesCopy/context.tsx index 825bb1b3e..60acef2c0 100644 --- a/src/components/PipelinesCopy/context.tsx +++ b/src/components/PipelinesCopy/context.tsx @@ -1,4 +1,4 @@ -import { +import type { ComputeResource, Pipeline, PipelinePipingDefaultParameterList, diff --git a/src/components/PipelinesCopy/index.tsx b/src/components/PipelinesCopy/index.tsx index 5fc0c6338..902da0943 100644 --- a/src/components/PipelinesCopy/index.tsx +++ b/src/components/PipelinesCopy/index.tsx @@ -221,7 +221,7 @@ const PipelinesCopy = () => { />
- {isStaff && } + {} {isError && ( {error.message}} /> diff --git a/src/components/PipelinesCopy/utils.ts b/src/components/PipelinesCopy/utils.ts index 9907e2fc6..b5b1e78cb 100644 --- a/src/components/PipelinesCopy/utils.ts +++ b/src/components/PipelinesCopy/utils.ts @@ -90,6 +90,7 @@ export const uploadPipelineSourceFile = async (client: Client, file: File) => { export const handleInstallPlugin = async ( adminCred: string, pluginToInstall: Plugin, + computeResource: string, ) => { const adminURL = import.meta.env.VITE_CHRIS_UI_URL.replace( "/api/v1/", @@ -99,7 +100,7 @@ export const handleInstallPlugin = async ( throw new Error("Please provide a link to your chris-admin url"); const pluginData = { - compute_names: "host", + compute_names: computeResource, name: pluginToInstall.data.name, version: pluginToInstall.data.version, plugin_store_url: pluginToInstall.url, @@ -115,22 +116,22 @@ export const handleInstallPlugin = async ( const data = await response.data; return data; } catch (e) { - console.log("Error", e); if (axios.isAxiosError(e) && e.response?.data) { const message = e.response.data; - // Log the entire error for more detailed context - console.error("Full error response:", message); - + if (message.detail) { + // Handle case { detail: "Invalid Username/Password" } + throw new Error(message.detail); + } // Check if it's an object with errors if (typeof message === "object") { const firstErrorKey = Object.keys(message)[0]; // Get the first error key const firstErrorMessage = message[firstErrorKey][0]; // Get the first error message throw new Error(`${firstErrorMessage}`); } - } else { throw new Error("An unexpected error occurred"); } + throw new Error("An unexpected error occurred"); } }; diff --git a/src/components/Store/index.tsx b/src/components/Store/index.tsx index eb07fcd38..db8f7e80f 100644 --- a/src/components/Store/index.tsx +++ b/src/components/Store/index.tsx @@ -1,4 +1,8 @@ -import Client, { type Plugin } from "@fnndsc/chrisapi"; +import Client, { + type ComputeResource, + type ComputeResourceList, + type Plugin, +} from "@fnndsc/chrisapi"; import { ActionGroup, Badge, @@ -28,8 +32,7 @@ import { } from "@patternfly/react-core"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { format } from "date-fns"; -import { isEmpty } from "lodash"; -import { type Ref, useEffect, useState } from "react"; +import { type Ref, useEffect, useState, useCallback, useMemo } from "react"; import { Cookies, useCookies } from "react-cookie"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useAppSelector } from "../../store/hooks"; @@ -47,6 +50,7 @@ import WrapperConnect from "../Wrapper"; const Store: React.FC = () => { const isStaff = useAppSelector((state) => state.user.isStaff); + const isLoggedIn = useAppSelector((state) => state.user.isLoggedIn); const queryClient = useQueryClient(); const [_cookie, setCookie] = useCookies(); const [api, contextHolder] = notification.useNotification(); @@ -54,52 +58,124 @@ const Store: React.FC = () => { const [installingPlugin, setInstallingPlugin] = useState< { data: any } | undefined >(undefined); - const [enterAdminCred, setEnterAdminCred] = useState(false); - const [username, setUsername] = useState(""); - const [password, setPassword] = useState(""); + const [isConfigModalOpen, setIsConfigModalOpen] = useState(false); const [search, setSearch] = useState(""); const [tempURLValue, setTempURLValue] = useState(""); const [configureURL, setConfigureURL] = useState(""); - const [configureStore, setConfigureStore] = useState(false); + const [computeResourceOptions, setComputeResourceOptions] = useState< + string[] + >([]); + const [dropdown, setDropdown] = useState(false); const defaultStoreURL = import.meta.env.VITE_CHRIS_STORE_URL; + const localCubeURL = import.meta.env.VITE_CHRIS_UI_URL; const cookies = new Cookies(); const cookie_username = cookies.get("admin_username"); const cookie_password = cookies.get("admin_password"); const configure_url = cookies.get("configure_url"); + const compute_resource = cookies.get("compute_resource"); + + // Initialize username and password with default values + const [username, setUsername] = useState(() => { + if (cookie_username) return cookie_username; + if (isStaff) return "chris"; + return ""; + }); + + const [password, setPassword] = useState(() => { + if (cookie_password) return cookie_password; + if (isStaff) return "chris1234"; + return ""; + }); + + // Initialize computeResource from cookie or default to 'host' + const [computeResource, setComputeResource] = useState(() => { + return compute_resource || "host"; + }); + + // Fetch compute resources on load + useEffect(() => { + async function fetchComputeResources() { + if (!isLoggedIn) { + // User is not logged in, do not fetch compute resources + setComputeResourceOptions([]); + // Set computeResource from cookie if available + if (compute_resource) { + setComputeResource(compute_resource); + } + return; + } + + const client = ChrisAPIClient.getClient(); + try { + const response: ComputeResourceList = + await client.getComputeResources(); + const items = response.getItems() as ComputeResource[]; + const availableResources: string[] = items.map( + (resource: any) => resource.data.name, + ); + + if (availableResources.length === 0) { + // No compute resources available, set default to 'host' + setComputeResourceOptions([]); + setComputeResource("host"); + } else { + setComputeResourceOptions(availableResources); + // Set the default compute resource + if ( + compute_resource && + availableResources.includes(compute_resource) + ) { + setComputeResource(compute_resource); + } else { + setComputeResource(availableResources[0]); // Set the first compute resource as default + } + } + } catch (error: any) { + // Failed to fetch compute resources, set default to 'host' + setComputeResourceOptions([]); + setComputeResource("host"); + } + } + + fetchComputeResources(); + }, [api, compute_resource, isLoggedIn]); useEffect(() => { document.title = "Store Catalog"; - setUsername(cookie_username || ""); - setPassword(cookie_password || ""); + + setTempURLValue(configure_url || defaultStoreURL); setConfigureURL(configure_url || defaultStoreURL); - }, [cookie_username, cookie_password, configure_url, defaultStoreURL]); + }, [isStaff, configure_url, defaultStoreURL, isLoggedIn]); - const fetchPlugins = async (search: string) => { - const client = new Client(configureURL); - try { - const params = { - limit: 20, - offset: 0, - name: search.trim().toLowerCase(), - }; - const pluginMetas = await fetchPluginMetas(client, params); - - const newPluginPayload = await Promise.all( - pluginMetas.map(async (plugin) => { - const pluginItems = await fetchPluginForMeta(plugin); - const version = pluginItems?.[0]?.data.version || ""; - return { data: { ...plugin.data, version, plugins: pluginItems } }; - }), - ); - return { pluginMetaList: newPluginPayload, client }; - } catch (error) { - // biome-ignore lint/complexity/noUselessCatch: - throw error; - } - }; + const fetchPlugins = useCallback( + async (search: string) => { + const client = new Client(configureURL); + try { + const params = { + limit: 20, + offset: 0, + name: search.trim().toLowerCase(), + }; + const pluginMetas = await fetchPluginMetas(client, params); + + const newPluginPayload = await Promise.all( + pluginMetas.map(async (plugin) => { + const pluginItems = await fetchPluginForMeta(plugin); + const version = pluginItems?.[0]?.data.version || ""; + return { data: { ...plugin.data, version, plugins: pluginItems } }; + }), + ); + return { pluginMetaList: newPluginPayload, client }; + } catch (error) { + // biome-ignore lint/complexity/noUselessCatch: + throw error; + } + }, + [configureURL], + ); - const fetchExistingPlugins = async () => { + const fetchExistingPlugins = useCallback(async () => { const existingClient = ChrisAPIClient.getClient(); const plugins = await fetchPluginMetas(existingClient); @@ -116,16 +192,13 @@ const Store: React.FC = () => { }), ); } - }; + }, []); const handleInstall = async (selectedPlugin: Plugin) => { - const adminURL = import.meta.env.VITE_CHRIS_UI_URL.replace( - "/api/v1/", - "/chris-admin/api/v1/", - ); + const adminURL = localCubeURL.replace("/api/v1/", "/chris-admin/api/v1/"); + if (!adminURL) throw new Error("Please provide a link to your chris-admin url"); - const client = ChrisAPIClient.getClient(); const adminCredentials = btoa(`${username.trim()}:${password.trim()}`); const nonAdminCredentials = `Token ${client.auth.token}`; @@ -134,9 +207,11 @@ const Store: React.FC = () => { : nonAdminCredentials; try { - const data = await handleInstallPlugin(authorization, selectedPlugin); - setCookie("admin_username", username, { path: "/", maxAge: 86400 }); - setCookie("admin_password", password, { path: "/", maxAge: 86400 }); + const data = await handleInstallPlugin( + authorization, + selectedPlugin, + computeResource, + ); return data; } catch (error) { // biome-ignore lint/complexity/noUselessCatch: @@ -146,11 +221,17 @@ const Store: React.FC = () => { const handleInstallMutation = useMutation({ mutationFn: (selectedPlugin: Plugin) => handleInstall(selectedPlugin), - onSettled: (_data, error) => { - if (!isEmpty(error)) { - setInstallingPlugin(undefined); - setEnterAdminCred(false); - } + onSuccess: (_data) => { + queryClient.invalidateQueries({ queryKey: ["existingStorePlugins"] }); + api.success({ message: "Plugin Successfully installed..." }); + setInstallingPlugin(undefined); + }, + onError: (error: any) => { + api.error({ + message: "Failed to Install the plugin", + description: error.message, + }); + setInstallingPlugin(undefined); }, }); @@ -175,49 +256,51 @@ const Store: React.FC = () => { if (selectedPlugin) handleInstallMutation.mutate(selectedPlugin); }; - useEffect(() => { - if (handleInstallMutation.isSuccess) { - queryClient.invalidateQueries({ queryKey: ["existingStorePlugins"] }); - api.success({ message: "Plugin Successfully installed..." }); - } + const handleConfigSave = (e: React.FormEvent) => { + e.preventDefault(); - if (handleInstallMutation.isError) { - api.error({ - message: "Failed to Install the plugin", - description: handleInstallMutation.error.message, - }); - } - }, [ - handleInstallMutation.isSuccess, - handleInstallMutation.isError, - api, - queryClient, - ]); - - const TitleComponent = ( - - ); + // Save to cookies + setCookie("admin_username", username, { path: "/", maxAge: 86400 }); + setCookie("admin_password", password, { path: "/", maxAge: 86400 }); + setCookie("configure_url", tempURLValue, { path: "/", maxAge: 86400 }); + setCookie("compute_resource", computeResource, { + path: "/", + maxAge: 86400, + }); + + // Update the configureURL + setConfigureURL(tempURLValue); - const handleStoreURLConfiguration = (tempURL: string) => { - setConfigureURL(tempURL); - setCookie("configure_url", tempURL, { path: "/" }); - setConfigureStore(false); + // Close the modal + setIsConfigModalOpen(false); + + // If there is a plugin pending installation, proceed to install + if (installingPlugin) { + handleSave(); + } }; + const TitleComponent = useMemo( + () => ( + + ), + [], + ); + return ( {contextHolder} setEnterAdminCred(false)} - aria-label="Enter admin credentials" + isOpen={isConfigModalOpen} + onClose={() => setIsConfigModalOpen(false)} + aria-label="Configure Store" > - - + + { onChange={(_event, value: string) => setUsername(value)} /> - + setPassword(value)} - onKeyDown={(e) => e.key === "Enter" && handleSave()} /> - - - - - {handleInstallMutation.isError && ( - - )} - - - - setConfigureStore(false)} - > -
- + setTempURLValue(value)} - name="configureStore" - onKeyDown={(e) => { - if (e.key === "Enter") { - e.preventDefault(); - handleStoreURLConfiguration(tempURLValue); - } - }} + onChange={(_event, value: string) => setTempURLValue(value)} + placeholder="http://rc-live.tch.harvard.edu:32222/api/v1/" /> @@ -286,11 +333,56 @@ const Store: React.FC = () => { Example: http://rc-live.tch.harvard.edu:32222/api/v1/ + + {computeResourceOptions.length > 0 ? ( + + ) : ( + setComputeResource(value)} + /> + )} + - - @@ -305,13 +397,13 @@ const Store: React.FC = () => {
- + { {isLoading && } - {isError && } + {isError && } {data && ( @@ -367,7 +459,10 @@ const Store: React.FC = () => { Version:{" "} { - setVersion({ [plugin.data.id]: selectedVersion }); + setVersion({ + ...version, + [plugin.data.id]: selectedVersion, + }); }} currentVersion={ version[plugin.data.id] || plugin.data.version @@ -394,19 +489,27 @@ const Store: React.FC = () => { ) : ( From 630a9c88d3d67b5ae90757f549288cff4ef18162 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 2 Oct 2024 13:31:54 -0400 Subject: [PATCH 268/337] feat: Update biome.json to show react-hooks/exhaustive-deps --- biome.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/biome.json b/biome.json index 667c21416..53d6a1572 100644 --- a/biome.json +++ b/biome.json @@ -30,7 +30,7 @@ "noForEach": "off" }, "correctness": { - "useExhaustiveDependencies": "off" + "useExhaustiveDependencies": "warn" }, "suspicious": { "noExplicitAny": "off" From c2db78eba380752697ba8d9dd8ee71bf94ca703d Mon Sep 17 00:00:00 2001 From: Jennings Zhang Date: Wed, 2 Oct 2024 14:21:22 -0400 Subject: [PATCH 269/337] Update cube:6.3.0-beta.2 See https://github.com/FNNDSC/ChRIS_ultron_backEnd/releases/tag/v6.3.0-beta.2 --- testing/miniChRIS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/miniChRIS b/testing/miniChRIS index a70318e5c..9b4c5dfa5 160000 --- a/testing/miniChRIS +++ b/testing/miniChRIS @@ -1 +1 @@ -Subproject commit a70318e5c6c6ce3d5e9bba82302ba67d490bd0f8 +Subproject commit 9b4c5dfa5f0b4278b1384bbf6513a9178bab3218 From 436d87e372208257c5ebb923adee80a8edc2fb66 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 2 Oct 2024 14:47:31 -0400 Subject: [PATCH 270/337] feat: Add a sticky header to the library page --- src/components/NewLibrary/index.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index 74d27ab4c..edcf35802 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -185,7 +185,12 @@ const NewLibrary = () => { return ( {contextHolder} - + { /> - + {isFetching && } {isError && } {/* Render based on currentLayout */} From 74c905b0aa01b27a2790039a56e91303909ca562 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Wed, 2 Oct 2024 17:15:12 -0400 Subject: [PATCH 271/337] feat: Replace Patternfly Drawers with React Resizable Panels --- package.json | 1 + pnpm-lock.yaml | 14 + .../FeedOutputBrowser/FileBrowser.tsx | 334 ++++++++++-------- src/components/Feeds/FeedView.tsx | 108 +++--- src/components/Feeds/Feeds.css | 54 +++ .../components/BreadcrumbContainer.tsx | 4 +- src/components/NewLibrary/index.tsx | 4 +- 7 files changed, 301 insertions(+), 218 deletions(-) diff --git a/package.json b/package.json index 640a34055..16d54268b 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "react-json-view": "^1.21.3", "react-lazylog": "^4.5.3", "react-redux": "^9.1.2", + "react-resizable-panels": "^2.1.4", "react-router": "^6.26.2", "react-router-dom": "^6.26.2", "redux-saga": "^1.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db6cd26d5..83020e3f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -158,6 +158,9 @@ importers: react-redux: specifier: ^9.1.2 version: 9.1.2(@types/react@18.3.4)(react@18.3.1)(redux@5.0.1) + react-resizable-panels: + specifier: ^2.1.4 + version: 2.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-router: specifier: ^6.26.2 version: 6.26.2(react@18.3.1) @@ -3767,6 +3770,12 @@ packages: redux: optional: true + react-resizable-panels@2.1.4: + resolution: {integrity: sha512-kzue8lsoSBdyyd2IfXLQMMhNujOxRoGVus+63K95fQqleGxTfvgYLTzbwYMOODeAHqnkjb3WV/Ks7f5+gDYZuQ==} + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 + react-router-dom@6.26.2: resolution: {integrity: sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==} engines: {node: '>=14.0.0'} @@ -8654,6 +8663,11 @@ snapshots: '@types/react': 18.3.4 redux: 5.0.1 + react-resizable-panels@2.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.19.2 diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 3baaa0366..b9cf00797 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -7,11 +7,6 @@ import { Breadcrumb, BreadcrumbItem, Button, - Drawer, - DrawerContent, - DrawerContentBody, - DrawerPanelBody, - DrawerPanelContent, Grid, Tooltip, } from "@patternfly/react-core"; @@ -43,6 +38,8 @@ import { OperationContext } from "../NewLibrary/context"; import FileDetailView from "../Preview/FileDetailView"; import XtkViewer from "../XtkViewer/XtkViewer"; import type { FileBrowserProps } from "./types"; +import { PanelGroup, Panel, PanelResizeHandle } from "react-resizable-panels"; +import backgroundColors from "@cornerstonejs/core/dist/types/constants/backgroundColors"; const previewAnimation = [{ opacity: "0.0" }, { opacity: "1.0" }]; @@ -100,7 +97,7 @@ const FileBrowser = (props: FileBrowserProps) => { description: downloadError.message, }); } - }, [isSuccess, isError, downloadError]); + }, [api, isSuccess, isError, downloadError, handleDownloadMutation]); const generateBreadcrumb = (value: string, index: number) => { const onClick = () => { @@ -148,40 +145,6 @@ const FileBrowser = (props: FileBrowserProps) => { ?.animate(previewAnimation, previewAnimationTiming); }; - const previewPanel = ( - - { - handleMaximize("preview", dispatch); - }} - handleMinimize={() => { - handleMinimize("preview", dispatch); - }} - maximized={drawerState.preview.maximized} - /> - - {drawerState.preview.currentlyActive === "preview" && selectedFile && ( - - )} - {drawerState.preview.currentlyActive === "xtk" && } - - - ); - const origin = { type: OperationContext.FILEBROWSER, additionalKeys: [additionalKey], @@ -190,11 +153,14 @@ const FileBrowser = (props: FileBrowserProps) => { return ( {contextHolder} - - + {/* Left Panel: File Browser */} + + {/* Drawer Action Button for Files */} { @@ -206,81 +172,73 @@ const FileBrowser = (props: FileBrowserProps) => { maximized={drawerState.files.maximized} /> {drawerState.files.open && ( - - -
-
- - {breadcrumb.map(generateBreadcrumb)} -
- -
- {additionalKey !== currentPath && - selected.data.plugin_type === "fs" && ( - Go back to the base directory} - > - - - )} + + + )} +
- - - - - - - - - - - {filesMap?.map((resource: FileBrowserFolderFile, index) => { - return ( - { - return; - }} - handleFileClick={() => { - toggleAnimation(); - dispatch( - setSelectedFile(resource as FileBrowserFolderFile), - ); - !drawerState.preview.open && - dispatch(setFilePreviewPanel()); - }} - origin={origin} - /> - ); - })} - {linkFilesMap?.map( - (resource: FileBrowserFolderLinkFile, index) => { + {/* Scrollable Content */} +
+
- {columnNames.name}{columnNames.created}{columnNames.creator}{columnNames.size}
+ + + + + + + + + + {filesMap?.map((resource: FileBrowserFolderFile, index) => { return ( - { return; }} handleFileClick={() => { - handleFileClick(resource.data.path); + toggleAnimation(); + dispatch( + setSelectedFile( + resource as FileBrowserFolderFile, + ), + ); + !drawerState.preview.open && + dispatch(setFilePreviewPanel()); }} origin={origin} /> ); - }, - )} + })} + {linkFilesMap?.map( + (resource: FileBrowserFolderLinkFile, index) => { + return ( + { + return; + }} + handleFileClick={() => { + handleFileClick(resource.data.path); + }} + origin={origin} + /> + ); + }, + )} - {subFoldersMap?.map((resource: FileBrowserFolder, index) => { - return ( - - handleFileClick(resource.data.path) - } - handleFileClick={() => { - return; - }} - origin={origin} - /> - ); - })} - -
+ {columnNames.name}{columnNames.created}{columnNames.creator}{columnNames.size}
- {fetchMore && !isLoading && ( - - )} -
- + {subFoldersMap?.map( + (resource: FileBrowserFolder, index) => { + return ( + + handleFileClick(resource.data.path) + } + handleFileClick={() => { + return; + }} + origin={origin} + /> + ); + }, + )} + + + {/* Load More Button */} + {fetchMore && !isLoading && ( + + )} + {/* Observer Target */} +
+
+ )} - - + + + {/* Resize Handle */} + {drawerState.preview.open && ( + + )} + + {/* Right Panel: Preview Panel */} + {drawerState.preview.open && ( + + {/* Drawer Action Button for Preview */} + { + handleMaximize("preview", dispatch); + }} + handleMinimize={() => { + handleMinimize("preview", dispatch); + }} + maximized={drawerState.preview.maximized} + /> +
+ {drawerState.preview.currentlyActive === "preview" && + selectedFile && ( + + )} + {drawerState.preview.currentlyActive === "xtk" && } +
+
+ )} + ); }; diff --git a/src/components/Feeds/FeedView.tsx b/src/components/Feeds/FeedView.tsx index 942f94985..d2ee3cc63 100644 --- a/src/components/Feeds/FeedView.tsx +++ b/src/components/Feeds/FeedView.tsx @@ -1,11 +1,6 @@ import type { Feed, PluginInstance } from "@fnndsc/chrisapi"; -import { - Drawer, - DrawerContent, - DrawerContentBody, - DrawerPanelContent, - Tooltip, -} from "@patternfly/react-core"; +import { Tooltip } from "@patternfly/react-core"; +import { PanelGroup, Panel, PanelResizeHandle } from "react-resizable-panels"; import { Typography } from "antd"; import React, { useCallback, useEffect, useRef } from "react"; import { useLocation, useNavigate, useParams } from "react-router"; @@ -36,6 +31,8 @@ import { DrawerActionButton } from "./DrawerUtils"; import { useFetchFeed } from "./useFetchFeed"; import { useSearchQueryParams } from "./usePaginate"; import { handleMaximize, handleMinimize } from "./utilties"; +import "./Feeds.css"; // Import your CSS file + const { Title } = Typography; const FeedView: React.FC = () => { @@ -58,6 +55,7 @@ const FeedView: React.FC = () => { selectedPlugin, }; const { feed, contextHolder } = useFetchFeed(id, type, isLoggedIn); + useEffect(() => { if (!type || (type === "private" && !isLoggedIn)) { const redirectTo = encodeURIComponent( @@ -117,33 +115,6 @@ const FeedView: React.FC = () => { [drawerState, dispatch], ); - const feedTreeAndGraph = ( - - - {handleDrawerAction("node")} -
- -
- - } - > - {handleDrawerAction("graph")} - - {!currentLayout ? ( - - ) : ( - - )} - -
-
- ); - const TitleComponent = ( <CodeBranchIcon style={{ marginRight: "0.25em" }} /> @@ -156,31 +127,50 @@ const FeedView: React.FC = () => { return ( <WrapperConnect titleComponent={TitleComponent}> {contextHolder} - <Drawer - isInline - position="bottom" - isExpanded={drawerState.preview.open || drawerState.files.open} - > - <DrawerContent - panelContent={ - <DrawerPanelContent - defaultSize={ - !drawerState.graph.open && !drawerState.node.open - ? "100vh" - : "46vh" - } - isResizable - > - <FeedOutputBrowser - explore={true} - handlePluginSelect={onNodeBrowserClick} - /> - </DrawerPanelContent> - } - > - {feedTreeAndGraph} - </DrawerContent> - </Drawer> + <PanelGroup direction="vertical"> + {/* Top Panels: Graph and Node Details */} + <Panel className="custom-panel" defaultSize={54} minSize={20}> + <PanelGroup direction="horizontal"> + {/* Left Panel: Graph */} + <Panel defaultSize={drawerState.node.open ? 53 : 100} minSize={20}> + {handleDrawerAction("graph")} + {!currentLayout ? ( + <ParentComponent onNodeClick={onNodeClick} /> + ) : ( + <FeedGraph onNodeClick={onNodeClick} /> + )} + </Panel> + + {/* Horizontal Resize Handle */} + {drawerState.node.open && ( + <PanelResizeHandle className="ResizeHandle" /> + )} + + {/* Right Panel: Node Details */} + {drawerState.node.open && ( + <Panel className="custom-panel" defaultSize={47} minSize={20}> + {handleDrawerAction("node")} + <div className="node-block"> + <NodeDetails /> + </div> + </Panel> + )} + </PanelGroup> + </Panel> + + {/* Vertical Resize Handle */} + {(drawerState.preview.open || drawerState.files.open) && ( + <PanelResizeHandle className="ResizeHandleVertical" /> + )} + + {/* Bottom Panel: Feed Output Browser */} + <Panel className="custom-panel" defaultSize={44} minSize={20}> + <FeedOutputBrowser + explore={true} + handlePluginSelect={onNodeBrowserClick} + /> + </Panel> + </PanelGroup> </WrapperConnect> ); }; diff --git a/src/components/Feeds/Feeds.css b/src/components/Feeds/Feeds.css index 5cdd83cf5..3ec35f3ff 100644 --- a/src/components/Feeds/Feeds.css +++ b/src/components/Feeds/Feeds.css @@ -41,3 +41,57 @@ > * { vertical-align: middle !important; } + + + +.custom-panel { + background-color: var(--pf-v5-c-page__main-section--BackgroundColor); + border-right: 1px solid var(--pf-global--BorderColor--dark); +} + + + +/* Common styles for both handles */ +.ResizeHandle, +.ResizeHandleVertical, +.ResizeHandleCollapsed { + background-color: gray; /* Default background color */ + transition: background-color 250ms linear; +} + +/* Horizontal resize handle (between side panels) */ +.ResizeHandle { + width: 0.25rem; + height: 100%; + cursor: col-resize; +} + +/* Vertical resize handle (between top and bottom panels) */ +.ResizeHandleVertical { + height: 0.25rem; + width: 100%; + cursor: row-resize; +} + +/* Hover and active states for both handles */ +.ResizeHandle:hover, +.ResizeHandle[data-resize-handle-active], +.ResizeHandleVertical:hover, +.ResizeHandleVertical[data-resize-handle-active], +.ResizeHandleCollapsed:hover, +.ResizeHandleCollapsed[data-resize-handle-active] { + background-color: var(--pf-global--active-color--400); /* PatternFly blue */ +} + +/* Adjust for touch devices */ +@media (pointer: coarse) { + .ResizeHandle { + width: 1rem; + } + .ResizeHandleVertical { + height: 1rem; + } +} + + + diff --git a/src/components/NewLibrary/components/BreadcrumbContainer.tsx b/src/components/NewLibrary/components/BreadcrumbContainer.tsx index 4ef4d8e25..9c469c595 100644 --- a/src/components/NewLibrary/components/BreadcrumbContainer.tsx +++ b/src/components/NewLibrary/components/BreadcrumbContainer.tsx @@ -34,9 +34,7 @@ const BreadcrumbContainer = ({ return ( <> - <Toolbar - style={{ paddingTop: "0", paddingLeft: "0", paddingBottom: "0" }} - > + <Toolbar> <ToolbarContent> {showHomeButton && ( <ToolbarItem> diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index edcf35802..e1761e65a 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -189,7 +189,7 @@ const NewLibrary = () => { stickyOnBreakpoint={{ default: "top", }} - style={{ padding: "0.25em" }} + style={{ padding: "0" }} > <Operations origin={{ @@ -208,7 +208,7 @@ const NewLibrary = () => { /> </PageSection> - <PageSection style={{ padding: "0.25em" }}> + <PageSection style={{ padding: "0" }}> {isFetching && <SpinContainer title="Fetching Resources..." />} {isError && <Alert type="error" description={error.message} />} {/* Render based on currentLayout */} From 815dc6e41cbf5cdb5076f5d124abc35425f63038 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 3 Oct 2024 10:54:55 -0400 Subject: [PATCH 272/337] feat: Fix the bug in minimizing and maximizing panels with react-resizable-panels --- .../FeedOutputBrowser/FileBrowser.tsx | 347 +++++++++--------- src/components/Feeds/FeedView.tsx | 101 +++-- src/components/Wrapper/Toolbar.tsx | 4 +- 3 files changed, 241 insertions(+), 211 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index b9cf00797..9a0789dba 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -153,186 +153,191 @@ const FileBrowser = (props: FileBrowserProps) => { return ( <Grid hasGutter className="file-browser"> {contextHolder} - <PanelGroup direction="horizontal"> + + <PanelGroup autoSaveId="conditional" direction="horizontal"> {/* Left Panel: File Browser */} - <Panel - className="custom-panel" - defaultSize={drawerState.preview.open ? 53 : 100} - minSize={20} - > - {/* Drawer Action Button for Files */} - <DrawerActionButton - content="Files" - handleMaximize={() => { - handleMaximize("files", dispatch); - }} - handleMinimize={() => { - handleMinimize("files", dispatch); - }} - maximized={drawerState.files.maximized} - /> - {drawerState.files.open && ( - <> - {/* Sticky Container */} - <div className="sticky-container"> - <Operations - customClassName={{ - toolbar: "remove-toolbar-padding", - }} - customStyle={{ - toolbar: { - backgroundColor: "inherit", - }, - }} - origin={origin} - computedPath={additionalKey} - folderList={pluginFilesPayload.folderList} - /> - <div className="file-browser__header"> - <div className="file-browser__header--breadcrumbContainer"> - <ClipboardCopyContainer path={additionalKey} /> - <Breadcrumb> - {breadcrumb.map(generateBreadcrumb)} - </Breadcrumb> - </div> - {/* Optional Back Button */} - <div> - {additionalKey !== currentPath && - selected.data.plugin_type === "fs" && ( - <Tooltip - content={<span>Go back to the base directory</span>} - > - <Button - onClick={() => handleFileClick(currentPath)} - variant="link" - icon={<HomeIcon />} + {drawerState.files.open && ( + <> + <Panel + className="custom-panel" + order={1} + id="4" + defaultSize={53} + minSize={20} + > + {/* Drawer Action Button for Files */} + <DrawerActionButton + content="Files" + handleMaximize={() => { + handleMaximize("files", dispatch); + }} + handleMinimize={() => { + handleMinimize("files", dispatch); + }} + maximized={drawerState.files.maximized} + /> + + <> + {/* Sticky Container */} + <div className="sticky-container"> + <Operations + customClassName={{ + toolbar: "remove-toolbar-padding", + }} + customStyle={{ + toolbar: { + backgroundColor: "inherit", + }, + }} + origin={origin} + computedPath={additionalKey} + folderList={pluginFilesPayload.folderList} + /> + <div className="file-browser__header"> + <div className="file-browser__header--breadcrumbContainer"> + <ClipboardCopyContainer path={additionalKey} /> + <Breadcrumb> + {breadcrumb.map(generateBreadcrumb)} + </Breadcrumb> + </div> + {/* Optional Back Button */} + <div> + {additionalKey !== currentPath && + selected.data.plugin_type === "fs" && ( + <Tooltip + content={<span>Go back to the base directory</span>} > - Back - </Button> - </Tooltip> - )} + <Button + onClick={() => handleFileClick(currentPath)} + variant="link" + icon={<HomeIcon />} + > + Back + </Button> + </Tooltip> + )} + </div> </div> </div> - </div> - {/* Scrollable Content */} - <div className="scrollable-content"> - <Table - style={{ - backgroundColor: "inherit", - }} - variant="compact" - > - <Thead aria-label="file-browser-table"> - <Tr> - <Th aria-label="file-selection-checkbox" /> - <Th aria-label="file-name">{columnNames.name}</Th> - <Th aria-label="file-creator">{columnNames.created}</Th> - <Th aria-label="file-owner">{columnNames.creator}</Th> - <Th aria-label="file-size">{columnNames.size}</Th> - </Tr> - </Thead> - <Tbody> - {filesMap?.map((resource: FileBrowserFolderFile, index) => { - return ( - <FileRow - rowIndex={index} - key={resource.data.fname} - resource={resource} - name={getFileName(resource)} - date={resource.data.creation_date} - owner={resource.data.owner_username} - size={resource.data.fsize} - computedPath={additionalKey} - handleFolderClick={() => { - return; - }} - handleFileClick={() => { - toggleAnimation(); - dispatch( - setSelectedFile( - resource as FileBrowserFolderFile, - ), - ); - !drawerState.preview.open && - dispatch(setFilePreviewPanel()); - }} - origin={origin} - /> - ); - })} - {linkFilesMap?.map( - (resource: FileBrowserFolderLinkFile, index) => { - return ( - <LinkRow - rowIndex={index} - key={resource.data.path} - resource={resource} - name={getLinkFileName(resource)} - date={resource.data.creation_date} - owner={resource.data.owner_username} - size={resource.data.fsize} - computedPath={additionalKey} - handleFolderClick={() => { - return; - }} - handleFileClick={() => { - handleFileClick(resource.data.path); - }} - origin={origin} - /> - ); - }, - )} - - {subFoldersMap?.map( - (resource: FileBrowserFolder, index) => { - return ( - <FolderRow - rowIndex={index} - key={resource.data.path} - resource={resource} - name={getFolderName(resource, additionalKey)} - date={resource.data.creation_date} - owner=" " - size={0} - computedPath={additionalKey} - handleFolderClick={() => - handleFileClick(resource.data.path) - } - handleFileClick={() => { - return; - }} - origin={origin} - /> - ); - }, - )} - </Tbody> - </Table> - {/* Load More Button */} - {fetchMore && !isLoading && ( - <Button onClick={handlePagination} variant="link"> - Load more data... - </Button> - )} - {/* Observer Target */} - <div - style={{ height: "1px", marginTop: "10px" }} - ref={observerTarget} - /> - </div> - </> - )} - </Panel> + {/* Scrollable Content */} + <div className="scrollable-content"> + <Table + style={{ + backgroundColor: "inherit", + }} + variant="compact" + > + <Thead aria-label="file-browser-table"> + <Tr> + <Th aria-label="file-selection-checkbox" /> + <Th aria-label="file-name">{columnNames.name}</Th> + <Th aria-label="file-creator">{columnNames.created}</Th> + <Th aria-label="file-owner">{columnNames.creator}</Th> + <Th aria-label="file-size">{columnNames.size}</Th> + </Tr> + </Thead> + <Tbody> + {filesMap?.map( + (resource: FileBrowserFolderFile, index) => { + return ( + <FileRow + rowIndex={index} + key={resource.data.fname} + resource={resource} + name={getFileName(resource)} + date={resource.data.creation_date} + owner={resource.data.owner_username} + size={resource.data.fsize} + computedPath={additionalKey} + handleFolderClick={() => { + return; + }} + handleFileClick={() => { + toggleAnimation(); + dispatch( + setSelectedFile( + resource as FileBrowserFolderFile, + ), + ); + !drawerState.preview.open && + dispatch(setFilePreviewPanel()); + }} + origin={origin} + /> + ); + }, + )} + {linkFilesMap?.map( + (resource: FileBrowserFolderLinkFile, index) => { + return ( + <LinkRow + rowIndex={index} + key={resource.data.path} + resource={resource} + name={getLinkFileName(resource)} + date={resource.data.creation_date} + owner={resource.data.owner_username} + size={resource.data.fsize} + computedPath={additionalKey} + handleFolderClick={() => { + return; + }} + handleFileClick={() => { + handleFileClick(resource.data.path); + }} + origin={origin} + /> + ); + }, + )} - {/* Resize Handle */} - {drawerState.preview.open && ( - <PanelResizeHandle className="ResizeHandle" /> + {subFoldersMap?.map( + (resource: FileBrowserFolder, index) => { + return ( + <FolderRow + rowIndex={index} + key={resource.data.path} + resource={resource} + name={getFolderName(resource, additionalKey)} + date={resource.data.creation_date} + owner=" " + size={0} + computedPath={additionalKey} + handleFolderClick={() => + handleFileClick(resource.data.path) + } + handleFileClick={() => { + return; + }} + origin={origin} + /> + ); + }, + )} + </Tbody> + </Table> + {/* Load More Button */} + {fetchMore && !isLoading && ( + <Button onClick={handlePagination} variant="link"> + Load more data... + </Button> + )} + {/* Observer Target */} + <div + style={{ height: "1px", marginTop: "10px" }} + ref={observerTarget} + /> + </div> + </> + </Panel> + {/* Resize Handle */} + <PanelResizeHandle className="ResizeHandle" /> + </> )} {/* Right Panel: Preview Panel */} {drawerState.preview.open && ( - <Panel defaultSize={47} minSize={20}> + <Panel order={2} id="5" defaultSize={47} minSize={20}> {/* Drawer Action Button for Preview */} <DrawerActionButton content="Preview" diff --git a/src/components/Feeds/FeedView.tsx b/src/components/Feeds/FeedView.tsx index d2ee3cc63..c8945dec4 100644 --- a/src/components/Feeds/FeedView.tsx +++ b/src/components/Feeds/FeedView.tsx @@ -127,49 +127,76 @@ const FeedView: React.FC = () => { return ( <WrapperConnect titleComponent={TitleComponent}> {contextHolder} - <PanelGroup direction="vertical"> + <PanelGroup autoSaveId="conditional" direction="vertical"> {/* Top Panels: Graph and Node Details */} - <Panel className="custom-panel" defaultSize={54} minSize={20}> - <PanelGroup direction="horizontal"> - {/* Left Panel: Graph */} - <Panel defaultSize={drawerState.node.open ? 53 : 100} minSize={20}> - {handleDrawerAction("graph")} - {!currentLayout ? ( - <ParentComponent onNodeClick={onNodeClick} /> - ) : ( - <FeedGraph onNodeClick={onNodeClick} /> - )} - </Panel> - - {/* Horizontal Resize Handle */} - {drawerState.node.open && ( - <PanelResizeHandle className="ResizeHandle" /> - )} + {(drawerState.graph.open || drawerState.node.open) && ( + <> + <Panel + className="custom-panel" + id="1" + order={1} + defaultSize={50} + minSize={20} + > + <PanelGroup autoSaveId="conditional" direction="horizontal"> + {/* Left Panel: Graph */} + {drawerState.graph.open && ( + <> + <Panel + className="custom-panel" + order={1} + defaultSize={53} + minSize={20} + > + {handleDrawerAction("graph")} + {!currentLayout ? ( + <ParentComponent onNodeClick={onNodeClick} /> + ) : ( + <FeedGraph onNodeClick={onNodeClick} /> + )} + </Panel> + <PanelResizeHandle className="ResizeHandle" /> + </> + )} - {/* Right Panel: Node Details */} - {drawerState.node.open && ( - <Panel className="custom-panel" defaultSize={47} minSize={20}> - {handleDrawerAction("node")} - <div className="node-block"> - <NodeDetails /> - </div> - </Panel> - )} - </PanelGroup> - </Panel> + {/* Right Panel: Node Details */} + {drawerState.node.open && ( + <Panel + className="custom-panel" + id="2" + order={2} + defaultSize={47} + minSize={20} + > + {handleDrawerAction("node")} + <div className="node-block"> + <NodeDetails /> + </div> + </Panel> + )} + </PanelGroup> + </Panel> + <PanelResizeHandle className="ResizeHandleVertical" /> + </> + )} {/* Vertical Resize Handle */} - {(drawerState.preview.open || drawerState.files.open) && ( - <PanelResizeHandle className="ResizeHandleVertical" /> - )} {/* Bottom Panel: Feed Output Browser */} - <Panel className="custom-panel" defaultSize={44} minSize={20}> - <FeedOutputBrowser - explore={true} - handlePluginSelect={onNodeBrowserClick} - /> - </Panel> + {(drawerState.files.open || drawerState.preview.open) && ( + <Panel + className="custom-panel" + id="3" + order={2} + defaultSize={50} + minSize={20} + > + <FeedOutputBrowser + explore={true} + handlePluginSelect={onNodeBrowserClick} + /> + </Panel> + )} </PanelGroup> </WrapperConnect> ); diff --git a/src/components/Wrapper/Toolbar.tsx b/src/components/Wrapper/Toolbar.tsx index 9c14dbf9d..9fdd8e347 100644 --- a/src/components/Wrapper/Toolbar.tsx +++ b/src/components/Wrapper/Toolbar.tsx @@ -31,8 +31,6 @@ const ToolbarComponent: React.FC<ToolbarComponentProps> = ( ) => { const { token, titleComponent } = props; const dispatch = useAppDispatch(); - const drawerState = useAppSelector((state) => state.drawers); - const fullScreen = drawerState?.preview.open && drawerState.preview.maximized; const navigate = useNavigate(); const location = useLocation(); const [_, _setCookie, removeCookie] = useCookies(); @@ -94,7 +92,7 @@ const ToolbarComponent: React.FC<ToolbarComponentProps> = ( <FlexItem>{titleComponent && titleComponent}</FlexItem> {/* Center */} <FlexItem flex={{ default: "flex_1" }}> - {props.showToolbar && !fullScreen && <FeedDetails />} + {props.showToolbar && <FeedDetails />} </FlexItem> {/* Right section */} From 793622367a159c1dbab0f1297ea82706635f58ca Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 3 Oct 2024 11:08:28 -0400 Subject: [PATCH 273/337] feat: Adjust panel height for dicom images --- .../FeedOutputBrowser/FileBrowser.tsx | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 9a0789dba..0fd8fb2ec 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -349,21 +349,20 @@ const FileBrowser = (props: FileBrowserProps) => { }} maximized={drawerState.preview.maximized} /> - <div className="file-browser__drawerbody"> - {drawerState.preview.currentlyActive === "preview" && - selectedFile && ( - <FileDetailView - gallery={true} - selectedFile={selectedFile} - preview="large" - list={pluginFilesPayload.filesMap} - fetchMore={fetchMore} - handlePagination={handlePagination} - filesLoading={isLoading} - /> - )} - {drawerState.preview.currentlyActive === "xtk" && <XtkViewer />} - </div> + + {drawerState.preview.currentlyActive === "preview" && + selectedFile && ( + <FileDetailView + gallery={true} + selectedFile={selectedFile} + preview="large" + list={pluginFilesPayload.filesMap} + fetchMore={fetchMore} + handlePagination={handlePagination} + filesLoading={isLoading} + /> + )} + {drawerState.preview.currentlyActive === "xtk" && <XtkViewer />} </Panel> )} </PanelGroup> From a7afdcea03eaae7c0b15da387ad35841236ee238 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 3 Oct 2024 12:32:36 -0400 Subject: [PATCH 274/337] feat: Sticky Headers and Responsive Tables --- .../FeedOutputBrowser/FeedOutputBrowser.css | 72 ------------------- .../FeedOutputBrowser/FileBrowser.tsx | 25 ++++--- .../NewLibrary/components/LibraryTable.tsx | 50 ++++++++----- .../NewLibrary/components/TruncatedText.tsx | 34 +++++++++ 4 files changed, 82 insertions(+), 99 deletions(-) create mode 100644 src/components/NewLibrary/components/TruncatedText.tsx diff --git a/src/components/FeedOutputBrowser/FeedOutputBrowser.css b/src/components/FeedOutputBrowser/FeedOutputBrowser.css index 84e1c51e6..deb011b2e 100644 --- a/src/components/FeedOutputBrowser/FeedOutputBrowser.css +++ b/src/components/FeedOutputBrowser/FeedOutputBrowser.css @@ -12,36 +12,10 @@ } } -.feed-output-browser__button { - cursor: pointer; -} - .file-browser { height: 100%; } -.file-browser__drawerbody { - overflow: scroll; -} - -.file-browser .carousel { - position: absolute; - bottom: 0; - right: 0; - z-index: 999; -} - -.file-browser__previewPanel .pf-v5-c-drawer__content, -.file-browser__previewPanel .pf-v5-c-drawer__panel, -.file-browser__previewPanel .pf-v5-c-drawer__panel-main { - overflow: hidden !important; -} - -.file-browser__table--fileName { - display: flex; - flex-direction: row; -} - .file-browser__header { display: flex; flex-direction: column; @@ -49,58 +23,12 @@ margin-right: 0.25em; } -.file-browser__header__info { - gap: 2rem; - display: flex; - justify-content: flex-end; -} - @media screen and (min-width: 1024px) { .file-browser__header { display: flex; } } -.file-browser .pf-c-breadcrumb { - cursor: pointer; - --pf-v5-c-breadcrumb__item--FontSize: var(--pf-global--FontSize--md); -} - -.file-browser__firstGrid { - overflow-y: scroll !important; - height: 100% !important; - max-width: 100%; - margin: 0; -} - -.file-browser__firstGrid tbody tr { - cursor: pointer; -} - -.file-browser__firstGrid svg { - margin-right: 0.25em; -} - -.file-browser .header-panel__buttons { - display: flex; - justify-content: space-between; -} - -.file-browser .preview-panel { - display: flex; - justify-content: space-between; -} - -.file-browser .preview-panel > div { - width: 100%; -} - -.file-browser .preview-panel > div > div:first-child { - display: flex; - flex-direction: row; - justify-content: space-between; -} - .iframe-container { height: 100%; } diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 0fd8fb2ec..4849e5260 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -12,6 +12,7 @@ import { } from "@patternfly/react-core"; import { Table, Tbody, Th, Thead, Tr } from "@patternfly/react-table"; import { useEffect } from "react"; +import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels"; import { setFilePreviewPanel } from "../../store/drawer/drawerSlice"; import { clearSelectedFile, @@ -38,8 +39,6 @@ import { OperationContext } from "../NewLibrary/context"; import FileDetailView from "../Preview/FileDetailView"; import XtkViewer from "../XtkViewer/XtkViewer"; import type { FileBrowserProps } from "./types"; -import { PanelGroup, Panel, PanelResizeHandle } from "react-resizable-panels"; -import backgroundColors from "@cornerstonejs/core/dist/types/constants/backgroundColors"; const previewAnimation = [{ opacity: "0.0" }, { opacity: "1.0" }]; @@ -153,7 +152,6 @@ const FileBrowser = (props: FileBrowserProps) => { return ( <Grid hasGutter className="file-browser"> {contextHolder} - <PanelGroup autoSaveId="conditional" direction="horizontal"> {/* Left Panel: File Browser */} {drawerState.files.open && ( @@ -164,6 +162,7 @@ const FileBrowser = (props: FileBrowserProps) => { id="4" defaultSize={53} minSize={20} + style={{ display: "flex", flexDirection: "column" }} > {/* Drawer Action Button for Files */} <DrawerActionButton @@ -220,20 +219,30 @@ const FileBrowser = (props: FileBrowserProps) => { </div> </div> {/* Scrollable Content */} - <div className="scrollable-content"> + + <div style={{ flex: 1, overflow: "auto" }}> <Table style={{ backgroundColor: "inherit", }} variant="compact" + isStickyHeader={true} > <Thead aria-label="file-browser-table"> <Tr> <Th aria-label="file-selection-checkbox" /> - <Th aria-label="file-name">{columnNames.name}</Th> - <Th aria-label="file-creator">{columnNames.created}</Th> - <Th aria-label="file-owner">{columnNames.creator}</Th> - <Th aria-label="file-size">{columnNames.size}</Th> + <Th aria-label="file-name" width={40}> + {columnNames.name} + </Th> + <Th aria-label="file-creator" width={20}> + {columnNames.created} + </Th> + <Th aria-label="file-owner" width={20}> + {columnNames.creator} + </Th> + <Th aria-label="file-size" width={20}> + {columnNames.size} + </Th> </Tr> </Thead> <Tbody> diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 74ce97516..aadc507f5 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -34,6 +34,7 @@ import useNewResourceHighlight from "../utils/useNewResourceHighlight"; import { FolderContextMenu } from "./ContextMenu"; import { getFileName, getLinkFileName } from "./FileCard"; import { getFolderName } from "./FolderCard"; +import TruncatedText from "./TruncatedText"; interface TableProps { data: { @@ -148,7 +149,7 @@ const BaseRow: React.FC<RowProps> = ({ isSelected: isSelected, }} /> - <Td dataLabel={columnNames.name}> + <Td dataLabel={columnNames.name} modifier="truncate"> <Button onClick={(e) => { e.stopPropagation(); @@ -158,23 +159,21 @@ const BaseRow: React.FC<RowProps> = ({ icon={icon} variant="link" > - {name} + <TruncatedText text={name} className="pf-c-button__text" /> </Button> - <span - style={{ - display: "inline-block", - width: "90px", - marginLeft: "0.25em", - }} - > - {isNewResource ? <Tag color="#3E8635">Newly Added</Tag> : null} - </span> + {isNewResource && ( + <span style={{ marginLeft: "0.5em" }}> + <Tag color="#3E8635">Newly Added</Tag> + </span> + )} + </Td> + <Td dataLabel={columnNames.date} modifier="truncate"> + <TruncatedText text={format(new Date(date), "dd MMM yyyy, HH:mm")} /> </Td> - <Td dataLabel={columnNames.date}> - {format(new Date(date), "dd MMM yyyy, HH:mm")} + <Td dataLabel={columnNames.owner} modifier="truncate"> + <TruncatedText text={owner} /> </Td> - <Td dataLabel={columnNames.owner}>{owner}</Td> - <Td dataLabel={columnNames.size}> + <Td dataLabel={columnNames.size} modifier="truncate"> {size > 0 ? formatBytes(size, 0) : " "} </Td> </Tr> @@ -308,19 +307,32 @@ const LibraryTable: React.FC<TableProps> = ({ variant="compact" aria-label="Simple table" isStriped={true} + isStickyHeader={true} > <Caption>Data Library</Caption> <Thead> <Tr> <Th screenReaderText="Select a row" arial-label="Select a row" /> - <Th sort={{ sortBy, onSort, columnIndex: 1 }} name="name"> + <Th + sort={{ sortBy, onSort, columnIndex: 1 }} + width={40} + name="name" + > {columnNames.name} </Th> - <Th sort={{ sortBy, onSort, columnIndex: 2 }} name="date"> + <Th + sort={{ sortBy, onSort, columnIndex: 2 }} + width={20} + name="date" + > {columnNames.date} </Th> - <Th name="owner">{columnNames.owner}</Th> - <Th name="size">{columnNames.size}</Th> + <Th name="owner"> + {columnNames.owner} width={20} + </Th> + <Th name="size"> + {columnNames.size} width={20} + </Th> </Tr> </Thead> <Tbody> diff --git a/src/components/NewLibrary/components/TruncatedText.tsx b/src/components/NewLibrary/components/TruncatedText.tsx new file mode 100644 index 000000000..3fbf22fc3 --- /dev/null +++ b/src/components/NewLibrary/components/TruncatedText.tsx @@ -0,0 +1,34 @@ +import React, { useRef, useEffect, useState } from "react"; +import { Tooltip } from "@patternfly/react-core"; + +interface TruncatedTextProps { + text: string; + className?: string; +} + +const TruncatedText: React.FC<TruncatedTextProps> = React.memo( + ({ text, className }) => { + const textRef = useRef<HTMLSpanElement>(null); + const [isTruncated, setIsTruncated] = useState(false); + useEffect(() => { + const { current } = textRef; + /* + clientWidth: Represents the inner width of an element (excluding borders and scrollbars). It's essentially the width available for the content. + scrollWidth: Represents the total width of the element's content, including the portion not visible on the screen due to overflow. + * */ + if (current) { + setIsTruncated(current.scrollWidth > current.clientWidth); + } + }, []); + + return ( + <Tooltip content={text} isVisible={isTruncated} trigger="mouseenter"> + <span ref={textRef} className={className}> + {text} + </span> + </Tooltip> + ); + }, +); + +export default TruncatedText; From 7d74ffac77ff92cbefc7615431a50fa3fa0b5327 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 3 Oct 2024 12:57:53 -0400 Subject: [PATCH 275/337] refactor: General cleanup --- .../FeedOutputBrowser/useFeedBrowser.tsx | 10 +++---- src/components/NewLibrary/index.tsx | 30 ++++++++++++++++--- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/components/FeedOutputBrowser/useFeedBrowser.tsx b/src/components/FeedOutputBrowser/useFeedBrowser.tsx index 7270d5c47..5f48e72ad 100644 --- a/src/components/FeedOutputBrowser/useFeedBrowser.tsx +++ b/src/components/FeedOutputBrowser/useFeedBrowser.tsx @@ -1,5 +1,5 @@ import { keepPreviousData, useQuery } from "@tanstack/react-query"; -import { useEffect, useRef, useState } from "react"; +import { useCallback, useEffect, useRef, useState } from "react"; import { useAppSelector } from "../../store/hooks"; import { fetchFolders } from "../NewLibrary"; @@ -56,9 +56,9 @@ export const useFeedBrowser = () => { }); // Handle pagination by incrementing the page number - const handlePagination = () => { + const handlePagination = useCallback(() => { setPageNumber((prevState) => prevState + 1); - }; + }, []); const observerTarget = useRef(null); @@ -87,7 +87,7 @@ export const useFeedBrowser = () => { observer.unobserve(observerTarget.current); } }; - }, [fetchMore]); + }, [fetchMore, handlePagination]); useEffect(() => { if ((statusTitle && status.includes(statusTitle)) || finished) { @@ -103,7 +103,7 @@ export const useFeedBrowser = () => { }, 3000); } } - }, [finished, pluginFilesPayload, statusTitle, download.error]); + }, [finished, statusTitle, download.error]); useEffect(() => { setCurrentPath(selected?.data.output_path); diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index e1761e65a..d2a1c7976 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -6,7 +6,7 @@ import type { import { Button, Grid, PageSection } from "@patternfly/react-core"; import { keepPreviousData, useQuery } from "@tanstack/react-query"; import { debounce } from "lodash"; -import { useEffect, useRef, useState } from "react"; +import { useCallback, useEffect, useRef, useState } from "react"; import { useLocation, useNavigate } from "react-router"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useAppSelector } from "../../store/hooks"; @@ -146,7 +146,7 @@ const NewLibrary = () => { }); }); } - }, [data?.errorMessages]); + }, [api.error, data?.errorMessages]); const fetchMore = data?.foldersPagination?.hasNextPage || @@ -158,12 +158,34 @@ const NewLibrary = () => { navigate(url); }, 500); - const handlePagination = () => { + const handlePagination = useCallback(() => { setPageNumber((prevState) => prevState + 1); - }; + }, []); const observerTarget = useRef(null); + // Set up an intersection observer to load more data when the user scrolls to the bottom of the page + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + if (entries[0].isIntersecting && fetchMore) { + handlePagination(); + } + }, + { threshold: 0.5 }, + ); + + if (observerTarget.current) { + observer.observe(observerTarget.current); + } + + return () => { + if (observerTarget.current) { + observer.unobserve(observerTarget.current); + } + }; + }, [fetchMore, handlePagination]); + if (isFirstLoad && pathname === "/library") { return null; } From f1d568dd9022a338d7adad902e5957cc0c5745ee Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 3 Oct 2024 14:51:24 -0400 Subject: [PATCH 276/337] feat: Fix dicom indicators in light mode --- src/components/Preview/displays/DcmDisplay.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 6bd92a170..22da60a67 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -261,7 +261,13 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { ) { handlePagination(); } - }, [fetchMore, handlePagination, filesLoading]); + }, [ + fetchMore, + filteredList, + lastProcessedIndex, + handlePagination, + filesLoading, + ]); useEffect(() => { if (activeViewport && filteredList && handlePagination) { @@ -296,9 +302,11 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { zIndex: "99999", }} > - {`Current Index: ${currentImageIndex + 1} (${currentImageIndex + 1}/${imageStack.length})`} + <div style={{ color: "#fff" }}> + {`Current Index: ${currentImageIndex + 1} (${currentImageIndex + 1}/${imageStack.length})`} + </div> {isLoadingMore && ( - <div> + <div style={{ color: "#fff" }}> <i>Loading more...</i> </div> )} From c3765d96578e44ba0fd4f7f9eed77a342796dfee Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 3 Oct 2024 16:27:00 -0400 Subject: [PATCH 277/337] feat: Responsive layout for the feed detail view page --- package.json | 1 + pnpm-lock.yaml | 39 +++++++ src/api/common.ts | 2 +- src/components/Icons/index.tsx | 2 + src/components/Pacs/index.tsx | 2 +- src/components/Wrapper/Toolbar.tsx | 174 +++++++++++++++++------------ src/routes.tsx | 2 +- 7 files changed, 148 insertions(+), 74 deletions(-) diff --git a/package.json b/package.json index 16d54268b..8eaa9c059 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "react-lazylog": "^4.5.3", "react-redux": "^9.1.2", "react-resizable-panels": "^2.1.4", + "react-responsive": "^10.0.0", "react-router": "^6.26.2", "react-router-dom": "^6.26.2", "redux-saga": "^1.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83020e3f8..59dc79035 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -161,6 +161,9 @@ importers: react-resizable-panels: specifier: ^2.1.4 version: 2.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-responsive: + specifier: ^10.0.0 + version: 10.0.0(react@18.3.1) react-router: specifier: ^6.26.2 version: 6.26.2(react@18.3.1) @@ -2173,6 +2176,9 @@ packages: crypto-browserify@3.12.0: resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + css-mediaquery@0.1.2: + resolution: {integrity: sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==} + cssfilter@0.0.10: resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} @@ -2708,6 +2714,9 @@ packages: https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -3035,6 +3044,9 @@ packages: engines: {node: '>= 18'} hasBin: true + matchmediaquery@0.4.2: + resolution: {integrity: sha512-wrZpoT50ehYOudhDjt/YvUJc6eUzcdFPdmbizfgvswCKNHD1/OBOHYJpHie+HXpu6bSkEGieFMYk6VuutaiRfA==} + md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} @@ -3776,6 +3788,12 @@ packages: react: ^16.14.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 + react-responsive@10.0.0: + resolution: {integrity: sha512-N6/UiRLGQyGUqrarhBZmrSmHi2FXSD++N5VbSKsBBvWfG0ZV7asvUBluSv5lSzdMyEVjzZ6Y8DL4OHABiztDOg==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8.0' + react-router-dom@6.26.2: resolution: {integrity: sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==} engines: {node: '>=14.0.0'} @@ -3958,6 +3976,9 @@ packages: shader-loader@1.3.1: resolution: {integrity: sha512-dt8F9K0x4rjmaFyHh7rNDfpt4LUiR64zhNIEwp2WbE99B3z4ALuvvmhftkElg93dUD6sTmv/aXa/z9SJiEddcA==} + shallow-equal@3.1.0: + resolution: {integrity: sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -6822,6 +6843,8 @@ snapshots: randombytes: 2.1.0 randomfill: 1.0.4 + css-mediaquery@0.1.2: {} + cssfilter@0.0.10: {} csstype@3.1.3: {} @@ -7371,6 +7394,8 @@ snapshots: https-browserify@1.0.0: {} + hyphenate-style-name@1.1.0: {} + ieee754@1.2.1: {} immer@10.1.1: {} @@ -7668,6 +7693,10 @@ snapshots: marked@14.1.2: {} + matchmediaquery@0.4.2: + dependencies: + css-mediaquery: 0.1.2 + md5.js@1.3.5: dependencies: hash-base: 3.1.0 @@ -8668,6 +8697,14 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + react-responsive@10.0.0(react@18.3.1): + dependencies: + hyphenate-style-name: 1.1.0 + matchmediaquery: 0.4.2 + prop-types: 15.8.1 + react: 18.3.1 + shallow-equal: 3.1.0 + react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.19.2 @@ -8887,6 +8924,8 @@ snapshots: dependencies: loader-utils: 1.4.2 + shallow-equal@3.1.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 diff --git a/src/api/common.ts b/src/api/common.ts index 46b1686ea..23b12c289 100644 --- a/src/api/common.ts +++ b/src/api/common.ts @@ -1,4 +1,4 @@ -import * as React from "react"; +import React from "react"; import axios, { type AxiosProgressEvent } from "axios"; import ChrisAPIClient from "./chrisapiclient"; import type { diff --git a/src/components/Icons/index.tsx b/src/components/Icons/index.tsx index 2af1624dc..90280dce7 100644 --- a/src/components/Icons/index.tsx +++ b/src/components/Icons/index.tsx @@ -32,6 +32,7 @@ import { CheckCircleIcon, BarsIcon, GripVerticalIcon, + ToolsIcon, } from "@patternfly/react-icons"; const CartIcon = ({ @@ -308,4 +309,5 @@ export { RetryIcon, BarsIcon, GripVerticalIcon, + ToolsIcon, }; diff --git a/src/components/Pacs/index.tsx b/src/components/Pacs/index.tsx index 294865ac2..c08aa6698 100644 --- a/src/components/Pacs/index.tsx +++ b/src/components/Pacs/index.tsx @@ -13,7 +13,7 @@ import { } from "@patternfly/react-core"; import SearchIcon from "@patternfly/react-icons/dist/esm/icons/search-icon"; import { Alert, Spin } from "../Antd"; -import * as React from "react"; +import React from "react"; import { useNavigate } from "react-router"; import { useSearchParams } from "react-router-dom"; import { pluralize } from "../../api/common"; diff --git a/src/components/Wrapper/Toolbar.tsx b/src/components/Wrapper/Toolbar.tsx index 9fdd8e347..386b27f5d 100644 --- a/src/components/Wrapper/Toolbar.tsx +++ b/src/components/Wrapper/Toolbar.tsx @@ -6,19 +6,23 @@ import { Flex, FlexItem, MenuToggle, + Modal, Switch, + Tooltip, } from "@patternfly/react-core"; +import { BarsIcon } from "@patternfly/react-icons"; // Add a tools icon import { useQueryClient } from "@tanstack/react-query"; -import * as React from "react"; +import React from "react"; import { useCookies } from "react-cookie"; +import { useMediaQuery } from "react-responsive"; import { useLocation, useNavigate } from "react-router"; import ChrisAPIClient from "../../api/chrisapiclient"; +import { clearCartOnLogout } from "../../store/cart/cartSlice"; import { useAppDispatch, useAppSelector } from "../../store/hooks"; import { setLogoutSuccess } from "../../store/user/userSlice"; import { ThemeContext } from "../DarkTheme/useTheme"; import FeedDetails from "../FeedDetails"; import CartNotify from "./CartNotify"; -import { clearCartOnLogout } from "../../store/cart/cartSlice"; type ToolbarComponentProps = { showToolbar: boolean; @@ -29,6 +33,8 @@ type ToolbarComponentProps = { const ToolbarComponent: React.FC<ToolbarComponentProps> = ( props: ToolbarComponentProps, ) => { + const isSmallerScreen = useMediaQuery({ maxWidth: 1224 }); + const { token, titleComponent } = props; const dispatch = useAppDispatch(); const navigate = useNavigate(); @@ -38,6 +44,7 @@ const ToolbarComponent: React.FC<ToolbarComponentProps> = ( const queryClient = useQueryClient(); const username = useAppSelector((state) => state.user.username); const [dropdownOpen, setIsDropdownOpen] = React.useState(false); + const [trayOpen, setTrayOpen] = React.useState(false); // State for tray visibility const handleChange = () => { toggleTheme(); @@ -81,78 +88,103 @@ const ToolbarComponent: React.FC<ToolbarComponentProps> = ( </DropdownItem>, ]; + const toggleTray = () => { + setTrayOpen(!trayOpen); + }; + return ( - <Flex - justifyContent={{ default: "justifyContentSpaceBetween" }} - alignItems={{ default: "alignItemsCenter" }} - style={{ - width: "100%", - }} - > - <FlexItem>{titleComponent && titleComponent}</FlexItem> - {/* Center */} - <FlexItem flex={{ default: "flex_1" }}> - {props.showToolbar && <FeedDetails />} - </FlexItem> + <> + <Flex + justifyContent={{ default: "justifyContentSpaceBetween" }} + alignItems={{ default: "alignItemsCenter" }} + style={{ + width: "100%", + }} + > + <FlexItem>{titleComponent && titleComponent}</FlexItem> + {/* Center */} + <FlexItem flex={{ default: "flex_1" }}> + {props.showToolbar && !isSmallerScreen && <FeedDetails />} + </FlexItem> - {/* Right section */} - <FlexItem align={{ default: "alignRight" }}> - <Flex - alignItems={{ default: "alignItemsCenter" }} - spaceItems={{ default: "spaceItemsMd" }} - > - <FlexItem> - <CartNotify /> - </FlexItem> - <FlexItem> - <Switch - id="simple-switch" - label="Theme" - isChecked={isDarkTheme} - onChange={handleChange} - ouiaId="Basic Switch" - /> - </FlexItem> - <FlexItem> - {token ? ( - <Dropdown - isPlain - onSelect={onDropdownToggle} - isOpen={dropdownOpen} - toggle={(toggleRef) => ( - <MenuToggle ref={toggleRef} onClick={onDropdownToggle}> - {username} - </MenuToggle> - )} - > - <DropdownList>{userDropdownItems}</DropdownList> - </Dropdown> - ) : ( - <> - <Button - style={{ padding: "0.25em" }} - variant="link" - onClick={() => { - navigate( - `/login?redirectTo=${location.pathname}${location.search}`, - ); - }} - > - Login - </Button> - <Button - style={{ padding: "0.25em" }} - variant="link" - onClick={() => navigate("/signup")} - > - Sign Up - </Button> - </> + {/* Right section */} + <FlexItem align={{ default: "alignRight" }}> + <Flex + alignItems={{ default: "alignItemsCenter" }} + spaceItems={{ default: "spaceItemsMd" }} + > + {isSmallerScreen && ( + <FlexItem> + <Tooltip position="bottom" content="Configure Panels"> + <Button + variant="plain" + aria-label="Tools" + onClick={toggleTray} + icon={<BarsIcon />} + /> + </Tooltip> + </FlexItem> )} - </FlexItem> - </Flex> - </FlexItem> - </Flex> + <FlexItem> + <CartNotify /> + </FlexItem> + <FlexItem> + <Switch + id="simple-switch" + label="Theme" + isChecked={isDarkTheme} + onChange={handleChange} + ouiaId="Basic Switch" + /> + </FlexItem> + <FlexItem> + {token ? ( + <Dropdown + isPlain + onSelect={onDropdownToggle} + isOpen={dropdownOpen} + toggle={(toggleRef) => ( + <MenuToggle ref={toggleRef} onClick={onDropdownToggle}> + {username} + </MenuToggle> + )} + > + <DropdownList>{userDropdownItems}</DropdownList> + </Dropdown> + ) : ( + <> + <Button + style={{ padding: "0.25em" }} + variant="link" + onClick={() => { + navigate( + `/login?redirectTo=${location.pathname}${location.search}`, + ); + }} + > + Login + </Button> + <Button + style={{ padding: "0.25em" }} + variant="link" + onClick={() => navigate("/signup")} + > + Sign Up + </Button> + </> + )} + </FlexItem> + </Flex> + </FlexItem> + </Flex> + + {/* Modal tray for FeedDetails */} + {isSmallerScreen && trayOpen && ( + <Modal isOpen={trayOpen} onClose={toggleTray} title="" variant="small"> + <FeedDetails /> + </Modal> + )} + </> ); }; diff --git a/src/routes.tsx b/src/routes.tsx index 07a73ba6a..08de7e851 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -1,4 +1,4 @@ -import * as React from "react"; +import React from "react"; import { useNavigate, useRoutes, From 710157c1a8000be3498ac1c698b239f76099a5b5 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 3 Oct 2024 16:49:20 -0400 Subject: [PATCH 278/337] fix: Fix Dicom Display --- src/components/Preview/displays/DcmDisplay.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 22da60a67..6c8fa753f 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -118,6 +118,7 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { queryKey: ["cornerstone-preview", selectedFile], queryFn: setupCornerstone, enabled: !!selectedFile, + refetchOnMount: true, }); useEffect(() => { From 3c380b5f63c7045c182ee87740443b6abf49b17d Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 4 Oct 2024 10:20:52 -0400 Subject: [PATCH 279/337] feat: Add a success notification to the config form --- src/components/Store/index.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/Store/index.tsx b/src/components/Store/index.tsx index db8f7e80f..1231d68e3 100644 --- a/src/components/Store/index.tsx +++ b/src/components/Store/index.tsx @@ -139,11 +139,10 @@ const Store: React.FC = () => { } fetchComputeResources(); - }, [api, compute_resource, isLoggedIn]); + }, [compute_resource, isLoggedIn]); useEffect(() => { document.title = "Store Catalog"; - setTempURLValue(configure_url || defaultStoreURL); setConfigureURL(configure_url || defaultStoreURL); }, [isStaff, configure_url, defaultStoreURL, isLoggedIn]); @@ -267,13 +266,17 @@ const Store: React.FC = () => { path: "/", maxAge: 86400, }); - // Update the configureURL setConfigureURL(tempURLValue); - // Close the modal setIsConfigModalOpen(false); + // Notify the user of the successful config save + api.success({ + message: "Configuration Saved", + description: "Your configuration has been saved successfully.", + duration: 1, + }); // If there is a plugin pending installation, proceed to install if (installingPlugin) { handleSave(); From 6a4fe34045023b04e00b49de44ca64df88b896e5 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 4 Oct 2024 11:49:18 -0400 Subject: [PATCH 280/337] feat: Fix a regression in the Library Page --- src/components/Feeds/Feeds.css | 6 +++--- src/components/NewLibrary/components/LibraryTable.tsx | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/Feeds/Feeds.css b/src/components/Feeds/Feeds.css index 3ec35f3ff..3eec65139 100644 --- a/src/components/Feeds/Feeds.css +++ b/src/components/Feeds/Feeds.css @@ -55,7 +55,7 @@ .ResizeHandle, .ResizeHandleVertical, .ResizeHandleCollapsed { - background-color: gray; /* Default background color */ + background-color:#4F5255; /* Default background color */ transition: background-color 250ms linear; } @@ -80,13 +80,13 @@ .ResizeHandleVertical[data-resize-handle-active], .ResizeHandleCollapsed:hover, .ResizeHandleCollapsed[data-resize-handle-active] { - background-color: var(--pf-global--active-color--400); /* PatternFly blue */ + background-color:#8A8D90 ; /* PatternFly blue */ } /* Adjust for touch devices */ @media (pointer: coarse) { .ResizeHandle { - width: 1rem; + width: 0.5em; } .ResizeHandleVertical { height: 1rem; diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index aadc507f5..14271c1c5 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -327,11 +327,11 @@ const LibraryTable: React.FC<TableProps> = ({ > {columnNames.date} </Th> - <Th name="owner"> - {columnNames.owner} width={20} + <Th name="owner" width={20}> + {columnNames.owner} </Th> - <Th name="size"> - {columnNames.size} width={20} + <Th name="size" width={20}> + {columnNames.size} </Th> </Tr> </Thead> From 75b1eb560754eb115a73bbbbf0a512227c194898 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Mon, 7 Oct 2024 20:38:38 -0400 Subject: [PATCH 281/337] feat: Fix dcm display for multi stack scroll --- src/components/FeedTree/useSize.tsx | 8 - .../Preview/displays/DcmDisplay.tsx | 461 ++++++++++-------- .../Preview/displays/ImageDisplay.tsx | 2 +- .../Preview/displays/dicomUtils/utils.ts | 4 +- 4 files changed, 256 insertions(+), 219 deletions(-) diff --git a/src/components/FeedTree/useSize.tsx b/src/components/FeedTree/useSize.tsx index b3d323365..ef5552a71 100644 --- a/src/components/FeedTree/useSize.tsx +++ b/src/components/FeedTree/useSize.tsx @@ -9,14 +9,6 @@ const useSize = ( // size is of type DOMRectReadOnly or undefined initially const [size, setSize] = React.useState<DOMRectReadOnly | undefined>(); - React.useLayoutEffect(() => { - if (target.current) { - // Safely access getBoundingClientRect() method - const rect = target.current.getBoundingClientRect(); - setSize(rect); - } - }, [target]); - useResizeObserver(target, (entry) => setSize(entry.contentRect)); return size; diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 6c8fa753f..80814dc9a 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -1,26 +1,21 @@ import type { RenderingEngine } from "@cornerstonejs/core"; import { useQuery } from "@tanstack/react-query"; -import { useEffect, useRef, useState, useMemo } from "react"; -import { v4 } from "uuid"; -import { type IFileBlob, getFileExtension } from "../../../api/model"; +import { useCallback, useEffect, useRef, useState, useMemo } from "react"; +import { getFileExtension, type IFileBlob } from "../../../api/model"; import { SpinContainer } from "../../Common"; import useSize from "../../FeedTree/useSize"; import type { ActionState } from "../FileDetailView"; import { - events, - type IStackViewport, basicInit, - cleanupCornerstoneTooling, displayDicomImage, loadDicomImage, - registerToolingOnce, - removeTools, setUpTooling, + events, } from "./dicomUtils/utils"; -import { handleEvents } from "./dicomUtils/utils"; +import type { IStackViewport } from "./dicomUtils/utils"; export type DcmImageProps = { - selectedFile?: IFileBlob; + selectedFile: IFileBlob; actionState: ActionState; preview: string; list?: IFileBlob[]; @@ -29,267 +24,309 @@ export type DcmImageProps = { filesLoading?: boolean; }; -const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { +const TOOL_KEY = "cornerstone-display"; +const CACHE_KEY = "cornerstone-stack"; + +type ImageStackType = { + [key: string]: string | string[]; +}; + +const DcmDisplay = (props: DcmImageProps) => { const { selectedFile, - actionState, - preview, - list = [], // Default to empty array - fetchMore, + list, handlePagination, + fetchMore, + preview, filesLoading, } = props; - const [activeViewport, setActiveViewport] = useState< - IStackViewport | undefined - >(); const [currentImageIndex, setCurrentImageIndex] = useState(0); + const [imageStack, setImageStack] = useState<ImageStackType>({}); const [multiFrameDisplay, setMultiframeDisplay] = useState(false); - const [imageStack, setImageStack] = useState<string[]>([]); - const [renderingEngine, setRenderingEngine] = useState<RenderingEngine>(); const [isLoadingMore, setIsLoadingMore] = useState(false); - const [lastProcessedIndex, setLastProcessedIndex] = useState(0); // Track last processed file index + const [lastLoadedIndex, setLastLoadedIndex] = useState(0); const dicomImageRef = useRef<HTMLDivElement>(null); - const uniqueId = `${selectedFile?.data.id || v4()}`; - const elementId = `cornerstone-element-${uniqueId}`; + const elementRef = useRef<HTMLDivElement>(null); + const renderingEngineRef = useRef<RenderingEngine | null>(null); + const activeViewportRef = useRef<IStackViewport | null>(null); + const cacheRef = useRef<{ [key: string]: ImageStackType }>({ + [CACHE_KEY]: {}, + }); + const size = useSize(dicomImageRef); + const cacheStack = cacheRef.current[CACHE_KEY]; + const fname = selectedFile.data.fname; - const handleResize = () => { - if (dicomImageRef.current && size) { - const parentWidth = size.width; - const parentHeight = size.height; - const element = document.getElementById(elementId); - if (element) { - element.style.width = `${parentWidth}px`; - element.style.height = `${parentHeight}px`; - renderingEngine?.resize(true, true); - activeViewport?.resize(); - } + // Handle resizing of the DICOM image viewer + const handleResize = useCallback(() => { + if (dicomImageRef.current && size && elementRef.current) { + const { width, height } = size; + elementRef.current.style.width = `${width}px`; + elementRef.current.style.height = `${height}px`; + renderingEngineRef.current?.resize(true, true); + activeViewportRef.current?.resize(); } - }; + }, [size]); useEffect(() => { window.addEventListener("resize", handleResize); + handleResize(); // Initial resize return () => { window.removeEventListener("resize", handleResize); }; - }, [size, renderingEngine, activeViewport]); + }, [handleResize]); + // Initialize Cornerstone useEffect(() => { - registerToolingOnce(); - return () => { - renderingEngine?.destroy(); - removeTools(); - cleanupCornerstoneTooling(); + const setupCornerstone = async () => { + await basicInit(); + setUpTooling(TOOL_KEY); }; + setupCornerstone(); }, []); - async function setupCornerstone() { - const element = document.getElementById(elementId) as HTMLDivElement; - if (selectedFile) { - await basicInit(); - setUpTooling(uniqueId); - const blob = await selectedFile.getFileBlob(); - const imageData = await loadDicomImage(blob); - const imageID = imageData.imageID; - const framesCount = imageData.framesCount; - const newImageStack = - framesCount > 1 - ? Array.from( - { length: framesCount }, - (_, i) => `${imageID}?frame=${i}`, - ) - : [imageID]; - - const { viewport, renderingEngine: newRenderingEngine } = - await displayDicomImage(element, newImageStack[0], uniqueId); - - setMultiframeDisplay(framesCount > 1); - setActiveViewport(viewport); - setRenderingEngine(newRenderingEngine); - setImageStack(newImageStack); - - return selectedFile.data.fname; - } - } - - const { isLoading } = useQuery({ - queryKey: ["cornerstone-preview", selectedFile], - queryFn: setupCornerstone, - enabled: !!selectedFile, - refetchOnMount: true, - }); - - useEffect(() => { - if (actionState && activeViewport) { - handleEvents(actionState, activeViewport); - } - }, [actionState, activeViewport]); - - useEffect(() => { - handleResize(); - }, [size]); - // Filter the list to include only DICOM files - const filteredList: IFileBlob[] = useMemo( + const filteredList = useMemo( () => - list.filter( - (file) => getFileExtension(file.data.fname).toLowerCase() === "dcm", - ), + list?.filter((file) => getFileExtension(file.data.fname) === "dcm") || [], [list], ); - const loadMultiFrames = async () => { - if (activeViewport) { - const currentIndex = activeViewport.getCurrentImageIdIndex(); - await activeViewport.setStack(imageStack, currentIndex); - activeViewport.render(); + // Preview the selected DICOM file + const previewFile = useCallback(async () => { + if (!elementRef.current) return {}; + + const existingImageEntry = cacheStack?.[fname]; + + if (existingImageEntry && activeViewportRef.current) { + let imageIDs: string[]; + let index: number; + + if (Array.isArray(existingImageEntry)) { + // Multi-frame image + imageIDs = existingImageEntry; + index = currentImageIndex; + setMultiframeDisplay(true); + } else { + // Single-frame images + imageIDs = Object.values(cacheStack).flat() as string[]; + index = imageIDs.findIndex((id) => id === existingImageEntry); + setMultiframeDisplay(false); + } + + await activeViewportRef.current.setStack( + imageIDs, + index !== -1 ? index : 0, + ); + activeViewportRef.current.render(); + + return cacheStack; } - }; - const loadImage = async (file: IFileBlob): Promise<string | null> => { - const fileName = file.data.fname; - const extension = getFileExtension(fileName); - if (extension !== "dcm") return null; - const blob = await file.getFileBlob(); + // Load new image if not in cache + const blob = await selectedFile.getFileBlob(); const imageData = await loadDicomImage(blob); - return imageData.imageID; - }; - - const loadImagesInBatches = async ( - start: number, - end: number, - skipIndex: number, - abortSignal: AbortSignal, - ) => { - setIsLoadingMore(true); - const generator = imageBatchGenerator(start, end, skipIndex, abortSignal); - const newImageStack: string[] = []; // Temporary stack to hold new images - try { - for await (const newImage of generator) { - if (abortSignal.aborted) { - setIsLoadingMore(false); - break; // Exit the loop if the signal is aborted - } - newImageStack.push(newImage); - } + const { framesCount, imageID } = imageData; - // Update the image stack synchronously - setImageStack((prevStack) => [...prevStack, ...newImageStack]); + const framesList = + framesCount > 1 + ? Array.from({ length: framesCount }, (_, i) => `${imageID}?frame=${i}`) + : imageID; - // Handle the async viewport operations separately - if (activeViewport) { - const currentIndex = activeViewport.getCurrentImageIdIndex(); + const newImageStack: ImageStackType = { + [fname]: framesList, + }; - // Await async calls outside of the setState - await activeViewport.setStack( - [...imageStack, ...newImageStack], - currentIndex > 0 ? currentIndex : skipIndex, - ); - currentIndex === 0 && (await activeViewport.setImageIdIndex(skipIndex)); - activeViewport.render(); - setIsLoadingMore(false); - } - } catch (err) { + const elementId = `cornerstone-element-${fname}`; + const { viewport, renderingEngine } = await displayDicomImage( + elementRef.current, + framesCount > 1 ? framesList[0] : imageID, + elementId, + ); + + setMultiframeDisplay(framesCount > 1); + activeViewportRef.current = viewport; + renderingEngineRef.current = renderingEngine; + + setImageStack(newImageStack); + cacheRef.current[CACHE_KEY] = newImageStack; + return newImageStack; + }, [selectedFile, cacheStack, fname, currentImageIndex]); + + const { isLoading, data } = useQuery({ + queryKey: ["cornerstone-preview", fname], + queryFn: previewFile, + enabled: !!selectedFile && !!elementRef.current, + }); + + // Clean up when the component unmounts + useEffect(() => { + return () => { + renderingEngineRef.current?.destroy(); + cacheRef.current = { [CACHE_KEY]: {} }; setIsLoadingMore(false); - if (abortSignal.aborted) { - } else { - console.error("Error loading images:", err); + setLastLoadedIndex(0); + setImageStack({}); + if (elementRef.current) { + elementRef.current.removeEventListener( + events.IMAGE_RENDERED, + handleImageRendered, + ); } + }; + }, []); + + // Load multi-frame images + const loadMultiFrames = useCallback(async () => { + if (activeViewportRef.current) { + const currentIndex = activeViewportRef.current.getCurrentImageIdIndex(); + const imageIDs = imageStack[fname] as string[]; + await activeViewportRef.current.setStack(imageIDs, currentIndex); + activeViewportRef.current.render(); + } + }, [imageStack, fname]); + + // Generator for loading image files + function* imageFileGenerator(list: IFileBlob[], startIndex: number) { + for (let i = startIndex; i < list.length; i++) { + yield list[i]; } - }; - - async function* imageBatchGenerator( - start: number, - end: number, - skipIndex: number, - abortSignal: AbortSignal, // Include abort signal - ) { - for (let i = start; i < end; i++) { - if (abortSignal.aborted) { - return; // Exit the generator early if aborted + } + + // Load more images when needed + const loadMoreImages = useCallback( + async (filteredList: IFileBlob[]) => { + if (Object.keys(cacheStack).length === filteredList.length) { + setImageStack(cacheStack); + if (activeViewportRef.current) { + const currentIndex = + activeViewportRef.current.getCurrentImageIdIndex(); + const imageIDs = Object.values(cacheStack).flat() as string[]; + await activeViewportRef.current.setStack(imageIDs, currentIndex); + activeViewportRef.current.render(); + } + return; } - if (i === skipIndex) continue; + setIsLoadingMore(true); + const generator = imageFileGenerator(filteredList, lastLoadedIndex); + const newImages: ImageStackType = {}; - const file = filteredList[i]; - if (file) { - const imageID = await loadImage(file); - if (imageID) { - yield imageID; // Yield the image ID one by one + let next = generator.next(); + while (!next.done) { + const file = next.value; + if (cacheStack[file.data.fname]) { + next = generator.next(); + continue; } + + const blob = await file.getFileBlob(); + const imageData = await loadDicomImage(blob); + newImages[file.data.fname] = imageData.imageID; + next = generator.next(); } - } - } + const updatedImageStack = { ...cacheStack, ...newImages }; + setImageStack(updatedImageStack); + cacheRef.current[CACHE_KEY] = updatedImageStack; + + if (activeViewportRef.current) { + const currentIndex = activeViewportRef.current.getCurrentImageIdIndex(); + const imageIDs = Object.values(updatedImageStack).flat() as string[]; + await activeViewportRef.current.setStack(imageIDs, currentIndex); + activeViewportRef.current.render(); + } + + setLastLoadedIndex(lastLoadedIndex + Object.keys(newImages).length); + setIsLoadingMore(false); + }, + [cacheStack, lastLoadedIndex], + ); + + const loadingFirstFrame = isLoading || !data; + + // Load more images when scrolling near the end useEffect(() => { - const abortController = new AbortController(); - setLastProcessedIndex(0); - if (!isLoading && filteredList && !multiFrameDisplay) { - const selectedIndex = filteredList.findIndex( - (file) => file.data.fname === selectedFile?.data.fname, - ); - loadImagesInBatches( - lastProcessedIndex, - filteredList.length, - selectedIndex, - abortController.signal, - ); - setLastProcessedIndex(filteredList.length); - } else if (multiFrameDisplay) { - loadMultiFrames(); + if ( + !loadingFirstFrame && + !Array.isArray(data[selectedFile.data.fname]) && + filteredList.length > lastLoadedIndex && + Object.keys(cacheStack).length !== filteredList.length && + !multiFrameDisplay + ) { + loadMoreImages(filteredList); } - return () => { - abortController.abort(); // Cleanup: abort the ongoing image loading process if the component unmounts - }; + if (!loadingFirstFrame && multiFrameDisplay) { + loadMultiFrames(); + } }, [ - isLoading, + loadingFirstFrame, filteredList, - activeViewport, + lastLoadedIndex, + cacheStack, multiFrameDisplay, + loadMoreImages, + loadMultiFrames, + data, selectedFile, ]); - useEffect(() => { - if ( - filteredList && - fetchMore && - handlePagination && - !filesLoading && - lastProcessedIndex === filteredList.length - 1 - ) { - handlePagination(); + // Handle image rendering event + const handleImageRendered = useCallback(() => { + if (activeViewportRef.current) { + const newIndex = activeViewportRef.current.getCurrentImageIdIndex(); + setCurrentImageIndex(newIndex); + + if ( + filteredList && + newIndex >= filteredList.length - 5 && + fetchMore && + !filesLoading && + !isLoadingMore && + !loadingFirstFrame && + !multiFrameDisplay + ) { + handlePagination?.(); + } } }, [ - fetchMore, filteredList, - lastProcessedIndex, - handlePagination, + fetchMore, filesLoading, + isLoadingMore, + loadingFirstFrame, + multiFrameDisplay, + handlePagination, ]); + // Add event listener for image rendering useEffect(() => { - if (activeViewport && filteredList && handlePagination) { - const element = activeViewport.element; - const handleImageRendered = () => { - const newIndex = activeViewport.getCurrentImageIdIndex(); - setCurrentImageIndex(newIndex); - if (newIndex >= filteredList.length - 5 && fetchMore && !filesLoading) { - handlePagination(); - } - }; - element.addEventListener(events.IMAGE_RENDERED, handleImageRendered); - return () => { - element.removeEventListener(events.IMAGE_RENDERED, handleImageRendered); - }; + if (elementRef.current) { + elementRef.current.addEventListener( + events.IMAGE_RENDERED, + handleImageRendered, + ); } - }, [fetchMore, handlePagination, filesLoading, filteredList, activeViewport]); + return () => { + if (elementRef.current) { + elementRef.current.removeEventListener( + events.IMAGE_RENDERED, + handleImageRendered, + ); + } + }; + }, [handleImageRendered]); + + const imageCount = multiFrameDisplay + ? (imageStack[fname] as string[]).length + : Object.values(imageStack).flat().length; return ( <> - {isLoading && <SpinContainer title="Displaying image..." />} + {loadingFirstFrame && <SpinContainer title="Displaying image..." />} <div id="content" ref={dicomImageRef} @@ -300,11 +337,13 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { position: "absolute", top: "0.25em", right: "0.25em", - zIndex: "99999", + zIndex: 99999, }} > <div style={{ color: "#fff" }}> - {`Current Index: ${currentImageIndex + 1} (${currentImageIndex + 1}/${imageStack.length})`} + {`Current Index: ${currentImageIndex + 1} (${ + currentImageIndex + 1 + }/${imageCount})`} </div> {isLoadingMore && ( <div style={{ color: "#fff" }}> @@ -313,7 +352,11 @@ const DcmDisplay: React.FC<DcmImageProps> = (props: DcmImageProps) => { )} </div> - <div id={elementId} /> + <div + id={`cornerstone-element-${fname}`} + ref={elementRef} + style={{ width: "100%", height: "100%" }} + /> </div> </> ); diff --git a/src/components/Preview/displays/ImageDisplay.tsx b/src/components/Preview/displays/ImageDisplay.tsx index 833d409a1..e095fd369 100644 --- a/src/components/Preview/displays/ImageDisplay.tsx +++ b/src/components/Preview/displays/ImageDisplay.tsx @@ -45,7 +45,7 @@ const ImageDisplay: React.FunctionComponent<AllProps> = ({ selectedFile }) => { <img id={selectedFile?.data.fname || ""} src={url} - alt={selectedFile?.data.fname || "image"} + alt={selectedFile?.data.fname} onClick={(e) => e.preventDefault()} // Prevent default behavior on click onKeyDown={(e) => e.preventDefault()} style={{ maxWidth: "100%", height: "auto" }} // Responsive styling diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index ba9ea42b2..27cf131a0 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -23,6 +23,7 @@ import dicomParser from "dicom-parser"; import hardcodedMetaDataProvider from "./hardcodedMetaDataProvider"; import ptScalingMetaDataProvider from "./ptScalingMetaDataProvider"; import registerWebImageLoader from "./webImageLoader"; +import { IFileBlob } from "../../../../api/model"; //@ts-ignore window.cornerstone = cornerstone; @@ -98,10 +99,11 @@ export const cleanupCornerstoneTooling = () => { export function setUpTooling(uniqueToolId: string) { // Check if tool group already exists const id = toolGroup?.id; + if (!id) { // Tool group doesn't exist, create a new one + registerToolingOnce(); toolGroup = ToolGroupManager.createToolGroup(uniqueToolId); - if (toolGroup) { toolGroup.addTool(WindowLevelTool.toolName); toolGroup.addTool(PanTool.toolName); From 8c922cb8341663124ff05790481f660dceb80bcb Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Mon, 7 Oct 2024 21:06:29 -0400 Subject: [PATCH 282/337] feat: cine player for a dicom display --- .../Preview/displays/DcmDisplay.tsx | 187 +++++++++++++++--- 1 file changed, 159 insertions(+), 28 deletions(-) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 80814dc9a..09933afbb 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -13,6 +13,7 @@ import { events, } from "./dicomUtils/utils"; import type { IStackViewport } from "./dicomUtils/utils"; +import { Button } from "@patternfly/react-core"; export type DcmImageProps = { selectedFile: IFileBlob; @@ -41,12 +42,16 @@ const DcmDisplay = (props: DcmImageProps) => { filesLoading, } = props; + // State variables const [currentImageIndex, setCurrentImageIndex] = useState(0); const [imageStack, setImageStack] = useState<ImageStackType>({}); - const [multiFrameDisplay, setMultiframeDisplay] = useState(false); + const [multiFrameDisplay, setMultiFrameDisplay] = useState(false); const [isLoadingMore, setIsLoadingMore] = useState(false); const [lastLoadedIndex, setLastLoadedIndex] = useState(0); + const [isPlaying, setIsPlaying] = useState(false); + const [playbackSpeed, setPlaybackSpeed] = useState(24); // frames per second + // Refs const dicomImageRef = useRef<HTMLDivElement>(null); const elementRef = useRef<HTMLDivElement>(null); const renderingEngineRef = useRef<RenderingEngine | null>(null); @@ -54,12 +59,16 @@ const DcmDisplay = (props: DcmImageProps) => { const cacheRef = useRef<{ [key: string]: ImageStackType }>({ [CACHE_KEY]: {}, }); + const cineIntervalIdRef = useRef<NodeJS.Timeout | null>(null); + // Derived values const size = useSize(dicomImageRef); const cacheStack = cacheRef.current[CACHE_KEY]; const fname = selectedFile.data.fname; - // Handle resizing of the DICOM image viewer + /** + * Handle resizing of the DICOM image viewer when the container size changes. + */ const handleResize = useCallback(() => { if (dicomImageRef.current && size && elementRef.current) { const { width, height } = size; @@ -70,6 +79,7 @@ const DcmDisplay = (props: DcmImageProps) => { } }, [size]); + // Set up resize event listener useEffect(() => { window.addEventListener("resize", handleResize); handleResize(); // Initial resize @@ -78,7 +88,9 @@ const DcmDisplay = (props: DcmImageProps) => { }; }, [handleResize]); - // Initialize Cornerstone + /** + * Initialize Cornerstone library and set up tooling. + */ useEffect(() => { const setupCornerstone = async () => { await basicInit(); @@ -87,20 +99,27 @@ const DcmDisplay = (props: DcmImageProps) => { setupCornerstone(); }, []); - // Filter the list to include only DICOM files + /** + * Filter the file list to include only DICOM files. + */ const filteredList = useMemo( () => list?.filter((file) => getFileExtension(file.data.fname) === "dcm") || [], [list], ); - // Preview the selected DICOM file + /** + * Preview the selected DICOM file. + * If the image is already cached, it uses the cached data. + * Otherwise, it loads the image and caches it. + */ const previewFile = useCallback(async () => { if (!elementRef.current) return {}; const existingImageEntry = cacheStack?.[fname]; if (existingImageEntry && activeViewportRef.current) { + // Image is already cached let imageIDs: string[]; let index: number; @@ -108,12 +127,12 @@ const DcmDisplay = (props: DcmImageProps) => { // Multi-frame image imageIDs = existingImageEntry; index = currentImageIndex; - setMultiframeDisplay(true); + setMultiFrameDisplay(true); } else { // Single-frame images imageIDs = Object.values(cacheStack).flat() as string[]; index = imageIDs.findIndex((id) => id === existingImageEntry); - setMultiframeDisplay(false); + setMultiFrameDisplay(false); } await activeViewportRef.current.setStack( @@ -146,7 +165,7 @@ const DcmDisplay = (props: DcmImageProps) => { elementId, ); - setMultiframeDisplay(framesCount > 1); + setMultiFrameDisplay(framesCount > 1); activeViewportRef.current = viewport; renderingEngineRef.current = renderingEngine; @@ -155,13 +174,27 @@ const DcmDisplay = (props: DcmImageProps) => { return newImageStack; }, [selectedFile, cacheStack, fname, currentImageIndex]); + // Use React Query to fetch and cache the preview data const { isLoading, data } = useQuery({ queryKey: ["cornerstone-preview", fname], queryFn: previewFile, enabled: !!selectedFile && !!elementRef.current, }); - // Clean up when the component unmounts + /** + * Stop cine playback. + */ + const stopCinePlay = useCallback(() => { + if (cineIntervalIdRef.current) { + clearInterval(cineIntervalIdRef.current); + cineIntervalIdRef.current = null; + } + }, []); + + /** + * Clean up when the component unmounts. + * Destroys the rendering engine and clears caches and intervals. + */ useEffect(() => { return () => { renderingEngineRef.current?.destroy(); @@ -175,10 +208,13 @@ const DcmDisplay = (props: DcmImageProps) => { handleImageRendered, ); } + stopCinePlay(); }; - }, []); + }, [stopCinePlay]); - // Load multi-frame images + /** + * Load multi-frame images into the viewport. + */ const loadMultiFrames = useCallback(async () => { if (activeViewportRef.current) { const currentIndex = activeViewportRef.current.getCurrentImageIdIndex(); @@ -188,17 +224,23 @@ const DcmDisplay = (props: DcmImageProps) => { } }, [imageStack, fname]); - // Generator for loading image files + /** + * Generator function to yield image files starting from a specific index. + */ function* imageFileGenerator(list: IFileBlob[], startIndex: number) { for (let i = startIndex; i < list.length; i++) { yield list[i]; } } - // Load more images when needed + /** + * Load more images when needed. + * This function loads additional images into the cache and updates the viewport. + */ const loadMoreImages = useCallback( async (filteredList: IFileBlob[]) => { if (Object.keys(cacheStack).length === filteredList.length) { + // All images are already loaded setImageStack(cacheStack); if (activeViewportRef.current) { const currentIndex = @@ -214,18 +256,15 @@ const DcmDisplay = (props: DcmImageProps) => { const generator = imageFileGenerator(filteredList, lastLoadedIndex); const newImages: ImageStackType = {}; - let next = generator.next(); - while (!next.done) { + for (let next = generator.next(); !next.done; next = generator.next()) { const file = next.value; if (cacheStack[file.data.fname]) { - next = generator.next(); - continue; + continue; // Skip if already in cache } const blob = await file.getFileBlob(); const imageData = await loadDicomImage(blob); newImages[file.data.fname] = imageData.imageID; - next = generator.next(); } const updatedImageStack = { ...cacheStack, ...newImages }; @@ -245,9 +284,13 @@ const DcmDisplay = (props: DcmImageProps) => { [cacheStack, lastLoadedIndex], ); + // Check if the first frame is still loading const loadingFirstFrame = isLoading || !data; - // Load more images when scrolling near the end + /** + * Load more images when scrolling near the end. + * Also handles loading multi-frame images. + */ useEffect(() => { if ( !loadingFirstFrame && @@ -274,7 +317,10 @@ const DcmDisplay = (props: DcmImageProps) => { selectedFile, ]); - // Handle image rendering event + /** + * Handle image rendered event. + * Updates the current image index and triggers pagination if needed. + */ const handleImageRendered = useCallback(() => { if (activeViewportRef.current) { const newIndex = activeViewportRef.current.getCurrentImageIdIndex(); @@ -302,7 +348,7 @@ const DcmDisplay = (props: DcmImageProps) => { handlePagination, ]); - // Add event listener for image rendering + // Add event listener for image rendered event useEffect(() => { if (elementRef.current) { elementRef.current.addEventListener( @@ -320,9 +366,58 @@ const DcmDisplay = (props: DcmImageProps) => { }; }, [handleImageRendered]); - const imageCount = multiFrameDisplay - ? (imageStack[fname] as string[]).length - : Object.values(imageStack).flat().length; + /** + * Calculate the total number of images. + */ + const imageCount = useMemo(() => { + return multiFrameDisplay + ? (imageStack[fname] as string[]).length + : Object.values(imageStack).flat().length; + }, [multiFrameDisplay, imageStack, fname]); + + const totalDigits = imageCount.toString().length; + const currentIndexDisplay = (currentImageIndex + 1) + .toString() + .padStart(totalDigits, "0"); + const imageCountDisplay = imageCount.toString().padStart(totalDigits, "0"); + + /** + * Start cine playback. + */ + const startCinePlay = useCallback(() => { + if ( + cineIntervalIdRef.current || + !activeViewportRef.current || + !imageStack[fname] + ) + return; + + const frameDuration = 1000 / playbackSpeed; // Calculate frame duration in milliseconds + + cineIntervalIdRef.current = setInterval(() => { + if (activeViewportRef.current) { + let currentIndex = activeViewportRef.current.getCurrentImageIdIndex(); + const totalImages = imageCount; + currentIndex = (currentIndex + 1) % totalImages; + activeViewportRef.current.setImageIdIndex(currentIndex); + setCurrentImageIndex(currentIndex); + } + }, frameDuration); + }, [playbackSpeed, imageStack, fname, imageCount]); + + /** + * Manage cine playback based on `isPlaying` state. + */ + useEffect(() => { + if (isPlaying) { + startCinePlay(); + } else { + stopCinePlay(); + } + return () => { + stopCinePlay(); + }; + }, [isPlaying, startCinePlay, stopCinePlay]); return ( <> @@ -332,19 +427,54 @@ const DcmDisplay = (props: DcmImageProps) => { ref={dicomImageRef} className={preview === "large" ? "dcm-preview" : ""} > + {/* Overlay Controls */} <div style={{ position: "absolute", top: "0.25em", right: "0.25em", zIndex: 99999, + width: "200px", // Set a fixed width }} > - <div style={{ color: "#fff" }}> - {`Current Index: ${currentImageIndex + 1} (${ - currentImageIndex + 1 - }/${imageCount})`} + {/* Current Index Display */} + <div + style={{ + color: "#fff", + marginBottom: "0.5em", + fontFamily: "monospace", // Use monospaced font + }} + > + {`Current Index: ${currentIndexDisplay}/${imageCountDisplay}`} </div> + + {/* Play/Pause Button */} + <div style={{ marginBottom: "0.5em" }}> + <Button + variant="control" + size="sm" + onClick={() => setIsPlaying(!isPlaying)} + > + {isPlaying ? "Pause" : "Play"} + </Button> + </div> + + {/* Playback Speed Control */} + <div style={{ color: "#fff", marginBottom: "0.5em" }}> + <label> + Speed: + <input + type="number" + value={playbackSpeed} + min="1" + max="60" + onChange={(e) => setPlaybackSpeed(Number(e.target.value))} + /> + fps + </label> + </div> + + {/* Loading More Indicator */} {isLoadingMore && ( <div style={{ color: "#fff" }}> <i>Loading more...</i> @@ -352,6 +482,7 @@ const DcmDisplay = (props: DcmImageProps) => { )} </div> + {/* DICOM Image Display */} <div id={`cornerstone-element-${fname}`} ref={elementRef} From 5e1705eff9dd990995929999c54ff8f76f78b9ad Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 8 Oct 2024 11:37:01 -0400 Subject: [PATCH 283/337] fix: Fix the regression in the 3D rendering of the Feed Graph --- src/components/FeedTree/FeedGraph.tsx | 82 +++++++++++++-------------- 1 file changed, 39 insertions(+), 43 deletions(-) diff --git a/src/components/FeedTree/FeedGraph.tsx b/src/components/FeedTree/FeedGraph.tsx index 5839a0252..b6c590d63 100644 --- a/src/components/FeedTree/FeedGraph.tsx +++ b/src/components/FeedTree/FeedGraph.tsx @@ -6,7 +6,7 @@ import ForceGraph2D, { type ForceGraphMethods, type NodeObject, } from "react-force-graph-2d"; -import { connect, useDispatch } from "react-redux"; +import { connect } from "react-redux"; import { TreeModel } from "../../api/model"; import { setFeedLayout } from "../../store/feed/feedSlice"; import { useAppSelector } from "../../store/hooks"; @@ -14,6 +14,7 @@ import type { PluginInstancePayload } from "../../store/pluginInstance/types"; import type { ApplicationState } from "../../store/root/applicationState"; import { type FeedTreeScaleType, NodeScaleDropdown } from "./Controls"; import "./FeedTree.css"; +import { useAppDispatch } from "../../store/hooks"; import useSize from "./useSize"; interface IFeedProps { @@ -114,50 +115,45 @@ const FeedGraph = (props: IFeedProps) => { /> </div> </div> - <> - <ForceGraph2D - height={size.height || 500} - width={size.width || 500} - ref={fgRef} - graphData={graphData} - //@ts-ignore - dagMode={controls["DAG Orientation"]} - dagLevelDistance={50} - backgroundColor="#101020" - linkColor={() => "rgba(255,255,255,0.2)"} - nodeVal={ - nodeScale.enabled - ? (node: any) => { - if (nodeScale.type === "time") { - const instanceData = (node.item as PluginInstance).data; - const start = new Date(instanceData?.start_date); - const end = new Date(instanceData?.end_date); - return Math.log10(end.getTime() - start.getTime()) * 10; - } - return 1; + <ForceGraph2D + height={size.height || 500} + width={size.width || 500} + ref={fgRef} + graphData={graphData} + //@ts-ignore + dagMode={controls["DAG Orientation"]} + dagLevelDistance={50} + backgroundColor="#101020" + linkColor={() => "rgba(255,255,255,0.2)"} + nodeVal={ + nodeScale.enabled + ? (node: any) => { + if (nodeScale.type === "time") { + const instanceData = (node.item as PluginInstance).data; + const start = new Date(instanceData?.start_date); + const end = new Date(instanceData?.end_date); + return Math.log10(end.getTime() - start.getTime()) * 10; } - : undefined + return 1; + } + : undefined + } + onNodeClick={handleNodeClick} + nodeLabel={(d: any) => { + return `${d.item.data.title || d.item.data.plugin_name}`; + }} + nodeAutoColorBy={(d: any) => { + if (selectedPlugin && d.item.data.id === selectedPlugin.data.id) { + return "#fff"; } - onNodeClick={handleNodeClick} - nodeLabel={(d: any) => { - return `${d.item.data.title || d.item.data.plugin_name}`; - }} - nodeAutoColorBy={(d: any) => { - if ( - selectedPlugin && - d.item.data.id === selectedPlugin.data.id - ) { - return "#fff"; - } - return d.group; - }} - linkDirectionalParticles={2} - linkDirectionalParticleWidth={2} - d3VelocityDecay={0.3} - linkWidth={2} - nodeRelSize={8} - /> - </> + return d.group; + }} + linkDirectionalParticles={2} + linkDirectionalParticleWidth={2} + d3VelocityDecay={0.3} + linkWidth={2} + nodeRelSize={8} + /> </ErrorBoundary> ) : ( <Text>Fetching the Graph....</Text> From aa2c3cbc3fbb9b9df3bd89a4fb89d91ec95a1849 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 8 Oct 2024 18:33:37 -0400 Subject: [PATCH 284/337] feat: Cleanup --- src/components/Dashboard/index.tsx | 52 +------------------ src/components/DisplayPage/display-page.css | 4 +- src/components/DisplayPage/index.tsx | 18 ++++--- .../FeedOutputBrowser/FeedOutputBrowser.tsx | 2 +- .../NewLibrary/components/LibraryTable.tsx | 1 - src/components/NewLibrary/index.tsx | 7 ++- src/components/PipelinesCopy/index.tsx | 1 - .../Preview/displays/dicomUtils/utils.ts | 1 - 8 files changed, 21 insertions(+), 65 deletions(-) diff --git a/src/components/Dashboard/index.tsx b/src/components/Dashboard/index.tsx index c2405164e..cb84bb8bc 100644 --- a/src/components/Dashboard/index.tsx +++ b/src/components/Dashboard/index.tsx @@ -18,9 +18,7 @@ const DashboardPage = () => { <> Retrieve, analyze, and visualize <i>any data</i> using a powerful cloud computing platform: ChRIS. <b>Let's get started.</b> - <p> - Build: <code className="build-version">{BUILD_VERSION}</code> - </p> + <p></p> </> } /> @@ -28,53 +26,7 @@ const DashboardPage = () => { return ( <WrapperConnect titleComponent={TitleComponent}> - <PageSection> - <Grid hasGutter> - <GridItem lg={4}> - <CatalogTile - id="simple-title" - featured - title="You've got data" - description={ - 'Visit the "Library" in the main navigation to review your data collection' - } - />{" "} - </GridItem> - - <GridItem lg={4}> - <CatalogTile - id="simple-title" - featured - title="Analyses" - description={ - 'Visit "New and Existing Analyses" in the main navigation to review your data analyses' - } - /> - </GridItem> - - <GridItem lg={4}> - <CatalogTile - id="simple-title" - featured - title="Discover and collect new data" - description={ - 'Visit "PACS Query/Retrieve" in the main navigation to pull medical data and save it your library' - } - /> - </GridItem> - - <GridItem lg={4}> - <CatalogTile - id="simple-title" - featured - title="Run a Workflow" - description={ - 'Visit "Run a Quick Workflow" to choose from existing analysis templates that allow for detailed analysis' - } - /> - </GridItem> - </Grid> - </PageSection> + <PageSection></PageSection> </WrapperConnect> ); }; diff --git a/src/components/DisplayPage/display-page.css b/src/components/DisplayPage/display-page.css index 7b61075d0..c42a0ebf0 100644 --- a/src/components/DisplayPage/display-page.css +++ b/src/components/DisplayPage/display-page.css @@ -49,8 +49,8 @@ text-decoration: none; } -.plugin-item-title, -.compute-item-description { +.plugin-item-title + { font-size: 1em; font-weight: 400; } diff --git a/src/components/DisplayPage/index.tsx b/src/components/DisplayPage/index.tsx index 862ea2374..d962c7fce 100644 --- a/src/components/DisplayPage/index.tsx +++ b/src/components/DisplayPage/index.tsx @@ -198,18 +198,20 @@ const DisplayPage = ({ )} {isCompute && ( - <h1 className="compute-item-description"> + <h1 className="plugin-item-name"> {resource.data.description} </h1> )} - <p - style={{ - fontSize: "0.90rem", - }} - > - Version: {resource.data.version} - </p> + {resource.data.version && ( + <p + style={{ + fontSize: "0.90rem", + }} + > + Version: {resource.data.version} + </p> + )} <p style={{ diff --git a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx index b7e7fda0b..e53ff1819 100644 --- a/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx +++ b/src/components/FeedOutputBrowser/FeedOutputBrowser.tsx @@ -50,7 +50,7 @@ const FeedOutputBrowser: React.FC<FeedOutputBrowserProps> = () => { ) : isError ? ( <Alert type="error" description={error?.message} /> ) : ( - <EmptyStateLoader title="Files are not available yet..." /> + <EmptyStateLoader title="" /> )} </div> ); diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 14271c1c5..f5822eccc 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -309,7 +309,6 @@ const LibraryTable: React.FC<TableProps> = ({ isStriped={true} isStickyHeader={true} > - <Caption>Data Library</Caption> <Thead> <Tr> <Th screenReaderText="Select a row" arial-label="Select a row" /> diff --git a/src/components/NewLibrary/index.tsx b/src/components/NewLibrary/index.tsx index d2a1c7976..7b601d187 100644 --- a/src/components/NewLibrary/index.tsx +++ b/src/components/NewLibrary/index.tsx @@ -11,6 +11,7 @@ import { useLocation, useNavigate } from "react-router"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useAppSelector } from "../../store/hooks"; import { Alert } from "../Antd"; +import { notification } from "../Antd"; import { EmptyStateComponent, SpinContainer } from "../Common"; import { InfoSection } from "../Common"; import WrapperConnect from "../Wrapper"; @@ -20,7 +21,6 @@ import { FolderCard } from "./components/FolderCard"; import LibraryTable from "./components/LibraryTable"; import Operations from "./components/Operations"; import { OperationContext } from "./context"; -import { notification } from "../Antd"; // Fetch folders from the server export async function fetchFolders(computedPath: string, pageNumber?: number) { @@ -220,6 +220,11 @@ const NewLibrary = () => { }} computedPath={computedPath} folderList={data?.folderList} + customStyle={{ + toolbar: { + paddingBottom: "0", + }, + }} /> <BreadcrumbContainer path={computedPath} diff --git a/src/components/PipelinesCopy/index.tsx b/src/components/PipelinesCopy/index.tsx index 902da0943..debc8d237 100644 --- a/src/components/PipelinesCopy/index.tsx +++ b/src/components/PipelinesCopy/index.tsx @@ -49,7 +49,6 @@ const PipelinesCopy = () => { const [dropdownValue, setDropdownValue] = useState<string>( PIPELINEQueryTypes.NAME[0], ); - const isStaff = useAppSelector((state) => state.user.isStaff); const { data, isLoading, isError, error } = useQuery({ queryKey: ["pipelines", perPage, page, search, dropdownValue], diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index 27cf131a0..e6bfe86b3 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -23,7 +23,6 @@ import dicomParser from "dicom-parser"; import hardcodedMetaDataProvider from "./hardcodedMetaDataProvider"; import ptScalingMetaDataProvider from "./ptScalingMetaDataProvider"; import registerWebImageLoader from "./webImageLoader"; -import { IFileBlob } from "../../../../api/model"; //@ts-ignore window.cornerstone = cornerstone; From 67339e922e947c610db8ef5346267c1c689150af Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 8 Oct 2024 22:36:05 -0400 Subject: [PATCH 285/337] feat: Update the Overview Page --- README.md | 16 +- src/api/model.ts | 2 +- src/components/Dashboard/FeedGraph.tsx | 82 ++++++ src/components/Dashboard/dashboard.css | 45 +++- src/components/Dashboard/index.tsx | 121 ++++++++- src/components/Dashboard/util.ts | 340 +++++++++++++++++++++++++ src/components/FeedTree/FeedGraph.tsx | 141 +++++----- 7 files changed, 654 insertions(+), 93 deletions(-) create mode 100644 src/components/Dashboard/FeedGraph.tsx create mode 100644 src/components/Dashboard/util.ts diff --git a/README.md b/README.md index 4b8179621..a17848e25 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ This repository contains the reference UI for ChRIS, allowing users to create an ```shell git clone https://github.com/FNNDSC/ChRIS_ui.git cd ChRIS_ui -npm ci -npm run dev:public +pnpm install +pnpm run dev:public ``` ## Development @@ -64,7 +64,7 @@ You need Node version 20 or 21. ```shell git clone https://github.com/FNNDSC/ChRIS_ui.git cd ChRIS_ui -npm ci +pnpm install ``` #### Local Development Dependencies @@ -79,13 +79,13 @@ to run the backend and helper scripts. Either using the "public" server: ```shell -npm run dev:public +pnpm run dev:public ``` Or, start a local backend and run the "local" server: ```shell -npm run dev:local +pnpm run dev:local ``` ## Container Image @@ -117,7 +117,7 @@ Unit tests are defined in `*.test.ts` files inside `src`. It is recommended to leave this command running while developing _ChRIS_ui_. ```shell -npm test +pnpm test ``` ### End-to-End Tests @@ -128,9 +128,9 @@ The end-to-end testing framework, Playwright, requires some system dependencies. On first run, you will be prompted to install these dependencies. ```shell -npm run test:e2e # run tests using "public" backend +pnpm run test:e2e # run tests using "public" backend -npm run test:e2e:local # run tests using "local" backend +pnpm run test:e2e:local # run tests using "local" backend ``` For more information, consult the wiki: diff --git a/src/api/model.ts b/src/api/model.ts index 733330e76..5d70f576d 100644 --- a/src/api/model.ts +++ b/src/api/model.ts @@ -65,7 +65,7 @@ export class TreeModel { parseFeedTreeData(items: PluginInstance[], rootNodeId?: NodeId): ITreeChart { // Note: Reverse the array to expedite parsing also for demo purposes - this._workingItems = items.reverse().slice(); + this._workingItems = items; this._parseRootNode(items, rootNodeId); this._parseTreeChildren(this._workingItems, this._workingId); diff --git a/src/components/Dashboard/FeedGraph.tsx b/src/components/Dashboard/FeedGraph.tsx new file mode 100644 index 000000000..fd475376e --- /dev/null +++ b/src/components/Dashboard/FeedGraph.tsx @@ -0,0 +1,82 @@ +// src/components/FeedGraph.tsx + +import React from "react"; +import ForceGraph2D, { type ForceGraphMethods } from "react-force-graph-2d"; +import useSize from "../FeedTree/useSize"; + +const FeedGraph = ({ graphData }: any) => { + const graphRef = React.useRef<HTMLDivElement | null>(null); + const fgRef = React.useRef<ForceGraphMethods | undefined>(); + const size = useSize(graphRef); + const [controls] = React.useState({ "DAG Orientation": "td" }); + + // Define constants for node and label styling + const NODE_SIZE = 2; + const LABEL_FONT_SIZE = 10; // Base font size + const LABEL_COLOR = "#ffffff"; // White color for labels + const LABEL_OFFSET_Y = -10; // Y-axis offset for label positioning + + return ( + <div className="feed-tree" ref={graphRef}> + <ForceGraph2D + height={size?.height || 300} + width={size?.width || 300} + ref={fgRef} + graphData={graphData} + //@ts-ignore + dagMode={controls["DAG Orientation"]} + dagLevelDistance={20} + backgroundColor="#101020" + linkColor={() => "rgba(255,255,255,0.2)"} + nodeAutoColorBy={(d: any) => d.group} + linkDirectionalParticles={2} + linkDirectionalParticleWidth={2} + d3VelocityDecay={1} + linkWidth={1} + nodeRelSize={NODE_SIZE} + // Remove nodeLabel as labels will be drawn on the canvas + // nodeLabel={(d: any) => `${d.item.data.title || d.item.data.plugin_name}`} + // Custom node rendering to include labels + nodeCanvasObject={( + node: any, + ctx: CanvasRenderingContext2D, + globalScale: number, + ) => { + const label = node.item.data.title || node.item.data.plugin_name; + + // Calculate font size based on zoom level + const fontSize = LABEL_FONT_SIZE / globalScale; + ctx.font = `${fontSize}px Sans-Serif`; + ctx.fillStyle = LABEL_COLOR; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + + // Draw node as a circle + ctx.beginPath(); + ctx.arc(node.x, node.y, NODE_SIZE, 0, 2 * Math.PI, false); + ctx.fillStyle = node.color || "#ffffff"; // Default to white if no color + ctx.fill(); + + // Draw label above the node + ctx.fillText(label, node.x, node.y + LABEL_OFFSET_Y); + }} + // Optional: Improve node interactivity by expanding the pointer area + nodePointerAreaPaint={( + node: any, + color: string, + ctx: CanvasRenderingContext2D, + ) => { + const label = node.item.data.title || node.item.data.plugin_name; + const fontSize = LABEL_FONT_SIZE / 2; + ctx.font = `${fontSize}px Sans-Serif`; + ctx.fillStyle = color; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(label, node.x, node.y + LABEL_OFFSET_Y); + }} + /> + </div> + ); +}; + +export default FeedGraph; diff --git a/src/components/Dashboard/dashboard.css b/src/components/Dashboard/dashboard.css index 056f03e98..37afe650b 100644 --- a/src/components/Dashboard/dashboard.css +++ b/src/components/Dashboard/dashboard.css @@ -2,18 +2,41 @@ color: white; } -@media screen and (min-width: pf-global--breakpoint--sm) and ( - max-width: pf-global--breakpoint--md - ) { - .dashboard-carddisplay img:nth-last-of-type(-n + 2) { - display: none; - } + +.description-section { + border-radius: 8px; + height: 100%; +} + +.uniform-card-height { + height: 450px; /* Set a consistent height for both cards */ + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.description-section h2 { + color: #007bff; /* Blue accent */ + margin-bottom: 10px; +} + +.description-section p { + font-size: 16px; + text-align: justify; +} + +.tree-section { + width: 100%; + flex-grow: 1; /* Allow the graph to fill the remaining space */ + border: 1px solid #dddddd; + border-radius: 8px; + overflow: hidden; /* Hide overflow */ + position: relative; } -@media screen and (min-width: pf-global--breakpoint--xs) and ( - max-width: pf-global--breakpoint--sm - ) { - .dashboard-carddisplay img:nth-last-of-type(-n + 3) { - display: none; +/* Optional: Responsive adjustments */ +@media (max-width: 768px) { + .tree-section { + height: 400px; } } diff --git a/src/components/Dashboard/index.tsx b/src/components/Dashboard/index.tsx index cb84bb8bc..8b5e0d639 100644 --- a/src/components/Dashboard/index.tsx +++ b/src/components/Dashboard/index.tsx @@ -1,13 +1,22 @@ -import { CatalogTile } from "@patternfly/react-catalog-view-extension"; -import { Grid, GridItem, PageSection } from "@patternfly/react-core"; -import React from "react"; +// src/components/DashboardPage.tsx + +import { PageSection } from "@patternfly/react-core"; +import { Button, Card, Col, Row } from "antd"; +import type React from "react"; import BUILD_VERSION from "../../getBuildVersion"; +import { useEffect } from "react"; import { InfoSection } from "../Common"; import WrapperConnect from "../Wrapper"; +import FeedGraph from "./FeedGraph"; import "./dashboard.css"; +import { + covidnetDataset, + fetalBrainReconstructionDataset, + lldDataset, +} from "./util"; -const DashboardPage = () => { - React.useEffect(() => { +const DashboardPage: React.FC = () => { + useEffect(() => { document.title = "Overview"; }, []); @@ -18,7 +27,9 @@ const DashboardPage = () => { <> Retrieve, analyze, and visualize <i>any data</i> using a powerful cloud computing platform: ChRIS. <b>Let's get started.</b> - <p></p> + <p> + Build: <code className="build-version">{BUILD_VERSION}</code> + </p> </> } /> @@ -26,7 +37,103 @@ const DashboardPage = () => { return ( <WrapperConnect titleComponent={TitleComponent}> - <PageSection></PageSection> + <PageSection> + <Row gutter={[16, 16]}> + {/* Showcase Card: Leg Length Discrepancy Workflow */} + <Col xs={24}> + <Card + title="Leg Length Discrepancy Workflow" + bordered={false} + style={{ width: "100%" }} + > + <Row gutter={[16, 16]}> + {/* Description */} + <Col xs={24} md={12}> + <div className="description-section"> + <p> + The Leg Length Discrepancy (LLD) analysis is one of the + most frequently used workflows in ChRIS. This process + transforms leg X-rays from DICOM files into new DICOM + files containing detailed measurements of the tibia and + femur for both legs. + </p> + </div> + </Col> + + {/* Graph */} + <Col xs={24} md={12}> + <div className="tree-section"> + <FeedGraph graphData={lldDataset} /> + </div> + </Col> + </Row> + </Card> + </Col> + </Row> + + {/* Row for the bottom two cards */} + <Row gutter={[16, 16]}> + {/* COVIDnet Workflow Card */} + <Col xs={24} md={12}> + <Card + title="COVIDnet Workflow" + bordered={false} + className="uniform-card-height" /* Ensure both cards have the same height */ + style={{ width: "100%", padding: "10px" }} + > + <Row gutter={[16, 16]}> + {/* Graph */} + <Col xs={24}> + <div className="tree-section"> + <FeedGraph graphData={covidnetDataset} /> + </div> + </Col> + + {/* Read More Button */} + <Col xs={24}> + <Button + type="primary" + target="_blank" + href="https://github.com/FNNDSC/pl-covidnet?tab=readme-ov-file" + > + Read More + </Button> + </Col> + </Row> + </Card> + </Col> + + {/* Automatic Fetal Brain Reconstruction Pipeline Card */} + <Col xs={24} md={12}> + <Card + title="Automatic Fetal Brain Reconstruction Pipeline" + bordered={false} + className="uniform-card-height" /* Ensure both cards have the same height */ + style={{ width: "100%", padding: "10px" }} + > + <Row gutter={[16, 16]}> + {/* Graph */} + <Col xs={24}> + <div className="tree-section"> + <FeedGraph graphData={fetalBrainReconstructionDataset} /> + </div> + </Col> + + {/* Read More Button */} + <Col xs={24}> + <Button + type="primary" + target="_blank" + href="https://github.com/FNNDSC/Fetal_Brain_MRI_Reconstruction_Pipeline" + > + Read More + </Button> + </Col> + </Row> + </Card> + </Col> + </Row> + </PageSection> </WrapperConnect> ); }; diff --git a/src/components/Dashboard/util.ts b/src/components/Dashboard/util.ts new file mode 100644 index 000000000..f23c713b7 --- /dev/null +++ b/src/components/Dashboard/util.ts @@ -0,0 +1,340 @@ +// COVIDnet Dataset +export const covidnetDataset = { + nodes: [ + { + id: "root", + group: 1, + item: { + data: { + title: "Root Node", + }, + }, + }, + { + id: "Convert Original DICOM to JPG", + group: 2, + item: { + data: { + title: "Convert Original DICOM to JPG", + }, + }, + }, + { + id: "Combine PDF and DCM", + group: 3, + item: { + data: { + title: "Combine PDF and DCM", + }, + }, + }, + { + id: "COVIDnet classification", + group: 4, + item: { + data: { + title: "COVIDnet Classification", + }, + }, + }, + { + id: "Unstack folders", + group: 5, + item: { + data: { + title: "Unstack Folders", + }, + }, + }, + { + id: "Generate PDF report", + group: 6, + item: { + data: { + title: "Generate PDF Report", + }, + }, + }, + ], + links: [ + { source: "root", target: "Convert Original DICOM to JPG", value: 5 }, + { source: "root", target: "Combine PDF and DCM", value: 3 }, + { source: "Combine PDF and DCM", target: "Unstack folders", value: 4 }, + { + source: "Convert Original DICOM to JPG", + target: "COVIDnet classification", + value: 6, + }, + { + source: "COVIDnet classification", + target: "Generate PDF report", + value: 7, + }, + { source: "Generate PDF report", target: "Combine PDF and DCM", value: 2 }, + ], +}; + +// Leg Length Discrepancy (LLD) Dataset +export const lldDataset = { + nodes: [ + { + id: "root-0", + group: 1, + item: { + data: { + title: "root-0", + plugin_name: "pl-simpledsapp", + plugin_version: "2.1.0", + }, + }, + }, + { + id: "dcm-to-mha-1", + group: 2, + item: { + data: { + title: "dcm-to-mha-1", + plugin_name: "pl-dcm2mha_cnvtr", + plugin_version: "1.2.22", + }, + }, + }, + { + id: "heatmaps-join-root-3", + group: 3, + item: { + data: { + title: "heatmaps-join-root-3", + plugin_name: "pl-topologicalcopy", + plugin_version: "0.2.6", + }, + }, + }, + { + id: "generate-landmark-heatmaps-2", + group: 4, + item: { + data: { + title: "generate-landmark-heatmaps-2", + plugin_name: "pl-lld_inference", + plugin_version: "2.2.10", + }, + }, + }, + { + id: "landmarks-to-json-4", + group: 5, + item: { + data: { + title: "landmarks-to-json-4", + plugin_name: "pl-csv2json", + plugin_version: "1.2.2", + }, + }, + }, + { + id: "measurement-join-dicom-7", + group: 6, + item: { + data: { + title: "measurement-join-dicom-7", + plugin_name: "pl-topologicalcopy", + plugin_version: "0.2.6", + }, + }, + }, + { + id: "heatmaps-join-json-5", + group: 7, + item: { + data: { + title: "heatmaps-join-json-5", + plugin_name: "pl-topologicalcopy", + plugin_version: "0.2.6", + }, + }, + }, + { + id: "measure-leg-segments-6", + group: 8, + item: { + data: { + title: "measure-leg-segments-6", + plugin_name: "pl-markimg", + plugin_version: "1.2.30", + }, + }, + }, + { + id: "image-to-DICOM-8", + group: 9, + item: { + data: { + title: "image-to-DICOM-8", + plugin_name: "pl-dicommake", + plugin_version: "2.2.2", + }, + }, + }, + { + id: "pacs-push-9", + group: 10, + item: { + data: { + title: "pacs-push-9", + plugin_name: "pl-orthanc_push", + plugin_version: "1.2.2", + }, + }, + }, + ], + links: [ + { source: "root-0", target: "dcm-to-mha-1", value: 1 }, + { source: "root-0", target: "heatmaps-join-root-3", value: 1 }, + { + source: "dcm-to-mha-1", + target: "generate-landmark-heatmaps-2", + value: 1, + }, + { source: "heatmaps-join-root-3", target: "landmarks-to-json-4", value: 1 }, + { + source: "heatmaps-join-root-3", + target: "measurement-join-dicom-7", + value: 1, + }, + { source: "landmarks-to-json-4", target: "heatmaps-join-json-5", value: 1 }, + { + source: "heatmaps-join-json-5", + target: "measure-leg-segments-6", + value: 1, + }, + { source: "measure-leg-segments-6", target: "image-to-DICOM-8", value: 1 }, + { source: "image-to-DICOM-8", target: "pacs-push-9", value: 1 }, + ], +}; + +// Fetal Brain Reconstruction Dataset +export const fetalBrainReconstructionDataset = { + nodes: [ + { + id: "unstack-folders", + group: 1, + item: { + data: { + title: "Unstack folders", + plugin: "pl-unstack-folders v1.0.0", + }, + }, + }, + { + id: "convert-dicom-to-nifti", + group: 2, + item: { + data: { + title: "Convert DICOM to NIFTI", + plugin: "pl-dcm2niix v1.0.0", + }, + }, + }, + { + id: "brain-mask", + group: 3, + item: { + data: { + title: "Brain Mask", + plugin: "pl-emerald v0.2.2", + }, + }, + }, + { + id: "select-brain-extraction", + group: 4, + item: { + data: { + title: "Select brain extraction", + plugin: "pl-bulk-rename v0.1.2", + }, + }, + }, + { + id: "n4-bias-field-correction", + group: 5, + item: { + data: { + title: "N4 Bias Field Correction", + plugin: "pl-n4biasfieldcorrection v2.5.0.1", + }, + }, + }, + { + id: "automatic-fetal-brain-assessment", + group: 6, + item: { + data: { + title: "Automatic Fetal Brain Assessment", + plugin: "pl-fetal-brain-assessment v1.3.1", + }, + }, + }, + { + id: "reconstruction", + group: 7, + item: { + data: { + title: "Reconstruction", + plugin: "pl-NeSVoR-reconstruct v0.5.0", + }, + }, + }, + { + id: "brain-extraction-preview-figures", + group: 8, + item: { + data: { + title: "Brain extraction preview figures", + plugin: "pl-mri-preview v1.2.2", + }, + }, + }, + { + id: "brain-reconstruction-preview-figures", + group: 9, + item: { + data: { + title: "Brain reconstruction preview figures", + plugin: "pl-mri-preview v1.2.2", + }, + }, + }, + ], + links: [ + { source: "unstack-folders", target: "convert-dicom-to-nifti", value: 1 }, + { source: "convert-dicom-to-nifti", target: "brain-mask", value: 1 }, + { source: "brain-mask", target: "select-brain-extraction", value: 1 }, + { + source: "select-brain-extraction", + target: "n4-bias-field-correction", + value: 1, + }, + { + source: "n4-bias-field-correction", + target: "automatic-fetal-brain-assessment", + value: 1, + }, + { + source: "automatic-fetal-brain-assessment", + target: "reconstruction", + value: 1, + }, + { + source: "brain-mask", + target: "brain-extraction-preview-figures", + value: 1, + }, + { + source: "reconstruction", + target: "brain-reconstruction-preview-figures", + value: 1, + }, + ], +}; diff --git a/src/components/FeedTree/FeedGraph.tsx b/src/components/FeedTree/FeedGraph.tsx index b6c590d63..3d0aea32a 100644 --- a/src/components/FeedTree/FeedGraph.tsx +++ b/src/components/FeedTree/FeedGraph.tsx @@ -6,30 +6,35 @@ import ForceGraph2D, { type ForceGraphMethods, type NodeObject, } from "react-force-graph-2d"; -import { connect } from "react-redux"; import { TreeModel } from "../../api/model"; import { setFeedLayout } from "../../store/feed/feedSlice"; -import { useAppSelector } from "../../store/hooks"; -import type { PluginInstancePayload } from "../../store/pluginInstance/types"; -import type { ApplicationState } from "../../store/root/applicationState"; +import { useAppSelector, useAppDispatch } from "../../store/hooks"; import { type FeedTreeScaleType, NodeScaleDropdown } from "./Controls"; import "./FeedTree.css"; -import { useAppDispatch } from "../../store/hooks"; import useSize from "./useSize"; +import { SpinContainer } from "../Common"; interface IFeedProps { - pluginInstances: PluginInstancePayload; - selectedPlugin?: PluginInstance; onNodeClick: (node: PluginInstance) => void; } -const FeedGraph = (props: IFeedProps) => { +interface GraphData { + nodes: NodeObject[]; + links: { source: string; target: string }[]; +} + +const FeedGraph: React.FC<IFeedProps> = ({ onNodeClick }) => { const dispatch = useAppDispatch(); const currentLayout = useAppSelector((state) => state.feed.currentLayout); - const { pluginInstances, selectedPlugin, onNodeClick } = props; - const { data: instances } = pluginInstances; + const pluginInstances = useAppSelector( + (state) => state.instance.pluginInstances, + ); + const selectedPlugin = useAppSelector( + (state) => state.instance.selectedPlugin, + ); + const { data: instances, loading } = pluginInstances; const graphRef = React.useRef<HTMLDivElement | null>(null); - const fgRef = React.useRef<ForceGraphMethods | undefined>(); + const fgRef = React.useRef<ForceGraphMethods>(); const [nodeScale, setNodeScale] = React.useState<{ enabled: boolean; @@ -38,12 +43,19 @@ const FeedGraph = (props: IFeedProps) => { const size = useSize(graphRef); - const [graphData, setGraphData] = React.useState(); + const [graphData, setGraphData] = React.useState<GraphData | undefined>( + undefined, + ); const [controls] = React.useState({ "DAG Orientation": "td" }); const handleNodeClick = (node: NodeObject) => { const distance = 40; - if (node?.x && node.y && node.z && fgRef.current) { + if ( + node.x !== undefined && + node.y !== undefined && + node.z !== undefined && + fgRef.current + ) { const distRatio = 1 + distance / Math.hypot(node.x, node.y, node.z); //@ts-ignore fgRef.current.cameraPosition( @@ -52,20 +64,19 @@ const FeedGraph = (props: IFeedProps) => { y: node.y * distRatio, z: node.z * distRatio, }, // new position - //@ts-ignore node, // lookAt ({ x, y, z }) 3000, // ms transition duration ); } - //@ts-ignore - onNodeClick(node.item); + if (node.item && typeof node.item === "object") { + onNodeClick(node.item as PluginInstance); + } }; React.useEffect(() => { if (instances && instances.length > 0) { const tree = new TreeModel(instances); - //@ts-ignore setGraphData(tree.treeChart); } @@ -90,7 +101,10 @@ const FeedGraph = (props: IFeedProps) => { labelOff="Scale Nodes Off" isChecked={nodeScale.enabled} onChange={() => - setNodeScale({ ...nodeScale, enabled: !nodeScale.enabled }) + setNodeScale({ + ...nodeScale, + enabled: !nodeScale.enabled, + }) } /> @@ -115,58 +129,53 @@ const FeedGraph = (props: IFeedProps) => { /> </div> </div> - <ForceGraph2D - height={size.height || 500} - width={size.width || 500} - ref={fgRef} - graphData={graphData} - //@ts-ignore - dagMode={controls["DAG Orientation"]} - dagLevelDistance={50} - backgroundColor="#101020" - linkColor={() => "rgba(255,255,255,0.2)"} - nodeVal={ - nodeScale.enabled - ? (node: any) => { - if (nodeScale.type === "time") { - const instanceData = (node.item as PluginInstance).data; - const start = new Date(instanceData?.start_date); - const end = new Date(instanceData?.end_date); - return Math.log10(end.getTime() - start.getTime()) * 10; + {loading ? ( + <SpinContainer title="Fetching data.." /> + ) : ( + <ForceGraph2D + height={size.height || 500} + width={size.width || 500} + ref={fgRef} + graphData={graphData} + //@ts-ignore + dagMode={controls["DAG Orientation"] as "td" | "lr" | "rl" | "bt"} // Adjust the type as needed + dagLevelDistance={50} + backgroundColor="#101020" + linkColor={() => "rgba(255,255,255,0.2)"} + nodeVal={ + nodeScale.enabled + ? (node: NodeObject) => { + if (nodeScale.type === "time") { + const instanceData = (node.item as PluginInstance).data; + const start = new Date(instanceData?.start_date); + const end = new Date(instanceData?.end_date); + return Math.log10(end.getTime() - start.getTime()) * 10; + } + return 1; } - return 1; - } - : undefined - } - onNodeClick={handleNodeClick} - nodeLabel={(d: any) => { - return `${d.item.data.title || d.item.data.plugin_name}`; - }} - nodeAutoColorBy={(d: any) => { - if (selectedPlugin && d.item.data.id === selectedPlugin.data.id) { - return "#fff"; + : undefined + } + onNodeClick={handleNodeClick} + nodeLabel={(d: NodeObject) => + `${(d.item as PluginInstance).data.title || (d.item as PluginInstance).data.plugin_name}` + } + nodeAutoColorBy={(d: NodeObject) => + selectedPlugin && + (d.item as PluginInstance).data.id === selectedPlugin.data.id + ? "#fff" + : (d.group as string) } - return d.group; - }} - linkDirectionalParticles={2} - linkDirectionalParticleWidth={2} - d3VelocityDecay={0.3} - linkWidth={2} - nodeRelSize={8} - /> + linkDirectionalParticles={2} + linkDirectionalParticleWidth={2} + d3VelocityDecay={0.3} + linkWidth={2} + nodeRelSize={8} + /> + )} </ErrorBoundary> - ) : ( - <Text>Fetching the Graph....</Text> - )} + ) : null} </div> ); }; -const mapStateToProps = (state: ApplicationState) => ({ - pluginInstances: state.instance.pluginInstances, - selectedPlugin: state.instance.selectedPlugin, -}); - -const FeedGraphConnect = connect(mapStateToProps, {})(FeedGraph); - -export default FeedGraphConnect; +export default FeedGraph; From 39904af131aab6daa0a6592ec7485448eeb6fa3c Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 8 Oct 2024 22:38:10 -0400 Subject: [PATCH 286/337] fix: Fix Typo --- src/components/Dashboard/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Dashboard/index.tsx b/src/components/Dashboard/index.tsx index 8b5e0d639..231f70a0b 100644 --- a/src/components/Dashboard/index.tsx +++ b/src/components/Dashboard/index.tsx @@ -106,7 +106,7 @@ const DashboardPage: React.FC = () => { {/* Automatic Fetal Brain Reconstruction Pipeline Card */} <Col xs={24} md={12}> <Card - title="Automatic Fetal Brain Reconstruction Pipeline" + title="Automatic Fetal Brain Reconstruction Workflow" bordered={false} className="uniform-card-height" /* Ensure both cards have the same height */ style={{ width: "100%", padding: "10px" }} From 884c1c07b62473bb75ce4867b6cd61f4391c98e8 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 8 Oct 2024 23:08:09 -0400 Subject: [PATCH 287/337] feat: Update image display --- .../Preview/displays/ImageDisplay.tsx | 89 ++++++++++++------- 1 file changed, 59 insertions(+), 30 deletions(-) diff --git a/src/components/Preview/displays/ImageDisplay.tsx b/src/components/Preview/displays/ImageDisplay.tsx index e095fd369..16d5370fb 100644 --- a/src/components/Preview/displays/ImageDisplay.tsx +++ b/src/components/Preview/displays/ImageDisplay.tsx @@ -1,5 +1,6 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState, useRef } from "react"; import { getFileExtension, type IFileBlob } from "../../../api/model"; +import useSize from "../../FeedTree/useSize"; type AllProps = { selectedFile?: IFileBlob; @@ -7,49 +8,77 @@ type AllProps = { const ImageDisplay: React.FunctionComponent<AllProps> = ({ selectedFile }) => { const [url, setUrl] = useState<string>(""); + const containerRef = useRef<HTMLDivElement | null>(null); + const size = useSize(containerRef); // Get the dimensions of the container useEffect(() => { + let objectUrl: string | null = null; + async function constructUrl() { - if (!selectedFile) return; - - // Get the Blob if the file doesn't have a URL - const blob = await selectedFile?.getFileBlob(); - if (blob) { - let type = ""; - const fileType = getFileExtension(selectedFile.data.fname); - if (fileType === "png") { - type = "image/png"; - } - if (fileType === "jpg") { - type = "image/jpg"; + if (!selectedFile) { + setUrl(""); + return; + } + + try { + // Get the Blob if the file doesn't have a URL + const blob = await selectedFile.getFileBlob(); + if (blob) { + let type = ""; + const fileType = getFileExtension( + selectedFile.data.fname, + ).toLowerCase(); + if (fileType === "png") { + type = "image/png"; + } else if (fileType === "jpg" || fileType === "jpeg") { + type = "image/jpeg"; + } else { + // Handle unsupported file types if necessary + console.warn(`Unsupported file type: ${fileType}`); + return; + } + + // Create a Blob URL with the correct MIME type for images + objectUrl = window.URL.createObjectURL(new Blob([blob], { type })); + setUrl(objectUrl); } - // Create a Blob URL with the correct MIME type for images - const objectUrl = window.URL.createObjectURL( - new Blob([blob], { type }), - ); - setUrl(objectUrl); - // Cleanup the object URL to avoid memory leaks - return () => { - URL.revokeObjectURL(objectUrl); - }; + } catch (error) { + console.error("Error constructing image URL:", error); } } constructUrl(); + + // Cleanup the object URL to avoid memory leaks + return () => { + if (objectUrl) { + URL.revokeObjectURL(objectUrl); + } + }; }, [selectedFile]); // Don't render if the URL isn't ready if (!url) return null; + // Calculate image dimensions based on container size + const imageStyles: React.CSSProperties = { + width: size ? `${size.width}px` : "100%", + height: "auto", + objectFit: "scale-down", // Adjust as needed (e.g., 'cover', 'fill') + transition: "width 0.2s, height 0.2s", // Smooth resizing + }; + return ( - <img - id={selectedFile?.data.fname || ""} - src={url} - alt={selectedFile?.data.fname} - onClick={(e) => e.preventDefault()} // Prevent default behavior on click - onKeyDown={(e) => e.preventDefault()} - style={{ maxWidth: "100%", height: "auto" }} // Responsive styling - /> + <div ref={containerRef} style={{ width: "100%", height: "100%" }}> + <img + id={selectedFile?.data.fname || ""} + src={url} + alt={selectedFile?.data.fname} + onClick={(e) => e.preventDefault()} // Prevent default behavior on click + onKeyDown={(e) => e.preventDefault()} + style={imageStyles} // Apply dynamic styles + /> + </div> ); }; From a9165e4bffeb7ed1a19cd41e87524562bcd6f2ea Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 8 Oct 2024 23:10:33 -0400 Subject: [PATCH 288/337] refactor: cleanup --- src/components/Preview/displays/ImageDisplay.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/Preview/displays/ImageDisplay.tsx b/src/components/Preview/displays/ImageDisplay.tsx index 16d5370fb..1a1a82743 100644 --- a/src/components/Preview/displays/ImageDisplay.tsx +++ b/src/components/Preview/displays/ImageDisplay.tsx @@ -33,6 +33,7 @@ const ImageDisplay: React.FunctionComponent<AllProps> = ({ selectedFile }) => { } else if (fileType === "jpg" || fileType === "jpeg") { type = "image/jpeg"; } else { + // use antd notifications here // Handle unsupported file types if necessary console.warn(`Unsupported file type: ${fileType}`); return; @@ -64,8 +65,8 @@ const ImageDisplay: React.FunctionComponent<AllProps> = ({ selectedFile }) => { const imageStyles: React.CSSProperties = { width: size ? `${size.width}px` : "100%", height: "auto", - objectFit: "scale-down", // Adjust as needed (e.g., 'cover', 'fill') - transition: "width 0.2s, height 0.2s", // Smooth resizing + objectFit: "scale-down", + transition: "width 0.2s, height 0.2s", }; return ( From 37f08390794c35bd02cd1256d609c4a53977bd32 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Tue, 8 Oct 2024 23:50:03 -0400 Subject: [PATCH 289/337] Hacky workaround for double firing of pull request --- src/components/Pacs/PacsController.tsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index 705858005..f4ec534d2 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -495,6 +495,8 @@ const PacsController: React.FC<PacsControllerProps> = ({ const onRetrieve = React.useCallback( (service: string, query: PACSqueryCore) => { expandStudiesFor(service, query); + // N.B.: immer bug here + // https://github.com/immerjs/use-immer/issues/139 setPullRequests((draft) => { // indicate that the user requests for something to be retrieved. draft.push({ @@ -594,10 +596,19 @@ const PacsController: React.FC<PacsControllerProps> = ({ updatePullRequestState(service, query, { state: RequestState.REQUESTED }), }); + // FIXME idk why the effect is firing twice... + const badWorkaroundToPreventDuplicatePull = React.useRef< + Set<PacsPullRequestState> + >(new Set()); + React.useEffect(() => { pullRequests .filter(shouldSendPullRequest) - .forEach((pr) => pullFromPacs.mutate(pr)); + .filter((pr) => !badWorkaroundToPreventDuplicatePull.current.has(pr)) + .forEach((pr) => { + badWorkaroundToPreventDuplicatePull.current.add(pr); + pullFromPacs.mutate(pr); + }); }, [pullRequests, shouldSendPullRequest]); // ======================================== From 08e52803dfee98424fb2505d4f7a9c0323591d00 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 10 Oct 2024 10:32:32 -0400 Subject: [PATCH 290/337] Revert "Hacky workaround for double firing of pull request" This reverts commit 37f08390794c35bd02cd1256d609c4a53977bd32. --- src/components/Pacs/PacsController.tsx | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index f4ec534d2..705858005 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -495,8 +495,6 @@ const PacsController: React.FC<PacsControllerProps> = ({ const onRetrieve = React.useCallback( (service: string, query: PACSqueryCore) => { expandStudiesFor(service, query); - // N.B.: immer bug here - // https://github.com/immerjs/use-immer/issues/139 setPullRequests((draft) => { // indicate that the user requests for something to be retrieved. draft.push({ @@ -596,19 +594,10 @@ const PacsController: React.FC<PacsControllerProps> = ({ updatePullRequestState(service, query, { state: RequestState.REQUESTED }), }); - // FIXME idk why the effect is firing twice... - const badWorkaroundToPreventDuplicatePull = React.useRef< - Set<PacsPullRequestState> - >(new Set()); - React.useEffect(() => { pullRequests .filter(shouldSendPullRequest) - .filter((pr) => !badWorkaroundToPreventDuplicatePull.current.has(pr)) - .forEach((pr) => { - badWorkaroundToPreventDuplicatePull.current.add(pr); - pullFromPacs.mutate(pr); - }); + .forEach((pr) => pullFromPacs.mutate(pr)); }, [pullRequests, shouldSendPullRequest]); // ======================================== From ef2cc3adc6d715c755f0ef32aa13ec6befe31bbe Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 10 Oct 2024 10:48:29 -0400 Subject: [PATCH 291/337] Small changes --- src/components/Pacs/PacsController.tsx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index 705858005..9794b6d27 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -528,7 +528,7 @@ const PacsController: React.FC<PacsControllerProps> = ({ ); /** - * All series states. + * All DICOM series states. */ const allSeries = React.useMemo( () => (studies ?? []).flatMap((s) => s.series), @@ -558,21 +558,19 @@ const PacsController: React.FC<PacsControllerProps> = ({ if (pullRequest.state !== RequestState.NOT_REQUESTED) { return false; } - if ( - pullRequest.query.studyInstanceUID && - !("seriesInstanceUID" in pullRequest.query) - ) { - return shouldPullStudy( - pullRequest.service, - pullRequest.query.studyInstanceUID, - ); - } if (pullRequest.query.seriesInstanceUID) { return shouldPullSeries( pullRequest.service, pullRequest.query.seriesInstanceUID, ); } + if (pullRequest.query.studyInstanceUID) { + return shouldPullStudy( + pullRequest.service, + pullRequest.query.studyInstanceUID, + ); + } + return false; }, [shouldPullStudy, shouldPullSeries], From e174158bc68d19139731362b5a2a06cdb9778d7b Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 10 Oct 2024 12:17:56 -0400 Subject: [PATCH 292/337] pnpm run fmt --- src/components/Feeds/Feeds.css | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/components/Feeds/Feeds.css b/src/components/Feeds/Feeds.css index 3eec65139..aabfcb178 100644 --- a/src/components/Feeds/Feeds.css +++ b/src/components/Feeds/Feeds.css @@ -42,20 +42,16 @@ vertical-align: middle !important; } - - .custom-panel { background-color: var(--pf-v5-c-page__main-section--BackgroundColor); border-right: 1px solid var(--pf-global--BorderColor--dark); } - - /* Common styles for both handles */ .ResizeHandle, .ResizeHandleVertical, .ResizeHandleCollapsed { - background-color:#4F5255; /* Default background color */ + background-color: #4f5255; /* Default background color */ transition: background-color 250ms linear; } @@ -80,7 +76,7 @@ .ResizeHandleVertical[data-resize-handle-active], .ResizeHandleCollapsed:hover, .ResizeHandleCollapsed[data-resize-handle-active] { - background-color:#8A8D90 ; /* PatternFly blue */ + background-color: #8a8d90; /* PatternFly blue */ } /* Adjust for touch devices */ @@ -92,6 +88,3 @@ height: 1rem; } } - - - From 8e169bca7930d79b44012f6f9a246cb1da1dd70e Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 10 Oct 2024 12:30:03 -0400 Subject: [PATCH 293/337] Change type of pullRequests from ReadonlyArray to PullRequestStates --- src/components/Pacs/PacsController.tsx | 84 ++++++++++---------------- src/components/Pacs/mergeStates.ts | 31 +++++----- src/components/Pacs/types.ts | 19 +++++- 3 files changed, 64 insertions(+), 70 deletions(-) diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index 9794b6d27..0005efe5a 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -18,16 +18,18 @@ import { useQueries, useQuery, } from "@tanstack/react-query"; -import { mergeStates, createCubeSeriesQueryUidMap } from "./mergeStates.ts"; +import { createCubeSeriesQueryUidMap, mergeStates } from "./mergeStates.ts"; import { DEFAULT_RECEIVE_STATE, IPacsState, PacsPullRequestState, + PullRequestStates, ReceiveState, RequestState, SeriesNotRegisteredError, SeriesPullState, SeriesReceiveState, + SpecificDicomQuery, StudyKey, } from "./types.ts"; import { DEFAULT_PREFERENCES } from "./defaultPreferences.ts"; @@ -125,37 +127,24 @@ const PacsController: React.FC<PacsControllerProps> = ({ /** * List of PACS queries which the user wants to pull. */ - const [pullRequests, setPullRequests] = useImmer< - ReadonlyArray<PacsPullRequestState> - >([]); + const [pullRequests, setPullRequests] = useImmer<PullRequestStates>( + new Map(), + ); /** * Update the state of a pull request. */ const updatePullRequestState = React.useCallback( - ( - service: string, - query: PACSqueryCore, - delta: Partial<Omit<PacsPullRequestState, "service" | "query">>, - ) => + (query: SpecificDicomQuery, delta: Partial<PacsPullRequestState>) => setPullRequests((draft) => { - const i = draft.findLastIndex( - (pr) => - pr.service === service && - (pr.query.studyInstanceUID - ? pr.query.studyInstanceUID === query.studyInstanceUID - : true) && - (pr.query.seriesInstanceUID - ? pr.query.seriesInstanceUID === query.seriesInstanceUID - : true), - ); - if (i === -1) { + const prev = draft.get(query); + if (!prev) { throw new Error( "pullFromPacs mutation called on unknown pull request: " + `service=${service}, query=${JSON.stringify(query)}`, ); } - draft[i] = { ...draft[i], ...delta }; + draft.set(query, { ...prev, ...delta }); }), [setPullRequests], ); @@ -496,12 +485,9 @@ const PacsController: React.FC<PacsControllerProps> = ({ (service: string, query: PACSqueryCore) => { expandStudiesFor(service, query); setPullRequests((draft) => { + const key = { service, query }; // indicate that the user requests for something to be retrieved. - draft.push({ - state: RequestState.NOT_REQUESTED, - query, - service, - }); + draft.set(key, { state: RequestState.NOT_REQUESTED }); }); }, [setPullRequests, expandStudiesFor], @@ -554,23 +540,20 @@ const PacsController: React.FC<PacsControllerProps> = ({ * may be for either a DICOM study or series). */ const shouldSendPullRequest = React.useCallback( - (pullRequest: PacsPullRequestState): boolean => { - if (pullRequest.state !== RequestState.NOT_REQUESTED) { + ({ + service, + query, + state, + }: SpecificDicomQuery & Pick<PacsPullRequestState, "state">): boolean => { + if (state !== RequestState.NOT_REQUESTED) { return false; } - if (pullRequest.query.seriesInstanceUID) { - return shouldPullSeries( - pullRequest.service, - pullRequest.query.seriesInstanceUID, - ); + if (query.seriesInstanceUID) { + return shouldPullSeries(service, query.seriesInstanceUID); } - if (pullRequest.query.studyInstanceUID) { - return shouldPullStudy( - pullRequest.service, - pullRequest.query.studyInstanceUID, - ); + if (query.studyInstanceUID) { + return shouldPullStudy(service, query.studyInstanceUID); } - return false; }, [shouldPullStudy, shouldPullSeries], @@ -580,22 +563,21 @@ const PacsController: React.FC<PacsControllerProps> = ({ * Send request to PFDCM to pull from PACS. */ const pullFromPacs = useMutation({ - mutationFn: ({ service, query }: PacsPullRequestState) => + mutationFn: ({ service, query }: SpecificDicomQuery) => pfdcmClient.retrieve(service, query), - onMutate: ({ service, query }: PacsPullRequestState) => - updatePullRequestState(service, query, { - state: RequestState.REQUESTING, - }), - onError: (error, { service, query }) => - updatePullRequestState(service, query, { error: error }), - onSuccess: (_, { service, query }) => - updatePullRequestState(service, query, { state: RequestState.REQUESTED }), + onMutate: (query: SpecificDicomQuery) => + updatePullRequestState(query, { state: RequestState.REQUESTING }), + onError: (error, query) => updatePullRequestState(query, { error: error }), + onSuccess: (_, query) => + updatePullRequestState(query, { state: RequestState.REQUESTED }), }); React.useEffect(() => { - pullRequests - .filter(shouldSendPullRequest) - .forEach((pr) => pullFromPacs.mutate(pr)); + [...pullRequests.entries()] + .filter(([query, { state }]) => + shouldSendPullRequest({ ...query, state }), + ) + .forEach(([query, _]) => pullFromPacs.mutate(query)); }, [pullRequests, shouldSendPullRequest]); // ======================================== diff --git a/src/components/Pacs/mergeStates.ts b/src/components/Pacs/mergeStates.ts index ddfbef958..237faa4db 100644 --- a/src/components/Pacs/mergeStates.ts +++ b/src/components/Pacs/mergeStates.ts @@ -1,13 +1,14 @@ import { DEFAULT_RECEIVE_STATE, - PacsPullRequestState, PacsStudyState, + PullRequestStates, ReceiveState, RequestState, SeriesKey, SeriesNotRegisteredError, SeriesPullState, SeriesReceiveState, + SpecificDicomQuery, } from "./types.ts"; import { Series, StudyAndSeries } from "../../api/pfdcm/models.ts"; import { useQuery, UseQueryResult } from "@tanstack/react-query"; @@ -28,13 +29,13 @@ type UseQueryResultLike = Partial< * @param cubeQueryMap mapping of `SeriesInstanceUID` to queries for respective * {@link PACSSeries} in CUBE (hint: call * {@link createCubeSeriesQueryUidMap}) - * @param receiveState state of DICOM receive operation conveyed via LONK + * @param receiveStates state of DICOM receive operation conveyed via LONK */ function mergeStates( pfdcm: ReadonlyArray<StudyAndSeries>, - pullRequests: ReadonlyArray<PacsPullRequestState>, + pullRequests: PullRequestStates, cubeQueryMap: Map<string, UseQueryResult<PACSSeries | null, Error>>, - receiveState: ReceiveState, + receiveStates: ReceiveState, ): PacsStudyState[] { return pfdcm.map(({ study, series }) => { return { @@ -43,21 +44,19 @@ function mergeStates( const cubeQueryResult = cubeQueryMap.get(info.SeriesInstanceUID); const cubeError = cubeQueryResult?.error; const cubeErrors = cubeError ? [cubeError.message] : []; - const state = - receiveState.get(info.RetrieveAETitle, info.SeriesInstanceUID) ?? + const rxState = + receiveStates.get(info.RetrieveAETitle, info.SeriesInstanceUID) ?? DEFAULT_RECEIVE_STATE; - const pullRequestsForSeries = pullRequests.findLast((pr) => - isRequestFor(pr, info), + const prEntry = [...pullRequests.entries()].find(([query]) => + isRequestFor(query, info), ); + const prState = prEntry?.[1].state; + return { info, - receivedCount: state.receivedCount, - errors: state.errors.concat(cubeErrors), - pullState: pullStateOf( - state, - pullRequestsForSeries?.state, - cubeQueryResult, - ), + receivedCount: rxState.receivedCount, + errors: rxState.errors.concat(cubeErrors), + pullState: pullStateOf(rxState, prState, cubeQueryResult), inCube: cubeQueryResult?.data || null, }; }), @@ -103,7 +102,7 @@ function isNotRegisteredError(q: UseQueryResultLike): boolean { * @returns `true` if the query matches the series. */ function isRequestFor( - { query, service }: PacsPullRequestState, + { query, service }: SpecificDicomQuery, series: Series, ): boolean { if (service !== series.RetrieveAETitle) { diff --git a/src/components/Pacs/types.ts b/src/components/Pacs/types.ts index 64d54b6c8..b21c9be80 100644 --- a/src/components/Pacs/types.ts +++ b/src/components/Pacs/types.ts @@ -62,15 +62,26 @@ enum RequestState { } /** - * The state of a PACS pull request. + * A {@link PACSqueryCore} for a specified PACS. + */ +type SpecificDicomQuery = { + service: string; + query: PACSqueryCore; +}; + +/** + * The state of a request for a {@link SpecificDicomQuery}. */ type PacsPullRequestState = { state: RequestState; error?: Error; - query: PACSqueryCore; - service: string; }; +/** + * The state of requests to PFDCM to pull DICOM study/series. + */ +type PullRequestStates = Map<SpecificDicomQuery, PacsPullRequestState>; + /** * The state of a DICOM series retrieval. */ @@ -163,5 +174,7 @@ export type { PacsSeriesState, PacsStudyState, PacsPreferences, + SpecificDicomQuery, PacsPullRequestState, + PullRequestStates, }; From f7cf25a0b7eb2fc4f7246d89de2a9de2f57cd563 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 10 Oct 2024 13:45:24 -0400 Subject: [PATCH 294/337] terribleStrictModeWorkaround --- src/components/Pacs/PacsController.tsx | 5 ++++ .../terribleStrictModeWorkaround.test.tsx | 30 +++++++++++++++++++ .../Pacs/terribleStrictModeWorkaround.ts | 21 +++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 src/components/Pacs/terribleStrictModeWorkaround.test.tsx create mode 100644 src/components/Pacs/terribleStrictModeWorkaround.ts diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index 0005efe5a..aeb516735 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -44,6 +44,7 @@ import { sameStudyInstanceUidAs, } from "./curry.ts"; import { Study } from "../../api/pfdcm/models.ts"; +import terribleStrictModeWorkaround from "./terribleStrictModeWorkaround.ts"; type PacsControllerProps = { getPfdcmClient: () => PfdcmClient; @@ -572,8 +573,12 @@ const PacsController: React.FC<PacsControllerProps> = ({ updatePullRequestState(query, { state: RequestState.REQUESTED }), }); + const terribleDoNotCallTwice = + terribleStrictModeWorkaround<[SpecificDicomQuery, PacsPullRequestState]>(); + React.useEffect(() => { [...pullRequests.entries()] + .filter(terribleDoNotCallTwice) .filter(([query, { state }]) => shouldSendPullRequest({ ...query, state }), ) diff --git a/src/components/Pacs/terribleStrictModeWorkaround.test.tsx b/src/components/Pacs/terribleStrictModeWorkaround.test.tsx new file mode 100644 index 000000000..52891544c --- /dev/null +++ b/src/components/Pacs/terribleStrictModeWorkaround.test.tsx @@ -0,0 +1,30 @@ +import { test, expect, vi } from "vitest"; +import React from "react"; +import terribleStrictModeWorkaround from "./terribleStrictModeWorkaround.ts"; +import { render, screen } from "@testing-library/react"; + +type ExampleProps<T> = { + obj: T; + callback: (calledBefore: boolean) => void; +}; + +const ExampleComponent = <T,>({ obj, callback }: ExampleProps<T>) => { + const workaroundFn = terribleStrictModeWorkaround<T>(); + const [state, setState] = React.useState<ReadonlyArray<T>>([]); + React.useEffect(() => { + state.forEach((s) => callback(workaroundFn(s))); + }, [state]); + return <button onClick={() => setState([obj])}>click me</button>; +}; + +test("terribleStrictModeWorkaround", async () => { + const callback = vi.fn(); + render(<ExampleComponent obj={{}} callback={callback} />); + expect(callback).not.toHaveBeenCalled(); + screen.getByText("click me").click(); + await expect.poll(() => callback).toHaveBeenCalledOnce(); + expect(callback).toHaveBeenLastCalledWith(true); + screen.getByText("click me").click(); + await expect.poll(() => callback).toHaveBeenCalledTimes(2); + expect(callback).toHaveBeenLastCalledWith(false); +}); diff --git a/src/components/Pacs/terribleStrictModeWorkaround.ts b/src/components/Pacs/terribleStrictModeWorkaround.ts new file mode 100644 index 000000000..4f43f74d3 --- /dev/null +++ b/src/components/Pacs/terribleStrictModeWorkaround.ts @@ -0,0 +1,21 @@ +import React from "react"; + +/** + * A wrapper around {@link React.useRef} to detect when something is called + * more than once. Useful as a workaround to how {@link React.StrictMode} + * makes effects run twice. + * + * @returns an impure predicate, returning `true` the first time `x` is given, + * and `false` for every subsequent call on the same `x`. + */ +export default function terribleStrictModeWorkaround<T>(): (x: T) => boolean { + const set = React.useRef(new Set()); + return React.useCallback( + (x) => { + const has = set.current.has(x); + set.current.add(x); + return !has; + }, + [set.current], + ); +} From 5e8505e2ba1a185bedd39695930f05912bd24604 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 10 Oct 2024 14:49:31 -0400 Subject: [PATCH 295/337] Fix all lints Note: lint/complexity/noUselessFragments is disabled because of https://github.com/biomejs/biome/issues/4247 Also follow https://github.com/biomejs/biome/issues/4248 --- biome.json | 6 ++- src/components/Pacs/PacsController.tsx | 48 ++++++++++--------- src/components/Pacs/PacsView.tsx | 12 ++--- .../Pacs/components/ErrorScreen.tsx | 4 +- src/components/Pacs/components/PacsInput.tsx | 4 +- .../Pacs/components/PacsStudiesView.tsx | 12 ++--- src/components/Pacs/components/SeriesList.tsx | 9 ++-- .../Pacs/components/StudyButtons.tsx | 4 +- src/components/Pacs/components/StudyCard.tsx | 8 ++-- .../Pacs/components/StudyDetails.tsx | 4 +- .../Pacs/components/helpers.test.ts | 2 +- src/components/Pacs/components/helpers.ts | 6 +-- src/components/Pacs/curry.ts | 4 +- src/components/Pacs/defaultPreferences.ts | 2 +- src/components/Pacs/helpers.test.ts | 7 ++- src/components/Pacs/helpers.ts | 4 +- src/components/Pacs/mergeStates.test.ts | 6 +-- src/components/Pacs/mergeStates.ts | 20 ++++---- .../terribleStrictModeWorkaround.test.tsx | 8 +++- .../Pacs/terribleStrictModeWorkaround.ts | 13 ++--- src/components/Pacs/types.ts | 14 +++--- 21 files changed, 103 insertions(+), 94 deletions(-) diff --git a/biome.json b/biome.json index c9fa1e2e0..61ad6df07 100644 --- a/biome.json +++ b/biome.json @@ -25,10 +25,12 @@ "rules": { "recommended": true, "style": { - "noNonNullAssertion": "off" + "noNonNullAssertion": "off", + "useTemplate": "off" }, "complexity": { - "noForEach": "off" + "noForEach": "off", + "noUselessFragments": "off" }, "correctness": { "useExhaustiveDependencies": "warn" diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index aeb516735..f7862bb36 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -5,8 +5,9 @@ */ import React from "react"; -import { PACSqueryCore, PfdcmClient } from "../../api/pfdcm"; -import Client, { PACSSeries } from "@fnndsc/chrisapi"; +import type { PACSqueryCore, PfdcmClient } from "../../api/pfdcm"; +import type Client from "@fnndsc/chrisapi"; +import type { PACSSeries } from "@fnndsc/chrisapi"; import { App } from "antd"; import { PageSection } from "@patternfly/react-core"; import PacsView from "./PacsView.tsx"; @@ -21,29 +22,29 @@ import { import { createCubeSeriesQueryUidMap, mergeStates } from "./mergeStates.ts"; import { DEFAULT_RECEIVE_STATE, - IPacsState, - PacsPullRequestState, - PullRequestStates, - ReceiveState, + type IPacsState, + type PacsPullRequestState, + type PullRequestStates, + type ReceiveState, RequestState, SeriesNotRegisteredError, SeriesPullState, - SeriesReceiveState, - SpecificDicomQuery, - StudyKey, + type SeriesReceiveState, + type SpecificDicomQuery, + type StudyKey, } from "./types.ts"; import { DEFAULT_PREFERENCES } from "./defaultPreferences.ts"; import { toStudyKey, zipPacsNameAndSeriesUids } from "./helpers.ts"; import { useImmer } from "use-immer"; import SeriesMap from "../../api/lonk/seriesMap.ts"; import { useLonk } from "../../api/lonk"; -import { produce, WritableDraft } from "immer"; +import { produce, type WritableDraft } from "immer"; import { isFromPacs, sameSeriesInstanceUidAs, sameStudyInstanceUidAs, } from "./curry.ts"; -import { Study } from "../../api/pfdcm/models.ts"; +import type { Study } from "../../api/pfdcm/models.ts"; import terribleStrictModeWorkaround from "./terribleStrictModeWorkaround.ts"; type PacsControllerProps = { @@ -104,7 +105,9 @@ const PacsController: React.FC<PacsControllerProps> = ({ const { message } = App.useApp(); + // biome-ignore lint/correctness/useExhaustiveDependencies: https://github.com/biomejs/biome/issues/4248 const pfdcmClient = React.useMemo(getPfdcmClient, [getPfdcmClient]); + // biome-ignore lint/correctness/useExhaustiveDependencies: https://github.com/biomejs/biome/issues/4248 const chrisClient = React.useMemo(getChrisClient, [getChrisClient]); // ======================================== @@ -315,7 +318,7 @@ const PacsController: React.FC<PacsControllerProps> = ({ retry: 300, retryDelay: 2000, // TODO use environment variable })), - [receiveState], + [receiveState, chrisClient.getPACSSeriesList], ), }); @@ -357,13 +360,7 @@ const PacsController: React.FC<PacsControllerProps> = ({ allCubeSeriesQueryMap, receiveState, ); - }, [ - mergeStates, - pfdcmStudies.data, - pullRequests, - allCubeSeriesQueryMap, - receiveState, - ]); + }, [pfdcmStudies.data, pullRequests, allCubeSeriesQueryMap, receiveState]); /** * Entire state of the Pacs Q/R application. @@ -475,7 +472,7 @@ const PacsController: React.FC<PacsControllerProps> = ({ (service: string, query: PACSqueryCore) => { setPacsQuery({ service, query }); }, - [setPacsQuery], + [], ); // ======================================== @@ -509,7 +506,7 @@ const PacsController: React.FC<PacsControllerProps> = ({ .findIndex( ({ pullState }) => pullState === SeriesPullState.NOT_CHECKED || - pullState == SeriesPullState.CHECKING, + pullState === SeriesPullState.CHECKING, ) === -1, [studies], ); @@ -583,7 +580,12 @@ const PacsController: React.FC<PacsControllerProps> = ({ shouldSendPullRequest({ ...query, state }), ) .forEach(([query, _]) => pullFromPacs.mutate(query)); - }, [pullRequests, shouldSendPullRequest]); + }, [ + pullRequests, + shouldSendPullRequest, + pullFromPacs.mutate, + terribleDoNotCallTwice, + ]); // ======================================== // EFFECTS @@ -611,7 +613,7 @@ const PacsController: React.FC<PacsControllerProps> = ({ } // Note: we are subscribing to series, but never unsubscribing. // This is mostly harmless. - }, [expandedSeries]); + }, [lonk.subscribe, expandedSeries, updateReceiveState]); // ======================================== // RENDER diff --git a/src/components/Pacs/PacsView.tsx b/src/components/Pacs/PacsView.tsx index 046f8f1c1..79b9bf78a 100644 --- a/src/components/Pacs/PacsView.tsx +++ b/src/components/Pacs/PacsView.tsx @@ -1,13 +1,13 @@ import React from "react"; -import PacsInput, { PacsInputProps } from "./components/PacsInput.tsx"; +import PacsInput, { type PacsInputProps } from "./components/PacsInput.tsx"; import PacsStudiesView, { - PacsStudiesViewProps, + type PacsStudiesViewProps, } from "./components/PacsStudiesView.tsx"; import { getDefaultPacsService } from "./components/helpers.ts"; import { useSearchParams } from "react-router-dom"; -import { PACSqueryCore } from "../../api/pfdcm"; +import type { PACSqueryCore } from "../../api/pfdcm"; import { Empty, Flex, Spin } from "antd"; -import { IPacsState } from "./types.ts"; +import type { IPacsState } from "./types.ts"; type PacsViewProps = Pick<PacsInputProps, "services" | "onSubmit"> & Pick<PacsStudiesViewProps, "expandedStudyUids"> & { @@ -49,13 +49,13 @@ const PacsView: React.FC<PacsViewProps> = ({ const curriedOnRetrieve = React.useCallback( (query: PACSqueryCore) => onRetrieve(service, query), - [onRetrieve], + [onRetrieve, service], ); const curriedOnStudyExpand = React.useCallback( (StudyInstanceUIDS: ReadonlyArray<string>) => onStudyExpand(service, StudyInstanceUIDS), - [onStudyExpand], + [onStudyExpand, service], ); return ( diff --git a/src/components/Pacs/components/ErrorScreen.tsx b/src/components/Pacs/components/ErrorScreen.tsx index c69d06171..f46929ee3 100644 --- a/src/components/Pacs/components/ErrorScreen.tsx +++ b/src/components/Pacs/components/ErrorScreen.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import type React from "react"; import { EmptyState, EmptyStateBody, @@ -10,7 +10,7 @@ import { } from "@patternfly/react-core"; import { ExclamationCircleIcon } from "../../Icons"; -const ErrorScreen: React.FC<React.PropsWithChildren<{}>> = ({ children }) => ( +const ErrorScreen: React.FC<React.PropsWithChildren> = ({ children }) => ( <EmptyState> <EmptyStateHeader titleText="PACS Connection Error" diff --git a/src/components/Pacs/components/PacsInput.tsx b/src/components/Pacs/components/PacsInput.tsx index dec5be300..f1f3a1517 100644 --- a/src/components/Pacs/components/PacsInput.tsx +++ b/src/components/Pacs/components/PacsInput.tsx @@ -1,9 +1,9 @@ import React from "react"; -import { PACSqueryCore } from "../../../api/pfdcm"; +import type { PACSqueryCore } from "../../../api/pfdcm"; import { Select, Input, Row, Col, Grid, Segmented } from "antd"; import { useSearchParams } from "react-router-dom"; import { useBooleanSearchParam } from "./helpers.ts"; -import { ReadonlyNonEmptyArray } from "fp-ts/ReadonlyNonEmptyArray"; +import type { ReadonlyNonEmptyArray } from "fp-ts/ReadonlyNonEmptyArray"; type InputFieldProps = { onSubmit: (query: PACSqueryCore) => void; diff --git a/src/components/Pacs/components/PacsStudiesView.tsx b/src/components/Pacs/components/PacsStudiesView.tsx index b4ba3bace..4e7c8bc88 100644 --- a/src/components/Pacs/components/PacsStudiesView.tsx +++ b/src/components/Pacs/components/PacsStudiesView.tsx @@ -1,7 +1,7 @@ -import { PacsPreferences, PacsStudyState } from "../types.ts"; -import { PACSqueryCore } from "../../../api/pfdcm"; +import type { PacsPreferences, PacsStudyState } from "../types.ts"; +import type { PACSqueryCore } from "../../../api/pfdcm"; import StudyCard from "./StudyCard.tsx"; -import { Collapse, CollapseProps, Space, Typography } from "antd"; +import { Collapse, type CollapseProps, Space, Typography } from "antd"; import React from "react"; import SeriesList from "./SeriesList.tsx"; import { isSeriesLoading } from "./helpers.ts"; @@ -45,7 +45,7 @@ const PacsStudiesView: React.FC<PacsStudiesViewProps> = ({ studyInstanceUID: info.StudyInstanceUID, }) } - ></StudyCard> + /> ), children: ( <SeriesList @@ -61,7 +61,7 @@ const PacsStudiesView: React.FC<PacsStudiesViewProps> = ({ ), }; }); - }, [studies]); + }, [studies, onRetrieve, preferences.showUid]); const numPatients = React.useMemo(() => { return studies .map((study) => study.info.PatientID) @@ -71,7 +71,7 @@ const PacsStudiesView: React.FC<PacsStudiesViewProps> = ({ ).length; }, [studies]); const onChange = React.useCallback( - (studyUids: string[]) => onStudyExpand && onStudyExpand(studyUids), + (studyUids: string[]) => onStudyExpand?.(studyUids), [onStudyExpand], ); return ( diff --git a/src/components/Pacs/components/SeriesList.tsx b/src/components/Pacs/components/SeriesList.tsx index 61d741950..476c80c9e 100644 --- a/src/components/Pacs/components/SeriesList.tsx +++ b/src/components/Pacs/components/SeriesList.tsx @@ -1,6 +1,6 @@ import { Button, - ButtonProps, + type ButtonProps, Descriptions, Flex, Grid, @@ -9,7 +9,7 @@ import { Tooltip, Typography, } from "antd"; -import { PacsSeriesState, SeriesPullState } from "../types.ts"; +import { type PacsSeriesState, SeriesPullState } from "../types.ts"; import ModalityBadges from "./ModalityBadges.tsx"; import { ImportOutlined, WarningFilled } from "@ant-design/icons"; import styles from "./SeriesList.module.css"; @@ -89,7 +89,8 @@ const SeriesRow: React.FC<SeriesRowProps> = ({ return 99; } return ( - (99 * receivedCount) / (info.NumberOfSeriesRelatedInstances || Infinity) + (99 * receivedCount) / + (info.NumberOfSeriesRelatedInstances || Number.POSITIVE_INFINITY) ); }, [inCube, pullState, receivedCount, info.NumberOfSeriesRelatedInstances]); @@ -169,7 +170,7 @@ const SeriesList: React.FC<SeriesListProps> = ({ <List.Item> <SeriesRow showUid={showUid} - onRetrieve={() => onRetrieve && onRetrieve(s)} + onRetrieve={() => onRetrieve?.(s)} {...s} /> </List.Item> diff --git a/src/components/Pacs/components/StudyButtons.tsx b/src/components/Pacs/components/StudyButtons.tsx index 91d4500d7..03c9efda0 100644 --- a/src/components/Pacs/components/StudyButtons.tsx +++ b/src/components/Pacs/components/StudyButtons.tsx @@ -1,4 +1,4 @@ -import { Flex, Button, Tooltip, TooltipProps } from "antd"; +import { Flex, Button, Tooltip, type TooltipProps } from "antd"; import { AppstoreOutlined, ImportOutlined } from "@ant-design/icons"; type StudyButtonsProps = { @@ -41,7 +41,7 @@ const StudyButtons: React.FC<StudyButtonsProps> = ({ disabled={isPulled} onClick={(event) => { event.stopPropagation(); - onRetrieve && onRetrieve(); + onRetrieve?.(); }} > {isLoading || <ImportOutlined />} diff --git a/src/components/Pacs/components/StudyCard.tsx b/src/components/Pacs/components/StudyCard.tsx index e18fb518b..2e94afd8c 100644 --- a/src/components/Pacs/components/StudyCard.tsx +++ b/src/components/Pacs/components/StudyCard.tsx @@ -1,9 +1,9 @@ -import { Study } from "../../../api/pfdcm/models.ts"; -import React from "react"; +import type { Study } from "../../../api/pfdcm/models.ts"; +import type React from "react"; import { Row, Col } from "antd"; import StudyDetails from "./StudyDetails.tsx"; import StudyButtons from "./StudyButtons.tsx"; -import { PacsPreferences } from "../types.ts"; +import type { PacsPreferences } from "../types.ts"; import { DEFAULT_PREFERENCES } from "../defaultPreferences.ts"; type StudyCardProps = { @@ -37,7 +37,7 @@ const StudyCard: React.FC<StudyCardProps> = ({ `${ohifUrl}viewer?StudyInstanceUIDs=${study.StudyInstanceUID}` } onRetrieve={onRetrieve} - ></StudyButtons> + /> </Col> </Row> ); diff --git a/src/components/Pacs/components/StudyDetails.tsx b/src/components/Pacs/components/StudyDetails.tsx index e0dc62383..637e0d028 100644 --- a/src/components/Pacs/components/StudyDetails.tsx +++ b/src/components/Pacs/components/StudyDetails.tsx @@ -1,8 +1,8 @@ import { format } from "date-fns"; import { Descriptions } from "antd"; import ModalityBadges from "./ModalityBadges.tsx"; -import React from "react"; -import { Study } from "../../../api/pfdcm/models.ts"; +import type React from "react"; +import type { Study } from "../../../api/pfdcm/models.ts"; const StudyDetails: React.FC<{ study: Study; diff --git a/src/components/Pacs/components/helpers.test.ts b/src/components/Pacs/components/helpers.test.ts index 5d8aa91e5..7e4699370 100644 --- a/src/components/Pacs/components/helpers.test.ts +++ b/src/components/Pacs/components/helpers.test.ts @@ -1,5 +1,5 @@ import { describe, it, vi, expect } from "vitest"; -import { createSearchParams, URLSearchParamsInit } from "react-router-dom"; +import { createSearchParams, type URLSearchParamsInit } from "react-router-dom"; import { useBooleanSearchParam } from "./helpers.ts"; describe("useBooleanSearchParam", () => { diff --git a/src/components/Pacs/components/helpers.ts b/src/components/Pacs/components/helpers.ts index 898da7695..261d6fd82 100644 --- a/src/components/Pacs/components/helpers.ts +++ b/src/components/Pacs/components/helpers.ts @@ -1,9 +1,9 @@ -import { useSearchParams } from "react-router-dom"; +import type { useSearchParams } from "react-router-dom"; import { - ReadonlyNonEmptyArray, + type ReadonlyNonEmptyArray, extract as extractFromNonEmpty, } from "fp-ts/ReadonlyNonEmptyArray"; -import { PacsSeriesState, SeriesPullState } from "../types.ts"; +import { type PacsSeriesState, SeriesPullState } from "../types.ts"; /** * Adapt {@link useSearchParams} to work like `React.useState<boolean>(false)` diff --git a/src/components/Pacs/curry.ts b/src/components/Pacs/curry.ts index 2246c1ee3..26a0ce8c0 100644 --- a/src/components/Pacs/curry.ts +++ b/src/components/Pacs/curry.ts @@ -2,8 +2,8 @@ * Some trivial curried functions for making array map/filter code more legible. */ -import { Series, Study } from "../../api/pfdcm/models.ts"; -import { PACSqueryCore } from "../../api/pfdcm"; +import type { Series, Study } from "../../api/pfdcm/models.ts"; +import type { PACSqueryCore } from "../../api/pfdcm"; function isFromPacs( pacs_name: string, diff --git a/src/components/Pacs/defaultPreferences.ts b/src/components/Pacs/defaultPreferences.ts index 0af96189e..b07dc2abc 100644 --- a/src/components/Pacs/defaultPreferences.ts +++ b/src/components/Pacs/defaultPreferences.ts @@ -1,4 +1,4 @@ -import { PacsPreferences } from "./types.ts"; +import type { PacsPreferences } from "./types.ts"; const DEFAULT_PREFERENCES: PacsPreferences = { showUid: false, diff --git a/src/components/Pacs/helpers.test.ts b/src/components/Pacs/helpers.test.ts index 2728d60e8..fd175cb42 100644 --- a/src/components/Pacs/helpers.test.ts +++ b/src/components/Pacs/helpers.test.ts @@ -1,6 +1,9 @@ import { test, expect } from "vitest"; -import { StudyAndSeriesUidOnly, zipPacsNameAndSeriesUids } from "./helpers.ts"; -import { SeriesKey, StudyKey } from "./types.ts"; +import { + type StudyAndSeriesUidOnly, + zipPacsNameAndSeriesUids, +} from "./helpers.ts"; +import type { SeriesKey, StudyKey } from "./types.ts"; test.each(< [ diff --git a/src/components/Pacs/helpers.ts b/src/components/Pacs/helpers.ts index 91915f268..27b81a7d6 100644 --- a/src/components/Pacs/helpers.ts +++ b/src/components/Pacs/helpers.ts @@ -1,5 +1,5 @@ -import { SeriesKey, StudyKey } from "./types.ts"; -import { Study, StudyAndSeries } from "../../api/pfdcm/models.ts"; +import type { SeriesKey, StudyKey } from "./types.ts"; +import { type Study, StudyAndSeries } from "../../api/pfdcm/models.ts"; /** * A type subset of {@link StudyAndSeries}. diff --git a/src/components/Pacs/mergeStates.test.ts b/src/components/Pacs/mergeStates.test.ts index c07afa1a9..0928fccbd 100644 --- a/src/components/Pacs/mergeStates.test.ts +++ b/src/components/Pacs/mergeStates.test.ts @@ -2,15 +2,15 @@ import { expect, test } from "vitest"; import { createCubeSeriesQueryUidMap, pullStateOf, - UseQueryResultLike, + type UseQueryResultLike, } from "./mergeStates.ts"; import { DEFAULT_RECEIVE_STATE, RequestState, - SeriesKey, + type SeriesKey, SeriesNotRegisteredError, SeriesPullState, - SeriesReceiveState, + type SeriesReceiveState, } from "./types.ts"; test.each(< diff --git a/src/components/Pacs/mergeStates.ts b/src/components/Pacs/mergeStates.ts index 237faa4db..3307911ff 100644 --- a/src/components/Pacs/mergeStates.ts +++ b/src/components/Pacs/mergeStates.ts @@ -1,18 +1,18 @@ import { DEFAULT_RECEIVE_STATE, - PacsStudyState, - PullRequestStates, - ReceiveState, - RequestState, - SeriesKey, + type PacsStudyState, + type PullRequestStates, + type ReceiveState, + type RequestState, + type SeriesKey, SeriesNotRegisteredError, SeriesPullState, - SeriesReceiveState, - SpecificDicomQuery, + type SeriesReceiveState, + type SpecificDicomQuery, } from "./types.ts"; -import { Series, StudyAndSeries } from "../../api/pfdcm/models.ts"; -import { useQuery, UseQueryResult } from "@tanstack/react-query"; -import { PACSSeries } from "@fnndsc/chrisapi"; +import type { Series, StudyAndSeries } from "../../api/pfdcm/models.ts"; +import { useQuery, type UseQueryResult } from "@tanstack/react-query"; +import type { PACSSeries } from "@fnndsc/chrisapi"; type UseQueryResultLike = Partial< Pick<UseQueryResult, "isError" | "isPending" | "error"> diff --git a/src/components/Pacs/terribleStrictModeWorkaround.test.tsx b/src/components/Pacs/terribleStrictModeWorkaround.test.tsx index 52891544c..6ce2838b1 100644 --- a/src/components/Pacs/terribleStrictModeWorkaround.test.tsx +++ b/src/components/Pacs/terribleStrictModeWorkaround.test.tsx @@ -13,8 +13,12 @@ const ExampleComponent = <T,>({ obj, callback }: ExampleProps<T>) => { const [state, setState] = React.useState<ReadonlyArray<T>>([]); React.useEffect(() => { state.forEach((s) => callback(workaroundFn(s))); - }, [state]); - return <button onClick={() => setState([obj])}>click me</button>; + }, [state, callback, workaroundFn]); + return ( + <button type="button" onClick={() => setState([obj])}> + click me + </button> + ); }; test("terribleStrictModeWorkaround", async () => { diff --git a/src/components/Pacs/terribleStrictModeWorkaround.ts b/src/components/Pacs/terribleStrictModeWorkaround.ts index 4f43f74d3..113c4f6f0 100644 --- a/src/components/Pacs/terribleStrictModeWorkaround.ts +++ b/src/components/Pacs/terribleStrictModeWorkaround.ts @@ -10,12 +10,9 @@ import React from "react"; */ export default function terribleStrictModeWorkaround<T>(): (x: T) => boolean { const set = React.useRef(new Set()); - return React.useCallback( - (x) => { - const has = set.current.has(x); - set.current.add(x); - return !has; - }, - [set.current], - ); + return React.useCallback((x) => { + const has = set.current.has(x); + set.current.add(x); + return !has; + }, []); } diff --git a/src/components/Pacs/types.ts b/src/components/Pacs/types.ts index b21c9be80..82d2fa32d 100644 --- a/src/components/Pacs/types.ts +++ b/src/components/Pacs/types.ts @@ -1,7 +1,7 @@ -import { Series, Study } from "../../api/pfdcm/models.ts"; -import { PACSSeries } from "@fnndsc/chrisapi"; -import SeriesMap from "../../api/lonk/seriesMap.ts"; -import { PACSqueryCore } from "../../api/pfdcm"; +import type { Series, Study } from "../../api/pfdcm/models.ts"; +import type { PACSSeries } from "@fnndsc/chrisapi"; +import type SeriesMap from "../../api/lonk/seriesMap.ts"; +import type { PACSqueryCore } from "../../api/pfdcm"; type StudyKey = { pacs_name: string; @@ -56,9 +56,9 @@ enum SeriesPullState { * The states a request can be in. */ enum RequestState { - NOT_REQUESTED, - REQUESTING, - REQUESTED, + NOT_REQUESTED = 0, + REQUESTING = 1, + REQUESTED = 2, } /** From 11c4b2cfee627ad5faadd466be34ae15bfbc7cf5 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 10 Oct 2024 14:54:19 -0400 Subject: [PATCH 296/337] feat: Improve accessibility --- src/api/common.ts | 333 +++++++-------- src/api/model.ts | 167 ++++---- src/components/FeedTree/FeedGraph.tsx | 19 +- src/components/FeedTree/FeedTree.tsx | 396 +++++++++--------- src/components/FeedTree/Link.tsx | 30 +- src/components/FeedTree/Node.tsx | 19 +- src/components/Feeds/FeedListView.tsx | 23 +- .../NewLibrary/components/ContextMenu.tsx | 1 + 8 files changed, 488 insertions(+), 500 deletions(-) diff --git a/src/api/common.ts b/src/api/common.ts index 23b12c289..561dc2cd3 100644 --- a/src/api/common.ts +++ b/src/api/common.ts @@ -1,4 +1,3 @@ -import React from "react"; import axios, { type AxiosProgressEvent } from "axios"; import ChrisAPIClient from "./chrisapiclient"; import type { @@ -17,128 +16,13 @@ export function elipses(str: string, len: number) { return `${str.slice(0, len - 3)}...`; } -export function useSafeDispatch(dispatch: any) { - const mounted = React.useRef(false); - React.useLayoutEffect(() => { - mounted.current = true; - return () => { - mounted.current = false; - }; - }, []); - return React.useCallback( - (...args: any[]) => (mounted.current ? dispatch(...args) : void 0), - [dispatch], - ); -} - -const defaultInitialState = { - status: "idle", - data: null, - error: null, -}; - -function useAsync(initialState?: any) { - const initialStateRef = React.useRef({ - ...defaultInitialState, - initialState, - }); - - const [{ status, data, error }, setState] = React.useReducer( - (s: any, a: any) => ({ ...s, ...a }), - initialStateRef.current, - ); - - const safeSetState = useSafeDispatch(setState); - const setData = React.useCallback( - (data: any) => safeSetState({ data, status: "resolved" }), - [safeSetState], - ); - const setError = React.useCallback( - (error: any) => safeSetState({ error, status: "rejected" }), - [safeSetState], - ); - const reset = React.useCallback( - () => safeSetState(initialStateRef.current), - [safeSetState], - ); - - const run = React.useCallback( - (promise: any) => { - if (!promise || !promise.then) { - throw new Error( - "The argument passed to useAsync().run must be a promise", - ); - } - safeSetState({ status: "pending" }); - return promise.then( - (data: any) => { - setData(data); - return data; - }, - (error: any) => { - setError(error); - return Promise.reject(error); - }, - ); - }, - [safeSetState, setData, setError], - ); - - return { - isIdle: status === "idle", - isLoading: status === "pending", - isError: status === "rejected", - isSuccess: status === "resolved", - - setData, - setError, - error, - status, - data, - run, - reset, - }; -} - -async function fetchResource<T>( - params: { - limit: number; - offset: number; - fname_icontains?: string; - fname_nslashes?: string; - }, - fn: any, -) { - try { - let resourceList = await fn(params); - let resource: T[] = []; - if (resourceList.getItems()) { - resource = resourceList.getItems() as T[]; - } - while (resourceList.hasNextPage) { - params.offset += params.limit; - resourceList = await fn(params); - if (resourceList.getItems()) { - resource.push(...(resourceList.getItems() as T[])); - } - } - - return { - resource, - totalCount: resourceList.totalCount as number, - }; - } catch (error) { - if (error instanceof Error) { - throw new Error(error.message); - } - throw new Error( - "Unhandled error. Please reach out to @devbabymri.org to report this error", - ); - } +interface FetchParams { + limit: number; + offset: number; + fname_icontains?: string; + fname_nslashes?: string; } -export { useAsync, fetchResource }; - export interface TreeType { id: number; plugin_id: number; @@ -156,39 +40,52 @@ export interface TreeNode { plugin_version: string; } -export const getFeedTree = (items: any[]) => { - const tree = []; - const mappedArr: { [key: string]: TreeNode } = {}; +export const getFeedTree = (items: any[]): TreeNode[] => { + const tree: TreeNode[] = []; + const mappedArr = new Map<number, TreeNode>(); + const childrenMap = new Map<number, TreeNode[]>(); items.forEach((item) => { - const id = item.data.id; - if (!mappedArr[id]) { - mappedArr[id] = { - id: id, - plugin_id: item.data.plugin_id, - pipeline_id: item.data.pipeline_id, - previous_id: item.data.previous_id && item.data.previous_id, - title: item.data.title, - plugin_name: item.data.plugin_name, - plugin_version: item.data.plugin_version, - children: [], - }; - } - }); + const id: number = item.data.id; + const previous_id: number | null = + item.data.previous_id !== undefined ? item.data.previous_id : null; + + const node: TreeNode = { + id, + plugin_id: item.data.plugin_id, + pipeline_id: item.data.pipeline_id, + previous_id, + title: item.data.title, + plugin_name: item.data.plugin_name, + plugin_version: item.data.plugin_version, + children: [], + }; - for (const id in mappedArr) { - if (Object.prototype.hasOwnProperty.call(mappedArr, id)) { - const mappedElem = mappedArr[id]; - if (mappedElem.previous_id) { - const parentId = mappedElem.previous_id; - if (parentId && mappedArr[parentId] && mappedArr[parentId].children) { - mappedArr[parentId].children.push(mappedElem); - } + mappedArr.set(id, node); + + if (previous_id !== null) { + const parentNode = mappedArr.get(previous_id); + if (parentNode) { + parentNode.children.push(node); } else { - tree.push(mappedElem); + // If parent hasn't been processed yet, store the child in childrenMap + if (!childrenMap.has(previous_id)) { + childrenMap.set(previous_id, []); + } + childrenMap.get(previous_id)!.push(node); } + } else { + tree.push(node); } - } + + // If there are children waiting for this node, add them + if (childrenMap.has(id)) { + const children = childrenMap.get(id)!; + node.children.push(...children); + childrenMap.delete(id); + } + }); + return tree; }; @@ -223,39 +120,94 @@ export const fetchPipelines = async ( } }; -export async function fetchResources(pipelineInstance: Pipeline) { - const params = { - limit: 100, - offset: 0, - }; +interface ResourceList<T> { + getItems(): T[] | null; + hasNextPage: boolean; + totalCount: number; +} - const pipelinePluginsFn = pipelineInstance.getPlugins; - const pipelineFn = pipelineInstance.getPluginPipings; - const boundPipelinePluginFn = pipelinePluginsFn.bind(pipelineInstance); - const boundPipelineFn = pipelineFn.bind(pipelineInstance); - const { resource: pluginPipings } = await fetchResource<PluginPiping>( - params, - boundPipelineFn, - ); +interface FetchResourceResult<T> { + resource: T[]; + totalCount: number; +} + +type FetchFunction<T> = (params: FetchParams) => Promise<ResourceList<T>>; +export const fetchResource = async <T>( + params: FetchParams, + fn: FetchFunction<T>, +): Promise<FetchResourceResult<T>> => { try { - const { resource: pipelinePlugins }: { resource: Plugin[] } = - await fetchResource(params, boundPipelinePluginFn); - const parameters: PipelinePipingDefaultParameterList = - await pipelineInstance.getDefaultParameters({ - limit: 1000, - }); + let resourceList = await fn(params); + let resource: T[] = []; + + const items = resourceList.getItems(); + if (items) { + resource = [...items]; + } + + while (resourceList.hasNextPage) { + params.offset += params.limit; + resourceList = await fn(params); + const newItems = resourceList.getItems(); + if (newItems) { + resource.push(...newItems); + } + } + + return { + resource, + totalCount: resourceList.totalCount, + }; + } catch (error) { + const error_message = catchError(error).error_message; + if (error_message) { + throw new Error(error_message); + } + + throw new Error( + "Unhandled error. Please reach out to @devbabymri.org to report this error", + ); + } +}; + +// Type Definitions +interface FetchParams { + limit: number; + offset: number; +} + +interface FetchResourcesResult { + parameters: PipelinePipingDefaultParameterList; + pluginPipings: PluginPiping[]; + pipelinePlugins: Plugin[]; +} + +export async function fetchResources( + pipelineInstance: Pipeline, + params: FetchParams = { limit: 100, offset: 0 }, +): Promise<FetchResourcesResult> { + try { + const boundGetPlugins = pipelineInstance.getPlugins.bind(pipelineInstance); + const boundGetPluginPipings = + pipelineInstance.getPluginPipings.bind(pipelineInstance); + const [pluginPipings, pipelinePlugins, parameters] = await Promise.all([ + fetchResource<PluginPiping>(params, boundGetPluginPipings), + fetchResource<Plugin>(params, boundGetPlugins), + pipelineInstance.getDefaultParameters({ limit: 1000 }), + ]); return { parameters, - pluginPipings, - pipelinePlugins, + pluginPipings: pluginPipings.resource, + pipelinePlugins: pipelinePlugins.resource, }; } catch (e) { + // Comprehensive error handling if (e instanceof Error) { throw new Error(e.message); } - // Handles api errors + // Handles API errors const message = catchError(e).error_message; throw new Error(message); } @@ -279,8 +231,9 @@ export const generatePipelineWithName = async (pipelineName: string) => { pipelineInstance, }; } catch (error) { - if (error instanceof Error) { - throw new Error(error.message); + const error_message = catchError(error).error_message; + if (error_message) { + throw new Error(error_message); } throw new Error( @@ -347,14 +300,46 @@ export async function fetchComputeInfo( } } +// src/utils/catchError.ts + export function catchError(errorRequest: any) { - if (errorRequest?.response?.data) { - return { error_message: errorRequest.response.data }; + // Check if errorRequest has a response with data + if ( + errorRequest?.response?.data && + typeof errorRequest.response.data === "object" + ) { + /* +{ + "response": { + "data": { + "randomErrorKey": ["ErrorMessage"] + } + } } + */ + const data = errorRequest.response.data; + // Iterate through each key in the data object + for (const key in data) { + if (Object.prototype.hasOwnProperty.call(data, key)) { + const value = data[key]; + // Check if the value is an array with at least one message + if (Array.isArray(value) && value.length > 0) { + // Return the first error message found + return { error_message: value[0] }; + } + } + } + // If no valid error messages are found, return a generic error + return { error_message: "An unknown error occurred." }; + } + + // If errorRequest has a message property, return it if (errorRequest?.message) { return { error_message: errorRequest.message as string }; } + + // Fallback error message return { error_message: "Unexpected Error: Please report at @devbabymri.org", }; diff --git a/src/api/model.ts b/src/api/model.ts index 5d70f576d..461831e50 100644 --- a/src/api/model.ts +++ b/src/api/model.ts @@ -3,7 +3,6 @@ import type { PACSFile, PluginInstance, } from "@fnndsc/chrisapi"; -import _ from "lodash"; export interface IActionTypeParam { type: string; @@ -21,7 +20,7 @@ export interface INode { // extends cola.Node extends SVGSVGElement id: number; item: PluginInstance; - group?: number; + group?: NodeId; isRoot?: boolean; } @@ -54,118 +53,106 @@ export interface ILink { export class TreeModel { treeChart: ITreeChart; - constructor(items: PluginInstance[], rootNodeId?: NodeId) { + private nodeMap: Map<NodeId, PluginInstance[]>; + private _nodes: INode[] = []; + private _links: ILink[] = []; + private _totalRows = 0; // Counts the Max number of vertical nodes (for calculating height dynamically) + private _workingIndex = 0; + + constructor(items: PluginInstance[]) { this.treeChart = { nodes: [], links: [], totalRows: 0, }; - this.parseFeedTreeData(items, rootNodeId); + this.nodeMap = this.buildNodeMap(items); + this.parseFeedTreeData(); } - parseFeedTreeData(items: PluginInstance[], rootNodeId?: NodeId): ITreeChart { - // Note: Reverse the array to expedite parsing also for demo purposes - this._workingItems = items; - this._parseRootNode(items, rootNodeId); - this._parseTreeChildren(this._workingItems, this._workingId); - - // Set the treeChart objects: - this._setNodes(this._nodes); - this._setLinks(this._links); - this.treeChart.totalRows = this._totalRows; - return this.treeChart; + /** + * Builds a map where each key is a parent NodeId and the value is an array of its children PluginInstances. + * This allows O(1) access to children of any node, significantly improving time complexity. + */ + private buildNodeMap(items: PluginInstance[]): Map<NodeId, PluginInstance[]> { + const map = new Map<NodeId, PluginInstance[]>(); + items.forEach((item) => { + const parentId = item.data.previous_id; + if (!map.has(parentId)) { + map.set(parentId, []); + } + map.get(parentId)!.push(item); + }); + return map; } - // Working props for parsing - private _workingIndex = 0; - private _workingId: NodeId = 0; - private _workingItems: PluginInstance[] = []; - private _nodes: INode[] = []; - private _links: ILink[] = []; - private _totalRows = 0; // Counts the Max number of vertical nodes (for calculating height dynamically) - // Description: Find the root of this tree: - private _parseRootNode(items: PluginInstance[], rootNodeId: NodeId) { - const parentItem = _.find(items, (item: PluginInstance) => { - return item.data.previous_id === rootNodeId; - }); + /** + * Parses the tree data starting from the rootNodeId. + * If no rootNodeId is provided, it assumes items without a parent are roots. + */ + private parseFeedTreeData(): void { + const roots = this.getRootNodes(); - if (parentItem) { + roots.forEach((rootItem) => { this._nodes.push({ - item: parentItem, id: this._workingIndex, - group: 0, + item: rootItem, + group: rootItem.data.previous_id, isRoot: true, }); - this._workingItems = this._removeWorkingItem(parentItem); - this._workingId = parentItem.data.id; + const currentNodeId = this._workingIndex; this._workingIndex++; - } - // Note: this is not the root or leaf plugin so increment the total rows - this._totalRows++; - } + this._totalRows++; - // Description: Recursive method to build tree - private _parseTreeChildren( - workingItems: PluginInstance[], - _workingId: NodeId, - _parentIndex = 0, - ) { - const cloneArr: PluginInstance[] = workingItems.slice(); - cloneArr.forEach((item: PluginInstance) => { - if (item.data.previous_id === _workingId) { - const id = this._workingIndex; - // is this a child to the node we are working on? - this._nodes.push({ - id, - item, - group: item.data.previous_id, - }); - this._links.push({ - target: this._workingIndex, - source: _parentIndex, - value: 1, - }); - this._workingItems = this._removeWorkingItem(item); - this._workingIndex++; - this._findChildrenNodes(item.data.id, id); - } + this.buildTree(rootItem.data.id, currentNodeId, 1); }); - workingItems.length > 0 && this._totalRows++; // Increment total rows for counting vertical levels - } - // Description: Find children to this node - private _findChildrenNodes(id: NodeId, _parentIndex: number) { - const workingChildrenArr = _.filter( - this._workingItems, - (subitem: PluginInstance) => { - return id === subitem.data.previous_id; - }, - ); - // Does this node have children - recur - !!workingChildrenArr && - workingChildrenArr.length > 0 && - this._parseTreeChildren(workingChildrenArr, id, _parentIndex); - } - - // Description: Remove item from working array - private _removeWorkingItem(item: PluginInstance): PluginInstance[] { - const arr = _.filter(this._workingItems, (subitem: PluginInstance) => { - return item.data.id !== subitem.data.id; - }); - return arr; + this.treeChart.nodes = this._nodes; + this.treeChart.links = this._links; + this.treeChart.totalRows = this._totalRows; } - // Set the treeChart nodes array - private _setNodes(nodes: INode[]) { - this.treeChart.nodes = nodes; + /** + * Retrieves root nodes when no rootNodeId is provided. + */ + private getRootNodes(): PluginInstance[] { + // Assuming that a root node has a previous_id that is undefined or null + return Array.from(this.nodeMap.keys()).includes(undefined as any) || + Array.from(this.nodeMap.keys()).includes(null as any) + ? this.nodeMap.get(undefined as any) || + this.nodeMap.get(null as any) || + [] + : []; } - // Set the treeChart links array - private _setLinks(links: ILink[]) { - this.treeChart.links = links; + /** + * Recursively builds the tree by traversing the nodeMap. + */ + private buildTree( + parentId: NodeId, + parentIndex: number, + depth: number, + ): void { + const children = this.nodeMap.get(parentId); + if (!children) return; + + children.forEach((child) => { + const childId = this._workingIndex; + this._nodes.push({ + id: childId, + item: child, + group: parentId, + }); + this._links.push({ + source: parentIndex, + target: childId, + value: 1, + }); + this._workingIndex++; + this._totalRows = Math.max(this._totalRows, depth + 1); + this.buildTree(child.data.id, childId, depth + 1); + }); } } - // Description: Mapping for Viewer type by file type *Note: Should come from db // File type: Viewer component name export const fileViewerMap: any = { diff --git a/src/components/FeedTree/FeedGraph.tsx b/src/components/FeedTree/FeedGraph.tsx index 3d0aea32a..30bb39981 100644 --- a/src/components/FeedTree/FeedGraph.tsx +++ b/src/components/FeedTree/FeedGraph.tsx @@ -6,23 +6,18 @@ import ForceGraph2D, { type ForceGraphMethods, type NodeObject, } from "react-force-graph-2d"; -import { TreeModel } from "../../api/model"; +import { type ITreeChart, TreeModel } from "../../api/model"; import { setFeedLayout } from "../../store/feed/feedSlice"; -import { useAppSelector, useAppDispatch } from "../../store/hooks"; +import { useAppDispatch, useAppSelector } from "../../store/hooks"; import { type FeedTreeScaleType, NodeScaleDropdown } from "./Controls"; import "./FeedTree.css"; -import useSize from "./useSize"; import { SpinContainer } from "../Common"; +import useSize from "./useSize"; interface IFeedProps { onNodeClick: (node: PluginInstance) => void; } -interface GraphData { - nodes: NodeObject[]; - links: { source: string; target: string }[]; -} - const FeedGraph: React.FC<IFeedProps> = ({ onNodeClick }) => { const dispatch = useAppDispatch(); const currentLayout = useAppSelector((state) => state.feed.currentLayout); @@ -43,7 +38,7 @@ const FeedGraph: React.FC<IFeedProps> = ({ onNodeClick }) => { const size = useSize(graphRef); - const [graphData, setGraphData] = React.useState<GraphData | undefined>( + const [graphData, setGraphData] = React.useState<ITreeChart | undefined>( undefined, ); const [controls] = React.useState({ "DAG Orientation": "td" }); @@ -77,7 +72,7 @@ const FeedGraph: React.FC<IFeedProps> = ({ onNodeClick }) => { React.useEffect(() => { if (instances && instances.length > 0) { const tree = new TreeModel(instances); - //@ts-ignore + setGraphData(tree.treeChart); } }, [instances]); @@ -120,7 +115,7 @@ const FeedGraph: React.FC<IFeedProps> = ({ onNodeClick }) => { <div className="feed-tree__control"> <Switch id="layout" - label="2D" + label="3D" labelOff="2D" isChecked={currentLayout} onChange={() => { @@ -169,7 +164,7 @@ const FeedGraph: React.FC<IFeedProps> = ({ onNodeClick }) => { linkDirectionalParticleWidth={2} d3VelocityDecay={0.3} linkWidth={2} - nodeRelSize={8} + nodeRelSize={3} /> )} </ErrorBoundary> diff --git a/src/components/FeedTree/FeedTree.tsx b/src/components/FeedTree/FeedTree.tsx index ae7c7a5b6..758e10f55 100644 --- a/src/components/FeedTree/FeedTree.tsx +++ b/src/components/FeedTree/FeedTree.tsx @@ -1,4 +1,4 @@ -import { Alert, Switch, TextInput } from "@patternfly/react-core"; +import { Switch, TextInput } from "@patternfly/react-core"; import { type HierarchyPointLink, type HierarchyPointNode, @@ -8,7 +8,13 @@ import { import { type Selection, select } from "d3-selection"; import { type ZoomBehavior, zoom as d3Zoom, zoomIdentity } from "d3-zoom"; import { isEqual } from "lodash"; -import React, { useContext, useRef } from "react"; +import React, { + useCallback, + useContext, + useEffect, + useRef, + useState, +} from "react"; import { setFeedLayout, setSearchFilter, @@ -26,6 +32,13 @@ import type TreeNodeDatum from "./data"; import type { OwnProps, Point } from "./data"; import useSize from "./useSize"; +type FeedTreeFeature = + | "scale_enabled" + | "scale_type" + | "collapsible" + | "toggleLabel" + | "search"; + type FeedTreeState = { d3: { translate: Point; @@ -41,13 +54,11 @@ type FeedTreeState = { }; function calculateD3Geometry(nextProps: OwnProps, feedTreeProp: FeedTreeProp) { - let scale: number; + let scale = nextProps.zoom; if (nextProps.zoom > nextProps.scaleExtent.max) { scale = nextProps.scaleExtent.max; } else if (nextProps.zoom < nextProps.scaleExtent.min) { scale = nextProps.scaleExtent.min; - } else { - scale = nextProps.zoom; } return { translate: feedTreeProp.translate, @@ -74,15 +85,23 @@ function getInitialState( const svgClassName = "feed-tree__svg"; const graphClassName = "feed-tree__graph"; -const FeedTree = (props: OwnProps) => { +const FeedTree: React.FC<OwnProps> = ({ + data, + zoom = 1, + scaleExtent = { min: 0.1, max: 1.5 }, + nodeSize = { x: 120, y: 80 }, + separation, + tsIds, + changeOrientation, + onNodeClick, +}) => { const { isDarkTheme } = useContext(ThemeContext); const dispatch = useAppDispatch(); - const divRef = useRef<HTMLDivElement>(null); const { feedTreeProp, currentLayout, searchFilter } = useAppSelector( (state) => state.feed, ); - const [feedTree, setFeedTree] = React.useState<{ + const [feedTree, setFeedTree] = useState<{ nodes?: HierarchyPointNode<TreeNodeDatum>[]; links?: HierarchyPointLink<TreeNodeDatum>[]; }>({ @@ -90,10 +109,24 @@ const FeedTree = (props: OwnProps) => { links: [], }); const size = useSize(divRef); - const { nodeSize, separation, tsIds } = props; - const { orientation } = feedTreeProp; - - const generateTree = React.useCallback( + const { translate, orientation } = feedTreeProp; + const [feedState, setFeedState] = useState<FeedTreeState>( + getInitialState( + { + data, + zoom, + scaleExtent, + nodeSize, + separation, + tsIds, + changeOrientation, + onNodeClick, + }, + feedTreeProp, + ), + ); + const { scale } = feedState.d3; + const generateTree = useCallback( (data: TreeNodeDatum[]) => { const d3Tree = tree<TreeNodeDatum>() .nodeSize( @@ -101,19 +134,19 @@ const FeedTree = (props: OwnProps) => { ? [nodeSize.y, nodeSize.x] : [nodeSize.x, nodeSize.y], ) - .separation((a, b) => { - return a.data.parentId === b.data.parentId + .separation((a, b) => + a.data.parentId === b.data.parentId ? separation.siblings - : separation.nonSiblings; - }); + : separation.nonSiblings, + ); - let nodes: HierarchyPointNode<TreeNodeDatum>[] | undefined = undefined; - let links: HierarchyPointLink<TreeNodeDatum>[] | undefined = undefined; + let nodes: HierarchyPointNode<TreeNodeDatum>[] | undefined; + let links: HierarchyPointLink<TreeNodeDatum>[] | undefined; let newLinks: HierarchyPointLink<TreeNodeDatum>[] = []; - if (data) { + if (data && data.length > 0) { const rootNode = d3Tree( - hierarchy(data[0], (d) => (d.__rd3t.collapsed ? null : d.children)), + hierarchy(data[0], (d) => (d.__rd3t?.collapsed ? null : d.children)), ); nodes = rootNode.descendants(); links = rootNode.links(); @@ -125,57 +158,45 @@ const FeedTree = (props: OwnProps) => { const targetId = link.target.data.id; const sourceId = link.source.data.id; - // Check if targetId and sourceId exist and if at least one of them is in 'tsIds' if (targetId && sourceId && (tsIds[targetId] || tsIds[sourceId])) { - // 'tsPlugin' found + const topologicalLink = tsIds[targetId] + ? link.target + : link.source; - let topologicalLink: - | HierarchyPointNode<TreeNodeDatum> - | undefined; - - if (tsIds[targetId]) { - topologicalLink = link.target; - } else { - topologicalLink = link.source; - } - - // Check if 'topologicalLink' is defined - if (topologicalLink.data.id) { + if (topologicalLink?.data.id) { const parents = tsIds[topologicalLink.data.id]; - // Check if 'parents' is defined and not empty if (parents && parents.length > 0) { - const dict: { - [key: string]: HierarchyPointNode<TreeNodeDatum>; - } = {}; + const dict: Record< + string, + HierarchyPointNode<TreeNodeDatum> + > = {}; for (const innerLink of links) { if (innerLink.source && innerLink.target) { - for (let i = 0; i < parents.length; i++) { + parents.forEach((parentId) => { if ( - innerLink.source.data.id === parents[i] && - !dict[innerLink.source.data.id] + innerLink.source.data.id === parentId && + !dict[parentId] ) { - dict[innerLink.source.data.id] = innerLink.source; + dict[parentId] = innerLink.source; } if ( - innerLink.target.data.id === parents[i] && - !dict[innerLink.target.data.id] + innerLink.target.data.id === parentId && + !dict[parentId] ) { - dict[innerLink.target.data.id] = innerLink.target; + dict[parentId] = innerLink.target; } - } - } - } - - for (const key in dict) { - if (Object.prototype.hasOwnProperty.call(dict, key)) { - newLinksToAdd.push({ - source: dict[key], - target: topologicalLink, }); } } + + Object.values(dict).forEach((node) => { + newLinksToAdd.push({ + source: node, + target: topologicalLink, + }); + }); } } } @@ -185,19 +206,12 @@ const FeedTree = (props: OwnProps) => { newLinks = [...links, ...newLinksToAdd]; } - return { nodes, newLinks: newLinks }; + return { nodes, newLinks }; }, - [ - nodeSize.x, - nodeSize.y, - orientation, - separation.nonSiblings, - separation.siblings, - tsIds, - ], + [nodeSize, orientation, separation, tsIds], ); - React.useEffect(() => { + useEffect(() => { if (size?.width) { if (orientation === "vertical") { dispatch(setTranslate({ x: size.width / 2, y: 90 })); @@ -207,23 +221,21 @@ const FeedTree = (props: OwnProps) => { } }, [size, orientation, dispatch]); - const [feedState, setFeedState] = React.useState<FeedTreeState>( - getInitialState(props, feedTreeProp), - ); - - const { scale } = feedState.d3; - const { changeOrientation, scaleExtent } = props; + useEffect(() => { + if (data && data.length > 0) { + const { nodes, newLinks: links } = generateTree(data); + setFeedTree({ nodes, links }); + } + }, [data, generateTree]); - const bindZoomListener = React.useCallback(() => { - const { translate } = feedTreeProp; + const bindZoomListener = () => { const svg: Selection<SVGSVGElement, unknown, HTMLElement, any> = select( `.${svgClassName}`, ); const g: Selection<SVGGElement, unknown, HTMLElement, any> = select( `.${graphClassName}`, ); - - const zoom: ZoomBehavior<SVGSVGElement, unknown> = d3Zoom< + const zoomBehavior: ZoomBehavior<SVGSVGElement, unknown> = d3Zoom< SVGSVGElement, unknown >() @@ -233,57 +245,55 @@ const FeedTree = (props: OwnProps) => { }); svg - .call(zoom) + .call(zoomBehavior) .call( - zoom.transform, + zoomBehavior.transform, zoomIdentity.translate(translate.x, translate.y).scale(scale), ); - }, [scale, feedTreeProp]); + }; - React.useEffect(() => { + useEffect(() => { bindZoomListener(); - }, [bindZoomListener]); - - React.useEffect(() => { - if (props.data) { - const { nodes, newLinks: links } = generateTree(props.data); - setFeedTree(() => { - return { - nodes, - links, - }; - }); - } - }, [props.data, generateTree]); - - const handleChange = (feature: string, data?: any) => { - if (feature === "scale_enabled") { - setFeedState({ - ...feedState, - overlayScale: { - ...feedState.overlayScale, - enabled: !feedState.overlayScale.enabled, - }, - }); - } else if (feature === "scale_type") { - setFeedState({ - ...feedState, - overlayScale: { - ...feedState.overlayScale, - type: data, - }, - }); - } else { - setFeedState({ - ...feedState, - [feature]: !feedState[feature], - }); - } - }; + }, []); + + const handleChange = useCallback((feature: FeedTreeFeature, data?: any) => { + setFeedState((prevState) => { + switch (feature) { + case "scale_enabled": + return { + ...prevState, + overlayScale: { + ...prevState.overlayScale, + enabled: !prevState.overlayScale.enabled, + }, + }; + case "scale_type": + return { + ...prevState, + overlayScale: { + ...prevState.overlayScale, + type: data as FeedTreeScaleType, + }, + }; + case "collapsible": + case "toggleLabel": + case "search": + return { + ...prevState, + [feature]: !prevState[feature], + }; + default: + return prevState; + } + }); + }, []); - const handleNodeClick = (item: any) => { - props.onNodeClick(item); - }; + const handleNodeClick = useCallback( + (item: any) => { + onNodeClick(item); + }, + [onNodeClick], + ); const { nodes, links } = feedTree; @@ -291,18 +301,27 @@ const FeedTree = (props: OwnProps) => { <div className="feed-tree setFlex grabbable mode_tree" ref={divRef}> <div className="feed-tree__container"> <div className="feed-tree__container--labels"> - {/* Suppressing this for now as we don't know how which key events to hook for changing orientations */} - {/* biome-ignore lint/a11y/useKeyWithClickEvents: <explanation> */} <div - onClick={() => { - changeOrientation(orientation); - }} + onClick={() => changeOrientation(orientation)} className="feed-tree__orientation" + onKeyDown={(e) => { + if (e.key === "Enter" || e.key === " ") { + changeOrientation(orientation); + } + }} > {orientation === "vertical" ? ( - <RotateLeft className="feed-tree__orientation--icon" /> + <RotateLeft + className="feed-tree__orientation--icon" + aria-label="Rotate Left" + aria-hidden="true" + /> ) : ( - <RotateRight className="feed-tree__orientation--icon" /> + <RotateRight + className="feed-tree__orientation--icon" + aria-label="Rotate Right" + aria-hidden="true" + /> )} </div> @@ -312,20 +331,21 @@ const FeedTree = (props: OwnProps) => { label="Hide Labels" labelOff="Show Labels" isChecked={feedState.toggleLabel} - onChange={() => { - handleChange("toggleLabel"); - }} + aria-checked={feedState.toggleLabel} + onChange={() => handleChange("toggleLabel")} + aria-label="Toggle label visibility" /> </div> + <div className="feed-tree__control"> <Switch id="layout" label="Switch Layout" - labelOff="3D" + labelOff="2D" isChecked={currentLayout} - onChange={() => { - dispatch(setFeedLayout()); - }} + aria-checked={currentLayout} + onChange={() => dispatch(setFeedLayout())} + aria-label="Toggle graph layout from 2D to 3D" /> </div> @@ -333,33 +353,32 @@ const FeedTree = (props: OwnProps) => { <Switch id="individual-scale" label="Scale Nodes On" - labelOff="Scale Nodes Off " + labelOff="Scale Nodes Off" isChecked={feedState.overlayScale.enabled} - onChange={() => { - handleChange("scale_enabled"); - }} + aria-checked={feedState.overlayScale.enabled} + onChange={() => handleChange("scale_enabled")} + aria-label="Scale nodes" /> {feedState.overlayScale.enabled && ( <div className="dropdown-wrap"> <NodeScaleDropdown selected={feedState.overlayScale.type} - onChange={(type) => { - handleChange("scale_type", type); - }} + onChange={(type) => handleChange("scale_type", type)} /> </div> )} </div> + <div className="feed-tree__control"> <Switch id="search" label="Search On" - labelOff="Search Off " + labelOff="Search Off" isChecked={feedState.search} - onChange={() => { - handleChange("search"); - }} + aria-checked={feedState.search} + onChange={() => handleChange("search")} + aria-label="Toggle search a node in the tree" /> </div> @@ -367,57 +386,54 @@ const FeedTree = (props: OwnProps) => { {feedState.search && ( <TextInput value={searchFilter.value} - onChange={(_event, value: string) => { - dispatch(setSearchFilter(value.trim())); - }} + onChange={(_, value: string) => + dispatch(setSearchFilter(value.trim())) + } /> )} </div> </div> </div> - {feedTreeProp.translate.x > 0 && feedTreeProp.translate.y > 0 && ( - // biome-ignore lint/a11y/noSvgWithoutTitle: <explanation> + {translate.x > 0 && translate.y > 0 && ( <svg focusable="true" - className={`${svgClassName}`} + className={svgClassName} width="100%" height="100%" + role="img" + aria-label="Feed Tree Visualization" > <TransitionGroupWrapper component="g" className={graphClassName} - transform={`translate(${feedTreeProp.translate.x},${feedTreeProp.translate.y}) scale(${scale})`} + transform={`translate(${translate.x},${translate.y}) scale(${scale})`} > - {links?.map((linkData, i) => { - return ( - <Link - orientation={orientation} - key={`link${i}`} - linkData={linkData} - isDarkTheme={isDarkTheme} - /> - ); - })} - - {nodes?.map(({ data, x, y, parent }) => { - return ( - <NodeWrapper - key={`node + ${data.id}`} - data={data} - position={{ x, y }} - parent={parent} - onNodeClick={handleNodeClick} - orientation={orientation} - toggleLabel={feedState.toggleLabel} - overlayScale={ - feedState.overlayScale.enabled - ? feedState.overlayScale.type - : undefined - } - /> - ); - })} + {links?.map((linkData, i) => ( + <Link + key={`link${i}`} + orientation={orientation} + linkData={linkData} + isDarkTheme={isDarkTheme} + /> + ))} + + {nodes?.map(({ data, x, y, parent }) => ( + <NodeWrapper + key={`node${data.id}`} + data={data} + position={{ x, y }} + parent={parent} + onNodeClick={handleNodeClick} + orientation={orientation} + toggleLabel={feedState.toggleLabel} + overlayScale={ + feedState.overlayScale.enabled + ? feedState.overlayScale.type + : undefined + } + /> + ))} </TransitionGroupWrapper> </svg> )} @@ -427,22 +443,10 @@ const FeedTree = (props: OwnProps) => { const FeedTreeMemoed = React.memo( FeedTree, - (prevProps: OwnProps, nextProps: OwnProps) => { - if ( - !isEqual(prevProps.data, nextProps.data) || - prevProps.zoom !== nextProps.zoom || - prevProps.tsIds !== nextProps.tsIds - ) { - return false; - } - return true; - }, + (prevProps: OwnProps, nextProps: OwnProps) => + isEqual(prevProps.data, nextProps.data) && + prevProps.zoom === nextProps.zoom && + isEqual(prevProps.tsIds, nextProps.tsIds), ); export default FeedTreeMemoed; - -FeedTree.defaultProps = { - scaleExtent: { min: 0.1, max: 1.5 }, - zoom: 1, - nodeSize: { x: 120, y: 80 }, -}; diff --git a/src/components/FeedTree/Link.tsx b/src/components/FeedTree/Link.tsx index 54670eb59..29a6f880d 100644 --- a/src/components/FeedTree/Link.tsx +++ b/src/components/FeedTree/Link.tsx @@ -1,12 +1,12 @@ import React, { Fragment } from "react"; import { linkHorizontal, linkVertical } from "d3-shape"; -import { Datum } from "./data"; -import { HierarchyPointNode } from "d3-hierarchy"; +import type TreeNodeDatum from "./data"; +import type { HierarchyPointNode } from "d3-hierarchy"; import { select } from "d3-selection"; export interface TreeLinkDatum { - source: HierarchyPointNode<Datum>; - target: HierarchyPointNode<Datum>; + source: HierarchyPointNode<TreeNodeDatum>; + target: HierarchyPointNode<TreeNodeDatum>; } interface LinkProps { @@ -53,17 +53,17 @@ class Link extends React.Component<LinkProps, LinkState> { const { source, target } = linkData; - const deltaX = target.x - source.x, - deltaY = target.y - source.y, - dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY), - normX = deltaX / dist, - normY = deltaY / dist, - sourcePadding = this.nodeRadius, - targetPadding = this.nodeRadius + 4, - sourceX = source.x + sourcePadding * normX, - sourceY = source.y + sourcePadding * normY, - targetX = target.x - targetPadding * normX, - targetY = target.y - targetPadding * normY; + const deltaX = target.x - source.x; + const deltaY = target.y - source.y; + const dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY); + const normX = deltaX / dist; + const normY = deltaY / dist; + const sourcePadding = this.nodeRadius; + const targetPadding = this.nodeRadius + 4; + const sourceX = source.x + sourcePadding * normX; + const sourceY = source.y + sourcePadding * normY; + const targetX = target.x - targetPadding * normX; + const targetY = target.y - targetPadding * normY; if (ts) { return orientation === "horizontal" diff --git a/src/components/FeedTree/Node.tsx b/src/components/FeedTree/Node.tsx index 28168a40b..83a207b82 100644 --- a/src/components/FeedTree/Node.tsx +++ b/src/components/FeedTree/Node.tsx @@ -3,7 +3,14 @@ import { useMutation } from "@tanstack/react-query"; import { notification } from "antd"; import type { HierarchyPointNode } from "d3-hierarchy"; import { select } from "d3-selection"; -import { Fragment, memo, useContext, useEffect, useRef } from "react"; +import { + Fragment, + memo, + useCallback, + useContext, + useEffect, + useRef, +} from "react"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useAppDispatch, useAppSelector } from "../../store/hooks"; import { @@ -20,13 +27,13 @@ import { PipelineProvider } from "../PipelinesCopy/context"; import type { FeedTreeScaleType } from "./Controls"; import DropdownMenu from "./DropdownMenu"; import type TreeNodeDatum from "./data"; -import type { Datum, Point } from "./data"; +import type { Point } from "./data"; type NodeWrapperProps = { tsNodes?: PluginInstance[]; data: TreeNodeDatum; position: Point; - parent: HierarchyPointNode<Datum> | null; + parent: HierarchyPointNode<TreeNodeDatum> | null; onNodeClick: (node: any) => void; orientation: "horizontal" | "vertical"; overlayScale?: FeedTreeScaleType; @@ -77,12 +84,12 @@ const Node = (props: NodeProps) => { const searchFilter = useAppSelector((state) => state.feed.searchFilter); const { value } = searchFilter; - const applyNodeTransform = (transform: string, opacity = 1) => { + const applyNodeTransform = useCallback((transform: string, opacity = 1) => { select(nodeRef.current) .attr("transform", transform) .style("opacity", opacity); select(textRef.current).attr("transform", "translate(-28, 28)"); - }; + }, []); useEffect(() => { const nodeTransform = setNodeTransform(orientation, position); @@ -218,7 +225,7 @@ const Node = (props: NodeProps) => { message: "Preparing to initiate the zipping process...", }); } - }, [mutation.isSuccess, mutation.isError, mutation.isPending]); + }, [api, mutation.isSuccess, mutation.isError, mutation.isPending]); const textLabel = ( <g diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index aee22cc1f..b4b05b310 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -231,6 +231,8 @@ const TableSelectable: React.FC = () => { page={+page} onSetPage={onSetPage} onPerPageSelect={onPerPageSelect} + isCompact + aria-label="Feed table pagination" /> ); }; @@ -296,7 +298,7 @@ const TableSelectable: React.FC = () => { </CreateFeedProvider> </div> </PageSection> - <PageSection style={{ paddingBlockStart: "0.5em", height: "100%" }}> + <PageSection style={{ paddingBlockStart: "0.5em" }}> <Operations origin={{ type: OperationContext.FEEDS, @@ -319,7 +321,7 @@ const TableSelectable: React.FC = () => { > <Thead> <Tr> - <Th aria-label="feed-selection-checkbox" /> + <Th scope="col" aria-label="feed-selection-checkbox" /> {COLUMN_DEFINITIONS.map((column, columnIndex) => ( <Th key={column.id} sort={getSortParams(columnIndex)}> {column.label} @@ -417,6 +419,7 @@ const TableRow: React.FC<TableRowProps> = ({ }); }} isRowSelected={isSelected} + role="row" > <Td onClick={(e) => e.stopPropagation()} @@ -481,12 +484,14 @@ const DonutUtilization = (props: { return <div>N/A</div>; } let threshold = Number.POSITIVE_INFINITY; - const { progress, error: feedError, feedProgressText } = details; - let title = `${progress ? progress : 0}%`; + const { progress, error: feedError } = details; + let title = `${progress ?? 0}%`; let color = "blue"; + let ariaLabel = `Progress: ${progress ?? 0}%`; if (feedError) { color = "#ff0000"; threshold = progress; + ariaLabel = "Error in feed processing"; } // If initial node in a feed fails @@ -501,6 +506,7 @@ const DonutUtilization = (props: { } if (progress === 100) { title = "✔️"; + ariaLabel = "Feed processing complete"; } const mode = isDarkTheme ? "dark" : "light"; @@ -509,7 +515,7 @@ const DonutUtilization = (props: { <Tooltip content={`Progress: ${details.progress}%`}> <div className={`chart ${mode}`}> <ChartDonutUtilization - ariaTitle={feedProgressText} + ariaTitle={ariaLabel} data={{ x: "Analysis Progress", y: progress }} height={125} title={title} @@ -534,6 +540,7 @@ const FeedInfoColumn = ({ style={{ padding: 0, }} + aria-label={`View details for ${feed.data.name}`} > {feed.data.name} </Button> @@ -556,7 +563,9 @@ function EmptyStateTable() { <Tr> <Th /> {COLUMN_ORDER.map(({ label }) => ( - <Th key={label}>{label}</Th> + <Th scope="col" key={label}> + {label} + </Th> ))} </Tr> </Thead> @@ -592,7 +601,7 @@ function LoadingTable() { </Tr> </Thead> <Tbody> - {Array.from({ length: 15 }).map((_, index) => ( + {Array.from({ length: 20 }).map((_, index) => ( // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> <Tr key={index}> <Td colSpan={COLUMN_ORDER.length + 1}> diff --git a/src/components/NewLibrary/components/ContextMenu.tsx b/src/components/NewLibrary/components/ContextMenu.tsx index 1a05b50cc..5e501d6fa 100644 --- a/src/components/NewLibrary/components/ContextMenu.tsx +++ b/src/components/NewLibrary/components/ContextMenu.tsx @@ -85,6 +85,7 @@ export const FolderContextMenu = (props: ContextMenuProps) => { {contextHolder} <Dropdown + aria-role="menu" menu={{ items, onClick: (info) => handleOperations(info.key) }} trigger={["contextMenu"]} > From 43d9fd033370b755a53d021cc3972ee9eb06c584 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 10 Oct 2024 19:40:13 -0400 Subject: [PATCH 297/337] Fix some pypx types --- src/api/pfdcm/client.test.ts | 16 ++++++++++++++++ src/api/pfdcm/client.ts | 35 ++++++++++++++++++++++------------- src/api/pfdcm/models.ts | 6 +++--- 3 files changed, 41 insertions(+), 16 deletions(-) create mode 100644 src/api/pfdcm/client.test.ts diff --git a/src/api/pfdcm/client.test.ts b/src/api/pfdcm/client.test.ts new file mode 100644 index 000000000..6ce066ad5 --- /dev/null +++ b/src/api/pfdcm/client.test.ts @@ -0,0 +1,16 @@ +import { test, expect } from "vitest"; +import { parsePypxDicomDate } from "./client.ts"; + +test.each([ + ["20200203", new Date(2020, 1, 3)], + ["2020-02-03", new Date(2020, 1, 3)], + ["not-a-date", new Date(NaN)], +])("parseDicomDate(%s) -> %o", (value, expected) => { + const pypxTag = { + tag: "0008,0020", + label: "StudyDate", + value, + }; + const actual = parsePypxDicomDate(pypxTag); + expect(actual).toStrictEqual(expected); +}); diff --git a/src/api/pfdcm/client.ts b/src/api/pfdcm/client.ts index 7c1bce08e..6e0f6a029 100644 --- a/src/api/pfdcm/client.ts +++ b/src/api/pfdcm/client.ts @@ -164,18 +164,14 @@ function simplifyPypxStudyData(data: { }): StudyAndSeries { const study = { SpecificCharacterSet: getValue(data, "SpecificCharacterSet"), - StudyDate: - "value" in data.StudyDate ? parseDicomDate(data.StudyDate) : null, + StudyDate: parsePypxDicomDate(data.StudyDate), AccessionNumber: getValue(data, "AccessionNumber"), RetrieveAETitle: getValue(data, "RetrieveAETitle"), ModalitiesInStudy: getValue(data, "ModalitiesInStudy"), StudyDescription: getValue(data, "StudyDescription"), PatientName: getValue(data, "PatientName"), PatientID: getValue(data, "PatientID"), - PatientBirthDate: - "value" in data.PatientBirthDate - ? parseDicomDate(data.PatientBirthDate) - : null, + PatientBirthDate: parsePypxDicomDate(data.PatientBirthDate), PatientSex: getValue(data, "PatientSex"), PatientAge: getValue(data, "PatientAge"), ProtocolName: getValue(data, "ProtocolName"), @@ -185,7 +181,11 @@ function simplifyPypxStudyData(data: { "AcquisitionProtocolDescription", ), StudyInstanceUID: getValue(data, "StudyInstanceUID"), - NumberOfStudyRelatedSeries: getValue(data, "NumberOfStudyRelatedSeries"), + NumberOfStudyRelatedSeries: + "value" in data.NumberOfStudyRelatedSeries && + data.NumberOfStudyRelatedSeries.value !== 0 + ? parseInt(data.NumberOfStudyRelatedSeries.value) + : NaN, PerformedStationAETitle: getValue(data, "PerformedStationAETitle"), }; const series = Array.isArray(data.series) @@ -214,8 +214,8 @@ function simplifyPypxSeriesData(data: { [key: string]: PypxTag }): Series { : parsedNumInstances; return { SpecificCharacterSet: "" + data.SpecificCharacterSet.value, - StudyDate: "" + data.StudyDate.value, - SeriesDate: "" + data.SeriesDate.value, + StudyDate: parsePypxDicomDate(data.StudyDate), + SeriesDate: parsePypxDicomDate(data.SeriesDate), AccessionNumber: "" + data.AccessionNumber.value, RetrieveAETitle: "" + data.RetrieveAETitle.value, Modality: "" + data.Modality.value, @@ -223,7 +223,7 @@ function simplifyPypxSeriesData(data: { [key: string]: PypxTag }): Series { SeriesDescription: "" + data.SeriesDescription.value, PatientName: "" + data.PatientName.value, PatientID: "" + data.PatientID.value, - PatientBirthDate: parseDicomDate(data.PatientBirthDate), + PatientBirthDate: parsePypxDicomDate(data.PatientBirthDate), PatientSex: "" + data.PatientSex.value, PatientAge: "" + data.PatientAge.value, ProtocolName: "" + data.ProtocolName.value, @@ -240,10 +240,19 @@ function simplifyPypxSeriesData(data: { [key: string]: PypxTag }): Series { /** * Parse a DICOM DateString (DS), which is in YYYYMMDD format. * + * The invalid format "YYYY-MM-DD" is also accepted. + * * https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.2.html */ -function parseDicomDate(tag: PypxTag): Date { - return parseDate("" + tag.value, "yyyyMMdd", new Date()); +function parsePypxDicomDate(tag: PypxTag | object | undefined): Date | null { + if (!tag || !("value" in tag) || tag.value === 0) { + return null; + } + const parsed = parseDate("" + tag.value, "yyyyMMdd", new Date()); + if (!Number.isNaN(parsed.getFullYear())) { + return parsed; + } + return parseDate("" + tag.value, "yyyy-MM-dd", new Date()); } -export { PfdcmClient }; +export { PfdcmClient, parsePypxDicomDate }; diff --git a/src/api/pfdcm/models.ts b/src/api/pfdcm/models.ts index 3b1818f9d..517ca03f6 100644 --- a/src/api/pfdcm/models.ts +++ b/src/api/pfdcm/models.ts @@ -47,7 +47,7 @@ type Study = { AcquisitionProtocolName: string; AcquisitionProtocolDescription: string; StudyInstanceUID: string; - NumberOfStudyRelatedSeries: string; + NumberOfStudyRelatedSeries: number; PerformedStationAETitle: string; }; @@ -56,8 +56,8 @@ type Study = { */ type Series = { SpecificCharacterSet: string; - StudyDate: string; - SeriesDate: string; + StudyDate: Date | null; + SeriesDate: Date | null; AccessionNumber: string; RetrieveAETitle: string; Modality: string; From d0d2bd053a139af2713303ec4bc4858416aa3cdd Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 10 Oct 2024 19:41:35 -0400 Subject: [PATCH 298/337] Automatically expand if only one study found --- .../Pacs/components/PacsStudiesView.test.tsx | 42 ++++++++++++++++- .../Pacs/components/PacsStudiesView.tsx | 7 +++ .../Pacs/components/testData/dai.ts | 46 +++++++++++++++++++ 3 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 src/components/Pacs/components/testData/dai.ts diff --git a/src/components/Pacs/components/PacsStudiesView.test.tsx b/src/components/Pacs/components/PacsStudiesView.test.tsx index 2df7e20e2..a04fa754b 100644 --- a/src/components/Pacs/components/PacsStudiesView.test.tsx +++ b/src/components/Pacs/components/PacsStudiesView.test.tsx @@ -1,3 +1,41 @@ -import { test, expect } from "vitest"; +import { describe, it, vi, expect } from "vitest"; +import { PacsStudyState, SeriesPullState } from "../types"; +import { DAI_SERIES, DAI_STUDY } from "./testData/dai.ts"; +import { render } from "@testing-library/react"; +import PacsStudiesView from "./PacsStudiesView.tsx"; +import { DEFAULT_PREFERENCES } from "../defaultPreferences.ts"; -test.skip("PacsStudiesView", () => {}); +describe("'Pull Study' button", () => { + it("expands first study if there is only one study", async () => { + const studies: PacsStudyState[] = [ + { + info: DAI_STUDY, + series: [ + { + errors: [], + info: DAI_SERIES, + receivedCount: 0, + inCube: null, + pullState: SeriesPullState.NOT_CHECKED, + }, + ], + }, + ]; + const onRetrieve = vi.fn(); + const onStudyExpand = vi.fn(); + + render( + <PacsStudiesView + preferences={DEFAULT_PREFERENCES} + studies={studies} + onRetrieve={onRetrieve} + expandedStudyUids={[]} + onStudyExpand={onStudyExpand} + />, + ); + expect(onStudyExpand).toHaveBeenCalledOnce(); + expect(onStudyExpand.mock.lastCall?.[0]).toStrictEqual([ + studies[0].info.StudyInstanceUID, + ]); + }); +}); diff --git a/src/components/Pacs/components/PacsStudiesView.tsx b/src/components/Pacs/components/PacsStudiesView.tsx index 4e7c8bc88..beea71572 100644 --- a/src/components/Pacs/components/PacsStudiesView.tsx +++ b/src/components/Pacs/components/PacsStudiesView.tsx @@ -24,6 +24,13 @@ const PacsStudiesView: React.FC<PacsStudiesViewProps> = ({ onStudyExpand, preferences, }) => { + React.useEffect(() => { + // Automatically expand first study if there is only one study + if (studies.length === 1 && expandedStudyUids?.length === 0) { + onStudyExpand?.([studies[0].info.StudyInstanceUID]); + } + }, [studies]); + const items: CollapseProps["items"] = React.useMemo(() => { return studies.map(({ info, series }) => { return { diff --git a/src/components/Pacs/components/testData/dai.ts b/src/components/Pacs/components/testData/dai.ts new file mode 100644 index 000000000..59d626996 --- /dev/null +++ b/src/components/Pacs/components/testData/dai.ts @@ -0,0 +1,46 @@ +import { Study, Series } from "../../../../api/pfdcm/models"; + +const DAI_STUDY: Study = { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: null, + AccessionNumber: "123abc", + RetrieveAETitle: "HOSPITALNAME", + ModalitiesInStudy: "CR", + StudyDescription: "Chest X-ray for COVID-19 Screening", + PatientName: "George Smith", + PatientID: "DAI000290", + PatientBirthDate: null, + PatientSex: "M", + PatientAge: "71", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: "1.2.276.0.7230010.3.1.2.8323329.8519.1517874337.873082", + NumberOfStudyRelatedSeries: 1, + PerformedStationAETitle: "no value provided for 0040,0241", +}; + +const DAI_SERIES: Series = { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: DAI_STUDY.StudyDate, + SeriesDate: DAI_STUDY.StudyDate, + AccessionNumber: "123abc", + RetrieveAETitle: "HOSPITALNAME", + Modality: "CR", + StudyDescription: "Chest X-ray for COVID-19 Screening", + SeriesDescription: "Series Description: Unknown", + PatientName: "George Smith", + PatientID: "DAI000290", + PatientBirthDate: new Date(1950, 2, 7), + PatientSex: "M", + PatientAge: "71", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: "1.2.276.0.7230010.3.1.2.8323329.8519.1517874337.873082", + SeriesInstanceUID: "1.2.276.0.7230010.3.1.3.8323329.8519.1517874337.873097", + NumberOfSeriesRelatedInstances: 1, + PerformedStationAETitle: "no value provided for 0040,0241", +}; + +export { DAI_STUDY, DAI_SERIES }; From 8a8aedb874131ab676f6727c59ebca5de3e09fc5 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 10 Oct 2024 22:25:49 -0400 Subject: [PATCH 299/337] Fix infinite useEffects calling lonk.subscribe --- src/api/lonk/useLonk.test.tsx | 8 ++- src/api/lonk/useLonk.ts | 25 +++++-- src/components/Pacs/PacsController.tsx | 91 +++++++++++++++----------- 3 files changed, 79 insertions(+), 45 deletions(-) diff --git a/src/api/lonk/useLonk.test.tsx b/src/api/lonk/useLonk.test.tsx index a3cadb76a..cb9ea0756 100644 --- a/src/api/lonk/useLonk.test.tsx +++ b/src/api/lonk/useLonk.test.tsx @@ -28,7 +28,13 @@ const TestLonkComponent: React.FC<TestLonkComponentProps> = ({ setSubscribedPacsName(result.pacs_name); setSubscribedSeriesUid(result.SeriesInstanceUID); }, - [lonk.subscribe, setSubscribedPacsName, setSubscribedSeriesUid], + [ + lonk.subscribe, + pacs_name, + SeriesInstanceUID, + setSubscribedPacsName, + setSubscribedSeriesUid, + ], ); const unsubscribe = React.useCallback(async () => { await lonk.unsubscribeAll(); diff --git a/src/api/lonk/useLonk.ts b/src/api/lonk/useLonk.ts index 9d358c261..a6035d589 100644 --- a/src/api/lonk/useLonk.ts +++ b/src/api/lonk/useLonk.ts @@ -1,5 +1,5 @@ import Client, { DownloadToken } from "@fnndsc/chrisapi"; -import useWebSocket, { Options, ReadyState } from "react-use-websocket"; +import useWebSocket, { Options } from "react-use-websocket"; import { LonkHandlers, SeriesKey } from "./types.ts"; import React from "react"; import LonkSubscriber from "./LonkSubscriber.ts"; @@ -56,19 +56,30 @@ function useLonk({ const getLonkUrl = React.useCallback(async () => { const downloadToken = await client.createDownloadToken(); return getWebsocketUrl(downloadToken); - }, [client, getWebsocketUrl]); + }, [client.createDownloadToken]); const handlers = { onDone, onProgress, onError, onMessageError }; - const [subscriber, _setSubscriber] = React.useState( + const [subscriber, setSubscriber] = React.useState( new LonkSubscriber(handlers), ); const onMessage = React.useCallback( (event: MessageEvent<any>) => { subscriber.handle(event.data); }, - [onProgress, onDone, onError], + [subscriber.handle], + ); + const onOpen = React.useCallback( + (event: WebSocketEventMap["open"]) => { + // when the websocket connection (re-)opens, (re-)initialize the + // LonkSubscriber instance so that React.useEffect which specify + // the subscriber in their depdencency arrays get (re-)triggered. + setSubscriber(new LonkSubscriber(handlers)); + options.onOpen?.(event); + }, + [options.onOpen], ); const hook = useWebSocket(getLonkUrl, { ...options, + onOpen, onError: onWebsocketError, onMessage, }); @@ -76,12 +87,14 @@ function useLonk({ const subscribe = React.useCallback( (pacs_name: string, SeriesInstanceUID: string) => subscriber.subscribe(pacs_name, SeriesInstanceUID, hook), - [subscriber, hook], + // N.B.: hook must not be in the dependency array, because it changes + // each time the websocket sends/receives data. + [subscriber.subscribe], ); const unsubscribeAll = React.useCallback( () => subscriber.unsubscribeAll(hook), - [subscriber, hook], + [subscriber.unsubscribeAll], ); return { diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index f7862bb36..6354d42c0 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -418,47 +418,58 @@ const PacsController: React.FC<PacsControllerProps> = ({ const lonk = useLonk({ client: chrisClient, - onDone(pacs_name: string, SeriesInstanceUID: string) { - updateReceiveState(pacs_name, SeriesInstanceUID, (draft) => { - draft.done = true; - }); - }, - onProgress(pacs_name: string, SeriesInstanceUID: string, ndicom: number) { - updateReceiveState(pacs_name, SeriesInstanceUID, (draft) => { - draft.receivedCount = ndicom; - }); - }, - onError(pacs_name: string, SeriesInstanceUID: string, error: string) { - updateReceiveState(pacs_name, SeriesInstanceUID, (draft) => { - draft.errors.push(error); - }); - const desc = getSeriesDescriptionOr(pacs_name, SeriesInstanceUID); - message.error( - <>There was an error while receiving the series "{desc}"</>, - ); - }, - onMessageError(data: any, error: string) { - console.error("LONK message error", error, data); - message.error( - <> - A <em>LONK</em> error occurred, please check the console. - </>, - ); - }, + onDone: React.useCallback( + (pacs_name: string, SeriesInstanceUID: string) => + updateReceiveState(pacs_name, SeriesInstanceUID, (draft) => { + draft.done = true; + }), + [updateReceiveState], + ), + onProgress: React.useCallback( + (pacs_name: string, SeriesInstanceUID: string, ndicom: number) => + updateReceiveState(pacs_name, SeriesInstanceUID, (draft) => { + draft.receivedCount = ndicom; + }), + [updateReceiveState], + ), + onError: React.useCallback( + (pacs_name: string, SeriesInstanceUID: string, error: string) => { + updateReceiveState(pacs_name, SeriesInstanceUID, (draft) => { + draft.errors.push(error); + }); + const desc = getSeriesDescriptionOr(pacs_name, SeriesInstanceUID); + message.error( + <>There was an error while receiving the series "{desc}"</>, + ); + }, + [updateReceiveState, getSeriesDescriptionOr, message.error], + ), + onMessageError: React.useCallback( + (data: any, error: string) => { + console.error("LONK message error", error, data); + message.error( + <> + A <em>LONK</em> error occurred, please check the console. + </>, + ); + }, + [message.error], + ), retryOnError: true, reconnectAttempts: 3, reconnectInterval: 3000, - shouldReconnect(e) { - return e.code < 400 || e.code > 499; - }, - onReconnectStop() { - setWsError(<>The WebSocket is disconnected.</>); - }, - onWebsocketError() { - message.error( - <>There was an error with the WebSocket. Reconnecting…</>, - ); - }, + shouldReconnect: errorCodeIs4xx, + onReconnectStop: React.useCallback( + () => setWsError(<>The WebSocket is disconnected.</>), + [setWsError], + ), + onWebsocketError: React.useCallback( + () => + message.error( + <>There was an error with the WebSocket. Reconnecting…</>, + ), + [message.error], + ), }); // ======================================== @@ -640,5 +651,9 @@ const PacsController: React.FC<PacsControllerProps> = ({ ); }; +function errorCodeIs4xx(e: { code: number }) { + return e.code < 400 || e.code > 499; +} + export type { PacsControllerProps }; export default PacsController; From c0001cd00ce2489eae22afb0b06d64e62e9e6661 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 10 Oct 2024 23:33:16 -0400 Subject: [PATCH 300/337] Add tests --- .../Pacs/components/PacsStudiesView.test.tsx | 156 +++++++-- .../Pacs/components/PacsStudiesView.tsx | 11 +- .../Pacs/components/SeriesList.test.tsx | 22 ++ src/components/Pacs/components/SeriesList.tsx | 156 +-------- .../Pacs/components/SeriesRow.test.tsx | 78 +++++ src/components/Pacs/components/SeriesRow.tsx | 155 +++++++++ .../Pacs/components/testData/remind.ts | 318 ++++++++++++++++++ 7 files changed, 715 insertions(+), 181 deletions(-) create mode 100644 src/components/Pacs/components/SeriesList.test.tsx create mode 100644 src/components/Pacs/components/SeriesRow.test.tsx create mode 100644 src/components/Pacs/components/SeriesRow.tsx create mode 100644 src/components/Pacs/components/testData/remind.ts diff --git a/src/components/Pacs/components/PacsStudiesView.test.tsx b/src/components/Pacs/components/PacsStudiesView.test.tsx index a04fa754b..eda3ca2fc 100644 --- a/src/components/Pacs/components/PacsStudiesView.test.tsx +++ b/src/components/Pacs/components/PacsStudiesView.test.tsx @@ -1,41 +1,147 @@ -import { describe, it, vi, expect } from "vitest"; -import { PacsStudyState, SeriesPullState } from "../types"; +import { describe, expect, it, test, vi } from "vitest"; +import { PacsSeriesState, PacsStudyState, SeriesPullState } from "../types"; import { DAI_SERIES, DAI_STUDY } from "./testData/dai.ts"; -import { render } from "@testing-library/react"; +import { render, screen } from "@testing-library/react"; import PacsStudiesView from "./PacsStudiesView.tsx"; import { DEFAULT_PREFERENCES } from "../defaultPreferences.ts"; +import REMIND_STUDIES from "./testData/remind.ts"; + +test("First study should be expanded if there is only one study", async () => { + const studies: PacsStudyState[] = [ + { + info: DAI_STUDY, + series: [ + { + errors: [], + info: DAI_SERIES, + receivedCount: 0, + inCube: null, + pullState: SeriesPullState.NOT_CHECKED, + }, + ], + }, + ]; + const onRetrieve = vi.fn(); + const onStudyExpand = vi.fn(); + + render( + <PacsStudiesView + preferences={DEFAULT_PREFERENCES} + studies={studies} + onRetrieve={onRetrieve} + expandedStudyUids={[]} + onStudyExpand={onStudyExpand} + />, + ); + expect(onStudyExpand).toHaveBeenCalledOnce(); + expect(onStudyExpand.mock.lastCall?.[0]).toStrictEqual([ + studies[0].info.StudyInstanceUID, + ]); +}); describe("'Pull Study' button", () => { - it("expands first study if there is only one study", async () => { - const studies: PacsStudyState[] = [ - { - info: DAI_STUDY, - series: [ - { - errors: [], - info: DAI_SERIES, - receivedCount: 0, - inCube: null, - pullState: SeriesPullState.NOT_CHECKED, - }, - ], - }, - ]; + it("should be clickable if not expanded, and should call both `onRetrieve` and `onStudyExpand` when clicked", async () => { + const studies: PacsStudyState[] = remindStartingState(); + // Start off with the first study expanded and all of their series + // pending check for existence in CUBE. + const initiallyExpandedStudyUids = [studies[0].info.StudyInstanceUID]; + studies[0].series = studies[0].series.map((state) => ({ + ...state, + pullState: SeriesPullState.CHECKING, + })); const onRetrieve = vi.fn(); const onStudyExpand = vi.fn(); - render( <PacsStudiesView preferences={DEFAULT_PREFERENCES} studies={studies} - onRetrieve={onRetrieve} - expandedStudyUids={[]} + expandedStudyUids={initiallyExpandedStudyUids} onStudyExpand={onStudyExpand} + onRetrieve={onRetrieve} />, ); - expect(onStudyExpand).toHaveBeenCalledOnce(); - expect(onStudyExpand.mock.lastCall?.[0]).toStrictEqual([ - studies[0].info.StudyInstanceUID, - ]); + const pullStudyButtons = screen.getAllByTitle("Pull study"); + expect(pullStudyButtons).toHaveLength(studies.length); + const loadingIcons = screen.getAllByLabelText("loading"); + expect( + // First "Pull Study" button should contain a loading indicator, + // because its series are currently `SeriesPullState.CHECKING` + loadingIcons.find((ele) => pullStudyButtons[0].contains(ele)), + ).toBeTruthy(); + expect( + // Second "Pull Study" button should not contain a loading indicator, + // because it is not expanded. + loadingIcons.find((ele) => pullStudyButtons[1].contains(ele)), + ).toBeUndefined(); + pullStudyButtons[1].click(); + await expect.poll(() => onRetrieve).toHaveBeenCalledOnce(); + expect(onRetrieve).toHaveBeenCalledWith({ + patientID: studies[1].info.PatientID, + studyInstanceUID: studies[1].info.StudyInstanceUID, + }); + await expect.poll(() => onStudyExpand).toHaveBeenCalledOnce(); + expect(onStudyExpand).toHaveBeenCalledWith( + initiallyExpandedStudyUids.concat([studies[1].info.StudyInstanceUID]), + ); }); + + it.each([ + [ + { + pullState: SeriesPullState.CHECKING, + }, + ], + [ + { + pullState: SeriesPullState.WAITING_OR_COMPLETE, + inCube: null, + }, + ], + [ + { + pullState: SeriesPullState.PULLING, + }, + ], + [ + { + pullState: SeriesPullState.CHECKING, + }, + ], + ])( + "should be loading when any series has partial state %o", + async (state: Partial<Pick<PacsSeriesState, "pullState" | "inCube">>) => { + const studies = remindStartingState(); + studies[0].series[2] = { ...studies[0].series[2], ...state }; + const onRetrieve = vi.fn(); + render( + <PacsStudiesView + preferences={DEFAULT_PREFERENCES} + studies={studies} + onRetrieve={onRetrieve} + expandedStudyUids={[studies[0].info.StudyInstanceUID]} + onStudyExpand={vi.fn()} + />, + ); + const pullStudyButtons = screen.getAllByTitle("Pull study"); + const pullStudyButton = pullStudyButtons[0]; + const loadingIcons = screen.getAllByLabelText("loading"); + expect( + // First "Pull Study" button should contain a loading indicator, + loadingIcons.find((ele) => pullStudyButton.contains(ele)), + ).toBeTruthy(); + }, + ); }); + +function remindStartingState(): PacsStudyState[] { + return REMIND_STUDIES.map(({ study, series }) => ({ + info: study, + series: series.map((info) => ({ + info, + errors: [], + receivedCount: 0, + pullState: SeriesPullState.NOT_CHECKED, + inCube: null, + })), + })); +} diff --git a/src/components/Pacs/components/PacsStudiesView.tsx b/src/components/Pacs/components/PacsStudiesView.tsx index beea71572..cf46f5219 100644 --- a/src/components/Pacs/components/PacsStudiesView.tsx +++ b/src/components/Pacs/components/PacsStudiesView.tsx @@ -46,12 +46,17 @@ const PacsStudiesView: React.FC<PacsStudiesViewProps> = ({ isLoading={ series.length === 0 ? false : !!series.find(isSeriesLoading) } - onRetrieve={() => + onRetrieve={() => { + // When a study is retrieved, we want to call both + // onStudyExpand and onRetrieve + if (expandedStudyUids && onStudyExpand) { + onStudyExpand(expandedStudyUids.concat(info.StudyInstanceUID)); + } onRetrieve({ patientID: info.PatientID, studyInstanceUID: info.StudyInstanceUID, - }) - } + }); + }} /> ), children: ( diff --git a/src/components/Pacs/components/SeriesList.test.tsx b/src/components/Pacs/components/SeriesList.test.tsx new file mode 100644 index 000000000..44f2f8bfb --- /dev/null +++ b/src/components/Pacs/components/SeriesList.test.tsx @@ -0,0 +1,22 @@ +import { expect, test, vi } from "vitest"; +import { SeriesPullState } from "../types.ts"; +import { render, screen } from "@testing-library/react"; +import REMIND_STUDIES from "./testData/remind.ts"; +import SeriesList from "./SeriesList.tsx"; + +test("DICOM series should be ready and then fire onRetrieve when clicked", async () => { + const onRetrieve = vi.fn(); + const states = REMIND_STUDIES[0].series.map((info) => ({ + info, + errors: [], + inCube: null, + pullState: SeriesPullState.READY, + receivedCount: 0, + })); + render(<SeriesList states={states} onRetrieve={onRetrieve} />); + const buttons = screen.getAllByRole("button"); + const thirdButton = buttons[2]; + thirdButton.click(); + await expect.poll(() => onRetrieve).toHaveBeenCalledOnce(); + expect(onRetrieve).toHaveBeenCalledWith(states[2]); +}); diff --git a/src/components/Pacs/components/SeriesList.tsx b/src/components/Pacs/components/SeriesList.tsx index 476c80c9e..3c26db067 100644 --- a/src/components/Pacs/components/SeriesList.tsx +++ b/src/components/Pacs/components/SeriesList.tsx @@ -1,20 +1,7 @@ -import { - Button, - type ButtonProps, - Descriptions, - Flex, - Grid, - List, - Progress, - Tooltip, - Typography, -} from "antd"; -import { type PacsSeriesState, SeriesPullState } from "../types.ts"; -import ModalityBadges from "./ModalityBadges.tsx"; -import { ImportOutlined, WarningFilled } from "@ant-design/icons"; -import styles from "./SeriesList.module.css"; +import { List } from "antd"; +import type { PacsSeriesState } from "../types.ts"; import React from "react"; -import { isSeriesLoading } from "./helpers.ts"; +import SeriesRow from "./SeriesRow.tsx"; type SeriesListProps = { states: PacsSeriesState[]; @@ -22,143 +9,6 @@ type SeriesListProps = { onRetrieve?: (state: PacsSeriesState) => void; }; -type SeriesRowProps = PacsSeriesState & { - showUid?: boolean; - onRetrieve?: () => void; -}; - -const SeriesRow: React.FC<SeriesRowProps> = ({ - info, - errors, - pullState, - inCube, - receivedCount, - showUid, - onRetrieve, -}) => { - const isLoading = React.useMemo( - () => isSeriesLoading({ pullState, inCube }), - [pullState, inCube], - ); - - const tooltipTitle = React.useMemo(() => { - if (errors.length > 0) { - return <>Error: {errors[0]}</>; - } - if (pullState === SeriesPullState.NOT_CHECKED) { - return <>Not ready.</>; - } - if (pullState === SeriesPullState.CHECKING) { - return <>Checking availability…</>; - } - if (pullState === SeriesPullState.READY) { - return ( - <> - Pull "{info.SeriesDescription}" into <em>ChRIS</em>. - </> - ); - } - if (pullState === SeriesPullState.PULLING) { - return <>Receiving…</>; - } - if (inCube === null) { - return <>Waiting...</>; - } - return ( - <> - This series is available in <em>ChRIS</em>. - </> - ); - }, [errors, info, pullState, inCube]); - - const buttonColor = React.useMemo((): ButtonProps["color"] => { - if (errors.length > 0) { - return "danger"; - } - if (pullState === SeriesPullState.READY) { - return "primary"; - } - return "default"; - }, [errors, pullState]); - - const percentDone = React.useMemo(() => { - if (inCube) { - return 100; - } - if (pullState === SeriesPullState.WAITING_OR_COMPLETE) { - return 99; - } - return ( - (99 * receivedCount) / - (info.NumberOfSeriesRelatedInstances || Number.POSITIVE_INFINITY) - ); - }, [inCube, pullState, receivedCount, info.NumberOfSeriesRelatedInstances]); - - return ( - <Flex - wrap - vertical={false} - align="center" - justify="space-between" - gap={0} - className={`${styles.seriesRow} ${Grid.useBreakpoint().xl && styles.xl}`} - > - <div className={styles.modality}> - <ModalityBadges modalities={info.Modality} /> - </div> - <div className={styles.description}> - <Typography.Text ellipsis={true}> - {info.SeriesDescription.trim()} - </Typography.Text> - </div> - <div className={styles.fileCount}> - <Typography.Text className={styles.fileCount}> - {info.NumberOfSeriesRelatedInstances === 1 - ? "1 file" - : `${info.NumberOfSeriesRelatedInstances === null ? "?" : info.NumberOfSeriesRelatedInstances} files`} - </Typography.Text> - </div> - <div className={styles.progress}> - {/* TODO Progress 100% text color should be changed from dark blue */} - <Progress - type="line" - format={(n) => `${Math.round(n ?? 0)}%`} - percent={percentDone} - status={ - errors.length > 0 ? "exception" : inCube ? "success" : "normal" - } - /> - </div> - <div className={styles.pullButton}> - <Tooltip placement="left" title={tooltipTitle}> - <Button - loading={isLoading} - disabled={pullState !== SeriesPullState.READY} - color={buttonColor} - onClick={onRetrieve} - > - {/* TODO Button width is different if isLoading */} - {errors.length > 1 ? ( - <WarningFilled /> - ) : isLoading ? ( - <></> - ) : ( - <ImportOutlined /> - )} - </Button> - </Tooltip> - </div> - {showUid && ( - <Descriptions className={styles.seriesInstanceUid}> - <Descriptions.Item label="SeriesInstanceUID"> - {info.SeriesInstanceUID} - </Descriptions.Item> - </Descriptions> - )} - </Flex> - ); -}; - const SeriesList: React.FC<SeriesListProps> = ({ states, showUid, diff --git a/src/components/Pacs/components/SeriesRow.test.tsx b/src/components/Pacs/components/SeriesRow.test.tsx new file mode 100644 index 000000000..ca802e2a1 --- /dev/null +++ b/src/components/Pacs/components/SeriesRow.test.tsx @@ -0,0 +1,78 @@ +import { describe, it, expect, vi } from "vitest"; +import SeriesRow, { type SeriesRowProps } from "./SeriesRow.tsx"; +import { render, screen } from "@testing-library/react"; +import { DAI_SERIES } from "./testData/dai.ts"; +import { type PacsSeriesState, SeriesPullState } from "../types.ts"; +import { PACSSeries } from "@fnndsc/chrisapi"; + +const DEFAULT_STATE: PacsSeriesState = { + info: DAI_SERIES, + errors: [], + pullState: SeriesPullState.NOT_CHECKED, + inCube: null, + receivedCount: 0, +}; + +describe("'Pull Series' button", () => { + it.each([ + [ + { + pullState: SeriesPullState.CHECKING, + }, + ], + [ + { + pullState: SeriesPullState.PULLING, + }, + ], + [ + { + pullState: SeriesPullState.WAITING_OR_COMPLETE, + inCube: null, + }, + ], + ])( + "should be loading", + async ( + state: Partial<Omit<SeriesRowProps, "info" | "showUid" | "onRetrieve">>, + ) => { + const props = { ...DEFAULT_STATE, ...state }; + render(<SeriesRow {...props} />); + const button = screen.getByRole("button"); + expect(button.getAttribute("color")).toBe("default"); + const loadingIcon = screen.getByLabelText("loading"); + expect(button.contains(loadingIcon)).toBe(true); + }, + ); + + it("should be done pulling", async () => { + const props = { + ...DEFAULT_STATE, + pullState: SeriesPullState.WAITING_OR_COMPLETE, + inCube: new PACSSeries("https://example.com/api/v1/pacs/series/5/", { + token: "abc123", + }), + receivedCount: DEFAULT_STATE.info + .NumberOfSeriesRelatedInstances as number, + }; + render(<SeriesRow {...props} />); + const button = screen.getByRole("button"); + expect(button.getAttribute("color")).toBe("default"); + }); + + it("should be waiting at 99% while CUBE task to register the DICOM series is pending", async () => { + const props = { + ...DEFAULT_STATE, + pullState: SeriesPullState.WAITING_OR_COMPLETE, + inCube: null, + receivedCount: DEFAULT_STATE.info + .NumberOfSeriesRelatedInstances as number, + }; + render(<SeriesRow {...props} />); + const button = screen.getByRole("button"); + expect(button.getAttribute("color")).toBe("default"); + const loadingIcon = screen.getByLabelText("loading"); + expect(button.contains(loadingIcon)).toBe(true); + expect(screen.getByText("99%")).toBeInTheDocument(); + }); +}); diff --git a/src/components/Pacs/components/SeriesRow.tsx b/src/components/Pacs/components/SeriesRow.tsx new file mode 100644 index 000000000..f35b6ddf9 --- /dev/null +++ b/src/components/Pacs/components/SeriesRow.tsx @@ -0,0 +1,155 @@ +import { PacsSeriesState, SeriesPullState } from "../types.ts"; +import React from "react"; +import { isSeriesLoading } from "./helpers.ts"; +import { + Button, + ButtonProps, + Descriptions, + Flex, + Grid, + Progress, + Tooltip, + Typography, +} from "antd"; +import styles from "./SeriesList.module.css"; +import ModalityBadges from "./ModalityBadges.tsx"; +import { ImportOutlined, WarningFilled } from "@ant-design/icons"; + +type SeriesRowProps = PacsSeriesState & { + showUid?: boolean; + onRetrieve?: () => void; +}; + +const SeriesRow: React.FC<SeriesRowProps> = ({ + info, + errors, + pullState, + inCube, + receivedCount, + showUid, + onRetrieve, +}) => { + const isLoading = React.useMemo( + () => isSeriesLoading({ pullState, inCube }), + [pullState, inCube], + ); + + const tooltipTitle = React.useMemo(() => { + if (errors.length > 0) { + return <>Error: {errors[0]}</>; + } + if (pullState === SeriesPullState.NOT_CHECKED) { + return <>Not ready.</>; + } + if (pullState === SeriesPullState.CHECKING) { + return <>Checking availability…</>; + } + if (pullState === SeriesPullState.READY) { + return ( + <> + Pull "{info.SeriesDescription}" into <em>ChRIS</em>. + </> + ); + } + if (pullState === SeriesPullState.PULLING) { + return <>Receiving…</>; + } + if (inCube === null) { + return <>Waiting...</>; + } + return ( + <> + This series is available in <em>ChRIS</em>. + </> + ); + }, [errors, info, pullState, inCube]); + + const buttonColor = React.useMemo((): ButtonProps["color"] => { + if (errors.length > 0) { + return "danger"; + } + if (pullState === SeriesPullState.READY) { + return "primary"; + } + return "default"; + }, [errors, pullState]); + + const percentDone = React.useMemo(() => { + if (inCube) { + return 100; + } + if (pullState === SeriesPullState.WAITING_OR_COMPLETE) { + return 99; + } + return ( + (99 * receivedCount) / + (info.NumberOfSeriesRelatedInstances || Number.POSITIVE_INFINITY) + ); + }, [inCube, pullState, receivedCount, info.NumberOfSeriesRelatedInstances]); + + return ( + <Flex + wrap + vertical={false} + align="center" + justify="space-between" + gap={0} + className={`${styles.seriesRow} ${Grid.useBreakpoint().xl && styles.xl}`} + > + <div className={styles.modality}> + <ModalityBadges modalities={info.Modality} /> + </div> + <div className={styles.description}> + <Typography.Text ellipsis={true}> + {info.SeriesDescription.trim()} + </Typography.Text> + </div> + <div className={styles.fileCount}> + <Typography.Text className={styles.fileCount}> + {info.NumberOfSeriesRelatedInstances === 1 + ? "1 file" + : `${info.NumberOfSeriesRelatedInstances === null ? "?" : info.NumberOfSeriesRelatedInstances} files`} + </Typography.Text> + </div> + <div className={styles.progress}> + <Progress + type="line" + format={(n) => `${Math.round(n ?? 0)}%`} + percent={percentDone} + status={ + errors.length > 0 ? "exception" : inCube ? "success" : "normal" + } + /> + </div> + <div className={styles.pullButton}> + <Tooltip placement="left" title={tooltipTitle}> + <Button + loading={isLoading} + disabled={pullState !== SeriesPullState.READY} + color={buttonColor} + onClick={onRetrieve} + > + {/* TODO Button width is different if isLoading */} + {errors.length > 1 ? ( + <WarningFilled /> + ) : isLoading ? ( + <></> + ) : ( + <ImportOutlined /> + )} + </Button> + </Tooltip> + </div> + {showUid && ( + <Descriptions className={styles.seriesInstanceUid}> + <Descriptions.Item label="SeriesInstanceUID"> + {info.SeriesInstanceUID} + </Descriptions.Item> + </Descriptions> + )} + </Flex> + ); +}; + +export type { SeriesRowProps }; +export default SeriesRow; diff --git a/src/components/Pacs/components/testData/remind.ts b/src/components/Pacs/components/testData/remind.ts new file mode 100644 index 000000000..94de5de7d --- /dev/null +++ b/src/components/Pacs/components/testData/remind.ts @@ -0,0 +1,318 @@ +import { StudyAndSeries } from "../../../../api/pfdcm/models.ts"; + +const REMIND_STUDIES: ReadonlyArray<StudyAndSeries> = [ + { + study: { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + ModalitiesInStudy: "MR\\SEG\\US", + StudyDescription: "Intraop", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.296457429224646492865587946336300319226", + NumberOfStudyRelatedSeries: 7, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + series: [ + { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + SeriesDate: new Date(2007, 2, 8), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + Modality: "MR", + StudyDescription: "Intraop", + SeriesDescription: "3D_AX_T1_precontrast", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.296457429224646492865587946336300319226", + SeriesInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.196263483769985307058907929198160856331", + NumberOfSeriesRelatedInstances: 176, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + SeriesDate: new Date(2007, 2, 8), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + Modality: "MR", + StudyDescription: "Intraop", + SeriesDescription: "2D_AX_T2_FLAIR", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.296457429224646492865587946336300319226", + SeriesInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.128134097836608447545606883174310323519", + NumberOfSeriesRelatedInstances: 74, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + SeriesDate: new Date(2007, 2, 8), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + Modality: "US", + StudyDescription: "Intraop", + SeriesDescription: "US_pre_dura", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.296457429224646492865587946336300319226", + SeriesInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.95314485457128412592248919688824142597", + NumberOfSeriesRelatedInstances: 1, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + SeriesDate: new Date(2007, 2, 8), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + Modality: "SEG", + StudyDescription: "Intraop", + SeriesDescription: "tumor_residual seg - MR ref: 2D_AX_T2_FLAIR", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.296457429224646492865587946336300319226", + SeriesInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.206657195335953324371356600554221913476", + NumberOfSeriesRelatedInstances: 1, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + SeriesDate: new Date(2007, 2, 8), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + Modality: "MR", + StudyDescription: "Intraop", + SeriesDescription: "2D_AX_T2_BLADE", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.296457429224646492865587946336300319226", + SeriesInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.150626935733334738403360637524565939970", + NumberOfSeriesRelatedInstances: 70, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + SeriesDate: new Date(2007, 2, 8), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + Modality: "US", + StudyDescription: "Intraop", + SeriesDescription: "US_pre_imri", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.296457429224646492865587946336300319226", + SeriesInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.190917077277426833412602956837317094217", + NumberOfSeriesRelatedInstances: 1, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + SeriesDate: new Date(2007, 2, 8), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + Modality: "US", + StudyDescription: "Intraop", + SeriesDescription: "US_post_dura", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.296457429224646492865587946336300319226", + SeriesInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.339448507477226772617616220052572153109", + NumberOfSeriesRelatedInstances: 1, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + ], + }, + { + study: { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + ModalitiesInStudy: "MR\\SEG", + StudyDescription: "Preop", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.18473209367186901845307845336434276052", + NumberOfStudyRelatedSeries: 4, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + series: [ + { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + SeriesDate: new Date(2007, 2, 8), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + Modality: "MR", + StudyDescription: "Preop", + SeriesDescription: "3D_AX_T1_postcontrast", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.18473209367186901845307845336434276052", + SeriesInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.43670003352813769538878303243732046742", + NumberOfSeriesRelatedInstances: 176, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + SeriesDate: new Date(2007, 2, 8), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + Modality: "SEG", + StudyDescription: "Preop", + SeriesDescription: "tumor seg - MR ref: 2D_AX_T2_FLAIR", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.18473209367186901845307845336434276052", + SeriesInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.73475684818739340078664911389232338988", + NumberOfSeriesRelatedInstances: 1, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + SeriesDate: new Date(2007, 2, 8), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + Modality: "MR", + StudyDescription: "Preop", + SeriesDescription: "3D_AX_T2_SPACE", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.18473209367186901845307845336434276052", + SeriesInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.300117359631342126173918428968995787084", + NumberOfSeriesRelatedInstances: 192, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + { + SpecificCharacterSet: "ISO_IR 100", + StudyDate: new Date(1982, 11, 25), + SeriesDate: new Date(2007, 2, 8), + AccessionNumber: "no value provided for 0008,0050", + RetrieveAETitle: "TCIA", + Modality: "MR", + StudyDescription: "Preop", + SeriesDescription: "2D_AX_T2_FLAIR", + PatientName: "ReMIND-042", + PatientID: "ReMIND-042", + PatientBirthDate: null, + PatientSex: "no value provided for 0010,0040", + PatientAge: "no value provided for 0010,1010", + ProtocolName: "no value provided for 0018,1030", + AcquisitionProtocolName: "no value provided for 0018,9423", + AcquisitionProtocolDescription: "no value provided for 0018,9424", + StudyInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.18473209367186901845307845336434276052", + SeriesInstanceUID: + "1.3.6.1.4.1.14519.5.2.1.43182747523173116841423691014813896790", + NumberOfSeriesRelatedInstances: 32, + PerformedStationAETitle: "no value provided for 0040,0241", + }, + ], + }, +]; + +export default REMIND_STUDIES; From 4ede58bf71a90d4bbddfe3212ff24b3e689d9e3e Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 10 Oct 2024 23:35:29 -0400 Subject: [PATCH 301/337] Delete example.test.ts --- src/example.test.ts | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 src/example.test.ts diff --git a/src/example.test.ts b/src/example.test.ts deleted file mode 100644 index f38c31d12..000000000 --- a/src/example.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { test, expect } from "vitest"; - -test("example test, delete me when a real test is added", () => { - expect(1).toBe(1); -}); From 2ca52275f54db545835eb5e71d2faa098159f20e Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 10 Oct 2024 23:42:03 -0400 Subject: [PATCH 302/337] Make CUBE_POLL_INTERVAL_MS configurable via environment variable --- .env | 3 +++ .env.production | 2 ++ docker-entrypoint.sh | 2 ++ src/components/Pacs/PacsController.tsx | 3 ++- 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.env b/.env index 778314434..cfc768867 100644 --- a/.env +++ b/.env @@ -35,6 +35,9 @@ VITE_PFDCM_URL="http://localhost:4005" # VITE_ACKEE_SERVER="http://localhost:3050" # VITE_ACKEE_DOMAIN_ID="lol-lol-lol" +# How often to poll CUBE, in milliseconds. +VITE_CUBE_POLL_INTERVAL_MS=2000 + VITE_SOURCEMAP='false' # URI for support requests diff --git a/.env.production b/.env.production index 57e1e9353..d391e4ddd 100644 --- a/.env.production +++ b/.env.production @@ -13,6 +13,8 @@ VITE_OHIF_URL="ea1cf042-73f0-43a1-93da-86ff93e5ac19" VITE_ACKEE_SERVER="79a96963-2e17-405e-94bd-4f2433e5cce8" VITE_ACKEE_DOMAIN_ID="e8fe722b-986c-4aaf-ba04-c10d21e4aca1" +VITE_CUBE_POLL_INTERVAL_MS="ca4bef0b-95c9-4a02-abda-590b51b9b07e" + VITE_ALPHA_FEATURES='production' VITE_SOURCEMAP='false' diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index eb717cb1d..204de02e4 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -45,6 +45,7 @@ find -type d -exec mkdir -p "$target/{}" \; # set default values CHRIS_STORE_URL="${CHRIS_STORE_URL-https://cube.chrisproject.org/api/v1/}" +CUBE_POLL_INTERVAL_MS="${CUBE_POLL_INTERVAL_MS-2000}" # OHIF_URL, ACKEE_SERVER, ACKEE_DOMAIN_ID default values are empty # required values @@ -66,6 +67,7 @@ find -type f -exec sh -c "cat '{}' \ | sed 's#$VITE_OHIF_URL#$OHIF_URL#g' \ | sed 's#$VITE_ACKEE_SERVER#$ACKEE_SERVER#g' \ | sed 's#$VITE_ACKEE_DOMAIN_ID#$ACKEE_DOMAIN_ID#g' \ + | sed 's#$VITE_CUBE_POLL_INTERVAL_MS#$CUBE_POLL_INTERVAL_MS#g' \ > $target/{}" \; # run specified command diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index 6354d42c0..5d93388ba 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -316,7 +316,8 @@ const PacsController: React.FC<PacsControllerProps> = ({ }, enabled: state.done, retry: 300, - retryDelay: 2000, // TODO use environment variable + retryDelay: + parseInt(import.meta.env.VITE_CUBE_POLL_INTERVAL_MS) || 2000, })), [receiveState, chrisClient.getPACSSeriesList], ), From 909518c1bc15b4217f42cf71bffc75226c8b49ca Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Mon, 14 Oct 2024 14:27:21 -0400 Subject: [PATCH 303/337] feat: Cleaner and maintenable d3 tree --- src/components/FeedTree/Controls.tsx | 9 +- src/components/FeedTree/FeedGraph.tsx | 14 +- src/components/FeedTree/FeedTree.tsx | 496 +++++++++--------- src/components/FeedTree/Node.tsx | 23 +- src/components/FeedTree/ParentComponent.tsx | 29 +- .../FeedTree/TransitionGroupWrapper.tsx | 2 +- src/components/FeedTree/data.ts | 75 +-- src/components/Feeds/FeedView.tsx | 20 +- .../NewLibrary/components/LibraryTable.tsx | 4 +- src/components/PipelinesCopy/Tree.tsx | 5 +- src/store/feed/feedSlice.ts | 42 +- src/store/feed/types.ts | 15 - 12 files changed, 325 insertions(+), 409 deletions(-) diff --git a/src/components/FeedTree/Controls.tsx b/src/components/FeedTree/Controls.tsx index 055c49e4c..39494dc69 100644 --- a/src/components/FeedTree/Controls.tsx +++ b/src/components/FeedTree/Controls.tsx @@ -1,11 +1,12 @@ import { + MenuToggle, + type MenuToggleElement, Select, SelectList, SelectOption, - MenuToggle, - MenuToggleElement, } from "@patternfly/react-core"; -import React, { useState } from "react"; +import type React from "react"; +import { useState } from "react"; export type FeedTreeScaleType = "time" | "size"; @@ -49,7 +50,7 @@ export const NodeScaleDropdown = ({ isOpen={open} onSelect={(_: any, label: any) => { const type = Array.from(labels.keys()).find( - (type) => labels.get(type) == label, + (type) => labels.get(type) === label, ); if (type) { onChange(type); diff --git a/src/components/FeedTree/FeedGraph.tsx b/src/components/FeedTree/FeedGraph.tsx index 30bb39981..aa9e0f1b4 100644 --- a/src/components/FeedTree/FeedGraph.tsx +++ b/src/components/FeedTree/FeedGraph.tsx @@ -16,11 +16,15 @@ import useSize from "./useSize"; interface IFeedProps { onNodeClick: (node: PluginInstance) => void; + currentLayout: boolean; + changeLayout: () => void; } -const FeedGraph: React.FC<IFeedProps> = ({ onNodeClick }) => { - const dispatch = useAppDispatch(); - const currentLayout = useAppSelector((state) => state.feed.currentLayout); +const FeedGraph: React.FC<IFeedProps> = ({ + onNodeClick, + currentLayout, + changeLayout, +}) => { const pluginInstances = useAppSelector( (state) => state.instance.pluginInstances, ); @@ -118,9 +122,7 @@ const FeedGraph: React.FC<IFeedProps> = ({ onNodeClick }) => { label="3D" labelOff="2D" isChecked={currentLayout} - onChange={() => { - dispatch(setFeedLayout()); - }} + onChange={changeLayout} /> </div> </div> diff --git a/src/components/FeedTree/FeedTree.tsx b/src/components/FeedTree/FeedTree.tsx index 758e10f55..87081b40a 100644 --- a/src/components/FeedTree/FeedTree.tsx +++ b/src/components/FeedTree/FeedTree.tsx @@ -1,3 +1,4 @@ +import type { PluginInstance } from "@fnndsc/chrisapi"; import { Switch, TextInput } from "@patternfly/react-core"; import { type HierarchyPointLink, @@ -5,139 +6,135 @@ import { hierarchy, tree, } from "d3-hierarchy"; -import { type Selection, select } from "d3-selection"; +import { select } from "d3-selection"; import { type ZoomBehavior, zoom as d3Zoom, zoomIdentity } from "d3-zoom"; -import { isEqual } from "lodash"; -import React, { - useCallback, - useContext, - useEffect, - useRef, - useState, -} from "react"; -import { - setFeedLayout, - setSearchFilter, - setTranslate, -} from "../../store/feed/feedSlice"; -import type { FeedTreeProp } from "../../store/feed/types"; -import { useAppDispatch, useAppSelector } from "../../store/hooks"; +import { useContext, useEffect, useRef, useCallback } from "react"; +import { useImmer } from "use-immer"; import { ThemeContext } from "../DarkTheme/useTheme"; import { RotateLeft, RotateRight } from "../Icons"; import { type FeedTreeScaleType, NodeScaleDropdown } from "./Controls"; import Link from "./Link"; import NodeWrapper from "./Node"; +import type { TSID } from "./ParentComponent"; import TransitionGroupWrapper from "./TransitionGroupWrapper"; -import type TreeNodeDatum from "./data"; -import type { OwnProps, Point } from "./data"; +import type { TreeNodeDatum } from "./data"; import useSize from "./useSize"; -type FeedTreeFeature = - | "scale_enabled" - | "scale_type" - | "collapsible" - | "toggleLabel" - | "search"; - -type FeedTreeState = { - d3: { - translate: Point; - scale: number; - }; +// Constants +const NODE_SIZE = { x: 120, y: 80 }; +const SCALE_EXTENT = { min: 0.1, max: 1.5 }; +const INITIAL_SCALE = 1; +const SEPARATION = { + siblings: 0.75, + nonSiblings: 2.0, +}; +const SVG_CLASS_NAME = "feed-tree__svg"; +const GRAPH_CLASS_NAME = "feed-tree__graph"; + +// Feature Enum for Switch Controls +enum Feature { + TOGGLE_LABELS = "toggleLabels", + SCALE_ENABLED = "scale_enabled", + SCALE_TYPE = "scale_type", + ORIENTATION = "orientation", + SEARCH_BOX = "searchBox", +} + +// Interface Definitions +interface FeedTreeProps { + onNodeClick: (node: PluginInstance) => void; + tsIds?: TSID; + data: TreeNodeDatum[]; + changeLayout: () => void; + currentLayout: boolean; +} + +interface State { overlayScale: { enabled: boolean; type: FeedTreeScaleType; }; - collapsible: boolean; - toggleLabel: boolean; - search: boolean; -}; - -function calculateD3Geometry(nextProps: OwnProps, feedTreeProp: FeedTreeProp) { - let scale = nextProps.zoom; - if (nextProps.zoom > nextProps.scaleExtent.max) { - scale = nextProps.scaleExtent.max; - } else if (nextProps.zoom < nextProps.scaleExtent.min) { - scale = nextProps.scaleExtent.min; - } - return { - translate: feedTreeProp.translate, - scale, + switchState: { + toggleLabels: boolean; + searchBox: boolean; + searchFilter: string; + orientation: "vertical" | "horizontal"; }; -} - -function getInitialState( - props: OwnProps, - feedTreeProp: FeedTreeProp, -): FeedTreeState { - return { - d3: calculateD3Geometry(props, feedTreeProp), - overlayScale: { - enabled: false, - type: "time", - }, - collapsible: false, - toggleLabel: false, - search: false, + treeState: { + translate: { + x: number; + y: number; + }; }; } -const svgClassName = "feed-tree__svg"; -const graphClassName = "feed-tree__graph"; +// Initial State Function +const getInitialState = (): State => ({ + overlayScale: { + enabled: false, + type: "time", + }, + switchState: { + toggleLabels: false, + searchBox: false, + searchFilter: "", + orientation: "vertical", + }, + treeState: { + translate: { + x: 0, + y: 0, + }, + }, +}); -const FeedTree: React.FC<OwnProps> = ({ - data, - zoom = 1, - scaleExtent = { min: 0.1, max: 1.5 }, - nodeSize = { x: 120, y: 80 }, - separation, - tsIds, - changeOrientation, +// FeedTree Component +const FeedTree = ({ onNodeClick, -}) => { - const { isDarkTheme } = useContext(ThemeContext); - const dispatch = useAppDispatch(); + tsIds, + data, + changeLayout, + currentLayout, +}: FeedTreeProps) => { const divRef = useRef<HTMLDivElement>(null); - const { feedTreeProp, currentLayout, searchFilter } = useAppSelector( - (state) => state.feed, - ); - const [feedTree, setFeedTree] = useState<{ - nodes?: HierarchyPointNode<TreeNodeDatum>[]; - links?: HierarchyPointLink<TreeNodeDatum>[]; - }>({ - nodes: [], - links: [], - }); const size = useSize(divRef); - const { translate, orientation } = feedTreeProp; - const [feedState, setFeedState] = useState<FeedTreeState>( - getInitialState( - { - data, - zoom, - scaleExtent, - nodeSize, - separation, - tsIds, - changeOrientation, - onNodeClick, - }, - feedTreeProp, - ), + const [state, updateState] = useImmer(getInitialState()); + const { treeState, switchState, overlayScale } = state; + const { isDarkTheme } = useContext(ThemeContext); + + // Refs for SVG and G elements + const svgRef = useRef<SVGSVGElement>(null); + const gRef = useRef<SVGGElement>(null); + const zoomBehaviorRef = useRef<ZoomBehavior<SVGSVGElement, unknown> | null>( + null, ); - const { scale } = feedState.d3; + + // Update Tree Translation based on Size and Orientation + useEffect(() => { + if (size?.width && size.height) { + updateState((draft) => { + if (switchState.orientation === "vertical") { + draft.treeState.translate = { x: size.width / 2, y: 90 }; + } else { + draft.treeState.translate = { x: 180, y: size.height / 3 }; + } + }); + } + }, [size, updateState, switchState.orientation]); + + // Generate Tree Structure const generateTree = useCallback( (data: TreeNodeDatum[]) => { const d3Tree = tree<TreeNodeDatum>() .nodeSize( - orientation === "horizontal" - ? [nodeSize.y, nodeSize.x] - : [nodeSize.x, nodeSize.y], + switchState.orientation === "horizontal" + ? [NODE_SIZE.y, NODE_SIZE.x] + : [NODE_SIZE.x, NODE_SIZE.y], ) .separation((a, b) => a.data.parentId === b.data.parentId - ? separation.siblings - : separation.nonSiblings, + ? SEPARATION.siblings + : SEPARATION.nonSiblings, ); let nodes: HierarchyPointNode<TreeNodeDatum>[] | undefined; @@ -208,110 +205,79 @@ const FeedTree: React.FC<OwnProps> = ({ return { nodes, newLinks }; }, - [nodeSize, orientation, separation, tsIds], + [switchState.orientation, tsIds], ); - useEffect(() => { - if (size?.width) { - if (orientation === "vertical") { - dispatch(setTranslate({ x: size.width / 2, y: 90 })); - } else { - dispatch(setTranslate({ x: 180, y: size.height / 3 })); - } - } - }, [size, orientation, dispatch]); + // Generate Nodes and Links + const { nodes, newLinks: links } = generateTree(data); - useEffect(() => { - if (data && data.length > 0) { - const { nodes, newLinks: links } = generateTree(data); - setFeedTree({ nodes, links }); - } - }, [data, generateTree]); - - const bindZoomListener = () => { - const svg: Selection<SVGSVGElement, unknown, HTMLElement, any> = select( - `.${svgClassName}`, - ); - const g: Selection<SVGGElement, unknown, HTMLElement, any> = select( - `.${graphClassName}`, - ); - const zoomBehavior: ZoomBehavior<SVGSVGElement, unknown> = d3Zoom< - SVGSVGElement, - unknown - >() - .scaleExtent([scaleExtent.min, scaleExtent.max]) - .on("zoom", (event) => { - g.attr("transform", event.transform); - }); + // Handle Switch Changes + const handleChange = (feature: Feature, data?: any) => { + updateState((draft) => { + switch (feature) { + case Feature.TOGGLE_LABELS: + draft.switchState.toggleLabels = !draft.switchState.toggleLabels; + break; - svg - .call(zoomBehavior) - .call( - zoomBehavior.transform, - zoomIdentity.translate(translate.x, translate.y).scale(scale), - ); - }; + case Feature.SCALE_ENABLED: + draft.overlayScale.enabled = !draft.overlayScale.enabled; + break; - useEffect(() => { - bindZoomListener(); - }, []); + case Feature.SCALE_TYPE: + draft.overlayScale.type = data; + break; + + case Feature.ORIENTATION: + draft.switchState.orientation = data; + break; + + case Feature.SEARCH_BOX: + draft.switchState.searchBox = !draft.switchState.searchBox; + break; - const handleChange = useCallback((feature: FeedTreeFeature, data?: any) => { - setFeedState((prevState) => { - switch (feature) { - case "scale_enabled": - return { - ...prevState, - overlayScale: { - ...prevState.overlayScale, - enabled: !prevState.overlayScale.enabled, - }, - }; - case "scale_type": - return { - ...prevState, - overlayScale: { - ...prevState.overlayScale, - type: data as FeedTreeScaleType, - }, - }; - case "collapsible": - case "toggleLabel": - case "search": - return { - ...prevState, - [feature]: !prevState[feature], - }; default: - return prevState; + break; } }); - }, []); + }; - const handleNodeClick = useCallback( - (item: any) => { - onNodeClick(item); - }, - [onNodeClick], - ); + // Bind and Update Zoom Listener + const bindZoomListener = useCallback(() => { + if (!svgRef.current || !gRef.current) return; + + // Initialize Zoom Behavior if not already initialized + if (!zoomBehaviorRef.current) { + const zoomBehavior = d3Zoom<SVGSVGElement, unknown>() + .scaleExtent([SCALE_EXTENT.min, SCALE_EXTENT.max]) + .on("zoom", (event) => { + gRef.current?.setAttribute("transform", event.transform.toString()); + }); + + zoomBehaviorRef.current = zoomBehavior; + select(svgRef.current).call( + zoomBehavior, + zoomIdentity + .translate(treeState.translate.x, treeState.translate.y) + .scale(INITIAL_SCALE), + ); + } + }, [treeState.translate.x, treeState.translate.y]); - const { nodes, links } = feedTree; + // Initialize and Update Zoom Listener whenever translate changes + useEffect(() => { + bindZoomListener(); + }, [bindZoomListener]); return ( <div className="feed-tree setFlex grabbable mode_tree" ref={divRef}> - <div className="feed-tree__container"> + <div> + {/* Controls Section */} <div className="feed-tree__container--labels"> - <div - onClick={() => changeOrientation(orientation)} - className="feed-tree__orientation" - onKeyDown={(e) => { - if (e.key === "Enter" || e.key === " ") { - changeOrientation(orientation); - } - }} - > - {orientation === "vertical" ? ( + {/* Orientation Toggle */} + <div className="feed-tree__orientation"> + {switchState.orientation === "vertical" ? ( <RotateLeft + onClick={() => handleChange(Feature.ORIENTATION, "horizontal")} className="feed-tree__orientation--icon" aria-label="Rotate Left" aria-hidden="true" @@ -321,22 +287,25 @@ const FeedTree: React.FC<OwnProps> = ({ className="feed-tree__orientation--icon" aria-label="Rotate Right" aria-hidden="true" + onClick={() => handleChange(Feature.ORIENTATION, "vertical")} /> )} </div> + {/* Toggle Labels Switch */} <div className="feed-tree__control"> <Switch id="labels" label="Hide Labels" labelOff="Show Labels" - isChecked={feedState.toggleLabel} - aria-checked={feedState.toggleLabel} - onChange={() => handleChange("toggleLabel")} + isChecked={switchState.toggleLabels} + aria-checked={switchState.toggleLabels} + onChange={() => handleChange(Feature.TOGGLE_LABELS)} aria-label="Toggle label visibility" /> </div> + {/* Switch Layout Toggle */} <div className="feed-tree__control"> <Switch id="layout" @@ -344,109 +313,116 @@ const FeedTree: React.FC<OwnProps> = ({ labelOff="2D" isChecked={currentLayout} aria-checked={currentLayout} - onChange={() => dispatch(setFeedLayout())} + onChange={() => changeLayout()} aria-label="Toggle graph layout from 2D to 3D" /> </div> + {/* Scale Nodes Switch and Dropdown */} <div className="feed-tree__control feed-tree__individual-scale"> <Switch id="individual-scale" label="Scale Nodes On" labelOff="Scale Nodes Off" - isChecked={feedState.overlayScale.enabled} - aria-checked={feedState.overlayScale.enabled} - onChange={() => handleChange("scale_enabled")} + isChecked={overlayScale.enabled} + aria-checked={overlayScale.enabled} + onChange={() => handleChange(Feature.SCALE_ENABLED)} aria-label="Scale nodes" /> - {feedState.overlayScale.enabled && ( + {overlayScale.enabled && ( <div className="dropdown-wrap"> <NodeScaleDropdown - selected={feedState.overlayScale.type} - onChange={(type) => handleChange("scale_type", type)} + selected={overlayScale.type} + onChange={(type) => handleChange(Feature.SCALE_TYPE, type)} /> </div> )} </div> + {/* Search Box Switch */} <div className="feed-tree__control"> <Switch id="search" label="Search On" labelOff="Search Off" - isChecked={feedState.search} - aria-checked={feedState.search} - onChange={() => handleChange("search")} + isChecked={switchState.searchBox} + aria-checked={switchState.searchBox} + onChange={() => handleChange(Feature.SEARCH_BOX)} aria-label="Toggle search a node in the tree" /> </div> + {/* Search Input */} <div className="feed-tree__control"> - {feedState.search && ( + {switchState.searchBox && ( <TextInput - value={searchFilter.value} - onChange={(_, value: string) => - dispatch(setSearchFilter(value.trim())) + value={switchState.searchFilter} + onChange={(_event, value: string) => + updateState((draft) => { + draft.switchState.searchFilter = value; + }) } + aria-label="Search nodes" + placeholder="Search..." /> )} </div> </div> - </div> - {translate.x > 0 && translate.y > 0 && ( - <svg - focusable="true" - className={svgClassName} - width="100%" - height="100%" - role="img" - aria-label="Feed Tree Visualization" - > - <TransitionGroupWrapper - component="g" - className={graphClassName} - transform={`translate(${translate.x},${translate.y}) scale(${scale})`} + {/* Tree Visualization */} + {treeState.translate.x > 0 && treeState.translate.y > 0 && ( + <svg + ref={svgRef} + focusable="true" + className={SVG_CLASS_NAME} + width="100%" + height="100%" + role="img" + aria-label="Feed Tree Visualization" > - {links?.map((linkData, i) => ( - <Link - key={`link${i}`} - orientation={orientation} - linkData={linkData} - isDarkTheme={isDarkTheme} - /> - ))} - - {nodes?.map(({ data, x, y, parent }) => ( - <NodeWrapper - key={`node${data.id}`} - data={data} - position={{ x, y }} - parent={parent} - onNodeClick={handleNodeClick} - orientation={orientation} - toggleLabel={feedState.toggleLabel} - overlayScale={ - feedState.overlayScale.enabled - ? feedState.overlayScale.type - : undefined - } - /> - ))} - </TransitionGroupWrapper> - </svg> - )} + <g ref={gRef} className={GRAPH_CLASS_NAME}> + <TransitionGroupWrapper + className={GRAPH_CLASS_NAME} + component="g" + transform={`translate(${treeState.translate.x},${treeState.translate.y}) scale(${INITIAL_SCALE})`} + > + {/* Render Links */} + {links?.map((linkData, i) => ( + <Link + key={`link${ + // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> + i + }`} + orientation={switchState.orientation} + linkData={linkData} + isDarkTheme={isDarkTheme} + /> + ))} + + {/* Render Nodes */} + {nodes?.map(({ data, x, y, parent }) => ( + <NodeWrapper + key={`node${data.id}`} + data={data} + position={{ x, y }} + parent={parent} + onNodeClick={(item) => onNodeClick(item)} + orientation={switchState.orientation} + toggleLabel={switchState.toggleLabels} + overlayScale={ + overlayScale.enabled ? overlayScale.type : undefined + } + searchFilter={switchState.searchFilter} + /> + ))} + </TransitionGroupWrapper> + </g> + </svg> + )} + </div> </div> ); }; -const FeedTreeMemoed = React.memo( - FeedTree, - (prevProps: OwnProps, nextProps: OwnProps) => - isEqual(prevProps.data, nextProps.data) && - prevProps.zoom === nextProps.zoom && - isEqual(prevProps.tsIds, nextProps.tsIds), -); - -export default FeedTreeMemoed; +export default FeedTree; diff --git a/src/components/FeedTree/Node.tsx b/src/components/FeedTree/Node.tsx index 83a207b82..8d0a8d76d 100644 --- a/src/components/FeedTree/Node.tsx +++ b/src/components/FeedTree/Node.tsx @@ -26,8 +26,7 @@ import DeleteNode from "../DeleteNode"; import { PipelineProvider } from "../PipelinesCopy/context"; import type { FeedTreeScaleType } from "./Controls"; import DropdownMenu from "./DropdownMenu"; -import type TreeNodeDatum from "./data"; -import type { Point } from "./data"; +import type { Point, TreeNodeDatum } from "./data"; type NodeWrapperProps = { tsNodes?: PluginInstance[]; @@ -38,6 +37,7 @@ type NodeWrapperProps = { orientation: "horizontal" | "vertical"; overlayScale?: FeedTreeScaleType; toggleLabel: boolean; + searchFilter: string; }; type NodeProps = NodeWrapperProps & { @@ -70,6 +70,7 @@ const Node = (props: NodeProps) => { status, currentId, overlaySize, + searchFilter, } = props; const [api, contextHolder] = notification.useNotification(); @@ -81,8 +82,6 @@ const Node = (props: NodeProps) => { const selectedPlugin = useAppSelector((state) => { return state.instance.selectedPlugin; }); - const searchFilter = useAppSelector((state) => state.feed.searchFilter); - const { value } = searchFilter; const applyNodeTransform = useCallback((transform: string, opacity = 1) => { select(nodeRef.current) @@ -120,9 +119,11 @@ const Node = (props: NodeProps) => { } if ( - value.length > 0 && - (data.item?.data.plugin_name?.toLowerCase().includes(value.toLowerCase()) || - data.item?.data.title?.toLowerCase().includes(value.toLowerCase())) + searchFilter.length > 0 && + (data.item?.data.plugin_name + ?.toLowerCase() + .includes(searchFilter.toLowerCase()) || + data.item?.data.title?.toLowerCase().includes(searchFilter.toLowerCase())) ) { statusClass = "search"; } @@ -225,7 +226,13 @@ const Node = (props: NodeProps) => { message: "Preparing to initiate the zipping process...", }); } - }, [api, mutation.isSuccess, mutation.isError, mutation.isPending]); + }, [ + api, + mutation.error, + mutation.isSuccess, + mutation.isError, + mutation.isPending, + ]); const textLabel = ( <g diff --git a/src/components/FeedTree/ParentComponent.tsx b/src/components/FeedTree/ParentComponent.tsx index 8d9092b00..9d5a49627 100644 --- a/src/components/FeedTree/ParentComponent.tsx +++ b/src/components/FeedTree/ParentComponent.tsx @@ -1,15 +1,16 @@ import React from "react"; -import { setFeedTreeProp } from "../../store/feed/feedSlice"; -import { useAppDispatch, useAppSelector } from "../../store/hooks"; +import { useAppSelector } from "../../store/hooks"; import { Alert } from "../Antd"; import { SpinContainer } from "../Common"; import FeedTree from "./FeedTree"; -import type TreeNodeDatum from "./data"; +import type { TreeNodeDatum } from "./data"; import { getFeedTree, getTsNodes } from "./data"; import "./FeedTree.css"; interface ParentComponentProps { onNodeClick: (node: any) => void; + changeLayout: () => void; + currentLayout: boolean; } export type TSID = { @@ -17,20 +18,18 @@ export type TSID = { }; const ParentComponent = (props: ParentComponentProps) => { - const { onNodeClick } = props; + const { onNodeClick, changeLayout, currentLayout } = props; const pluginInstances = useAppSelector( (state) => state.instance.pluginInstances, ); const { data: instances, error, loading } = pluginInstances; const [data, setData] = React.useState<TreeNodeDatum[]>([]); const [tsIds, setTsIds] = React.useState<TSID>(); - const dispatch = useAppDispatch(); React.useEffect(() => { if (instances && instances.length > 0) { const data = getFeedTree(instances); - //Get Topological joins as well getTsNodes(instances).then((nodes) => { setTsIds(nodes); }); @@ -38,27 +37,13 @@ const ParentComponent = (props: ParentComponentProps) => { } }, [instances]); - const changeOrientation = (orientation: string) => { - dispatch(setFeedTreeProp(orientation)); - }; - return data && data.length > 0 ? ( <FeedTree data={data} tsIds={tsIds} onNodeClick={onNodeClick} - separation={ - instances && instances.length > 15 - ? { - siblings: 1.0, - nonSiblings: 2.0, - } - : { - siblings: 0.75, - nonSiblings: 1.0, - } - } - changeOrientation={changeOrientation} + changeLayout={changeLayout} + currentLayout={currentLayout} /> ) : loading ? ( <SpinContainer title="Loading the tree" /> diff --git a/src/components/FeedTree/TransitionGroupWrapper.tsx b/src/components/FeedTree/TransitionGroupWrapper.tsx index 1acf8ab16..d66ec7da3 100644 --- a/src/components/FeedTree/TransitionGroupWrapper.tsx +++ b/src/components/FeedTree/TransitionGroupWrapper.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import type React from "react"; import Marker from "./Marker"; type TransitionGroupWrapperProps = { diff --git a/src/components/FeedTree/data.ts b/src/components/FeedTree/data.ts index e29fd07fe..f440b6b8e 100644 --- a/src/components/FeedTree/data.ts +++ b/src/components/FeedTree/data.ts @@ -20,13 +20,8 @@ export interface Point { y: number; } -export default interface TreeNodeDatum extends Datum { +export interface TreeNodeDatum extends Datum { children: TreeNodeDatum[]; - __rd3t: { - id: string; - depth: number; - collapsed: boolean; - }; } export interface Separation { @@ -34,58 +29,46 @@ export interface Separation { nonSiblings: number; } -export interface OwnProps { - tsIds?: TSID; - data: TreeNodeDatum[]; - onNodeClick: (node: any) => void; - translate?: Point; - scaleExtent: { - min: number; - max: number; - }; - zoom: number; - nodeSize: { - x: number; - y: number; - }; - separation: Separation; - changeOrientation: (orientation: string) => void; -} - export const getFeedTree = (items: PluginInstance[]) => { - const tree = []; - const mappedArr: { - [key: string]: TreeNodeDatum; - } = {}; + const tree: TreeNodeDatum[] = []; - for (const item of items) { - const id = item.data.id; + const mappedArr = new Map<number, TreeNodeDatum>(); + const childrenMap = new Map<number, TreeNodeDatum[]>(); - mappedArr[id] = { + items.forEach((item) => { + const id = item.data.id; + const previous_id: number | null = + item.data.previous_id !== undefined ? item.data.previous_id : null; + const node: TreeNodeDatum = { id: id, name: item.data.title || item.data.plugin_name, parentId: item.data.previous_id, item: item, children: [], - __rd3t: { - id: "", - depth: 0, - collapsed: false, - }, }; - } - - for (const id in mappedArr) { - const mappedElem = mappedArr[id]; - if (mappedElem.parentId) { - const parentId = mappedElem.parentId; - if (parentId && mappedArr[parentId] && mappedArr[parentId].children) - mappedArr[parentId].children.push(mappedElem); + mappedArr.set(id, node); + if (previous_id !== null) { + const parentNode = mappedArr.get(previous_id); + if (parentNode) { + parentNode.children.push(node); + } else { + // If parent hasn't been processed yet, store the child in childrenMap + if (!childrenMap.has(previous_id)) { + childrenMap.set(previous_id, []); + } + childrenMap.get(previous_id)!.push(node); + } } else { - tree.push(mappedElem); + tree.push(node); } - } + if (childrenMap.has(id)) { + // If there are children waiting for this node, add them + const children = childrenMap.get(id)!; + node.children.push(...children); + childrenMap.delete(id); + } + }); return tree; }; diff --git a/src/components/Feeds/FeedView.tsx b/src/components/Feeds/FeedView.tsx index c8945dec4..de5f35933 100644 --- a/src/components/Feeds/FeedView.tsx +++ b/src/components/Feeds/FeedView.tsx @@ -2,7 +2,7 @@ import type { Feed, PluginInstance } from "@fnndsc/chrisapi"; import { Tooltip } from "@patternfly/react-core"; import { PanelGroup, Panel, PanelResizeHandle } from "react-resizable-panels"; import { Typography } from "antd"; -import React, { useCallback, useEffect, useRef } from "react"; +import React, { useCallback, useEffect, useRef, useState } from "react"; import { useLocation, useNavigate, useParams } from "react-router"; import { elipses } from "../../api/common"; import type { IDrawerState } from "../../store/drawer/drawerSlice"; @@ -36,8 +36,8 @@ import "./Feeds.css"; // Import your CSS file const { Title } = Typography; const FeedView: React.FC = () => { + const [currentLayout, setCurrentLayout] = useState(false); const drawerState = useAppSelector((state) => state.drawers); - const { currentLayout } = useAppSelector((state) => state.feed); const dispatch = useAppDispatch(); const query = useSearchQueryParams(); const type = query.get("type"); @@ -115,6 +115,10 @@ const FeedView: React.FC = () => { [drawerState, dispatch], ); + const changeLayout = () => { + setCurrentLayout(!currentLayout); + }; + const TitleComponent = ( <Title level={4} style={{ marginBottom: 0, color: "white" }}> <CodeBranchIcon style={{ marginRight: "0.25em" }} /> @@ -150,9 +154,17 @@ const FeedView: React.FC = () => { > {handleDrawerAction("graph")} {!currentLayout ? ( - <ParentComponent onNodeClick={onNodeClick} /> + <ParentComponent + onNodeClick={onNodeClick} + changeLayout={changeLayout} + currentLayout={currentLayout} + /> ) : ( - <FeedGraph onNodeClick={onNodeClick} /> + <FeedGraph + currentLayout={currentLayout} + changeLayout={changeLayout} + onNodeClick={onNodeClick} + /> )} </Panel> <PanelResizeHandle className="ResizeHandle" /> diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index f5822eccc..0c7ed67cb 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -187,7 +187,9 @@ export const FolderRow: React.FC<Omit<RowProps, "type">> = (props) => { if (isLoading) { return ( <Tr> - <Skeleton width="100%" /> + <Td> + <Skeleton width="100%" /> + </Td> </Tr> ); } diff --git a/src/components/PipelinesCopy/Tree.tsx b/src/components/PipelinesCopy/Tree.tsx index 846ec7a6d..9c647f44b 100644 --- a/src/components/PipelinesCopy/Tree.tsx +++ b/src/components/PipelinesCopy/Tree.tsx @@ -107,15 +107,12 @@ const Tree = (props: TreeProps) => { setData(tree); setLoading(false); } - }, [selectedPipeline?.[currentPipeline.data.id]]); + }, [currentPipeline.data.id, selectedPipeline?.[currentPipeline.data.id]]); React.useEffect(() => { - //@ts-ignore if (size?.width) { setTranslate({ - //@ts-ignore x: size.width / 2.5, - //@ts-ignore y: size.height / 6.5, }); } diff --git a/src/store/feed/feedSlice.ts b/src/store/feed/feedSlice.ts index e7c9eecbe..69d36a3e9 100644 --- a/src/store/feed/feedSlice.ts +++ b/src/store/feed/feedSlice.ts @@ -9,18 +9,6 @@ const initialState: IFeedState = { error: "", loading: false, }, - currentLayout: false, - feedTreeProp: { - orientation: "vertical", - translate: { - x: 0, - y: 0, - }, - }, - searchFilter: { - value: "", - status: false, - }, showToolbar: false, }; @@ -34,40 +22,18 @@ const feedSlice = createSlice({ state.currentFeed.error = ""; state.currentFeed.loading = false; }, - setFeedTreeProp(state, action: PayloadAction<string>) { - const currentOrientation = action.payload; - state.feedTreeProp.orientation = - currentOrientation === "horizontal" ? "vertical" : "horizontal"; - }, - setTranslate(state, action: PayloadAction<{ x: number; y: number }>) { - state.feedTreeProp.translate = action.payload; - }, - setFeedLayout(state) { - state.currentLayout = !state.currentLayout; + setShowToolbar(state, action: PayloadAction<boolean>) { + state.showToolbar = action.payload; }, + resetFeed(_state) { return initialState; }, - setSearchFilter(state, action: PayloadAction<string>) { - state.searchFilter.value = action.payload; - state.searchFilter.status = !state.searchFilter.status; - }, - setShowToolbar(state, action: PayloadAction<boolean>) { - state.showToolbar = action.payload; - }, }, }); // Export the actions -export const { - getFeedSuccess, - setFeedTreeProp, - setTranslate, - setFeedLayout, - resetFeed, - setSearchFilter, - setShowToolbar, -} = feedSlice.actions; +export const { getFeedSuccess, resetFeed, setShowToolbar } = feedSlice.actions; // Export the reducer export default feedSlice.reducer; diff --git a/src/store/feed/types.ts b/src/store/feed/types.ts index 0350921bd..bb268b968 100644 --- a/src/store/feed/types.ts +++ b/src/store/feed/types.ts @@ -18,26 +18,11 @@ export interface FeedsResponsePayload { totalCount: number; } -export interface FeedTreeProp { - orientation: "horizontal" | "vertical"; - translate: { - x: number; - y: number; - }; -} - export interface FeedResource { [id: string]: { details: any }; } export interface IFeedState { currentFeed: FeedPayload; - feedTreeProp: FeedTreeProp; - currentLayout: boolean; - - searchFilter: { - status: boolean; - value: string; - }; showToolbar: boolean; } From aa0f978b5c6ad2731c27dab468238d6b9903bafd Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 15 Oct 2024 16:08:29 -0400 Subject: [PATCH 304/337] fix: Resize the terminal correctly --- src/components/FeedTree/FeedTree.tsx | 290 ++++++++++----------- src/components/Feeds/FeedView.tsx | 3 + src/components/NodeDetails/LogTerminal.tsx | 59 +---- src/components/NodeDetails/NodeDetails.css | 12 + 4 files changed, 170 insertions(+), 194 deletions(-) diff --git a/src/components/FeedTree/FeedTree.tsx b/src/components/FeedTree/FeedTree.tsx index 87081b40a..dab940c6e 100644 --- a/src/components/FeedTree/FeedTree.tsx +++ b/src/components/FeedTree/FeedTree.tsx @@ -142,9 +142,7 @@ const FeedTree = ({ let newLinks: HierarchyPointLink<TreeNodeDatum>[] = []; if (data && data.length > 0) { - const rootNode = d3Tree( - hierarchy(data[0], (d) => (d.__rd3t?.collapsed ? null : d.children)), - ); + const rootNode = d3Tree(hierarchy(data[0], (d) => d.children)); nodes = rootNode.descendants(); links = rootNode.links(); @@ -270,157 +268,155 @@ const FeedTree = ({ return ( <div className="feed-tree setFlex grabbable mode_tree" ref={divRef}> - <div> - {/* Controls Section */} - <div className="feed-tree__container--labels"> - {/* Orientation Toggle */} - <div className="feed-tree__orientation"> - {switchState.orientation === "vertical" ? ( - <RotateLeft - onClick={() => handleChange(Feature.ORIENTATION, "horizontal")} - className="feed-tree__orientation--icon" - aria-label="Rotate Left" - aria-hidden="true" - /> - ) : ( - <RotateRight - className="feed-tree__orientation--icon" - aria-label="Rotate Right" - aria-hidden="true" - onClick={() => handleChange(Feature.ORIENTATION, "vertical")} - /> - )} - </div> - - {/* Toggle Labels Switch */} - <div className="feed-tree__control"> - <Switch - id="labels" - label="Hide Labels" - labelOff="Show Labels" - isChecked={switchState.toggleLabels} - aria-checked={switchState.toggleLabels} - onChange={() => handleChange(Feature.TOGGLE_LABELS)} - aria-label="Toggle label visibility" + {/* Controls Section */} + <div className="feed-tree__container--labels"> + {/* Orientation Toggle */} + <div className="feed-tree__orientation"> + {switchState.orientation === "vertical" ? ( + <RotateLeft + onClick={() => handleChange(Feature.ORIENTATION, "horizontal")} + className="feed-tree__orientation--icon" + aria-label="Rotate Left" + aria-hidden="true" /> - </div> - - {/* Switch Layout Toggle */} - <div className="feed-tree__control"> - <Switch - id="layout" - label="Switch Layout" - labelOff="2D" - isChecked={currentLayout} - aria-checked={currentLayout} - onChange={() => changeLayout()} - aria-label="Toggle graph layout from 2D to 3D" - /> - </div> - - {/* Scale Nodes Switch and Dropdown */} - <div className="feed-tree__control feed-tree__individual-scale"> - <Switch - id="individual-scale" - label="Scale Nodes On" - labelOff="Scale Nodes Off" - isChecked={overlayScale.enabled} - aria-checked={overlayScale.enabled} - onChange={() => handleChange(Feature.SCALE_ENABLED)} - aria-label="Scale nodes" + ) : ( + <RotateRight + className="feed-tree__orientation--icon" + aria-label="Rotate Right" + aria-hidden="true" + onClick={() => handleChange(Feature.ORIENTATION, "vertical")} /> + )} + </div> - {overlayScale.enabled && ( - <div className="dropdown-wrap"> - <NodeScaleDropdown - selected={overlayScale.type} - onChange={(type) => handleChange(Feature.SCALE_TYPE, type)} - /> - </div> - )} - </div> - - {/* Search Box Switch */} - <div className="feed-tree__control"> - <Switch - id="search" - label="Search On" - labelOff="Search Off" - isChecked={switchState.searchBox} - aria-checked={switchState.searchBox} - onChange={() => handleChange(Feature.SEARCH_BOX)} - aria-label="Toggle search a node in the tree" - /> - </div> - - {/* Search Input */} - <div className="feed-tree__control"> - {switchState.searchBox && ( - <TextInput - value={switchState.searchFilter} - onChange={(_event, value: string) => - updateState((draft) => { - draft.switchState.searchFilter = value; - }) - } - aria-label="Search nodes" - placeholder="Search..." + {/* Toggle Labels Switch */} + <div className="feed-tree__control"> + <Switch + id="labels" + label="Hide Labels" + labelOff="Show Labels" + isChecked={switchState.toggleLabels} + aria-checked={switchState.toggleLabels} + onChange={() => handleChange(Feature.TOGGLE_LABELS)} + aria-label="Toggle label visibility" + /> + </div> + + {/* Switch Layout Toggle */} + <div className="feed-tree__control"> + <Switch + id="layout" + label="Switch Layout" + labelOff="2D" + isChecked={currentLayout} + aria-checked={currentLayout} + onChange={() => changeLayout()} + aria-label="Toggle graph layout from 2D to 3D" + /> + </div> + + {/* Scale Nodes Switch and Dropdown */} + <div className="feed-tree__control feed-tree__individual-scale"> + <Switch + id="individual-scale" + label="Scale Nodes On" + labelOff="Scale Nodes Off" + isChecked={overlayScale.enabled} + aria-checked={overlayScale.enabled} + onChange={() => handleChange(Feature.SCALE_ENABLED)} + aria-label="Scale nodes" + /> + + {overlayScale.enabled && ( + <div className="dropdown-wrap"> + <NodeScaleDropdown + selected={overlayScale.type} + onChange={(type) => handleChange(Feature.SCALE_TYPE, type)} /> - )} - </div> + </div> + )} </div> - {/* Tree Visualization */} - {treeState.translate.x > 0 && treeState.translate.y > 0 && ( - <svg - ref={svgRef} - focusable="true" - className={SVG_CLASS_NAME} - width="100%" - height="100%" - role="img" - aria-label="Feed Tree Visualization" - > - <g ref={gRef} className={GRAPH_CLASS_NAME}> - <TransitionGroupWrapper - className={GRAPH_CLASS_NAME} - component="g" - transform={`translate(${treeState.translate.x},${treeState.translate.y}) scale(${INITIAL_SCALE})`} - > - {/* Render Links */} - {links?.map((linkData, i) => ( - <Link - key={`link${ - // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> - i - }`} - orientation={switchState.orientation} - linkData={linkData} - isDarkTheme={isDarkTheme} - /> - ))} - - {/* Render Nodes */} - {nodes?.map(({ data, x, y, parent }) => ( - <NodeWrapper - key={`node${data.id}`} - data={data} - position={{ x, y }} - parent={parent} - onNodeClick={(item) => onNodeClick(item)} - orientation={switchState.orientation} - toggleLabel={switchState.toggleLabels} - overlayScale={ - overlayScale.enabled ? overlayScale.type : undefined - } - searchFilter={switchState.searchFilter} - /> - ))} - </TransitionGroupWrapper> - </g> - </svg> - )} + {/* Search Box Switch */} + <div className="feed-tree__control"> + <Switch + id="search" + label="Search On" + labelOff="Search Off" + isChecked={switchState.searchBox} + aria-checked={switchState.searchBox} + onChange={() => handleChange(Feature.SEARCH_BOX)} + aria-label="Toggle search a node in the tree" + /> + </div> + + {/* Search Input */} + <div className="feed-tree__control"> + {switchState.searchBox && ( + <TextInput + value={switchState.searchFilter} + onChange={(_event, value: string) => + updateState((draft) => { + draft.switchState.searchFilter = value; + }) + } + aria-label="Search nodes" + placeholder="Search..." + /> + )} + </div> </div> + + {/* Tree Visualization */} + {treeState.translate.x > 0 && treeState.translate.y > 0 && ( + <svg + ref={svgRef} + focusable="true" + className={SVG_CLASS_NAME} + width="100%" + height="100%" + role="img" + aria-label="Feed Tree Visualization" + > + <g ref={gRef} className={GRAPH_CLASS_NAME}> + <TransitionGroupWrapper + className={GRAPH_CLASS_NAME} + component="g" + transform={`translate(${treeState.translate.x},${treeState.translate.y}) scale(${INITIAL_SCALE})`} + > + {/* Render Links */} + {links?.map((linkData, i) => ( + <Link + key={`link${ + // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> + i + }`} + orientation={switchState.orientation} + linkData={linkData} + isDarkTheme={isDarkTheme} + /> + ))} + + {/* Render Nodes */} + {nodes?.map(({ data, x, y, parent }) => ( + <NodeWrapper + key={`node${data.id}`} + data={data} + position={{ x, y }} + parent={parent} + onNodeClick={(item) => onNodeClick(item)} + orientation={switchState.orientation} + toggleLabel={switchState.toggleLabels} + overlayScale={ + overlayScale.enabled ? overlayScale.type : undefined + } + searchFilter={switchState.searchFilter} + /> + ))} + </TransitionGroupWrapper> + </g> + </svg> + )} </div> ); }; diff --git a/src/components/Feeds/FeedView.tsx b/src/components/Feeds/FeedView.tsx index de5f35933..3aea16224 100644 --- a/src/components/Feeds/FeedView.tsx +++ b/src/components/Feeds/FeedView.tsx @@ -179,6 +179,9 @@ const FeedView: React.FC = () => { order={2} defaultSize={47} minSize={20} + style={{ + overflow: "scroll", + }} > {handleDrawerAction("node")} <div className="node-block"> diff --git a/src/components/NodeDetails/LogTerminal.tsx b/src/components/NodeDetails/LogTerminal.tsx index b6965720c..d87a9b77a 100644 --- a/src/components/NodeDetails/LogTerminal.tsx +++ b/src/components/NodeDetails/LogTerminal.tsx @@ -1,6 +1,4 @@ import { LogViewer } from "@patternfly/react-log-viewer"; -import { useRef, useEffect, useState } from "react"; -import useSize from "../FeedTree/useSize"; import { useAppSelector } from "../../store/hooks"; type LogTerminalProps = { @@ -8,59 +6,26 @@ type LogTerminalProps = { }; const LogTerminal = ({ text }: LogTerminalProps) => { - const divRef = useRef<HTMLDivElement>(null); - const size = useSize(divRef); const isTerminalMaximized = useAppSelector( (state) => state.drawers.node.maximized, ); - const [terminalSize, setTerminalSize] = useState({ - width: "100%", - height: "100%", - }); - - const handleResize = () => { - if (divRef.current && size) { - const parentWidth = size.width; - const parentHeight = size.height; - const element = document.getElementById("log-viewer"); - if (element) { - setTerminalSize({ - width: `${parentWidth}px`, - height: `${parentHeight}px`, - }); - } - } + const containerStyle = { + height: isTerminalMaximized ? "100vh" : "100%", + width: "100%", + display: "flex", + flexDirection: "column" as const, + flexGrow: 1, }; - useEffect(() => { - // Call handleResize whenever window resizes - window.addEventListener("resize", handleResize); - - // Initial resize logic when component mounts - handleResize(); - - // Cleanup on unmount - return () => { - window.removeEventListener("resize", handleResize); - }; - }, [size, isTerminalMaximized]); // Ensure the effect runs when size or maximized state changes + const logViewerStyle = { + flexGrow: 1, + overflow: "auto", + }; return ( - <div - id="log-viewer" - ref={divRef} - style={{ - height: "100%", - width: "100%", - }} - > - <LogViewer - height={terminalSize.height} - width={terminalSize.width} - hasLineNumbers={false} - data={text} - /> + <div style={containerStyle}> + <LogViewer style={logViewerStyle} hasLineNumbers={false} data={text} /> </div> ); }; diff --git a/src/components/NodeDetails/NodeDetails.css b/src/components/NodeDetails/NodeDetails.css index 28b7a0784..c26831ccf 100644 --- a/src/components/NodeDetails/NodeDetails.css +++ b/src/components/NodeDetails/NodeDetails.css @@ -164,3 +164,15 @@ width: calc(100% - 40px); } } + +.pf-v5-c-log-viewer__main, +.pf-v5-c-log-viewer__list { + flex-grow: 1 !important; + overflow: auto; + +} + +.pf-v5-c-log-viewer__scroll-container{ + height:100% !important; +} + From 4da7d1b90366cce74f304236f52dd28925b58de0 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Wed, 16 Oct 2024 11:56:15 -0400 Subject: [PATCH 305/337] feat: Sticky feed header --- src/components/Feeds/FeedListView.tsx | 96 +++++++++++++++------------ src/store/cart/uploadSaga.ts | 16 +++-- 2 files changed, 63 insertions(+), 49 deletions(-) diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index b4b05b310..4fb0675a6 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -254,51 +254,57 @@ const TableSelectable: React.FC = () => { return ( <WrapperConnect titleComponent={TitleComponent}> - <PageSection style={{ paddingTop: "0.25em" }} className="feed-header"> - <div> - <FeedSearch - loading={loadingFeedState} - search={search} - searchType={searchType} - onSearch={handleFilterChange} - /> - </div> - {generatePagination(feedCount)} - <div - style={{ - display: "flex", - justifyContent: "space-between", - alignItems: "center", - }} - > - <ToggleGroup - style={{ marginRight: "0.5em" }} - aria-label="Default with single selectable" - > - <ToggleGroupItem - text="Private Feeds" - buttonId="private" - isSelected={type === "private"} - onChange={onExampleTypeChange} - isDisabled={!isLoggedIn} - /> - <ToggleGroupItem - text="Public Feeds" - buttonId="public" - isSelected={type === "public"} - onChange={onExampleTypeChange} + <PageSection + stickyOnBreakpoint={{ + default: "top", + }} + style={{ paddingTop: "0.25em", paddingBottom: "0" }} + > + <div className="feed-header"> + <div> + <FeedSearch + loading={loadingFeedState} + search={search} + searchType={searchType} + onSearch={handleFilterChange} /> - </ToggleGroup> - <CreateFeedProvider> - <PipelineProvider> - <AddNodeProvider> - <CreateFeed /> - </AddNodeProvider> - </PipelineProvider> - </CreateFeedProvider> + </div> + {generatePagination(feedCount)} + <div + style={{ + display: "flex", + justifyContent: "space-between", + alignItems: "center", + }} + > + <ToggleGroup + style={{ marginRight: "0.5em" }} + aria-label="Default with single selectable" + > + <ToggleGroupItem + text="Private Feeds" + buttonId="private" + isSelected={type === "private"} + onChange={onExampleTypeChange} + isDisabled={!isLoggedIn} + /> + <ToggleGroupItem + text="Public Feeds" + buttonId="public" + isSelected={type === "public"} + onChange={onExampleTypeChange} + /> + </ToggleGroup> + <CreateFeedProvider> + <PipelineProvider> + <AddNodeProvider> + <CreateFeed /> + </AddNodeProvider> + </PipelineProvider> + </CreateFeedProvider> + </div> </div> - </PageSection> - <PageSection style={{ paddingBlockStart: "0.5em" }}> + <Operations origin={{ type: OperationContext.FEEDS, @@ -308,9 +314,13 @@ const TableSelectable: React.FC = () => { toolbarItem: { paddingInlineStart: "0" }, toolbar: { paddingTop: "0", + paddingBottom: "0", + background: "inherit", }, }} /> + </PageSection> + <PageSection style={{ paddingBlockStart: "0.5em" }}> {loadingFeedState ? ( <LoadingTable /> ) : feedsToDisplay.length > 0 ? ( diff --git a/src/store/cart/uploadSaga.ts b/src/store/cart/uploadSaga.ts index a61be9a60..79232e902 100644 --- a/src/store/cart/uploadSaga.ts +++ b/src/store/cart/uploadSaga.ts @@ -11,12 +11,12 @@ import { setFolderUploadStatus, startUpload, } from "./cartSlice"; +import { createFeed } from "./downloadSaga"; import type { FileUploadObject, FolderUploadObject, UploadPayload, } from "./types"; -import { createFeed } from "./downloadSaga"; function createUploadChannel(config: any) { return eventChannel((emitter) => { @@ -28,12 +28,10 @@ function createUploadChannel(config: any) { }; const source = axios.CancelToken.source(); - const axiosConfig = { - headers: config.headers, - onUploadProgress, - cancelToken: source.token, ...config, + cancelToken: source.token, + onUploadProgress, }; const cancelHandler = () => { @@ -344,7 +342,13 @@ function* updateFileUploadStatus( shouldCreateFeed?: boolean, ) { const isDone = progress === 100; - const step = isDone && response ? "Upload Complete" : "Uploading..."; + + const step = + isDone && !response + ? "Server Processing..." + : isDone && response + ? "Upload Complete" + : "Uploading..."; // Invalidate the ui page if the file upload is complete isDone && !shouldCreateFeed && invalidateFunc(); From 8047e61da29271d391ce69a6dbf88af670278a1f Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Wed, 16 Oct 2024 12:55:41 -0400 Subject: [PATCH 306/337] feat: Update Deletion of Nodes --- src/components/DeleteNode/index.tsx | 123 +++++++----------- src/components/FeedTree/Node.tsx | 3 +- .../pluginInstance/pluginInstanceSlice.ts | 66 +++++++++- 3 files changed, 114 insertions(+), 78 deletions(-) diff --git a/src/components/DeleteNode/index.tsx b/src/components/DeleteNode/index.tsx index 36e9dc1ec..e2f4dcf2a 100644 --- a/src/components/DeleteNode/index.tsx +++ b/src/components/DeleteNode/index.tsx @@ -1,120 +1,93 @@ -import type { PluginInstance } from "@fnndsc/chrisapi"; -import { Button, Modal, ModalVariant } from "@patternfly/react-core"; -import { useMutation } from "@tanstack/react-query"; -import { Fragment, useEffect } from "react"; -import { fetchResource } from "../../api/common"; +import { Button, Modal, ModalVariant, Spinner } from "@patternfly/react-core"; +import { Fragment, useState } from "react"; import { useAppDispatch, useAppSelector } from "../../store/hooks"; import { getNodeOperations } from "../../store/plugin/pluginSlice"; -import { - setPluginInstancesAndSelectedPlugin, - getSelectedPlugin, -} from "../../store/pluginInstance/pluginInstanceSlice"; -import { getPluginInstanceStatusRequest } from "../../store/resources/resourceSlice"; +import { deletePluginInstance } from "../../store/pluginInstance/pluginInstanceSlice"; import { Alert } from "../Antd"; -import { SpinContainer } from "../Common"; const DeleteNode = () => { const dispatch = useAppDispatch(); - const { deleteNode: isModalOpen } = useAppSelector( - (state) => state.plugin.nodeOperations, + const isModalOpen = useAppSelector( + (state) => state.plugin.nodeOperations.deleteNode, ); const { selectedPlugin } = useAppSelector((state) => state.instance); - const currentFeed = useAppSelector((state) => state.feed.currentFeed.data); + + // Local state for delete operation + const [loading, setLoading] = useState(false); + const [success, setSuccess] = useState(false); + const [error, setError] = useState<string | null>(null); const handleDelete = async () => { if (selectedPlugin) { + setLoading(true); + setError(null); try { - const statuses = [ - "finishedSuccessfully", - "finishedWithError", - "cancelled", - ]; - const status = selectedPlugin.data.status; - - if (!statuses.includes(status)) { - throw new Error( - "Cannot delete actively running node at the moment...", - ); - } - - await selectedPlugin.delete(); - //Fetch Resources again because I don't understand how delete works in cube. It's highly inconsistent - if (currentFeed) { - const params = { limit: 15, offset: 0 }; - - const fn = currentFeed.getPluginInstances; - const boundFn = fn.bind(currentFeed); - const { resource: pluginInstances } = - await fetchResource<PluginInstance>(params, boundFn); - - const selected = pluginInstances[pluginInstances.length - 1]; - const pluginInstanceObj = { - selected, - pluginInstances, - }; - - dispatch(getSelectedPlugin(selected)); - dispatch(setPluginInstancesAndSelectedPlugin(pluginInstanceObj)); - dispatch(getPluginInstanceStatusRequest(pluginInstanceObj)); - } - } catch (e) { - if (e instanceof Error) throw new Error(e.message); + await dispatch(deletePluginInstance(selectedPlugin)).unwrap(); + setSuccess(true); + // Close the modal after a short delay + setTimeout(() => { + handleModalClose(); + }, 1500); + } catch (err) { + setError(err as string); + } finally { + setLoading(false); } - } else { - throw new Error("Please select a node to delete"); } }; - const mutation = useMutation({ - mutationFn: () => handleDelete(), - }); - - const handleModalToggle = () => { + const handleModalClose = () => { + // Reset local state when modal is closed + setLoading(false); + setSuccess(false); + setError(null); dispatch(getNodeOperations("deleteNode")); }; - useEffect(() => { - if (mutation.isSuccess) { - setTimeout(() => { - mutation.reset(); - dispatch(getNodeOperations("deleteNode")); - }, 1000); - } - }, [mutation.isSuccess]); - return ( <Modal variant={ModalVariant.small} title="Delete Selected Node" isOpen={isModalOpen} - onClose={handleModalToggle} + onClose={handleModalClose} actions={[ <Fragment key="button-actions"> <Button key="confirm" variant="primary" - onClick={() => mutation.mutate()} + onClick={handleDelete} + isDisabled={loading || success} > Confirm </Button> - <Button key="cancel" variant="primary" onClick={handleModalToggle}> + <Button key="cancel" variant="secondary" onClick={handleModalClose}> Cancel </Button> </Fragment>, ]} > <span> - {" "} Deleting a node will delete all of its descendants as well. Please - confirm if you are sure + confirm if you are sure. </span> - {mutation.isPending && <SpinContainer title="Deleting..." />} - {mutation.isError && ( - <Alert type="error" description={mutation.error.message} /> + {loading && ( + <div + style={{ marginTop: "1rem", display: "flex", alignItems: "center" }} + > + <Spinner size="lg" /> + <span style={{ marginLeft: "0.5rem" }}>Deleting...</span> + </div> + )} + {error && ( + <Alert type="error" description={error} style={{ marginTop: "1rem" }} /> )} - {mutation.isSuccess && ( - <Alert type="success" description="Deleted Successfully" /> + {success && ( + <Alert + type="success" + description="Deleted Successfully" + style={{ marginTop: "1rem" }} + /> )} </Modal> ); diff --git a/src/components/FeedTree/Node.tsx b/src/components/FeedTree/Node.tsx index 8d0a8d76d..0ff4d4f75 100644 --- a/src/components/FeedTree/Node.tsx +++ b/src/components/FeedTree/Node.tsx @@ -312,7 +312,8 @@ const NodeWrapper = (props: NodeWrapperProps) => { }); const currentId = useAppSelector((state) => { - if (state.instance.selectedPlugin?.data.id === data.id) return true; + console.log("state", state); + if (state.instance.selectedPlugin?.data.id === data?.id) return true; return false; }); diff --git a/src/store/pluginInstance/pluginInstanceSlice.ts b/src/store/pluginInstance/pluginInstanceSlice.ts index 48c1cdbc3..64c6386c5 100644 --- a/src/store/pluginInstance/pluginInstanceSlice.ts +++ b/src/store/pluginInstance/pluginInstanceSlice.ts @@ -10,7 +10,13 @@ import type { AddNodePayload, PluginInstanceObj, } from "./types"; -import { getPluginInstanceStatusRequest } from "../resources/resourceSlice"; +import { + getPluginInstanceStatusRequest, + stopFetchingPluginResources, + stopFetchingStatusResources, +} from "../resources/resourceSlice"; +import type { RootState } from "../root/applicationState"; +import type { IActionTypeParam } from "../../api/model"; // Define the initial state const initialState: IPluginInstanceState = { @@ -81,6 +87,42 @@ export const addNode = createAsyncThunk< }, ); +// Async thunk for deleting a plugin instance +export const deletePluginInstance = createAsyncThunk< + PluginInstanceObj, + PluginInstance, + { rejectValue: string; state: RootState } +>( + "pluginInstance/deletePluginInstance", + async (pluginInstance, { dispatch, getState, rejectWithValue }) => { + try { + const id = pluginInstance.data.id; + dispatch(stopFetchingPluginResources(id)); + dispatch(stopFetchingStatusResources(id)); + + await pluginInstance.delete(); + // Get the updated state + const state = getState() as RootState; + const pluginInstances = state.instance.pluginInstances.data.filter( + (instance) => instance.data, + ); + const selected = pluginInstances[pluginInstances.length - 1]; + const pluginInstanceObj = { + selected, + pluginInstances, + }; + + dispatch(getSelectedPlugin(selected)); + dispatch(getPluginInstanceStatusRequest(pluginInstanceObj)); + + return pluginInstanceObj; + } catch (error) { + const errMessage = catchError(error).error_message; + return rejectWithValue(errMessage); + } + }, +); + // Create a slice const pluginInstanceSlice = createSlice({ name: "pluginInstance", @@ -148,7 +190,27 @@ const pluginInstanceSlice = createSlice({ state.pluginInstances.data = [action.payload.selected]; } }, - ); + ) // Handle deletePluginInstance + .addCase(deletePluginInstance.pending, (state) => { + state.pluginInstances.loading = true; + state.pluginInstances.error = ""; + }) + .addCase( + deletePluginInstance.fulfilled, + (state, action: PayloadAction<PluginInstanceObj>) => { + state.pluginInstances = { + data: action.payload.pluginInstances, + error: "", + loading: false, + }; + state.selectedPlugin = action.payload.selected; + }, + ) + .addCase(deletePluginInstance.rejected, (state, action) => { + state.pluginInstances.loading = false; + state.pluginInstances.error = + action.payload || "Failed to delete plugin instance."; + }); }, }); From c7a34729d536bfc40e0ff75905454c5114fed0ce Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Wed, 16 Oct 2024 18:11:34 -0400 Subject: [PATCH 307/337] feat: Delete an active plugin instance and descendants --- src/components/FeedTree/Node.tsx | 297 ++++++++++-------- .../pluginInstance/pluginInstanceSlice.ts | 83 +++-- 2 files changed, 232 insertions(+), 148 deletions(-) diff --git a/src/components/FeedTree/Node.tsx b/src/components/FeedTree/Node.tsx index 0ff4d4f75..678bdfcfc 100644 --- a/src/components/FeedTree/Node.tsx +++ b/src/components/FeedTree/Node.tsx @@ -1,8 +1,3 @@ -import type { PluginInstance } from "@fnndsc/chrisapi"; -import { useMutation } from "@tanstack/react-query"; -import { notification } from "antd"; -import type { HierarchyPointNode } from "d3-hierarchy"; -import { select } from "d3-selection"; import { Fragment, memo, @@ -11,6 +6,12 @@ import { useEffect, useRef, } from "react"; +import { useMutation } from "@tanstack/react-query"; +import { notification } from "antd"; +import type { HierarchyPointNode } from "d3-hierarchy"; +import { select } from "d3-selection"; +import type { PluginInstance } from "@fnndsc/chrisapi"; + import ChrisAPIClient from "../../api/chrisapiclient"; import { useAppDispatch, useAppSelector } from "../../store/hooks"; import { @@ -18,6 +19,7 @@ import { setPluginInstancesAndSelectedPlugin, } from "../../store/pluginInstance/pluginInstanceSlice"; import { getPluginInstanceStatusRequest } from "../../store/resources/resourceSlice"; + import AddNodeConnect from "../AddNode/AddNode"; import { AddNodeProvider } from "../AddNode/context"; import AddPipeline from "../AddPipeline/AddPipeline"; @@ -28,6 +30,7 @@ import type { FeedTreeScaleType } from "./Controls"; import DropdownMenu from "./DropdownMenu"; import type { Point, TreeNodeDatum } from "./data"; +/** Type definitions */ type NodeWrapperProps = { tsNodes?: PluginInstance[]; data: TreeNodeDatum; @@ -46,8 +49,14 @@ type NodeProps = NodeWrapperProps & { currentId: boolean; }; +/** Constants */ const DEFAULT_NODE_CIRCLE_RADIUS = 12; +/** Helper Functions */ + +/** + * Sets the transform attribute for a node based on its orientation. + */ const setNodeTransform = ( orientation: "horizontal" | "vertical", position: Point, @@ -57,65 +66,38 @@ const setNodeTransform = ( : `translate(${position.x}, ${position.y})`; }; -const Node = (props: NodeProps) => { - const { isDarkTheme } = useContext(ThemeContext); - const nodeRef = useRef<SVGGElement>(null); - const textRef = useRef<SVGTextElement>(null); - const { - orientation, - position, - data, - onNodeClick, - toggleLabel, - status, - currentId, - overlaySize, - searchFilter, - } = props; - - const [api, contextHolder] = notification.useNotification(); - const dispatch = useAppDispatch(); - - const pluginInstances = useAppSelector( - (state) => state.instance.pluginInstances.data, - ); - const selectedPlugin = useAppSelector((state) => { - return state.instance.selectedPlugin; - }); - - const applyNodeTransform = useCallback((transform: string, opacity = 1) => { - select(nodeRef.current) - .attr("transform", transform) - .style("opacity", opacity); - select(textRef.current).attr("transform", "translate(-28, 28)"); - }, []); - - useEffect(() => { - const nodeTransform = setNodeTransform(orientation, position); - applyNodeTransform(nodeTransform); - }, [orientation, position, applyNodeTransform]); +/** + * Determines the CSS class for a node based on its status. + */ +const getStatusClass = ( + status: string | undefined, + data: TreeNodeDatum, + pluginInstances: PluginInstance[], + searchFilter: string, +): string => { + if (!status) return ""; let statusClass = ""; - if ( - status && - (status === "started" || - status === "scheduled" || - status === "registeringFiles" || - status === "created") - ) { - statusClass = "active"; - } - if (status === "waiting") { - statusClass = "queued"; - } - - if (status === "finishedSuccessfully") { - statusClass = "success"; - } - - if (status === "finishedWithError" || status === "cancelled") { - statusClass = "error"; + switch (status) { + case "started": + case "scheduled": + case "registeringFiles": + case "created": + statusClass = "active"; + break; + case "waiting": + statusClass = "queued"; + break; + case "finishedSuccessfully": + statusClass = "success"; + break; + case "finishedWithError": + case "cancelled": + statusClass = "error"; + break; + default: + break; } if ( @@ -130,7 +112,7 @@ const Node = (props: NodeProps) => { const previous_id = data.item?.data?.previous_id; if (previous_id) { - const parentNode = pluginInstances?.find( + const parentNode = pluginInstances.find( (node) => node.data.id === previous_id, ); @@ -143,9 +125,20 @@ const Node = (props: NodeProps) => { } } - // This pipeline code is temporary and will be moved someplace else - const alreadyAvailableInstances = pluginInstances; - async function fetchPipelines() { + return statusClass; +}; + +/** + * Custom hook to handle pipeline mutation logic. + */ +const usePipelineMutation = ( + selectedPlugin: PluginInstance | undefined, + pluginInstances: PluginInstance[], + dispatch: any, +) => { + const [api, contextHolder] = notification.useNotification(); + + const fetchPipelines = async () => { const client = ChrisAPIClient.getClient(); try { @@ -160,27 +153,20 @@ const Node = (props: NodeProps) => { const { id } = pipeline.data; //@ts-ignore - // We do not need to explicitly provide the nodes_info property. This change needs to be made - // in the js client const workflow = await client.createWorkflow(id, { - previous_plugin_inst_id: selectedPlugin?.data.id, // Ensure selectedPlugin is defined + previous_plugin_inst_id: selectedPlugin?.data.id, }); - const pluginInstances = await workflow.getPluginInstances({ + const pluginInstancesResponse = await workflow.getPluginInstances({ limit: 1000, }); - const instanceItems = pluginInstances.getItems(); + const instanceItems = pluginInstancesResponse.getItems(); - if ( - instanceItems && - instanceItems.length > 0 && - alreadyAvailableInstances - ) { + if (instanceItems && instanceItems.length > 0) { const firstInstance = instanceItems[instanceItems.length - 1]; - const completeList = [...alreadyAvailableInstances, ...instanceItems]; + const completeList = [...pluginInstances, ...instanceItems]; - // Assuming reactDispatch, getSelectedPlugin, getPluginInstanceStatusSuccess, and getPluginInstanceStatusRequest are defined elsewhere dispatch(getSelectedPlugin(firstInstance)); const pluginInstanceObj = { @@ -201,27 +187,23 @@ const Node = (props: NodeProps) => { // biome-ignore lint/complexity/noUselessCatch: <explanation> throw error; } - } + }; const mutation = useMutation({ - mutationFn: () => fetchPipelines(), + mutationFn: fetchPipelines, }); useEffect(() => { - if (mutation.isSuccess || mutation.isError) { - if (mutation.isSuccess) { - api.success({ - message: "Zipping process started...", - }); - mutation.reset(); - } - if (mutation.isError) { - api.error({ - message: mutation.error.message, - }); - } - } - if (mutation.isPending) { + if (mutation.isSuccess) { + api.success({ + message: "Zipping process started...", + }); + mutation.reset(); + } else if (mutation.isError) { + api.error({ + message: (mutation.error as Error).message, + }); + } else if (mutation.isPending) { api.info({ message: "Preparing to initiate the zipping process...", }); @@ -232,8 +214,81 @@ const Node = (props: NodeProps) => { mutation.isSuccess, mutation.isError, mutation.isPending, + mutation.reset, ]); + return { mutation, contextHolder }; +}; + +/** Components */ + +/** + * Modals component to render all modal components. + */ +const Modals = () => ( + <> + <AddNodeProvider> + <AddNodeConnect /> + </AddNodeProvider> + <DeleteNode /> + <PipelineProvider> + <AddPipeline /> + </PipelineProvider> + </> +); + +/** + * Node component representing a single node in the tree. + */ +const Node = (props: NodeProps) => { + const { isDarkTheme } = useContext(ThemeContext); + const nodeRef = useRef<SVGGElement>(null); + const textRef = useRef<SVGTextElement>(null); + const { + orientation, + position, + data, + onNodeClick, + toggleLabel, + status, + currentId, + overlaySize, + searchFilter, + } = props; + + const dispatch = useAppDispatch(); + const pluginInstances = useAppSelector( + (state) => state.instance.pluginInstances.data, + ); + const selectedPlugin = useAppSelector( + (state) => state.instance.selectedPlugin, + ); + + const { mutation, contextHolder } = usePipelineMutation( + selectedPlugin, + pluginInstances, + dispatch, + ); + + const applyNodeTransform = useCallback((transform: string, opacity = 1) => { + select(nodeRef.current) + .attr("transform", transform) + .style("opacity", opacity); + select(textRef.current).attr("transform", "translate(-28, 28)"); + }, []); + + useEffect(() => { + const nodeTransform = setNodeTransform(orientation, position); + applyNodeTransform(nodeTransform); + }, [orientation, position, applyNodeTransform]); + + const statusClass = getStatusClass( + status, + data, + pluginInstances, + searchFilter, + ); + const textLabel = ( <g style={{ @@ -251,17 +306,7 @@ const Node = (props: NodeProps) => { return ( <Fragment> - <> - {/* Note this modals are fired from the dropdown menu in the tree*/} - <AddNodeProvider> - <AddNodeConnect /> - </AddNodeProvider> - {/* Graph Node Container is missing */} - <DeleteNode /> - <PipelineProvider> - <AddPipeline /> - </PipelineProvider> - </> + <Modals /> {contextHolder} {/* biome-ignore lint/a11y/useKeyWithClickEvents: <explanation> */} <g @@ -294,8 +339,7 @@ const Node = (props: NodeProps) => { r={DEFAULT_NODE_CIRCLE_RADIUS * overlaySize} /> )} - - {statusClass === "search" ? textLabel : toggleLabel ? textLabel : null} + {(statusClass === "search" || toggleLabel) && textLabel} </g> </Fragment> ); @@ -303,26 +347,29 @@ const Node = (props: NodeProps) => { const NodeMemoed = memo(Node); +/** + * NodeWrapper component to connect the Node component with Redux state. + */ const NodeWrapper = (props: NodeWrapperProps) => { const { data, overlayScale } = props; + const status = useAppSelector((state) => { if (data.id && state.resource.pluginInstanceStatus[data.id]) { return state.resource.pluginInstanceStatus[data.id].status; } + return undefined; }); const currentId = useAppSelector((state) => { - console.log("state", state); - if (state.instance.selectedPlugin?.data.id === data?.id) return true; - return false; + return state.instance.selectedPlugin?.data.id === data.id; }); - let scale: number | undefined; // undefined scale is treated as no indvidual scaling + let scale: number | undefined; if (overlayScale === "time") { - const instanceData = props.data.item?.data; + const instanceData = data.item?.data; if (instanceData) { - const start = new Date(instanceData?.start_date); - const end = new Date(instanceData?.end_date); + const start = new Date(instanceData.start_date); + const end = new Date(instanceData.end_date); scale = Math.log10(end.getTime() - start.getTime()) / 2; } } @@ -337,18 +384,12 @@ const NodeWrapper = (props: NodeWrapperProps) => { ); }; -export default memo( - NodeWrapper, - (prevProps: NodeWrapperProps, nextProps: NodeWrapperProps) => { - if ( - prevProps.data !== nextProps.data || - prevProps.position !== nextProps.position || - prevProps.parent !== nextProps.parent || - prevProps.toggleLabel !== nextProps.toggleLabel || - prevProps.orientation !== nextProps.orientation - ) { - return false; - } - return true; - }, -); +export default memo(NodeWrapper, (prevProps, nextProps) => { + return ( + prevProps.data === nextProps.data && + prevProps.position === nextProps.position && + prevProps.parent === nextProps.parent && + prevProps.toggleLabel === nextProps.toggleLabel && + prevProps.orientation === nextProps.orientation + ); +}); diff --git a/src/store/pluginInstance/pluginInstanceSlice.ts b/src/store/pluginInstance/pluginInstanceSlice.ts index 64c6386c5..8b409743e 100644 --- a/src/store/pluginInstance/pluginInstanceSlice.ts +++ b/src/store/pluginInstance/pluginInstanceSlice.ts @@ -1,22 +1,21 @@ +import type { Feed, PluginInstance } from "@fnndsc/chrisapi"; import { - createSlice, - createAsyncThunk, type PayloadAction, + createAsyncThunk, + createSlice, } from "@reduxjs/toolkit"; -import type { Feed, PluginInstance } from "@fnndsc/chrisapi"; import { catchError, fetchResource } from "../../api/common"; -import type { - IPluginInstanceState, - AddNodePayload, - PluginInstanceObj, -} from "./types"; import { getPluginInstanceStatusRequest, stopFetchingPluginResources, stopFetchingStatusResources, } from "../resources/resourceSlice"; import type { RootState } from "../root/applicationState"; -import type { IActionTypeParam } from "../../api/model"; +import type { + AddNodePayload, + IPluginInstanceState, + PluginInstanceObj, +} from "./types"; // Define the initial state const initialState: IPluginInstanceState = { @@ -87,6 +86,8 @@ export const addNode = createAsyncThunk< }, ); +// Async thunk for deleting a plugin instance + // Async thunk for deleting a plugin instance export const deletePluginInstance = createAsyncThunk< PluginInstanceObj, @@ -97,24 +98,34 @@ export const deletePluginInstance = createAsyncThunk< async (pluginInstance, { dispatch, getState, rejectWithValue }) => { try { const id = pluginInstance.data.id; - dispatch(stopFetchingPluginResources(id)); - dispatch(stopFetchingStatusResources(id)); + // Get the current pluginInstances from the state + const state = getState() as RootState; + const pluginInstances = state.instance.pluginInstances.data; + // Get all descendant ids + const descendantIds = getAllDescendantIds(pluginInstances, id); + // Stop fetching resources for all descendants + descendantIds.forEach((descendantId) => { + dispatch(stopFetchingPluginResources(descendantId)); + dispatch(stopFetchingStatusResources(descendantId)); + }); + // Delete the plugin instance (assuming it will delete its descendants) await pluginInstance.delete(); - // Get the updated state - const state = getState() as RootState; - const pluginInstances = state.instance.pluginInstances.data.filter( - (instance) => instance.data, + + // Filter out all instances with ids in descendantIds + const remainingPluginInstances = pluginInstances.filter( + (instance) => + instance.data && !descendantIds.includes(instance.data.id), ); - const selected = pluginInstances[pluginInstances.length - 1]; + + const selected = + remainingPluginInstances[remainingPluginInstances.length - 1]; + const pluginInstanceObj = { selected, - pluginInstances, + pluginInstances: remainingPluginInstances, }; - dispatch(getSelectedPlugin(selected)); - dispatch(getPluginInstanceStatusRequest(pluginInstanceObj)); - return pluginInstanceObj; } catch (error) { const errMessage = catchError(error).error_message; @@ -224,3 +235,35 @@ export const { // Export the reducer export default pluginInstanceSlice.reducer; + +// Helper function to get all descendant IDs +function getAllDescendantIds( + instances: PluginInstance[], + parentId: number, +): number[] { + const parentIdToChildrenMap = new Map<number, PluginInstance[]>(); + + instances.forEach((instance) => { + const previous_id = instance.data.previous_id; + + if (previous_id !== undefined && previous_id !== null) { + if (!parentIdToChildrenMap.has(previous_id)) { + parentIdToChildrenMap.set(previous_id, []); + } + parentIdToChildrenMap.get(previous_id)!.push(instance); + } + }); + + const result: number[] = []; + + function helper(currentId: number) { + result.push(currentId); + const children = parentIdToChildrenMap.get(currentId) || []; + for (const child of children) { + helper(child.data.id); + } + } + + helper(parentId); + return result; +} From f2e54018407872118be2e41deb253439678e2361 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 17 Oct 2024 11:21:01 -0400 Subject: [PATCH 308/337] feat: Handle loading state in the filebrowser --- .../FeedOutputBrowser/FileBrowser.tsx | 171 ++++++++++-------- src/components/FeedTree/ParentComponent.tsx | 29 +-- 2 files changed, 113 insertions(+), 87 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 4849e5260..4a6378caf 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -9,6 +9,7 @@ import { Button, Grid, Tooltip, + Skeleton, } from "@patternfly/react-core"; import { Table, Tbody, Th, Thead, Tr } from "@patternfly/react-table"; import { useEffect } from "react"; @@ -246,82 +247,71 @@ const FileBrowser = (props: FileBrowserProps) => { </Tr> </Thead> <Tbody> - {filesMap?.map( - (resource: FileBrowserFolderFile, index) => { - return ( - <FileRow - rowIndex={index} - key={resource.data.fname} - resource={resource} - name={getFileName(resource)} - date={resource.data.creation_date} - owner={resource.data.owner_username} - size={resource.data.fsize} - computedPath={additionalKey} - handleFolderClick={() => { - return; - }} - handleFileClick={() => { - toggleAnimation(); - dispatch( - setSelectedFile( - resource as FileBrowserFolderFile, - ), - ); - !drawerState.preview.open && - dispatch(setFilePreviewPanel()); - }} - origin={origin} - /> - ); - }, - )} - {linkFilesMap?.map( - (resource: FileBrowserFolderLinkFile, index) => { - return ( - <LinkRow - rowIndex={index} - key={resource.data.path} - resource={resource} - name={getLinkFileName(resource)} - date={resource.data.creation_date} - owner={resource.data.owner_username} - size={resource.data.fsize} - computedPath={additionalKey} - handleFolderClick={() => { - return; - }} - handleFileClick={() => { - handleFileClick(resource.data.path); - }} - origin={origin} - /> - ); - }, - )} - - {subFoldersMap?.map( - (resource: FileBrowserFolder, index) => { - return ( - <FolderRow - rowIndex={index} - key={resource.data.path} - resource={resource} - name={getFolderName(resource, additionalKey)} - date={resource.data.creation_date} - owner=" " - size={0} - computedPath={additionalKey} - handleFolderClick={() => - handleFileClick(resource.data.path) - } - handleFileClick={() => { - return; - }} - origin={origin} - /> - ); - }, + {isLoading ? ( + renderSkeletonRows() + ) : ( + <> + {filesMap?.map( + (resource: FileBrowserFolderFile, index) => ( + <FileRow + key={resource.data.fname} + rowIndex={index} + resource={resource} + name={getFileName(resource)} + date={resource.data.creation_date} + owner={resource.data.owner_username} + size={resource.data.fsize} + computedPath={additionalKey} + handleFolderClick={() => {}} + handleFileClick={() => { + toggleAnimation(); + dispatch(setSelectedFile(resource)); + !drawerState.preview.open && + dispatch(setFilePreviewPanel()); + }} + origin={origin} + /> + ), + )} + {linkFilesMap?.map( + (resource: FileBrowserFolderLinkFile, index) => ( + <LinkRow + key={resource.data.path} + rowIndex={index} + resource={resource} + name={getLinkFileName(resource)} + date={resource.data.creation_date} + owner={resource.data.owner_username} + size={resource.data.fsize} + computedPath={additionalKey} + handleFolderClick={() => {}} + handleFileClick={() => + handleFileClick(resource.data.path) + } + origin={origin} + /> + ), + )} + {subFoldersMap?.map( + (resource: FileBrowserFolder, index) => ( + <FolderRow + key={resource.data.path} + rowIndex={index} + resource={resource} + name={getFolderName(resource, additionalKey)} + date={resource.data.creation_date} + owner=" " + size={0} + computedPath={additionalKey} + handleFolderClick={() => + handleFileClick(resource.data.path) + } + handleFileClick={() => {}} + origin={origin} + /> + ), + )} + </> )} </Tbody> </Table> @@ -380,3 +370,32 @@ const FileBrowser = (props: FileBrowserProps) => { }; export default FileBrowser; + +const renderSkeletonRows = () => ( + <> + {Array.from({ length: 5 }).map((_, index) => ( + <Tr + key={`skeleton-row-${ + // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> + index + }`} + > + <Th> + <Skeleton width="20px" /> + </Th> + <Th> + <Skeleton width="100px" /> + </Th> + <Th> + <Skeleton width="80px" /> + </Th> + <Th> + <Skeleton width="80px" /> + </Th> + <Th> + <Skeleton width="60px" /> + </Th> + </Tr> + ))} + </> +); diff --git a/src/components/FeedTree/ParentComponent.tsx b/src/components/FeedTree/ParentComponent.tsx index 9d5a49627..c2db5cf45 100644 --- a/src/components/FeedTree/ParentComponent.tsx +++ b/src/components/FeedTree/ParentComponent.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import { useEffect, useState } from "react"; import { useAppSelector } from "../../store/hooks"; import { Alert } from "../Antd"; import { SpinContainer } from "../Common"; @@ -23,17 +23,24 @@ const ParentComponent = (props: ParentComponentProps) => { (state) => state.instance.pluginInstances, ); const { data: instances, error, loading } = pluginInstances; - const [data, setData] = React.useState<TreeNodeDatum[]>([]); - const [tsIds, setTsIds] = React.useState<TSID>(); + const [data, setData] = useState<TreeNodeDatum[]>([]); + const [tsIds, setTsIds] = useState<TSID>(); + const [creating, setCreating] = useState(false); - React.useEffect(() => { + useEffect(() => { if (instances && instances.length > 0) { - const data = getFeedTree(instances); - - getTsNodes(instances).then((nodes) => { - setTsIds(nodes); - }); - setData(data); + setCreating(true); + try { + const data = getFeedTree(instances); + setData(data); + getTsNodes(instances).then((nodes) => { + setTsIds(nodes); + }); + } catch (e) { + setCreating(false); + } finally { + setCreating(false); + } } }, [instances]); @@ -45,7 +52,7 @@ const ParentComponent = (props: ParentComponentProps) => { changeLayout={changeLayout} currentLayout={currentLayout} /> - ) : loading ? ( + ) : loading || creating ? ( <SpinContainer title="Loading the tree" /> ) : error ? ( <Alert type="error" description={error} /> From e8c47f9c8a7c6cf3a56d15930aeba666810891e3 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Fri, 18 Oct 2024 12:54:24 -0400 Subject: [PATCH 309/337] Upgrade miniChRIS --- testing/miniChRIS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/miniChRIS b/testing/miniChRIS index 9b4c5dfa5..09edeb5b6 160000 --- a/testing/miniChRIS +++ b/testing/miniChRIS @@ -1 +1 @@ -Subproject commit 9b4c5dfa5f0b4278b1384bbf6513a9178bab3218 +Subproject commit 09edeb5b6da3ef8f139250fe2aaaef15dc4479c4 From 5be5601fb7c5a8f8a29cb0844dd9076a13ca9ccb Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 18 Oct 2024 17:55:17 -0400 Subject: [PATCH 310/337] feat: minor-cleanup --- package.json | 1 - src/App.tsx | 5 +++-- src/app.css | 10 ---------- src/main.tsx | 1 - 4 files changed, 3 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 4038d5d5e..8f1c9b5ea 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "@cornerstonejs/streaming-image-volume-loader": "^1.84.4", "@cornerstonejs/tools": "^1.84.4", "@fnndsc/chrisapi": "^1.22.0", - "@fontsource/inter": "^5.0.20", "@niivue/niivue": "0.44.2", "@patternfly/react-catalog-view-extension": "^5.0.0", "@patternfly/react-charts": "^7.4.0", diff --git a/src/App.tsx b/src/App.tsx index 0c579847d..09be098b9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,13 +1,14 @@ +import "./app.css"; import "@patternfly/react-core/dist/styles/base.css"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { ConfigProvider, App as AntdApp, theme } from "antd"; +import { App as AntdApp, ConfigProvider, theme } from "antd"; import { useContext } from "react"; import { CookiesProvider } from "react-cookie"; import { Provider } from "react-redux"; import { BrowserRouter } from "react-router-dom"; //@ts-ignore import useAckee from "use-ackee"; -import "./app.css"; + import { ThemeContext } from "./components/DarkTheme/useTheme"; import "./components/Feeds/Feeds.css"; import type { EnhancedStore } from "@reduxjs/toolkit"; diff --git a/src/app.css b/src/app.css index 7bbdcc8ac..006abb5b6 100644 --- a/src/app.css +++ b/src/app.css @@ -1,7 +1,3 @@ -body { - font-family: "Inter"; -} - .dcm-preview { position: relative; height: 100%; @@ -86,9 +82,3 @@ body { align-items: center !important; } -.patternfly-font { - font-family: var(--pf-v5-global--FontFamily--text); - font-size: var(--pf-v5-global--FontSize--md); - line-height: var(--pf-v5-global--LineHeight--md); - font-weight: var(--pf-v5-global--FontWeight--normal); -} diff --git a/src/main.tsx b/src/main.tsx index c9cbca60a..3adea29b1 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -3,7 +3,6 @@ import ReactDOM from "react-dom/client"; import App from "./App.tsx"; import { setupStore } from "./store/configureStore.ts"; import { ThemeContextProvider } from "./components/DarkTheme/useTheme.tsx"; -import "@fontsource/inter/400.css"; // Defaults to weight 400. import { enableMapSet } from "immer"; enableMapSet(); From bc88456d082a839799378f0c6642a71826b7e827 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 18 Oct 2024 18:04:00 -0400 Subject: [PATCH 311/337] feat: remove unused depedencies --- package.json | 1 - pnpm-lock.yaml | 102 ------------------------------------------------- 2 files changed, 103 deletions(-) diff --git a/package.json b/package.json index 8f1c9b5ea..24311c014 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,6 @@ "react-error-boundary": "^4.0.13", "react-force-graph-2d": "^1.25.5", "react-json-view": "^1.21.3", - "react-lazylog": "^4.5.3", "react-redux": "^9.1.2", "react-resizable-panels": "^2.1.4", "react-responsive": "^10.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 80ca2816a..4566b1d14 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,9 +26,6 @@ importers: '@fnndsc/chrisapi': specifier: ^1.22.0 version: 1.22.0 - '@fontsource/inter': - specifier: ^5.0.20 - version: 5.0.20 '@niivue/niivue': specifier: 0.44.2 version: 0.44.2 @@ -155,9 +152,6 @@ importers: react-json-view: specifier: ^1.21.3 version: 1.21.3(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-lazylog: - specifier: ^4.5.3 - version: 4.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-redux: specifier: ^9.1.2 version: 9.1.2(@types/react@18.3.4)(react@18.3.1)(redux@5.0.1) @@ -1188,9 +1182,6 @@ packages: '@fnndsc/chrisapi@1.22.0': resolution: {integrity: sha512-npmjbFouPcQn56P6KAHUCFKS2VGf168VlqWzyzencbZQHNbTB6pMzw+LKTO3Xt9ShYy1iNrdelhr41HaP+AlCQ==} - '@fontsource/inter@5.0.20': - resolution: {integrity: sha512-rtw2F7xfM7rJmmnncXnR4ADr5wXsp4GyN1O1jmQJ1PMjAK+bm620/ZkQkeOYOkGoa09OksGinOeMA+Mkt6K9PQ==} - '@icr/polyseg-wasm@0.4.0': resolution: {integrity: sha512-3sZmiwG8I0NaqPle0L7+V/ZexiR7IjIUFkUsaOoFI9rNuBGyyMMmxAxnCmqcDFtBDk9h+JEYJf6e3NnqlHi/HQ==} engines: {node: '>=0.14'} @@ -1244,11 +1235,6 @@ packages: resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} engines: {node: '>=8'} - '@mattiasbuelens/web-streams-polyfill@0.2.1': - resolution: {integrity: sha512-oKuFCQFa3W7Hj7zKn0+4ypI8JFm4ZKIoncwAC6wd5WwFW2sL7O1hpPoJdSWpynQ4DJ4lQ6MvFoVDmCLilonDFg==} - engines: {node: '>= 8'} - deprecated: moved to web-streams-polyfill@2.0.0 - '@msgpack/msgpack@2.8.0': resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} engines: {node: '>= 10'} @@ -1739,9 +1725,6 @@ packages: '@types/webxr@0.5.20': resolution: {integrity: sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==} - '@types/whatwg-streams@0.0.7': - resolution: {integrity: sha512-6sDiSEP6DWcY2ZolsJ2s39ZmsoGQ7KVwBDI3sESQsEm9P2dHTcqnDIHRZFRNtLCzWp7hCFGqYbw5GyfpQnJ01A==} - '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -2067,10 +2050,6 @@ packages: cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -2463,9 +2442,6 @@ packages: fbjs@3.0.5: resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} - fetch-readablestream@0.2.0: - resolution: {integrity: sha512-qu4mXWf4wus4idBIN/kVH+XSer8IZ9CwHP+Pd7DL7TuKNC1hP7ykon4kkBjwJF3EMX2WsFp4hH7gU7CyL7ucXw==} - fflate@0.7.3: resolution: {integrity: sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==} @@ -2643,10 +2619,6 @@ packages: immer@10.1.1: resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} - immutable@3.8.2: - resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==} - engines: {node: '>=0.10.0'} - immutable@4.3.7: resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} @@ -3053,9 +3025,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mitt@1.2.0: - resolution: {integrity: sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==} - mock-socket@9.3.1: resolution: {integrity: sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==} engines: {node: '>= 8'} @@ -3570,11 +3539,6 @@ packages: peerDependencies: react: '>=16.13.1' - react-lazylog@4.5.3: - resolution: {integrity: sha512-lyov32A/4BqihgXgtNXTHCajXSXkYHPlIEmV8RbYjHIMxCFSnmtdg4kDCI3vATz7dURtiFTvrw5yonHnrS+NNg==} - peerDependencies: - react: '>=16.3.0' - react-lifecycles-compat@3.0.4: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} @@ -3628,10 +3592,6 @@ packages: peerDependencies: react: '>=16.8' - react-string-replace@0.4.4: - resolution: {integrity: sha512-FAMkhxmDpCsGTwTZg7p/2v+/GTmxAp73so3fbSvlAcBBX36ujiGRNEaM/1u+jiYQrArhns+7eE92g2pi5E5FUA==} - engines: {node: '>=0.12.0'} - react-textarea-autosize@8.5.3: resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} engines: {node: '>=10'} @@ -3641,12 +3601,6 @@ packages: react-use-websocket@4.9.0: resolution: {integrity: sha512-/6OaCMggQCTnryCAsw/N+/wfH7bBfIXk5WXTMPdyf0x9HWJXLGUVttAT5hqAimRytD1dkHEJCUrFHAGzOAg1eg==} - react-virtualized@9.22.5: - resolution: {integrity: sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==} - peerDependencies: - react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 - react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 - react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -3946,9 +3900,6 @@ packages: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - throttle-debounce@5.0.2: resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} engines: {node: '>=12.22'} @@ -4321,9 +4272,6 @@ packages: webworker-promise@0.5.0: resolution: {integrity: sha512-14iR79jHAV7ozwvbfif+3wCaApT3I1g8Lo0rJZrwAu6wxZGx/08Y8KXz6as6ZLNUEEufeiEBBYrqyDBClXOsEw==} - whatwg-fetch@2.0.4: - resolution: {integrity: sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==} - whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} @@ -5452,8 +5400,6 @@ snapshots: transitivePeerDependencies: - debug - '@fontsource/inter@5.0.20': {} - '@icr/polyseg-wasm@0.4.0': {} '@isaacs/cliui@8.0.2': @@ -5527,10 +5473,6 @@ snapshots: dependencies: '@lukeed/csprng': 1.1.0 - '@mattiasbuelens/web-streams-polyfill@0.2.1': - dependencies: - '@types/whatwg-streams': 0.0.7 - '@msgpack/msgpack@2.8.0': {} '@niivue/niivue@0.44.2': @@ -6029,8 +5971,6 @@ snapshots: '@types/webxr@0.5.20': {} - '@types/whatwg-streams@0.0.7': {} - '@ungap/structured-clone@1.2.0': {} '@vitejs/plugin-react-swc@3.7.0(vite@5.4.6(@types/node@22.5.5)(terser@5.33.0))': @@ -6456,8 +6396,6 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - clsx@1.2.1: {} - color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -6834,8 +6772,6 @@ snapshots: transitivePeerDependencies: - encoding - fetch-readablestream@0.2.0: {} - fflate@0.7.3: {} fflate@0.8.2: {} @@ -7016,8 +6952,6 @@ snapshots: immer@10.1.1: {} - immutable@3.8.2: {} - immutable@4.3.7: {} import-fresh@3.3.0: @@ -7495,8 +7429,6 @@ snapshots: minipass@7.1.2: {} - mitt@1.2.0: {} - mock-socket@9.3.1: {} ms@2.1.2: {} @@ -8125,21 +8057,6 @@ snapshots: jerrypick: 1.1.1 react: 18.3.1 - react-lazylog@4.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@mattiasbuelens/web-streams-polyfill': 0.2.1 - fetch-readablestream: 0.2.0 - immutable: 3.8.2 - mitt: 1.2.0 - prop-types: 15.8.1 - react: 18.3.1 - react-string-replace: 0.4.4 - react-virtualized: 9.22.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - text-encoding-utf-8: 1.0.2 - whatwg-fetch: 2.0.4 - transitivePeerDependencies: - - react-dom - react-lifecycles-compat@3.0.4: {} react-overlays@5.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -8197,10 +8114,6 @@ snapshots: '@remix-run/router': 1.19.2 react: 18.3.1 - react-string-replace@0.4.4: - dependencies: - lodash: 4.17.21 - react-textarea-autosize@8.5.3(@types/react@18.3.4)(react@18.3.1): dependencies: '@babel/runtime': 7.25.4 @@ -8212,17 +8125,6 @@ snapshots: react-use-websocket@4.9.0: {} - react-virtualized@9.22.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.25.4 - clsx: 1.2.1 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-lifecycles-compat: 3.0.4 - react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -8521,8 +8423,6 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 - text-encoding-utf-8@1.0.2: {} - throttle-debounce@5.0.2: {} tinybench@2.9.0: {} @@ -8948,8 +8848,6 @@ snapshots: webworker-promise@0.5.0: {} - whatwg-fetch@2.0.4: {} - whatwg-mimetype@3.0.0: {} whatwg-url@5.0.0: From ff0e1074c0ced6d6fa62b48465c13facaf194514 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Fri, 18 Oct 2024 22:10:05 -0400 Subject: [PATCH 312/337] Add side-effects-cache = false to .npmrc see https://github.com/evilmartians/lefthook/blob/master/docs/install.md#-nodejs --- .npmrc | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .npmrc diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..44a9f7dd9 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +# see https://github.com/evilmartians/lefthook/blob/master/docs/install.md#-nodejs +side-effects-cache = false From e2e079f39ac0e8f5351656589c51f8a40df31d35 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Fri, 18 Oct 2024 22:10:13 -0400 Subject: [PATCH 313/337] pnpm run fmt --- src/app.css | 1 - src/components/Dashboard/dashboard.css | 1 - src/components/DisplayPage/display-page.css | 3 +-- src/components/NodeDetails/NodeDetails.css | 8 +++----- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/app.css b/src/app.css index 006abb5b6..5b04aafe5 100644 --- a/src/app.css +++ b/src/app.css @@ -81,4 +81,3 @@ justify-content: center !important; align-items: center !important; } - diff --git a/src/components/Dashboard/dashboard.css b/src/components/Dashboard/dashboard.css index 37afe650b..6e3991cac 100644 --- a/src/components/Dashboard/dashboard.css +++ b/src/components/Dashboard/dashboard.css @@ -2,7 +2,6 @@ color: white; } - .description-section { border-radius: 8px; height: 100%; diff --git a/src/components/DisplayPage/display-page.css b/src/components/DisplayPage/display-page.css index c42a0ebf0..78d052d8c 100644 --- a/src/components/DisplayPage/display-page.css +++ b/src/components/DisplayPage/display-page.css @@ -49,8 +49,7 @@ text-decoration: none; } -.plugin-item-title - { +.plugin-item-title { font-size: 1em; font-weight: 400; } diff --git a/src/components/NodeDetails/NodeDetails.css b/src/components/NodeDetails/NodeDetails.css index c26831ccf..0d97a45c3 100644 --- a/src/components/NodeDetails/NodeDetails.css +++ b/src/components/NodeDetails/NodeDetails.css @@ -165,14 +165,12 @@ } } -.pf-v5-c-log-viewer__main, +.pf-v5-c-log-viewer__main, .pf-v5-c-log-viewer__list { flex-grow: 1 !important; overflow: auto; - } -.pf-v5-c-log-viewer__scroll-container{ - height:100% !important; +.pf-v5-c-log-viewer__scroll-container { + height: 100% !important; } - From a433970810f5d3a38a8f01268e9536db5fd1643a Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Sat, 19 Oct 2024 00:40:21 -0400 Subject: [PATCH 314/337] Increase oxidicom message throttling Fixes false positive of React maximum update depth --- testing/miniChRIS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/miniChRIS b/testing/miniChRIS index 09edeb5b6..4e85104ba 160000 --- a/testing/miniChRIS +++ b/testing/miniChRIS @@ -1 +1 @@ -Subproject commit 09edeb5b6da3ef8f139250fe2aaaef15dc4479c4 +Subproject commit 4e85104ba1d7272b4bd8b071b263d488b0a31a75 From 229ba91358bac72cbd4e02b7b1de6c1edf62d7f6 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Sat, 19 Oct 2024 01:20:25 -0400 Subject: [PATCH 315/337] Remove p-queue --- package.json | 1 - pnpm-lock.yaml | 23 ----------------------- 2 files changed, 24 deletions(-) diff --git a/package.json b/package.json index 24311c014..ec112ba67 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,6 @@ "micromark": "^4.0.0", "micromark-extension-gfm": "^3.0.0", "niivue-react": "github:niivue/niivue-react", - "p-queue": "^8.0.1", "pako": "^1.0.11", "preval.macro": "^5.0.0", "query-string": "^9.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4566b1d14..06e8a942e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,9 +110,6 @@ importers: niivue-react: specifier: github:niivue/niivue-react version: https://codeload.github.com/niivue/niivue-react/tar.gz/d7734b88359b61356fec5bfa302e02536e0a1134(@niivue/niivue@0.44.2)(react@18.3.1)(typescript@5.6.2) - p-queue: - specifier: ^8.0.1 - version: 8.0.1 pako: specifier: ^1.0.11 version: 1.0.11 @@ -2420,9 +2417,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -3102,14 +3096,6 @@ packages: resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} engines: {node: '>=8'} - p-queue@8.0.1: - resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} - engines: {node: '>=18'} - - p-timeout@6.1.2: - resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} - engines: {node: '>=14.16'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -6744,8 +6730,6 @@ snapshots: esutils@2.0.3: {} - eventemitter3@5.0.1: {} - events@3.3.0: {} fast-deep-equal@3.1.3: {} @@ -7514,13 +7498,6 @@ snapshots: dependencies: aggregate-error: 3.1.0 - p-queue@8.0.1: - dependencies: - eventemitter3: 5.0.1 - p-timeout: 6.1.2 - - p-timeout@6.1.2: {} - p-try@2.2.0: {} package-hash@4.0.0: From 5041d79e65e4f17ef500dfc38aa7f2452a4f3402 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Mon, 21 Oct 2024 11:05:04 -0400 Subject: [PATCH 316/337] Upgrade pnpm to 9.12.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ec112ba67..53d67e559 100644 --- a/package.json +++ b/package.json @@ -132,5 +132,5 @@ "vitest-websocket-mock": "^0.4.0" }, "type": "module", - "packageManager": "pnpm@9.11.0+sha512.0a203ffaed5a3f63242cd064c8fb5892366c103e328079318f78062f24ea8c9d50bc6a47aa3567cabefd824d170e78fa2745ed1f16b132e16436146b7688f19b" + "packageManager": "pnpm@9.12.2+sha512.22721b3a11f81661ae1ec68ce1a7b879425a1ca5b991c975b074ac220b187ce56c708fe5db69f4c962c989452eee76c82877f4ee80f474cebd61ee13461b6228" } From 83765c1b888cdfcce51190a7cd9a31c78296a6a0 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Mon, 21 Oct 2024 20:18:47 -0400 Subject: [PATCH 317/337] refactor: Update the regression in tooling --- .../FeedOutputBrowser/FileBrowser.tsx | 4 +- .../NewLibrary/components/LibraryTable.tsx | 10 +- .../Preview/displays/DcmDisplay.tsx | 93 +++++++++++-------- 3 files changed, 63 insertions(+), 44 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 4a6378caf..9e1d9b355 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -238,9 +238,7 @@ const FileBrowser = (props: FileBrowserProps) => { <Th aria-label="file-creator" width={20}> {columnNames.created} </Th> - <Th aria-label="file-owner" width={20}> - {columnNames.creator} - </Th> + <Th aria-label="file-size" width={20}> {columnNames.size} </Th> diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 0c7ed67cb..34d4f5b77 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -119,6 +119,7 @@ const BaseRow: React.FC<RowProps> = ({ handleFileClick(); } }; + const path = type === "folder" || type === "link" ? resource.data.path @@ -170,9 +171,12 @@ const BaseRow: React.FC<RowProps> = ({ <Td dataLabel={columnNames.date} modifier="truncate"> <TruncatedText text={format(new Date(date), "dd MMM yyyy, HH:mm")} /> </Td> - <Td dataLabel={columnNames.owner} modifier="truncate"> - <TruncatedText text={owner} /> - </Td> + {origin.type !== "fileBrowser" && ( + <Td dataLabel={columnNames.owner} modifier="truncate"> + <TruncatedText text={owner} /> + </Td> + )} + <Td dataLabel={columnNames.size} modifier="truncate"> {size > 0 ? formatBytes(size, 0) : " "} </Td> diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 09933afbb..d33d110fa 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -11,6 +11,7 @@ import { loadDicomImage, setUpTooling, events, + handleEvents, } from "./dicomUtils/utils"; import type { IStackViewport } from "./dicomUtils/utils"; import { Button } from "@patternfly/react-core"; @@ -40,6 +41,7 @@ const DcmDisplay = (props: DcmImageProps) => { fetchMore, preview, filesLoading, + actionState, } = props; // State variables @@ -328,7 +330,7 @@ const DcmDisplay = (props: DcmImageProps) => { if ( filteredList && - newIndex >= filteredList.length - 5 && + newIndex >= filteredList.length - 15 && fetchMore && !filesLoading && !isLoadingMore && @@ -388,7 +390,8 @@ const DcmDisplay = (props: DcmImageProps) => { if ( cineIntervalIdRef.current || !activeViewportRef.current || - !imageStack[fname] + !imageStack[fname] || + imageCount <= 1 ) return; @@ -409,7 +412,7 @@ const DcmDisplay = (props: DcmImageProps) => { * Manage cine playback based on `isPlaying` state. */ useEffect(() => { - if (isPlaying) { + if (isPlaying && imageCount > 1) { startCinePlay(); } else { stopCinePlay(); @@ -417,7 +420,15 @@ const DcmDisplay = (props: DcmImageProps) => { return () => { stopCinePlay(); }; - }, [isPlaying, startCinePlay, stopCinePlay]); + }, [isPlaying, startCinePlay, stopCinePlay, imageCount]); + + /* Manage Tooling */ + + useEffect(() => { + if (actionState && activeViewportRef.current) { + handleEvents(actionState, activeViewportRef.current); + } + }, [actionState]); return ( <> @@ -438,41 +449,47 @@ const DcmDisplay = (props: DcmImageProps) => { }} > {/* Current Index Display */} - <div - style={{ - color: "#fff", - marginBottom: "0.5em", - fontFamily: "monospace", // Use monospaced font - }} - > - {`Current Index: ${currentIndexDisplay}/${imageCountDisplay}`} - </div> - - {/* Play/Pause Button */} - <div style={{ marginBottom: "0.5em" }}> - <Button - variant="control" - size="sm" - onClick={() => setIsPlaying(!isPlaying)} + {imageCount > 1 && ( + <div + style={{ + color: "#fff", + marginBottom: "0.5em", + fontFamily: "monospace", // Use monospaced font + }} > - {isPlaying ? "Pause" : "Play"} - </Button> - </div> - - {/* Playback Speed Control */} - <div style={{ color: "#fff", marginBottom: "0.5em" }}> - <label> - Speed: - <input - type="number" - value={playbackSpeed} - min="1" - max="60" - onChange={(e) => setPlaybackSpeed(Number(e.target.value))} - /> - fps - </label> - </div> + {`Current Index: ${currentIndexDisplay}/${imageCountDisplay}`} + </div> + )} + + {imageCount > 1 && ( + <> + {/* Play/Pause Button */} + <div style={{ marginBottom: "0.5em" }}> + <Button + variant="control" + size="sm" + onClick={() => setIsPlaying(!isPlaying)} + > + {isPlaying ? "Pause" : "Play"} + </Button> + </div> + + {/* Playback Speed Control */} + <div style={{ color: "#fff", marginBottom: "0.5em" }}> + <label> + Speed: + <input + type="number" + value={playbackSpeed} + min="1" + max="60" + onChange={(e) => setPlaybackSpeed(Number(e.target.value))} + /> + fps + </label> + </div> + </> + )} {/* Loading More Indicator */} {isLoadingMore && ( From b7e528dc4bb7e8fccd8c675b67c261fe02a5c201 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Mon, 21 Oct 2024 20:40:47 -0400 Subject: [PATCH 318/337] feat: Update the placement of the play/pause control for the cine player --- src/app.css | 14 +++--- src/components/Icons/index.tsx | 4 ++ src/components/Preview/FileDetailView.tsx | 19 +++++++- .../Preview/displays/DcmDisplay.tsx | 47 ++++--------------- .../Preview/displays/IframeDisplay.tsx | 2 +- 5 files changed, 39 insertions(+), 47 deletions(-) diff --git a/src/app.css b/src/app.css index 5b04aafe5..6b79447e8 100644 --- a/src/app.css +++ b/src/app.css @@ -63,21 +63,23 @@ } .small-button { - width: 20px; - height: 20px; - font-size: 12px; + width: 16px; + height: 16px; + font-size: 0.8rem } .large-button { - width: 40px; - height: 40px; + width: 24px; + height: 24px; + font-size:1rem; } .button-style { border-radius: 50% !important; - padding: 1rem !important; + padding: 1rem !important; /* Remove default padding */ border: none !important; display: flex !important; justify-content: center !important; align-items: center !important; + line-height:0 !important } diff --git a/src/components/Icons/index.tsx b/src/components/Icons/index.tsx index 90280dce7..2767d31ec 100644 --- a/src/components/Icons/index.tsx +++ b/src/components/Icons/index.tsx @@ -33,6 +33,8 @@ import { BarsIcon, GripVerticalIcon, ToolsIcon, + PlayIcon, + PauseIcon, } from "@patternfly/react-icons"; const CartIcon = ({ @@ -310,4 +312,6 @@ export { BarsIcon, GripVerticalIcon, ToolsIcon, + PlayIcon, + PauseIcon, }; diff --git a/src/components/Preview/FileDetailView.tsx b/src/components/Preview/FileDetailView.tsx index 6f887151e..d29d11be2 100644 --- a/src/components/Preview/FileDetailView.tsx +++ b/src/components/Preview/FileDetailView.tsx @@ -29,11 +29,13 @@ import { AddIcon, BrightnessIcon, InfoIcon, + PlayIcon, RotateIcon, RulerIcon, SearchIcon, ZoomIcon, -} from "../Icons"; + PauseIcon, +} from "../Icons"; // Import PlayIcon import { TagInfoModal } from "./HelperComponent"; import { dumpDataSet } from "./displays/dicomUtils/dicomDict"; @@ -277,6 +279,10 @@ const actions = [ name: "TagInfo", icon: <InfoIcon />, }, + { + name: "Play", + icon: <PlayIcon />, // Add Play icon + }, ]; const getViewerSpecificActions: { @@ -315,6 +321,13 @@ export const DicomHeader = ({ md: "spacerMd", sm: "spacerSm", }; + + // Dynamically set the icon for Play/Pause button + let icon = action.icon; + if (action.name === "Play") { + icon = actionState.Play ? <PauseIcon /> : <PlayIcon />; + } + return ( <ToolbarItem spacer={spacer} key={action.name}> <Tooltip content={<span>{action.name}</span>}> @@ -325,12 +338,14 @@ export const DicomHeader = ({ variant={ actionState[action.name] === true ? "primary" : "control" } - icon={action.icon} + size="sm" + icon={icon} onClick={(ev) => { const previouslyActive = Object.keys(actionState)[0]; ev.preventDefault(); handleEvents(action.name, previouslyActive); }} + aria-label={action.name} /> </Tooltip> </ToolbarItem> diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index d33d110fa..4631cf2e8 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -14,7 +14,6 @@ import { handleEvents, } from "./dicomUtils/utils"; import type { IStackViewport } from "./dicomUtils/utils"; -import { Button } from "@patternfly/react-core"; export type DcmImageProps = { selectedFile: IFileBlob; @@ -50,8 +49,9 @@ const DcmDisplay = (props: DcmImageProps) => { const [multiFrameDisplay, setMultiFrameDisplay] = useState(false); const [isLoadingMore, setIsLoadingMore] = useState(false); const [lastLoadedIndex, setLastLoadedIndex] = useState(0); - const [isPlaying, setIsPlaying] = useState(false); - const [playbackSpeed, setPlaybackSpeed] = useState(24); // frames per second + // Remove isPlaying and playbackSpeed states + // const [isPlaying, setIsPlaying] = useState(false); + // const [playbackSpeed, setPlaybackSpeed] = useState(24); // frames per second // Refs const dicomImageRef = useRef<HTMLDivElement>(null); @@ -395,7 +395,8 @@ const DcmDisplay = (props: DcmImageProps) => { ) return; - const frameDuration = 1000 / playbackSpeed; // Calculate frame duration in milliseconds + const defaultPlaybackSpeed = 24; // Use default playback speed (fps) + const frameDuration = 1000 / defaultPlaybackSpeed; // Calculate frame duration in milliseconds cineIntervalIdRef.current = setInterval(() => { if (activeViewportRef.current) { @@ -406,12 +407,13 @@ const DcmDisplay = (props: DcmImageProps) => { setCurrentImageIndex(currentIndex); } }, frameDuration); - }, [playbackSpeed, imageStack, fname, imageCount]); + }, [imageStack, fname, imageCount]); /** - * Manage cine playback based on `isPlaying` state. + * Manage cine playback based on `actionState["Play"]` state. */ useEffect(() => { + const isPlaying = actionState.Play === true; if (isPlaying && imageCount > 1) { startCinePlay(); } else { @@ -420,10 +422,9 @@ const DcmDisplay = (props: DcmImageProps) => { return () => { stopCinePlay(); }; - }, [isPlaying, startCinePlay, stopCinePlay, imageCount]); + }, [actionState.Play, startCinePlay, stopCinePlay, imageCount]); /* Manage Tooling */ - useEffect(() => { if (actionState && activeViewportRef.current) { handleEvents(actionState, activeViewportRef.current); @@ -461,36 +462,6 @@ const DcmDisplay = (props: DcmImageProps) => { </div> )} - {imageCount > 1 && ( - <> - {/* Play/Pause Button */} - <div style={{ marginBottom: "0.5em" }}> - <Button - variant="control" - size="sm" - onClick={() => setIsPlaying(!isPlaying)} - > - {isPlaying ? "Pause" : "Play"} - </Button> - </div> - - {/* Playback Speed Control */} - <div style={{ color: "#fff", marginBottom: "0.5em" }}> - <label> - Speed: - <input - type="number" - value={playbackSpeed} - min="1" - max="60" - onChange={(e) => setPlaybackSpeed(Number(e.target.value))} - /> - fps - </label> - </div> - </> - )} - {/* Loading More Indicator */} {isLoadingMore && ( <div style={{ color: "#fff" }}> diff --git a/src/components/Preview/displays/IframeDisplay.tsx b/src/components/Preview/displays/IframeDisplay.tsx index b85a47201..da584262d 100644 --- a/src/components/Preview/displays/IframeDisplay.tsx +++ b/src/components/Preview/displays/IframeDisplay.tsx @@ -25,7 +25,7 @@ const IframeDisplay: React.FC<IframeDisplayProps> = ({ return () => { URL.revokeObjectURL(url); }; - }, [selectedFile]); + }, [url, selectedFile]); return ( <Fragment> From 8fec853ceac222d9633b67852f98b0fd6136d24b Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Wed, 23 Oct 2024 16:42:45 -0400 Subject: [PATCH 319/337] feat: Optimize Dicom Display --- package.json | 1 + pnpm-lock.yaml | 60 + .../FeedOutputBrowser/FileBrowser.tsx | 13 +- src/components/FeedOutputBrowser/types.ts | 4 + src/components/Preview/FileDetailView.tsx | 66 +- .../Preview/displays/DcmDisplay.tsx | 201 +- .../displays/dicomUtils/dataDictionary.ts | 28575 ---------------- .../Preview/displays/dicomUtils/dicomDict.ts | 479 - .../dicomUtils/hardcodedMetaDataProvider.ts | 72 - .../Preview/displays/dicomUtils/utils.ts | 64 +- .../displays/dicomUtils/webImageLoader.ts | 268 - src/types/index.d.ts | 1 + 12 files changed, 261 insertions(+), 29543 deletions(-) delete mode 100644 src/components/Preview/displays/dicomUtils/dataDictionary.ts delete mode 100644 src/components/Preview/displays/dicomUtils/dicomDict.ts delete mode 100644 src/components/Preview/displays/dicomUtils/hardcodedMetaDataProvider.ts delete mode 100644 src/components/Preview/displays/dicomUtils/webImageLoader.ts diff --git a/package.json b/package.json index ec112ba67..62c2eeb6d 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "d3-shape": "^3.2.0", "d3-zoom": "^3.0.0", "date-fns": "^4.1.0", + "dcmjs": "^0.34.5", "dicom-parser": "^1.8.21", "email-validator": "^2.0.4", "fp-ts": "^2.16.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06e8a942e..16df9a696 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,6 +80,9 @@ importers: date-fns: specifier: ^4.1.0 version: 4.1.0 + dcmjs: + specifier: ^0.34.5 + version: 0.34.5 dicom-parser: specifier: ^1.8.21 version: 1.8.21 @@ -900,6 +903,10 @@ packages: '@babel/regjsgen@0.8.0': resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + '@babel/runtime-corejs3@7.25.9': + resolution: {integrity: sha512-eHeq2HWhgn3aH6Gz4Dnajqp8U5DjBg3h933LlGJ52hAN6Kx34KAL7O3NzwTrldl9PrgKTyBcz0ScVIQ3A6e2fA==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.22.11': resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} engines: {node: '>=6.9.0'} @@ -1846,6 +1853,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + adm-zip@0.5.16: + resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} + engines: {node: '>=12.0'} + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -2099,6 +2110,9 @@ packages: core-js-compat@3.38.1: resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} + core-js-pure@3.38.1: + resolution: {integrity: sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==} + core-js@3.38.1: resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} @@ -2222,6 +2236,9 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dcmjs@0.34.5: + resolution: {integrity: sha512-a2m9lnvdQuKA0YllwymDiOOv7LEv43Vno9QyIP78QWKRc0azoMKxFpti9ynFy2zf2bcapEwaD9OzYes39FukVQ==} + debug@4.3.6: resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} @@ -2650,9 +2667,15 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + iota-array@1.0.0: + resolution: {integrity: sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + is-core-module@2.15.1: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} @@ -2867,6 +2890,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -3034,6 +3061,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + ndarray@1.0.19: + resolution: {integrity: sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -5144,6 +5174,11 @@ snapshots: '@babel/regjsgen@0.8.0': {} + '@babel/runtime-corejs3@7.25.9': + dependencies: + core-js-pure: 3.38.1 + regenerator-runtime: 0.14.1 + '@babel/runtime@7.22.11': dependencies: regenerator-runtime: 0.14.1 @@ -6122,6 +6157,8 @@ snapshots: acorn@8.12.1: {} + adm-zip@0.5.16: {} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -6424,6 +6461,8 @@ snapshots: dependencies: browserslist: 4.23.3 + core-js-pure@3.38.1: {} + core-js@3.38.1: {} cosmiconfig@7.1.0: @@ -6551,6 +6590,16 @@ snapshots: dayjs@1.11.13: {} + dcmjs@0.34.5: + dependencies: + '@babel/runtime-corejs3': 7.25.9 + adm-zip: 0.5.16 + gl-matrix: 3.4.3 + lodash.clonedeep: 4.5.0 + loglevel: 1.9.2 + ndarray: 1.0.19 + pako: 2.1.0 + debug@4.3.6: dependencies: ms: 2.1.2 @@ -6964,8 +7013,12 @@ snapshots: dependencies: loose-envify: 1.4.0 + iota-array@1.0.0: {} + is-arrayish@0.2.1: {} + is-buffer@1.1.6: {} + is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -7165,6 +7218,8 @@ snapshots: lodash@4.17.21: {} + loglevel@1.9.2: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -7421,6 +7476,11 @@ snapshots: nanoid@3.3.7: {} + ndarray@1.0.19: + dependencies: + iota-array: 1.0.0 + is-buffer: 1.1.6 + neo-async@2.6.2: {} nifti-reader-js@0.6.8: diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 9e1d9b355..56363f868 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -74,9 +74,14 @@ const FileBrowser = (props: FileBrowserProps) => { const selectedFile = useAppSelector((state) => state.explorer.selectedFile); const drawerState = useAppSelector((state) => state.drawers); const username = useAppSelector((state) => state.user.username); - const { subFoldersMap, linkFilesMap, filesMap } = pluginFilesPayload; + const { subFoldersMap, linkFilesMap, filesMap, filesPagination, folderList } = + pluginFilesPayload; const breadcrumb = additionalKey.split("/"); const currentPath = `home/${username}/feeds/feed_${feed?.data.id}/${selected?.data.plugin_name}_${selected?.data.id}/data`; + const noFiles = + filesMap?.length === 0 && + subFoldersMap?.length === 0 && + linkFilesMap?.length === 0; useEffect(() => { if (isSuccess) { @@ -191,7 +196,7 @@ const FileBrowser = (props: FileBrowserProps) => { }} origin={origin} computedPath={additionalKey} - folderList={pluginFilesPayload.folderList} + folderList={folderList} /> <div className="file-browser__header"> <div className="file-browser__header--breadcrumbContainer"> @@ -245,7 +250,7 @@ const FileBrowser = (props: FileBrowserProps) => { </Tr> </Thead> <Tbody> - {isLoading ? ( + {isLoading && noFiles ? ( renderSkeletonRows() ) : ( <> @@ -353,7 +358,7 @@ const FileBrowser = (props: FileBrowserProps) => { gallery={true} selectedFile={selectedFile} preview="large" - list={pluginFilesPayload.filesMap} + list={filesMap} fetchMore={fetchMore} handlePagination={handlePagination} filesLoading={isLoading} diff --git a/src/components/FeedOutputBrowser/types.ts b/src/components/FeedOutputBrowser/types.ts index cbdb80bab..1482294af 100644 --- a/src/components/FeedOutputBrowser/types.ts +++ b/src/components/FeedOutputBrowser/types.ts @@ -12,6 +12,10 @@ export interface FilesPayload { subFoldersMap?: FileBrowserFolder[]; linkFilesMap?: FileBrowserFolderLinkFile[]; folderList?: FileBrowserFolderList; + filesPagination?: { + totalCount: number; + hasNextPage: boolean; + }; } export interface FileBrowserProps { diff --git a/src/components/Preview/FileDetailView.tsx b/src/components/Preview/FileDetailView.tsx index d29d11be2..62df056a0 100644 --- a/src/components/Preview/FileDetailView.tsx +++ b/src/components/Preview/FileDetailView.tsx @@ -9,7 +9,7 @@ import { } from "@patternfly/react-core"; import ResetIcon from "@patternfly/react-icons/dist/esm/icons/history-icon"; import { useMutation } from "@tanstack/react-query"; -import * as dicomParser from "dicom-parser"; +import * as dcmjs from "dcmjs"; import React, { Fragment, useCallback, @@ -19,9 +19,9 @@ import React, { } from "react"; import { ErrorBoundary } from "react-error-boundary"; import { + type IFileBlob, fileViewerMap, getFileExtension, - type IFileBlob, } from "../../api/model"; import { useAppSelector } from "../../store/hooks"; import { SpinContainer } from "../Common"; @@ -29,15 +29,14 @@ import { AddIcon, BrightnessIcon, InfoIcon, + PauseIcon, PlayIcon, RotateIcon, RulerIcon, SearchIcon, ZoomIcon, - PauseIcon, } from "../Icons"; // Import PlayIcon import { TagInfoModal } from "./HelperComponent"; -import { dumpDataSet } from "./displays/dicomUtils/dicomDict"; const ViewerDisplay = React.lazy(() => import("./displays/ViewerDisplay")); @@ -98,45 +97,36 @@ const FileDetailView = (props: AllProps) => { }; }, [handleKeyboardEvents]); - const displayTagInfo = useCallback(async (result: any) => { - const reader = new FileReader(); - - reader.onloadend = async () => { - try { - if (reader.result) { - const byteArray = new Uint8Array(reader.result as ArrayBuffer); - const testOutput: any[] = []; - const output: any[] = []; - const dataSet = dicomParser.parseDicom(byteArray); - dumpDataSet(dataSet, output, testOutput); - const merged = Object.assign({}, ...testOutput); - setTagInfo(merged); - } - } catch (error) { - setParsingError("Failed to parse the file for dicom tags"); - return { - blob: undefined, - file: undefined, - fileType: "", - }; - } - }; - - if (result) { + const displayTagInfo = useCallback(async () => { + try { const blob = await selectedFile?.getFileBlob(); - if (blob) { - reader.readAsArrayBuffer(blob); - } else { - throw new Error("Failed to parse the file for dicom tags"); + if (!blob) { + setParsingError("Failed to retrieve the file blob"); + return; } + + const arrayBuffer = await blob.arrayBuffer(); + const dicomData = dcmjs.data.DicomMessage.readFile(arrayBuffer); + const dataset = dcmjs.data.DicomMetaDictionary.naturalizeDataset( + dicomData.dict, + ); + // Sort the dataset keys alphabetically + const sortedDataset = Object.keys(dataset) + .sort() + .reduce((sortedObj: any, key) => { + sortedObj[key] = dataset[key]; + return sortedObj; + }, {}); + + setTagInfo(sortedDataset); + } catch (error) { + console.error("Error parsing DICOM file:", error); + setParsingError("Failed to parse the file for DICOM tags"); } }, []); const mutation = useMutation({ - mutationFn: async (selectedFile: FileBrowserFolderFile | PACSFile) => { - await displayTagInfo(selectedFile); - }, - + mutationFn: displayTagInfo, onError: (error: any) => { setParsingError(error.message); }, @@ -156,7 +146,7 @@ const FileDetailView = (props: AllProps) => { const handleEvents = (action: string, previouslyActive: string) => { if (action === "TagInfo" && selectedFile) { - mutation.mutate(selectedFile); + mutation.mutate(); } const currentAction = actionState[action]; setActionState({ diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 4631cf2e8..414f6c31d 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -1,17 +1,18 @@ import type { RenderingEngine } from "@cornerstonejs/core"; import { useQuery } from "@tanstack/react-query"; -import { useCallback, useEffect, useRef, useState, useMemo } from "react"; -import { getFileExtension, type IFileBlob } from "../../../api/model"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { type IFileBlob, getFileExtension } from "../../../api/model"; +import { notification } from "../../Antd"; import { SpinContainer } from "../../Common"; import useSize from "../../FeedTree/useSize"; import type { ActionState } from "../FileDetailView"; import { + events, basicInit, displayDicomImage, + handleEvents, loadDicomImage, setUpTooling, - events, - handleEvents, } from "./dicomUtils/utils"; import type { IStackViewport } from "./dicomUtils/utils"; @@ -49,9 +50,6 @@ const DcmDisplay = (props: DcmImageProps) => { const [multiFrameDisplay, setMultiFrameDisplay] = useState(false); const [isLoadingMore, setIsLoadingMore] = useState(false); const [lastLoadedIndex, setLastLoadedIndex] = useState(0); - // Remove isPlaying and playbackSpeed states - // const [isPlaying, setIsPlaying] = useState(false); - // const [playbackSpeed, setPlaybackSpeed] = useState(24); // frames per second // Refs const dicomImageRef = useRef<HTMLDivElement>(null); @@ -110,79 +108,114 @@ const DcmDisplay = (props: DcmImageProps) => { [list], ); + /** + * Find the index of the selected file in the filtered list. + */ + const selectedIndex = useMemo( + () => + filteredList?.findIndex((file) => file.data.id === selectedFile.data.id), + [filteredList, selectedFile.data.id], + ); + /** * Preview the selected DICOM file. * If the image is already cached, it uses the cached data. * Otherwise, it loads the image and caches it. */ const previewFile = useCallback(async () => { - if (!elementRef.current) return {}; - - const existingImageEntry = cacheStack?.[fname]; - - if (existingImageEntry && activeViewportRef.current) { - // Image is already cached - let imageIDs: string[]; - let index: number; - - if (Array.isArray(existingImageEntry)) { - // Multi-frame image - imageIDs = existingImageEntry; - index = currentImageIndex; - setMultiFrameDisplay(true); - } else { - // Single-frame images - imageIDs = Object.values(cacheStack).flat() as string[]; - index = imageIDs.findIndex((id) => id === existingImageEntry); - setMultiFrameDisplay(false); + try { + if (!elementRef.current) return {}; + const existingImageEntry = cacheStack?.[fname]; + + if (existingImageEntry && activeViewportRef.current) { + // Image is already cached + let imageIDs: string[]; + let index: number; + + if (Array.isArray(existingImageEntry)) { + // Multi-frame image + imageIDs = existingImageEntry; + index = currentImageIndex; + setMultiFrameDisplay(true); + } else { + // Single-frame images + imageIDs = Object.values(cacheStack).flat() as string[]; + index = imageIDs.findIndex((id) => id === existingImageEntry); + setMultiFrameDisplay(false); + } + + await activeViewportRef.current.setStack( + imageIDs, + index !== -1 ? index : 0, + ); + activeViewportRef.current.render(); + setCurrentImageIndex(index); + return cacheStack; } - await activeViewportRef.current.setStack( - imageIDs, - index !== -1 ? index : 0, + // Load new image if not in cache + const blob = await selectedFile.getFileBlob(); + const imageData = await loadDicomImage(blob); + const { framesCount, imageID } = imageData; + + const framesList = + framesCount > 1 + ? Array.from( + { length: framesCount }, + (_, i) => `${imageID}?frame=${i}`, + ) + : imageID; + + const newImageStack: ImageStackType = { + [fname]: framesList, + }; + + const elementId = `cornerstone-element-${fname}`; + const { viewport, renderingEngine } = await displayDicomImage( + elementRef.current, + framesCount > 1 ? framesList[0] : imageID, + elementId, ); - activeViewportRef.current.render(); - return cacheStack; + setMultiFrameDisplay(framesCount > 1); + activeViewportRef.current = viewport; + renderingEngineRef.current = renderingEngine; + setImageStack(newImageStack); + setCurrentImageIndex(selectedIndex); + cacheRef.current[CACHE_KEY] = newImageStack; + return newImageStack; + } catch (e) { + // biome-ignore lint/complexity/noUselessCatch: <explanation> + throw e; } - - // Load new image if not in cache - const blob = await selectedFile.getFileBlob(); - const imageData = await loadDicomImage(blob); - const { framesCount, imageID } = imageData; - - const framesList = - framesCount > 1 - ? Array.from({ length: framesCount }, (_, i) => `${imageID}?frame=${i}`) - : imageID; - - const newImageStack: ImageStackType = { - [fname]: framesList, - }; - - const elementId = `cornerstone-element-${fname}`; - const { viewport, renderingEngine } = await displayDicomImage( - elementRef.current, - framesCount > 1 ? framesList[0] : imageID, - elementId, - ); - - setMultiFrameDisplay(framesCount > 1); - activeViewportRef.current = viewport; - renderingEngineRef.current = renderingEngine; - - setImageStack(newImageStack); - cacheRef.current[CACHE_KEY] = newImageStack; - return newImageStack; - }, [selectedFile, cacheStack, fname, currentImageIndex]); + }, [ + selectedFile, + cacheStack, + fname, + currentImageIndex, + selectedIndex, + displayDicomImage, + loadDicomImage, + ]); // Use React Query to fetch and cache the preview data - const { isLoading, data } = useQuery({ + const { isLoading, data, isError, error } = useQuery({ queryKey: ["cornerstone-preview", fname], queryFn: previewFile, enabled: !!selectedFile && !!elementRef.current, }); + useEffect(() => { + if (isError) { + notification.error({ + message: "Error Loading DICOM Image", + description: + (error as Error)?.message || + "An error occurred while loading the DICOM Image", + }); + } + }, [isError, error]); + /** * Stop cine playback. */ @@ -229,7 +262,10 @@ const DcmDisplay = (props: DcmImageProps) => { /** * Generator function to yield image files starting from a specific index. */ - function* imageFileGenerator(list: IFileBlob[], startIndex: number) { + function* imageFileGenerator( + list: IFileBlob[], + startIndex: number, + ): Generator<IFileBlob> { for (let i = startIndex; i < list.length; i++) { yield list[i]; } @@ -245,10 +281,8 @@ const DcmDisplay = (props: DcmImageProps) => { // All images are already loaded setImageStack(cacheStack); if (activeViewportRef.current) { - const currentIndex = - activeViewportRef.current.getCurrentImageIdIndex(); const imageIDs = Object.values(cacheStack).flat() as string[]; - await activeViewportRef.current.setStack(imageIDs, currentIndex); + await activeViewportRef.current.setStack(imageIDs, selectedIndex); activeViewportRef.current.render(); } return; @@ -274,16 +308,15 @@ const DcmDisplay = (props: DcmImageProps) => { cacheRef.current[CACHE_KEY] = updatedImageStack; if (activeViewportRef.current) { - const currentIndex = activeViewportRef.current.getCurrentImageIdIndex(); const imageIDs = Object.values(updatedImageStack).flat() as string[]; - await activeViewportRef.current.setStack(imageIDs, currentIndex); + await activeViewportRef.current.setStack(imageIDs, selectedIndex); activeViewportRef.current.render(); } setLastLoadedIndex(lastLoadedIndex + Object.keys(newImages).length); setIsLoadingMore(false); }, - [cacheStack, lastLoadedIndex], + [cacheStack, lastLoadedIndex, selectedIndex, loadDicomImage], ); // Check if the first frame is still loading @@ -296,7 +329,7 @@ const DcmDisplay = (props: DcmImageProps) => { useEffect(() => { if ( !loadingFirstFrame && - !Array.isArray(data[selectedFile.data.fname]) && + !Array.isArray(data?.[selectedFile.data.fname]) && filteredList.length > lastLoadedIndex && Object.keys(cacheStack).length !== filteredList.length && !multiFrameDisplay @@ -325,15 +358,18 @@ const DcmDisplay = (props: DcmImageProps) => { */ const handleImageRendered = useCallback(() => { if (activeViewportRef.current) { - const newIndex = activeViewportRef.current.getCurrentImageIdIndex(); - setCurrentImageIndex(newIndex); + if ( + multiFrameDisplay || + (!multiFrameDisplay && Object.keys(imageStack).length > 1) + ) { + const newIndex = activeViewportRef.current.getCurrentImageIdIndex(); + setCurrentImageIndex(newIndex); + } if ( filteredList && - newIndex >= filteredList.length - 15 && fetchMore && !filesLoading && - !isLoadingMore && !loadingFirstFrame && !multiFrameDisplay ) { @@ -341,12 +377,12 @@ const DcmDisplay = (props: DcmImageProps) => { } } }, [ + multiFrameDisplay, + imageStack, filteredList, fetchMore, filesLoading, - isLoadingMore, loadingFirstFrame, - multiFrameDisplay, handlePagination, ]); @@ -374,7 +410,7 @@ const DcmDisplay = (props: DcmImageProps) => { const imageCount = useMemo(() => { return multiFrameDisplay ? (imageStack[fname] as string[]).length - : Object.values(imageStack).flat().length; + : Object.keys(imageStack).length; }, [multiFrameDisplay, imageStack, fname]); const totalDigits = imageCount.toString().length; @@ -395,14 +431,13 @@ const DcmDisplay = (props: DcmImageProps) => { ) return; - const defaultPlaybackSpeed = 24; // Use default playback speed (fps) - const frameDuration = 1000 / defaultPlaybackSpeed; // Calculate frame duration in milliseconds + const defaultPlaybackSpeed = 24; // Default playback speed (fps) + const frameDuration = 1000 / defaultPlaybackSpeed; // Frame duration in milliseconds cineIntervalIdRef.current = setInterval(() => { if (activeViewportRef.current) { let currentIndex = activeViewportRef.current.getCurrentImageIdIndex(); - const totalImages = imageCount; - currentIndex = (currentIndex + 1) % totalImages; + currentIndex = (currentIndex + 1) % imageCount; activeViewportRef.current.setImageIdIndex(currentIndex); setCurrentImageIndex(currentIndex); } @@ -446,7 +481,7 @@ const DcmDisplay = (props: DcmImageProps) => { top: "0.25em", right: "0.25em", zIndex: 99999, - width: "200px", // Set a fixed width + width: "200px", }} > {/* Current Index Display */} @@ -455,7 +490,7 @@ const DcmDisplay = (props: DcmImageProps) => { style={{ color: "#fff", marginBottom: "0.5em", - fontFamily: "monospace", // Use monospaced font + fontFamily: "monospace", }} > {`Current Index: ${currentIndexDisplay}/${imageCountDisplay}`} diff --git a/src/components/Preview/displays/dicomUtils/dataDictionary.ts b/src/components/Preview/displays/dicomUtils/dataDictionary.ts deleted file mode 100644 index 86a3b3520..000000000 --- a/src/components/Preview/displays/dicomUtils/dataDictionary.ts +++ /dev/null @@ -1,28575 +0,0 @@ -export const TAG_DICT = { - "(0000,0000)": { - tag: "(0000,0000)", - vr: "UL", - vm: "1", - name: "CommandGroupLength", - }, - "(0000,0001)": { - tag: "(0000,0001)", - vr: "UL", - vm: "1", - name: "CommandLengthToEnd", - }, - "(0000,0002)": { - tag: "(0000,0002)", - vr: "UI", - vm: "1", - name: "AffectedSOPClassUID", - }, - "(0000,0003)": { - tag: "(0000,0003)", - vr: "UI", - vm: "1", - name: "RequestedSOPClassUID", - }, - "(0000,0010)": { - tag: "(0000,0010)", - vr: "SH", - vm: "1", - name: "CommandRecognitionCode", - }, - "(0000,0100)": { - tag: "(0000,0100)", - vr: "US", - vm: "1", - name: "CommandField", - }, - "(0000,0110)": { tag: "(0000,0110)", vr: "US", vm: "1", name: "MessageID" }, - "(0000,0120)": { - tag: "(0000,0120)", - vr: "US", - vm: "1", - name: "MessageIDBeingRespondedTo", - }, - "(0000,0200)": { tag: "(0000,0200)", vr: "AE", vm: "1", name: "Initiator" }, - "(0000,0300)": { tag: "(0000,0300)", vr: "AE", vm: "1", name: "Receiver" }, - "(0000,0400)": { - tag: "(0000,0400)", - vr: "AE", - vm: "1", - name: "FindLocation", - }, - "(0000,0600)": { - tag: "(0000,0600)", - vr: "AE", - vm: "1", - name: "MoveDestination", - }, - "(0000,0700)": { tag: "(0000,0700)", vr: "US", vm: "1", name: "Priority" }, - "(0000,0800)": { - tag: "(0000,0800)", - vr: "US", - vm: "1", - name: "CommandDataSetType", - }, - "(0000,0850)": { - tag: "(0000,0850)", - vr: "US", - vm: "1", - name: "NumberOfMatches", - }, - "(0000,0860)": { - tag: "(0000,0860)", - vr: "US", - vm: "1", - name: "ResponseSequenceNumber", - }, - "(0000,0900)": { tag: "(0000,0900)", vr: "US", vm: "1", name: "Status" }, - "(0000,0901)": { - tag: "(0000,0901)", - vr: "AT", - vm: "1-n", - name: "OffendingElement", - }, - "(0000,0902)": { - tag: "(0000,0902)", - vr: "LO", - vm: "1", - name: "ErrorComment", - }, - "(0000,0903)": { tag: "(0000,0903)", vr: "US", vm: "1", name: "ErrorID" }, - "(0000,1000)": { - tag: "(0000,1000)", - vr: "UI", - vm: "1", - name: "AffectedSOPInstanceUID", - }, - "(0000,1001)": { - tag: "(0000,1001)", - vr: "UI", - vm: "1", - name: "RequestedSOPInstanceUID", - }, - "(0000,1002)": { tag: "(0000,1002)", vr: "US", vm: "1", name: "EventTypeID" }, - "(0000,1005)": { - tag: "(0000,1005)", - vr: "AT", - vm: "1-n", - name: "AttributeIdentifierList", - }, - "(0000,1008)": { - tag: "(0000,1008)", - vr: "US", - vm: "1", - name: "ActionTypeID", - }, - "(0000,1020)": { - tag: "(0000,1020)", - vr: "US", - vm: "1", - name: "NumberOfRemainingSuboperations", - }, - "(0000,1021)": { - tag: "(0000,1021)", - vr: "US", - vm: "1", - name: "NumberOfCompletedSuboperations", - }, - "(0000,1022)": { - tag: "(0000,1022)", - vr: "US", - vm: "1", - name: "NumberOfFailedSuboperations", - }, - "(0000,1023)": { - tag: "(0000,1023)", - vr: "US", - vm: "1", - name: "NumberOfWarningSuboperations", - }, - "(0000,1030)": { - tag: "(0000,1030)", - vr: "AE", - vm: "1", - name: "MoveOriginatorApplicationEntityTitle", - }, - "(0000,1031)": { - tag: "(0000,1031)", - vr: "US", - vm: "1", - name: "MoveOriginatorMessageID", - }, - "(0000,4000)": { - tag: "(0000,4000)", - vr: "LT", - vm: "1", - name: "DialogReceiver", - }, - "(0000,4010)": { - tag: "(0000,4010)", - vr: "LT", - vm: "1", - name: "TerminalType", - }, - "(0000,5010)": { - tag: "(0000,5010)", - vr: "SH", - vm: "1", - name: "MessageSetID", - }, - "(0000,5020)": { - tag: "(0000,5020)", - vr: "SH", - vm: "1", - name: "EndMessageID", - }, - "(0000,5110)": { - tag: "(0000,5110)", - vr: "LT", - vm: "1", - name: "DisplayFormat", - }, - "(0000,5120)": { - tag: "(0000,5120)", - vr: "LT", - vm: "1", - name: "PagePositionID", - }, - "(0000,5130)": { - tag: "(0000,5130)", - vr: "CS", - vm: "1", - name: "TextFormatID", - }, - "(0000,5140)": { - tag: "(0000,5140)", - vr: "CS", - vm: "1", - name: "NormalReverse", - }, - "(0000,5150)": { - tag: "(0000,5150)", - vr: "CS", - vm: "1", - name: "AddGrayScale", - }, - "(0000,5160)": { tag: "(0000,5160)", vr: "CS", vm: "1", name: "Borders" }, - "(0000,5170)": { tag: "(0000,5170)", vr: "IS", vm: "1", name: "Copies" }, - "(0000,5180)": { - tag: "(0000,5180)", - vr: "CS", - vm: "1", - name: "CommandMagnificationType", - }, - "(0000,5190)": { tag: "(0000,5190)", vr: "CS", vm: "1", name: "Erase" }, - "(0000,51A0)": { tag: "(0000,51A0)", vr: "CS", vm: "1", name: "Print" }, - "(0000,51B0)": { tag: "(0000,51B0)", vr: "US", vm: "1-n", name: "Overlays" }, - "(0002,0000)": { - tag: "(0002,0000)", - vr: "UL", - vm: "1", - name: "FileMetaInformationGroupLength", - }, - "(0002,0001)": { - tag: "(0002,0001)", - vr: "OB", - vm: "1", - name: "FileMetaInformationVersion", - }, - "(0002,0002)": { - tag: "(0002,0002)", - vr: "UI", - vm: "1", - name: "MediaStorageSOPClassUID", - }, - "(0002,0003)": { - tag: "(0002,0003)", - vr: "UI", - vm: "1", - name: "MediaStorageSOPInstanceUID", - }, - "(0002,0010)": { - tag: "(0002,0010)", - vr: "UI", - vm: "1", - name: "TransferSyntaxUID", - }, - "(0002,0012)": { - tag: "(0002,0012)", - vr: "UI", - vm: "1", - name: "ImplementationClassUID", - }, - "(0002,0013)": { - tag: "(0002,0013)", - vr: "SH", - vm: "1", - name: "ImplementationVersionName", - }, - "(0002,0016)": { - tag: "(0002,0016)", - vr: "AE", - vm: "1", - name: "SourceApplicationEntityTitle", - }, - "(0002,0017)": { - tag: "(0002,0017)", - vr: "AE", - vm: "1", - name: "SendingApplicationEntityTitle", - }, - "(0002,0018)": { - tag: "(0002,0018)", - vr: "AE", - vm: "1", - name: "ReceivingApplicationEntityTitle", - }, - "(0002,0026)": { - tag: "(0002,0026)", - vr: "UR", - vm: "1", - name: "SourcePresentationAddress", - }, - "(0002,0027)": { - tag: "(0002,0027)", - vr: "UR", - vm: "1", - name: "SendingPresentationAddress", - }, - "(0002,0028)": { - tag: "(0002,0028)", - vr: "UR", - vm: "1", - name: "ReceivingPresentationAddress", - }, - "(0002,0031)": { - tag: "(0002,0031)", - vr: "OB", - vm: "1", - name: "RTVMetaInformationVersion", - }, - "(0002,0032)": { - tag: "(0002,0032)", - vr: "UI", - vm: "1", - name: "RTVCommunicationSOPClassUID", - }, - "(0002,0033)": { - tag: "(0002,0033)", - vr: "UI", - vm: "1", - name: "RTVCommunicationSOPInstanceUID", - }, - "(0002,0035)": { - tag: "(0002,0035)", - vr: "OB", - vm: "1", - name: "RTVSourceIdentifier", - }, - "(0002,0036)": { - tag: "(0002,0036)", - vr: "OB", - vm: "1", - name: "RTVFlowIdentifier", - }, - "(0002,0037)": { - tag: "(0002,0037)", - vr: "UL", - vm: "1", - name: "RTVFlowRTPSamplingRate", - }, - "(0002,0038)": { - tag: "(0002,0038)", - vr: "FD", - vm: "1", - name: "RTVFlowActualFrameDuration", - }, - "(0002,0100)": { - tag: "(0002,0100)", - vr: "UI", - vm: "1", - name: "PrivateInformationCreatorUID", - }, - "(0002,0102)": { - tag: "(0002,0102)", - vr: "OB", - vm: "1", - name: "PrivateInformation", - }, - "(0004,1130)": { tag: "(0004,1130)", vr: "CS", vm: "1", name: "FileSetID" }, - "(0004,1141)": { - tag: "(0004,1141)", - vr: "CS", - vm: "1-8", - name: "FileSetDescriptorFileID", - }, - "(0004,1142)": { - tag: "(0004,1142)", - vr: "CS", - vm: "1", - name: "SpecificCharacterSetOfFileSetDescriptorFile", - }, - "(0004,1200)": { - tag: "(0004,1200)", - vr: "UL", - vm: "1", - name: "OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity", - }, - "(0004,1202)": { - tag: "(0004,1202)", - vr: "UL", - vm: "1", - name: "OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity", - }, - "(0004,1212)": { - tag: "(0004,1212)", - vr: "US", - vm: "1", - name: "FileSetConsistencyFlag", - }, - "(0004,1220)": { - tag: "(0004,1220)", - vr: "SQ", - vm: "1", - name: "DirectoryRecordSequence", - }, - "(0004,1400)": { - tag: "(0004,1400)", - vr: "UL", - vm: "1", - name: "OffsetOfTheNextDirectoryRecord", - }, - "(0004,1410)": { - tag: "(0004,1410)", - vr: "US", - vm: "1", - name: "RecordInUseFlag", - }, - "(0004,1420)": { - tag: "(0004,1420)", - vr: "UL", - vm: "1", - name: "OffsetOfReferencedLowerLevelDirectoryEntity", - }, - "(0004,1430)": { - tag: "(0004,1430)", - vr: "CS", - vm: "1", - name: "DirectoryRecordType", - }, - "(0004,1432)": { - tag: "(0004,1432)", - vr: "UI", - vm: "1", - name: "PrivateRecordUID", - }, - "(0004,1500)": { - tag: "(0004,1500)", - vr: "CS", - vm: "1-8", - name: "ReferencedFileID", - }, - "(0004,1504)": { - tag: "(0004,1504)", - vr: "UL", - vm: "1", - name: "MRDRDirectoryRecordOffset", - }, - "(0004,1510)": { - tag: "(0004,1510)", - vr: "UI", - vm: "1", - name: "ReferencedSOPClassUIDInFile", - }, - "(0004,1511)": { - tag: "(0004,1511)", - vr: "UI", - vm: "1", - name: "ReferencedSOPInstanceUIDInFile", - }, - "(0004,1512)": { - tag: "(0004,1512)", - vr: "UI", - vm: "1", - name: "ReferencedTransferSyntaxUIDInFile", - }, - "(0004,151A)": { - tag: "(0004,151A)", - vr: "UI", - vm: "1-n", - name: "ReferencedRelatedGeneralSOPClassUIDInFile", - }, - "(0004,1600)": { - tag: "(0004,1600)", - vr: "UL", - vm: "1", - name: "NumberOfReferences", - }, - "(0006,0001)": { - tag: "(0006,0001)", - vr: "SQ", - vm: "1", - name: "CurrentFrameFunctionalGroupsSequence", - }, - "(0008,0001)": { tag: "(0008,0001)", vr: "UL", vm: "1", name: "LengthToEnd" }, - "(0008,0005)": { - tag: "(0008,0005)", - vr: "CS", - vm: "1-n", - name: "SpecificCharacterSet", - }, - "(0008,0006)": { - tag: "(0008,0006)", - vr: "SQ", - vm: "1", - name: "LanguageCodeSequence", - }, - "(0008,0008)": { tag: "(0008,0008)", vr: "CS", vm: "2-n", name: "ImageType" }, - "(0008,0010)": { - tag: "(0008,0010)", - vr: "SH", - vm: "1", - name: "RecognitionCode", - }, - "(0008,0012)": { - tag: "(0008,0012)", - vr: "DA", - vm: "1", - name: "InstanceCreationDate", - }, - "(0008,0013)": { - tag: "(0008,0013)", - vr: "TM", - vm: "1", - name: "InstanceCreationTime", - }, - "(0008,0014)": { - tag: "(0008,0014)", - vr: "UI", - vm: "1", - name: "InstanceCreatorUID", - }, - "(0008,0015)": { - tag: "(0008,0015)", - vr: "DT", - vm: "1", - name: "InstanceCoercionDateTime", - }, - "(0008,0016)": { tag: "(0008,0016)", vr: "UI", vm: "1", name: "SOPClassUID" }, - "(0008,0018)": { - tag: "(0008,0018)", - vr: "UI", - vm: "1", - name: "SOPInstanceUID", - }, - "(0008,001A)": { - tag: "(0008,001A)", - vr: "UI", - vm: "1-n", - name: "RelatedGeneralSOPClassUID", - }, - "(0008,001B)": { - tag: "(0008,001B)", - vr: "UI", - vm: "1", - name: "OriginalSpecializedSOPClassUID", - }, - "(0008,0020)": { tag: "(0008,0020)", vr: "DA", vm: "1", name: "StudyDate" }, - "(0008,0021)": { tag: "(0008,0021)", vr: "DA", vm: "1", name: "SeriesDate" }, - "(0008,0022)": { - tag: "(0008,0022)", - vr: "DA", - vm: "1", - name: "AcquisitionDate", - }, - "(0008,0023)": { tag: "(0008,0023)", vr: "DA", vm: "1", name: "ContentDate" }, - "(0008,0024)": { tag: "(0008,0024)", vr: "DA", vm: "1", name: "OverlayDate" }, - "(0008,0025)": { tag: "(0008,0025)", vr: "DA", vm: "1", name: "CurveDate" }, - "(0008,002A)": { - tag: "(0008,002A)", - vr: "DT", - vm: "1", - name: "AcquisitionDateTime", - }, - "(0008,0030)": { tag: "(0008,0030)", vr: "TM", vm: "1", name: "StudyTime" }, - "(0008,0031)": { tag: "(0008,0031)", vr: "TM", vm: "1", name: "SeriesTime" }, - "(0008,0032)": { - tag: "(0008,0032)", - vr: "TM", - vm: "1", - name: "AcquisitionTime", - }, - "(0008,0033)": { tag: "(0008,0033)", vr: "TM", vm: "1", name: "ContentTime" }, - "(0008,0034)": { tag: "(0008,0034)", vr: "TM", vm: "1", name: "OverlayTime" }, - "(0008,0035)": { tag: "(0008,0035)", vr: "TM", vm: "1", name: "CurveTime" }, - "(0008,0040)": { tag: "(0008,0040)", vr: "US", vm: "1", name: "DataSetType" }, - "(0008,0041)": { - tag: "(0008,0041)", - vr: "LO", - vm: "1", - name: "DataSetSubtype", - }, - "(0008,0042)": { - tag: "(0008,0042)", - vr: "CS", - vm: "1", - name: "NuclearMedicineSeriesType", - }, - "(0008,0050)": { - tag: "(0008,0050)", - vr: "SH", - vm: "1", - name: "AccessionNumber", - }, - "(0008,0051)": { - tag: "(0008,0051)", - vr: "SQ", - vm: "1", - name: "IssuerOfAccessionNumberSequence", - }, - "(0008,0052)": { - tag: "(0008,0052)", - vr: "CS", - vm: "1", - name: "QueryRetrieveLevel", - }, - "(0008,0053)": { - tag: "(0008,0053)", - vr: "CS", - vm: "1", - name: "QueryRetrieveView", - }, - "(0008,0054)": { - tag: "(0008,0054)", - vr: "AE", - vm: "1-n", - name: "RetrieveAETitle", - }, - "(0008,0055)": { - tag: "(0008,0055)", - vr: "AE", - vm: "1", - name: "StationAETitle", - }, - "(0008,0056)": { - tag: "(0008,0056)", - vr: "CS", - vm: "1", - name: "InstanceAvailability", - }, - "(0008,0058)": { - tag: "(0008,0058)", - vr: "UI", - vm: "1-n", - name: "FailedSOPInstanceUIDList", - }, - "(0008,0060)": { tag: "(0008,0060)", vr: "CS", vm: "1", name: "Modality" }, - "(0008,0061)": { - tag: "(0008,0061)", - vr: "CS", - vm: "1-n", - name: "ModalitiesInStudy", - }, - "(0008,0062)": { - tag: "(0008,0062)", - vr: "UI", - vm: "1-n", - name: "SOPClassesInStudy", - }, - "(0008,0063)": { - tag: "(0008,0063)", - vr: "SQ", - vm: "1", - name: "AnatomicRegionsInStudyCodeSequence", - }, - "(0008,0064)": { - tag: "(0008,0064)", - vr: "CS", - vm: "1", - name: "ConversionType", - }, - "(0008,0068)": { - tag: "(0008,0068)", - vr: "CS", - vm: "1", - name: "PresentationIntentType", - }, - "(0008,0070)": { - tag: "(0008,0070)", - vr: "LO", - vm: "1", - name: "Manufacturer", - }, - "(0008,0080)": { - tag: "(0008,0080)", - vr: "LO", - vm: "1", - name: "InstitutionName", - }, - "(0008,0081)": { - tag: "(0008,0081)", - vr: "ST", - vm: "1", - name: "InstitutionAddress", - }, - "(0008,0082)": { - tag: "(0008,0082)", - vr: "SQ", - vm: "1", - name: "InstitutionCodeSequence", - }, - "(0008,0090)": { - tag: "(0008,0090)", - vr: "PN", - vm: "1", - name: "ReferringPhysicianName", - }, - "(0008,0092)": { - tag: "(0008,0092)", - vr: "ST", - vm: "1", - name: "ReferringPhysicianAddress", - }, - "(0008,0094)": { - tag: "(0008,0094)", - vr: "SH", - vm: "1-n", - name: "ReferringPhysicianTelephoneNumbers", - }, - "(0008,0096)": { - tag: "(0008,0096)", - vr: "SQ", - vm: "1", - name: "ReferringPhysicianIdentificationSequence", - }, - "(0008,009C)": { - tag: "(0008,009C)", - vr: "PN", - vm: "1-n", - name: "ConsultingPhysicianName", - }, - "(0008,009D)": { - tag: "(0008,009D)", - vr: "SQ", - vm: "1", - name: "ConsultingPhysicianIdentificationSequence", - }, - "(0008,0100)": { tag: "(0008,0100)", vr: "SH", vm: "1", name: "CodeValue" }, - "(0008,0101)": { - tag: "(0008,0101)", - vr: "LO", - vm: "1", - name: "ExtendedCodeValue", - }, - "(0008,0102)": { - tag: "(0008,0102)", - vr: "SH", - vm: "1", - name: "CodingSchemeDesignator", - }, - "(0008,0103)": { - tag: "(0008,0103)", - vr: "SH", - vm: "1", - name: "CodingSchemeVersion", - }, - "(0008,0104)": { tag: "(0008,0104)", vr: "LO", vm: "1", name: "CodeMeaning" }, - "(0008,0105)": { - tag: "(0008,0105)", - vr: "CS", - vm: "1", - name: "MappingResource", - }, - "(0008,0106)": { - tag: "(0008,0106)", - vr: "DT", - vm: "1", - name: "ContextGroupVersion", - }, - "(0008,0107)": { - tag: "(0008,0107)", - vr: "DT", - vm: "1", - name: "ContextGroupLocalVersion", - }, - "(0008,0108)": { - tag: "(0008,0108)", - vr: "LT", - vm: "1", - name: "ExtendedCodeMeaning", - }, - "(0008,0109)": { - tag: "(0008,0109)", - vr: "SQ", - vm: "1", - name: "CodingSchemeResourcesSequence", - }, - "(0008,010A)": { - tag: "(0008,010A)", - vr: "CS", - vm: "1", - name: "CodingSchemeURLType", - }, - "(0008,010B)": { - tag: "(0008,010B)", - vr: "CS", - vm: "1", - name: "ContextGroupExtensionFlag", - }, - "(0008,010C)": { - tag: "(0008,010C)", - vr: "UI", - vm: "1", - name: "CodingSchemeUID", - }, - "(0008,010D)": { - tag: "(0008,010D)", - vr: "UI", - vm: "1", - name: "ContextGroupExtensionCreatorUID", - }, - "(0008,010E)": { - tag: "(0008,010E)", - vr: "UR", - vm: "1", - name: "CodingSchemeURL", - }, - "(0008,010F)": { - tag: "(0008,010F)", - vr: "CS", - vm: "1", - name: "ContextIdentifier", - }, - "(0008,0110)": { - tag: "(0008,0110)", - vr: "SQ", - vm: "1", - name: "CodingSchemeIdentificationSequence", - }, - "(0008,0112)": { - tag: "(0008,0112)", - vr: "LO", - vm: "1", - name: "CodingSchemeRegistry", - }, - "(0008,0114)": { - tag: "(0008,0114)", - vr: "ST", - vm: "1", - name: "CodingSchemeExternalID", - }, - "(0008,0115)": { - tag: "(0008,0115)", - vr: "ST", - vm: "1", - name: "CodingSchemeName", - }, - "(0008,0116)": { - tag: "(0008,0116)", - vr: "ST", - vm: "1", - name: "CodingSchemeResponsibleOrganization", - }, - "(0008,0117)": { tag: "(0008,0117)", vr: "UI", vm: "1", name: "ContextUID" }, - "(0008,0118)": { - tag: "(0008,0118)", - vr: "UI", - vm: "1", - name: "MappingResourceUID", - }, - "(0008,0119)": { - tag: "(0008,0119)", - vr: "UC", - vm: "1", - name: "LongCodeValue", - }, - "(0008,0120)": { - tag: "(0008,0120)", - vr: "UR", - vm: "1", - name: "URNCodeValue", - }, - "(0008,0121)": { - tag: "(0008,0121)", - vr: "SQ", - vm: "1", - name: "EquivalentCodeSequence", - }, - "(0008,0122)": { - tag: "(0008,0122)", - vr: "LO", - vm: "1", - name: "MappingResourceName", - }, - "(0008,0123)": { - tag: "(0008,0123)", - vr: "SQ", - vm: "1", - name: "ContextGroupIdentificationSequence", - }, - "(0008,0124)": { - tag: "(0008,0124)", - vr: "SQ", - vm: "1", - name: "MappingResourceIdentificationSequence", - }, - "(0008,0201)": { - tag: "(0008,0201)", - vr: "SH", - vm: "1", - name: "TimezoneOffsetFromUTC", - }, - "(0008,0202)": { tag: "(0008,0202)", vr: "", vm: "", name: "" }, - "(0008,0220)": { - tag: "(0008,0220)", - vr: "SQ", - vm: "1", - name: "ResponsibleGroupCodeSequence", - }, - "(0008,0221)": { - tag: "(0008,0221)", - vr: "CS", - vm: "1", - name: "EquipmentModality", - }, - "(0008,0222)": { - tag: "(0008,0222)", - vr: "LO", - vm: "1", - name: "ManufacturerRelatedModelGroup", - }, - "(0008,0300)": { - tag: "(0008,0300)", - vr: "SQ", - vm: "1", - name: "PrivateDataElementCharacteristicsSequence", - }, - "(0008,0301)": { - tag: "(0008,0301)", - vr: "US", - vm: "1", - name: "PrivateGroupReference", - }, - "(0008,0302)": { - tag: "(0008,0302)", - vr: "LO", - vm: "1", - name: "PrivateCreatorReference", - }, - "(0008,0303)": { - tag: "(0008,0303)", - vr: "CS", - vm: "1", - name: "BlockIdentifyingInformationStatus", - }, - "(0008,0304)": { - tag: "(0008,0304)", - vr: "US", - vm: "1-n", - name: "NonidentifyingPrivateElements", - }, - "(0008,0305)": { - tag: "(0008,0305)", - vr: "SQ", - vm: "1", - name: "DeidentificationActionSequence", - }, - "(0008,0306)": { - tag: "(0008,0306)", - vr: "US", - vm: "1-n", - name: "IdentifyingPrivateElements", - }, - "(0008,0307)": { - tag: "(0008,0307)", - vr: "CS", - vm: "1", - name: "DeidentificationAction", - }, - "(0008,0308)": { - tag: "(0008,0308)", - vr: "US", - vm: "1", - name: "PrivateDataElement", - }, - "(0008,0309)": { - tag: "(0008,0309)", - vr: "UL", - vm: "1-3", - name: "PrivateDataElementValueMultiplicity", - }, - "(0008,030A)": { - tag: "(0008,030A)", - vr: "CS", - vm: "1", - name: "PrivateDataElementValueRepresentation", - }, - "(0008,030B)": { - tag: "(0008,030B)", - vr: "UL", - vm: "1-2", - name: "PrivateDataElementNumberOfItems", - }, - "(0008,030C)": { - tag: "(0008,030C)", - vr: "UC", - vm: "1", - name: "PrivateDataElementName", - }, - "(0008,030D)": { - tag: "(0008,030D)", - vr: "UC", - vm: "1", - name: "PrivateDataElementKeyword", - }, - "(0008,030E)": { - tag: "(0008,030E)", - vr: "UT", - vm: "1", - name: "PrivateDataElementDescription", - }, - "(0008,030F)": { - tag: "(0008,030F)", - vr: "UT", - vm: "1", - name: "PrivateDataElementEncoding", - }, - "(0008,0310)": { - tag: "(0008,0310)", - vr: "SQ", - vm: "1", - name: "PrivateDataElementDefinitionSequence", - }, - "(0008,1000)": { tag: "(0008,1000)", vr: "AE", vm: "1", name: "NetworkID" }, - "(0008,1010)": { tag: "(0008,1010)", vr: "SH", vm: "1", name: "StationName" }, - "(0008,1030)": { - tag: "(0008,1030)", - vr: "LO", - vm: "1", - name: "StudyDescription", - }, - "(0008,1032)": { - tag: "(0008,1032)", - vr: "SQ", - vm: "1", - name: "ProcedureCodeSequence", - }, - "(0008,103E)": { - tag: "(0008,103E)", - vr: "LO", - vm: "1", - name: "SeriesDescription", - }, - "(0008,103F)": { - tag: "(0008,103F)", - vr: "SQ", - vm: "1", - name: "SeriesDescriptionCodeSequence", - }, - "(0008,1040)": { - tag: "(0008,1040)", - vr: "LO", - vm: "1", - name: "InstitutionalDepartmentName", - }, - "(0008,1041)": { - tag: "(0008,1041)", - vr: "SQ", - vm: "1", - name: "InstitutionalDepartmentTypeCodeSequence", - }, - "(0008,1048)": { - tag: "(0008,1048)", - vr: "PN", - vm: "1-n", - name: "PhysiciansOfRecord", - }, - "(0008,1049)": { - tag: "(0008,1049)", - vr: "SQ", - vm: "1", - name: "PhysiciansOfRecordIdentificationSequence", - }, - "(0008,1050)": { - tag: "(0008,1050)", - vr: "PN", - vm: "1-n", - name: "PerformingPhysicianName", - }, - "(0008,1052)": { - tag: "(0008,1052)", - vr: "SQ", - vm: "1", - name: "PerformingPhysicianIdentificationSequence", - }, - "(0008,1060)": { - tag: "(0008,1060)", - vr: "PN", - vm: "1-n", - name: "NameOfPhysiciansReadingStudy", - }, - "(0008,1062)": { - tag: "(0008,1062)", - vr: "SQ", - vm: "1", - name: "PhysiciansReadingStudyIdentificationSequence", - }, - "(0008,1070)": { - tag: "(0008,1070)", - vr: "PN", - vm: "1-n", - name: "OperatorsName", - }, - "(0008,1072)": { - tag: "(0008,1072)", - vr: "SQ", - vm: "1", - name: "OperatorIdentificationSequence", - }, - "(0008,1080)": { - tag: "(0008,1080)", - vr: "LO", - vm: "1-n", - name: "AdmittingDiagnosesDescription", - }, - "(0008,1084)": { - tag: "(0008,1084)", - vr: "SQ", - vm: "1", - name: "AdmittingDiagnosesCodeSequence", - }, - "(0008,1090)": { - tag: "(0008,1090)", - vr: "LO", - vm: "1", - name: "ManufacturerModelName", - }, - "(0008,1100)": { - tag: "(0008,1100)", - vr: "SQ", - vm: "1", - name: "ReferencedResultsSequence", - }, - "(0008,1110)": { - tag: "(0008,1110)", - vr: "SQ", - vm: "1", - name: "ReferencedStudySequence", - }, - "(0008,1111)": { - tag: "(0008,1111)", - vr: "SQ", - vm: "1", - name: "ReferencedPerformedProcedureStepSequence", - }, - "(0008,1115)": { - tag: "(0008,1115)", - vr: "SQ", - vm: "1", - name: "ReferencedSeriesSequence", - }, - "(0008,1120)": { - tag: "(0008,1120)", - vr: "SQ", - vm: "1", - name: "ReferencedPatientSequence", - }, - "(0008,1125)": { - tag: "(0008,1125)", - vr: "SQ", - vm: "1", - name: "ReferencedVisitSequence", - }, - "(0008,1130)": { - tag: "(0008,1130)", - vr: "SQ", - vm: "1", - name: "ReferencedOverlaySequence", - }, - "(0008,1134)": { - tag: "(0008,1134)", - vr: "SQ", - vm: "1", - name: "ReferencedStereometricInstanceSequence", - }, - "(0008,113A)": { - tag: "(0008,113A)", - vr: "SQ", - vm: "1", - name: "ReferencedWaveformSequence", - }, - "(0008,1140)": { - tag: "(0008,1140)", - vr: "SQ", - vm: "1", - name: "ReferencedImageSequence", - }, - "(0008,1145)": { - tag: "(0008,1145)", - vr: "SQ", - vm: "1", - name: "ReferencedCurveSequence", - }, - "(0008,114A)": { - tag: "(0008,114A)", - vr: "SQ", - vm: "1", - name: "ReferencedInstanceSequence", - }, - "(0008,114B)": { - tag: "(0008,114B)", - vr: "SQ", - vm: "1", - name: "ReferencedRealWorldValueMappingInstanceSequence", - }, - "(0008,1150)": { - tag: "(0008,1150)", - vr: "UI", - vm: "1", - name: "ReferencedSOPClassUID", - }, - "(0008,1155)": { - tag: "(0008,1155)", - vr: "UI", - vm: "1", - name: "ReferencedSOPInstanceUID", - }, - "(0008,1156)": { - tag: "(0008,1156)", - vr: "SQ", - vm: "1", - name: "DefinitionSourceSequence", - }, - "(0008,115A)": { - tag: "(0008,115A)", - vr: "UI", - vm: "1-n", - name: "SOPClassesSupported", - }, - "(0008,1160)": { - tag: "(0008,1160)", - vr: "IS", - vm: "1-n", - name: "ReferencedFrameNumber", - }, - "(0008,1161)": { - tag: "(0008,1161)", - vr: "UL", - vm: "1-n", - name: "SimpleFrameList", - }, - "(0008,1162)": { - tag: "(0008,1162)", - vr: "UL", - vm: "3-3n", - name: "CalculatedFrameList", - }, - "(0008,1163)": { tag: "(0008,1163)", vr: "FD", vm: "2", name: "TimeRange" }, - "(0008,1164)": { - tag: "(0008,1164)", - vr: "SQ", - vm: "1", - name: "FrameExtractionSequence", - }, - "(0008,1167)": { - tag: "(0008,1167)", - vr: "UI", - vm: "1", - name: "MultiFrameSourceSOPInstanceUID", - }, - "(0008,1190)": { tag: "(0008,1190)", vr: "UR", vm: "1", name: "RetrieveURL" }, - "(0008,1195)": { - tag: "(0008,1195)", - vr: "UI", - vm: "1", - name: "TransactionUID", - }, - "(0008,1196)": { - tag: "(0008,1196)", - vr: "US", - vm: "1", - name: "WarningReason", - }, - "(0008,1197)": { - tag: "(0008,1197)", - vr: "US", - vm: "1", - name: "FailureReason", - }, - "(0008,1198)": { - tag: "(0008,1198)", - vr: "SQ", - vm: "1", - name: "FailedSOPSequence", - }, - "(0008,1199)": { - tag: "(0008,1199)", - vr: "SQ", - vm: "1", - name: "ReferencedSOPSequence", - }, - "(0008,119A)": { - tag: "(0008,119A)", - vr: "SQ", - vm: "1", - name: "OtherFailuresSequence", - }, - "(0008,1200)": { - tag: "(0008,1200)", - vr: "SQ", - vm: "1", - name: "StudiesContainingOtherReferencedInstancesSequence", - }, - "(0008,1250)": { - tag: "(0008,1250)", - vr: "SQ", - vm: "1", - name: "RelatedSeriesSequence", - }, - "(0008,2110)": { - tag: "(0008,2110)", - vr: "CS", - vm: "1", - name: "LossyImageCompressionRetired", - }, - "(0008,2111)": { - tag: "(0008,2111)", - vr: "ST", - vm: "1", - name: "DerivationDescription", - }, - "(0008,2112)": { - tag: "(0008,2112)", - vr: "SQ", - vm: "1", - name: "SourceImageSequence", - }, - "(0008,2120)": { tag: "(0008,2120)", vr: "SH", vm: "1", name: "StageName" }, - "(0008,2122)": { tag: "(0008,2122)", vr: "IS", vm: "1", name: "StageNumber" }, - "(0008,2124)": { - tag: "(0008,2124)", - vr: "IS", - vm: "1", - name: "NumberOfStages", - }, - "(0008,2127)": { tag: "(0008,2127)", vr: "SH", vm: "1", name: "ViewName" }, - "(0008,2128)": { tag: "(0008,2128)", vr: "IS", vm: "1", name: "ViewNumber" }, - "(0008,2129)": { - tag: "(0008,2129)", - vr: "IS", - vm: "1", - name: "NumberOfEventTimers", - }, - "(0008,212A)": { - tag: "(0008,212A)", - vr: "IS", - vm: "1", - name: "NumberOfViewsInStage", - }, - "(0008,2130)": { - tag: "(0008,2130)", - vr: "DS", - vm: "1-n", - name: "EventElapsedTimes", - }, - "(0008,2132)": { - tag: "(0008,2132)", - vr: "LO", - vm: "1-n", - name: "EventTimerNames", - }, - "(0008,2133)": { - tag: "(0008,2133)", - vr: "SQ", - vm: "1", - name: "EventTimerSequence", - }, - "(0008,2134)": { - tag: "(0008,2134)", - vr: "FD", - vm: "1", - name: "EventTimeOffset", - }, - "(0008,2135)": { - tag: "(0008,2135)", - vr: "SQ", - vm: "1", - name: "EventCodeSequence", - }, - "(0008,2142)": { tag: "(0008,2142)", vr: "IS", vm: "1", name: "StartTrim" }, - "(0008,2143)": { tag: "(0008,2143)", vr: "IS", vm: "1", name: "StopTrim" }, - "(0008,2144)": { - tag: "(0008,2144)", - vr: "IS", - vm: "1", - name: "RecommendedDisplayFrameRate", - }, - "(0008,2200)": { - tag: "(0008,2200)", - vr: "CS", - vm: "1", - name: "TransducerPosition", - }, - "(0008,2204)": { - tag: "(0008,2204)", - vr: "CS", - vm: "1", - name: "TransducerOrientation", - }, - "(0008,2208)": { - tag: "(0008,2208)", - vr: "CS", - vm: "1", - name: "AnatomicStructure", - }, - "(0008,2218)": { - tag: "(0008,2218)", - vr: "SQ", - vm: "1", - name: "AnatomicRegionSequence", - }, - "(0008,2220)": { - tag: "(0008,2220)", - vr: "SQ", - vm: "1", - name: "AnatomicRegionModifierSequence", - }, - "(0008,2228)": { - tag: "(0008,2228)", - vr: "SQ", - vm: "1", - name: "PrimaryAnatomicStructureSequence", - }, - "(0008,2229)": { - tag: "(0008,2229)", - vr: "SQ", - vm: "1", - name: "AnatomicStructureSpaceOrRegionSequence", - }, - "(0008,2230)": { - tag: "(0008,2230)", - vr: "SQ", - vm: "1", - name: "PrimaryAnatomicStructureModifierSequence", - }, - "(0008,2240)": { - tag: "(0008,2240)", - vr: "SQ", - vm: "1", - name: "TransducerPositionSequence", - }, - "(0008,2242)": { - tag: "(0008,2242)", - vr: "SQ", - vm: "1", - name: "TransducerPositionModifierSequence", - }, - "(0008,2244)": { - tag: "(0008,2244)", - vr: "SQ", - vm: "1", - name: "TransducerOrientationSequence", - }, - "(0008,2246)": { - tag: "(0008,2246)", - vr: "SQ", - vm: "1", - name: "TransducerOrientationModifierSequence", - }, - "(0008,2251)": { - tag: "(0008,2251)", - vr: "SQ", - vm: "1", - name: "AnatomicStructureSpaceOrRegionCodeSequenceTrial", - }, - "(0008,2253)": { - tag: "(0008,2253)", - vr: "SQ", - vm: "1", - name: "AnatomicPortalOfEntranceCodeSequenceTrial", - }, - "(0008,2255)": { - tag: "(0008,2255)", - vr: "SQ", - vm: "1", - name: "AnatomicApproachDirectionCodeSequenceTrial", - }, - "(0008,2256)": { - tag: "(0008,2256)", - vr: "ST", - vm: "1", - name: "AnatomicPerspectiveDescriptionTrial", - }, - "(0008,2257)": { - tag: "(0008,2257)", - vr: "SQ", - vm: "1", - name: "AnatomicPerspectiveCodeSequenceTrial", - }, - "(0008,2258)": { - tag: "(0008,2258)", - vr: "ST", - vm: "1", - name: "AnatomicLocationOfExaminingInstrumentDescriptionTrial", - }, - "(0008,2259)": { - tag: "(0008,2259)", - vr: "SQ", - vm: "1", - name: "AnatomicLocationOfExaminingInstrumentCodeSequenceTrial", - }, - "(0008,225A)": { - tag: "(0008,225A)", - vr: "SQ", - vm: "1", - name: "AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial", - }, - "(0008,225C)": { - tag: "(0008,225C)", - vr: "SQ", - vm: "1", - name: "OnAxisBackgroundAnatomicStructureCodeSequenceTrial", - }, - "(0008,3001)": { - tag: "(0008,3001)", - vr: "SQ", - vm: "1", - name: "AlternateRepresentationSequence", - }, - "(0008,3002)": { - tag: "(0008,3002)", - vr: "UI", - vm: "1-n", - name: "AvailableTransferSyntaxUID", - }, - "(0008,3010)": { - tag: "(0008,3010)", - vr: "UI", - vm: "1-n", - name: "IrradiationEventUID", - }, - "(0008,3011)": { - tag: "(0008,3011)", - vr: "SQ", - vm: "1", - name: "SourceIrradiationEventSequence", - }, - "(0008,3012)": { - tag: "(0008,3012)", - vr: "UI", - vm: "1", - name: "RadiopharmaceuticalAdministrationEventUID", - }, - "(0008,4000)": { - tag: "(0008,4000)", - vr: "LT", - vm: "1", - name: "IdentifyingComments", - }, - "(0008,9007)": { tag: "(0008,9007)", vr: "CS", vm: "4", name: "FrameType" }, - "(0008,9092)": { - tag: "(0008,9092)", - vr: "SQ", - vm: "1", - name: "ReferencedImageEvidenceSequence", - }, - "(0008,9121)": { - tag: "(0008,9121)", - vr: "SQ", - vm: "1", - name: "ReferencedRawDataSequence", - }, - "(0008,9123)": { - tag: "(0008,9123)", - vr: "UI", - vm: "1", - name: "CreatorVersionUID", - }, - "(0008,9124)": { - tag: "(0008,9124)", - vr: "SQ", - vm: "1", - name: "DerivationImageSequence", - }, - "(0008,9154)": { - tag: "(0008,9154)", - vr: "SQ", - vm: "1", - name: "SourceImageEvidenceSequence", - }, - "(0008,9205)": { - tag: "(0008,9205)", - vr: "CS", - vm: "1", - name: "PixelPresentation", - }, - "(0008,9206)": { - tag: "(0008,9206)", - vr: "CS", - vm: "1", - name: "VolumetricProperties", - }, - "(0008,9207)": { - tag: "(0008,9207)", - vr: "CS", - vm: "1", - name: "VolumeBasedCalculationTechnique", - }, - "(0008,9208)": { - tag: "(0008,9208)", - vr: "CS", - vm: "1", - name: "ComplexImageComponent", - }, - "(0008,9209)": { - tag: "(0008,9209)", - vr: "CS", - vm: "1", - name: "AcquisitionContrast", - }, - "(0008,9215)": { - tag: "(0008,9215)", - vr: "SQ", - vm: "1", - name: "DerivationCodeSequence", - }, - "(0008,9237)": { - tag: "(0008,9237)", - vr: "SQ", - vm: "1", - name: "ReferencedPresentationStateSequence", - }, - "(0008,9410)": { - tag: "(0008,9410)", - vr: "SQ", - vm: "1", - name: "ReferencedOtherPlaneSequence", - }, - "(0008,9458)": { - tag: "(0008,9458)", - vr: "SQ", - vm: "1", - name: "FrameDisplaySequence", - }, - "(0008,9459)": { - tag: "(0008,9459)", - vr: "FL", - vm: "1", - name: "RecommendedDisplayFrameRateInFloat", - }, - "(0008,9460)": { - tag: "(0008,9460)", - vr: "CS", - vm: "1", - name: "SkipFrameRangeFlag", - }, - "(0010,0010)": { tag: "(0010,0010)", vr: "PN", vm: "1", name: "PatientName" }, - "(0010,0020)": { tag: "(0010,0020)", vr: "LO", vm: "1", name: "PatientID" }, - "(0010,0021)": { - tag: "(0010,0021)", - vr: "LO", - vm: "1", - name: "IssuerOfPatientID", - }, - "(0010,0022)": { - tag: "(0010,0022)", - vr: "CS", - vm: "1", - name: "TypeOfPatientID", - }, - "(0010,0024)": { - tag: "(0010,0024)", - vr: "SQ", - vm: "1", - name: "IssuerOfPatientIDQualifiersSequence", - }, - "(0010,0026)": { - tag: "(0010,0026)", - vr: "SQ", - vm: "1", - name: "SourcePatientGroupIdentificationSequence", - }, - "(0010,0027)": { - tag: "(0010,0027)", - vr: "SQ", - vm: "1", - name: "GroupOfPatientsIdentificationSequence", - }, - "(0010,0028)": { - tag: "(0010,0028)", - vr: "US", - vm: "3", - name: "SubjectRelativePositionInImage", - }, - "(0010,0030)": { - tag: "(0010,0030)", - vr: "DA", - vm: "1", - name: "PatientBirthDate", - }, - "(0010,0032)": { - tag: "(0010,0032)", - vr: "TM", - vm: "1", - name: "PatientBirthTime", - }, - "(0010,0033)": { - tag: "(0010,0033)", - vr: "LO", - vm: "1", - name: "PatientBirthDateInAlternativeCalendar", - }, - "(0010,0034)": { - tag: "(0010,0034)", - vr: "LO", - vm: "1", - name: "PatientDeathDateInAlternativeCalendar", - }, - "(0010,0035)": { - tag: "(0010,0035)", - vr: "CS", - vm: "1", - name: "PatientAlternativeCalendar", - }, - "(0010,0040)": { tag: "(0010,0040)", vr: "CS", vm: "1", name: "PatientSex" }, - "(0010,0050)": { - tag: "(0010,0050)", - vr: "SQ", - vm: "1", - name: "PatientInsurancePlanCodeSequence", - }, - "(0010,0101)": { - tag: "(0010,0101)", - vr: "SQ", - vm: "1", - name: "PatientPrimaryLanguageCodeSequence", - }, - "(0010,0102)": { - tag: "(0010,0102)", - vr: "SQ", - vm: "1", - name: "PatientPrimaryLanguageModifierCodeSequence", - }, - "(0010,0200)": { - tag: "(0010,0200)", - vr: "CS", - vm: "1", - name: "QualityControlSubject", - }, - "(0010,0201)": { - tag: "(0010,0201)", - vr: "SQ", - vm: "1", - name: "QualityControlSubjectTypeCodeSequence", - }, - "(0010,0212)": { - tag: "(0010,0212)", - vr: "UC", - vm: "1", - name: "StrainDescription", - }, - "(0010,0213)": { - tag: "(0010,0213)", - vr: "LO", - vm: "1", - name: "StrainNomenclature", - }, - "(0010,0214)": { - tag: "(0010,0214)", - vr: "LO", - vm: "1", - name: "StrainStockNumber", - }, - "(0010,0215)": { - tag: "(0010,0215)", - vr: "SQ", - vm: "1", - name: "StrainSourceRegistryCodeSequence", - }, - "(0010,0216)": { - tag: "(0010,0216)", - vr: "SQ", - vm: "1", - name: "StrainStockSequence", - }, - "(0010,0217)": { - tag: "(0010,0217)", - vr: "LO", - vm: "1", - name: "StrainSource", - }, - "(0010,0218)": { - tag: "(0010,0218)", - vr: "UT", - vm: "1", - name: "StrainAdditionalInformation", - }, - "(0010,0219)": { - tag: "(0010,0219)", - vr: "SQ", - vm: "1", - name: "StrainCodeSequence", - }, - "(0010,0221)": { - tag: "(0010,0221)", - vr: "SQ", - vm: "1", - name: "GeneticModificationsSequence", - }, - "(0010,0222)": { - tag: "(0010,0222)", - vr: "UC", - vm: "1", - name: "GeneticModificationsDescription", - }, - "(0010,0223)": { - tag: "(0010,0223)", - vr: "LO", - vm: "1", - name: "GeneticModificationsNomenclature", - }, - "(0010,0229)": { - tag: "(0010,0229)", - vr: "SQ", - vm: "1", - name: "GeneticModificationsCodeSequence", - }, - "(0010,1000)": { - tag: "(0010,1000)", - vr: "LO", - vm: "1-n", - name: "OtherPatientIDs", - }, - "(0010,1001)": { - tag: "(0010,1001)", - vr: "PN", - vm: "1-n", - name: "OtherPatientNames", - }, - "(0010,1002)": { - tag: "(0010,1002)", - vr: "SQ", - vm: "1", - name: "OtherPatientIDsSequence", - }, - "(0010,1005)": { - tag: "(0010,1005)", - vr: "PN", - vm: "1", - name: "PatientBirthName", - }, - "(0010,1010)": { tag: "(0010,1010)", vr: "AS", vm: "1", name: "PatientAge" }, - "(0010,1020)": { tag: "(0010,1020)", vr: "DS", vm: "1", name: "PatientSize" }, - "(0010,1021)": { - tag: "(0010,1021)", - vr: "SQ", - vm: "1", - name: "PatientSizeCodeSequence", - }, - "(0010,1022)": { - tag: "(0010,1022)", - vr: "DS", - vm: "1", - name: "PatientBodyMassIndex", - }, - "(0010,1023)": { - tag: "(0010,1023)", - vr: "DS", - vm: "1", - name: "MeasuredAPDimension", - }, - "(0010,1024)": { - tag: "(0010,1024)", - vr: "DS", - vm: "1", - name: "MeasuredLateralDimension", - }, - "(0010,1030)": { - tag: "(0010,1030)", - vr: "DS", - vm: "1", - name: "PatientWeight", - }, - "(0010,1040)": { - tag: "(0010,1040)", - vr: "LO", - vm: "1", - name: "PatientAddress", - }, - "(0010,1050)": { - tag: "(0010,1050)", - vr: "LO", - vm: "1-n", - name: "InsurancePlanIdentification", - }, - "(0010,1060)": { - tag: "(0010,1060)", - vr: "PN", - vm: "1", - name: "PatientMotherBirthName", - }, - "(0010,1080)": { - tag: "(0010,1080)", - vr: "LO", - vm: "1", - name: "MilitaryRank", - }, - "(0010,1081)": { - tag: "(0010,1081)", - vr: "LO", - vm: "1", - name: "BranchOfService", - }, - "(0010,1090)": { - tag: "(0010,1090)", - vr: "LO", - vm: "1", - name: "MedicalRecordLocator", - }, - "(0010,1100)": { - tag: "(0010,1100)", - vr: "SQ", - vm: "1", - name: "ReferencedPatientPhotoSequence", - }, - "(0010,2000)": { - tag: "(0010,2000)", - vr: "LO", - vm: "1-n", - name: "MedicalAlerts", - }, - "(0010,2110)": { tag: "(0010,2110)", vr: "LO", vm: "1-n", name: "Allergies" }, - "(0010,2150)": { - tag: "(0010,2150)", - vr: "LO", - vm: "1", - name: "CountryOfResidence", - }, - "(0010,2152)": { - tag: "(0010,2152)", - vr: "LO", - vm: "1", - name: "RegionOfResidence", - }, - "(0010,2154)": { - tag: "(0010,2154)", - vr: "SH", - vm: "1-n", - name: "PatientTelephoneNumbers", - }, - "(0010,2155)": { - tag: "(0010,2155)", - vr: "LT", - vm: "1", - name: "PatientTelecomInformation", - }, - "(0010,2160)": { tag: "(0010,2160)", vr: "SH", vm: "1", name: "EthnicGroup" }, - "(0010,2180)": { tag: "(0010,2180)", vr: "SH", vm: "1", name: "Occupation" }, - "(0010,21A0)": { - tag: "(0010,21A0)", - vr: "CS", - vm: "1", - name: "SmokingStatus", - }, - "(0010,21B0)": { - tag: "(0010,21B0)", - vr: "LT", - vm: "1", - name: "AdditionalPatientHistory", - }, - "(0010,21C0)": { - tag: "(0010,21C0)", - vr: "US", - vm: "1", - name: "PregnancyStatus", - }, - "(0010,21D0)": { - tag: "(0010,21D0)", - vr: "DA", - vm: "1", - name: "LastMenstrualDate", - }, - "(0010,21F0)": { - tag: "(0010,21F0)", - vr: "LO", - vm: "1", - name: "PatientReligiousPreference", - }, - "(0010,2201)": { - tag: "(0010,2201)", - vr: "LO", - vm: "1", - name: "PatientSpeciesDescription", - }, - "(0010,2202)": { - tag: "(0010,2202)", - vr: "SQ", - vm: "1", - name: "PatientSpeciesCodeSequence", - }, - "(0010,2203)": { - tag: "(0010,2203)", - vr: "CS", - vm: "1", - name: "PatientSexNeutered", - }, - "(0010,2210)": { - tag: "(0010,2210)", - vr: "CS", - vm: "1", - name: "AnatomicalOrientationType", - }, - "(0010,2292)": { - tag: "(0010,2292)", - vr: "LO", - vm: "1", - name: "PatientBreedDescription", - }, - "(0010,2293)": { - tag: "(0010,2293)", - vr: "SQ", - vm: "1", - name: "PatientBreedCodeSequence", - }, - "(0010,2294)": { - tag: "(0010,2294)", - vr: "SQ", - vm: "1", - name: "BreedRegistrationSequence", - }, - "(0010,2295)": { - tag: "(0010,2295)", - vr: "LO", - vm: "1", - name: "BreedRegistrationNumber", - }, - "(0010,2296)": { - tag: "(0010,2296)", - vr: "SQ", - vm: "1", - name: "BreedRegistryCodeSequence", - }, - "(0010,2297)": { - tag: "(0010,2297)", - vr: "PN", - vm: "1", - name: "ResponsiblePerson", - }, - "(0010,2298)": { - tag: "(0010,2298)", - vr: "CS", - vm: "1", - name: "ResponsiblePersonRole", - }, - "(0010,2299)": { - tag: "(0010,2299)", - vr: "LO", - vm: "1", - name: "ResponsibleOrganization", - }, - "(0010,4000)": { - tag: "(0010,4000)", - vr: "LT", - vm: "1", - name: "PatientComments", - }, - "(0010,9431)": { - tag: "(0010,9431)", - vr: "FL", - vm: "1", - name: "ExaminedBodyThickness", - }, - "(0012,0010)": { - tag: "(0012,0010)", - vr: "LO", - vm: "1", - name: "ClinicalTrialSponsorName", - }, - "(0012,0020)": { - tag: "(0012,0020)", - vr: "LO", - vm: "1", - name: "ClinicalTrialProtocolID", - }, - "(0012,0021)": { - tag: "(0012,0021)", - vr: "LO", - vm: "1", - name: "ClinicalTrialProtocolName", - }, - "(0012,0030)": { - tag: "(0012,0030)", - vr: "LO", - vm: "1", - name: "ClinicalTrialSiteID", - }, - "(0012,0031)": { - tag: "(0012,0031)", - vr: "LO", - vm: "1", - name: "ClinicalTrialSiteName", - }, - "(0012,0040)": { - tag: "(0012,0040)", - vr: "LO", - vm: "1", - name: "ClinicalTrialSubjectID", - }, - "(0012,0042)": { - tag: "(0012,0042)", - vr: "LO", - vm: "1", - name: "ClinicalTrialSubjectReadingID", - }, - "(0012,0050)": { - tag: "(0012,0050)", - vr: "LO", - vm: "1", - name: "ClinicalTrialTimePointID", - }, - "(0012,0051)": { - tag: "(0012,0051)", - vr: "ST", - vm: "1", - name: "ClinicalTrialTimePointDescription", - }, - "(0012,0052)": { - tag: "(0012,0052)", - vr: "FD", - vm: "1", - name: "LongitudinalTemporalOffsetFromEvent", - }, - "(0012,0053)": { - tag: "(0012,0053)", - vr: "CS", - vm: "1", - name: "LongitudinalTemporalEventType", - }, - "(0012,0060)": { - tag: "(0012,0060)", - vr: "LO", - vm: "1", - name: "ClinicalTrialCoordinatingCenterName", - }, - "(0012,0062)": { - tag: "(0012,0062)", - vr: "CS", - vm: "1", - name: "PatientIdentityRemoved", - }, - "(0012,0063)": { - tag: "(0012,0063)", - vr: "LO", - vm: "1-n", - name: "DeidentificationMethod", - }, - "(0012,0064)": { - tag: "(0012,0064)", - vr: "SQ", - vm: "1", - name: "DeidentificationMethodCodeSequence", - }, - "(0012,0071)": { - tag: "(0012,0071)", - vr: "LO", - vm: "1", - name: "ClinicalTrialSeriesID", - }, - "(0012,0072)": { - tag: "(0012,0072)", - vr: "LO", - vm: "1", - name: "ClinicalTrialSeriesDescription", - }, - "(0012,0081)": { - tag: "(0012,0081)", - vr: "LO", - vm: "1", - name: "ClinicalTrialProtocolEthicsCommitteeName", - }, - "(0012,0082)": { - tag: "(0012,0082)", - vr: "LO", - vm: "1", - name: "ClinicalTrialProtocolEthicsCommitteeApprovalNumber", - }, - "(0012,0083)": { - tag: "(0012,0083)", - vr: "SQ", - vm: "1", - name: "ConsentForClinicalTrialUseSequence", - }, - "(0012,0084)": { - tag: "(0012,0084)", - vr: "CS", - vm: "1", - name: "DistributionType", - }, - "(0012,0085)": { - tag: "(0012,0085)", - vr: "CS", - vm: "1", - name: "ConsentForDistributionFlag", - }, - "(0012,0086)": { - tag: "(0012,0086)", - vr: "DA", - vm: "1", - name: "EthicsCommitteeApprovalEffectivenessStartDate", - }, - "(0012,0087)": { - tag: "(0012,0087)", - vr: "DA", - vm: "1", - name: "EthicsCommitteeApprovalEffectivenessEndDate", - }, - "(0014,0023)": { - tag: "(0014,0023)", - vr: "ST", - vm: "1", - name: "CADFileFormat", - }, - "(0014,0024)": { - tag: "(0014,0024)", - vr: "ST", - vm: "1", - name: "ComponentReferenceSystem", - }, - "(0014,0025)": { - tag: "(0014,0025)", - vr: "ST", - vm: "1", - name: "ComponentManufacturingProcedure", - }, - "(0014,0028)": { - tag: "(0014,0028)", - vr: "ST", - vm: "1", - name: "ComponentManufacturer", - }, - "(0014,0030)": { - tag: "(0014,0030)", - vr: "DS", - vm: "1-n", - name: "MaterialThickness", - }, - "(0014,0032)": { - tag: "(0014,0032)", - vr: "DS", - vm: "1-n", - name: "MaterialPipeDiameter", - }, - "(0014,0034)": { - tag: "(0014,0034)", - vr: "DS", - vm: "1-n", - name: "MaterialIsolationDiameter", - }, - "(0014,0042)": { - tag: "(0014,0042)", - vr: "ST", - vm: "1", - name: "MaterialGrade", - }, - "(0014,0044)": { - tag: "(0014,0044)", - vr: "ST", - vm: "1", - name: "MaterialPropertiesDescription", - }, - "(0014,0045)": { - tag: "(0014,0045)", - vr: "ST", - vm: "1", - name: "MaterialPropertiesFileFormatRetired", - }, - "(0014,0046)": { - tag: "(0014,0046)", - vr: "LT", - vm: "1", - name: "MaterialNotes", - }, - "(0014,0050)": { - tag: "(0014,0050)", - vr: "CS", - vm: "1", - name: "ComponentShape", - }, - "(0014,0052)": { - tag: "(0014,0052)", - vr: "CS", - vm: "1", - name: "CurvatureType", - }, - "(0014,0054)": { - tag: "(0014,0054)", - vr: "DS", - vm: "1", - name: "OuterDiameter", - }, - "(0014,0056)": { - tag: "(0014,0056)", - vr: "DS", - vm: "1", - name: "InnerDiameter", - }, - "(0014,0100)": { - tag: "(0014,0100)", - vr: "LO", - vm: "1-n", - name: "ComponentWelderIDs", - }, - "(0014,0101)": { - tag: "(0014,0101)", - vr: "CS", - vm: "1", - name: "SecondaryApprovalStatus", - }, - "(0014,0102)": { - tag: "(0014,0102)", - vr: "DA", - vm: "1", - name: "SecondaryReviewDate", - }, - "(0014,0103)": { - tag: "(0014,0103)", - vr: "TM", - vm: "1", - name: "SecondaryReviewTime", - }, - "(0014,0104)": { - tag: "(0014,0104)", - vr: "PN", - vm: "1", - name: "SecondaryReviewerName", - }, - "(0014,0105)": { tag: "(0014,0105)", vr: "ST", vm: "1", name: "RepairID" }, - "(0014,0106)": { - tag: "(0014,0106)", - vr: "SQ", - vm: "1", - name: "MultipleComponentApprovalSequence", - }, - "(0014,0107)": { - tag: "(0014,0107)", - vr: "CS", - vm: "1-n", - name: "OtherApprovalStatus", - }, - "(0014,0108)": { - tag: "(0014,0108)", - vr: "CS", - vm: "1-n", - name: "OtherSecondaryApprovalStatus", - }, - "(0014,1010)": { - tag: "(0014,1010)", - vr: "ST", - vm: "1", - name: "ActualEnvironmentalConditions", - }, - "(0014,1020)": { tag: "(0014,1020)", vr: "DA", vm: "1", name: "ExpiryDate" }, - "(0014,1040)": { - tag: "(0014,1040)", - vr: "ST", - vm: "1", - name: "EnvironmentalConditions", - }, - "(0014,2002)": { - tag: "(0014,2002)", - vr: "SQ", - vm: "1", - name: "EvaluatorSequence", - }, - "(0014,2004)": { - tag: "(0014,2004)", - vr: "IS", - vm: "1", - name: "EvaluatorNumber", - }, - "(0014,2006)": { - tag: "(0014,2006)", - vr: "PN", - vm: "1", - name: "EvaluatorName", - }, - "(0014,2008)": { - tag: "(0014,2008)", - vr: "IS", - vm: "1", - name: "EvaluationAttempt", - }, - "(0014,2012)": { - tag: "(0014,2012)", - vr: "SQ", - vm: "1", - name: "IndicationSequence", - }, - "(0014,2014)": { - tag: "(0014,2014)", - vr: "IS", - vm: "1", - name: "IndicationNumber", - }, - "(0014,2016)": { - tag: "(0014,2016)", - vr: "SH", - vm: "1", - name: "IndicationLabel", - }, - "(0014,2018)": { - tag: "(0014,2018)", - vr: "ST", - vm: "1", - name: "IndicationDescription", - }, - "(0014,201A)": { - tag: "(0014,201A)", - vr: "CS", - vm: "1-n", - name: "IndicationType", - }, - "(0014,201C)": { - tag: "(0014,201C)", - vr: "CS", - vm: "1", - name: "IndicationDisposition", - }, - "(0014,201E)": { - tag: "(0014,201E)", - vr: "SQ", - vm: "1", - name: "IndicationROISequence", - }, - "(0014,2030)": { - tag: "(0014,2030)", - vr: "SQ", - vm: "1", - name: "IndicationPhysicalPropertySequence", - }, - "(0014,2032)": { - tag: "(0014,2032)", - vr: "SH", - vm: "1", - name: "PropertyLabel", - }, - "(0014,2202)": { - tag: "(0014,2202)", - vr: "IS", - vm: "1", - name: "CoordinateSystemNumberOfAxes", - }, - "(0014,2204)": { - tag: "(0014,2204)", - vr: "SQ", - vm: "1", - name: "CoordinateSystemAxesSequence", - }, - "(0014,2206)": { - tag: "(0014,2206)", - vr: "ST", - vm: "1", - name: "CoordinateSystemAxisDescription", - }, - "(0014,2208)": { - tag: "(0014,2208)", - vr: "CS", - vm: "1", - name: "CoordinateSystemDataSetMapping", - }, - "(0014,220A)": { - tag: "(0014,220A)", - vr: "IS", - vm: "1", - name: "CoordinateSystemAxisNumber", - }, - "(0014,220C)": { - tag: "(0014,220C)", - vr: "CS", - vm: "1", - name: "CoordinateSystemAxisType", - }, - "(0014,220E)": { - tag: "(0014,220E)", - vr: "CS", - vm: "1", - name: "CoordinateSystemAxisUnits", - }, - "(0014,2210)": { - tag: "(0014,2210)", - vr: "OB", - vm: "1", - name: "CoordinateSystemAxisValues", - }, - "(0014,2220)": { - tag: "(0014,2220)", - vr: "SQ", - vm: "1", - name: "CoordinateSystemTransformSequence", - }, - "(0014,2222)": { - tag: "(0014,2222)", - vr: "ST", - vm: "1", - name: "TransformDescription", - }, - "(0014,2224)": { - tag: "(0014,2224)", - vr: "IS", - vm: "1", - name: "TransformNumberOfAxes", - }, - "(0014,2226)": { - tag: "(0014,2226)", - vr: "IS", - vm: "1-n", - name: "TransformOrderOfAxes", - }, - "(0014,2228)": { - tag: "(0014,2228)", - vr: "CS", - vm: "1", - name: "TransformedAxisUnits", - }, - "(0014,222A)": { - tag: "(0014,222A)", - vr: "DS", - vm: "1-n", - name: "CoordinateSystemTransformRotationAndScaleMatrix", - }, - "(0014,222C)": { - tag: "(0014,222C)", - vr: "DS", - vm: "1-n", - name: "CoordinateSystemTransformTranslationMatrix", - }, - "(0014,3011)": { - tag: "(0014,3011)", - vr: "DS", - vm: "1", - name: "InternalDetectorFrameTime", - }, - "(0014,3012)": { - tag: "(0014,3012)", - vr: "DS", - vm: "1", - name: "NumberOfFramesIntegrated", - }, - "(0014,3020)": { - tag: "(0014,3020)", - vr: "SQ", - vm: "1", - name: "DetectorTemperatureSequence", - }, - "(0014,3022)": { tag: "(0014,3022)", vr: "ST", vm: "1", name: "SensorName" }, - "(0014,3024)": { - tag: "(0014,3024)", - vr: "DS", - vm: "1", - name: "HorizontalOffsetOfSensor", - }, - "(0014,3026)": { - tag: "(0014,3026)", - vr: "DS", - vm: "1", - name: "VerticalOffsetOfSensor", - }, - "(0014,3028)": { - tag: "(0014,3028)", - vr: "DS", - vm: "1", - name: "SensorTemperature", - }, - "(0014,3040)": { - tag: "(0014,3040)", - vr: "SQ", - vm: "1", - name: "DarkCurrentSequence", - }, - "(0014,3050)": { - tag: "(0014,3050)", - vr: "OB|OW", - vm: "1", - name: "DarkCurrentCounts", - }, - "(0014,3060)": { - tag: "(0014,3060)", - vr: "SQ", - vm: "1", - name: "GainCorrectionReferenceSequence", - }, - "(0014,3070)": { - tag: "(0014,3070)", - vr: "OB|OW", - vm: "1", - name: "AirCounts", - }, - "(0014,3071)": { - tag: "(0014,3071)", - vr: "DS", - vm: "1", - name: "KVUsedInGainCalibration", - }, - "(0014,3072)": { - tag: "(0014,3072)", - vr: "DS", - vm: "1", - name: "MAUsedInGainCalibration", - }, - "(0014,3073)": { - tag: "(0014,3073)", - vr: "DS", - vm: "1", - name: "NumberOfFramesUsedForIntegration", - }, - "(0014,3074)": { - tag: "(0014,3074)", - vr: "LO", - vm: "1", - name: "FilterMaterialUsedInGainCalibration", - }, - "(0014,3075)": { - tag: "(0014,3075)", - vr: "DS", - vm: "1", - name: "FilterThicknessUsedInGainCalibration", - }, - "(0014,3076)": { - tag: "(0014,3076)", - vr: "DA", - vm: "1", - name: "DateOfGainCalibration", - }, - "(0014,3077)": { - tag: "(0014,3077)", - vr: "TM", - vm: "1", - name: "TimeOfGainCalibration", - }, - "(0014,3080)": { - tag: "(0014,3080)", - vr: "OB", - vm: "1", - name: "BadPixelImage", - }, - "(0014,3099)": { - tag: "(0014,3099)", - vr: "LT", - vm: "1", - name: "CalibrationNotes", - }, - "(0014,3100)": { - tag: "(0014,3100)", - vr: "LT", - vm: "1", - name: "LinearityCorrectionTechnique", - }, - "(0014,3101)": { - tag: "(0014,3101)", - vr: "LT", - vm: "1", - name: "BeamHardeningCorrectionTechnique", - }, - "(0014,4002)": { - tag: "(0014,4002)", - vr: "SQ", - vm: "1", - name: "PulserEquipmentSequence", - }, - "(0014,4004)": { tag: "(0014,4004)", vr: "CS", vm: "1", name: "PulserType" }, - "(0014,4006)": { tag: "(0014,4006)", vr: "LT", vm: "1", name: "PulserNotes" }, - "(0014,4008)": { - tag: "(0014,4008)", - vr: "SQ", - vm: "1", - name: "ReceiverEquipmentSequence", - }, - "(0014,400A)": { - tag: "(0014,400A)", - vr: "CS", - vm: "1", - name: "AmplifierType", - }, - "(0014,400C)": { - tag: "(0014,400C)", - vr: "LT", - vm: "1", - name: "ReceiverNotes", - }, - "(0014,400E)": { - tag: "(0014,400E)", - vr: "SQ", - vm: "1", - name: "PreAmplifierEquipmentSequence", - }, - "(0014,400F)": { - tag: "(0014,400F)", - vr: "LT", - vm: "1", - name: "PreAmplifierNotes", - }, - "(0014,4010)": { - tag: "(0014,4010)", - vr: "SQ", - vm: "1", - name: "TransmitTransducerSequence", - }, - "(0014,4011)": { - tag: "(0014,4011)", - vr: "SQ", - vm: "1", - name: "ReceiveTransducerSequence", - }, - "(0014,4012)": { - tag: "(0014,4012)", - vr: "US", - vm: "1", - name: "NumberOfElements", - }, - "(0014,4013)": { - tag: "(0014,4013)", - vr: "CS", - vm: "1", - name: "ElementShape", - }, - "(0014,4014)": { - tag: "(0014,4014)", - vr: "DS", - vm: "1", - name: "ElementDimensionA", - }, - "(0014,4015)": { - tag: "(0014,4015)", - vr: "DS", - vm: "1", - name: "ElementDimensionB", - }, - "(0014,4016)": { - tag: "(0014,4016)", - vr: "DS", - vm: "1", - name: "ElementPitchA", - }, - "(0014,4017)": { - tag: "(0014,4017)", - vr: "DS", - vm: "1", - name: "MeasuredBeamDimensionA", - }, - "(0014,4018)": { - tag: "(0014,4018)", - vr: "DS", - vm: "1", - name: "MeasuredBeamDimensionB", - }, - "(0014,4019)": { - tag: "(0014,4019)", - vr: "DS", - vm: "1", - name: "LocationOfMeasuredBeamDiameter", - }, - "(0014,401A)": { - tag: "(0014,401A)", - vr: "DS", - vm: "1", - name: "NominalFrequency", - }, - "(0014,401B)": { - tag: "(0014,401B)", - vr: "DS", - vm: "1", - name: "MeasuredCenterFrequency", - }, - "(0014,401C)": { - tag: "(0014,401C)", - vr: "DS", - vm: "1", - name: "MeasuredBandwidth", - }, - "(0014,401D)": { - tag: "(0014,401D)", - vr: "DS", - vm: "1", - name: "ElementPitchB", - }, - "(0014,4020)": { - tag: "(0014,4020)", - vr: "SQ", - vm: "1", - name: "PulserSettingsSequence", - }, - "(0014,4022)": { tag: "(0014,4022)", vr: "DS", vm: "1", name: "PulseWidth" }, - "(0014,4024)": { - tag: "(0014,4024)", - vr: "DS", - vm: "1", - name: "ExcitationFrequency", - }, - "(0014,4026)": { - tag: "(0014,4026)", - vr: "CS", - vm: "1", - name: "ModulationType", - }, - "(0014,4028)": { tag: "(0014,4028)", vr: "DS", vm: "1", name: "Damping" }, - "(0014,4030)": { - tag: "(0014,4030)", - vr: "SQ", - vm: "1", - name: "ReceiverSettingsSequence", - }, - "(0014,4031)": { - tag: "(0014,4031)", - vr: "DS", - vm: "1", - name: "AcquiredSoundpathLength", - }, - "(0014,4032)": { - tag: "(0014,4032)", - vr: "CS", - vm: "1", - name: "AcquisitionCompressionType", - }, - "(0014,4033)": { - tag: "(0014,4033)", - vr: "IS", - vm: "1", - name: "AcquisitionSampleSize", - }, - "(0014,4034)": { - tag: "(0014,4034)", - vr: "DS", - vm: "1", - name: "RectifierSmoothing", - }, - "(0014,4035)": { tag: "(0014,4035)", vr: "SQ", vm: "1", name: "DACSequence" }, - "(0014,4036)": { tag: "(0014,4036)", vr: "CS", vm: "1", name: "DACType" }, - "(0014,4038)": { - tag: "(0014,4038)", - vr: "DS", - vm: "1-n", - name: "DACGainPoints", - }, - "(0014,403A)": { - tag: "(0014,403A)", - vr: "DS", - vm: "1-n", - name: "DACTimePoints", - }, - "(0014,403C)": { - tag: "(0014,403C)", - vr: "DS", - vm: "1-n", - name: "DACAmplitude", - }, - "(0014,4040)": { - tag: "(0014,4040)", - vr: "SQ", - vm: "1", - name: "PreAmplifierSettingsSequence", - }, - "(0014,4050)": { - tag: "(0014,4050)", - vr: "SQ", - vm: "1", - name: "TransmitTransducerSettingsSequence", - }, - "(0014,4051)": { - tag: "(0014,4051)", - vr: "SQ", - vm: "1", - name: "ReceiveTransducerSettingsSequence", - }, - "(0014,4052)": { - tag: "(0014,4052)", - vr: "DS", - vm: "1", - name: "IncidentAngle", - }, - "(0014,4054)": { - tag: "(0014,4054)", - vr: "ST", - vm: "1", - name: "CouplingTechnique", - }, - "(0014,4056)": { - tag: "(0014,4056)", - vr: "ST", - vm: "1", - name: "CouplingMedium", - }, - "(0014,4057)": { - tag: "(0014,4057)", - vr: "DS", - vm: "1", - name: "CouplingVelocity", - }, - "(0014,4058)": { - tag: "(0014,4058)", - vr: "DS", - vm: "1", - name: "ProbeCenterLocationX", - }, - "(0014,4059)": { - tag: "(0014,4059)", - vr: "DS", - vm: "1", - name: "ProbeCenterLocationZ", - }, - "(0014,405A)": { - tag: "(0014,405A)", - vr: "DS", - vm: "1", - name: "SoundPathLength", - }, - "(0014,405C)": { - tag: "(0014,405C)", - vr: "ST", - vm: "1", - name: "DelayLawIdentifier", - }, - "(0014,4060)": { - tag: "(0014,4060)", - vr: "SQ", - vm: "1", - name: "GateSettingsSequence", - }, - "(0014,4062)": { - tag: "(0014,4062)", - vr: "DS", - vm: "1", - name: "GateThreshold", - }, - "(0014,4064)": { - tag: "(0014,4064)", - vr: "DS", - vm: "1", - name: "VelocityOfSound", - }, - "(0014,4070)": { - tag: "(0014,4070)", - vr: "SQ", - vm: "1", - name: "CalibrationSettingsSequence", - }, - "(0014,4072)": { - tag: "(0014,4072)", - vr: "ST", - vm: "1", - name: "CalibrationProcedure", - }, - "(0014,4074)": { - tag: "(0014,4074)", - vr: "SH", - vm: "1", - name: "ProcedureVersion", - }, - "(0014,4076)": { - tag: "(0014,4076)", - vr: "DA", - vm: "1", - name: "ProcedureCreationDate", - }, - "(0014,4078)": { - tag: "(0014,4078)", - vr: "DA", - vm: "1", - name: "ProcedureExpirationDate", - }, - "(0014,407A)": { - tag: "(0014,407A)", - vr: "DA", - vm: "1", - name: "ProcedureLastModifiedDate", - }, - "(0014,407C)": { - tag: "(0014,407C)", - vr: "TM", - vm: "1-n", - name: "CalibrationTime", - }, - "(0014,407E)": { - tag: "(0014,407E)", - vr: "DA", - vm: "1-n", - name: "CalibrationDate", - }, - "(0014,4080)": { - tag: "(0014,4080)", - vr: "SQ", - vm: "1", - name: "ProbeDriveEquipmentSequence", - }, - "(0014,4081)": { tag: "(0014,4081)", vr: "CS", vm: "1", name: "DriveType" }, - "(0014,4082)": { - tag: "(0014,4082)", - vr: "LT", - vm: "1", - name: "ProbeDriveNotes", - }, - "(0014,4083)": { - tag: "(0014,4083)", - vr: "SQ", - vm: "1", - name: "DriveProbeSequence", - }, - "(0014,4084)": { - tag: "(0014,4084)", - vr: "DS", - vm: "1", - name: "ProbeInductance", - }, - "(0014,4085)": { - tag: "(0014,4085)", - vr: "DS", - vm: "1", - name: "ProbeResistance", - }, - "(0014,4086)": { - tag: "(0014,4086)", - vr: "SQ", - vm: "1", - name: "ReceiveProbeSequence", - }, - "(0014,4087)": { - tag: "(0014,4087)", - vr: "SQ", - vm: "1", - name: "ProbeDriveSettingsSequence", - }, - "(0014,4088)": { - tag: "(0014,4088)", - vr: "DS", - vm: "1", - name: "BridgeResistors", - }, - "(0014,4089)": { - tag: "(0014,4089)", - vr: "DS", - vm: "1", - name: "ProbeOrientationAngle", - }, - "(0014,408B)": { - tag: "(0014,408B)", - vr: "DS", - vm: "1", - name: "UserSelectedGainY", - }, - "(0014,408C)": { - tag: "(0014,408C)", - vr: "DS", - vm: "1", - name: "UserSelectedPhase", - }, - "(0014,408D)": { - tag: "(0014,408D)", - vr: "DS", - vm: "1", - name: "UserSelectedOffsetX", - }, - "(0014,408E)": { - tag: "(0014,408E)", - vr: "DS", - vm: "1", - name: "UserSelectedOffsetY", - }, - "(0014,4091)": { - tag: "(0014,4091)", - vr: "SQ", - vm: "1", - name: "ChannelSettingsSequence", - }, - "(0014,4092)": { - tag: "(0014,4092)", - vr: "DS", - vm: "1", - name: "ChannelThreshold", - }, - "(0014,409A)": { - tag: "(0014,409A)", - vr: "SQ", - vm: "1", - name: "ScannerSettingsSequence", - }, - "(0014,409B)": { - tag: "(0014,409B)", - vr: "ST", - vm: "1", - name: "ScanProcedure", - }, - "(0014,409C)": { - tag: "(0014,409C)", - vr: "DS", - vm: "1", - name: "TranslationRateX", - }, - "(0014,409D)": { - tag: "(0014,409D)", - vr: "DS", - vm: "1", - name: "TranslationRateY", - }, - "(0014,409F)": { - tag: "(0014,409F)", - vr: "DS", - vm: "1", - name: "ChannelOverlap", - }, - "(0014,40A0)": { - tag: "(0014,40A0)", - vr: "LO", - vm: "1-n", - name: "ImageQualityIndicatorType", - }, - "(0014,40A1)": { - tag: "(0014,40A1)", - vr: "LO", - vm: "1-n", - name: "ImageQualityIndicatorMaterial", - }, - "(0014,40A2)": { - tag: "(0014,40A2)", - vr: "LO", - vm: "1-n", - name: "ImageQualityIndicatorSize", - }, - "(0014,5002)": { tag: "(0014,5002)", vr: "IS", vm: "1", name: "LINACEnergy" }, - "(0014,5004)": { tag: "(0014,5004)", vr: "IS", vm: "1", name: "LINACOutput" }, - "(0014,5100)": { - tag: "(0014,5100)", - vr: "US", - vm: "1", - name: "ActiveAperture", - }, - "(0014,5101)": { - tag: "(0014,5101)", - vr: "DS", - vm: "1", - name: "TotalAperture", - }, - "(0014,5102)": { - tag: "(0014,5102)", - vr: "DS", - vm: "1", - name: "ApertureElevation", - }, - "(0014,5103)": { - tag: "(0014,5103)", - vr: "DS", - vm: "1", - name: "MainLobeAngle", - }, - "(0014,5104)": { - tag: "(0014,5104)", - vr: "DS", - vm: "1", - name: "MainRoofAngle", - }, - "(0014,5105)": { - tag: "(0014,5105)", - vr: "CS", - vm: "1", - name: "ConnectorType", - }, - "(0014,5106)": { - tag: "(0014,5106)", - vr: "SH", - vm: "1", - name: "WedgeModelNumber", - }, - "(0014,5107)": { - tag: "(0014,5107)", - vr: "DS", - vm: "1", - name: "WedgeAngleFloat", - }, - "(0014,5108)": { - tag: "(0014,5108)", - vr: "DS", - vm: "1", - name: "WedgeRoofAngle", - }, - "(0014,5109)": { - tag: "(0014,5109)", - vr: "CS", - vm: "1", - name: "WedgeElement1Position", - }, - "(0014,510A)": { - tag: "(0014,510A)", - vr: "DS", - vm: "1", - name: "WedgeMaterialVelocity", - }, - "(0014,510B)": { - tag: "(0014,510B)", - vr: "SH", - vm: "1", - name: "WedgeMaterial", - }, - "(0014,510C)": { - tag: "(0014,510C)", - vr: "DS", - vm: "1", - name: "WedgeOffsetZ", - }, - "(0014,510D)": { - tag: "(0014,510D)", - vr: "DS", - vm: "1", - name: "WedgeOriginOffsetX", - }, - "(0014,510E)": { - tag: "(0014,510E)", - vr: "DS", - vm: "1", - name: "WedgeTimeDelay", - }, - "(0014,510F)": { tag: "(0014,510F)", vr: "SH", vm: "1", name: "WedgeName" }, - "(0014,5110)": { - tag: "(0014,5110)", - vr: "SH", - vm: "1", - name: "WedgeManufacturerName", - }, - "(0014,5111)": { - tag: "(0014,5111)", - vr: "LO", - vm: "1", - name: "WedgeDescription", - }, - "(0014,5112)": { - tag: "(0014,5112)", - vr: "DS", - vm: "1", - name: "NominalBeamAngle", - }, - "(0014,5113)": { - tag: "(0014,5113)", - vr: "DS", - vm: "1", - name: "WedgeOffsetX", - }, - "(0014,5114)": { - tag: "(0014,5114)", - vr: "DS", - vm: "1", - name: "WedgeOffsetY", - }, - "(0014,5115)": { - tag: "(0014,5115)", - vr: "DS", - vm: "1", - name: "WedgeTotalLength", - }, - "(0014,5116)": { - tag: "(0014,5116)", - vr: "DS", - vm: "1", - name: "WedgeInContactLength", - }, - "(0014,5117)": { - tag: "(0014,5117)", - vr: "DS", - vm: "1", - name: "WedgeFrontGap", - }, - "(0014,5118)": { - tag: "(0014,5118)", - vr: "DS", - vm: "1", - name: "WedgeTotalHeight", - }, - "(0014,5119)": { - tag: "(0014,5119)", - vr: "DS", - vm: "1", - name: "WedgeFrontHeight", - }, - "(0014,511A)": { - tag: "(0014,511A)", - vr: "DS", - vm: "1", - name: "WedgeRearHeight", - }, - "(0014,511B)": { - tag: "(0014,511B)", - vr: "DS", - vm: "1", - name: "WedgeTotalWidth", - }, - "(0014,511C)": { - tag: "(0014,511C)", - vr: "DS", - vm: "1", - name: "WedgeInContactWidth", - }, - "(0014,511D)": { - tag: "(0014,511D)", - vr: "DS", - vm: "1", - name: "WedgeChamferHeight", - }, - "(0014,511E)": { tag: "(0014,511E)", vr: "CS", vm: "1", name: "WedgeCurve" }, - "(0014,511F)": { - tag: "(0014,511F)", - vr: "DS", - vm: "1", - name: "RadiusAlongWedge", - }, - "(0016,0001)": { tag: "(0016,0001)", vr: "DS", vm: "1", name: "WhitePoint" }, - "(0016,0002)": { - tag: "(0016,0002)", - vr: "DS", - vm: "3", - name: "PrimaryChromaticities", - }, - "(0016,0003)": { - tag: "(0016,0003)", - vr: "UT", - vm: "1", - name: "BatteryLevel", - }, - "(0016,0004)": { - tag: "(0016,0004)", - vr: "DS", - vm: "1", - name: "ExposureTimeInSeconds", - }, - "(0016,0005)": { tag: "(0016,0005)", vr: "DS", vm: "1", name: "FNumber" }, - "(0016,0006)": { tag: "(0016,0006)", vr: "IS", vm: "1", name: "OECFRows" }, - "(0016,0007)": { tag: "(0016,0007)", vr: "IS", vm: "1", name: "OECFColumns" }, - "(0016,0008)": { - tag: "(0016,0008)", - vr: "UC", - vm: "1-n", - name: "OECFColumnNames", - }, - "(0016,0009)": { - tag: "(0016,0009)", - vr: "DS", - vm: "1-n", - name: "OECFValues", - }, - "(0016,000A)": { - tag: "(0016,000A)", - vr: "IS", - vm: "1", - name: "SpatialFrequencyResponseRows", - }, - "(0016,000B)": { - tag: "(0016,000B)", - vr: "IS", - vm: "1", - name: "SpatialFrequencyResponseColumns", - }, - "(0016,000C)": { - tag: "(0016,000C)", - vr: "UC", - vm: "1-n", - name: "SpatialFrequencyResponseColumnNames", - }, - "(0016,000D)": { - tag: "(0016,000D)", - vr: "DS", - vm: "1-n", - name: "SpatialFrequencyResponseValues", - }, - "(0016,000E)": { - tag: "(0016,000E)", - vr: "IS", - vm: "1", - name: "ColorFilterArrayPatternRows", - }, - "(0016,000F)": { - tag: "(0016,000F)", - vr: "IS", - vm: "1", - name: "ColorFilterArrayPatternColumns", - }, - "(0016,0010)": { - tag: "(0016,0010)", - vr: "DS", - vm: "1-n", - name: "ColorFilterArrayPatternValues", - }, - "(0016,0011)": { - tag: "(0016,0011)", - vr: "US", - vm: "1", - name: "FlashFiringStatus", - }, - "(0016,0012)": { - tag: "(0016,0012)", - vr: "US", - vm: "1", - name: "FlashReturnStatus", - }, - "(0016,0013)": { tag: "(0016,0013)", vr: "US", vm: "1", name: "FlashMode" }, - "(0016,0014)": { - tag: "(0016,0014)", - vr: "US", - vm: "1", - name: "FlashFunctionPresent", - }, - "(0016,0015)": { - tag: "(0016,0015)", - vr: "US", - vm: "1", - name: "FlashRedEyeMode", - }, - "(0016,0016)": { - tag: "(0016,0016)", - vr: "US", - vm: "1", - name: "ExposureProgram", - }, - "(0016,0017)": { - tag: "(0016,0017)", - vr: "UT", - vm: "1", - name: "SpectralSensitivity", - }, - "(0016,0018)": { - tag: "(0016,0018)", - vr: "IS", - vm: "1", - name: "PhotographicSensitivity", - }, - "(0016,0019)": { - tag: "(0016,0019)", - vr: "IS", - vm: "1", - name: "SelfTimerMode", - }, - "(0016,001A)": { - tag: "(0016,001A)", - vr: "US", - vm: "1", - name: "SensitivityType", - }, - "(0016,001B)": { - tag: "(0016,001B)", - vr: "IS", - vm: "1", - name: "StandardOutputSensitivity", - }, - "(0016,001C)": { - tag: "(0016,001C)", - vr: "IS", - vm: "1", - name: "RecommendedExposureIndex", - }, - "(0016,001D)": { tag: "(0016,001D)", vr: "IS", vm: "1", name: "ISOSpeed" }, - "(0016,001E)": { - tag: "(0016,001E)", - vr: "IS", - vm: "1", - name: "ISOSpeedLatitudeyyy", - }, - "(0016,001F)": { - tag: "(0016,001F)", - vr: "IS", - vm: "1", - name: "ISOSpeedLatitudezzz", - }, - "(0016,0020)": { tag: "(0016,0020)", vr: "UT", vm: "1", name: "EXIFVersion" }, - "(0016,0021)": { - tag: "(0016,0021)", - vr: "DS", - vm: "1", - name: "ShutterSpeedValue", - }, - "(0016,0022)": { - tag: "(0016,0022)", - vr: "DS", - vm: "1", - name: "ApertureValue", - }, - "(0016,0023)": { - tag: "(0016,0023)", - vr: "DS", - vm: "1", - name: "BrightnessValue", - }, - "(0016,0024)": { - tag: "(0016,0024)", - vr: "DS", - vm: "1", - name: "ExposureBiasValue", - }, - "(0016,0025)": { - tag: "(0016,0025)", - vr: "DS", - vm: "1", - name: "MaxApertureValue", - }, - "(0016,0026)": { - tag: "(0016,0026)", - vr: "DS", - vm: "1", - name: "SubjectDistance", - }, - "(0016,0027)": { - tag: "(0016,0027)", - vr: "US", - vm: "1", - name: "MeteringMode", - }, - "(0016,0028)": { tag: "(0016,0028)", vr: "US", vm: "1", name: "LightSource" }, - "(0016,0029)": { tag: "(0016,0029)", vr: "DS", vm: "1", name: "FocalLength" }, - "(0016,002A)": { - tag: "(0016,002A)", - vr: "IS", - vm: "2-4", - name: "SubjectArea", - }, - "(0016,002B)": { tag: "(0016,002B)", vr: "OB", vm: "1", name: "MakerNote" }, - "(0016,0030)": { tag: "(0016,0030)", vr: "DS", vm: "1", name: "Temperature" }, - "(0016,0031)": { tag: "(0016,0031)", vr: "DS", vm: "1", name: "Humidity" }, - "(0016,0032)": { tag: "(0016,0032)", vr: "DS", vm: "1", name: "Pressure" }, - "(0016,0033)": { tag: "(0016,0033)", vr: "DS", vm: "1", name: "WaterDepth" }, - "(0016,0034)": { - tag: "(0016,0034)", - vr: "DS", - vm: "1", - name: "Acceleration", - }, - "(0016,0035)": { - tag: "(0016,0035)", - vr: "DS", - vm: "1", - name: "CameraElevationAngle", - }, - "(0016,0036)": { - tag: "(0016,0036)", - vr: "DS", - vm: "1-2", - name: "FlashEnergy", - }, - "(0016,0037)": { - tag: "(0016,0037)", - vr: "IS", - vm: "2", - name: "SubjectLocation", - }, - "(0016,0038)": { - tag: "(0016,0038)", - vr: "DS", - vm: "1", - name: "PhotographicExposureIndex", - }, - "(0016,0039)": { - tag: "(0016,0039)", - vr: "US", - vm: "1", - name: "SensingMethod", - }, - "(0016,003A)": { tag: "(0016,003A)", vr: "US", vm: "1", name: "FileSource" }, - "(0016,003B)": { tag: "(0016,003B)", vr: "US", vm: "1", name: "SceneType" }, - "(0016,0041)": { - tag: "(0016,0041)", - vr: "US", - vm: "1", - name: "CustomRendered", - }, - "(0016,0042)": { - tag: "(0016,0042)", - vr: "US", - vm: "1", - name: "ExposureMode", - }, - "(0016,0043)": { - tag: "(0016,0043)", - vr: "US", - vm: "1", - name: "WhiteBalance", - }, - "(0016,0044)": { - tag: "(0016,0044)", - vr: "DS", - vm: "1", - name: "DigitalZoomRatio", - }, - "(0016,0045)": { - tag: "(0016,0045)", - vr: "IS", - vm: "1", - name: "FocalLengthIn35mmFilm", - }, - "(0016,0046)": { - tag: "(0016,0046)", - vr: "US", - vm: "1", - name: "SceneCaptureType", - }, - "(0016,0047)": { tag: "(0016,0047)", vr: "US", vm: "1", name: "GainControl" }, - "(0016,0048)": { tag: "(0016,0048)", vr: "US", vm: "1", name: "Contrast" }, - "(0016,0049)": { tag: "(0016,0049)", vr: "US", vm: "1", name: "Saturation" }, - "(0016,004A)": { tag: "(0016,004A)", vr: "US", vm: "1", name: "Sharpness" }, - "(0016,004B)": { - tag: "(0016,004B)", - vr: "OB", - vm: "1", - name: "DeviceSettingDescription", - }, - "(0016,004C)": { - tag: "(0016,004C)", - vr: "US", - vm: "1", - name: "SubjectDistanceRange", - }, - "(0016,004D)": { - tag: "(0016,004D)", - vr: "UT", - vm: "1", - name: "CameraOwnerName", - }, - "(0016,004E)": { - tag: "(0016,004E)", - vr: "DS", - vm: "4", - name: "LensSpecification", - }, - "(0016,004F)": { tag: "(0016,004F)", vr: "UT", vm: "1", name: "LensMake" }, - "(0016,0050)": { tag: "(0016,0050)", vr: "UT", vm: "1", name: "LensModel" }, - "(0016,0051)": { - tag: "(0016,0051)", - vr: "UT", - vm: "1", - name: "LensSerialNumber", - }, - "(0016,0061)": { - tag: "(0016,0061)", - vr: "CS", - vm: "1", - name: "InteroperabilityIndex", - }, - "(0016,0062)": { - tag: "(0016,0062)", - vr: "OB", - vm: "1", - name: "InteroperabilityVersion", - }, - "(0016,0070)": { - tag: "(0016,0070)", - vr: "OB", - vm: "1", - name: "GPSVersionID", - }, - "(0016,0071)": { - tag: "(0016,0071)", - vr: "CS", - vm: "1", - name: "GPSLatitudeRef", - }, - "(0016,0072)": { tag: "(0016,0072)", vr: "DS", vm: "3", name: "GPSLatitude" }, - "(0016,0073)": { - tag: "(0016,0073)", - vr: "CS", - vm: "1", - name: "GPSLongitudeRef", - }, - "(0016,0074)": { - tag: "(0016,0074)", - vr: "DS", - vm: "3", - name: "GPSLongitude", - }, - "(0016,0075)": { - tag: "(0016,0075)", - vr: "US", - vm: "1", - name: "GPSAltitudeRef", - }, - "(0016,0076)": { tag: "(0016,0076)", vr: "DS", vm: "1", name: "GPSAltitude" }, - "(0016,0077)": { - tag: "(0016,0077)", - vr: "DT", - vm: "1", - name: "GPSTimeStamp", - }, - "(0016,0078)": { - tag: "(0016,0078)", - vr: "UT", - vm: "1", - name: "GPSSatellites", - }, - "(0016,0079)": { tag: "(0016,0079)", vr: "CS", vm: "1", name: "GPSStatus" }, - "(0016,007A)": { - tag: "(0016,007A)", - vr: "CS", - vm: "1", - name: "GPSMeasureMode", - }, - "(0016,007B)": { tag: "(0016,007B)", vr: "DS", vm: "1", name: "GPSDOP" }, - "(0016,007C)": { tag: "(0016,007C)", vr: "CS", vm: "1", name: "GPSSpeedRef" }, - "(0016,007D)": { tag: "(0016,007D)", vr: "DS", vm: "1", name: "GPSSpeed" }, - "(0016,007E)": { tag: "(0016,007E)", vr: "CS", vm: "1", name: "GPSTrackRef" }, - "(0016,007F)": { tag: "(0016,007F)", vr: "DS", vm: "1", name: "GPSTrack" }, - "(0016,0080)": { - tag: "(0016,0080)", - vr: "CS", - vm: "1", - name: "GPSImgDirectionRef", - }, - "(0016,0081)": { - tag: "(0016,0081)", - vr: "DS", - vm: "1", - name: "GPSImgDirection", - }, - "(0016,0082)": { tag: "(0016,0082)", vr: "UT", vm: "1", name: "GPSMapDatum" }, - "(0016,0083)": { - tag: "(0016,0083)", - vr: "CS", - vm: "1", - name: "GPSDestLatitudeRef", - }, - "(0016,0084)": { - tag: "(0016,0084)", - vr: "DS", - vm: "3", - name: "GPSDestLatitude", - }, - "(0016,0085)": { - tag: "(0016,0085)", - vr: "CS", - vm: "1", - name: "GPSDestLongitudeRef", - }, - "(0016,0086)": { - tag: "(0016,0086)", - vr: "DS", - vm: "3", - name: "GPSDestLongitude", - }, - "(0016,0087)": { - tag: "(0016,0087)", - vr: "CS", - vm: "1", - name: "GPSDestBearingRef", - }, - "(0016,0088)": { - tag: "(0016,0088)", - vr: "DS", - vm: "1", - name: "GPSDestBearing", - }, - "(0016,0089)": { - tag: "(0016,0089)", - vr: "CS", - vm: "1", - name: "GPSDestDistanceRef", - }, - "(0016,008A)": { - tag: "(0016,008A)", - vr: "DS", - vm: "1", - name: "GPSDestDistance", - }, - "(0016,008B)": { - tag: "(0016,008B)", - vr: "OB", - vm: "1", - name: "GPSProcessingMethod", - }, - "(0016,008C)": { - tag: "(0016,008C)", - vr: "OB", - vm: "1", - name: "GPSAreaInformation", - }, - "(0016,008D)": { - tag: "(0016,008D)", - vr: "DT", - vm: "1", - name: "GPSDateStamp", - }, - "(0016,008E)": { - tag: "(0016,008E)", - vr: "IS", - vm: "1", - name: "GPSDifferential", - }, - "(0016,1001)": { - tag: "(0016,1001)", - vr: "CS", - vm: "1", - name: "LightSourcePolarization", - }, - "(0016,1002)": { - tag: "(0016,1002)", - vr: "DS", - vm: "1", - name: "EmitterColorTemperature", - }, - "(0016,1003)": { - tag: "(0016,1003)", - vr: "CS", - vm: "1", - name: "ContactMethod", - }, - "(0016,1004)": { - tag: "(0016,1004)", - vr: "CS", - vm: "1-n", - name: "ImmersionMedia", - }, - "(0016,1005)": { - tag: "(0016,1005)", - vr: "DS", - vm: "1", - name: "OpticalMagnificationFactor", - }, - "(0018,0010)": { - tag: "(0018,0010)", - vr: "LO", - vm: "1", - name: "ContrastBolusAgent", - }, - "(0018,0012)": { - tag: "(0018,0012)", - vr: "SQ", - vm: "1", - name: "ContrastBolusAgentSequence", - }, - "(0018,0013)": { - tag: "(0018,0013)", - vr: "FL", - vm: "1", - name: "ContrastBolusT1Relaxivity", - }, - "(0018,0014)": { - tag: "(0018,0014)", - vr: "SQ", - vm: "1", - name: "ContrastBolusAdministrationRouteSequence", - }, - "(0018,0015)": { - tag: "(0018,0015)", - vr: "CS", - vm: "1", - name: "BodyPartExamined", - }, - "(0018,0020)": { - tag: "(0018,0020)", - vr: "CS", - vm: "1-n", - name: "ScanningSequence", - }, - "(0018,0021)": { - tag: "(0018,0021)", - vr: "CS", - vm: "1-n", - name: "SequenceVariant", - }, - "(0018,0022)": { - tag: "(0018,0022)", - vr: "CS", - vm: "1-n", - name: "ScanOptions", - }, - "(0018,0023)": { - tag: "(0018,0023)", - vr: "CS", - vm: "1", - name: "MRAcquisitionType", - }, - "(0018,0024)": { - tag: "(0018,0024)", - vr: "SH", - vm: "1", - name: "SequenceName", - }, - "(0018,0025)": { tag: "(0018,0025)", vr: "CS", vm: "1", name: "AngioFlag" }, - "(0018,0026)": { - tag: "(0018,0026)", - vr: "SQ", - vm: "1", - name: "InterventionDrugInformationSequence", - }, - "(0018,0027)": { - tag: "(0018,0027)", - vr: "TM", - vm: "1", - name: "InterventionDrugStopTime", - }, - "(0018,0028)": { - tag: "(0018,0028)", - vr: "DS", - vm: "1", - name: "InterventionDrugDose", - }, - "(0018,0029)": { - tag: "(0018,0029)", - vr: "SQ", - vm: "1", - name: "InterventionDrugCodeSequence", - }, - "(0018,002A)": { - tag: "(0018,002A)", - vr: "SQ", - vm: "1", - name: "AdditionalDrugSequence", - }, - "(0018,0030)": { - tag: "(0018,0030)", - vr: "LO", - vm: "1-n", - name: "Radionuclide", - }, - "(0018,0031)": { - tag: "(0018,0031)", - vr: "LO", - vm: "1", - name: "Radiopharmaceutical", - }, - "(0018,0032)": { - tag: "(0018,0032)", - vr: "DS", - vm: "1", - name: "EnergyWindowCenterline", - }, - "(0018,0033)": { - tag: "(0018,0033)", - vr: "DS", - vm: "1-n", - name: "EnergyWindowTotalWidth", - }, - "(0018,0034)": { - tag: "(0018,0034)", - vr: "LO", - vm: "1", - name: "InterventionDrugName", - }, - "(0018,0035)": { - tag: "(0018,0035)", - vr: "TM", - vm: "1", - name: "InterventionDrugStartTime", - }, - "(0018,0036)": { - tag: "(0018,0036)", - vr: "SQ", - vm: "1", - name: "InterventionSequence", - }, - "(0018,0037)": { tag: "(0018,0037)", vr: "CS", vm: "1", name: "TherapyType" }, - "(0018,0038)": { - tag: "(0018,0038)", - vr: "CS", - vm: "1", - name: "InterventionStatus", - }, - "(0018,0039)": { - tag: "(0018,0039)", - vr: "CS", - vm: "1", - name: "TherapyDescription", - }, - "(0018,003A)": { - tag: "(0018,003A)", - vr: "ST", - vm: "1", - name: "InterventionDescription", - }, - "(0018,0040)": { tag: "(0018,0040)", vr: "IS", vm: "1", name: "CineRate" }, - "(0018,0042)": { - tag: "(0018,0042)", - vr: "CS", - vm: "1", - name: "InitialCineRunState", - }, - "(0018,0050)": { - tag: "(0018,0050)", - vr: "DS", - vm: "1", - name: "SliceThickness", - }, - "(0018,0060)": { tag: "(0018,0060)", vr: "DS", vm: "1", name: "KVP" }, - "(0018,0061)": { tag: "(0018,0061)", vr: "DS", vm: "1", name: "" }, - "(0018,0070)": { - tag: "(0018,0070)", - vr: "IS", - vm: "1", - name: "CountsAccumulated", - }, - "(0018,0071)": { - tag: "(0018,0071)", - vr: "CS", - vm: "1", - name: "AcquisitionTerminationCondition", - }, - "(0018,0072)": { - tag: "(0018,0072)", - vr: "DS", - vm: "1", - name: "EffectiveDuration", - }, - "(0018,0073)": { - tag: "(0018,0073)", - vr: "CS", - vm: "1", - name: "AcquisitionStartCondition", - }, - "(0018,0074)": { - tag: "(0018,0074)", - vr: "IS", - vm: "1", - name: "AcquisitionStartConditionData", - }, - "(0018,0075)": { - tag: "(0018,0075)", - vr: "IS", - vm: "1", - name: "AcquisitionTerminationConditionData", - }, - "(0018,0080)": { - tag: "(0018,0080)", - vr: "DS", - vm: "1", - name: "RepetitionTime", - }, - "(0018,0081)": { tag: "(0018,0081)", vr: "DS", vm: "1", name: "EchoTime" }, - "(0018,0082)": { - tag: "(0018,0082)", - vr: "DS", - vm: "1", - name: "InversionTime", - }, - "(0018,0083)": { - tag: "(0018,0083)", - vr: "DS", - vm: "1", - name: "NumberOfAverages", - }, - "(0018,0084)": { - tag: "(0018,0084)", - vr: "DS", - vm: "1", - name: "ImagingFrequency", - }, - "(0018,0085)": { - tag: "(0018,0085)", - vr: "SH", - vm: "1", - name: "ImagedNucleus", - }, - "(0018,0086)": { - tag: "(0018,0086)", - vr: "IS", - vm: "1-n", - name: "EchoNumbers", - }, - "(0018,0087)": { - tag: "(0018,0087)", - vr: "DS", - vm: "1", - name: "MagneticFieldStrength", - }, - "(0018,0088)": { - tag: "(0018,0088)", - vr: "DS", - vm: "1", - name: "SpacingBetweenSlices", - }, - "(0018,0089)": { - tag: "(0018,0089)", - vr: "IS", - vm: "1", - name: "NumberOfPhaseEncodingSteps", - }, - "(0018,0090)": { - tag: "(0018,0090)", - vr: "DS", - vm: "1", - name: "DataCollectionDiameter", - }, - "(0018,0091)": { - tag: "(0018,0091)", - vr: "IS", - vm: "1", - name: "EchoTrainLength", - }, - "(0018,0093)": { - tag: "(0018,0093)", - vr: "DS", - vm: "1", - name: "PercentSampling", - }, - "(0018,0094)": { - tag: "(0018,0094)", - vr: "DS", - vm: "1", - name: "PercentPhaseFieldOfView", - }, - "(0018,0095)": { - tag: "(0018,0095)", - vr: "DS", - vm: "1", - name: "PixelBandwidth", - }, - "(0018,1000)": { - tag: "(0018,1000)", - vr: "LO", - vm: "1", - name: "DeviceSerialNumber", - }, - "(0018,1002)": { tag: "(0018,1002)", vr: "UI", vm: "1", name: "DeviceUID" }, - "(0018,1003)": { tag: "(0018,1003)", vr: "LO", vm: "1", name: "DeviceID" }, - "(0018,1004)": { tag: "(0018,1004)", vr: "LO", vm: "1", name: "PlateID" }, - "(0018,1005)": { tag: "(0018,1005)", vr: "LO", vm: "1", name: "GeneratorID" }, - "(0018,1006)": { tag: "(0018,1006)", vr: "LO", vm: "1", name: "GridID" }, - "(0018,1007)": { tag: "(0018,1007)", vr: "LO", vm: "1", name: "CassetteID" }, - "(0018,1008)": { tag: "(0018,1008)", vr: "LO", vm: "1", name: "GantryID" }, - "(0018,1009)": { - tag: "(0018,1009)", - vr: "UT", - vm: "1", - name: "UniqueDeviceIdentifier", - }, - "(0018,100A)": { tag: "(0018,100A)", vr: "SQ", vm: "1", name: "UDISequence" }, - "(0018,100B)": { - tag: "(0018,100B)", - vr: "UI", - vm: "1-n", - name: "ManufacturerDeviceClassUID", - }, - "(0018,1010)": { - tag: "(0018,1010)", - vr: "LO", - vm: "1", - name: "SecondaryCaptureDeviceID", - }, - "(0018,1011)": { - tag: "(0018,1011)", - vr: "LO", - vm: "1", - name: "HardcopyCreationDeviceID", - }, - "(0018,1012)": { - tag: "(0018,1012)", - vr: "DA", - vm: "1", - name: "DateOfSecondaryCapture", - }, - "(0018,1014)": { - tag: "(0018,1014)", - vr: "TM", - vm: "1", - name: "TimeOfSecondaryCapture", - }, - "(0018,1016)": { - tag: "(0018,1016)", - vr: "LO", - vm: "1", - name: "SecondaryCaptureDeviceManufacturer", - }, - "(0018,1017)": { - tag: "(0018,1017)", - vr: "LO", - vm: "1", - name: "HardcopyDeviceManufacturer", - }, - "(0018,1018)": { - tag: "(0018,1018)", - vr: "LO", - vm: "1", - name: "SecondaryCaptureDeviceManufacturerModelName", - }, - "(0018,1019)": { - tag: "(0018,1019)", - vr: "LO", - vm: "1-n", - name: "SecondaryCaptureDeviceSoftwareVersions", - }, - "(0018,101A)": { - tag: "(0018,101A)", - vr: "LO", - vm: "1-n", - name: "HardcopyDeviceSoftwareVersion", - }, - "(0018,101B)": { - tag: "(0018,101B)", - vr: "LO", - vm: "1", - name: "HardcopyDeviceManufacturerModelName", - }, - "(0018,1020)": { - tag: "(0018,1020)", - vr: "LO", - vm: "1-n", - name: "SoftwareVersions", - }, - "(0018,1022)": { - tag: "(0018,1022)", - vr: "SH", - vm: "1", - name: "VideoImageFormatAcquired", - }, - "(0018,1023)": { - tag: "(0018,1023)", - vr: "LO", - vm: "1", - name: "DigitalImageFormatAcquired", - }, - "(0018,1030)": { - tag: "(0018,1030)", - vr: "LO", - vm: "1", - name: "ProtocolName", - }, - "(0018,1040)": { - tag: "(0018,1040)", - vr: "LO", - vm: "1", - name: "ContrastBolusRoute", - }, - "(0018,1041)": { - tag: "(0018,1041)", - vr: "DS", - vm: "1", - name: "ContrastBolusVolume", - }, - "(0018,1042)": { - tag: "(0018,1042)", - vr: "TM", - vm: "1", - name: "ContrastBolusStartTime", - }, - "(0018,1043)": { - tag: "(0018,1043)", - vr: "TM", - vm: "1", - name: "ContrastBolusStopTime", - }, - "(0018,1044)": { - tag: "(0018,1044)", - vr: "DS", - vm: "1", - name: "ContrastBolusTotalDose", - }, - "(0018,1045)": { - tag: "(0018,1045)", - vr: "IS", - vm: "1", - name: "SyringeCounts", - }, - "(0018,1046)": { - tag: "(0018,1046)", - vr: "DS", - vm: "1-n", - name: "ContrastFlowRate", - }, - "(0018,1047)": { - tag: "(0018,1047)", - vr: "DS", - vm: "1-n", - name: "ContrastFlowDuration", - }, - "(0018,1048)": { - tag: "(0018,1048)", - vr: "CS", - vm: "1", - name: "ContrastBolusIngredient", - }, - "(0018,1049)": { - tag: "(0018,1049)", - vr: "DS", - vm: "1", - name: "ContrastBolusIngredientConcentration", - }, - "(0018,1050)": { - tag: "(0018,1050)", - vr: "DS", - vm: "1", - name: "SpatialResolution", - }, - "(0018,1060)": { tag: "(0018,1060)", vr: "DS", vm: "1", name: "TriggerTime" }, - "(0018,1061)": { - tag: "(0018,1061)", - vr: "LO", - vm: "1", - name: "TriggerSourceOrType", - }, - "(0018,1062)": { - tag: "(0018,1062)", - vr: "IS", - vm: "1", - name: "NominalInterval", - }, - "(0018,1063)": { tag: "(0018,1063)", vr: "DS", vm: "1", name: "FrameTime" }, - "(0018,1064)": { - tag: "(0018,1064)", - vr: "LO", - vm: "1", - name: "CardiacFramingType", - }, - "(0018,1065)": { - tag: "(0018,1065)", - vr: "DS", - vm: "1-n", - name: "FrameTimeVector", - }, - "(0018,1066)": { tag: "(0018,1066)", vr: "DS", vm: "1", name: "FrameDelay" }, - "(0018,1067)": { - tag: "(0018,1067)", - vr: "DS", - vm: "1", - name: "ImageTriggerDelay", - }, - "(0018,1068)": { - tag: "(0018,1068)", - vr: "DS", - vm: "1", - name: "MultiplexGroupTimeOffset", - }, - "(0018,1069)": { - tag: "(0018,1069)", - vr: "DS", - vm: "1", - name: "TriggerTimeOffset", - }, - "(0018,106A)": { - tag: "(0018,106A)", - vr: "CS", - vm: "1", - name: "SynchronizationTrigger", - }, - "(0018,106C)": { - tag: "(0018,106C)", - vr: "US", - vm: "2", - name: "SynchronizationChannel", - }, - "(0018,106E)": { - tag: "(0018,106E)", - vr: "UL", - vm: "1", - name: "TriggerSamplePosition", - }, - "(0018,1070)": { - tag: "(0018,1070)", - vr: "LO", - vm: "1", - name: "RadiopharmaceuticalRoute", - }, - "(0018,1071)": { - tag: "(0018,1071)", - vr: "DS", - vm: "1", - name: "RadiopharmaceuticalVolume", - }, - "(0018,1072)": { - tag: "(0018,1072)", - vr: "TM", - vm: "1", - name: "RadiopharmaceuticalStartTime", - }, - "(0018,1073)": { - tag: "(0018,1073)", - vr: "TM", - vm: "1", - name: "RadiopharmaceuticalStopTime", - }, - "(0018,1074)": { - tag: "(0018,1074)", - vr: "DS", - vm: "1", - name: "RadionuclideTotalDose", - }, - "(0018,1075)": { - tag: "(0018,1075)", - vr: "DS", - vm: "1", - name: "RadionuclideHalfLife", - }, - "(0018,1076)": { - tag: "(0018,1076)", - vr: "DS", - vm: "1", - name: "RadionuclidePositronFraction", - }, - "(0018,1077)": { - tag: "(0018,1077)", - vr: "DS", - vm: "1", - name: "RadiopharmaceuticalSpecificActivity", - }, - "(0018,1078)": { - tag: "(0018,1078)", - vr: "DT", - vm: "1", - name: "RadiopharmaceuticalStartDateTime", - }, - "(0018,1079)": { - tag: "(0018,1079)", - vr: "DT", - vm: "1", - name: "RadiopharmaceuticalStopDateTime", - }, - "(0018,1080)": { - tag: "(0018,1080)", - vr: "CS", - vm: "1", - name: "BeatRejectionFlag", - }, - "(0018,1081)": { tag: "(0018,1081)", vr: "IS", vm: "1", name: "LowRRValue" }, - "(0018,1082)": { tag: "(0018,1082)", vr: "IS", vm: "1", name: "HighRRValue" }, - "(0018,1083)": { - tag: "(0018,1083)", - vr: "IS", - vm: "1", - name: "IntervalsAcquired", - }, - "(0018,1084)": { - tag: "(0018,1084)", - vr: "IS", - vm: "1", - name: "IntervalsRejected", - }, - "(0018,1085)": { - tag: "(0018,1085)", - vr: "LO", - vm: "1", - name: "PVCRejection", - }, - "(0018,1086)": { tag: "(0018,1086)", vr: "IS", vm: "1", name: "SkipBeats" }, - "(0018,1088)": { tag: "(0018,1088)", vr: "IS", vm: "1", name: "HeartRate" }, - "(0018,1090)": { - tag: "(0018,1090)", - vr: "IS", - vm: "1", - name: "CardiacNumberOfImages", - }, - "(0018,1094)": { - tag: "(0018,1094)", - vr: "IS", - vm: "1", - name: "TriggerWindow", - }, - "(0018,1100)": { - tag: "(0018,1100)", - vr: "DS", - vm: "1", - name: "ReconstructionDiameter", - }, - "(0018,1110)": { - tag: "(0018,1110)", - vr: "DS", - vm: "1", - name: "DistanceSourceToDetector", - }, - "(0018,1111)": { - tag: "(0018,1111)", - vr: "DS", - vm: "1", - name: "DistanceSourceToPatient", - }, - "(0018,1114)": { - tag: "(0018,1114)", - vr: "DS", - vm: "1", - name: "EstimatedRadiographicMagnificationFactor", - }, - "(0018,1120)": { - tag: "(0018,1120)", - vr: "DS", - vm: "1", - name: "GantryDetectorTilt", - }, - "(0018,1121)": { - tag: "(0018,1121)", - vr: "DS", - vm: "1", - name: "GantryDetectorSlew", - }, - "(0018,1130)": { tag: "(0018,1130)", vr: "DS", vm: "1", name: "TableHeight" }, - "(0018,1131)": { - tag: "(0018,1131)", - vr: "DS", - vm: "1", - name: "TableTraverse", - }, - "(0018,1134)": { tag: "(0018,1134)", vr: "CS", vm: "1", name: "TableMotion" }, - "(0018,1135)": { - tag: "(0018,1135)", - vr: "DS", - vm: "1-n", - name: "TableVerticalIncrement", - }, - "(0018,1136)": { - tag: "(0018,1136)", - vr: "DS", - vm: "1-n", - name: "TableLateralIncrement", - }, - "(0018,1137)": { - tag: "(0018,1137)", - vr: "DS", - vm: "1-n", - name: "TableLongitudinalIncrement", - }, - "(0018,1138)": { tag: "(0018,1138)", vr: "DS", vm: "1", name: "TableAngle" }, - "(0018,113A)": { tag: "(0018,113A)", vr: "CS", vm: "1", name: "TableType" }, - "(0018,1140)": { - tag: "(0018,1140)", - vr: "CS", - vm: "1", - name: "RotationDirection", - }, - "(0018,1141)": { - tag: "(0018,1141)", - vr: "DS", - vm: "1", - name: "AngularPosition", - }, - "(0018,1142)": { - tag: "(0018,1142)", - vr: "DS", - vm: "1-n", - name: "RadialPosition", - }, - "(0018,1143)": { tag: "(0018,1143)", vr: "DS", vm: "1", name: "ScanArc" }, - "(0018,1144)": { tag: "(0018,1144)", vr: "DS", vm: "1", name: "AngularStep" }, - "(0018,1145)": { - tag: "(0018,1145)", - vr: "DS", - vm: "1", - name: "CenterOfRotationOffset", - }, - "(0018,1146)": { - tag: "(0018,1146)", - vr: "DS", - vm: "1-n", - name: "RotationOffset", - }, - "(0018,1147)": { - tag: "(0018,1147)", - vr: "CS", - vm: "1", - name: "FieldOfViewShape", - }, - "(0018,1149)": { - tag: "(0018,1149)", - vr: "IS", - vm: "1-2", - name: "FieldOfViewDimensions", - }, - "(0018,1150)": { - tag: "(0018,1150)", - vr: "IS", - vm: "1", - name: "ExposureTime", - }, - "(0018,1151)": { - tag: "(0018,1151)", - vr: "IS", - vm: "1", - name: "XRayTubeCurrent", - }, - "(0018,1152)": { tag: "(0018,1152)", vr: "IS", vm: "1", name: "Exposure" }, - "(0018,1153)": { - tag: "(0018,1153)", - vr: "IS", - vm: "1", - name: "ExposureInuAs", - }, - "(0018,1154)": { - tag: "(0018,1154)", - vr: "DS", - vm: "1", - name: "AveragePulseWidth", - }, - "(0018,1155)": { - tag: "(0018,1155)", - vr: "CS", - vm: "1", - name: "RadiationSetting", - }, - "(0018,1156)": { - tag: "(0018,1156)", - vr: "CS", - vm: "1", - name: "RectificationType", - }, - "(0018,115A)": { - tag: "(0018,115A)", - vr: "CS", - vm: "1", - name: "RadiationMode", - }, - "(0018,115E)": { - tag: "(0018,115E)", - vr: "DS", - vm: "1", - name: "ImageAndFluoroscopyAreaDoseProduct", - }, - "(0018,1160)": { tag: "(0018,1160)", vr: "SH", vm: "1", name: "FilterType" }, - "(0018,1161)": { - tag: "(0018,1161)", - vr: "LO", - vm: "1-n", - name: "TypeOfFilters", - }, - "(0018,1162)": { - tag: "(0018,1162)", - vr: "DS", - vm: "1", - name: "IntensifierSize", - }, - "(0018,1164)": { - tag: "(0018,1164)", - vr: "DS", - vm: "2", - name: "ImagerPixelSpacing", - }, - "(0018,1166)": { tag: "(0018,1166)", vr: "CS", vm: "1-n", name: "Grid" }, - "(0018,1170)": { - tag: "(0018,1170)", - vr: "IS", - vm: "1", - name: "GeneratorPower", - }, - "(0018,1180)": { - tag: "(0018,1180)", - vr: "SH", - vm: "1", - name: "CollimatorGridName", - }, - "(0018,1181)": { - tag: "(0018,1181)", - vr: "CS", - vm: "1", - name: "CollimatorType", - }, - "(0018,1182)": { - tag: "(0018,1182)", - vr: "IS", - vm: "1-2", - name: "FocalDistance", - }, - "(0018,1183)": { - tag: "(0018,1183)", - vr: "DS", - vm: "1-2", - name: "XFocusCenter", - }, - "(0018,1184)": { - tag: "(0018,1184)", - vr: "DS", - vm: "1-2", - name: "YFocusCenter", - }, - "(0018,1190)": { - tag: "(0018,1190)", - vr: "DS", - vm: "1-n", - name: "FocalSpots", - }, - "(0018,1191)": { - tag: "(0018,1191)", - vr: "CS", - vm: "1", - name: "AnodeTargetMaterial", - }, - "(0018,11A0)": { - tag: "(0018,11A0)", - vr: "DS", - vm: "1", - name: "BodyPartThickness", - }, - "(0018,11A2)": { - tag: "(0018,11A2)", - vr: "DS", - vm: "1", - name: "CompressionForce", - }, - "(0018,11A3)": { - tag: "(0018,11A3)", - vr: "DS", - vm: "1", - name: "CompressionPressure", - }, - "(0018,11A4)": { - tag: "(0018,11A4)", - vr: "LO", - vm: "1", - name: "PaddleDescription", - }, - "(0018,11A5)": { - tag: "(0018,11A5)", - vr: "DS", - vm: "1", - name: "CompressionContactArea", - }, - "(0018,11B0)": { - tag: "(0018,11B0)", - vr: "LO", - vm: "1", - name: "AcquisitionMode", - }, - "(0018,11B1)": { - tag: "(0018,11B1)", - vr: "LO", - vm: "1", - name: "DoseModeName", - }, - "(0018,11B2)": { - tag: "(0018,11B2)", - vr: "CS", - vm: "1", - name: "AcquiredSubtractionMaskFlag", - }, - "(0018,11B3)": { - tag: "(0018,11B3)", - vr: "CS", - vm: "1", - name: "FluoroscopyPersistenceFlag", - }, - "(0018,11B4)": { - tag: "(0018,11B4)", - vr: "CS", - vm: "1", - name: "FluoroscopyLastImageHoldPersistenceFlag", - }, - "(0018,11B5)": { - tag: "(0018,11B5)", - vr: "IS", - vm: "1", - name: "UpperLimitNumberOfPersistentFluoroscopyFrames", - }, - "(0018,11B6)": { - tag: "(0018,11B6)", - vr: "CS", - vm: "1", - name: "ContrastBolusAutoInjectionTriggerFlag", - }, - "(0018,11B7)": { - tag: "(0018,11B7)", - vr: "FD", - vm: "1", - name: "ContrastBolusInjectionDelay", - }, - "(0018,11B8)": { - tag: "(0018,11B8)", - vr: "SQ", - vm: "1", - name: "XAAcquisitionPhaseDetailsSequence", - }, - "(0018,11B9)": { - tag: "(0018,11B9)", - vr: "FD", - vm: "1", - name: "XAAcquisitionFrameRate", - }, - "(0018,11BA)": { - tag: "(0018,11BA)", - vr: "SQ", - vm: "1", - name: "XAPlaneDetailsSequence", - }, - "(0018,11BB)": { - tag: "(0018,11BB)", - vr: "LO", - vm: "1", - name: "AcquisitionFieldOfViewLabel", - }, - "(0018,11BC)": { - tag: "(0018,11BC)", - vr: "SQ", - vm: "1", - name: "XRayFilterDetailsSequence", - }, - "(0018,11BD)": { - tag: "(0018,11BD)", - vr: "FD", - vm: "1", - name: "XAAcquisitionDuration", - }, - "(0018,11BE)": { - tag: "(0018,11BE)", - vr: "CS", - vm: "1", - name: "ReconstructionPipelineType", - }, - "(0018,11BF)": { - tag: "(0018,11BF)", - vr: "SQ", - vm: "1", - name: "ImageFilterDetailsSequence", - }, - "(0018,11C0)": { - tag: "(0018,11C0)", - vr: "CS", - vm: "1", - name: "AppliedMaskSubtractionFlag", - }, - "(0018,11C1)": { - tag: "(0018,11C1)", - vr: "SQ", - vm: "1", - name: "RequestedSeriesDescriptionCodeSequence", - }, - "(0018,1200)": { - tag: "(0018,1200)", - vr: "DA", - vm: "1-n", - name: "DateOfLastCalibration", - }, - "(0018,1201)": { - tag: "(0018,1201)", - vr: "TM", - vm: "1-n", - name: "TimeOfLastCalibration", - }, - "(0018,1202)": { - tag: "(0018,1202)", - vr: "DT", - vm: "1", - name: "DateTimeOfLastCalibration", - }, - "(0018,1203)": { - tag: "(0018,1203)", - vr: "DT", - vm: "1", - name: "CalibrationDateTime", - }, - "(0018,1210)": { - tag: "(0018,1210)", - vr: "SH", - vm: "1-n", - name: "ConvolutionKernel", - }, - "(0018,1240)": { - tag: "(0018,1240)", - vr: "IS", - vm: "1-n", - name: "UpperLowerPixelValues", - }, - "(0018,1242)": { - tag: "(0018,1242)", - vr: "IS", - vm: "1", - name: "ActualFrameDuration", - }, - "(0018,1243)": { tag: "(0018,1243)", vr: "IS", vm: "1", name: "CountRate" }, - "(0018,1244)": { - tag: "(0018,1244)", - vr: "US", - vm: "1", - name: "PreferredPlaybackSequencing", - }, - "(0018,1250)": { - tag: "(0018,1250)", - vr: "SH", - vm: "1", - name: "ReceiveCoilName", - }, - "(0018,1251)": { - tag: "(0018,1251)", - vr: "SH", - vm: "1", - name: "TransmitCoilName", - }, - "(0018,1260)": { tag: "(0018,1260)", vr: "SH", vm: "1", name: "PlateType" }, - "(0018,1261)": { - tag: "(0018,1261)", - vr: "LO", - vm: "1", - name: "PhosphorType", - }, - "(0018,1271)": { - tag: "(0018,1271)", - vr: "FD", - vm: "1", - name: "WaterEquivalentDiameter", - }, - "(0018,1272)": { - tag: "(0018,1272)", - vr: "SQ", - vm: "1", - name: "WaterEquivalentDiameterCalculationMethodCodeSequence", - }, - "(0018,1300)": { - tag: "(0018,1300)", - vr: "DS", - vm: "1", - name: "ScanVelocity", - }, - "(0018,1301)": { - tag: "(0018,1301)", - vr: "CS", - vm: "1-n", - name: "WholeBodyTechnique", - }, - "(0018,1302)": { tag: "(0018,1302)", vr: "IS", vm: "1", name: "ScanLength" }, - "(0018,1310)": { - tag: "(0018,1310)", - vr: "US", - vm: "4", - name: "AcquisitionMatrix", - }, - "(0018,1312)": { - tag: "(0018,1312)", - vr: "CS", - vm: "1", - name: "InPlanePhaseEncodingDirection", - }, - "(0018,1314)": { tag: "(0018,1314)", vr: "DS", vm: "1", name: "FlipAngle" }, - "(0018,1315)": { - tag: "(0018,1315)", - vr: "CS", - vm: "1", - name: "VariableFlipAngleFlag", - }, - "(0018,1316)": { tag: "(0018,1316)", vr: "DS", vm: "1", name: "SAR" }, - "(0018,1318)": { tag: "(0018,1318)", vr: "DS", vm: "1", name: "dBdt" }, - "(0018,1320)": { tag: "(0018,1320)", vr: "FL", vm: "1", name: "B1rms" }, - "(0018,1400)": { - tag: "(0018,1400)", - vr: "LO", - vm: "1", - name: "AcquisitionDeviceProcessingDescription", - }, - "(0018,1401)": { - tag: "(0018,1401)", - vr: "LO", - vm: "1", - name: "AcquisitionDeviceProcessingCode", - }, - "(0018,1402)": { - tag: "(0018,1402)", - vr: "CS", - vm: "1", - name: "CassetteOrientation", - }, - "(0018,1403)": { - tag: "(0018,1403)", - vr: "CS", - vm: "1", - name: "CassetteSize", - }, - "(0018,1404)": { - tag: "(0018,1404)", - vr: "US", - vm: "1", - name: "ExposuresOnPlate", - }, - "(0018,1405)": { - tag: "(0018,1405)", - vr: "IS", - vm: "1", - name: "RelativeXRayExposure", - }, - "(0018,1411)": { - tag: "(0018,1411)", - vr: "DS", - vm: "1", - name: "ExposureIndex", - }, - "(0018,1412)": { - tag: "(0018,1412)", - vr: "DS", - vm: "1", - name: "TargetExposureIndex", - }, - "(0018,1413)": { - tag: "(0018,1413)", - vr: "DS", - vm: "1", - name: "DeviationIndex", - }, - "(0018,1450)": { - tag: "(0018,1450)", - vr: "DS", - vm: "1", - name: "ColumnAngulation", - }, - "(0018,1460)": { - tag: "(0018,1460)", - vr: "DS", - vm: "1", - name: "TomoLayerHeight", - }, - "(0018,1470)": { tag: "(0018,1470)", vr: "DS", vm: "1", name: "TomoAngle" }, - "(0018,1480)": { tag: "(0018,1480)", vr: "DS", vm: "1", name: "TomoTime" }, - "(0018,1490)": { tag: "(0018,1490)", vr: "CS", vm: "1", name: "TomoType" }, - "(0018,1491)": { tag: "(0018,1491)", vr: "CS", vm: "1", name: "TomoClass" }, - "(0018,1495)": { - tag: "(0018,1495)", - vr: "IS", - vm: "1", - name: "NumberOfTomosynthesisSourceImages", - }, - "(0018,1500)": { - tag: "(0018,1500)", - vr: "CS", - vm: "1", - name: "PositionerMotion", - }, - "(0018,1508)": { - tag: "(0018,1508)", - vr: "CS", - vm: "1", - name: "PositionerType", - }, - "(0018,1510)": { - tag: "(0018,1510)", - vr: "DS", - vm: "1", - name: "PositionerPrimaryAngle", - }, - "(0018,1511)": { - tag: "(0018,1511)", - vr: "DS", - vm: "1", - name: "PositionerSecondaryAngle", - }, - "(0018,1520)": { - tag: "(0018,1520)", - vr: "DS", - vm: "1-n", - name: "PositionerPrimaryAngleIncrement", - }, - "(0018,1521)": { - tag: "(0018,1521)", - vr: "DS", - vm: "1-n", - name: "PositionerSecondaryAngleIncrement", - }, - "(0018,1530)": { - tag: "(0018,1530)", - vr: "DS", - vm: "1", - name: "DetectorPrimaryAngle", - }, - "(0018,1531)": { - tag: "(0018,1531)", - vr: "DS", - vm: "1", - name: "DetectorSecondaryAngle", - }, - "(0018,1600)": { - tag: "(0018,1600)", - vr: "CS", - vm: "1-3", - name: "ShutterShape", - }, - "(0018,1602)": { - tag: "(0018,1602)", - vr: "IS", - vm: "1", - name: "ShutterLeftVerticalEdge", - }, - "(0018,1604)": { - tag: "(0018,1604)", - vr: "IS", - vm: "1", - name: "ShutterRightVerticalEdge", - }, - "(0018,1606)": { - tag: "(0018,1606)", - vr: "IS", - vm: "1", - name: "ShutterUpperHorizontalEdge", - }, - "(0018,1608)": { - tag: "(0018,1608)", - vr: "IS", - vm: "1", - name: "ShutterLowerHorizontalEdge", - }, - "(0018,1610)": { - tag: "(0018,1610)", - vr: "IS", - vm: "2", - name: "CenterOfCircularShutter", - }, - "(0018,1612)": { - tag: "(0018,1612)", - vr: "IS", - vm: "1", - name: "RadiusOfCircularShutter", - }, - "(0018,1620)": { - tag: "(0018,1620)", - vr: "IS", - vm: "2-2n", - name: "VerticesOfThePolygonalShutter", - }, - "(0018,1622)": { - tag: "(0018,1622)", - vr: "US", - vm: "1", - name: "ShutterPresentationValue", - }, - "(0018,1623)": { - tag: "(0018,1623)", - vr: "US", - vm: "1", - name: "ShutterOverlayGroup", - }, - "(0018,1624)": { - tag: "(0018,1624)", - vr: "US", - vm: "3", - name: "ShutterPresentationColorCIELabValue", - }, - "(0018,1630)": { - tag: "(0018,1630)", - vr: "CS", - vm: "1", - name: "OutlineShapeType", - }, - "(0018,1631)": { - tag: "(0018,1631)", - vr: "FD", - vm: "1", - name: "OutlineLeftVerticalEdge", - }, - "(0018,1632)": { - tag: "(0018,1632)", - vr: "FD", - vm: "1", - name: "OutlineRightVerticalEdge", - }, - "(0018,1633)": { - tag: "(0018,1633)", - vr: "FD", - vm: "1", - name: "OutlineUpperHorizontalEdge", - }, - "(0018,1634)": { - tag: "(0018,1634)", - vr: "FD", - vm: "1", - name: "OutlineLowerHorizontalEdge", - }, - "(0018,1635)": { - tag: "(0018,1635)", - vr: "FD", - vm: "2", - name: "CenterOfCircularOutline", - }, - "(0018,1636)": { - tag: "(0018,1636)", - vr: "FD", - vm: "1", - name: "DiameterOfCircularOutline", - }, - "(0018,1637)": { - tag: "(0018,1637)", - vr: "UL", - vm: "1", - name: "NumberOfPolygonalVertices", - }, - "(0018,1638)": { - tag: "(0018,1638)", - vr: "OF", - vm: "1", - name: "VerticesOfThePolygonalOutline", - }, - "(0018,1700)": { - tag: "(0018,1700)", - vr: "CS", - vm: "1-3", - name: "CollimatorShape", - }, - "(0018,1702)": { - tag: "(0018,1702)", - vr: "IS", - vm: "1", - name: "CollimatorLeftVerticalEdge", - }, - "(0018,1704)": { - tag: "(0018,1704)", - vr: "IS", - vm: "1", - name: "CollimatorRightVerticalEdge", - }, - "(0018,1706)": { - tag: "(0018,1706)", - vr: "IS", - vm: "1", - name: "CollimatorUpperHorizontalEdge", - }, - "(0018,1708)": { - tag: "(0018,1708)", - vr: "IS", - vm: "1", - name: "CollimatorLowerHorizontalEdge", - }, - "(0018,1710)": { - tag: "(0018,1710)", - vr: "IS", - vm: "2", - name: "CenterOfCircularCollimator", - }, - "(0018,1712)": { - tag: "(0018,1712)", - vr: "IS", - vm: "1", - name: "RadiusOfCircularCollimator", - }, - "(0018,1720)": { - tag: "(0018,1720)", - vr: "IS", - vm: "2-2n", - name: "VerticesOfThePolygonalCollimator", - }, - "(0018,1800)": { - tag: "(0018,1800)", - vr: "CS", - vm: "1", - name: "AcquisitionTimeSynchronized", - }, - "(0018,1801)": { tag: "(0018,1801)", vr: "SH", vm: "1", name: "TimeSource" }, - "(0018,1802)": { - tag: "(0018,1802)", - vr: "CS", - vm: "1", - name: "TimeDistributionProtocol", - }, - "(0018,1803)": { - tag: "(0018,1803)", - vr: "LO", - vm: "1", - name: "NTPSourceAddress", - }, - "(0018,2001)": { - tag: "(0018,2001)", - vr: "IS", - vm: "1-n", - name: "PageNumberVector", - }, - "(0018,2002)": { - tag: "(0018,2002)", - vr: "SH", - vm: "1-n", - name: "FrameLabelVector", - }, - "(0018,2003)": { - tag: "(0018,2003)", - vr: "DS", - vm: "1-n", - name: "FramePrimaryAngleVector", - }, - "(0018,2004)": { - tag: "(0018,2004)", - vr: "DS", - vm: "1-n", - name: "FrameSecondaryAngleVector", - }, - "(0018,2005)": { - tag: "(0018,2005)", - vr: "DS", - vm: "1-n", - name: "SliceLocationVector", - }, - "(0018,2006)": { - tag: "(0018,2006)", - vr: "SH", - vm: "1-n", - name: "DisplayWindowLabelVector", - }, - "(0018,2010)": { - tag: "(0018,2010)", - vr: "DS", - vm: "2", - name: "NominalScannedPixelSpacing", - }, - "(0018,2020)": { - tag: "(0018,2020)", - vr: "CS", - vm: "1", - name: "DigitizingDeviceTransportDirection", - }, - "(0018,2030)": { - tag: "(0018,2030)", - vr: "DS", - vm: "1", - name: "RotationOfScannedFilm", - }, - "(0018,2041)": { - tag: "(0018,2041)", - vr: "SQ", - vm: "1", - name: "BiopsyTargetSequence", - }, - "(0018,2042)": { tag: "(0018,2042)", vr: "UI", vm: "1", name: "TargetUID" }, - "(0018,2043)": { - tag: "(0018,2043)", - vr: "FL", - vm: "2", - name: "LocalizingCursorPosition", - }, - "(0018,2044)": { - tag: "(0018,2044)", - vr: "FL", - vm: "3", - name: "CalculatedTargetPosition", - }, - "(0018,2045)": { tag: "(0018,2045)", vr: "SH", vm: "1", name: "TargetLabel" }, - "(0018,2046)": { - tag: "(0018,2046)", - vr: "FL", - vm: "1", - name: "DisplayedZValue", - }, - "(0018,3100)": { - tag: "(0018,3100)", - vr: "CS", - vm: "1", - name: "IVUSAcquisition", - }, - "(0018,3101)": { - tag: "(0018,3101)", - vr: "DS", - vm: "1", - name: "IVUSPullbackRate", - }, - "(0018,3102)": { - tag: "(0018,3102)", - vr: "DS", - vm: "1", - name: "IVUSGatedRate", - }, - "(0018,3103)": { - tag: "(0018,3103)", - vr: "IS", - vm: "1", - name: "IVUSPullbackStartFrameNumber", - }, - "(0018,3104)": { - tag: "(0018,3104)", - vr: "IS", - vm: "1", - name: "IVUSPullbackStopFrameNumber", - }, - "(0018,3105)": { - tag: "(0018,3105)", - vr: "IS", - vm: "1-n", - name: "LesionNumber", - }, - "(0018,4000)": { - tag: "(0018,4000)", - vr: "LT", - vm: "1", - name: "AcquisitionComments", - }, - "(0018,5000)": { - tag: "(0018,5000)", - vr: "SH", - vm: "1-n", - name: "OutputPower", - }, - "(0018,5010)": { - tag: "(0018,5010)", - vr: "LO", - vm: "1-n", - name: "TransducerData", - }, - "(0018,5011)": { - tag: "(0018,5011)", - vr: "SQ", - vm: "1", - name: "TransducerIdentificationSequence", - }, - "(0018,5012)": { tag: "(0018,5012)", vr: "DS", vm: "1", name: "FocusDepth" }, - "(0018,5020)": { - tag: "(0018,5020)", - vr: "LO", - vm: "1", - name: "ProcessingFunction", - }, - "(0018,5021)": { - tag: "(0018,5021)", - vr: "LO", - vm: "1", - name: "PostprocessingFunction", - }, - "(0018,5022)": { - tag: "(0018,5022)", - vr: "DS", - vm: "1", - name: "MechanicalIndex", - }, - "(0018,5024)": { - tag: "(0018,5024)", - vr: "DS", - vm: "1", - name: "BoneThermalIndex", - }, - "(0018,5026)": { - tag: "(0018,5026)", - vr: "DS", - vm: "1", - name: "CranialThermalIndex", - }, - "(0018,5027)": { - tag: "(0018,5027)", - vr: "DS", - vm: "1", - name: "SoftTissueThermalIndex", - }, - "(0018,5028)": { - tag: "(0018,5028)", - vr: "DS", - vm: "1", - name: "SoftTissueFocusThermalIndex", - }, - "(0018,5029)": { - tag: "(0018,5029)", - vr: "DS", - vm: "1", - name: "SoftTissueSurfaceThermalIndex", - }, - "(0018,5030)": { - tag: "(0018,5030)", - vr: "DS", - vm: "1", - name: "DynamicRange", - }, - "(0018,5040)": { tag: "(0018,5040)", vr: "DS", vm: "1", name: "TotalGain" }, - "(0018,5050)": { - tag: "(0018,5050)", - vr: "IS", - vm: "1", - name: "DepthOfScanField", - }, - "(0018,5100)": { - tag: "(0018,5100)", - vr: "CS", - vm: "1", - name: "PatientPosition", - }, - "(0018,5101)": { - tag: "(0018,5101)", - vr: "CS", - vm: "1", - name: "ViewPosition", - }, - "(0018,5104)": { - tag: "(0018,5104)", - vr: "SQ", - vm: "1", - name: "ProjectionEponymousNameCodeSequence", - }, - "(0018,5210)": { - tag: "(0018,5210)", - vr: "DS", - vm: "6", - name: "ImageTransformationMatrix", - }, - "(0018,5212)": { - tag: "(0018,5212)", - vr: "DS", - vm: "3", - name: "ImageTranslationVector", - }, - "(0018,6000)": { tag: "(0018,6000)", vr: "DS", vm: "1", name: "Sensitivity" }, - "(0018,6011)": { - tag: "(0018,6011)", - vr: "SQ", - vm: "1", - name: "SequenceOfUltrasoundRegions", - }, - "(0018,6012)": { - tag: "(0018,6012)", - vr: "US", - vm: "1", - name: "RegionSpatialFormat", - }, - "(0018,6014)": { - tag: "(0018,6014)", - vr: "US", - vm: "1", - name: "RegionDataType", - }, - "(0018,6016)": { tag: "(0018,6016)", vr: "UL", vm: "1", name: "RegionFlags" }, - "(0018,6018)": { - tag: "(0018,6018)", - vr: "UL", - vm: "1", - name: "RegionLocationMinX0", - }, - "(0018,601A)": { - tag: "(0018,601A)", - vr: "UL", - vm: "1", - name: "RegionLocationMinY0", - }, - "(0018,601C)": { - tag: "(0018,601C)", - vr: "UL", - vm: "1", - name: "RegionLocationMaxX1", - }, - "(0018,601E)": { - tag: "(0018,601E)", - vr: "UL", - vm: "1", - name: "RegionLocationMaxY1", - }, - "(0018,6020)": { - tag: "(0018,6020)", - vr: "SL", - vm: "1", - name: "ReferencePixelX0", - }, - "(0018,6022)": { - tag: "(0018,6022)", - vr: "SL", - vm: "1", - name: "ReferencePixelY0", - }, - "(0018,6024)": { - tag: "(0018,6024)", - vr: "US", - vm: "1", - name: "PhysicalUnitsXDirection", - }, - "(0018,6026)": { - tag: "(0018,6026)", - vr: "US", - vm: "1", - name: "PhysicalUnitsYDirection", - }, - "(0018,6028)": { - tag: "(0018,6028)", - vr: "FD", - vm: "1", - name: "ReferencePixelPhysicalValueX", - }, - "(0018,602A)": { - tag: "(0018,602A)", - vr: "FD", - vm: "1", - name: "ReferencePixelPhysicalValueY", - }, - "(0018,602C)": { - tag: "(0018,602C)", - vr: "FD", - vm: "1", - name: "PhysicalDeltaX", - }, - "(0018,602E)": { - tag: "(0018,602E)", - vr: "FD", - vm: "1", - name: "PhysicalDeltaY", - }, - "(0018,6030)": { - tag: "(0018,6030)", - vr: "UL", - vm: "1", - name: "TransducerFrequency", - }, - "(0018,6031)": { - tag: "(0018,6031)", - vr: "CS", - vm: "1", - name: "TransducerType", - }, - "(0018,6032)": { - tag: "(0018,6032)", - vr: "UL", - vm: "1", - name: "PulseRepetitionFrequency", - }, - "(0018,6034)": { - tag: "(0018,6034)", - vr: "FD", - vm: "1", - name: "DopplerCorrectionAngle", - }, - "(0018,6036)": { - tag: "(0018,6036)", - vr: "FD", - vm: "1", - name: "SteeringAngle", - }, - "(0018,6038)": { - tag: "(0018,6038)", - vr: "UL", - vm: "1", - name: "DopplerSampleVolumeXPositionRetired", - }, - "(0018,6039)": { - tag: "(0018,6039)", - vr: "SL", - vm: "1", - name: "DopplerSampleVolumeXPosition", - }, - "(0018,603A)": { - tag: "(0018,603A)", - vr: "UL", - vm: "1", - name: "DopplerSampleVolumeYPositionRetired", - }, - "(0018,603B)": { - tag: "(0018,603B)", - vr: "SL", - vm: "1", - name: "DopplerSampleVolumeYPosition", - }, - "(0018,603C)": { - tag: "(0018,603C)", - vr: "UL", - vm: "1", - name: "TMLinePositionX0Retired", - }, - "(0018,603D)": { - tag: "(0018,603D)", - vr: "SL", - vm: "1", - name: "TMLinePositionX0", - }, - "(0018,603E)": { - tag: "(0018,603E)", - vr: "UL", - vm: "1", - name: "TMLinePositionY0Retired", - }, - "(0018,603F)": { - tag: "(0018,603F)", - vr: "SL", - vm: "1", - name: "TMLinePositionY0", - }, - "(0018,6040)": { - tag: "(0018,6040)", - vr: "UL", - vm: "1", - name: "TMLinePositionX1Retired", - }, - "(0018,6041)": { - tag: "(0018,6041)", - vr: "SL", - vm: "1", - name: "TMLinePositionX1", - }, - "(0018,6042)": { - tag: "(0018,6042)", - vr: "UL", - vm: "1", - name: "TMLinePositionY1Retired", - }, - "(0018,6043)": { - tag: "(0018,6043)", - vr: "SL", - vm: "1", - name: "TMLinePositionY1", - }, - "(0018,6044)": { - tag: "(0018,6044)", - vr: "US", - vm: "1", - name: "PixelComponentOrganization", - }, - "(0018,6046)": { - tag: "(0018,6046)", - vr: "UL", - vm: "1", - name: "PixelComponentMask", - }, - "(0018,6048)": { - tag: "(0018,6048)", - vr: "UL", - vm: "1", - name: "PixelComponentRangeStart", - }, - "(0018,604A)": { - tag: "(0018,604A)", - vr: "UL", - vm: "1", - name: "PixelComponentRangeStop", - }, - "(0018,604C)": { - tag: "(0018,604C)", - vr: "US", - vm: "1", - name: "PixelComponentPhysicalUnits", - }, - "(0018,604E)": { - tag: "(0018,604E)", - vr: "US", - vm: "1", - name: "PixelComponentDataType", - }, - "(0018,6050)": { - tag: "(0018,6050)", - vr: "UL", - vm: "1", - name: "NumberOfTableBreakPoints", - }, - "(0018,6052)": { - tag: "(0018,6052)", - vr: "UL", - vm: "1-n", - name: "TableOfXBreakPoints", - }, - "(0018,6054)": { - tag: "(0018,6054)", - vr: "FD", - vm: "1-n", - name: "TableOfYBreakPoints", - }, - "(0018,6056)": { - tag: "(0018,6056)", - vr: "UL", - vm: "1", - name: "NumberOfTableEntries", - }, - "(0018,6058)": { - tag: "(0018,6058)", - vr: "UL", - vm: "1-n", - name: "TableOfPixelValues", - }, - "(0018,605A)": { - tag: "(0018,605A)", - vr: "FL", - vm: "1-n", - name: "TableOfParameterValues", - }, - "(0018,6060)": { - tag: "(0018,6060)", - vr: "FL", - vm: "1-n", - name: "RWaveTimeVector", - }, - "(0018,6070)": { - tag: "(0018,6070)", - vr: "US", - vm: "1", - name: "ActiveImageAreaOverlayGroup", - }, - "(0018,7000)": { - tag: "(0018,7000)", - vr: "CS", - vm: "1", - name: "DetectorConditionsNominalFlag", - }, - "(0018,7001)": { - tag: "(0018,7001)", - vr: "DS", - vm: "1", - name: "DetectorTemperature", - }, - "(0018,7004)": { - tag: "(0018,7004)", - vr: "CS", - vm: "1", - name: "DetectorType", - }, - "(0018,7005)": { - tag: "(0018,7005)", - vr: "CS", - vm: "1", - name: "DetectorConfiguration", - }, - "(0018,7006)": { - tag: "(0018,7006)", - vr: "LT", - vm: "1", - name: "DetectorDescription", - }, - "(0018,7008)": { - tag: "(0018,7008)", - vr: "LT", - vm: "1", - name: "DetectorMode", - }, - "(0018,700A)": { tag: "(0018,700A)", vr: "SH", vm: "1", name: "DetectorID" }, - "(0018,700C)": { - tag: "(0018,700C)", - vr: "DA", - vm: "1", - name: "DateOfLastDetectorCalibration", - }, - "(0018,700E)": { - tag: "(0018,700E)", - vr: "TM", - vm: "1", - name: "TimeOfLastDetectorCalibration", - }, - "(0018,7010)": { - tag: "(0018,7010)", - vr: "IS", - vm: "1", - name: "ExposuresOnDetectorSinceLastCalibration", - }, - "(0018,7011)": { - tag: "(0018,7011)", - vr: "IS", - vm: "1", - name: "ExposuresOnDetectorSinceManufactured", - }, - "(0018,7012)": { - tag: "(0018,7012)", - vr: "DS", - vm: "1", - name: "DetectorTimeSinceLastExposure", - }, - "(0018,7014)": { - tag: "(0018,7014)", - vr: "DS", - vm: "1", - name: "DetectorActiveTime", - }, - "(0018,7016)": { - tag: "(0018,7016)", - vr: "DS", - vm: "1", - name: "DetectorActivationOffsetFromExposure", - }, - "(0018,701A)": { - tag: "(0018,701A)", - vr: "DS", - vm: "2", - name: "DetectorBinning", - }, - "(0018,7020)": { - tag: "(0018,7020)", - vr: "DS", - vm: "2", - name: "DetectorElementPhysicalSize", - }, - "(0018,7022)": { - tag: "(0018,7022)", - vr: "DS", - vm: "2", - name: "DetectorElementSpacing", - }, - "(0018,7024)": { - tag: "(0018,7024)", - vr: "CS", - vm: "1", - name: "DetectorActiveShape", - }, - "(0018,7026)": { - tag: "(0018,7026)", - vr: "DS", - vm: "1-2", - name: "DetectorActiveDimensions", - }, - "(0018,7028)": { - tag: "(0018,7028)", - vr: "DS", - vm: "2", - name: "DetectorActiveOrigin", - }, - "(0018,702A)": { - tag: "(0018,702A)", - vr: "LO", - vm: "1", - name: "DetectorManufacturerName", - }, - "(0018,702B)": { - tag: "(0018,702B)", - vr: "LO", - vm: "1", - name: "DetectorManufacturerModelName", - }, - "(0018,7030)": { - tag: "(0018,7030)", - vr: "DS", - vm: "2", - name: "FieldOfViewOrigin", - }, - "(0018,7032)": { - tag: "(0018,7032)", - vr: "DS", - vm: "1", - name: "FieldOfViewRotation", - }, - "(0018,7034)": { - tag: "(0018,7034)", - vr: "CS", - vm: "1", - name: "FieldOfViewHorizontalFlip", - }, - "(0018,7036)": { - tag: "(0018,7036)", - vr: "FL", - vm: "2", - name: "PixelDataAreaOriginRelativeToFOV", - }, - "(0018,7038)": { - tag: "(0018,7038)", - vr: "FL", - vm: "1", - name: "PixelDataAreaRotationAngleRelativeToFOV", - }, - "(0018,7040)": { - tag: "(0018,7040)", - vr: "LT", - vm: "1", - name: "GridAbsorbingMaterial", - }, - "(0018,7041)": { - tag: "(0018,7041)", - vr: "LT", - vm: "1", - name: "GridSpacingMaterial", - }, - "(0018,7042)": { - tag: "(0018,7042)", - vr: "DS", - vm: "1", - name: "GridThickness", - }, - "(0018,7044)": { tag: "(0018,7044)", vr: "DS", vm: "1", name: "GridPitch" }, - "(0018,7046)": { - tag: "(0018,7046)", - vr: "IS", - vm: "2", - name: "GridAspectRatio", - }, - "(0018,7048)": { tag: "(0018,7048)", vr: "DS", vm: "1", name: "GridPeriod" }, - "(0018,704C)": { - tag: "(0018,704C)", - vr: "DS", - vm: "1", - name: "GridFocalDistance", - }, - "(0018,7050)": { - tag: "(0018,7050)", - vr: "CS", - vm: "1-n", - name: "FilterMaterial", - }, - "(0018,7052)": { - tag: "(0018,7052)", - vr: "DS", - vm: "1-n", - name: "FilterThicknessMinimum", - }, - "(0018,7054)": { - tag: "(0018,7054)", - vr: "DS", - vm: "1-n", - name: "FilterThicknessMaximum", - }, - "(0018,7056)": { - tag: "(0018,7056)", - vr: "FL", - vm: "1-n", - name: "FilterBeamPathLengthMinimum", - }, - "(0018,7058)": { - tag: "(0018,7058)", - vr: "FL", - vm: "1-n", - name: "FilterBeamPathLengthMaximum", - }, - "(0018,7060)": { - tag: "(0018,7060)", - vr: "CS", - vm: "1", - name: "ExposureControlMode", - }, - "(0018,7062)": { - tag: "(0018,7062)", - vr: "LT", - vm: "1", - name: "ExposureControlModeDescription", - }, - "(0018,7064)": { - tag: "(0018,7064)", - vr: "CS", - vm: "1", - name: "ExposureStatus", - }, - "(0018,7065)": { - tag: "(0018,7065)", - vr: "DS", - vm: "1", - name: "PhototimerSetting", - }, - "(0018,8150)": { - tag: "(0018,8150)", - vr: "DS", - vm: "1", - name: "ExposureTimeInuS", - }, - "(0018,8151)": { - tag: "(0018,8151)", - vr: "DS", - vm: "1", - name: "XRayTubeCurrentInuA", - }, - "(0018,9004)": { - tag: "(0018,9004)", - vr: "CS", - vm: "1", - name: "ContentQualification", - }, - "(0018,9005)": { - tag: "(0018,9005)", - vr: "SH", - vm: "1", - name: "PulseSequenceName", - }, - "(0018,9006)": { - tag: "(0018,9006)", - vr: "SQ", - vm: "1", - name: "MRImagingModifierSequence", - }, - "(0018,9008)": { - tag: "(0018,9008)", - vr: "CS", - vm: "1", - name: "EchoPulseSequence", - }, - "(0018,9009)": { - tag: "(0018,9009)", - vr: "CS", - vm: "1", - name: "InversionRecovery", - }, - "(0018,9010)": { - tag: "(0018,9010)", - vr: "CS", - vm: "1", - name: "FlowCompensation", - }, - "(0018,9011)": { - tag: "(0018,9011)", - vr: "CS", - vm: "1", - name: "MultipleSpinEcho", - }, - "(0018,9012)": { - tag: "(0018,9012)", - vr: "CS", - vm: "1", - name: "MultiPlanarExcitation", - }, - "(0018,9014)": { - tag: "(0018,9014)", - vr: "CS", - vm: "1", - name: "PhaseContrast", - }, - "(0018,9015)": { - tag: "(0018,9015)", - vr: "CS", - vm: "1", - name: "TimeOfFlightContrast", - }, - "(0018,9016)": { tag: "(0018,9016)", vr: "CS", vm: "1", name: "Spoiling" }, - "(0018,9017)": { - tag: "(0018,9017)", - vr: "CS", - vm: "1", - name: "SteadyStatePulseSequence", - }, - "(0018,9018)": { - tag: "(0018,9018)", - vr: "CS", - vm: "1", - name: "EchoPlanarPulseSequence", - }, - "(0018,9019)": { - tag: "(0018,9019)", - vr: "FD", - vm: "1", - name: "TagAngleFirstAxis", - }, - "(0018,9020)": { - tag: "(0018,9020)", - vr: "CS", - vm: "1", - name: "MagnetizationTransfer", - }, - "(0018,9021)": { - tag: "(0018,9021)", - vr: "CS", - vm: "1", - name: "T2Preparation", - }, - "(0018,9022)": { - tag: "(0018,9022)", - vr: "CS", - vm: "1", - name: "BloodSignalNulling", - }, - "(0018,9024)": { - tag: "(0018,9024)", - vr: "CS", - vm: "1", - name: "SaturationRecovery", - }, - "(0018,9025)": { - tag: "(0018,9025)", - vr: "CS", - vm: "1", - name: "SpectrallySelectedSuppression", - }, - "(0018,9026)": { - tag: "(0018,9026)", - vr: "CS", - vm: "1", - name: "SpectrallySelectedExcitation", - }, - "(0018,9027)": { - tag: "(0018,9027)", - vr: "CS", - vm: "1", - name: "SpatialPresaturation", - }, - "(0018,9028)": { tag: "(0018,9028)", vr: "CS", vm: "1", name: "Tagging" }, - "(0018,9029)": { - tag: "(0018,9029)", - vr: "CS", - vm: "1", - name: "OversamplingPhase", - }, - "(0018,9030)": { - tag: "(0018,9030)", - vr: "FD", - vm: "1", - name: "TagSpacingFirstDimension", - }, - "(0018,9032)": { - tag: "(0018,9032)", - vr: "CS", - vm: "1", - name: "GeometryOfKSpaceTraversal", - }, - "(0018,9033)": { - tag: "(0018,9033)", - vr: "CS", - vm: "1", - name: "SegmentedKSpaceTraversal", - }, - "(0018,9034)": { - tag: "(0018,9034)", - vr: "CS", - vm: "1", - name: "RectilinearPhaseEncodeReordering", - }, - "(0018,9035)": { - tag: "(0018,9035)", - vr: "FD", - vm: "1", - name: "TagThickness", - }, - "(0018,9036)": { - tag: "(0018,9036)", - vr: "CS", - vm: "1", - name: "PartialFourierDirection", - }, - "(0018,9037)": { - tag: "(0018,9037)", - vr: "CS", - vm: "1", - name: "CardiacSynchronizationTechnique", - }, - "(0018,9041)": { - tag: "(0018,9041)", - vr: "LO", - vm: "1", - name: "ReceiveCoilManufacturerName", - }, - "(0018,9042)": { - tag: "(0018,9042)", - vr: "SQ", - vm: "1", - name: "MRReceiveCoilSequence", - }, - "(0018,9043)": { - tag: "(0018,9043)", - vr: "CS", - vm: "1", - name: "ReceiveCoilType", - }, - "(0018,9044)": { - tag: "(0018,9044)", - vr: "CS", - vm: "1", - name: "QuadratureReceiveCoil", - }, - "(0018,9045)": { - tag: "(0018,9045)", - vr: "SQ", - vm: "1", - name: "MultiCoilDefinitionSequence", - }, - "(0018,9046)": { - tag: "(0018,9046)", - vr: "LO", - vm: "1", - name: "MultiCoilConfiguration", - }, - "(0018,9047)": { - tag: "(0018,9047)", - vr: "SH", - vm: "1", - name: "MultiCoilElementName", - }, - "(0018,9048)": { - tag: "(0018,9048)", - vr: "CS", - vm: "1", - name: "MultiCoilElementUsed", - }, - "(0018,9049)": { - tag: "(0018,9049)", - vr: "SQ", - vm: "1", - name: "MRTransmitCoilSequence", - }, - "(0018,9050)": { - tag: "(0018,9050)", - vr: "LO", - vm: "1", - name: "TransmitCoilManufacturerName", - }, - "(0018,9051)": { - tag: "(0018,9051)", - vr: "CS", - vm: "1", - name: "TransmitCoilType", - }, - "(0018,9052)": { - tag: "(0018,9052)", - vr: "FD", - vm: "1-2", - name: "SpectralWidth", - }, - "(0018,9053)": { - tag: "(0018,9053)", - vr: "FD", - vm: "1-2", - name: "ChemicalShiftReference", - }, - "(0018,9054)": { - tag: "(0018,9054)", - vr: "CS", - vm: "1", - name: "VolumeLocalizationTechnique", - }, - "(0018,9058)": { - tag: "(0018,9058)", - vr: "US", - vm: "1", - name: "MRAcquisitionFrequencyEncodingSteps", - }, - "(0018,9059)": { tag: "(0018,9059)", vr: "CS", vm: "1", name: "Decoupling" }, - "(0018,9060)": { - tag: "(0018,9060)", - vr: "CS", - vm: "1-2", - name: "DecoupledNucleus", - }, - "(0018,9061)": { - tag: "(0018,9061)", - vr: "FD", - vm: "1-2", - name: "DecouplingFrequency", - }, - "(0018,9062)": { - tag: "(0018,9062)", - vr: "CS", - vm: "1", - name: "DecouplingMethod", - }, - "(0018,9063)": { - tag: "(0018,9063)", - vr: "FD", - vm: "1-2", - name: "DecouplingChemicalShiftReference", - }, - "(0018,9064)": { - tag: "(0018,9064)", - vr: "CS", - vm: "1", - name: "KSpaceFiltering", - }, - "(0018,9065)": { - tag: "(0018,9065)", - vr: "CS", - vm: "1-2", - name: "TimeDomainFiltering", - }, - "(0018,9066)": { - tag: "(0018,9066)", - vr: "US", - vm: "1-2", - name: "NumberOfZeroFills", - }, - "(0018,9067)": { - tag: "(0018,9067)", - vr: "CS", - vm: "1", - name: "BaselineCorrection", - }, - "(0018,9069)": { - tag: "(0018,9069)", - vr: "FD", - vm: "1", - name: "ParallelReductionFactorInPlane", - }, - "(0018,9070)": { - tag: "(0018,9070)", - vr: "FD", - vm: "1", - name: "CardiacRRIntervalSpecified", - }, - "(0018,9073)": { - tag: "(0018,9073)", - vr: "FD", - vm: "1", - name: "AcquisitionDuration", - }, - "(0018,9074)": { - tag: "(0018,9074)", - vr: "DT", - vm: "1", - name: "FrameAcquisitionDateTime", - }, - "(0018,9075)": { - tag: "(0018,9075)", - vr: "CS", - vm: "1", - name: "DiffusionDirectionality", - }, - "(0018,9076)": { - tag: "(0018,9076)", - vr: "SQ", - vm: "1", - name: "DiffusionGradientDirectionSequence", - }, - "(0018,9077)": { - tag: "(0018,9077)", - vr: "CS", - vm: "1", - name: "ParallelAcquisition", - }, - "(0018,9078)": { - tag: "(0018,9078)", - vr: "CS", - vm: "1", - name: "ParallelAcquisitionTechnique", - }, - "(0018,9079)": { - tag: "(0018,9079)", - vr: "FD", - vm: "1-n", - name: "InversionTimes", - }, - "(0018,9080)": { - tag: "(0018,9080)", - vr: "ST", - vm: "1", - name: "MetaboliteMapDescription", - }, - "(0018,9081)": { - tag: "(0018,9081)", - vr: "CS", - vm: "1", - name: "PartialFourier", - }, - "(0018,9082)": { - tag: "(0018,9082)", - vr: "FD", - vm: "1", - name: "EffectiveEchoTime", - }, - "(0018,9083)": { - tag: "(0018,9083)", - vr: "SQ", - vm: "1", - name: "MetaboliteMapCodeSequence", - }, - "(0018,9084)": { - tag: "(0018,9084)", - vr: "SQ", - vm: "1", - name: "ChemicalShiftSequence", - }, - "(0018,9085)": { - tag: "(0018,9085)", - vr: "CS", - vm: "1", - name: "CardiacSignalSource", - }, - "(0018,9087)": { - tag: "(0018,9087)", - vr: "FD", - vm: "1", - name: "DiffusionBValue", - }, - "(0018,9089)": { - tag: "(0018,9089)", - vr: "FD", - vm: "3", - name: "DiffusionGradientOrientation", - }, - "(0018,9090)": { - tag: "(0018,9090)", - vr: "FD", - vm: "3", - name: "VelocityEncodingDirection", - }, - "(0018,9091)": { - tag: "(0018,9091)", - vr: "FD", - vm: "1", - name: "VelocityEncodingMinimumValue", - }, - "(0018,9092)": { - tag: "(0018,9092)", - vr: "SQ", - vm: "1", - name: "VelocityEncodingAcquisitionSequence", - }, - "(0018,9093)": { - tag: "(0018,9093)", - vr: "US", - vm: "1", - name: "NumberOfKSpaceTrajectories", - }, - "(0018,9094)": { - tag: "(0018,9094)", - vr: "CS", - vm: "1", - name: "CoverageOfKSpace", - }, - "(0018,9095)": { - tag: "(0018,9095)", - vr: "UL", - vm: "1", - name: "SpectroscopyAcquisitionPhaseRows", - }, - "(0018,9096)": { - tag: "(0018,9096)", - vr: "FD", - vm: "1", - name: "ParallelReductionFactorInPlaneRetired", - }, - "(0018,9098)": { - tag: "(0018,9098)", - vr: "FD", - vm: "1-2", - name: "TransmitterFrequency", - }, - "(0018,9100)": { - tag: "(0018,9100)", - vr: "CS", - vm: "1-2", - name: "ResonantNucleus", - }, - "(0018,9101)": { - tag: "(0018,9101)", - vr: "CS", - vm: "1", - name: "FrequencyCorrection", - }, - "(0018,9103)": { - tag: "(0018,9103)", - vr: "SQ", - vm: "1", - name: "MRSpectroscopyFOVGeometrySequence", - }, - "(0018,9104)": { - tag: "(0018,9104)", - vr: "FD", - vm: "1", - name: "SlabThickness", - }, - "(0018,9105)": { - tag: "(0018,9105)", - vr: "FD", - vm: "3", - name: "SlabOrientation", - }, - "(0018,9106)": { - tag: "(0018,9106)", - vr: "FD", - vm: "3", - name: "MidSlabPosition", - }, - "(0018,9107)": { - tag: "(0018,9107)", - vr: "SQ", - vm: "1", - name: "MRSpatialSaturationSequence", - }, - "(0018,9112)": { - tag: "(0018,9112)", - vr: "SQ", - vm: "1", - name: "MRTimingAndRelatedParametersSequence", - }, - "(0018,9114)": { - tag: "(0018,9114)", - vr: "SQ", - vm: "1", - name: "MREchoSequence", - }, - "(0018,9115)": { - tag: "(0018,9115)", - vr: "SQ", - vm: "1", - name: "MRModifierSequence", - }, - "(0018,9117)": { - tag: "(0018,9117)", - vr: "SQ", - vm: "1", - name: "MRDiffusionSequence", - }, - "(0018,9118)": { - tag: "(0018,9118)", - vr: "SQ", - vm: "1", - name: "CardiacSynchronizationSequence", - }, - "(0018,9119)": { - tag: "(0018,9119)", - vr: "SQ", - vm: "1", - name: "MRAveragesSequence", - }, - "(0018,9125)": { - tag: "(0018,9125)", - vr: "SQ", - vm: "1", - name: "MRFOVGeometrySequence", - }, - "(0018,9126)": { - tag: "(0018,9126)", - vr: "SQ", - vm: "1", - name: "VolumeLocalizationSequence", - }, - "(0018,9127)": { - tag: "(0018,9127)", - vr: "UL", - vm: "1", - name: "SpectroscopyAcquisitionDataColumns", - }, - "(0018,9147)": { - tag: "(0018,9147)", - vr: "CS", - vm: "1", - name: "DiffusionAnisotropyType", - }, - "(0018,9151)": { - tag: "(0018,9151)", - vr: "DT", - vm: "1", - name: "FrameReferenceDateTime", - }, - "(0018,9152)": { - tag: "(0018,9152)", - vr: "SQ", - vm: "1", - name: "MRMetaboliteMapSequence", - }, - "(0018,9155)": { - tag: "(0018,9155)", - vr: "FD", - vm: "1", - name: "ParallelReductionFactorOutOfPlane", - }, - "(0018,9159)": { - tag: "(0018,9159)", - vr: "UL", - vm: "1", - name: "SpectroscopyAcquisitionOutOfPlanePhaseSteps", - }, - "(0018,9166)": { - tag: "(0018,9166)", - vr: "CS", - vm: "1", - name: "BulkMotionStatus", - }, - "(0018,9168)": { - tag: "(0018,9168)", - vr: "FD", - vm: "1", - name: "ParallelReductionFactorSecondInPlane", - }, - "(0018,9169)": { - tag: "(0018,9169)", - vr: "CS", - vm: "1", - name: "CardiacBeatRejectionTechnique", - }, - "(0018,9170)": { - tag: "(0018,9170)", - vr: "CS", - vm: "1", - name: "RespiratoryMotionCompensationTechnique", - }, - "(0018,9171)": { - tag: "(0018,9171)", - vr: "CS", - vm: "1", - name: "RespiratorySignalSource", - }, - "(0018,9172)": { - tag: "(0018,9172)", - vr: "CS", - vm: "1", - name: "BulkMotionCompensationTechnique", - }, - "(0018,9173)": { - tag: "(0018,9173)", - vr: "CS", - vm: "1", - name: "BulkMotionSignalSource", - }, - "(0018,9174)": { - tag: "(0018,9174)", - vr: "CS", - vm: "1", - name: "ApplicableSafetyStandardAgency", - }, - "(0018,9175)": { - tag: "(0018,9175)", - vr: "LO", - vm: "1", - name: "ApplicableSafetyStandardDescription", - }, - "(0018,9176)": { - tag: "(0018,9176)", - vr: "SQ", - vm: "1", - name: "OperatingModeSequence", - }, - "(0018,9177)": { - tag: "(0018,9177)", - vr: "CS", - vm: "1", - name: "OperatingModeType", - }, - "(0018,9178)": { - tag: "(0018,9178)", - vr: "CS", - vm: "1", - name: "OperatingMode", - }, - "(0018,9179)": { - tag: "(0018,9179)", - vr: "CS", - vm: "1", - name: "SpecificAbsorptionRateDefinition", - }, - "(0018,9180)": { - tag: "(0018,9180)", - vr: "CS", - vm: "1", - name: "GradientOutputType", - }, - "(0018,9181)": { - tag: "(0018,9181)", - vr: "FD", - vm: "1", - name: "SpecificAbsorptionRateValue", - }, - "(0018,9182)": { - tag: "(0018,9182)", - vr: "FD", - vm: "1", - name: "GradientOutput", - }, - "(0018,9183)": { - tag: "(0018,9183)", - vr: "CS", - vm: "1", - name: "FlowCompensationDirection", - }, - "(0018,9184)": { - tag: "(0018,9184)", - vr: "FD", - vm: "1", - name: "TaggingDelay", - }, - "(0018,9185)": { - tag: "(0018,9185)", - vr: "ST", - vm: "1", - name: "RespiratoryMotionCompensationTechniqueDescription", - }, - "(0018,9186)": { - tag: "(0018,9186)", - vr: "SH", - vm: "1", - name: "RespiratorySignalSourceID", - }, - "(0018,9195)": { - tag: "(0018,9195)", - vr: "FD", - vm: "1", - name: "ChemicalShiftMinimumIntegrationLimitInHz", - }, - "(0018,9196)": { - tag: "(0018,9196)", - vr: "FD", - vm: "1", - name: "ChemicalShiftMaximumIntegrationLimitInHz", - }, - "(0018,9197)": { - tag: "(0018,9197)", - vr: "SQ", - vm: "1", - name: "MRVelocityEncodingSequence", - }, - "(0018,9198)": { - tag: "(0018,9198)", - vr: "CS", - vm: "1", - name: "FirstOrderPhaseCorrection", - }, - "(0018,9199)": { - tag: "(0018,9199)", - vr: "CS", - vm: "1", - name: "WaterReferencedPhaseCorrection", - }, - "(0018,9200)": { - tag: "(0018,9200)", - vr: "CS", - vm: "1", - name: "MRSpectroscopyAcquisitionType", - }, - "(0018,9214)": { - tag: "(0018,9214)", - vr: "CS", - vm: "1", - name: "RespiratoryCyclePosition", - }, - "(0018,9217)": { - tag: "(0018,9217)", - vr: "FD", - vm: "1", - name: "VelocityEncodingMaximumValue", - }, - "(0018,9218)": { - tag: "(0018,9218)", - vr: "FD", - vm: "1", - name: "TagSpacingSecondDimension", - }, - "(0018,9219)": { - tag: "(0018,9219)", - vr: "SS", - vm: "1", - name: "TagAngleSecondAxis", - }, - "(0018,9220)": { - tag: "(0018,9220)", - vr: "FD", - vm: "1", - name: "FrameAcquisitionDuration", - }, - "(0018,9226)": { - tag: "(0018,9226)", - vr: "SQ", - vm: "1", - name: "MRImageFrameTypeSequence", - }, - "(0018,9227)": { - tag: "(0018,9227)", - vr: "SQ", - vm: "1", - name: "MRSpectroscopyFrameTypeSequence", - }, - "(0018,9231)": { - tag: "(0018,9231)", - vr: "US", - vm: "1", - name: "MRAcquisitionPhaseEncodingStepsInPlane", - }, - "(0018,9232)": { - tag: "(0018,9232)", - vr: "US", - vm: "1", - name: "MRAcquisitionPhaseEncodingStepsOutOfPlane", - }, - "(0018,9234)": { - tag: "(0018,9234)", - vr: "UL", - vm: "1", - name: "SpectroscopyAcquisitionPhaseColumns", - }, - "(0018,9236)": { - tag: "(0018,9236)", - vr: "CS", - vm: "1", - name: "CardiacCyclePosition", - }, - "(0018,9239)": { - tag: "(0018,9239)", - vr: "SQ", - vm: "1", - name: "SpecificAbsorptionRateSequence", - }, - "(0018,9240)": { - tag: "(0018,9240)", - vr: "US", - vm: "1", - name: "RFEchoTrainLength", - }, - "(0018,9241)": { - tag: "(0018,9241)", - vr: "US", - vm: "1", - name: "GradientEchoTrainLength", - }, - "(0018,9250)": { - tag: "(0018,9250)", - vr: "CS", - vm: "1", - name: "ArterialSpinLabelingContrast", - }, - "(0018,9251)": { - tag: "(0018,9251)", - vr: "SQ", - vm: "1", - name: "MRArterialSpinLabelingSequence", - }, - "(0018,9252)": { - tag: "(0018,9252)", - vr: "LO", - vm: "1", - name: "ASLTechniqueDescription", - }, - "(0018,9253)": { - tag: "(0018,9253)", - vr: "US", - vm: "1", - name: "ASLSlabNumber", - }, - "(0018,9254)": { - tag: "(0018,9254)", - vr: "FD", - vm: "1", - name: "ASLSlabThickness", - }, - "(0018,9255)": { - tag: "(0018,9255)", - vr: "FD", - vm: "3", - name: "ASLSlabOrientation", - }, - "(0018,9256)": { - tag: "(0018,9256)", - vr: "FD", - vm: "3", - name: "ASLMidSlabPosition", - }, - "(0018,9257)": { tag: "(0018,9257)", vr: "CS", vm: "1", name: "ASLContext" }, - "(0018,9258)": { - tag: "(0018,9258)", - vr: "UL", - vm: "1", - name: "ASLPulseTrainDuration", - }, - "(0018,9259)": { - tag: "(0018,9259)", - vr: "CS", - vm: "1", - name: "ASLCrusherFlag", - }, - "(0018,925A)": { - tag: "(0018,925A)", - vr: "FD", - vm: "1", - name: "ASLCrusherFlowLimit", - }, - "(0018,925B)": { - tag: "(0018,925B)", - vr: "LO", - vm: "1", - name: "ASLCrusherDescription", - }, - "(0018,925C)": { - tag: "(0018,925C)", - vr: "CS", - vm: "1", - name: "ASLBolusCutoffFlag", - }, - "(0018,925D)": { - tag: "(0018,925D)", - vr: "SQ", - vm: "1", - name: "ASLBolusCutoffTimingSequence", - }, - "(0018,925E)": { - tag: "(0018,925E)", - vr: "LO", - vm: "1", - name: "ASLBolusCutoffTechnique", - }, - "(0018,925F)": { - tag: "(0018,925F)", - vr: "UL", - vm: "1", - name: "ASLBolusCutoffDelayTime", - }, - "(0018,9260)": { - tag: "(0018,9260)", - vr: "SQ", - vm: "1", - name: "ASLSlabSequence", - }, - "(0018,9295)": { - tag: "(0018,9295)", - vr: "FD", - vm: "1", - name: "ChemicalShiftMinimumIntegrationLimitInppm", - }, - "(0018,9296)": { - tag: "(0018,9296)", - vr: "FD", - vm: "1", - name: "ChemicalShiftMaximumIntegrationLimitInppm", - }, - "(0018,9297)": { - tag: "(0018,9297)", - vr: "CS", - vm: "1", - name: "WaterReferenceAcquisition", - }, - "(0018,9298)": { - tag: "(0018,9298)", - vr: "IS", - vm: "1", - name: "EchoPeakPosition", - }, - "(0018,9301)": { - tag: "(0018,9301)", - vr: "SQ", - vm: "1", - name: "CTAcquisitionTypeSequence", - }, - "(0018,9302)": { - tag: "(0018,9302)", - vr: "CS", - vm: "1", - name: "AcquisitionType", - }, - "(0018,9303)": { tag: "(0018,9303)", vr: "FD", vm: "1", name: "TubeAngle" }, - "(0018,9304)": { - tag: "(0018,9304)", - vr: "SQ", - vm: "1", - name: "CTAcquisitionDetailsSequence", - }, - "(0018,9305)": { - tag: "(0018,9305)", - vr: "FD", - vm: "1", - name: "RevolutionTime", - }, - "(0018,9306)": { - tag: "(0018,9306)", - vr: "FD", - vm: "1", - name: "SingleCollimationWidth", - }, - "(0018,9307)": { - tag: "(0018,9307)", - vr: "FD", - vm: "1", - name: "TotalCollimationWidth", - }, - "(0018,9308)": { - tag: "(0018,9308)", - vr: "SQ", - vm: "1", - name: "CTTableDynamicsSequence", - }, - "(0018,9309)": { tag: "(0018,9309)", vr: "FD", vm: "1", name: "TableSpeed" }, - "(0018,9310)": { - tag: "(0018,9310)", - vr: "FD", - vm: "1", - name: "TableFeedPerRotation", - }, - "(0018,9311)": { - tag: "(0018,9311)", - vr: "FD", - vm: "1", - name: "SpiralPitchFactor", - }, - "(0018,9312)": { - tag: "(0018,9312)", - vr: "SQ", - vm: "1", - name: "CTGeometrySequence", - }, - "(0018,9313)": { - tag: "(0018,9313)", - vr: "FD", - vm: "3", - name: "DataCollectionCenterPatient", - }, - "(0018,9314)": { - tag: "(0018,9314)", - vr: "SQ", - vm: "1", - name: "CTReconstructionSequence", - }, - "(0018,9315)": { - tag: "(0018,9315)", - vr: "CS", - vm: "1", - name: "ReconstructionAlgorithm", - }, - "(0018,9316)": { - tag: "(0018,9316)", - vr: "CS", - vm: "1", - name: "ConvolutionKernelGroup", - }, - "(0018,9317)": { - tag: "(0018,9317)", - vr: "FD", - vm: "2", - name: "ReconstructionFieldOfView", - }, - "(0018,9318)": { - tag: "(0018,9318)", - vr: "FD", - vm: "3", - name: "ReconstructionTargetCenterPatient", - }, - "(0018,9319)": { - tag: "(0018,9319)", - vr: "FD", - vm: "1", - name: "ReconstructionAngle", - }, - "(0018,9320)": { tag: "(0018,9320)", vr: "SH", vm: "1", name: "ImageFilter" }, - "(0018,9321)": { - tag: "(0018,9321)", - vr: "SQ", - vm: "1", - name: "CTExposureSequence", - }, - "(0018,9322)": { - tag: "(0018,9322)", - vr: "FD", - vm: "2", - name: "ReconstructionPixelSpacing", - }, - "(0018,9323)": { - tag: "(0018,9323)", - vr: "CS", - vm: "1-n", - name: "ExposureModulationType", - }, - "(0018,9324)": { - tag: "(0018,9324)", - vr: "FD", - vm: "1", - name: "EstimatedDoseSaving", - }, - "(0018,9325)": { - tag: "(0018,9325)", - vr: "SQ", - vm: "1", - name: "CTXRayDetailsSequence", - }, - "(0018,9326)": { - tag: "(0018,9326)", - vr: "SQ", - vm: "1", - name: "CTPositionSequence", - }, - "(0018,9327)": { - tag: "(0018,9327)", - vr: "FD", - vm: "1", - name: "TablePosition", - }, - "(0018,9328)": { - tag: "(0018,9328)", - vr: "FD", - vm: "1", - name: "ExposureTimeInms", - }, - "(0018,9329)": { - tag: "(0018,9329)", - vr: "SQ", - vm: "1", - name: "CTImageFrameTypeSequence", - }, - "(0018,9330)": { - tag: "(0018,9330)", - vr: "FD", - vm: "1", - name: "XRayTubeCurrentInmA", - }, - "(0018,9332)": { - tag: "(0018,9332)", - vr: "FD", - vm: "1", - name: "ExposureInmAs", - }, - "(0018,9333)": { - tag: "(0018,9333)", - vr: "CS", - vm: "1", - name: "ConstantVolumeFlag", - }, - "(0018,9334)": { - tag: "(0018,9334)", - vr: "CS", - vm: "1", - name: "FluoroscopyFlag", - }, - "(0018,9335)": { - tag: "(0018,9335)", - vr: "FD", - vm: "1", - name: "DistanceSourceToDataCollectionCenter", - }, - "(0018,9337)": { - tag: "(0018,9337)", - vr: "US", - vm: "1", - name: "ContrastBolusAgentNumber", - }, - "(0018,9338)": { - tag: "(0018,9338)", - vr: "SQ", - vm: "1", - name: "ContrastBolusIngredientCodeSequence", - }, - "(0018,9340)": { - tag: "(0018,9340)", - vr: "SQ", - vm: "1", - name: "ContrastAdministrationProfileSequence", - }, - "(0018,9341)": { - tag: "(0018,9341)", - vr: "SQ", - vm: "1", - name: "ContrastBolusUsageSequence", - }, - "(0018,9342)": { - tag: "(0018,9342)", - vr: "CS", - vm: "1", - name: "ContrastBolusAgentAdministered", - }, - "(0018,9343)": { - tag: "(0018,9343)", - vr: "CS", - vm: "1", - name: "ContrastBolusAgentDetected", - }, - "(0018,9344)": { - tag: "(0018,9344)", - vr: "CS", - vm: "1", - name: "ContrastBolusAgentPhase", - }, - "(0018,9345)": { tag: "(0018,9345)", vr: "FD", vm: "1", name: "CTDIvol" }, - "(0018,9346)": { - tag: "(0018,9346)", - vr: "SQ", - vm: "1", - name: "CTDIPhantomTypeCodeSequence", - }, - "(0018,9351)": { - tag: "(0018,9351)", - vr: "FL", - vm: "1", - name: "CalciumScoringMassFactorPatient", - }, - "(0018,9352)": { - tag: "(0018,9352)", - vr: "FL", - vm: "3", - name: "CalciumScoringMassFactorDevice", - }, - "(0018,9353)": { - tag: "(0018,9353)", - vr: "FL", - vm: "1", - name: "EnergyWeightingFactor", - }, - "(0018,9360)": { - tag: "(0018,9360)", - vr: "SQ", - vm: "1", - name: "CTAdditionalXRaySourceSequence", - }, - "(0018,9361)": { - tag: "(0018,9361)", - vr: "CS", - vm: "1", - name: "MultienergyCTAcquisition", - }, - "(0018,9362)": { - tag: "(0018,9362)", - vr: "SQ", - vm: "1", - name: "MultienergyCTAcquisitionSequence", - }, - "(0018,9363)": { - tag: "(0018,9363)", - vr: "SQ", - vm: "1", - name: "MultienergyCTProcessingSequence", - }, - "(0018,9364)": { - tag: "(0018,9364)", - vr: "SQ", - vm: "1", - name: "MultienergyCTCharacteristicsSequence", - }, - "(0018,9365)": { - tag: "(0018,9365)", - vr: "SQ", - vm: "1", - name: "MultienergyCTXRaySourceSequence", - }, - "(0018,9366)": { - tag: "(0018,9366)", - vr: "US", - vm: "1", - name: "XRaySourceIndex", - }, - "(0018,9367)": { - tag: "(0018,9367)", - vr: "UC", - vm: "1", - name: "XRaySourceID", - }, - "(0018,9368)": { - tag: "(0018,9368)", - vr: "CS", - vm: "1", - name: "MultienergySourceTechnique", - }, - "(0018,9369)": { - tag: "(0018,9369)", - vr: "DT", - vm: "1", - name: "SourceStartDateTime", - }, - "(0018,936A)": { - tag: "(0018,936A)", - vr: "DT", - vm: "1", - name: "SourceEndDateTime", - }, - "(0018,936B)": { - tag: "(0018,936B)", - vr: "US", - vm: "1", - name: "SwitchingPhaseNumber", - }, - "(0018,936C)": { - tag: "(0018,936C)", - vr: "DS", - vm: "1", - name: "SwitchingPhaseNominalDuration", - }, - "(0018,936D)": { - tag: "(0018,936D)", - vr: "DS", - vm: "1", - name: "SwitchingPhaseTransitionDuration", - }, - "(0018,936E)": { - tag: "(0018,936E)", - vr: "DS", - vm: "1", - name: "EffectiveBinEnergy", - }, - "(0018,936F)": { - tag: "(0018,936F)", - vr: "SQ", - vm: "1", - name: "MultienergyCTXRayDetectorSequence", - }, - "(0018,9370)": { - tag: "(0018,9370)", - vr: "US", - vm: "1", - name: "XRayDetectorIndex", - }, - "(0018,9371)": { - tag: "(0018,9371)", - vr: "UC", - vm: "1", - name: "XRayDetectorID", - }, - "(0018,9372)": { - tag: "(0018,9372)", - vr: "CS", - vm: "1", - name: "MultienergyDetectorType", - }, - "(0018,9373)": { - tag: "(0018,9373)", - vr: "ST", - vm: "1", - name: "XRayDetectorLabel", - }, - "(0018,9374)": { - tag: "(0018,9374)", - vr: "DS", - vm: "1", - name: "NominalMaxEnergy", - }, - "(0018,9375)": { - tag: "(0018,9375)", - vr: "DS", - vm: "1", - name: "NominalMinEnergy", - }, - "(0018,9376)": { - tag: "(0018,9376)", - vr: "US", - vm: "1-n", - name: "ReferencedXRayDetectorIndex", - }, - "(0018,9377)": { - tag: "(0018,9377)", - vr: "US", - vm: "1-n", - name: "ReferencedXRaySourceIndex", - }, - "(0018,9378)": { - tag: "(0018,9378)", - vr: "US", - vm: "1-n", - name: "ReferencedPathIndex", - }, - "(0018,9379)": { - tag: "(0018,9379)", - vr: "SQ", - vm: "1", - name: "MultienergyCTPathSequence", - }, - "(0018,937A)": { - tag: "(0018,937A)", - vr: "US", - vm: "1", - name: "MultienergyCTPathIndex", - }, - "(0018,937B)": { - tag: "(0018,937B)", - vr: "UT", - vm: "1", - name: "MultienergyAcquisitionDescription", - }, - "(0018,937C)": { - tag: "(0018,937C)", - vr: "FD", - vm: "1", - name: "MonoenergeticEnergyEquivalent", - }, - "(0018,937D)": { - tag: "(0018,937D)", - vr: "SQ", - vm: "1", - name: "MaterialCodeSequence", - }, - "(0018,937E)": { - tag: "(0018,937E)", - vr: "CS", - vm: "1", - name: "DecompositionMethod", - }, - "(0018,937F)": { - tag: "(0018,937F)", - vr: "UT", - vm: "1", - name: "DecompositionDescription", - }, - "(0018,9380)": { - tag: "(0018,9380)", - vr: "SQ", - vm: "1", - name: "DecompositionAlgorithmIdentificationSequence", - }, - "(0018,9381)": { - tag: "(0018,9381)", - vr: "SQ", - vm: "1", - name: "DecompositionMaterialSequence", - }, - "(0018,9382)": { - tag: "(0018,9382)", - vr: "SQ", - vm: "1", - name: "MaterialAttenuationSequence", - }, - "(0018,9383)": { - tag: "(0018,9383)", - vr: "DS", - vm: "1", - name: "PhotonEnergy", - }, - "(0018,9384)": { - tag: "(0018,9384)", - vr: "DS", - vm: "1", - name: "XRayMassAttenuationCoefficient", - }, - "(0018,9401)": { - tag: "(0018,9401)", - vr: "SQ", - vm: "1", - name: "ProjectionPixelCalibrationSequence", - }, - "(0018,9402)": { - tag: "(0018,9402)", - vr: "FL", - vm: "1", - name: "DistanceSourceToIsocenter", - }, - "(0018,9403)": { - tag: "(0018,9403)", - vr: "FL", - vm: "1", - name: "DistanceObjectToTableTop", - }, - "(0018,9404)": { - tag: "(0018,9404)", - vr: "FL", - vm: "2", - name: "ObjectPixelSpacingInCenterOfBeam", - }, - "(0018,9405)": { - tag: "(0018,9405)", - vr: "SQ", - vm: "1", - name: "PositionerPositionSequence", - }, - "(0018,9406)": { - tag: "(0018,9406)", - vr: "SQ", - vm: "1", - name: "TablePositionSequence", - }, - "(0018,9407)": { - tag: "(0018,9407)", - vr: "SQ", - vm: "1", - name: "CollimatorShapeSequence", - }, - "(0018,9410)": { - tag: "(0018,9410)", - vr: "CS", - vm: "1", - name: "PlanesInAcquisition", - }, - "(0018,9412)": { - tag: "(0018,9412)", - vr: "SQ", - vm: "1", - name: "XAXRFFrameCharacteristicsSequence", - }, - "(0018,9417)": { - tag: "(0018,9417)", - vr: "SQ", - vm: "1", - name: "FrameAcquisitionSequence", - }, - "(0018,9420)": { - tag: "(0018,9420)", - vr: "CS", - vm: "1", - name: "XRayReceptorType", - }, - "(0018,9423)": { - tag: "(0018,9423)", - vr: "LO", - vm: "1", - name: "AcquisitionProtocolName", - }, - "(0018,9424)": { - tag: "(0018,9424)", - vr: "LT", - vm: "1", - name: "AcquisitionProtocolDescription", - }, - "(0018,9425)": { - tag: "(0018,9425)", - vr: "CS", - vm: "1", - name: "ContrastBolusIngredientOpaque", - }, - "(0018,9426)": { - tag: "(0018,9426)", - vr: "FL", - vm: "1", - name: "DistanceReceptorPlaneToDetectorHousing", - }, - "(0018,9427)": { - tag: "(0018,9427)", - vr: "CS", - vm: "1", - name: "IntensifierActiveShape", - }, - "(0018,9428)": { - tag: "(0018,9428)", - vr: "FL", - vm: "1-2", - name: "IntensifierActiveDimensions", - }, - "(0018,9429)": { - tag: "(0018,9429)", - vr: "FL", - vm: "2", - name: "PhysicalDetectorSize", - }, - "(0018,9430)": { - tag: "(0018,9430)", - vr: "FL", - vm: "2", - name: "PositionOfIsocenterProjection", - }, - "(0018,9432)": { - tag: "(0018,9432)", - vr: "SQ", - vm: "1", - name: "FieldOfViewSequence", - }, - "(0018,9433)": { - tag: "(0018,9433)", - vr: "LO", - vm: "1", - name: "FieldOfViewDescription", - }, - "(0018,9434)": { - tag: "(0018,9434)", - vr: "SQ", - vm: "1", - name: "ExposureControlSensingRegionsSequence", - }, - "(0018,9435)": { - tag: "(0018,9435)", - vr: "CS", - vm: "1", - name: "ExposureControlSensingRegionShape", - }, - "(0018,9436)": { - tag: "(0018,9436)", - vr: "SS", - vm: "1", - name: "ExposureControlSensingRegionLeftVerticalEdge", - }, - "(0018,9437)": { - tag: "(0018,9437)", - vr: "SS", - vm: "1", - name: "ExposureControlSensingRegionRightVerticalEdge", - }, - "(0018,9438)": { - tag: "(0018,9438)", - vr: "SS", - vm: "1", - name: "ExposureControlSensingRegionUpperHorizontalEdge", - }, - "(0018,9439)": { - tag: "(0018,9439)", - vr: "SS", - vm: "1", - name: "ExposureControlSensingRegionLowerHorizontalEdge", - }, - "(0018,9440)": { - tag: "(0018,9440)", - vr: "SS", - vm: "2", - name: "CenterOfCircularExposureControlSensingRegion", - }, - "(0018,9441)": { - tag: "(0018,9441)", - vr: "US", - vm: "1", - name: "RadiusOfCircularExposureControlSensingRegion", - }, - "(0018,9442)": { - tag: "(0018,9442)", - vr: "SS", - vm: "2-n", - name: "VerticesOfThePolygonalExposureControlSensingRegion", - }, - "(0018,9445)": { tag: "(0018,9445)", vr: "", vm: "", name: "" }, - "(0018,9447)": { - tag: "(0018,9447)", - vr: "FL", - vm: "1", - name: "ColumnAngulationPatient", - }, - "(0018,9449)": { tag: "(0018,9449)", vr: "FL", vm: "1", name: "BeamAngle" }, - "(0018,9451)": { - tag: "(0018,9451)", - vr: "SQ", - vm: "1", - name: "FrameDetectorParametersSequence", - }, - "(0018,9452)": { - tag: "(0018,9452)", - vr: "FL", - vm: "1", - name: "CalculatedAnatomyThickness", - }, - "(0018,9455)": { - tag: "(0018,9455)", - vr: "SQ", - vm: "1", - name: "CalibrationSequence", - }, - "(0018,9456)": { - tag: "(0018,9456)", - vr: "SQ", - vm: "1", - name: "ObjectThicknessSequence", - }, - "(0018,9457)": { - tag: "(0018,9457)", - vr: "CS", - vm: "1", - name: "PlaneIdentification", - }, - "(0018,9461)": { - tag: "(0018,9461)", - vr: "FL", - vm: "1-2", - name: "FieldOfViewDimensionsInFloat", - }, - "(0018,9462)": { - tag: "(0018,9462)", - vr: "SQ", - vm: "1", - name: "IsocenterReferenceSystemSequence", - }, - "(0018,9463)": { - tag: "(0018,9463)", - vr: "FL", - vm: "1", - name: "PositionerIsocenterPrimaryAngle", - }, - "(0018,9464)": { - tag: "(0018,9464)", - vr: "FL", - vm: "1", - name: "PositionerIsocenterSecondaryAngle", - }, - "(0018,9465)": { - tag: "(0018,9465)", - vr: "FL", - vm: "1", - name: "PositionerIsocenterDetectorRotationAngle", - }, - "(0018,9466)": { - tag: "(0018,9466)", - vr: "FL", - vm: "1", - name: "TableXPositionToIsocenter", - }, - "(0018,9467)": { - tag: "(0018,9467)", - vr: "FL", - vm: "1", - name: "TableYPositionToIsocenter", - }, - "(0018,9468)": { - tag: "(0018,9468)", - vr: "FL", - vm: "1", - name: "TableZPositionToIsocenter", - }, - "(0018,9469)": { - tag: "(0018,9469)", - vr: "FL", - vm: "1", - name: "TableHorizontalRotationAngle", - }, - "(0018,9470)": { - tag: "(0018,9470)", - vr: "FL", - vm: "1", - name: "TableHeadTiltAngle", - }, - "(0018,9471)": { - tag: "(0018,9471)", - vr: "FL", - vm: "1", - name: "TableCradleTiltAngle", - }, - "(0018,9472)": { - tag: "(0018,9472)", - vr: "SQ", - vm: "1", - name: "FrameDisplayShutterSequence", - }, - "(0018,9473)": { - tag: "(0018,9473)", - vr: "FL", - vm: "1", - name: "AcquiredImageAreaDoseProduct", - }, - "(0018,9474)": { - tag: "(0018,9474)", - vr: "CS", - vm: "1", - name: "CArmPositionerTabletopRelationship", - }, - "(0018,9476)": { - tag: "(0018,9476)", - vr: "SQ", - vm: "1", - name: "XRayGeometrySequence", - }, - "(0018,9477)": { - tag: "(0018,9477)", - vr: "SQ", - vm: "1", - name: "IrradiationEventIdentificationSequence", - }, - "(0018,9504)": { - tag: "(0018,9504)", - vr: "SQ", - vm: "1", - name: "XRay3DFrameTypeSequence", - }, - "(0018,9506)": { - tag: "(0018,9506)", - vr: "SQ", - vm: "1", - name: "ContributingSourcesSequence", - }, - "(0018,9507)": { - tag: "(0018,9507)", - vr: "SQ", - vm: "1", - name: "XRay3DAcquisitionSequence", - }, - "(0018,9508)": { - tag: "(0018,9508)", - vr: "FL", - vm: "1", - name: "PrimaryPositionerScanArc", - }, - "(0018,9509)": { - tag: "(0018,9509)", - vr: "FL", - vm: "1", - name: "SecondaryPositionerScanArc", - }, - "(0018,9510)": { - tag: "(0018,9510)", - vr: "FL", - vm: "1", - name: "PrimaryPositionerScanStartAngle", - }, - "(0018,9511)": { - tag: "(0018,9511)", - vr: "FL", - vm: "1", - name: "SecondaryPositionerScanStartAngle", - }, - "(0018,9514)": { - tag: "(0018,9514)", - vr: "FL", - vm: "1", - name: "PrimaryPositionerIncrement", - }, - "(0018,9515)": { - tag: "(0018,9515)", - vr: "FL", - vm: "1", - name: "SecondaryPositionerIncrement", - }, - "(0018,9516)": { - tag: "(0018,9516)", - vr: "DT", - vm: "1", - name: "StartAcquisitionDateTime", - }, - "(0018,9517)": { - tag: "(0018,9517)", - vr: "DT", - vm: "1", - name: "EndAcquisitionDateTime", - }, - "(0018,9518)": { - tag: "(0018,9518)", - vr: "SS", - vm: "1", - name: "PrimaryPositionerIncrementSign", - }, - "(0018,9519)": { - tag: "(0018,9519)", - vr: "SS", - vm: "1", - name: "SecondaryPositionerIncrementSign", - }, - "(0018,9524)": { - tag: "(0018,9524)", - vr: "LO", - vm: "1", - name: "ApplicationName", - }, - "(0018,9525)": { - tag: "(0018,9525)", - vr: "LO", - vm: "1", - name: "ApplicationVersion", - }, - "(0018,9526)": { - tag: "(0018,9526)", - vr: "LO", - vm: "1", - name: "ApplicationManufacturer", - }, - "(0018,9527)": { - tag: "(0018,9527)", - vr: "CS", - vm: "1", - name: "AlgorithmType", - }, - "(0018,9528)": { - tag: "(0018,9528)", - vr: "LO", - vm: "1", - name: "AlgorithmDescription", - }, - "(0018,9530)": { - tag: "(0018,9530)", - vr: "SQ", - vm: "1", - name: "XRay3DReconstructionSequence", - }, - "(0018,9531)": { - tag: "(0018,9531)", - vr: "LO", - vm: "1", - name: "ReconstructionDescription", - }, - "(0018,9538)": { - tag: "(0018,9538)", - vr: "SQ", - vm: "1", - name: "PerProjectionAcquisitionSequence", - }, - "(0018,9541)": { - tag: "(0018,9541)", - vr: "SQ", - vm: "1", - name: "DetectorPositionSequence", - }, - "(0018,9542)": { - tag: "(0018,9542)", - vr: "SQ", - vm: "1", - name: "XRayAcquisitionDoseSequence", - }, - "(0018,9543)": { - tag: "(0018,9543)", - vr: "FD", - vm: "1", - name: "XRaySourceIsocenterPrimaryAngle", - }, - "(0018,9544)": { - tag: "(0018,9544)", - vr: "FD", - vm: "1", - name: "XRaySourceIsocenterSecondaryAngle", - }, - "(0018,9545)": { - tag: "(0018,9545)", - vr: "FD", - vm: "1", - name: "BreastSupportIsocenterPrimaryAngle", - }, - "(0018,9546)": { - tag: "(0018,9546)", - vr: "FD", - vm: "1", - name: "BreastSupportIsocenterSecondaryAngle", - }, - "(0018,9547)": { - tag: "(0018,9547)", - vr: "FD", - vm: "1", - name: "BreastSupportXPositionToIsocenter", - }, - "(0018,9548)": { - tag: "(0018,9548)", - vr: "FD", - vm: "1", - name: "BreastSupportYPositionToIsocenter", - }, - "(0018,9549)": { - tag: "(0018,9549)", - vr: "FD", - vm: "1", - name: "BreastSupportZPositionToIsocenter", - }, - "(0018,9550)": { - tag: "(0018,9550)", - vr: "FD", - vm: "1", - name: "DetectorIsocenterPrimaryAngle", - }, - "(0018,9551)": { - tag: "(0018,9551)", - vr: "FD", - vm: "1", - name: "DetectorIsocenterSecondaryAngle", - }, - "(0018,9552)": { - tag: "(0018,9552)", - vr: "FD", - vm: "1", - name: "DetectorXPositionToIsocenter", - }, - "(0018,9553)": { - tag: "(0018,9553)", - vr: "FD", - vm: "1", - name: "DetectorYPositionToIsocenter", - }, - "(0018,9554)": { - tag: "(0018,9554)", - vr: "FD", - vm: "1", - name: "DetectorZPositionToIsocenter", - }, - "(0018,9555)": { - tag: "(0018,9555)", - vr: "SQ", - vm: "1", - name: "XRayGridSequence", - }, - "(0018,9556)": { - tag: "(0018,9556)", - vr: "SQ", - vm: "1", - name: "XRayFilterSequence", - }, - "(0018,9557)": { - tag: "(0018,9557)", - vr: "FD", - vm: "3", - name: "DetectorActiveAreaTLHCPosition", - }, - "(0018,9558)": { - tag: "(0018,9558)", - vr: "FD", - vm: "6", - name: "DetectorActiveAreaOrientation", - }, - "(0018,9559)": { - tag: "(0018,9559)", - vr: "CS", - vm: "1", - name: "PositionerPrimaryAngleDirection", - }, - "(0018,9601)": { - tag: "(0018,9601)", - vr: "SQ", - vm: "1", - name: "DiffusionBMatrixSequence", - }, - "(0018,9602)": { - tag: "(0018,9602)", - vr: "FD", - vm: "1", - name: "DiffusionBValueXX", - }, - "(0018,9603)": { - tag: "(0018,9603)", - vr: "FD", - vm: "1", - name: "DiffusionBValueXY", - }, - "(0018,9604)": { - tag: "(0018,9604)", - vr: "FD", - vm: "1", - name: "DiffusionBValueXZ", - }, - "(0018,9605)": { - tag: "(0018,9605)", - vr: "FD", - vm: "1", - name: "DiffusionBValueYY", - }, - "(0018,9606)": { - tag: "(0018,9606)", - vr: "FD", - vm: "1", - name: "DiffusionBValueYZ", - }, - "(0018,9607)": { - tag: "(0018,9607)", - vr: "FD", - vm: "1", - name: "DiffusionBValueZZ", - }, - "(0018,9621)": { - tag: "(0018,9621)", - vr: "SQ", - vm: "1", - name: "FunctionalMRSequence", - }, - "(0018,9622)": { - tag: "(0018,9622)", - vr: "CS", - vm: "1", - name: "FunctionalSettlingPhaseFramesPresent", - }, - "(0018,9623)": { - tag: "(0018,9623)", - vr: "DT", - vm: "1", - name: "FunctionalSyncPulse", - }, - "(0018,9624)": { - tag: "(0018,9624)", - vr: "CS", - vm: "1", - name: "SettlingPhaseFrame", - }, - "(0018,9701)": { - tag: "(0018,9701)", - vr: "DT", - vm: "1", - name: "DecayCorrectionDateTime", - }, - "(0018,9715)": { - tag: "(0018,9715)", - vr: "FD", - vm: "1", - name: "StartDensityThreshold", - }, - "(0018,9716)": { - tag: "(0018,9716)", - vr: "FD", - vm: "1", - name: "StartRelativeDensityDifferenceThreshold", - }, - "(0018,9717)": { - tag: "(0018,9717)", - vr: "FD", - vm: "1", - name: "StartCardiacTriggerCountThreshold", - }, - "(0018,9718)": { - tag: "(0018,9718)", - vr: "FD", - vm: "1", - name: "StartRespiratoryTriggerCountThreshold", - }, - "(0018,9719)": { - tag: "(0018,9719)", - vr: "FD", - vm: "1", - name: "TerminationCountsThreshold", - }, - "(0018,9720)": { - tag: "(0018,9720)", - vr: "FD", - vm: "1", - name: "TerminationDensityThreshold", - }, - "(0018,9721)": { - tag: "(0018,9721)", - vr: "FD", - vm: "1", - name: "TerminationRelativeDensityThreshold", - }, - "(0018,9722)": { - tag: "(0018,9722)", - vr: "FD", - vm: "1", - name: "TerminationTimeThreshold", - }, - "(0018,9723)": { - tag: "(0018,9723)", - vr: "FD", - vm: "1", - name: "TerminationCardiacTriggerCountThreshold", - }, - "(0018,9724)": { - tag: "(0018,9724)", - vr: "FD", - vm: "1", - name: "TerminationRespiratoryTriggerCountThreshold", - }, - "(0018,9725)": { - tag: "(0018,9725)", - vr: "CS", - vm: "1", - name: "DetectorGeometry", - }, - "(0018,9726)": { - tag: "(0018,9726)", - vr: "FD", - vm: "1", - name: "TransverseDetectorSeparation", - }, - "(0018,9727)": { - tag: "(0018,9727)", - vr: "FD", - vm: "1", - name: "AxialDetectorDimension", - }, - "(0018,9729)": { - tag: "(0018,9729)", - vr: "US", - vm: "1", - name: "RadiopharmaceuticalAgentNumber", - }, - "(0018,9732)": { - tag: "(0018,9732)", - vr: "SQ", - vm: "1", - name: "PETFrameAcquisitionSequence", - }, - "(0018,9733)": { - tag: "(0018,9733)", - vr: "SQ", - vm: "1", - name: "PETDetectorMotionDetailsSequence", - }, - "(0018,9734)": { - tag: "(0018,9734)", - vr: "SQ", - vm: "1", - name: "PETTableDynamicsSequence", - }, - "(0018,9735)": { - tag: "(0018,9735)", - vr: "SQ", - vm: "1", - name: "PETPositionSequence", - }, - "(0018,9736)": { - tag: "(0018,9736)", - vr: "SQ", - vm: "1", - name: "PETFrameCorrectionFactorsSequence", - }, - "(0018,9737)": { - tag: "(0018,9737)", - vr: "SQ", - vm: "1", - name: "RadiopharmaceuticalUsageSequence", - }, - "(0018,9738)": { - tag: "(0018,9738)", - vr: "CS", - vm: "1", - name: "AttenuationCorrectionSource", - }, - "(0018,9739)": { - tag: "(0018,9739)", - vr: "US", - vm: "1", - name: "NumberOfIterations", - }, - "(0018,9740)": { - tag: "(0018,9740)", - vr: "US", - vm: "1", - name: "NumberOfSubsets", - }, - "(0018,9749)": { - tag: "(0018,9749)", - vr: "SQ", - vm: "1", - name: "PETReconstructionSequence", - }, - "(0018,9751)": { - tag: "(0018,9751)", - vr: "SQ", - vm: "1", - name: "PETFrameTypeSequence", - }, - "(0018,9755)": { - tag: "(0018,9755)", - vr: "CS", - vm: "1", - name: "TimeOfFlightInformationUsed", - }, - "(0018,9756)": { - tag: "(0018,9756)", - vr: "CS", - vm: "1", - name: "ReconstructionType", - }, - "(0018,9758)": { - tag: "(0018,9758)", - vr: "CS", - vm: "1", - name: "DecayCorrected", - }, - "(0018,9759)": { - tag: "(0018,9759)", - vr: "CS", - vm: "1", - name: "AttenuationCorrected", - }, - "(0018,9760)": { - tag: "(0018,9760)", - vr: "CS", - vm: "1", - name: "ScatterCorrected", - }, - "(0018,9761)": { - tag: "(0018,9761)", - vr: "CS", - vm: "1", - name: "DeadTimeCorrected", - }, - "(0018,9762)": { - tag: "(0018,9762)", - vr: "CS", - vm: "1", - name: "GantryMotionCorrected", - }, - "(0018,9763)": { - tag: "(0018,9763)", - vr: "CS", - vm: "1", - name: "PatientMotionCorrected", - }, - "(0018,9764)": { - tag: "(0018,9764)", - vr: "CS", - vm: "1", - name: "CountLossNormalizationCorrected", - }, - "(0018,9765)": { - tag: "(0018,9765)", - vr: "CS", - vm: "1", - name: "RandomsCorrected", - }, - "(0018,9766)": { - tag: "(0018,9766)", - vr: "CS", - vm: "1", - name: "NonUniformRadialSamplingCorrected", - }, - "(0018,9767)": { - tag: "(0018,9767)", - vr: "CS", - vm: "1", - name: "SensitivityCalibrated", - }, - "(0018,9768)": { - tag: "(0018,9768)", - vr: "CS", - vm: "1", - name: "DetectorNormalizationCorrection", - }, - "(0018,9769)": { - tag: "(0018,9769)", - vr: "CS", - vm: "1", - name: "IterativeReconstructionMethod", - }, - "(0018,9770)": { - tag: "(0018,9770)", - vr: "CS", - vm: "1", - name: "AttenuationCorrectionTemporalRelationship", - }, - "(0018,9771)": { - tag: "(0018,9771)", - vr: "SQ", - vm: "1", - name: "PatientPhysiologicalStateSequence", - }, - "(0018,9772)": { - tag: "(0018,9772)", - vr: "SQ", - vm: "1", - name: "PatientPhysiologicalStateCodeSequence", - }, - "(0018,9801)": { - tag: "(0018,9801)", - vr: "FD", - vm: "1-n", - name: "DepthsOfFocus", - }, - "(0018,9803)": { - tag: "(0018,9803)", - vr: "SQ", - vm: "1", - name: "ExcludedIntervalsSequence", - }, - "(0018,9804)": { - tag: "(0018,9804)", - vr: "DT", - vm: "1", - name: "ExclusionStartDateTime", - }, - "(0018,9805)": { - tag: "(0018,9805)", - vr: "FD", - vm: "1", - name: "ExclusionDuration", - }, - "(0018,9806)": { - tag: "(0018,9806)", - vr: "SQ", - vm: "1", - name: "USImageDescriptionSequence", - }, - "(0018,9807)": { - tag: "(0018,9807)", - vr: "SQ", - vm: "1", - name: "ImageDataTypeSequence", - }, - "(0018,9808)": { tag: "(0018,9808)", vr: "CS", vm: "1", name: "DataType" }, - "(0018,9809)": { - tag: "(0018,9809)", - vr: "SQ", - vm: "1", - name: "TransducerScanPatternCodeSequence", - }, - "(0018,980B)": { - tag: "(0018,980B)", - vr: "CS", - vm: "1", - name: "AliasedDataType", - }, - "(0018,980C)": { - tag: "(0018,980C)", - vr: "CS", - vm: "1", - name: "PositionMeasuringDeviceUsed", - }, - "(0018,980D)": { - tag: "(0018,980D)", - vr: "SQ", - vm: "1", - name: "TransducerGeometryCodeSequence", - }, - "(0018,980E)": { - tag: "(0018,980E)", - vr: "SQ", - vm: "1", - name: "TransducerBeamSteeringCodeSequence", - }, - "(0018,980F)": { - tag: "(0018,980F)", - vr: "SQ", - vm: "1", - name: "TransducerApplicationCodeSequence", - }, - "(0018,9810)": { - tag: "(0018,9810)", - vr: "US|SS", - vm: "1", - name: "ZeroVelocityPixelValue", - }, - "(0018,9900)": { - tag: "(0018,9900)", - vr: "LO", - vm: "1", - name: "ReferenceLocationLabel", - }, - "(0018,9901)": { - tag: "(0018,9901)", - vr: "UT", - vm: "1", - name: "ReferenceLocationDescription", - }, - "(0018,9902)": { - tag: "(0018,9902)", - vr: "SQ", - vm: "1", - name: "ReferenceBasisCodeSequence", - }, - "(0018,9903)": { - tag: "(0018,9903)", - vr: "SQ", - vm: "1", - name: "ReferenceGeometryCodeSequence", - }, - "(0018,9904)": { - tag: "(0018,9904)", - vr: "DS", - vm: "1", - name: "OffsetDistance", - }, - "(0018,9905)": { - tag: "(0018,9905)", - vr: "CS", - vm: "1", - name: "OffsetDirection", - }, - "(0018,9906)": { - tag: "(0018,9906)", - vr: "SQ", - vm: "1", - name: "PotentialScheduledProtocolCodeSequence", - }, - "(0018,9907)": { - tag: "(0018,9907)", - vr: "SQ", - vm: "1", - name: "PotentialRequestedProcedureCodeSequence", - }, - "(0018,9908)": { - tag: "(0018,9908)", - vr: "UC", - vm: "1-n", - name: "PotentialReasonsForProcedure", - }, - "(0018,9909)": { - tag: "(0018,9909)", - vr: "SQ", - vm: "1", - name: "PotentialReasonsForProcedureCodeSequence", - }, - "(0018,990A)": { - tag: "(0018,990A)", - vr: "UC", - vm: "1-n", - name: "PotentialDiagnosticTasks", - }, - "(0018,990B)": { - tag: "(0018,990B)", - vr: "SQ", - vm: "1", - name: "ContraindicationsCodeSequence", - }, - "(0018,990C)": { - tag: "(0018,990C)", - vr: "SQ", - vm: "1", - name: "ReferencedDefinedProtocolSequence", - }, - "(0018,990D)": { - tag: "(0018,990D)", - vr: "SQ", - vm: "1", - name: "ReferencedPerformedProtocolSequence", - }, - "(0018,990E)": { - tag: "(0018,990E)", - vr: "SQ", - vm: "1", - name: "PredecessorProtocolSequence", - }, - "(0018,990F)": { - tag: "(0018,990F)", - vr: "UT", - vm: "1", - name: "ProtocolPlanningInformation", - }, - "(0018,9910)": { - tag: "(0018,9910)", - vr: "UT", - vm: "1", - name: "ProtocolDesignRationale", - }, - "(0018,9911)": { - tag: "(0018,9911)", - vr: "SQ", - vm: "1", - name: "PatientSpecificationSequence", - }, - "(0018,9912)": { - tag: "(0018,9912)", - vr: "SQ", - vm: "1", - name: "ModelSpecificationSequence", - }, - "(0018,9913)": { - tag: "(0018,9913)", - vr: "SQ", - vm: "1", - name: "ParametersSpecificationSequence", - }, - "(0018,9914)": { - tag: "(0018,9914)", - vr: "SQ", - vm: "1", - name: "InstructionSequence", - }, - "(0018,9915)": { - tag: "(0018,9915)", - vr: "US", - vm: "1", - name: "InstructionIndex", - }, - "(0018,9916)": { - tag: "(0018,9916)", - vr: "LO", - vm: "1", - name: "InstructionText", - }, - "(0018,9917)": { - tag: "(0018,9917)", - vr: "UT", - vm: "1", - name: "InstructionDescription", - }, - "(0018,9918)": { - tag: "(0018,9918)", - vr: "CS", - vm: "1", - name: "InstructionPerformedFlag", - }, - "(0018,9919)": { - tag: "(0018,9919)", - vr: "DT", - vm: "1", - name: "InstructionPerformedDateTime", - }, - "(0018,991A)": { - tag: "(0018,991A)", - vr: "UT", - vm: "1", - name: "InstructionPerformanceComment", - }, - "(0018,991B)": { - tag: "(0018,991B)", - vr: "SQ", - vm: "1", - name: "PatientPositioningInstructionSequence", - }, - "(0018,991C)": { - tag: "(0018,991C)", - vr: "SQ", - vm: "1", - name: "PositioningMethodCodeSequence", - }, - "(0018,991D)": { - tag: "(0018,991D)", - vr: "SQ", - vm: "1", - name: "PositioningLandmarkSequence", - }, - "(0018,991E)": { - tag: "(0018,991E)", - vr: "UI", - vm: "1", - name: "TargetFrameOfReferenceUID", - }, - "(0018,991F)": { - tag: "(0018,991F)", - vr: "SQ", - vm: "1", - name: "AcquisitionProtocolElementSpecificationSequence", - }, - "(0018,9920)": { - tag: "(0018,9920)", - vr: "SQ", - vm: "1", - name: "AcquisitionProtocolElementSequence", - }, - "(0018,9921)": { - tag: "(0018,9921)", - vr: "US", - vm: "1", - name: "ProtocolElementNumber", - }, - "(0018,9922)": { - tag: "(0018,9922)", - vr: "LO", - vm: "1", - name: "ProtocolElementName", - }, - "(0018,9923)": { - tag: "(0018,9923)", - vr: "UT", - vm: "1", - name: "ProtocolElementCharacteristicsSummary", - }, - "(0018,9924)": { - tag: "(0018,9924)", - vr: "UT", - vm: "1", - name: "ProtocolElementPurpose", - }, - "(0018,9930)": { - tag: "(0018,9930)", - vr: "CS", - vm: "1", - name: "AcquisitionMotion", - }, - "(0018,9931)": { - tag: "(0018,9931)", - vr: "SQ", - vm: "1", - name: "AcquisitionStartLocationSequence", - }, - "(0018,9932)": { - tag: "(0018,9932)", - vr: "SQ", - vm: "1", - name: "AcquisitionEndLocationSequence", - }, - "(0018,9933)": { - tag: "(0018,9933)", - vr: "SQ", - vm: "1", - name: "ReconstructionProtocolElementSpecificationSequence", - }, - "(0018,9934)": { - tag: "(0018,9934)", - vr: "SQ", - vm: "1", - name: "ReconstructionProtocolElementSequence", - }, - "(0018,9935)": { - tag: "(0018,9935)", - vr: "SQ", - vm: "1", - name: "StorageProtocolElementSpecificationSequence", - }, - "(0018,9936)": { - tag: "(0018,9936)", - vr: "SQ", - vm: "1", - name: "StorageProtocolElementSequence", - }, - "(0018,9937)": { - tag: "(0018,9937)", - vr: "LO", - vm: "1", - name: "RequestedSeriesDescription", - }, - "(0018,9938)": { - tag: "(0018,9938)", - vr: "US", - vm: "1-n", - name: "SourceAcquisitionProtocolElementNumber", - }, - "(0018,9939)": { - tag: "(0018,9939)", - vr: "US", - vm: "1-n", - name: "SourceAcquisitionBeamNumber", - }, - "(0018,993A)": { - tag: "(0018,993A)", - vr: "US", - vm: "1-n", - name: "SourceReconstructionProtocolElementNumber", - }, - "(0018,993B)": { - tag: "(0018,993B)", - vr: "SQ", - vm: "1", - name: "ReconstructionStartLocationSequence", - }, - "(0018,993C)": { - tag: "(0018,993C)", - vr: "SQ", - vm: "1", - name: "ReconstructionEndLocationSequence", - }, - "(0018,993D)": { - tag: "(0018,993D)", - vr: "SQ", - vm: "1", - name: "ReconstructionAlgorithmSequence", - }, - "(0018,993E)": { - tag: "(0018,993E)", - vr: "SQ", - vm: "1", - name: "ReconstructionTargetCenterLocationSequence", - }, - "(0018,9941)": { - tag: "(0018,9941)", - vr: "UT", - vm: "1", - name: "ImageFilterDescription", - }, - "(0018,9942)": { - tag: "(0018,9942)", - vr: "FD", - vm: "1", - name: "CTDIvolNotificationTrigger", - }, - "(0018,9943)": { - tag: "(0018,9943)", - vr: "FD", - vm: "1", - name: "DLPNotificationTrigger", - }, - "(0018,9944)": { - tag: "(0018,9944)", - vr: "CS", - vm: "1", - name: "AutoKVPSelectionType", - }, - "(0018,9945)": { - tag: "(0018,9945)", - vr: "FD", - vm: "1", - name: "AutoKVPUpperBound", - }, - "(0018,9946)": { - tag: "(0018,9946)", - vr: "FD", - vm: "1", - name: "AutoKVPLowerBound", - }, - "(0018,9947)": { - tag: "(0018,9947)", - vr: "CS", - vm: "1", - name: "ProtocolDefinedPatientPosition", - }, - "(0018,A001)": { - tag: "(0018,A001)", - vr: "SQ", - vm: "1", - name: "ContributingEquipmentSequence", - }, - "(0018,A002)": { - tag: "(0018,A002)", - vr: "DT", - vm: "1", - name: "ContributionDateTime", - }, - "(0018,A003)": { - tag: "(0018,A003)", - vr: "ST", - vm: "1", - name: "ContributionDescription", - }, - "(0020,000D)": { - tag: "(0020,000D)", - vr: "UI", - vm: "1", - name: "StudyInstanceUID", - }, - "(0020,000E)": { - tag: "(0020,000E)", - vr: "UI", - vm: "1", - name: "SeriesInstanceUID", - }, - "(0020,0010)": { tag: "(0020,0010)", vr: "SH", vm: "1", name: "StudyID" }, - "(0020,0011)": { - tag: "(0020,0011)", - vr: "IS", - vm: "1", - name: "SeriesNumber", - }, - "(0020,0012)": { - tag: "(0020,0012)", - vr: "IS", - vm: "1", - name: "AcquisitionNumber", - }, - "(0020,0013)": { - tag: "(0020,0013)", - vr: "IS", - vm: "1", - name: "InstanceNumber", - }, - "(0020,0014)": { - tag: "(0020,0014)", - vr: "IS", - vm: "1", - name: "IsotopeNumber", - }, - "(0020,0015)": { tag: "(0020,0015)", vr: "IS", vm: "1", name: "PhaseNumber" }, - "(0020,0016)": { - tag: "(0020,0016)", - vr: "IS", - vm: "1", - name: "IntervalNumber", - }, - "(0020,0017)": { - tag: "(0020,0017)", - vr: "IS", - vm: "1", - name: "TimeSlotNumber", - }, - "(0020,0018)": { tag: "(0020,0018)", vr: "IS", vm: "1", name: "AngleNumber" }, - "(0020,0019)": { tag: "(0020,0019)", vr: "IS", vm: "1", name: "ItemNumber" }, - "(0020,0020)": { - tag: "(0020,0020)", - vr: "CS", - vm: "2", - name: "PatientOrientation", - }, - "(0020,0022)": { - tag: "(0020,0022)", - vr: "IS", - vm: "1", - name: "OverlayNumber", - }, - "(0020,0024)": { tag: "(0020,0024)", vr: "IS", vm: "1", name: "CurveNumber" }, - "(0020,0026)": { tag: "(0020,0026)", vr: "IS", vm: "1", name: "LUTNumber" }, - "(0020,0030)": { - tag: "(0020,0030)", - vr: "DS", - vm: "3", - name: "ImagePosition", - }, - "(0020,0032)": { - tag: "(0020,0032)", - vr: "DS", - vm: "3", - name: "ImagePositionPatient", - }, - "(0020,0035)": { - tag: "(0020,0035)", - vr: "DS", - vm: "6", - name: "ImageOrientation", - }, - "(0020,0037)": { - tag: "(0020,0037)", - vr: "DS", - vm: "6", - name: "ImageOrientationPatient", - }, - "(0020,0050)": { tag: "(0020,0050)", vr: "DS", vm: "1", name: "Location" }, - "(0020,0052)": { - tag: "(0020,0052)", - vr: "UI", - vm: "1", - name: "FrameOfReferenceUID", - }, - "(0020,0060)": { tag: "(0020,0060)", vr: "CS", vm: "1", name: "Laterality" }, - "(0020,0062)": { - tag: "(0020,0062)", - vr: "CS", - vm: "1", - name: "ImageLaterality", - }, - "(0020,0070)": { - tag: "(0020,0070)", - vr: "LO", - vm: "1", - name: "ImageGeometryType", - }, - "(0020,0080)": { - tag: "(0020,0080)", - vr: "CS", - vm: "1-n", - name: "MaskingImage", - }, - "(0020,00AA)": { - tag: "(0020,00AA)", - vr: "IS", - vm: "1", - name: "ReportNumber", - }, - "(0020,0100)": { - tag: "(0020,0100)", - vr: "IS", - vm: "1", - name: "TemporalPositionIdentifier", - }, - "(0020,0105)": { - tag: "(0020,0105)", - vr: "IS", - vm: "1", - name: "NumberOfTemporalPositions", - }, - "(0020,0110)": { - tag: "(0020,0110)", - vr: "DS", - vm: "1", - name: "TemporalResolution", - }, - "(0020,0200)": { - tag: "(0020,0200)", - vr: "UI", - vm: "1", - name: "SynchronizationFrameOfReferenceUID", - }, - "(0020,0242)": { - tag: "(0020,0242)", - vr: "UI", - vm: "1", - name: "SOPInstanceUIDOfConcatenationSource", - }, - "(0020,1000)": { - tag: "(0020,1000)", - vr: "IS", - vm: "1", - name: "SeriesInStudy", - }, - "(0020,1001)": { - tag: "(0020,1001)", - vr: "IS", - vm: "1", - name: "AcquisitionsInSeries", - }, - "(0020,1002)": { - tag: "(0020,1002)", - vr: "IS", - vm: "1", - name: "ImagesInAcquisition", - }, - "(0020,1003)": { - tag: "(0020,1003)", - vr: "IS", - vm: "1", - name: "ImagesInSeries", - }, - "(0020,1004)": { - tag: "(0020,1004)", - vr: "IS", - vm: "1", - name: "AcquisitionsInStudy", - }, - "(0020,1005)": { - tag: "(0020,1005)", - vr: "IS", - vm: "1", - name: "ImagesInStudy", - }, - "(0020,1020)": { tag: "(0020,1020)", vr: "LO", vm: "1-n", name: "Reference" }, - "(0020,103F)": { - tag: "(0020,103F)", - vr: "LO", - vm: "1", - name: "TargetPositionReferenceIndicator", - }, - "(0020,1040)": { - tag: "(0020,1040)", - vr: "LO", - vm: "1", - name: "PositionReferenceIndicator", - }, - "(0020,1041)": { - tag: "(0020,1041)", - vr: "DS", - vm: "1", - name: "SliceLocation", - }, - "(0020,1070)": { - tag: "(0020,1070)", - vr: "IS", - vm: "1-n", - name: "OtherStudyNumbers", - }, - "(0020,1200)": { - tag: "(0020,1200)", - vr: "IS", - vm: "1", - name: "NumberOfPatientRelatedStudies", - }, - "(0020,1202)": { - tag: "(0020,1202)", - vr: "IS", - vm: "1", - name: "NumberOfPatientRelatedSeries", - }, - "(0020,1204)": { - tag: "(0020,1204)", - vr: "IS", - vm: "1", - name: "NumberOfPatientRelatedInstances", - }, - "(0020,1206)": { - tag: "(0020,1206)", - vr: "IS", - vm: "1", - name: "NumberOfStudyRelatedSeries", - }, - "(0020,1208)": { - tag: "(0020,1208)", - vr: "IS", - vm: "1", - name: "NumberOfStudyRelatedInstances", - }, - "(0020,1209)": { - tag: "(0020,1209)", - vr: "IS", - vm: "1", - name: "NumberOfSeriesRelatedInstances", - }, - "(0020,31xx)": { - tag: "(0020,31xx)", - vr: "CS", - vm: "1-n", - name: "SourceImageIDs", - }, - "(0020,3401)": { - tag: "(0020,3401)", - vr: "CS", - vm: "1", - name: "ModifyingDeviceID", - }, - "(0020,3402)": { - tag: "(0020,3402)", - vr: "CS", - vm: "1", - name: "ModifiedImageID", - }, - "(0020,3403)": { - tag: "(0020,3403)", - vr: "DA", - vm: "1", - name: "ModifiedImageDate", - }, - "(0020,3404)": { - tag: "(0020,3404)", - vr: "LO", - vm: "1", - name: "ModifyingDeviceManufacturer", - }, - "(0020,3405)": { - tag: "(0020,3405)", - vr: "TM", - vm: "1", - name: "ModifiedImageTime", - }, - "(0020,3406)": { - tag: "(0020,3406)", - vr: "LO", - vm: "1", - name: "ModifiedImageDescription", - }, - "(0020,4000)": { - tag: "(0020,4000)", - vr: "LT", - vm: "1", - name: "ImageComments", - }, - "(0020,5000)": { - tag: "(0020,5000)", - vr: "AT", - vm: "1-n", - name: "OriginalImageIdentification", - }, - "(0020,5002)": { - tag: "(0020,5002)", - vr: "LO", - vm: "1-n", - name: "OriginalImageIdentificationNomenclature", - }, - "(0020,9056)": { tag: "(0020,9056)", vr: "SH", vm: "1", name: "StackID" }, - "(0020,9057)": { - tag: "(0020,9057)", - vr: "UL", - vm: "1", - name: "InStackPositionNumber", - }, - "(0020,9071)": { - tag: "(0020,9071)", - vr: "SQ", - vm: "1", - name: "FrameAnatomySequence", - }, - "(0020,9072)": { - tag: "(0020,9072)", - vr: "CS", - vm: "1", - name: "FrameLaterality", - }, - "(0020,9111)": { - tag: "(0020,9111)", - vr: "SQ", - vm: "1", - name: "FrameContentSequence", - }, - "(0020,9113)": { - tag: "(0020,9113)", - vr: "SQ", - vm: "1", - name: "PlanePositionSequence", - }, - "(0020,9116)": { - tag: "(0020,9116)", - vr: "SQ", - vm: "1", - name: "PlaneOrientationSequence", - }, - "(0020,9128)": { - tag: "(0020,9128)", - vr: "UL", - vm: "1", - name: "TemporalPositionIndex", - }, - "(0020,9153)": { - tag: "(0020,9153)", - vr: "FD", - vm: "1", - name: "NominalCardiacTriggerDelayTime", - }, - "(0020,9154)": { - tag: "(0020,9154)", - vr: "FL", - vm: "1", - name: "NominalCardiacTriggerTimePriorToRPeak", - }, - "(0020,9155)": { - tag: "(0020,9155)", - vr: "FL", - vm: "1", - name: "ActualCardiacTriggerTimePriorToRPeak", - }, - "(0020,9156)": { - tag: "(0020,9156)", - vr: "US", - vm: "1", - name: "FrameAcquisitionNumber", - }, - "(0020,9157)": { - tag: "(0020,9157)", - vr: "UL", - vm: "1-n", - name: "DimensionIndexValues", - }, - "(0020,9158)": { - tag: "(0020,9158)", - vr: "LT", - vm: "1", - name: "FrameComments", - }, - "(0020,9161)": { - tag: "(0020,9161)", - vr: "UI", - vm: "1", - name: "ConcatenationUID", - }, - "(0020,9162)": { - tag: "(0020,9162)", - vr: "US", - vm: "1", - name: "InConcatenationNumber", - }, - "(0020,9163)": { - tag: "(0020,9163)", - vr: "US", - vm: "1", - name: "InConcatenationTotalNumber", - }, - "(0020,9164)": { - tag: "(0020,9164)", - vr: "UI", - vm: "1", - name: "DimensionOrganizationUID", - }, - "(0020,9165)": { - tag: "(0020,9165)", - vr: "AT", - vm: "1", - name: "DimensionIndexPointer", - }, - "(0020,9167)": { - tag: "(0020,9167)", - vr: "AT", - vm: "1", - name: "FunctionalGroupPointer", - }, - "(0020,9170)": { - tag: "(0020,9170)", - vr: "SQ", - vm: "1", - name: "UnassignedSharedConvertedAttributesSequence", - }, - "(0020,9171)": { - tag: "(0020,9171)", - vr: "SQ", - vm: "1", - name: "UnassignedPerFrameConvertedAttributesSequence", - }, - "(0020,9172)": { - tag: "(0020,9172)", - vr: "SQ", - vm: "1", - name: "ConversionSourceAttributesSequence", - }, - "(0020,9213)": { - tag: "(0020,9213)", - vr: "LO", - vm: "1", - name: "DimensionIndexPrivateCreator", - }, - "(0020,9221)": { - tag: "(0020,9221)", - vr: "SQ", - vm: "1", - name: "DimensionOrganizationSequence", - }, - "(0020,9222)": { - tag: "(0020,9222)", - vr: "SQ", - vm: "1", - name: "DimensionIndexSequence", - }, - "(0020,9228)": { - tag: "(0020,9228)", - vr: "UL", - vm: "1", - name: "ConcatenationFrameOffsetNumber", - }, - "(0020,9238)": { - tag: "(0020,9238)", - vr: "LO", - vm: "1", - name: "FunctionalGroupPrivateCreator", - }, - "(0020,9241)": { - tag: "(0020,9241)", - vr: "FL", - vm: "1", - name: "NominalPercentageOfCardiacPhase", - }, - "(0020,9245)": { - tag: "(0020,9245)", - vr: "FL", - vm: "1", - name: "NominalPercentageOfRespiratoryPhase", - }, - "(0020,9246)": { - tag: "(0020,9246)", - vr: "FL", - vm: "1", - name: "StartingRespiratoryAmplitude", - }, - "(0020,9247)": { - tag: "(0020,9247)", - vr: "CS", - vm: "1", - name: "StartingRespiratoryPhase", - }, - "(0020,9248)": { - tag: "(0020,9248)", - vr: "FL", - vm: "1", - name: "EndingRespiratoryAmplitude", - }, - "(0020,9249)": { - tag: "(0020,9249)", - vr: "CS", - vm: "1", - name: "EndingRespiratoryPhase", - }, - "(0020,9250)": { - tag: "(0020,9250)", - vr: "CS", - vm: "1", - name: "RespiratoryTriggerType", - }, - "(0020,9251)": { - tag: "(0020,9251)", - vr: "FD", - vm: "1", - name: "RRIntervalTimeNominal", - }, - "(0020,9252)": { - tag: "(0020,9252)", - vr: "FD", - vm: "1", - name: "ActualCardiacTriggerDelayTime", - }, - "(0020,9253)": { - tag: "(0020,9253)", - vr: "SQ", - vm: "1", - name: "RespiratorySynchronizationSequence", - }, - "(0020,9254)": { - tag: "(0020,9254)", - vr: "FD", - vm: "1", - name: "RespiratoryIntervalTime", - }, - "(0020,9255)": { - tag: "(0020,9255)", - vr: "FD", - vm: "1", - name: "NominalRespiratoryTriggerDelayTime", - }, - "(0020,9256)": { - tag: "(0020,9256)", - vr: "FD", - vm: "1", - name: "RespiratoryTriggerDelayThreshold", - }, - "(0020,9257)": { - tag: "(0020,9257)", - vr: "FD", - vm: "1", - name: "ActualRespiratoryTriggerDelayTime", - }, - "(0020,9301)": { - tag: "(0020,9301)", - vr: "FD", - vm: "3", - name: "ImagePositionVolume", - }, - "(0020,9302)": { - tag: "(0020,9302)", - vr: "FD", - vm: "6", - name: "ImageOrientationVolume", - }, - "(0020,9307)": { - tag: "(0020,9307)", - vr: "CS", - vm: "1", - name: "UltrasoundAcquisitionGeometry", - }, - "(0020,9308)": { - tag: "(0020,9308)", - vr: "FD", - vm: "3", - name: "ApexPosition", - }, - "(0020,9309)": { - tag: "(0020,9309)", - vr: "FD", - vm: "16", - name: "VolumeToTransducerMappingMatrix", - }, - "(0020,930A)": { - tag: "(0020,930A)", - vr: "FD", - vm: "16", - name: "VolumeToTableMappingMatrix", - }, - "(0020,930B)": { - tag: "(0020,930B)", - vr: "CS", - vm: "1", - name: "VolumeToTransducerRelationship", - }, - "(0020,930C)": { - tag: "(0020,930C)", - vr: "CS", - vm: "1", - name: "PatientFrameOfReferenceSource", - }, - "(0020,930D)": { - tag: "(0020,930D)", - vr: "FD", - vm: "1", - name: "TemporalPositionTimeOffset", - }, - "(0020,930E)": { - tag: "(0020,930E)", - vr: "SQ", - vm: "1", - name: "PlanePositionVolumeSequence", - }, - "(0020,930F)": { - tag: "(0020,930F)", - vr: "SQ", - vm: "1", - name: "PlaneOrientationVolumeSequence", - }, - "(0020,9310)": { - tag: "(0020,9310)", - vr: "SQ", - vm: "1", - name: "TemporalPositionSequence", - }, - "(0020,9311)": { - tag: "(0020,9311)", - vr: "CS", - vm: "1", - name: "DimensionOrganizationType", - }, - "(0020,9312)": { - tag: "(0020,9312)", - vr: "UI", - vm: "1", - name: "VolumeFrameOfReferenceUID", - }, - "(0020,9313)": { - tag: "(0020,9313)", - vr: "UI", - vm: "1", - name: "TableFrameOfReferenceUID", - }, - "(0020,9421)": { - tag: "(0020,9421)", - vr: "LO", - vm: "1", - name: "DimensionDescriptionLabel", - }, - "(0020,9450)": { - tag: "(0020,9450)", - vr: "SQ", - vm: "1", - name: "PatientOrientationInFrameSequence", - }, - "(0020,9453)": { tag: "(0020,9453)", vr: "LO", vm: "1", name: "FrameLabel" }, - "(0020,9518)": { - tag: "(0020,9518)", - vr: "US", - vm: "1-n", - name: "AcquisitionIndex", - }, - "(0020,9529)": { - tag: "(0020,9529)", - vr: "SQ", - vm: "1", - name: "ContributingSOPInstancesReferenceSequence", - }, - "(0020,9536)": { - tag: "(0020,9536)", - vr: "US", - vm: "1", - name: "ReconstructionIndex", - }, - "(0022,0001)": { - tag: "(0022,0001)", - vr: "US", - vm: "1", - name: "LightPathFilterPassThroughWavelength", - }, - "(0022,0002)": { - tag: "(0022,0002)", - vr: "US", - vm: "2", - name: "LightPathFilterPassBand", - }, - "(0022,0003)": { - tag: "(0022,0003)", - vr: "US", - vm: "1", - name: "ImagePathFilterPassThroughWavelength", - }, - "(0022,0004)": { - tag: "(0022,0004)", - vr: "US", - vm: "2", - name: "ImagePathFilterPassBand", - }, - "(0022,0005)": { - tag: "(0022,0005)", - vr: "CS", - vm: "1", - name: "PatientEyeMovementCommanded", - }, - "(0022,0006)": { - tag: "(0022,0006)", - vr: "SQ", - vm: "1", - name: "PatientEyeMovementCommandCodeSequence", - }, - "(0022,0007)": { - tag: "(0022,0007)", - vr: "FL", - vm: "1", - name: "SphericalLensPower", - }, - "(0022,0008)": { - tag: "(0022,0008)", - vr: "FL", - vm: "1", - name: "CylinderLensPower", - }, - "(0022,0009)": { - tag: "(0022,0009)", - vr: "FL", - vm: "1", - name: "CylinderAxis", - }, - "(0022,000A)": { - tag: "(0022,000A)", - vr: "FL", - vm: "1", - name: "EmmetropicMagnification", - }, - "(0022,000B)": { - tag: "(0022,000B)", - vr: "FL", - vm: "1", - name: "IntraOcularPressure", - }, - "(0022,000C)": { - tag: "(0022,000C)", - vr: "FL", - vm: "1", - name: "HorizontalFieldOfView", - }, - "(0022,000D)": { - tag: "(0022,000D)", - vr: "CS", - vm: "1", - name: "PupilDilated", - }, - "(0022,000E)": { - tag: "(0022,000E)", - vr: "FL", - vm: "1", - name: "DegreeOfDilation", - }, - "(0022,0010)": { - tag: "(0022,0010)", - vr: "FL", - vm: "1", - name: "StereoBaselineAngle", - }, - "(0022,0011)": { - tag: "(0022,0011)", - vr: "FL", - vm: "1", - name: "StereoBaselineDisplacement", - }, - "(0022,0012)": { - tag: "(0022,0012)", - vr: "FL", - vm: "1", - name: "StereoHorizontalPixelOffset", - }, - "(0022,0013)": { - tag: "(0022,0013)", - vr: "FL", - vm: "1", - name: "StereoVerticalPixelOffset", - }, - "(0022,0014)": { - tag: "(0022,0014)", - vr: "FL", - vm: "1", - name: "StereoRotation", - }, - "(0022,0015)": { - tag: "(0022,0015)", - vr: "SQ", - vm: "1", - name: "AcquisitionDeviceTypeCodeSequence", - }, - "(0022,0016)": { - tag: "(0022,0016)", - vr: "SQ", - vm: "1", - name: "IlluminationTypeCodeSequence", - }, - "(0022,0017)": { - tag: "(0022,0017)", - vr: "SQ", - vm: "1", - name: "LightPathFilterTypeStackCodeSequence", - }, - "(0022,0018)": { - tag: "(0022,0018)", - vr: "SQ", - vm: "1", - name: "ImagePathFilterTypeStackCodeSequence", - }, - "(0022,0019)": { - tag: "(0022,0019)", - vr: "SQ", - vm: "1", - name: "LensesCodeSequence", - }, - "(0022,001A)": { - tag: "(0022,001A)", - vr: "SQ", - vm: "1", - name: "ChannelDescriptionCodeSequence", - }, - "(0022,001B)": { - tag: "(0022,001B)", - vr: "SQ", - vm: "1", - name: "RefractiveStateSequence", - }, - "(0022,001C)": { - tag: "(0022,001C)", - vr: "SQ", - vm: "1", - name: "MydriaticAgentCodeSequence", - }, - "(0022,001D)": { - tag: "(0022,001D)", - vr: "SQ", - vm: "1", - name: "RelativeImagePositionCodeSequence", - }, - "(0022,001E)": { - tag: "(0022,001E)", - vr: "FL", - vm: "1", - name: "CameraAngleOfView", - }, - "(0022,0020)": { - tag: "(0022,0020)", - vr: "SQ", - vm: "1", - name: "StereoPairsSequence", - }, - "(0022,0021)": { - tag: "(0022,0021)", - vr: "SQ", - vm: "1", - name: "LeftImageSequence", - }, - "(0022,0022)": { - tag: "(0022,0022)", - vr: "SQ", - vm: "1", - name: "RightImageSequence", - }, - "(0022,0028)": { - tag: "(0022,0028)", - vr: "CS", - vm: "1", - name: "StereoPairsPresent", - }, - "(0022,0030)": { - tag: "(0022,0030)", - vr: "FL", - vm: "1", - name: "AxialLengthOfTheEye", - }, - "(0022,0031)": { - tag: "(0022,0031)", - vr: "SQ", - vm: "1", - name: "OphthalmicFrameLocationSequence", - }, - "(0022,0032)": { - tag: "(0022,0032)", - vr: "FL", - vm: "2-2n", - name: "ReferenceCoordinates", - }, - "(0022,0035)": { - tag: "(0022,0035)", - vr: "FL", - vm: "1", - name: "DepthSpatialResolution", - }, - "(0022,0036)": { - tag: "(0022,0036)", - vr: "FL", - vm: "1", - name: "MaximumDepthDistortion", - }, - "(0022,0037)": { - tag: "(0022,0037)", - vr: "FL", - vm: "1", - name: "AlongScanSpatialResolution", - }, - "(0022,0038)": { - tag: "(0022,0038)", - vr: "FL", - vm: "1", - name: "MaximumAlongScanDistortion", - }, - "(0022,0039)": { - tag: "(0022,0039)", - vr: "CS", - vm: "1", - name: "OphthalmicImageOrientation", - }, - "(0022,0041)": { - tag: "(0022,0041)", - vr: "FL", - vm: "1", - name: "DepthOfTransverseImage", - }, - "(0022,0042)": { - tag: "(0022,0042)", - vr: "SQ", - vm: "1", - name: "MydriaticAgentConcentrationUnitsSequence", - }, - "(0022,0048)": { - tag: "(0022,0048)", - vr: "FL", - vm: "1", - name: "AcrossScanSpatialResolution", - }, - "(0022,0049)": { - tag: "(0022,0049)", - vr: "FL", - vm: "1", - name: "MaximumAcrossScanDistortion", - }, - "(0022,004E)": { - tag: "(0022,004E)", - vr: "DS", - vm: "1", - name: "MydriaticAgentConcentration", - }, - "(0022,0055)": { - tag: "(0022,0055)", - vr: "FL", - vm: "1", - name: "IlluminationWaveLength", - }, - "(0022,0056)": { - tag: "(0022,0056)", - vr: "FL", - vm: "1", - name: "IlluminationPower", - }, - "(0022,0057)": { - tag: "(0022,0057)", - vr: "FL", - vm: "1", - name: "IlluminationBandwidth", - }, - "(0022,0058)": { - tag: "(0022,0058)", - vr: "SQ", - vm: "1", - name: "MydriaticAgentSequence", - }, - "(0022,1007)": { - tag: "(0022,1007)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialMeasurementsRightEyeSequence", - }, - "(0022,1008)": { - tag: "(0022,1008)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialMeasurementsLeftEyeSequence", - }, - "(0022,1009)": { - tag: "(0022,1009)", - vr: "CS", - vm: "1", - name: "OphthalmicAxialMeasurementsDeviceType", - }, - "(0022,1010)": { - tag: "(0022,1010)", - vr: "CS", - vm: "1", - name: "OphthalmicAxialLengthMeasurementsType", - }, - "(0022,1012)": { - tag: "(0022,1012)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialLengthSequence", - }, - "(0022,1019)": { - tag: "(0022,1019)", - vr: "FL", - vm: "1", - name: "OphthalmicAxialLength", - }, - "(0022,1024)": { - tag: "(0022,1024)", - vr: "SQ", - vm: "1", - name: "LensStatusCodeSequence", - }, - "(0022,1025)": { - tag: "(0022,1025)", - vr: "SQ", - vm: "1", - name: "VitreousStatusCodeSequence", - }, - "(0022,1028)": { - tag: "(0022,1028)", - vr: "SQ", - vm: "1", - name: "IOLFormulaCodeSequence", - }, - "(0022,1029)": { - tag: "(0022,1029)", - vr: "LO", - vm: "1", - name: "IOLFormulaDetail", - }, - "(0022,1033)": { - tag: "(0022,1033)", - vr: "FL", - vm: "1", - name: "KeratometerIndex", - }, - "(0022,1035)": { - tag: "(0022,1035)", - vr: "SQ", - vm: "1", - name: "SourceOfOphthalmicAxialLengthCodeSequence", - }, - "(0022,1036)": { - tag: "(0022,1036)", - vr: "SQ", - vm: "1", - name: "SourceOfCornealSizeDataCodeSequence", - }, - "(0022,1037)": { - tag: "(0022,1037)", - vr: "FL", - vm: "1", - name: "TargetRefraction", - }, - "(0022,1039)": { - tag: "(0022,1039)", - vr: "CS", - vm: "1", - name: "RefractiveProcedureOccurred", - }, - "(0022,1040)": { - tag: "(0022,1040)", - vr: "SQ", - vm: "1", - name: "RefractiveSurgeryTypeCodeSequence", - }, - "(0022,1044)": { - tag: "(0022,1044)", - vr: "SQ", - vm: "1", - name: "OphthalmicUltrasoundMethodCodeSequence", - }, - "(0022,1045)": { - tag: "(0022,1045)", - vr: "SQ", - vm: "1", - name: "SurgicallyInducedAstigmatismSequence", - }, - "(0022,1046)": { - tag: "(0022,1046)", - vr: "CS", - vm: "1", - name: "TypeOfOpticalCorrection", - }, - "(0022,1047)": { - tag: "(0022,1047)", - vr: "SQ", - vm: "1", - name: "ToricIOLPowerSequence", - }, - "(0022,1048)": { - tag: "(0022,1048)", - vr: "SQ", - vm: "1", - name: "PredictedToricErrorSequence", - }, - "(0022,1049)": { - tag: "(0022,1049)", - vr: "CS", - vm: "1", - name: "PreSelectedForImplantation", - }, - "(0022,104A)": { - tag: "(0022,104A)", - vr: "SQ", - vm: "1", - name: "ToricIOLPowerForExactEmmetropiaSequence", - }, - "(0022,104B)": { - tag: "(0022,104B)", - vr: "SQ", - vm: "1", - name: "ToricIOLPowerForExactTargetRefractionSequence", - }, - "(0022,1050)": { - tag: "(0022,1050)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialLengthMeasurementsSequence", - }, - "(0022,1053)": { tag: "(0022,1053)", vr: "FL", vm: "1", name: "IOLPower" }, - "(0022,1054)": { - tag: "(0022,1054)", - vr: "FL", - vm: "1", - name: "PredictedRefractiveError", - }, - "(0022,1059)": { - tag: "(0022,1059)", - vr: "FL", - vm: "1", - name: "OphthalmicAxialLengthVelocity", - }, - "(0022,1065)": { - tag: "(0022,1065)", - vr: "LO", - vm: "1", - name: "LensStatusDescription", - }, - "(0022,1066)": { - tag: "(0022,1066)", - vr: "LO", - vm: "1", - name: "VitreousStatusDescription", - }, - "(0022,1090)": { - tag: "(0022,1090)", - vr: "SQ", - vm: "1", - name: "IOLPowerSequence", - }, - "(0022,1092)": { - tag: "(0022,1092)", - vr: "SQ", - vm: "1", - name: "LensConstantSequence", - }, - "(0022,1093)": { - tag: "(0022,1093)", - vr: "LO", - vm: "1", - name: "IOLManufacturer", - }, - "(0022,1094)": { - tag: "(0022,1094)", - vr: "LO", - vm: "1", - name: "LensConstantDescription", - }, - "(0022,1095)": { tag: "(0022,1095)", vr: "LO", vm: "1", name: "ImplantName" }, - "(0022,1096)": { - tag: "(0022,1096)", - vr: "SQ", - vm: "1", - name: "KeratometryMeasurementTypeCodeSequence", - }, - "(0022,1097)": { - tag: "(0022,1097)", - vr: "LO", - vm: "1", - name: "ImplantPartNumber", - }, - "(0022,1100)": { - tag: "(0022,1100)", - vr: "SQ", - vm: "1", - name: "ReferencedOphthalmicAxialMeasurementsSequence", - }, - "(0022,1101)": { - tag: "(0022,1101)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence", - }, - "(0022,1103)": { - tag: "(0022,1103)", - vr: "SQ", - vm: "1", - name: "RefractiveErrorBeforeRefractiveSurgeryCodeSequence", - }, - "(0022,1121)": { - tag: "(0022,1121)", - vr: "FL", - vm: "1", - name: "IOLPowerForExactEmmetropia", - }, - "(0022,1122)": { - tag: "(0022,1122)", - vr: "FL", - vm: "1", - name: "IOLPowerForExactTargetRefraction", - }, - "(0022,1125)": { - tag: "(0022,1125)", - vr: "SQ", - vm: "1", - name: "AnteriorChamberDepthDefinitionCodeSequence", - }, - "(0022,1127)": { - tag: "(0022,1127)", - vr: "SQ", - vm: "1", - name: "LensThicknessSequence", - }, - "(0022,1128)": { - tag: "(0022,1128)", - vr: "SQ", - vm: "1", - name: "AnteriorChamberDepthSequence", - }, - "(0022,112A)": { - tag: "(0022,112A)", - vr: "SQ", - vm: "1", - name: "CalculationCommentSequence", - }, - "(0022,112B)": { - tag: "(0022,112B)", - vr: "CS", - vm: "1", - name: "CalculationCommentType", - }, - "(0022,112C)": { - tag: "(0022,112C)", - vr: "LT", - vm: "1", - name: "CalculationComment", - }, - "(0022,1130)": { - tag: "(0022,1130)", - vr: "FL", - vm: "1", - name: "LensThickness", - }, - "(0022,1131)": { - tag: "(0022,1131)", - vr: "FL", - vm: "1", - name: "AnteriorChamberDepth", - }, - "(0022,1132)": { - tag: "(0022,1132)", - vr: "SQ", - vm: "1", - name: "SourceOfLensThicknessDataCodeSequence", - }, - "(0022,1133)": { - tag: "(0022,1133)", - vr: "SQ", - vm: "1", - name: "SourceOfAnteriorChamberDepthDataCodeSequence", - }, - "(0022,1134)": { - tag: "(0022,1134)", - vr: "SQ", - vm: "1", - name: "SourceOfRefractiveMeasurementsSequence", - }, - "(0022,1135)": { - tag: "(0022,1135)", - vr: "SQ", - vm: "1", - name: "SourceOfRefractiveMeasurementsCodeSequence", - }, - "(0022,1140)": { - tag: "(0022,1140)", - vr: "CS", - vm: "1", - name: "OphthalmicAxialLengthMeasurementModified", - }, - "(0022,1150)": { - tag: "(0022,1150)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialLengthDataSourceCodeSequence", - }, - "(0022,1153)": { - tag: "(0022,1153)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialLengthAcquisitionMethodCodeSequence", - }, - "(0022,1155)": { - tag: "(0022,1155)", - vr: "FL", - vm: "1", - name: "SignalToNoiseRatio", - }, - "(0022,1159)": { - tag: "(0022,1159)", - vr: "LO", - vm: "1", - name: "OphthalmicAxialLengthDataSourceDescription", - }, - "(0022,1210)": { - tag: "(0022,1210)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialLengthMeasurementsTotalLengthSequence", - }, - "(0022,1211)": { - tag: "(0022,1211)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialLengthMeasurementsSegmentalLengthSequence", - }, - "(0022,1212)": { - tag: "(0022,1212)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialLengthMeasurementsLengthSummationSequence", - }, - "(0022,1220)": { - tag: "(0022,1220)", - vr: "SQ", - vm: "1", - name: "UltrasoundOphthalmicAxialLengthMeasurementsSequence", - }, - "(0022,1225)": { - tag: "(0022,1225)", - vr: "SQ", - vm: "1", - name: "OpticalOphthalmicAxialLengthMeasurementsSequence", - }, - "(0022,1230)": { - tag: "(0022,1230)", - vr: "SQ", - vm: "1", - name: "UltrasoundSelectedOphthalmicAxialLengthSequence", - }, - "(0022,1250)": { - tag: "(0022,1250)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialLengthSelectionMethodCodeSequence", - }, - "(0022,1255)": { - tag: "(0022,1255)", - vr: "SQ", - vm: "1", - name: "OpticalSelectedOphthalmicAxialLengthSequence", - }, - "(0022,1257)": { - tag: "(0022,1257)", - vr: "SQ", - vm: "1", - name: "SelectedSegmentalOphthalmicAxialLengthSequence", - }, - "(0022,1260)": { - tag: "(0022,1260)", - vr: "SQ", - vm: "1", - name: "SelectedTotalOphthalmicAxialLengthSequence", - }, - "(0022,1262)": { - tag: "(0022,1262)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialLengthQualityMetricSequence", - }, - "(0022,1265)": { - tag: "(0022,1265)", - vr: "SQ", - vm: "1", - name: "OphthalmicAxialLengthQualityMetricTypeCodeSequence", - }, - "(0022,1273)": { - tag: "(0022,1273)", - vr: "LO", - vm: "1", - name: "OphthalmicAxialLengthQualityMetricTypeDescription", - }, - "(0022,1300)": { - tag: "(0022,1300)", - vr: "SQ", - vm: "1", - name: "IntraocularLensCalculationsRightEyeSequence", - }, - "(0022,1310)": { - tag: "(0022,1310)", - vr: "SQ", - vm: "1", - name: "IntraocularLensCalculationsLeftEyeSequence", - }, - "(0022,1330)": { - tag: "(0022,1330)", - vr: "SQ", - vm: "1", - name: "ReferencedOphthalmicAxialLengthMeasurementQCImageSequence", - }, - "(0022,1415)": { - tag: "(0022,1415)", - vr: "CS", - vm: "1", - name: "OphthalmicMappingDeviceType", - }, - "(0022,1420)": { - tag: "(0022,1420)", - vr: "SQ", - vm: "1", - name: "AcquisitionMethodCodeSequence", - }, - "(0022,1423)": { - tag: "(0022,1423)", - vr: "SQ", - vm: "1", - name: "AcquisitionMethodAlgorithmSequence", - }, - "(0022,1436)": { - tag: "(0022,1436)", - vr: "SQ", - vm: "1", - name: "OphthalmicThicknessMapTypeCodeSequence", - }, - "(0022,1443)": { - tag: "(0022,1443)", - vr: "SQ", - vm: "1", - name: "OphthalmicThicknessMappingNormalsSequence", - }, - "(0022,1445)": { - tag: "(0022,1445)", - vr: "SQ", - vm: "1", - name: "RetinalThicknessDefinitionCodeSequence", - }, - "(0022,1450)": { - tag: "(0022,1450)", - vr: "SQ", - vm: "1", - name: "PixelValueMappingToCodedConceptSequence", - }, - "(0022,1452)": { - tag: "(0022,1452)", - vr: "US|SS", - vm: "1", - name: "MappedPixelValue", - }, - "(0022,1454)": { - tag: "(0022,1454)", - vr: "LO", - vm: "1", - name: "PixelValueMappingExplanation", - }, - "(0022,1458)": { - tag: "(0022,1458)", - vr: "SQ", - vm: "1", - name: "OphthalmicThicknessMapQualityThresholdSequence", - }, - "(0022,1460)": { - tag: "(0022,1460)", - vr: "FL", - vm: "1", - name: "OphthalmicThicknessMapThresholdQualityRating", - }, - "(0022,1463)": { - tag: "(0022,1463)", - vr: "FL", - vm: "2", - name: "AnatomicStructureReferencePoint", - }, - "(0022,1465)": { - tag: "(0022,1465)", - vr: "SQ", - vm: "1", - name: "RegistrationToLocalizerSequence", - }, - "(0022,1466)": { - tag: "(0022,1466)", - vr: "CS", - vm: "1", - name: "RegisteredLocalizerUnits", - }, - "(0022,1467)": { - tag: "(0022,1467)", - vr: "FL", - vm: "2", - name: "RegisteredLocalizerTopLeftHandCorner", - }, - "(0022,1468)": { - tag: "(0022,1468)", - vr: "FL", - vm: "2", - name: "RegisteredLocalizerBottomRightHandCorner", - }, - "(0022,1470)": { - tag: "(0022,1470)", - vr: "SQ", - vm: "1", - name: "OphthalmicThicknessMapQualityRatingSequence", - }, - "(0022,1472)": { - tag: "(0022,1472)", - vr: "SQ", - vm: "1", - name: "RelevantOPTAttributesSequence", - }, - "(0022,1512)": { - tag: "(0022,1512)", - vr: "SQ", - vm: "1", - name: "TransformationMethodCodeSequence", - }, - "(0022,1513)": { - tag: "(0022,1513)", - vr: "SQ", - vm: "1", - name: "TransformationAlgorithmSequence", - }, - "(0022,1515)": { - tag: "(0022,1515)", - vr: "CS", - vm: "1", - name: "OphthalmicAxialLengthMethod", - }, - "(0022,1517)": { - tag: "(0022,1517)", - vr: "FL", - vm: "1", - name: "OphthalmicFOV", - }, - "(0022,1518)": { - tag: "(0022,1518)", - vr: "SQ", - vm: "1", - name: "TwoDimensionalToThreeDimensionalMapSequence", - }, - "(0022,1525)": { - tag: "(0022,1525)", - vr: "SQ", - vm: "1", - name: "WideFieldOphthalmicPhotographyQualityRatingSequence", - }, - "(0022,1526)": { - tag: "(0022,1526)", - vr: "SQ", - vm: "1", - name: "WideFieldOphthalmicPhotographyQualityThresholdSequence", - }, - "(0022,1527)": { - tag: "(0022,1527)", - vr: "FL", - vm: "1", - name: "WideFieldOphthalmicPhotographyThresholdQualityRating", - }, - "(0022,1528)": { - tag: "(0022,1528)", - vr: "FL", - vm: "1", - name: "XCoordinatesCenterPixelViewAngle", - }, - "(0022,1529)": { - tag: "(0022,1529)", - vr: "FL", - vm: "1", - name: "YCoordinatesCenterPixelViewAngle", - }, - "(0022,1530)": { - tag: "(0022,1530)", - vr: "UL", - vm: "1", - name: "NumberOfMapPoints", - }, - "(0022,1531)": { - tag: "(0022,1531)", - vr: "OF", - vm: "1", - name: "TwoDimensionalToThreeDimensionalMapData", - }, - "(0022,1612)": { - tag: "(0022,1612)", - vr: "SQ", - vm: "1", - name: "DerivationAlgorithmSequence", - }, - "(0022,1615)": { - tag: "(0022,1615)", - vr: "SQ", - vm: "1", - name: "OphthalmicImageTypeCodeSequence", - }, - "(0022,1616)": { - tag: "(0022,1616)", - vr: "LO", - vm: "1", - name: "OphthalmicImageTypeDescription", - }, - "(0022,1618)": { - tag: "(0022,1618)", - vr: "SQ", - vm: "1", - name: "ScanPatternTypeCodeSequence", - }, - "(0022,1620)": { - tag: "(0022,1620)", - vr: "SQ", - vm: "1", - name: "ReferencedSurfaceMeshIdentificationSequence", - }, - "(0022,1622)": { - tag: "(0022,1622)", - vr: "CS", - vm: "1", - name: "OphthalmicVolumetricPropertiesFlag", - }, - "(0022,1624)": { - tag: "(0022,1624)", - vr: "FL", - vm: "1", - name: "OphthalmicAnatomicReferencePointXCoordinate", - }, - "(0022,1626)": { - tag: "(0022,1626)", - vr: "FL", - vm: "1", - name: "OphthalmicAnatomicReferencePointYCoordinate", - }, - "(0022,1628)": { - tag: "(0022,1628)", - vr: "SQ", - vm: "1", - name: "OphthalmicEnFaceImageQualityRatingSequence", - }, - "(0022,1630)": { - tag: "(0022,1630)", - vr: "DS", - vm: "1", - name: "QualityThreshold", - }, - "(0022,1640)": { - tag: "(0022,1640)", - vr: "SQ", - vm: "1", - name: "OCTBscanAnalysisAcquisitionParametersSequence", - }, - "(0022,1642)": { - tag: "(0022,1642)", - vr: "UL", - vm: "1", - name: "NumberOfBscansPerFrame", - }, - "(0022,1643)": { - tag: "(0022,1643)", - vr: "FL", - vm: "1", - name: "BscanSlabThickness", - }, - "(0022,1644)": { - tag: "(0022,1644)", - vr: "FL", - vm: "1", - name: "DistanceBetweenBscanSlabs", - }, - "(0022,1645)": { - tag: "(0022,1645)", - vr: "FL", - vm: "1", - name: "BscanCycleTime", - }, - "(0022,1646)": { - tag: "(0022,1646)", - vr: "FL", - vm: "1-n", - name: "BscanCycleTimeVector", - }, - "(0022,1649)": { tag: "(0022,1649)", vr: "FL", vm: "1", name: "AscanRate" }, - "(0022,1650)": { tag: "(0022,1650)", vr: "FL", vm: "1", name: "BscanRate" }, - "(0022,1658)": { - tag: "(0022,1658)", - vr: "UL", - vm: "1", - name: "SurfaceMeshZPixelOffset", - }, - "(0024,0010)": { - tag: "(0024,0010)", - vr: "FL", - vm: "1", - name: "VisualFieldHorizontalExtent", - }, - "(0024,0011)": { - tag: "(0024,0011)", - vr: "FL", - vm: "1", - name: "VisualFieldVerticalExtent", - }, - "(0024,0012)": { - tag: "(0024,0012)", - vr: "CS", - vm: "1", - name: "VisualFieldShape", - }, - "(0024,0016)": { - tag: "(0024,0016)", - vr: "SQ", - vm: "1", - name: "ScreeningTestModeCodeSequence", - }, - "(0024,0018)": { - tag: "(0024,0018)", - vr: "FL", - vm: "1", - name: "MaximumStimulusLuminance", - }, - "(0024,0020)": { - tag: "(0024,0020)", - vr: "FL", - vm: "1", - name: "BackgroundLuminance", - }, - "(0024,0021)": { - tag: "(0024,0021)", - vr: "SQ", - vm: "1", - name: "StimulusColorCodeSequence", - }, - "(0024,0024)": { - tag: "(0024,0024)", - vr: "SQ", - vm: "1", - name: "BackgroundIlluminationColorCodeSequence", - }, - "(0024,0025)": { - tag: "(0024,0025)", - vr: "FL", - vm: "1", - name: "StimulusArea", - }, - "(0024,0028)": { - tag: "(0024,0028)", - vr: "FL", - vm: "1", - name: "StimulusPresentationTime", - }, - "(0024,0032)": { - tag: "(0024,0032)", - vr: "SQ", - vm: "1", - name: "FixationSequence", - }, - "(0024,0033)": { - tag: "(0024,0033)", - vr: "SQ", - vm: "1", - name: "FixationMonitoringCodeSequence", - }, - "(0024,0034)": { - tag: "(0024,0034)", - vr: "SQ", - vm: "1", - name: "VisualFieldCatchTrialSequence", - }, - "(0024,0035)": { - tag: "(0024,0035)", - vr: "US", - vm: "1", - name: "FixationCheckedQuantity", - }, - "(0024,0036)": { - tag: "(0024,0036)", - vr: "US", - vm: "1", - name: "PatientNotProperlyFixatedQuantity", - }, - "(0024,0037)": { - tag: "(0024,0037)", - vr: "CS", - vm: "1", - name: "PresentedVisualStimuliDataFlag", - }, - "(0024,0038)": { - tag: "(0024,0038)", - vr: "US", - vm: "1", - name: "NumberOfVisualStimuli", - }, - "(0024,0039)": { - tag: "(0024,0039)", - vr: "CS", - vm: "1", - name: "ExcessiveFixationLossesDataFlag", - }, - "(0024,0040)": { - tag: "(0024,0040)", - vr: "CS", - vm: "1", - name: "ExcessiveFixationLosses", - }, - "(0024,0042)": { - tag: "(0024,0042)", - vr: "US", - vm: "1", - name: "StimuliRetestingQuantity", - }, - "(0024,0044)": { - tag: "(0024,0044)", - vr: "LT", - vm: "1", - name: "CommentsOnPatientPerformanceOfVisualField", - }, - "(0024,0045)": { - tag: "(0024,0045)", - vr: "CS", - vm: "1", - name: "FalseNegativesEstimateFlag", - }, - "(0024,0046)": { - tag: "(0024,0046)", - vr: "FL", - vm: "1", - name: "FalseNegativesEstimate", - }, - "(0024,0048)": { - tag: "(0024,0048)", - vr: "US", - vm: "1", - name: "NegativeCatchTrialsQuantity", - }, - "(0024,0050)": { - tag: "(0024,0050)", - vr: "US", - vm: "1", - name: "FalseNegativesQuantity", - }, - "(0024,0051)": { - tag: "(0024,0051)", - vr: "CS", - vm: "1", - name: "ExcessiveFalseNegativesDataFlag", - }, - "(0024,0052)": { - tag: "(0024,0052)", - vr: "CS", - vm: "1", - name: "ExcessiveFalseNegatives", - }, - "(0024,0053)": { - tag: "(0024,0053)", - vr: "CS", - vm: "1", - name: "FalsePositivesEstimateFlag", - }, - "(0024,0054)": { - tag: "(0024,0054)", - vr: "FL", - vm: "1", - name: "FalsePositivesEstimate", - }, - "(0024,0055)": { - tag: "(0024,0055)", - vr: "CS", - vm: "1", - name: "CatchTrialsDataFlag", - }, - "(0024,0056)": { - tag: "(0024,0056)", - vr: "US", - vm: "1", - name: "PositiveCatchTrialsQuantity", - }, - "(0024,0057)": { - tag: "(0024,0057)", - vr: "CS", - vm: "1", - name: "TestPointNormalsDataFlag", - }, - "(0024,0058)": { - tag: "(0024,0058)", - vr: "SQ", - vm: "1", - name: "TestPointNormalsSequence", - }, - "(0024,0059)": { - tag: "(0024,0059)", - vr: "CS", - vm: "1", - name: "GlobalDeviationProbabilityNormalsFlag", - }, - "(0024,0060)": { - tag: "(0024,0060)", - vr: "US", - vm: "1", - name: "FalsePositivesQuantity", - }, - "(0024,0061)": { - tag: "(0024,0061)", - vr: "CS", - vm: "1", - name: "ExcessiveFalsePositivesDataFlag", - }, - "(0024,0062)": { - tag: "(0024,0062)", - vr: "CS", - vm: "1", - name: "ExcessiveFalsePositives", - }, - "(0024,0063)": { - tag: "(0024,0063)", - vr: "CS", - vm: "1", - name: "VisualFieldTestNormalsFlag", - }, - "(0024,0064)": { - tag: "(0024,0064)", - vr: "SQ", - vm: "1", - name: "ResultsNormalsSequence", - }, - "(0024,0065)": { - tag: "(0024,0065)", - vr: "SQ", - vm: "1", - name: "AgeCorrectedSensitivityDeviationAlgorithmSequence", - }, - "(0024,0066)": { - tag: "(0024,0066)", - vr: "FL", - vm: "1", - name: "GlobalDeviationFromNormal", - }, - "(0024,0067)": { - tag: "(0024,0067)", - vr: "SQ", - vm: "1", - name: "GeneralizedDefectSensitivityDeviationAlgorithmSequence", - }, - "(0024,0068)": { - tag: "(0024,0068)", - vr: "FL", - vm: "1", - name: "LocalizedDeviationFromNormal", - }, - "(0024,0069)": { - tag: "(0024,0069)", - vr: "LO", - vm: "1", - name: "PatientReliabilityIndicator", - }, - "(0024,0070)": { - tag: "(0024,0070)", - vr: "FL", - vm: "1", - name: "VisualFieldMeanSensitivity", - }, - "(0024,0071)": { - tag: "(0024,0071)", - vr: "FL", - vm: "1", - name: "GlobalDeviationProbability", - }, - "(0024,0072)": { - tag: "(0024,0072)", - vr: "CS", - vm: "1", - name: "LocalDeviationProbabilityNormalsFlag", - }, - "(0024,0073)": { - tag: "(0024,0073)", - vr: "FL", - vm: "1", - name: "LocalizedDeviationProbability", - }, - "(0024,0074)": { - tag: "(0024,0074)", - vr: "CS", - vm: "1", - name: "ShortTermFluctuationCalculated", - }, - "(0024,0075)": { - tag: "(0024,0075)", - vr: "FL", - vm: "1", - name: "ShortTermFluctuation", - }, - "(0024,0076)": { - tag: "(0024,0076)", - vr: "CS", - vm: "1", - name: "ShortTermFluctuationProbabilityCalculated", - }, - "(0024,0077)": { - tag: "(0024,0077)", - vr: "FL", - vm: "1", - name: "ShortTermFluctuationProbability", - }, - "(0024,0078)": { - tag: "(0024,0078)", - vr: "CS", - vm: "1", - name: "CorrectedLocalizedDeviationFromNormalCalculated", - }, - "(0024,0079)": { - tag: "(0024,0079)", - vr: "FL", - vm: "1", - name: "CorrectedLocalizedDeviationFromNormal", - }, - "(0024,0080)": { - tag: "(0024,0080)", - vr: "CS", - vm: "1", - name: "CorrectedLocalizedDeviationFromNormalProbabilityCalculated", - }, - "(0024,0081)": { - tag: "(0024,0081)", - vr: "FL", - vm: "1", - name: "CorrectedLocalizedDeviationFromNormalProbability", - }, - "(0024,0083)": { - tag: "(0024,0083)", - vr: "SQ", - vm: "1", - name: "GlobalDeviationProbabilitySequence", - }, - "(0024,0085)": { - tag: "(0024,0085)", - vr: "SQ", - vm: "1", - name: "LocalizedDeviationProbabilitySequence", - }, - "(0024,0086)": { - tag: "(0024,0086)", - vr: "CS", - vm: "1", - name: "FovealSensitivityMeasured", - }, - "(0024,0087)": { - tag: "(0024,0087)", - vr: "FL", - vm: "1", - name: "FovealSensitivity", - }, - "(0024,0088)": { - tag: "(0024,0088)", - vr: "FL", - vm: "1", - name: "VisualFieldTestDuration", - }, - "(0024,0089)": { - tag: "(0024,0089)", - vr: "SQ", - vm: "1", - name: "VisualFieldTestPointSequence", - }, - "(0024,0090)": { - tag: "(0024,0090)", - vr: "FL", - vm: "1", - name: "VisualFieldTestPointXCoordinate", - }, - "(0024,0091)": { - tag: "(0024,0091)", - vr: "FL", - vm: "1", - name: "VisualFieldTestPointYCoordinate", - }, - "(0024,0092)": { - tag: "(0024,0092)", - vr: "FL", - vm: "1", - name: "AgeCorrectedSensitivityDeviationValue", - }, - "(0024,0093)": { - tag: "(0024,0093)", - vr: "CS", - vm: "1", - name: "StimulusResults", - }, - "(0024,0094)": { - tag: "(0024,0094)", - vr: "FL", - vm: "1", - name: "SensitivityValue", - }, - "(0024,0095)": { - tag: "(0024,0095)", - vr: "CS", - vm: "1", - name: "RetestStimulusSeen", - }, - "(0024,0096)": { - tag: "(0024,0096)", - vr: "FL", - vm: "1", - name: "RetestSensitivityValue", - }, - "(0024,0097)": { - tag: "(0024,0097)", - vr: "SQ", - vm: "1", - name: "VisualFieldTestPointNormalsSequence", - }, - "(0024,0098)": { - tag: "(0024,0098)", - vr: "FL", - vm: "1", - name: "QuantifiedDefect", - }, - "(0024,0100)": { - tag: "(0024,0100)", - vr: "FL", - vm: "1", - name: "AgeCorrectedSensitivityDeviationProbabilityValue", - }, - "(0024,0102)": { - tag: "(0024,0102)", - vr: "CS", - vm: "1", - name: "GeneralizedDefectCorrectedSensitivityDeviationFlag", - }, - "(0024,0103)": { - tag: "(0024,0103)", - vr: "FL", - vm: "1", - name: "GeneralizedDefectCorrectedSensitivityDeviationValue", - }, - "(0024,0104)": { - tag: "(0024,0104)", - vr: "FL", - vm: "1", - name: "GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue", - }, - "(0024,0105)": { - tag: "(0024,0105)", - vr: "FL", - vm: "1", - name: "MinimumSensitivityValue", - }, - "(0024,0106)": { - tag: "(0024,0106)", - vr: "CS", - vm: "1", - name: "BlindSpotLocalized", - }, - "(0024,0107)": { - tag: "(0024,0107)", - vr: "FL", - vm: "1", - name: "BlindSpotXCoordinate", - }, - "(0024,0108)": { - tag: "(0024,0108)", - vr: "FL", - vm: "1", - name: "BlindSpotYCoordinate", - }, - "(0024,0110)": { - tag: "(0024,0110)", - vr: "SQ", - vm: "1", - name: "VisualAcuityMeasurementSequence", - }, - "(0024,0112)": { - tag: "(0024,0112)", - vr: "SQ", - vm: "1", - name: "RefractiveParametersUsedOnPatientSequence", - }, - "(0024,0113)": { - tag: "(0024,0113)", - vr: "CS", - vm: "1", - name: "MeasurementLaterality", - }, - "(0024,0114)": { - tag: "(0024,0114)", - vr: "SQ", - vm: "1", - name: "OphthalmicPatientClinicalInformationLeftEyeSequence", - }, - "(0024,0115)": { - tag: "(0024,0115)", - vr: "SQ", - vm: "1", - name: "OphthalmicPatientClinicalInformationRightEyeSequence", - }, - "(0024,0117)": { - tag: "(0024,0117)", - vr: "CS", - vm: "1", - name: "FovealPointNormativeDataFlag", - }, - "(0024,0118)": { - tag: "(0024,0118)", - vr: "FL", - vm: "1", - name: "FovealPointProbabilityValue", - }, - "(0024,0120)": { - tag: "(0024,0120)", - vr: "CS", - vm: "1", - name: "ScreeningBaselineMeasured", - }, - "(0024,0122)": { - tag: "(0024,0122)", - vr: "SQ", - vm: "1", - name: "ScreeningBaselineMeasuredSequence", - }, - "(0024,0124)": { - tag: "(0024,0124)", - vr: "CS", - vm: "1", - name: "ScreeningBaselineType", - }, - "(0024,0126)": { - tag: "(0024,0126)", - vr: "FL", - vm: "1", - name: "ScreeningBaselineValue", - }, - "(0024,0202)": { - tag: "(0024,0202)", - vr: "LO", - vm: "1", - name: "AlgorithmSource", - }, - "(0024,0306)": { tag: "(0024,0306)", vr: "LO", vm: "1", name: "DataSetName" }, - "(0024,0307)": { - tag: "(0024,0307)", - vr: "LO", - vm: "1", - name: "DataSetVersion", - }, - "(0024,0308)": { - tag: "(0024,0308)", - vr: "LO", - vm: "1", - name: "DataSetSource", - }, - "(0024,0309)": { - tag: "(0024,0309)", - vr: "LO", - vm: "1", - name: "DataSetDescription", - }, - "(0024,0317)": { - tag: "(0024,0317)", - vr: "SQ", - vm: "1", - name: "VisualFieldTestReliabilityGlobalIndexSequence", - }, - "(0024,0320)": { - tag: "(0024,0320)", - vr: "SQ", - vm: "1", - name: "VisualFieldGlobalResultsIndexSequence", - }, - "(0024,0325)": { - tag: "(0024,0325)", - vr: "SQ", - vm: "1", - name: "DataObservationSequence", - }, - "(0024,0338)": { - tag: "(0024,0338)", - vr: "CS", - vm: "1", - name: "IndexNormalsFlag", - }, - "(0024,0341)": { - tag: "(0024,0341)", - vr: "FL", - vm: "1", - name: "IndexProbability", - }, - "(0024,0344)": { - tag: "(0024,0344)", - vr: "SQ", - vm: "1", - name: "IndexProbabilitySequence", - }, - "(0028,0002)": { - tag: "(0028,0002)", - vr: "US", - vm: "1", - name: "SamplesPerPixel", - }, - "(0028,0003)": { - tag: "(0028,0003)", - vr: "US", - vm: "1", - name: "SamplesPerPixelUsed", - }, - "(0028,0004)": { - tag: "(0028,0004)", - vr: "CS", - vm: "1", - name: "PhotometricInterpretation", - }, - "(0028,0005)": { - tag: "(0028,0005)", - vr: "US", - vm: "1", - name: "ImageDimensions", - }, - "(0028,0006)": { - tag: "(0028,0006)", - vr: "US", - vm: "1", - name: "PlanarConfiguration", - }, - "(0028,0008)": { - tag: "(0028,0008)", - vr: "IS", - vm: "1", - name: "NumberOfFrames", - }, - "(0028,0009)": { - tag: "(0028,0009)", - vr: "AT", - vm: "1-n", - name: "FrameIncrementPointer", - }, - "(0028,000A)": { - tag: "(0028,000A)", - vr: "AT", - vm: "1-n", - name: "FrameDimensionPointer", - }, - "(0028,0010)": { tag: "(0028,0010)", vr: "US", vm: "1", name: "Rows" }, - "(0028,0011)": { tag: "(0028,0011)", vr: "US", vm: "1", name: "Columns" }, - "(0028,0012)": { tag: "(0028,0012)", vr: "US", vm: "1", name: "Planes" }, - "(0028,0014)": { - tag: "(0028,0014)", - vr: "US", - vm: "1", - name: "UltrasoundColorDataPresent", - }, - "(0028,0020)": { tag: "(0028,0020)", vr: "", vm: "", name: "" }, - "(0028,0030)": { - tag: "(0028,0030)", - vr: "DS", - vm: "2", - name: "PixelSpacing", - }, - "(0028,0031)": { tag: "(0028,0031)", vr: "DS", vm: "2", name: "ZoomFactor" }, - "(0028,0032)": { tag: "(0028,0032)", vr: "DS", vm: "2", name: "ZoomCenter" }, - "(0028,0034)": { - tag: "(0028,0034)", - vr: "IS", - vm: "2", - name: "PixelAspectRatio", - }, - "(0028,0040)": { tag: "(0028,0040)", vr: "CS", vm: "1", name: "ImageFormat" }, - "(0028,0050)": { - tag: "(0028,0050)", - vr: "LO", - vm: "1-n", - name: "ManipulatedImage", - }, - "(0028,0051)": { - tag: "(0028,0051)", - vr: "CS", - vm: "1-n", - name: "CorrectedImage", - }, - "(0028,005F)": { - tag: "(0028,005F)", - vr: "LO", - vm: "1", - name: "CompressionRecognitionCode", - }, - "(0028,0060)": { - tag: "(0028,0060)", - vr: "CS", - vm: "1", - name: "CompressionCode", - }, - "(0028,0061)": { - tag: "(0028,0061)", - vr: "SH", - vm: "1", - name: "CompressionOriginator", - }, - "(0028,0062)": { - tag: "(0028,0062)", - vr: "LO", - vm: "1", - name: "CompressionLabel", - }, - "(0028,0063)": { - tag: "(0028,0063)", - vr: "SH", - vm: "1", - name: "CompressionDescription", - }, - "(0028,0065)": { - tag: "(0028,0065)", - vr: "CS", - vm: "1-n", - name: "CompressionSequence", - }, - "(0028,0066)": { - tag: "(0028,0066)", - vr: "AT", - vm: "1-n", - name: "CompressionStepPointers", - }, - "(0028,0068)": { - tag: "(0028,0068)", - vr: "US", - vm: "1", - name: "RepeatInterval", - }, - "(0028,0069)": { tag: "(0028,0069)", vr: "US", vm: "1", name: "BitsGrouped" }, - "(0028,0070)": { - tag: "(0028,0070)", - vr: "US", - vm: "1-n", - name: "PerimeterTable", - }, - "(0028,0071)": { - tag: "(0028,0071)", - vr: "US|SS", - vm: "1", - name: "PerimeterValue", - }, - "(0028,0080)": { - tag: "(0028,0080)", - vr: "US", - vm: "1", - name: "PredictorRows", - }, - "(0028,0081)": { - tag: "(0028,0081)", - vr: "US", - vm: "1", - name: "PredictorColumns", - }, - "(0028,0082)": { - tag: "(0028,0082)", - vr: "US", - vm: "1-n", - name: "PredictorConstants", - }, - "(0028,0090)": { - tag: "(0028,0090)", - vr: "CS", - vm: "1", - name: "BlockedPixels", - }, - "(0028,0091)": { tag: "(0028,0091)", vr: "US", vm: "1", name: "BlockRows" }, - "(0028,0092)": { - tag: "(0028,0092)", - vr: "US", - vm: "1", - name: "BlockColumns", - }, - "(0028,0093)": { tag: "(0028,0093)", vr: "US", vm: "1", name: "RowOverlap" }, - "(0028,0094)": { - tag: "(0028,0094)", - vr: "US", - vm: "1", - name: "ColumnOverlap", - }, - "(0028,0100)": { - tag: "(0028,0100)", - vr: "US", - vm: "1", - name: "BitsAllocated", - }, - "(0028,0101)": { tag: "(0028,0101)", vr: "US", vm: "1", name: "BitsStored" }, - "(0028,0102)": { tag: "(0028,0102)", vr: "US", vm: "1", name: "HighBit" }, - "(0028,0103)": { - tag: "(0028,0103)", - vr: "US", - vm: "1", - name: "PixelRepresentation", - }, - "(0028,0104)": { - tag: "(0028,0104)", - vr: "US|SS", - vm: "1", - name: "SmallestValidPixelValue", - }, - "(0028,0105)": { - tag: "(0028,0105)", - vr: "US|SS", - vm: "1", - name: "LargestValidPixelValue", - }, - "(0028,0106)": { - tag: "(0028,0106)", - vr: "US|SS", - vm: "1", - name: "SmallestImagePixelValue", - }, - "(0028,0107)": { - tag: "(0028,0107)", - vr: "US|SS", - vm: "1", - name: "LargestImagePixelValue", - }, - "(0028,0108)": { - tag: "(0028,0108)", - vr: "US|SS", - vm: "1", - name: "SmallestPixelValueInSeries", - }, - "(0028,0109)": { - tag: "(0028,0109)", - vr: "US|SS", - vm: "1", - name: "LargestPixelValueInSeries", - }, - "(0028,0110)": { - tag: "(0028,0110)", - vr: "US|SS", - vm: "1", - name: "SmallestImagePixelValueInPlane", - }, - "(0028,0111)": { - tag: "(0028,0111)", - vr: "US|SS", - vm: "1", - name: "LargestImagePixelValueInPlane", - }, - "(0028,0120)": { - tag: "(0028,0120)", - vr: "US|SS", - vm: "1", - name: "PixelPaddingValue", - }, - "(0028,0121)": { - tag: "(0028,0121)", - vr: "US|SS", - vm: "1", - name: "PixelPaddingRangeLimit", - }, - "(0028,0122)": { - tag: "(0028,0122)", - vr: "FL", - vm: "1", - name: "FloatPixelPaddingValue", - }, - "(0028,0123)": { - tag: "(0028,0123)", - vr: "FD", - vm: "1", - name: "DoubleFloatPixelPaddingValue", - }, - "(0028,0124)": { - tag: "(0028,0124)", - vr: "FL", - vm: "1", - name: "FloatPixelPaddingRangeLimit", - }, - "(0028,0125)": { - tag: "(0028,0125)", - vr: "FD", - vm: "1", - name: "DoubleFloatPixelPaddingRangeLimit", - }, - "(0028,0200)": { - tag: "(0028,0200)", - vr: "US", - vm: "1", - name: "ImageLocation", - }, - "(0028,0300)": { - tag: "(0028,0300)", - vr: "CS", - vm: "1", - name: "QualityControlImage", - }, - "(0028,0301)": { - tag: "(0028,0301)", - vr: "CS", - vm: "1", - name: "BurnedInAnnotation", - }, - "(0028,0302)": { - tag: "(0028,0302)", - vr: "CS", - vm: "1", - name: "RecognizableVisualFeatures", - }, - "(0028,0303)": { - tag: "(0028,0303)", - vr: "CS", - vm: "1", - name: "LongitudinalTemporalInformationModified", - }, - "(0028,0304)": { - tag: "(0028,0304)", - vr: "UI", - vm: "1", - name: "ReferencedColorPaletteInstanceUID", - }, - "(0028,0400)": { - tag: "(0028,0400)", - vr: "LO", - vm: "1", - name: "TransformLabel", - }, - "(0028,0401)": { - tag: "(0028,0401)", - vr: "LO", - vm: "1", - name: "TransformVersionNumber", - }, - "(0028,0402)": { - tag: "(0028,0402)", - vr: "US", - vm: "1", - name: "NumberOfTransformSteps", - }, - "(0028,0403)": { - tag: "(0028,0403)", - vr: "LO", - vm: "1-n", - name: "SequenceOfCompressedData", - }, - "(0028,0404)": { - tag: "(0028,0404)", - vr: "AT", - vm: "1-n", - name: "DetailsOfCoefficients", - }, - "(0028,04x0)": { - tag: "(0028,04x0)", - vr: "US", - vm: "1", - name: "RowsForNthOrderCoefficients", - }, - "(0028,04x1)": { - tag: "(0028,04x1)", - vr: "US", - vm: "1", - name: "ColumnsForNthOrderCoefficients", - }, - "(0028,04x2)": { - tag: "(0028,04x2)", - vr: "LO", - vm: "1-n", - name: "CoefficientCoding", - }, - "(0028,04x3)": { - tag: "(0028,04x3)", - vr: "AT", - vm: "1-n", - name: "CoefficientCodingPointers", - }, - "(0028,0700)": { tag: "(0028,0700)", vr: "LO", vm: "1", name: "DCTLabel" }, - "(0028,0701)": { - tag: "(0028,0701)", - vr: "CS", - vm: "1-n", - name: "DataBlockDescription", - }, - "(0028,0702)": { tag: "(0028,0702)", vr: "AT", vm: "1-n", name: "DataBlock" }, - "(0028,0710)": { - tag: "(0028,0710)", - vr: "US", - vm: "1", - name: "NormalizationFactorFormat", - }, - "(0028,0720)": { - tag: "(0028,0720)", - vr: "US", - vm: "1", - name: "ZonalMapNumberFormat", - }, - "(0028,0721)": { - tag: "(0028,0721)", - vr: "AT", - vm: "1-n", - name: "ZonalMapLocation", - }, - "(0028,0722)": { - tag: "(0028,0722)", - vr: "US", - vm: "1", - name: "ZonalMapFormat", - }, - "(0028,0730)": { - tag: "(0028,0730)", - vr: "US", - vm: "1", - name: "AdaptiveMapFormat", - }, - "(0028,0740)": { - tag: "(0028,0740)", - vr: "US", - vm: "1", - name: "CodeNumberFormat", - }, - "(0028,08x0)": { tag: "(0028,08x0)", vr: "CS", vm: "1-n", name: "CodeLabel" }, - "(0028,08x2)": { - tag: "(0028,08x2)", - vr: "US", - vm: "1", - name: "NumberOfTables", - }, - "(0028,08x3)": { - tag: "(0028,08x3)", - vr: "AT", - vm: "1-n", - name: "CodeTableLocation", - }, - "(0028,08x4)": { - tag: "(0028,08x4)", - vr: "US", - vm: "1", - name: "BitsForCodeWord", - }, - "(0028,08x8)": { - tag: "(0028,08x8)", - vr: "AT", - vm: "1-n", - name: "ImageDataLocation", - }, - "(0028,0A02)": { - tag: "(0028,0A02)", - vr: "CS", - vm: "1", - name: "PixelSpacingCalibrationType", - }, - "(0028,0A04)": { - tag: "(0028,0A04)", - vr: "LO", - vm: "1", - name: "PixelSpacingCalibrationDescription", - }, - "(0028,1040)": { - tag: "(0028,1040)", - vr: "CS", - vm: "1", - name: "PixelIntensityRelationship", - }, - "(0028,1041)": { - tag: "(0028,1041)", - vr: "SS", - vm: "1", - name: "PixelIntensityRelationshipSign", - }, - "(0028,1050)": { - tag: "(0028,1050)", - vr: "DS", - vm: "1-n", - name: "WindowCenter", - }, - "(0028,1051)": { - tag: "(0028,1051)", - vr: "DS", - vm: "1-n", - name: "WindowWidth", - }, - "(0028,1052)": { - tag: "(0028,1052)", - vr: "DS", - vm: "1", - name: "RescaleIntercept", - }, - "(0028,1053)": { - tag: "(0028,1053)", - vr: "DS", - vm: "1", - name: "RescaleSlope", - }, - "(0028,1054)": { tag: "(0028,1054)", vr: "LO", vm: "1", name: "RescaleType" }, - "(0028,1055)": { - tag: "(0028,1055)", - vr: "LO", - vm: "1-n", - name: "WindowCenterWidthExplanation", - }, - "(0028,1056)": { - tag: "(0028,1056)", - vr: "CS", - vm: "1", - name: "VOILUTFunction", - }, - "(0028,1080)": { tag: "(0028,1080)", vr: "CS", vm: "1", name: "GrayScale" }, - "(0028,1090)": { - tag: "(0028,1090)", - vr: "CS", - vm: "1", - name: "RecommendedViewingMode", - }, - "(0028,1100)": { - tag: "(0028,1100)", - vr: "US|SS", - vm: "3", - name: "GrayLookupTableDescriptor", - }, - "(0028,1101)": { - tag: "(0028,1101)", - vr: "US|SS", - vm: "3", - name: "RedPaletteColorLookupTableDescriptor", - }, - "(0028,1102)": { - tag: "(0028,1102)", - vr: "US|SS", - vm: "3", - name: "GreenPaletteColorLookupTableDescriptor", - }, - "(0028,1103)": { - tag: "(0028,1103)", - vr: "US|SS", - vm: "3", - name: "BluePaletteColorLookupTableDescriptor", - }, - "(0028,1104)": { - tag: "(0028,1104)", - vr: "US", - vm: "3", - name: "AlphaPaletteColorLookupTableDescriptor", - }, - "(0028,1111)": { - tag: "(0028,1111)", - vr: "US|SS", - vm: "4", - name: "LargeRedPaletteColorLookupTableDescriptor", - }, - "(0028,1112)": { - tag: "(0028,1112)", - vr: "US|SS", - vm: "4", - name: "LargeGreenPaletteColorLookupTableDescriptor", - }, - "(0028,1113)": { - tag: "(0028,1113)", - vr: "US|SS", - vm: "4", - name: "LargeBluePaletteColorLookupTableDescriptor", - }, - "(0028,1199)": { - tag: "(0028,1199)", - vr: "UI", - vm: "1", - name: "PaletteColorLookupTableUID", - }, - "(0028,1200)": { - tag: "(0028,1200)", - vr: "US|SS|OW", - vm: "1-n or 1", - name: "GrayLookupTableData", - }, - "(0028,1201)": { - tag: "(0028,1201)", - vr: "OW", - vm: "1", - name: "RedPaletteColorLookupTableData", - }, - "(0028,1202)": { - tag: "(0028,1202)", - vr: "OW", - vm: "1", - name: "GreenPaletteColorLookupTableData", - }, - "(0028,1203)": { - tag: "(0028,1203)", - vr: "OW", - vm: "1", - name: "BluePaletteColorLookupTableData", - }, - "(0028,1204)": { - tag: "(0028,1204)", - vr: "OW", - vm: "1", - name: "AlphaPaletteColorLookupTableData", - }, - "(0028,1211)": { - tag: "(0028,1211)", - vr: "OW", - vm: "1", - name: "LargeRedPaletteColorLookupTableData", - }, - "(0028,1212)": { - tag: "(0028,1212)", - vr: "OW", - vm: "1", - name: "LargeGreenPaletteColorLookupTableData", - }, - "(0028,1213)": { - tag: "(0028,1213)", - vr: "OW", - vm: "1", - name: "LargeBluePaletteColorLookupTableData", - }, - "(0028,1214)": { - tag: "(0028,1214)", - vr: "UI", - vm: "1", - name: "LargePaletteColorLookupTableUID", - }, - "(0028,1221)": { - tag: "(0028,1221)", - vr: "OW", - vm: "1", - name: "SegmentedRedPaletteColorLookupTableData", - }, - "(0028,1222)": { - tag: "(0028,1222)", - vr: "OW", - vm: "1", - name: "SegmentedGreenPaletteColorLookupTableData", - }, - "(0028,1223)": { - tag: "(0028,1223)", - vr: "OW", - vm: "1", - name: "SegmentedBluePaletteColorLookupTableData", - }, - "(0028,1224)": { - tag: "(0028,1224)", - vr: "OW", - vm: "1", - name: "SegmentedAlphaPaletteColorLookupTableData", - }, - "(0028,1230)": { - tag: "(0028,1230)", - vr: "SQ", - vm: "1", - name: "StoredValueColorRangeSequence", - }, - "(0028,1231)": { - tag: "(0028,1231)", - vr: "FD", - vm: "1", - name: "MinimumStoredValueMapped", - }, - "(0028,1232)": { - tag: "(0028,1232)", - vr: "FD", - vm: "1", - name: "MaximumStoredValueMapped", - }, - "(0028,1300)": { - tag: "(0028,1300)", - vr: "CS", - vm: "1", - name: "BreastImplantPresent", - }, - "(0028,1350)": { tag: "(0028,1350)", vr: "CS", vm: "1", name: "PartialView" }, - "(0028,1351)": { - tag: "(0028,1351)", - vr: "ST", - vm: "1", - name: "PartialViewDescription", - }, - "(0028,1352)": { - tag: "(0028,1352)", - vr: "SQ", - vm: "1", - name: "PartialViewCodeSequence", - }, - "(0028,135A)": { - tag: "(0028,135A)", - vr: "CS", - vm: "1", - name: "SpatialLocationsPreserved", - }, - "(0028,1401)": { - tag: "(0028,1401)", - vr: "SQ", - vm: "1", - name: "DataFrameAssignmentSequence", - }, - "(0028,1402)": { - tag: "(0028,1402)", - vr: "CS", - vm: "1", - name: "DataPathAssignment", - }, - "(0028,1403)": { - tag: "(0028,1403)", - vr: "US", - vm: "1", - name: "BitsMappedToColorLookupTable", - }, - "(0028,1404)": { - tag: "(0028,1404)", - vr: "SQ", - vm: "1", - name: "BlendingLUT1Sequence", - }, - "(0028,1405)": { - tag: "(0028,1405)", - vr: "CS", - vm: "1", - name: "BlendingLUT1TransferFunction", - }, - "(0028,1406)": { - tag: "(0028,1406)", - vr: "FD", - vm: "1", - name: "BlendingWeightConstant", - }, - "(0028,1407)": { - tag: "(0028,1407)", - vr: "US", - vm: "3", - name: "BlendingLookupTableDescriptor", - }, - "(0028,1408)": { - tag: "(0028,1408)", - vr: "OW", - vm: "1", - name: "BlendingLookupTableData", - }, - "(0028,140B)": { - tag: "(0028,140B)", - vr: "SQ", - vm: "1", - name: "EnhancedPaletteColorLookupTableSequence", - }, - "(0028,140C)": { - tag: "(0028,140C)", - vr: "SQ", - vm: "1", - name: "BlendingLUT2Sequence", - }, - "(0028,140D)": { - tag: "(0028,140D)", - vr: "CS", - vm: "1", - name: "BlendingLUT2TransferFunction", - }, - "(0028,140E)": { tag: "(0028,140E)", vr: "CS", vm: "1", name: "DataPathID" }, - "(0028,140F)": { - tag: "(0028,140F)", - vr: "CS", - vm: "1", - name: "RGBLUTTransferFunction", - }, - "(0028,1410)": { - tag: "(0028,1410)", - vr: "CS", - vm: "1", - name: "AlphaLUTTransferFunction", - }, - "(0028,2000)": { tag: "(0028,2000)", vr: "OB", vm: "1", name: "ICCProfile" }, - "(0028,2002)": { tag: "(0028,2002)", vr: "CS", vm: "1", name: "ColorSpace" }, - "(0028,2110)": { - tag: "(0028,2110)", - vr: "CS", - vm: "1", - name: "LossyImageCompression", - }, - "(0028,2112)": { - tag: "(0028,2112)", - vr: "DS", - vm: "1-n", - name: "LossyImageCompressionRatio", - }, - "(0028,2114)": { - tag: "(0028,2114)", - vr: "CS", - vm: "1-n", - name: "LossyImageCompressionMethod", - }, - "(0028,3000)": { - tag: "(0028,3000)", - vr: "SQ", - vm: "1", - name: "ModalityLUTSequence", - }, - "(0028,3002)": { - tag: "(0028,3002)", - vr: "US|SS", - vm: "3", - name: "LUTDescriptor", - }, - "(0028,3003)": { - tag: "(0028,3003)", - vr: "LO", - vm: "1", - name: "LUTExplanation", - }, - "(0028,3004)": { - tag: "(0028,3004)", - vr: "LO", - vm: "1", - name: "ModalityLUTType", - }, - "(0028,3006)": { - tag: "(0028,3006)", - vr: "US|OW", - vm: "1-n or 1", - name: "LUTData", - }, - "(0028,3010)": { - tag: "(0028,3010)", - vr: "SQ", - vm: "1", - name: "VOILUTSequence", - }, - "(0028,3110)": { - tag: "(0028,3110)", - vr: "SQ", - vm: "1", - name: "SoftcopyVOILUTSequence", - }, - "(0028,4000)": { - tag: "(0028,4000)", - vr: "LT", - vm: "1", - name: "ImagePresentationComments", - }, - "(0028,5000)": { - tag: "(0028,5000)", - vr: "SQ", - vm: "1", - name: "BiPlaneAcquisitionSequence", - }, - "(0028,6010)": { - tag: "(0028,6010)", - vr: "US", - vm: "1", - name: "RepresentativeFrameNumber", - }, - "(0028,6020)": { - tag: "(0028,6020)", - vr: "US", - vm: "1-n", - name: "FrameNumbersOfInterest", - }, - "(0028,6022)": { - tag: "(0028,6022)", - vr: "LO", - vm: "1-n", - name: "FrameOfInterestDescription", - }, - "(0028,6023)": { - tag: "(0028,6023)", - vr: "CS", - vm: "1-n", - name: "FrameOfInterestType", - }, - "(0028,6030)": { - tag: "(0028,6030)", - vr: "US", - vm: "1-n", - name: "MaskPointers", - }, - "(0028,6040)": { - tag: "(0028,6040)", - vr: "US", - vm: "1-n", - name: "RWavePointer", - }, - "(0028,6100)": { - tag: "(0028,6100)", - vr: "SQ", - vm: "1", - name: "MaskSubtractionSequence", - }, - "(0028,6101)": { - tag: "(0028,6101)", - vr: "CS", - vm: "1", - name: "MaskOperation", - }, - "(0028,6102)": { - tag: "(0028,6102)", - vr: "US", - vm: "2-2n", - name: "ApplicableFrameRange", - }, - "(0028,6110)": { - tag: "(0028,6110)", - vr: "US", - vm: "1-n", - name: "MaskFrameNumbers", - }, - "(0028,6112)": { - tag: "(0028,6112)", - vr: "US", - vm: "1", - name: "ContrastFrameAveraging", - }, - "(0028,6114)": { - tag: "(0028,6114)", - vr: "FL", - vm: "2", - name: "MaskSubPixelShift", - }, - "(0028,6120)": { tag: "(0028,6120)", vr: "SS", vm: "1", name: "TIDOffset" }, - "(0028,6190)": { - tag: "(0028,6190)", - vr: "ST", - vm: "1", - name: "MaskOperationExplanation", - }, - "(0028,7000)": { - tag: "(0028,7000)", - vr: "SQ", - vm: "1", - name: "EquipmentAdministratorSequence", - }, - "(0028,7001)": { - tag: "(0028,7001)", - vr: "US", - vm: "1", - name: "NumberOfDisplaySubsystems", - }, - "(0028,7002)": { - tag: "(0028,7002)", - vr: "US", - vm: "1", - name: "CurrentConfigurationID", - }, - "(0028,7003)": { - tag: "(0028,7003)", - vr: "US", - vm: "1", - name: "DisplaySubsystemID", - }, - "(0028,7004)": { - tag: "(0028,7004)", - vr: "SH", - vm: "1", - name: "DisplaySubsystemName", - }, - "(0028,7005)": { - tag: "(0028,7005)", - vr: "LO", - vm: "1", - name: "DisplaySubsystemDescription", - }, - "(0028,7006)": { - tag: "(0028,7006)", - vr: "CS", - vm: "1", - name: "SystemStatus", - }, - "(0028,7007)": { - tag: "(0028,7007)", - vr: "LO", - vm: "1", - name: "SystemStatusComment", - }, - "(0028,7008)": { - tag: "(0028,7008)", - vr: "SQ", - vm: "1", - name: "TargetLuminanceCharacteristicsSequence", - }, - "(0028,7009)": { - tag: "(0028,7009)", - vr: "US", - vm: "1", - name: "LuminanceCharacteristicsID", - }, - "(0028,700A)": { - tag: "(0028,700A)", - vr: "SQ", - vm: "1", - name: "DisplaySubsystemConfigurationSequence", - }, - "(0028,700B)": { - tag: "(0028,700B)", - vr: "US", - vm: "1", - name: "ConfigurationID", - }, - "(0028,700C)": { - tag: "(0028,700C)", - vr: "SH", - vm: "1", - name: "ConfigurationName", - }, - "(0028,700D)": { - tag: "(0028,700D)", - vr: "LO", - vm: "1", - name: "ConfigurationDescription", - }, - "(0028,700E)": { - tag: "(0028,700E)", - vr: "US", - vm: "1", - name: "ReferencedTargetLuminanceCharacteristicsID", - }, - "(0028,700F)": { - tag: "(0028,700F)", - vr: "SQ", - vm: "1", - name: "QAResultsSequence", - }, - "(0028,7010)": { - tag: "(0028,7010)", - vr: "SQ", - vm: "1", - name: "DisplaySubsystemQAResultsSequence", - }, - "(0028,7011)": { - tag: "(0028,7011)", - vr: "SQ", - vm: "1", - name: "ConfigurationQAResultsSequence", - }, - "(0028,7012)": { - tag: "(0028,7012)", - vr: "SQ", - vm: "1", - name: "MeasurementEquipmentSequence", - }, - "(0028,7013)": { - tag: "(0028,7013)", - vr: "CS", - vm: "1-n", - name: "MeasurementFunctions", - }, - "(0028,7014)": { - tag: "(0028,7014)", - vr: "CS", - vm: "1", - name: "MeasurementEquipmentType", - }, - "(0028,7015)": { - tag: "(0028,7015)", - vr: "SQ", - vm: "1", - name: "VisualEvaluationResultSequence", - }, - "(0028,7016)": { - tag: "(0028,7016)", - vr: "SQ", - vm: "1", - name: "DisplayCalibrationResultSequence", - }, - "(0028,7017)": { tag: "(0028,7017)", vr: "US", vm: "1", name: "DDLValue" }, - "(0028,7018)": { - tag: "(0028,7018)", - vr: "FL", - vm: "2", - name: "CIExyWhitePoint", - }, - "(0028,7019)": { - tag: "(0028,7019)", - vr: "CS", - vm: "1", - name: "DisplayFunctionType", - }, - "(0028,701A)": { tag: "(0028,701A)", vr: "FL", vm: "1", name: "GammaValue" }, - "(0028,701B)": { - tag: "(0028,701B)", - vr: "US", - vm: "1", - name: "NumberOfLuminancePoints", - }, - "(0028,701C)": { - tag: "(0028,701C)", - vr: "SQ", - vm: "1", - name: "LuminanceResponseSequence", - }, - "(0028,701D)": { - tag: "(0028,701D)", - vr: "FL", - vm: "1", - name: "TargetMinimumLuminance", - }, - "(0028,701E)": { - tag: "(0028,701E)", - vr: "FL", - vm: "1", - name: "TargetMaximumLuminance", - }, - "(0028,701F)": { - tag: "(0028,701F)", - vr: "FL", - vm: "1", - name: "LuminanceValue", - }, - "(0028,7020)": { - tag: "(0028,7020)", - vr: "LO", - vm: "1", - name: "LuminanceResponseDescription", - }, - "(0028,7021)": { - tag: "(0028,7021)", - vr: "CS", - vm: "1", - name: "WhitePointFlag", - }, - "(0028,7022)": { - tag: "(0028,7022)", - vr: "SQ", - vm: "1", - name: "DisplayDeviceTypeCodeSequence", - }, - "(0028,7023)": { - tag: "(0028,7023)", - vr: "SQ", - vm: "1", - name: "DisplaySubsystemSequence", - }, - "(0028,7024)": { - tag: "(0028,7024)", - vr: "SQ", - vm: "1", - name: "LuminanceResultSequence", - }, - "(0028,7025)": { - tag: "(0028,7025)", - vr: "CS", - vm: "1", - name: "AmbientLightValueSource", - }, - "(0028,7026)": { - tag: "(0028,7026)", - vr: "CS", - vm: "1-n", - name: "MeasuredCharacteristics", - }, - "(0028,7027)": { - tag: "(0028,7027)", - vr: "SQ", - vm: "1", - name: "LuminanceUniformityResultSequence", - }, - "(0028,7028)": { - tag: "(0028,7028)", - vr: "SQ", - vm: "1", - name: "VisualEvaluationTestSequence", - }, - "(0028,7029)": { tag: "(0028,7029)", vr: "CS", vm: "1", name: "TestResult" }, - "(0028,702A)": { - tag: "(0028,702A)", - vr: "LO", - vm: "1", - name: "TestResultComment", - }, - "(0028,702B)": { - tag: "(0028,702B)", - vr: "CS", - vm: "1", - name: "TestImageValidation", - }, - "(0028,702C)": { - tag: "(0028,702C)", - vr: "SQ", - vm: "1", - name: "TestPatternCodeSequence", - }, - "(0028,702D)": { - tag: "(0028,702D)", - vr: "SQ", - vm: "1", - name: "MeasurementPatternCodeSequence", - }, - "(0028,702E)": { - tag: "(0028,702E)", - vr: "SQ", - vm: "1", - name: "VisualEvaluationMethodCodeSequence", - }, - "(0028,7FE0)": { - tag: "(0028,7FE0)", - vr: "UR", - vm: "1", - name: "PixelDataProviderURL", - }, - "(0028,9001)": { - tag: "(0028,9001)", - vr: "UL", - vm: "1", - name: "DataPointRows", - }, - "(0028,9002)": { - tag: "(0028,9002)", - vr: "UL", - vm: "1", - name: "DataPointColumns", - }, - "(0028,9003)": { - tag: "(0028,9003)", - vr: "CS", - vm: "1", - name: "SignalDomainColumns", - }, - "(0028,9099)": { - tag: "(0028,9099)", - vr: "US", - vm: "1", - name: "LargestMonochromePixelValue", - }, - "(0028,9108)": { - tag: "(0028,9108)", - vr: "CS", - vm: "1", - name: "DataRepresentation", - }, - "(0028,9110)": { - tag: "(0028,9110)", - vr: "SQ", - vm: "1", - name: "PixelMeasuresSequence", - }, - "(0028,9132)": { - tag: "(0028,9132)", - vr: "SQ", - vm: "1", - name: "FrameVOILUTSequence", - }, - "(0028,9145)": { - tag: "(0028,9145)", - vr: "SQ", - vm: "1", - name: "PixelValueTransformationSequence", - }, - "(0028,9235)": { - tag: "(0028,9235)", - vr: "CS", - vm: "1", - name: "SignalDomainRows", - }, - "(0028,9411)": { - tag: "(0028,9411)", - vr: "FL", - vm: "1", - name: "DisplayFilterPercentage", - }, - "(0028,9415)": { - tag: "(0028,9415)", - vr: "SQ", - vm: "1", - name: "FramePixelShiftSequence", - }, - "(0028,9416)": { - tag: "(0028,9416)", - vr: "US", - vm: "1", - name: "SubtractionItemID", - }, - "(0028,9422)": { - tag: "(0028,9422)", - vr: "SQ", - vm: "1", - name: "PixelIntensityRelationshipLUTSequence", - }, - "(0028,9443)": { - tag: "(0028,9443)", - vr: "SQ", - vm: "1", - name: "FramePixelDataPropertiesSequence", - }, - "(0028,9444)": { - tag: "(0028,9444)", - vr: "CS", - vm: "1", - name: "GeometricalProperties", - }, - "(0028,9445)": { - tag: "(0028,9445)", - vr: "FL", - vm: "1", - name: "GeometricMaximumDistortion", - }, - "(0028,9446)": { - tag: "(0028,9446)", - vr: "CS", - vm: "1-n", - name: "ImageProcessingApplied", - }, - "(0028,9454)": { - tag: "(0028,9454)", - vr: "CS", - vm: "1", - name: "MaskSelectionMode", - }, - "(0028,9474)": { tag: "(0028,9474)", vr: "CS", vm: "1", name: "LUTFunction" }, - "(0028,9478)": { - tag: "(0028,9478)", - vr: "FL", - vm: "1", - name: "MaskVisibilityPercentage", - }, - "(0028,9501)": { - tag: "(0028,9501)", - vr: "SQ", - vm: "1", - name: "PixelShiftSequence", - }, - "(0028,9502)": { - tag: "(0028,9502)", - vr: "SQ", - vm: "1", - name: "RegionPixelShiftSequence", - }, - "(0028,9503)": { - tag: "(0028,9503)", - vr: "SS", - vm: "2-2n", - name: "VerticesOfTheRegion", - }, - "(0028,9505)": { - tag: "(0028,9505)", - vr: "SQ", - vm: "1", - name: "MultiFramePresentationSequence", - }, - "(0028,9506)": { - tag: "(0028,9506)", - vr: "US", - vm: "2-2n", - name: "PixelShiftFrameRange", - }, - "(0028,9507)": { - tag: "(0028,9507)", - vr: "US", - vm: "2-2n", - name: "LUTFrameRange", - }, - "(0028,9520)": { - tag: "(0028,9520)", - vr: "DS", - vm: "16", - name: "ImageToEquipmentMappingMatrix", - }, - "(0028,9537)": { - tag: "(0028,9537)", - vr: "CS", - vm: "1", - name: "EquipmentCoordinateSystemIdentification", - }, - "(0032,000A)": { - tag: "(0032,000A)", - vr: "CS", - vm: "1", - name: "StudyStatusID", - }, - "(0032,000C)": { - tag: "(0032,000C)", - vr: "CS", - vm: "1", - name: "StudyPriorityID", - }, - "(0032,0012)": { - tag: "(0032,0012)", - vr: "LO", - vm: "1", - name: "StudyIDIssuer", - }, - "(0032,0032)": { - tag: "(0032,0032)", - vr: "DA", - vm: "1", - name: "StudyVerifiedDate", - }, - "(0032,0033)": { - tag: "(0032,0033)", - vr: "TM", - vm: "1", - name: "StudyVerifiedTime", - }, - "(0032,0034)": { - tag: "(0032,0034)", - vr: "DA", - vm: "1", - name: "StudyReadDate", - }, - "(0032,0035)": { - tag: "(0032,0035)", - vr: "TM", - vm: "1", - name: "StudyReadTime", - }, - "(0032,1000)": { - tag: "(0032,1000)", - vr: "DA", - vm: "1", - name: "ScheduledStudyStartDate", - }, - "(0032,1001)": { - tag: "(0032,1001)", - vr: "TM", - vm: "1", - name: "ScheduledStudyStartTime", - }, - "(0032,1010)": { - tag: "(0032,1010)", - vr: "DA", - vm: "1", - name: "ScheduledStudyStopDate", - }, - "(0032,1011)": { - tag: "(0032,1011)", - vr: "TM", - vm: "1", - name: "ScheduledStudyStopTime", - }, - "(0032,1020)": { - tag: "(0032,1020)", - vr: "LO", - vm: "1", - name: "ScheduledStudyLocation", - }, - "(0032,1021)": { - tag: "(0032,1021)", - vr: "AE", - vm: "1-n", - name: "ScheduledStudyLocationAETitle", - }, - "(0032,1030)": { - tag: "(0032,1030)", - vr: "LO", - vm: "1", - name: "ReasonForStudy", - }, - "(0032,1031)": { - tag: "(0032,1031)", - vr: "SQ", - vm: "1", - name: "RequestingPhysicianIdentificationSequence", - }, - "(0032,1032)": { - tag: "(0032,1032)", - vr: "PN", - vm: "1", - name: "RequestingPhysician", - }, - "(0032,1033)": { - tag: "(0032,1033)", - vr: "LO", - vm: "1", - name: "RequestingService", - }, - "(0032,1034)": { - tag: "(0032,1034)", - vr: "SQ", - vm: "1", - name: "RequestingServiceCodeSequence", - }, - "(0032,1040)": { - tag: "(0032,1040)", - vr: "DA", - vm: "1", - name: "StudyArrivalDate", - }, - "(0032,1041)": { - tag: "(0032,1041)", - vr: "TM", - vm: "1", - name: "StudyArrivalTime", - }, - "(0032,1050)": { - tag: "(0032,1050)", - vr: "DA", - vm: "1", - name: "StudyCompletionDate", - }, - "(0032,1051)": { - tag: "(0032,1051)", - vr: "TM", - vm: "1", - name: "StudyCompletionTime", - }, - "(0032,1055)": { - tag: "(0032,1055)", - vr: "CS", - vm: "1", - name: "StudyComponentStatusID", - }, - "(0032,1060)": { - tag: "(0032,1060)", - vr: "LO", - vm: "1", - name: "RequestedProcedureDescription", - }, - "(0032,1064)": { - tag: "(0032,1064)", - vr: "SQ", - vm: "1", - name: "RequestedProcedureCodeSequence", - }, - "(0032,1065)": { - tag: "(0032,1065)", - vr: "SQ", - vm: "1", - name: "RequestedLateralityCodeSequence", - }, - "(0032,1066)": { - tag: "(0032,1066)", - vr: "UT", - vm: "1", - name: "ReasonForVisit", - }, - "(0032,1067)": { - tag: "(0032,1067)", - vr: "SQ", - vm: "1", - name: "ReasonForVisitCodeSequence", - }, - "(0032,1070)": { - tag: "(0032,1070)", - vr: "LO", - vm: "1", - name: "RequestedContrastAgent", - }, - "(0032,4000)": { - tag: "(0032,4000)", - vr: "LT", - vm: "1", - name: "StudyComments", - }, - "(0034,0001)": { - tag: "(0034,0001)", - vr: "SQ", - vm: "1", - name: "FlowIdentifierSequence", - }, - "(0034,0002)": { - tag: "(0034,0002)", - vr: "OB", - vm: "1", - name: "FlowIdentifier", - }, - "(0034,0003)": { - tag: "(0034,0003)", - vr: "UI", - vm: "1", - name: "FlowTransferSyntaxUID", - }, - "(0034,0004)": { - tag: "(0034,0004)", - vr: "UL", - vm: "1", - name: "FlowRTPSamplingRate", - }, - "(0034,0005)": { - tag: "(0034,0005)", - vr: "OB", - vm: "1", - name: "SourceIdentifier", - }, - "(0034,0007)": { - tag: "(0034,0007)", - vr: "OB", - vm: "1", - name: "FrameOriginTimestamp", - }, - "(0034,0008)": { - tag: "(0034,0008)", - vr: "CS", - vm: "1", - name: "IncludesImagingSubject", - }, - "(0034,0009)": { - tag: "(0034,0009)", - vr: "SQ", - vm: "1", - name: "FrameUsefulnessGroupSequence", - }, - "(0034,000A)": { - tag: "(0034,000A)", - vr: "SQ", - vm: "1", - name: "RealTimeBulkDataFlowSequence", - }, - "(0034,000B)": { - tag: "(0034,000B)", - vr: "SQ", - vm: "1", - name: "CameraPositionGroupSequence", - }, - "(0034,000C)": { - tag: "(0034,000C)", - vr: "CS", - vm: "1", - name: "IncludesInformation", - }, - "(0034,000D)": { - tag: "(0034,000D)", - vr: "SQ", - vm: "1", - name: "TimeOfFrameGroupSequence", - }, - "(0038,0004)": { - tag: "(0038,0004)", - vr: "SQ", - vm: "1", - name: "ReferencedPatientAliasSequence", - }, - "(0038,0008)": { - tag: "(0038,0008)", - vr: "CS", - vm: "1", - name: "VisitStatusID", - }, - "(0038,0010)": { tag: "(0038,0010)", vr: "LO", vm: "1", name: "AdmissionID" }, - "(0038,0011)": { - tag: "(0038,0011)", - vr: "LO", - vm: "1", - name: "IssuerOfAdmissionID", - }, - "(0038,0014)": { - tag: "(0038,0014)", - vr: "SQ", - vm: "1", - name: "IssuerOfAdmissionIDSequence", - }, - "(0038,0016)": { - tag: "(0038,0016)", - vr: "LO", - vm: "1", - name: "RouteOfAdmissions", - }, - "(0038,001A)": { - tag: "(0038,001A)", - vr: "DA", - vm: "1", - name: "ScheduledAdmissionDate", - }, - "(0038,001B)": { - tag: "(0038,001B)", - vr: "TM", - vm: "1", - name: "ScheduledAdmissionTime", - }, - "(0038,001C)": { - tag: "(0038,001C)", - vr: "DA", - vm: "1", - name: "ScheduledDischargeDate", - }, - "(0038,001D)": { - tag: "(0038,001D)", - vr: "TM", - vm: "1", - name: "ScheduledDischargeTime", - }, - "(0038,001E)": { - tag: "(0038,001E)", - vr: "LO", - vm: "1", - name: "ScheduledPatientInstitutionResidence", - }, - "(0038,0020)": { - tag: "(0038,0020)", - vr: "DA", - vm: "1", - name: "AdmittingDate", - }, - "(0038,0021)": { - tag: "(0038,0021)", - vr: "TM", - vm: "1", - name: "AdmittingTime", - }, - "(0038,0030)": { - tag: "(0038,0030)", - vr: "DA", - vm: "1", - name: "DischargeDate", - }, - "(0038,0032)": { - tag: "(0038,0032)", - vr: "TM", - vm: "1", - name: "DischargeTime", - }, - "(0038,0040)": { - tag: "(0038,0040)", - vr: "LO", - vm: "1", - name: "DischargeDiagnosisDescription", - }, - "(0038,0044)": { - tag: "(0038,0044)", - vr: "SQ", - vm: "1", - name: "DischargeDiagnosisCodeSequence", - }, - "(0038,0050)": { - tag: "(0038,0050)", - vr: "LO", - vm: "1", - name: "SpecialNeeds", - }, - "(0038,0060)": { - tag: "(0038,0060)", - vr: "LO", - vm: "1", - name: "ServiceEpisodeID", - }, - "(0038,0061)": { - tag: "(0038,0061)", - vr: "LO", - vm: "1", - name: "IssuerOfServiceEpisodeID", - }, - "(0038,0062)": { - tag: "(0038,0062)", - vr: "LO", - vm: "1", - name: "ServiceEpisodeDescription", - }, - "(0038,0064)": { - tag: "(0038,0064)", - vr: "SQ", - vm: "1", - name: "IssuerOfServiceEpisodeIDSequence", - }, - "(0038,0100)": { - tag: "(0038,0100)", - vr: "SQ", - vm: "1", - name: "PertinentDocumentsSequence", - }, - "(0038,0101)": { - tag: "(0038,0101)", - vr: "SQ", - vm: "1", - name: "PertinentResourcesSequence", - }, - "(0038,0102)": { - tag: "(0038,0102)", - vr: "LO", - vm: "1", - name: "ResourceDescription", - }, - "(0038,0300)": { - tag: "(0038,0300)", - vr: "LO", - vm: "1", - name: "CurrentPatientLocation", - }, - "(0038,0400)": { - tag: "(0038,0400)", - vr: "LO", - vm: "1", - name: "PatientInstitutionResidence", - }, - "(0038,0500)": { - tag: "(0038,0500)", - vr: "LO", - vm: "1", - name: "PatientState", - }, - "(0038,0502)": { - tag: "(0038,0502)", - vr: "SQ", - vm: "1", - name: "PatientClinicalTrialParticipationSequence", - }, - "(0038,4000)": { - tag: "(0038,4000)", - vr: "LT", - vm: "1", - name: "VisitComments", - }, - "(003A,0004)": { - tag: "(003A,0004)", - vr: "CS", - vm: "1", - name: "WaveformOriginality", - }, - "(003A,0005)": { - tag: "(003A,0005)", - vr: "US", - vm: "1", - name: "NumberOfWaveformChannels", - }, - "(003A,0010)": { - tag: "(003A,0010)", - vr: "UL", - vm: "1", - name: "NumberOfWaveformSamples", - }, - "(003A,001A)": { - tag: "(003A,001A)", - vr: "DS", - vm: "1", - name: "SamplingFrequency", - }, - "(003A,0020)": { - tag: "(003A,0020)", - vr: "SH", - vm: "1", - name: "MultiplexGroupLabel", - }, - "(003A,0200)": { - tag: "(003A,0200)", - vr: "SQ", - vm: "1", - name: "ChannelDefinitionSequence", - }, - "(003A,0202)": { - tag: "(003A,0202)", - vr: "IS", - vm: "1", - name: "WaveformChannelNumber", - }, - "(003A,0203)": { - tag: "(003A,0203)", - vr: "SH", - vm: "1", - name: "ChannelLabel", - }, - "(003A,0205)": { - tag: "(003A,0205)", - vr: "CS", - vm: "1-n", - name: "ChannelStatus", - }, - "(003A,0208)": { - tag: "(003A,0208)", - vr: "SQ", - vm: "1", - name: "ChannelSourceSequence", - }, - "(003A,0209)": { - tag: "(003A,0209)", - vr: "SQ", - vm: "1", - name: "ChannelSourceModifiersSequence", - }, - "(003A,020A)": { - tag: "(003A,020A)", - vr: "SQ", - vm: "1", - name: "SourceWaveformSequence", - }, - "(003A,020C)": { - tag: "(003A,020C)", - vr: "LO", - vm: "1", - name: "ChannelDerivationDescription", - }, - "(003A,0210)": { - tag: "(003A,0210)", - vr: "DS", - vm: "1", - name: "ChannelSensitivity", - }, - "(003A,0211)": { - tag: "(003A,0211)", - vr: "SQ", - vm: "1", - name: "ChannelSensitivityUnitsSequence", - }, - "(003A,0212)": { - tag: "(003A,0212)", - vr: "DS", - vm: "1", - name: "ChannelSensitivityCorrectionFactor", - }, - "(003A,0213)": { - tag: "(003A,0213)", - vr: "DS", - vm: "1", - name: "ChannelBaseline", - }, - "(003A,0214)": { - tag: "(003A,0214)", - vr: "DS", - vm: "1", - name: "ChannelTimeSkew", - }, - "(003A,0215)": { - tag: "(003A,0215)", - vr: "DS", - vm: "1", - name: "ChannelSampleSkew", - }, - "(003A,0218)": { - tag: "(003A,0218)", - vr: "DS", - vm: "1", - name: "ChannelOffset", - }, - "(003A,021A)": { - tag: "(003A,021A)", - vr: "US", - vm: "1", - name: "WaveformBitsStored", - }, - "(003A,0220)": { - tag: "(003A,0220)", - vr: "DS", - vm: "1", - name: "FilterLowFrequency", - }, - "(003A,0221)": { - tag: "(003A,0221)", - vr: "DS", - vm: "1", - name: "FilterHighFrequency", - }, - "(003A,0222)": { - tag: "(003A,0222)", - vr: "DS", - vm: "1", - name: "NotchFilterFrequency", - }, - "(003A,0223)": { - tag: "(003A,0223)", - vr: "DS", - vm: "1", - name: "NotchFilterBandwidth", - }, - "(003A,0230)": { - tag: "(003A,0230)", - vr: "FL", - vm: "1", - name: "WaveformDataDisplayScale", - }, - "(003A,0231)": { - tag: "(003A,0231)", - vr: "US", - vm: "3", - name: "WaveformDisplayBackgroundCIELabValue", - }, - "(003A,0240)": { - tag: "(003A,0240)", - vr: "SQ", - vm: "1", - name: "WaveformPresentationGroupSequence", - }, - "(003A,0241)": { - tag: "(003A,0241)", - vr: "US", - vm: "1", - name: "PresentationGroupNumber", - }, - "(003A,0242)": { - tag: "(003A,0242)", - vr: "SQ", - vm: "1", - name: "ChannelDisplaySequence", - }, - "(003A,0244)": { - tag: "(003A,0244)", - vr: "US", - vm: "3", - name: "ChannelRecommendedDisplayCIELabValue", - }, - "(003A,0245)": { - tag: "(003A,0245)", - vr: "FL", - vm: "1", - name: "ChannelPosition", - }, - "(003A,0246)": { - tag: "(003A,0246)", - vr: "CS", - vm: "1", - name: "DisplayShadingFlag", - }, - "(003A,0247)": { - tag: "(003A,0247)", - vr: "FL", - vm: "1", - name: "FractionalChannelDisplayScale", - }, - "(003A,0248)": { - tag: "(003A,0248)", - vr: "FL", - vm: "1", - name: "AbsoluteChannelDisplayScale", - }, - "(003A,0300)": { - tag: "(003A,0300)", - vr: "SQ", - vm: "1", - name: "MultiplexedAudioChannelsDescriptionCodeSequence", - }, - "(003A,0301)": { - tag: "(003A,0301)", - vr: "IS", - vm: "1", - name: "ChannelIdentificationCode", - }, - "(003A,0302)": { tag: "(003A,0302)", vr: "CS", vm: "1", name: "ChannelMode" }, - "(003A,0310)": { - tag: "(003A,0310)", - vr: "UI", - vm: "1", - name: "MultiplexGroupUID", - }, - "(003A,0311)": { - tag: "(003A,0311)", - vr: "DS", - vm: "1", - name: "PowerlineFrequency", - }, - "(003A,0312)": { - tag: "(003A,0312)", - vr: "SQ", - vm: "1", - name: "ChannelImpedanceSequence", - }, - "(003A,0313)": { - tag: "(003A,0313)", - vr: "DS", - vm: "1", - name: "ImpedanceValue", - }, - "(003A,0314)": { - tag: "(003A,0314)", - vr: "DT", - vm: "1", - name: "ImpedanceMeasurementDateTime", - }, - "(003A,0315)": { - tag: "(003A,0315)", - vr: "DS", - vm: "1", - name: "ImpedanceMeasurementFrequency", - }, - "(003A,0316)": { - tag: "(003A,0316)", - vr: "CS", - vm: "1", - name: "ImpedanceMeasurementCurrentType", - }, - "(0040,0001)": { - tag: "(0040,0001)", - vr: "AE", - vm: "1-n", - name: "ScheduledStationAETitle", - }, - "(0040,0002)": { - tag: "(0040,0002)", - vr: "DA", - vm: "1", - name: "ScheduledProcedureStepStartDate", - }, - "(0040,0003)": { - tag: "(0040,0003)", - vr: "TM", - vm: "1", - name: "ScheduledProcedureStepStartTime", - }, - "(0040,0004)": { - tag: "(0040,0004)", - vr: "DA", - vm: "1", - name: "ScheduledProcedureStepEndDate", - }, - "(0040,0005)": { - tag: "(0040,0005)", - vr: "TM", - vm: "1", - name: "ScheduledProcedureStepEndTime", - }, - "(0040,0006)": { - tag: "(0040,0006)", - vr: "PN", - vm: "1", - name: "ScheduledPerformingPhysicianName", - }, - "(0040,0007)": { - tag: "(0040,0007)", - vr: "LO", - vm: "1", - name: "ScheduledProcedureStepDescription", - }, - "(0040,0008)": { - tag: "(0040,0008)", - vr: "SQ", - vm: "1", - name: "ScheduledProtocolCodeSequence", - }, - "(0040,0009)": { - tag: "(0040,0009)", - vr: "SH", - vm: "1", - name: "ScheduledProcedureStepID", - }, - "(0040,000A)": { - tag: "(0040,000A)", - vr: "SQ", - vm: "1", - name: "StageCodeSequence", - }, - "(0040,000B)": { - tag: "(0040,000B)", - vr: "SQ", - vm: "1", - name: "ScheduledPerformingPhysicianIdentificationSequence", - }, - "(0040,0010)": { - tag: "(0040,0010)", - vr: "SH", - vm: "1-n", - name: "ScheduledStationName", - }, - "(0040,0011)": { - tag: "(0040,0011)", - vr: "SH", - vm: "1", - name: "ScheduledProcedureStepLocation", - }, - "(0040,0012)": { - tag: "(0040,0012)", - vr: "LO", - vm: "1", - name: "PreMedication", - }, - "(0040,0020)": { - tag: "(0040,0020)", - vr: "CS", - vm: "1", - name: "ScheduledProcedureStepStatus", - }, - "(0040,0026)": { - tag: "(0040,0026)", - vr: "SQ", - vm: "1", - name: "OrderPlacerIdentifierSequence", - }, - "(0040,0027)": { - tag: "(0040,0027)", - vr: "SQ", - vm: "1", - name: "OrderFillerIdentifierSequence", - }, - "(0040,0031)": { - tag: "(0040,0031)", - vr: "UT", - vm: "1", - name: "LocalNamespaceEntityID", - }, - "(0040,0032)": { - tag: "(0040,0032)", - vr: "UT", - vm: "1", - name: "UniversalEntityID", - }, - "(0040,0033)": { - tag: "(0040,0033)", - vr: "CS", - vm: "1", - name: "UniversalEntityIDType", - }, - "(0040,0035)": { - tag: "(0040,0035)", - vr: "CS", - vm: "1", - name: "IdentifierTypeCode", - }, - "(0040,0036)": { - tag: "(0040,0036)", - vr: "SQ", - vm: "1", - name: "AssigningFacilitySequence", - }, - "(0040,0039)": { - tag: "(0040,0039)", - vr: "SQ", - vm: "1", - name: "AssigningJurisdictionCodeSequence", - }, - "(0040,003A)": { - tag: "(0040,003A)", - vr: "SQ", - vm: "1", - name: "AssigningAgencyOrDepartmentCodeSequence", - }, - "(0040,0100)": { - tag: "(0040,0100)", - vr: "SQ", - vm: "1", - name: "ScheduledProcedureStepSequence", - }, - "(0040,0220)": { - tag: "(0040,0220)", - vr: "SQ", - vm: "1", - name: "ReferencedNonImageCompositeSOPInstanceSequence", - }, - "(0040,0241)": { - tag: "(0040,0241)", - vr: "AE", - vm: "1", - name: "PerformedStationAETitle", - }, - "(0040,0242)": { - tag: "(0040,0242)", - vr: "SH", - vm: "1", - name: "PerformedStationName", - }, - "(0040,0243)": { - tag: "(0040,0243)", - vr: "SH", - vm: "1", - name: "PerformedLocation", - }, - "(0040,0244)": { - tag: "(0040,0244)", - vr: "DA", - vm: "1", - name: "PerformedProcedureStepStartDate", - }, - "(0040,0245)": { - tag: "(0040,0245)", - vr: "TM", - vm: "1", - name: "PerformedProcedureStepStartTime", - }, - "(0040,0250)": { - tag: "(0040,0250)", - vr: "DA", - vm: "1", - name: "PerformedProcedureStepEndDate", - }, - "(0040,0251)": { - tag: "(0040,0251)", - vr: "TM", - vm: "1", - name: "PerformedProcedureStepEndTime", - }, - "(0040,0252)": { - tag: "(0040,0252)", - vr: "CS", - vm: "1", - name: "PerformedProcedureStepStatus", - }, - "(0040,0253)": { - tag: "(0040,0253)", - vr: "SH", - vm: "1", - name: "PerformedProcedureStepID", - }, - "(0040,0254)": { - tag: "(0040,0254)", - vr: "LO", - vm: "1", - name: "PerformedProcedureStepDescription", - }, - "(0040,0255)": { - tag: "(0040,0255)", - vr: "LO", - vm: "1", - name: "PerformedProcedureTypeDescription", - }, - "(0040,0260)": { - tag: "(0040,0260)", - vr: "SQ", - vm: "1", - name: "PerformedProtocolCodeSequence", - }, - "(0040,0261)": { - tag: "(0040,0261)", - vr: "CS", - vm: "1", - name: "PerformedProtocolType", - }, - "(0040,0270)": { - tag: "(0040,0270)", - vr: "SQ", - vm: "1", - name: "ScheduledStepAttributesSequence", - }, - "(0040,0275)": { - tag: "(0040,0275)", - vr: "SQ", - vm: "1", - name: "RequestAttributesSequence", - }, - "(0040,0280)": { - tag: "(0040,0280)", - vr: "ST", - vm: "1", - name: "CommentsOnThePerformedProcedureStep", - }, - "(0040,0281)": { - tag: "(0040,0281)", - vr: "SQ", - vm: "1", - name: "PerformedProcedureStepDiscontinuationReasonCodeSequence", - }, - "(0040,0293)": { - tag: "(0040,0293)", - vr: "SQ", - vm: "1", - name: "QuantitySequence", - }, - "(0040,0294)": { tag: "(0040,0294)", vr: "DS", vm: "1", name: "Quantity" }, - "(0040,0295)": { - tag: "(0040,0295)", - vr: "SQ", - vm: "1", - name: "MeasuringUnitsSequence", - }, - "(0040,0296)": { - tag: "(0040,0296)", - vr: "SQ", - vm: "1", - name: "BillingItemSequence", - }, - "(0040,0300)": { - tag: "(0040,0300)", - vr: "US", - vm: "1", - name: "TotalTimeOfFluoroscopy", - }, - "(0040,0301)": { - tag: "(0040,0301)", - vr: "US", - vm: "1", - name: "TotalNumberOfExposures", - }, - "(0040,0302)": { - tag: "(0040,0302)", - vr: "US", - vm: "1", - name: "EntranceDose", - }, - "(0040,0303)": { - tag: "(0040,0303)", - vr: "US", - vm: "1-2", - name: "ExposedArea", - }, - "(0040,0306)": { - tag: "(0040,0306)", - vr: "DS", - vm: "1", - name: "DistanceSourceToEntrance", - }, - "(0040,0307)": { - tag: "(0040,0307)", - vr: "DS", - vm: "1", - name: "DistanceSourceToSupport", - }, - "(0040,030E)": { - tag: "(0040,030E)", - vr: "SQ", - vm: "1", - name: "ExposureDoseSequence", - }, - "(0040,0310)": { - tag: "(0040,0310)", - vr: "ST", - vm: "1", - name: "CommentsOnRadiationDose", - }, - "(0040,0312)": { tag: "(0040,0312)", vr: "DS", vm: "1", name: "XRayOutput" }, - "(0040,0314)": { - tag: "(0040,0314)", - vr: "DS", - vm: "1", - name: "HalfValueLayer", - }, - "(0040,0316)": { tag: "(0040,0316)", vr: "DS", vm: "1", name: "OrganDose" }, - "(0040,0318)": { - tag: "(0040,0318)", - vr: "CS", - vm: "1", - name: "OrganExposed", - }, - "(0040,0320)": { - tag: "(0040,0320)", - vr: "SQ", - vm: "1", - name: "BillingProcedureStepSequence", - }, - "(0040,0321)": { - tag: "(0040,0321)", - vr: "SQ", - vm: "1", - name: "FilmConsumptionSequence", - }, - "(0040,0324)": { - tag: "(0040,0324)", - vr: "SQ", - vm: "1", - name: "BillingSuppliesAndDevicesSequence", - }, - "(0040,0330)": { - tag: "(0040,0330)", - vr: "SQ", - vm: "1", - name: "ReferencedProcedureStepSequence", - }, - "(0040,0340)": { - tag: "(0040,0340)", - vr: "SQ", - vm: "1", - name: "PerformedSeriesSequence", - }, - "(0040,0400)": { - tag: "(0040,0400)", - vr: "LT", - vm: "1", - name: "CommentsOnTheScheduledProcedureStep", - }, - "(0040,0440)": { - tag: "(0040,0440)", - vr: "SQ", - vm: "1", - name: "ProtocolContextSequence", - }, - "(0040,0441)": { - tag: "(0040,0441)", - vr: "SQ", - vm: "1", - name: "ContentItemModifierSequence", - }, - "(0040,0500)": { - tag: "(0040,0500)", - vr: "SQ", - vm: "1", - name: "ScheduledSpecimenSequence", - }, - "(0040,050A)": { - tag: "(0040,050A)", - vr: "LO", - vm: "1", - name: "SpecimenAccessionNumber", - }, - "(0040,0512)": { - tag: "(0040,0512)", - vr: "LO", - vm: "1", - name: "ContainerIdentifier", - }, - "(0040,0513)": { - tag: "(0040,0513)", - vr: "SQ", - vm: "1", - name: "IssuerOfTheContainerIdentifierSequence", - }, - "(0040,0515)": { - tag: "(0040,0515)", - vr: "SQ", - vm: "1", - name: "AlternateContainerIdentifierSequence", - }, - "(0040,0518)": { - tag: "(0040,0518)", - vr: "SQ", - vm: "1", - name: "ContainerTypeCodeSequence", - }, - "(0040,051A)": { - tag: "(0040,051A)", - vr: "LO", - vm: "1", - name: "ContainerDescription", - }, - "(0040,0520)": { - tag: "(0040,0520)", - vr: "SQ", - vm: "1", - name: "ContainerComponentSequence", - }, - "(0040,0550)": { - tag: "(0040,0550)", - vr: "SQ", - vm: "1", - name: "SpecimenSequence", - }, - "(0040,0551)": { - tag: "(0040,0551)", - vr: "LO", - vm: "1", - name: "SpecimenIdentifier", - }, - "(0040,0552)": { - tag: "(0040,0552)", - vr: "SQ", - vm: "1", - name: "SpecimenDescriptionSequenceTrial", - }, - "(0040,0553)": { - tag: "(0040,0553)", - vr: "ST", - vm: "1", - name: "SpecimenDescriptionTrial", - }, - "(0040,0554)": { tag: "(0040,0554)", vr: "UI", vm: "1", name: "SpecimenUID" }, - "(0040,0555)": { - tag: "(0040,0555)", - vr: "SQ", - vm: "1", - name: "AcquisitionContextSequence", - }, - "(0040,0556)": { - tag: "(0040,0556)", - vr: "ST", - vm: "1", - name: "AcquisitionContextDescription", - }, - "(0040,0560)": { - tag: "(0040,0560)", - vr: "SQ", - vm: "1", - name: "SpecimenDescriptionSequence", - }, - "(0040,0562)": { - tag: "(0040,0562)", - vr: "SQ", - vm: "1", - name: "IssuerOfTheSpecimenIdentifierSequence", - }, - "(0040,059A)": { - tag: "(0040,059A)", - vr: "SQ", - vm: "1", - name: "SpecimenTypeCodeSequence", - }, - "(0040,0600)": { - tag: "(0040,0600)", - vr: "LO", - vm: "1", - name: "SpecimenShortDescription", - }, - "(0040,0602)": { - tag: "(0040,0602)", - vr: "UT", - vm: "1", - name: "SpecimenDetailedDescription", - }, - "(0040,0610)": { - tag: "(0040,0610)", - vr: "SQ", - vm: "1", - name: "SpecimenPreparationSequence", - }, - "(0040,0612)": { - tag: "(0040,0612)", - vr: "SQ", - vm: "1", - name: "SpecimenPreparationStepContentItemSequence", - }, - "(0040,0620)": { - tag: "(0040,0620)", - vr: "SQ", - vm: "1", - name: "SpecimenLocalizationContentItemSequence", - }, - "(0040,06FA)": { - tag: "(0040,06FA)", - vr: "LO", - vm: "1", - name: "SlideIdentifier", - }, - "(0040,0710)": { - tag: "(0040,0710)", - vr: "SQ", - vm: "1", - name: "WholeSlideMicroscopyImageFrameTypeSequence", - }, - "(0040,071A)": { - tag: "(0040,071A)", - vr: "SQ", - vm: "1", - name: "ImageCenterPointCoordinatesSequence", - }, - "(0040,072A)": { - tag: "(0040,072A)", - vr: "DS", - vm: "1", - name: "XOffsetInSlideCoordinateSystem", - }, - "(0040,073A)": { - tag: "(0040,073A)", - vr: "DS", - vm: "1", - name: "YOffsetInSlideCoordinateSystem", - }, - "(0040,074A)": { - tag: "(0040,074A)", - vr: "DS", - vm: "1", - name: "ZOffsetInSlideCoordinateSystem", - }, - "(0040,08D8)": { - tag: "(0040,08D8)", - vr: "SQ", - vm: "1", - name: "PixelSpacingSequence", - }, - "(0040,08DA)": { - tag: "(0040,08DA)", - vr: "SQ", - vm: "1", - name: "CoordinateSystemAxisCodeSequence", - }, - "(0040,08EA)": { - tag: "(0040,08EA)", - vr: "SQ", - vm: "1", - name: "MeasurementUnitsCodeSequence", - }, - "(0040,09F8)": { - tag: "(0040,09F8)", - vr: "SQ", - vm: "1", - name: "VitalStainCodeSequenceTrial", - }, - "(0040,1001)": { - tag: "(0040,1001)", - vr: "SH", - vm: "1", - name: "RequestedProcedureID", - }, - "(0040,1002)": { - tag: "(0040,1002)", - vr: "LO", - vm: "1", - name: "ReasonForTheRequestedProcedure", - }, - "(0040,1003)": { - tag: "(0040,1003)", - vr: "SH", - vm: "1", - name: "RequestedProcedurePriority", - }, - "(0040,1004)": { - tag: "(0040,1004)", - vr: "LO", - vm: "1", - name: "PatientTransportArrangements", - }, - "(0040,1005)": { - tag: "(0040,1005)", - vr: "LO", - vm: "1", - name: "RequestedProcedureLocation", - }, - "(0040,1006)": { - tag: "(0040,1006)", - vr: "SH", - vm: "1", - name: "PlacerOrderNumberProcedure", - }, - "(0040,1007)": { - tag: "(0040,1007)", - vr: "SH", - vm: "1", - name: "FillerOrderNumberProcedure", - }, - "(0040,1008)": { - tag: "(0040,1008)", - vr: "LO", - vm: "1", - name: "ConfidentialityCode", - }, - "(0040,1009)": { - tag: "(0040,1009)", - vr: "SH", - vm: "1", - name: "ReportingPriority", - }, - "(0040,100A)": { - tag: "(0040,100A)", - vr: "SQ", - vm: "1", - name: "ReasonForRequestedProcedureCodeSequence", - }, - "(0040,1010)": { - tag: "(0040,1010)", - vr: "PN", - vm: "1-n", - name: "NamesOfIntendedRecipientsOfResults", - }, - "(0040,1011)": { - tag: "(0040,1011)", - vr: "SQ", - vm: "1", - name: "IntendedRecipientsOfResultsIdentificationSequence", - }, - "(0040,1012)": { - tag: "(0040,1012)", - vr: "SQ", - vm: "1", - name: "ReasonForPerformedProcedureCodeSequence", - }, - "(0040,1060)": { - tag: "(0040,1060)", - vr: "LO", - vm: "1", - name: "RequestedProcedureDescriptionTrial", - }, - "(0040,1101)": { - tag: "(0040,1101)", - vr: "SQ", - vm: "1", - name: "PersonIdentificationCodeSequence", - }, - "(0040,1102)": { - tag: "(0040,1102)", - vr: "ST", - vm: "1", - name: "PersonAddress", - }, - "(0040,1103)": { - tag: "(0040,1103)", - vr: "LO", - vm: "1-n", - name: "PersonTelephoneNumbers", - }, - "(0040,1104)": { - tag: "(0040,1104)", - vr: "LT", - vm: "1", - name: "PersonTelecomInformation", - }, - "(0040,1400)": { - tag: "(0040,1400)", - vr: "LT", - vm: "1", - name: "RequestedProcedureComments", - }, - "(0040,2001)": { - tag: "(0040,2001)", - vr: "LO", - vm: "1", - name: "ReasonForTheImagingServiceRequest", - }, - "(0040,2004)": { - tag: "(0040,2004)", - vr: "DA", - vm: "1", - name: "IssueDateOfImagingServiceRequest", - }, - "(0040,2005)": { - tag: "(0040,2005)", - vr: "TM", - vm: "1", - name: "IssueTimeOfImagingServiceRequest", - }, - "(0040,2006)": { - tag: "(0040,2006)", - vr: "SH", - vm: "1", - name: "PlacerOrderNumberImagingServiceRequestRetired", - }, - "(0040,2007)": { - tag: "(0040,2007)", - vr: "SH", - vm: "1", - name: "FillerOrderNumberImagingServiceRequestRetired", - }, - "(0040,2008)": { - tag: "(0040,2008)", - vr: "PN", - vm: "1", - name: "OrderEnteredBy", - }, - "(0040,2009)": { - tag: "(0040,2009)", - vr: "SH", - vm: "1", - name: "OrderEntererLocation", - }, - "(0040,2010)": { - tag: "(0040,2010)", - vr: "SH", - vm: "1", - name: "OrderCallbackPhoneNumber", - }, - "(0040,2011)": { - tag: "(0040,2011)", - vr: "LT", - vm: "1", - name: "OrderCallbackTelecomInformation", - }, - "(0040,2016)": { - tag: "(0040,2016)", - vr: "LO", - vm: "1", - name: "PlacerOrderNumberImagingServiceRequest", - }, - "(0040,2017)": { - tag: "(0040,2017)", - vr: "LO", - vm: "1", - name: "FillerOrderNumberImagingServiceRequest", - }, - "(0040,2400)": { - tag: "(0040,2400)", - vr: "LT", - vm: "1", - name: "ImagingServiceRequestComments", - }, - "(0040,3001)": { - tag: "(0040,3001)", - vr: "LO", - vm: "1", - name: "ConfidentialityConstraintOnPatientDataDescription", - }, - "(0040,4001)": { - tag: "(0040,4001)", - vr: "CS", - vm: "1", - name: "GeneralPurposeScheduledProcedureStepStatus", - }, - "(0040,4002)": { - tag: "(0040,4002)", - vr: "CS", - vm: "1", - name: "GeneralPurposePerformedProcedureStepStatus", - }, - "(0040,4003)": { - tag: "(0040,4003)", - vr: "CS", - vm: "1", - name: "GeneralPurposeScheduledProcedureStepPriority", - }, - "(0040,4004)": { - tag: "(0040,4004)", - vr: "SQ", - vm: "1", - name: "ScheduledProcessingApplicationsCodeSequence", - }, - "(0040,4005)": { - tag: "(0040,4005)", - vr: "DT", - vm: "1", - name: "ScheduledProcedureStepStartDateTime", - }, - "(0040,4006)": { - tag: "(0040,4006)", - vr: "CS", - vm: "1", - name: "MultipleCopiesFlag", - }, - "(0040,4007)": { - tag: "(0040,4007)", - vr: "SQ", - vm: "1", - name: "PerformedProcessingApplicationsCodeSequence", - }, - "(0040,4008)": { - tag: "(0040,4008)", - vr: "DT", - vm: "1", - name: "ScheduledProcedureStepExpirationDateTime", - }, - "(0040,4009)": { - tag: "(0040,4009)", - vr: "SQ", - vm: "1", - name: "HumanPerformerCodeSequence", - }, - "(0040,4010)": { - tag: "(0040,4010)", - vr: "DT", - vm: "1", - name: "ScheduledProcedureStepModificationDateTime", - }, - "(0040,4011)": { - tag: "(0040,4011)", - vr: "DT", - vm: "1", - name: "ExpectedCompletionDateTime", - }, - "(0040,4015)": { - tag: "(0040,4015)", - vr: "SQ", - vm: "1", - name: "ResultingGeneralPurposePerformedProcedureStepsSequence", - }, - "(0040,4016)": { - tag: "(0040,4016)", - vr: "SQ", - vm: "1", - name: "ReferencedGeneralPurposeScheduledProcedureStepSequence", - }, - "(0040,4018)": { - tag: "(0040,4018)", - vr: "SQ", - vm: "1", - name: "ScheduledWorkitemCodeSequence", - }, - "(0040,4019)": { - tag: "(0040,4019)", - vr: "SQ", - vm: "1", - name: "PerformedWorkitemCodeSequence", - }, - "(0040,4020)": { - tag: "(0040,4020)", - vr: "CS", - vm: "1", - name: "InputAvailabilityFlag", - }, - "(0040,4021)": { - tag: "(0040,4021)", - vr: "SQ", - vm: "1", - name: "InputInformationSequence", - }, - "(0040,4022)": { - tag: "(0040,4022)", - vr: "SQ", - vm: "1", - name: "RelevantInformationSequence", - }, - "(0040,4023)": { - tag: "(0040,4023)", - vr: "UI", - vm: "1", - name: "ReferencedGeneralPurposeScheduledProcedureStepTransactionUID", - }, - "(0040,4025)": { - tag: "(0040,4025)", - vr: "SQ", - vm: "1", - name: "ScheduledStationNameCodeSequence", - }, - "(0040,4026)": { - tag: "(0040,4026)", - vr: "SQ", - vm: "1", - name: "ScheduledStationClassCodeSequence", - }, - "(0040,4027)": { - tag: "(0040,4027)", - vr: "SQ", - vm: "1", - name: "ScheduledStationGeographicLocationCodeSequence", - }, - "(0040,4028)": { - tag: "(0040,4028)", - vr: "SQ", - vm: "1", - name: "PerformedStationNameCodeSequence", - }, - "(0040,4029)": { - tag: "(0040,4029)", - vr: "SQ", - vm: "1", - name: "PerformedStationClassCodeSequence", - }, - "(0040,4030)": { - tag: "(0040,4030)", - vr: "SQ", - vm: "1", - name: "PerformedStationGeographicLocationCodeSequence", - }, - "(0040,4031)": { - tag: "(0040,4031)", - vr: "SQ", - vm: "1", - name: "RequestedSubsequentWorkitemCodeSequence", - }, - "(0040,4032)": { - tag: "(0040,4032)", - vr: "SQ", - vm: "1", - name: "NonDICOMOutputCodeSequence", - }, - "(0040,4033)": { - tag: "(0040,4033)", - vr: "SQ", - vm: "1", - name: "OutputInformationSequence", - }, - "(0040,4034)": { - tag: "(0040,4034)", - vr: "SQ", - vm: "1", - name: "ScheduledHumanPerformersSequence", - }, - "(0040,4035)": { - tag: "(0040,4035)", - vr: "SQ", - vm: "1", - name: "ActualHumanPerformersSequence", - }, - "(0040,4036)": { - tag: "(0040,4036)", - vr: "LO", - vm: "1", - name: "HumanPerformerOrganization", - }, - "(0040,4037)": { - tag: "(0040,4037)", - vr: "PN", - vm: "1", - name: "HumanPerformerName", - }, - "(0040,4040)": { - tag: "(0040,4040)", - vr: "CS", - vm: "1", - name: "RawDataHandling", - }, - "(0040,4041)": { - tag: "(0040,4041)", - vr: "CS", - vm: "1", - name: "InputReadinessState", - }, - "(0040,4050)": { - tag: "(0040,4050)", - vr: "DT", - vm: "1", - name: "PerformedProcedureStepStartDateTime", - }, - "(0040,4051)": { - tag: "(0040,4051)", - vr: "DT", - vm: "1", - name: "PerformedProcedureStepEndDateTime", - }, - "(0040,4052)": { - tag: "(0040,4052)", - vr: "DT", - vm: "1", - name: "ProcedureStepCancellationDateTime", - }, - "(0040,4070)": { - tag: "(0040,4070)", - vr: "SQ", - vm: "1", - name: "OutputDestinationSequence", - }, - "(0040,4071)": { - tag: "(0040,4071)", - vr: "SQ", - vm: "1", - name: "DICOMStorageSequence", - }, - "(0040,4072)": { - tag: "(0040,4072)", - vr: "SQ", - vm: "1", - name: "STOWRSStorageSequence", - }, - "(0040,4073)": { tag: "(0040,4073)", vr: "UR", vm: "1", name: "StorageURL" }, - "(0040,4074)": { - tag: "(0040,4074)", - vr: "SQ", - vm: "1", - name: "XDSStorageSequence", - }, - "(0040,8302)": { - tag: "(0040,8302)", - vr: "DS", - vm: "1", - name: "EntranceDoseInmGy", - }, - "(0040,8303)": { - tag: "(0040,8303)", - vr: "CS", - vm: "1", - name: "EntranceDoseDerivation", - }, - "(0040,9092)": { - tag: "(0040,9092)", - vr: "SQ", - vm: "1", - name: "ParametricMapFrameTypeSequence", - }, - "(0040,9094)": { - tag: "(0040,9094)", - vr: "SQ", - vm: "1", - name: "ReferencedImageRealWorldValueMappingSequence", - }, - "(0040,9096)": { - tag: "(0040,9096)", - vr: "SQ", - vm: "1", - name: "RealWorldValueMappingSequence", - }, - "(0040,9098)": { - tag: "(0040,9098)", - vr: "SQ", - vm: "1", - name: "PixelValueMappingCodeSequence", - }, - "(0040,9210)": { tag: "(0040,9210)", vr: "SH", vm: "1", name: "LUTLabel" }, - "(0040,9211)": { - tag: "(0040,9211)", - vr: "US|SS", - vm: "1", - name: "RealWorldValueLastValueMapped", - }, - "(0040,9212)": { - tag: "(0040,9212)", - vr: "FD", - vm: "1-n", - name: "RealWorldValueLUTData", - }, - "(0040,9213)": { - tag: "(0040,9213)", - vr: "FD", - vm: "1", - name: "DoubleFloatRealWorldValueLastValueMapped", - }, - "(0040,9214)": { - tag: "(0040,9214)", - vr: "FD", - vm: "1", - name: "DoubleFloatRealWorldValueFirstValueMapped", - }, - "(0040,9216)": { - tag: "(0040,9216)", - vr: "US|SS", - vm: "1", - name: "RealWorldValueFirstValueMapped", - }, - "(0040,9220)": { - tag: "(0040,9220)", - vr: "SQ", - vm: "1", - name: "QuantityDefinitionSequence", - }, - "(0040,9224)": { - tag: "(0040,9224)", - vr: "FD", - vm: "1", - name: "RealWorldValueIntercept", - }, - "(0040,9225)": { - tag: "(0040,9225)", - vr: "FD", - vm: "1", - name: "RealWorldValueSlope", - }, - "(0040,A007)": { - tag: "(0040,A007)", - vr: "CS", - vm: "1", - name: "FindingsFlagTrial", - }, - "(0040,A010)": { - tag: "(0040,A010)", - vr: "CS", - vm: "1", - name: "RelationshipType", - }, - "(0040,A020)": { - tag: "(0040,A020)", - vr: "SQ", - vm: "1", - name: "FindingsSequenceTrial", - }, - "(0040,A021)": { - tag: "(0040,A021)", - vr: "UI", - vm: "1", - name: "FindingsGroupUIDTrial", - }, - "(0040,A022)": { - tag: "(0040,A022)", - vr: "UI", - vm: "1", - name: "ReferencedFindingsGroupUIDTrial", - }, - "(0040,A023)": { - tag: "(0040,A023)", - vr: "DA", - vm: "1", - name: "FindingsGroupRecordingDateTrial", - }, - "(0040,A024)": { - tag: "(0040,A024)", - vr: "TM", - vm: "1", - name: "FindingsGroupRecordingTimeTrial", - }, - "(0040,A026)": { - tag: "(0040,A026)", - vr: "SQ", - vm: "1", - name: "FindingsSourceCategoryCodeSequenceTrial", - }, - "(0040,A027)": { - tag: "(0040,A027)", - vr: "LO", - vm: "1", - name: "VerifyingOrganization", - }, - "(0040,A028)": { - tag: "(0040,A028)", - vr: "SQ", - vm: "1", - name: "DocumentingOrganizationIdentifierCodeSequenceTrial", - }, - "(0040,A030)": { - tag: "(0040,A030)", - vr: "DT", - vm: "1", - name: "VerificationDateTime", - }, - "(0040,A032)": { - tag: "(0040,A032)", - vr: "DT", - vm: "1", - name: "ObservationDateTime", - }, - "(0040,A033)": { - tag: "(0040,A033)", - vr: "DT", - vm: "1", - name: "ObservationStartDateTime", - }, - "(0040,A040)": { tag: "(0040,A040)", vr: "CS", vm: "1", name: "ValueType" }, - "(0040,A043)": { - tag: "(0040,A043)", - vr: "SQ", - vm: "1", - name: "ConceptNameCodeSequence", - }, - "(0040,A047)": { - tag: "(0040,A047)", - vr: "LO", - vm: "1", - name: "MeasurementPrecisionDescriptionTrial", - }, - "(0040,A050)": { - tag: "(0040,A050)", - vr: "CS", - vm: "1", - name: "ContinuityOfContent", - }, - "(0040,A057)": { - tag: "(0040,A057)", - vr: "CS", - vm: "1-n", - name: "UrgencyOrPriorityAlertsTrial", - }, - "(0040,A060)": { - tag: "(0040,A060)", - vr: "LO", - vm: "1", - name: "SequencingIndicatorTrial", - }, - "(0040,A066)": { - tag: "(0040,A066)", - vr: "SQ", - vm: "1", - name: "DocumentIdentifierCodeSequenceTrial", - }, - "(0040,A067)": { - tag: "(0040,A067)", - vr: "PN", - vm: "1", - name: "DocumentAuthorTrial", - }, - "(0040,A068)": { - tag: "(0040,A068)", - vr: "SQ", - vm: "1", - name: "DocumentAuthorIdentifierCodeSequenceTrial", - }, - "(0040,A070)": { - tag: "(0040,A070)", - vr: "SQ", - vm: "1", - name: "IdentifierCodeSequenceTrial", - }, - "(0040,A073)": { - tag: "(0040,A073)", - vr: "SQ", - vm: "1", - name: "VerifyingObserverSequence", - }, - "(0040,A074)": { - tag: "(0040,A074)", - vr: "OB", - vm: "1", - name: "ObjectBinaryIdentifierTrial", - }, - "(0040,A075)": { - tag: "(0040,A075)", - vr: "PN", - vm: "1", - name: "VerifyingObserverName", - }, - "(0040,A076)": { - tag: "(0040,A076)", - vr: "SQ", - vm: "1", - name: "DocumentingObserverIdentifierCodeSequenceTrial", - }, - "(0040,A078)": { - tag: "(0040,A078)", - vr: "SQ", - vm: "1", - name: "AuthorObserverSequence", - }, - "(0040,A07A)": { - tag: "(0040,A07A)", - vr: "SQ", - vm: "1", - name: "ParticipantSequence", - }, - "(0040,A07C)": { - tag: "(0040,A07C)", - vr: "SQ", - vm: "1", - name: "CustodialOrganizationSequence", - }, - "(0040,A080)": { - tag: "(0040,A080)", - vr: "CS", - vm: "1", - name: "ParticipationType", - }, - "(0040,A082)": { - tag: "(0040,A082)", - vr: "DT", - vm: "1", - name: "ParticipationDateTime", - }, - "(0040,A084)": { - tag: "(0040,A084)", - vr: "CS", - vm: "1", - name: "ObserverType", - }, - "(0040,A085)": { - tag: "(0040,A085)", - vr: "SQ", - vm: "1", - name: "ProcedureIdentifierCodeSequenceTrial", - }, - "(0040,A088)": { - tag: "(0040,A088)", - vr: "SQ", - vm: "1", - name: "VerifyingObserverIdentificationCodeSequence", - }, - "(0040,A089)": { - tag: "(0040,A089)", - vr: "OB", - vm: "1", - name: "ObjectDirectoryBinaryIdentifierTrial", - }, - "(0040,A090)": { - tag: "(0040,A090)", - vr: "SQ", - vm: "1", - name: "EquivalentCDADocumentSequence", - }, - "(0040,A0B0)": { - tag: "(0040,A0B0)", - vr: "US", - vm: "2-2n", - name: "ReferencedWaveformChannels", - }, - "(0040,A110)": { - tag: "(0040,A110)", - vr: "DA", - vm: "1", - name: "DateOfDocumentOrVerbalTransactionTrial", - }, - "(0040,A112)": { - tag: "(0040,A112)", - vr: "TM", - vm: "1", - name: "TimeOfDocumentCreationOrVerbalTransactionTrial", - }, - "(0040,A120)": { tag: "(0040,A120)", vr: "DT", vm: "1", name: "DateTime" }, - "(0040,A121)": { tag: "(0040,A121)", vr: "DA", vm: "1", name: "Date" }, - "(0040,A122)": { tag: "(0040,A122)", vr: "TM", vm: "1", name: "Time" }, - "(0040,A123)": { tag: "(0040,A123)", vr: "PN", vm: "1", name: "PersonName" }, - "(0040,A124)": { tag: "(0040,A124)", vr: "UI", vm: "1", name: "UID" }, - "(0040,A125)": { - tag: "(0040,A125)", - vr: "CS", - vm: "2", - name: "ReportStatusIDTrial", - }, - "(0040,A130)": { - tag: "(0040,A130)", - vr: "CS", - vm: "1", - name: "TemporalRangeType", - }, - "(0040,A132)": { - tag: "(0040,A132)", - vr: "UL", - vm: "1-n", - name: "ReferencedSamplePositions", - }, - "(0040,A136)": { - tag: "(0040,A136)", - vr: "US", - vm: "1-n", - name: "ReferencedFrameNumbers", - }, - "(0040,A138)": { - tag: "(0040,A138)", - vr: "DS", - vm: "1-n", - name: "ReferencedTimeOffsets", - }, - "(0040,A13A)": { - tag: "(0040,A13A)", - vr: "DT", - vm: "1-n", - name: "ReferencedDateTime", - }, - "(0040,A160)": { tag: "(0040,A160)", vr: "UT", vm: "1", name: "TextValue" }, - "(0040,A161)": { - tag: "(0040,A161)", - vr: "FD", - vm: "1-n", - name: "FloatingPointValue", - }, - "(0040,A162)": { - tag: "(0040,A162)", - vr: "SL", - vm: "1-n", - name: "RationalNumeratorValue", - }, - "(0040,A163)": { - tag: "(0040,A163)", - vr: "UL", - vm: "1-n", - name: "RationalDenominatorValue", - }, - "(0040,A167)": { - tag: "(0040,A167)", - vr: "SQ", - vm: "1", - name: "ObservationCategoryCodeSequenceTrial", - }, - "(0040,A168)": { - tag: "(0040,A168)", - vr: "SQ", - vm: "1", - name: "ConceptCodeSequence", - }, - "(0040,A16A)": { - tag: "(0040,A16A)", - vr: "ST", - vm: "1", - name: "BibliographicCitationTrial", - }, - "(0040,A170)": { - tag: "(0040,A170)", - vr: "SQ", - vm: "1", - name: "PurposeOfReferenceCodeSequence", - }, - "(0040,A171)": { - tag: "(0040,A171)", - vr: "UI", - vm: "1", - name: "ObservationUID", - }, - "(0040,A172)": { - tag: "(0040,A172)", - vr: "UI", - vm: "1", - name: "ReferencedObservationUIDTrial", - }, - "(0040,A173)": { - tag: "(0040,A173)", - vr: "CS", - vm: "1", - name: "ReferencedObservationClassTrial", - }, - "(0040,A174)": { - tag: "(0040,A174)", - vr: "CS", - vm: "1", - name: "ReferencedObjectObservationClassTrial", - }, - "(0040,A180)": { - tag: "(0040,A180)", - vr: "US", - vm: "1", - name: "AnnotationGroupNumber", - }, - "(0040,A192)": { - tag: "(0040,A192)", - vr: "DA", - vm: "1", - name: "ObservationDateTrial", - }, - "(0040,A193)": { - tag: "(0040,A193)", - vr: "TM", - vm: "1", - name: "ObservationTimeTrial", - }, - "(0040,A194)": { - tag: "(0040,A194)", - vr: "CS", - vm: "1", - name: "MeasurementAutomationTrial", - }, - "(0040,A195)": { - tag: "(0040,A195)", - vr: "SQ", - vm: "1", - name: "ModifierCodeSequence", - }, - "(0040,A224)": { - tag: "(0040,A224)", - vr: "ST", - vm: "1", - name: "IdentificationDescriptionTrial", - }, - "(0040,A290)": { - tag: "(0040,A290)", - vr: "CS", - vm: "1", - name: "CoordinatesSetGeometricTypeTrial", - }, - "(0040,A296)": { - tag: "(0040,A296)", - vr: "SQ", - vm: "1", - name: "AlgorithmCodeSequenceTrial", - }, - "(0040,A297)": { - tag: "(0040,A297)", - vr: "ST", - vm: "1", - name: "AlgorithmDescriptionTrial", - }, - "(0040,A29A)": { - tag: "(0040,A29A)", - vr: "SL", - vm: "2-2n", - name: "PixelCoordinatesSetTrial", - }, - "(0040,A300)": { - tag: "(0040,A300)", - vr: "SQ", - vm: "1", - name: "MeasuredValueSequence", - }, - "(0040,A301)": { - tag: "(0040,A301)", - vr: "SQ", - vm: "1", - name: "NumericValueQualifierCodeSequence", - }, - "(0040,A307)": { - tag: "(0040,A307)", - vr: "PN", - vm: "1", - name: "CurrentObserverTrial", - }, - "(0040,A30A)": { - tag: "(0040,A30A)", - vr: "DS", - vm: "1-n", - name: "NumericValue", - }, - "(0040,A313)": { - tag: "(0040,A313)", - vr: "SQ", - vm: "1", - name: "ReferencedAccessionSequenceTrial", - }, - "(0040,A33A)": { - tag: "(0040,A33A)", - vr: "ST", - vm: "1", - name: "ReportStatusCommentTrial", - }, - "(0040,A340)": { - tag: "(0040,A340)", - vr: "SQ", - vm: "1", - name: "ProcedureContextSequenceTrial", - }, - "(0040,A352)": { - tag: "(0040,A352)", - vr: "PN", - vm: "1", - name: "VerbalSourceTrial", - }, - "(0040,A353)": { - tag: "(0040,A353)", - vr: "ST", - vm: "1", - name: "AddressTrial", - }, - "(0040,A354)": { - tag: "(0040,A354)", - vr: "LO", - vm: "1", - name: "TelephoneNumberTrial", - }, - "(0040,A358)": { - tag: "(0040,A358)", - vr: "SQ", - vm: "1", - name: "VerbalSourceIdentifierCodeSequenceTrial", - }, - "(0040,A360)": { - tag: "(0040,A360)", - vr: "SQ", - vm: "1", - name: "PredecessorDocumentsSequence", - }, - "(0040,A370)": { - tag: "(0040,A370)", - vr: "SQ", - vm: "1", - name: "ReferencedRequestSequence", - }, - "(0040,A372)": { - tag: "(0040,A372)", - vr: "SQ", - vm: "1", - name: "PerformedProcedureCodeSequence", - }, - "(0040,A375)": { - tag: "(0040,A375)", - vr: "SQ", - vm: "1", - name: "CurrentRequestedProcedureEvidenceSequence", - }, - "(0040,A380)": { - tag: "(0040,A380)", - vr: "SQ", - vm: "1", - name: "ReportDetailSequenceTrial", - }, - "(0040,A385)": { - tag: "(0040,A385)", - vr: "SQ", - vm: "1", - name: "PertinentOtherEvidenceSequence", - }, - "(0040,A390)": { - tag: "(0040,A390)", - vr: "SQ", - vm: "1", - name: "HL7StructuredDocumentReferenceSequence", - }, - "(0040,A402)": { - tag: "(0040,A402)", - vr: "UI", - vm: "1", - name: "ObservationSubjectUIDTrial", - }, - "(0040,A403)": { - tag: "(0040,A403)", - vr: "CS", - vm: "1", - name: "ObservationSubjectClassTrial", - }, - "(0040,A404)": { - tag: "(0040,A404)", - vr: "SQ", - vm: "1", - name: "ObservationSubjectTypeCodeSequenceTrial", - }, - "(0040,A491)": { - tag: "(0040,A491)", - vr: "CS", - vm: "1", - name: "CompletionFlag", - }, - "(0040,A492)": { - tag: "(0040,A492)", - vr: "LO", - vm: "1", - name: "CompletionFlagDescription", - }, - "(0040,A493)": { - tag: "(0040,A493)", - vr: "CS", - vm: "1", - name: "VerificationFlag", - }, - "(0040,A494)": { - tag: "(0040,A494)", - vr: "CS", - vm: "1", - name: "ArchiveRequested", - }, - "(0040,A496)": { - tag: "(0040,A496)", - vr: "CS", - vm: "1", - name: "PreliminaryFlag", - }, - "(0040,A504)": { - tag: "(0040,A504)", - vr: "SQ", - vm: "1", - name: "ContentTemplateSequence", - }, - "(0040,A525)": { - tag: "(0040,A525)", - vr: "SQ", - vm: "1", - name: "IdenticalDocumentsSequence", - }, - "(0040,A600)": { - tag: "(0040,A600)", - vr: "CS", - vm: "1", - name: "ObservationSubjectContextFlagTrial", - }, - "(0040,A601)": { - tag: "(0040,A601)", - vr: "CS", - vm: "1", - name: "ObserverContextFlagTrial", - }, - "(0040,A603)": { - tag: "(0040,A603)", - vr: "CS", - vm: "1", - name: "ProcedureContextFlagTrial", - }, - "(0040,A730)": { - tag: "(0040,A730)", - vr: "SQ", - vm: "1", - name: "ContentSequence", - }, - "(0040,A731)": { - tag: "(0040,A731)", - vr: "SQ", - vm: "1", - name: "RelationshipSequenceTrial", - }, - "(0040,A732)": { - tag: "(0040,A732)", - vr: "SQ", - vm: "1", - name: "RelationshipTypeCodeSequenceTrial", - }, - "(0040,A744)": { - tag: "(0040,A744)", - vr: "SQ", - vm: "1", - name: "LanguageCodeSequenceTrial", - }, - "(0040,A801)": { - tag: "(0040,A801)", - vr: "SQ", - vm: "1", - name: "TabulatedValuesSequence", - }, - "(0040,A802)": { - tag: "(0040,A802)", - vr: "UL", - vm: "1", - name: "NumberOfTableRows", - }, - "(0040,A803)": { - tag: "(0040,A803)", - vr: "UL", - vm: "1", - name: "NumberOfTableColumns", - }, - "(0040,A804)": { - tag: "(0040,A804)", - vr: "UL", - vm: "1", - name: "TableRowNumber", - }, - "(0040,A805)": { - tag: "(0040,A805)", - vr: "UL", - vm: "1", - name: "TableColumnNumber", - }, - "(0040,A806)": { - tag: "(0040,A806)", - vr: "SQ", - vm: "1", - name: "TableRowDefinitionSequence", - }, - "(0040,A807)": { - tag: "(0040,A807)", - vr: "SQ", - vm: "1", - name: "TableColumnDefinitionSequence", - }, - "(0040,A808)": { - tag: "(0040,A808)", - vr: "SQ", - vm: "1", - name: "CellValuesSequence", - }, - "(0040,A992)": { - tag: "(0040,A992)", - vr: "ST", - vm: "1", - name: "UniformResourceLocatorTrial", - }, - "(0040,B020)": { - tag: "(0040,B020)", - vr: "SQ", - vm: "1", - name: "WaveformAnnotationSequence", - }, - "(0040,DB00)": { - tag: "(0040,DB00)", - vr: "CS", - vm: "1", - name: "TemplateIdentifier", - }, - "(0040,DB06)": { - tag: "(0040,DB06)", - vr: "DT", - vm: "1", - name: "TemplateVersion", - }, - "(0040,DB07)": { - tag: "(0040,DB07)", - vr: "DT", - vm: "1", - name: "TemplateLocalVersion", - }, - "(0040,DB0B)": { - tag: "(0040,DB0B)", - vr: "CS", - vm: "1", - name: "TemplateExtensionFlag", - }, - "(0040,DB0C)": { - tag: "(0040,DB0C)", - vr: "UI", - vm: "1", - name: "TemplateExtensionOrganizationUID", - }, - "(0040,DB0D)": { - tag: "(0040,DB0D)", - vr: "UI", - vm: "1", - name: "TemplateExtensionCreatorUID", - }, - "(0040,DB73)": { - tag: "(0040,DB73)", - vr: "UL", - vm: "1-n", - name: "ReferencedContentItemIdentifier", - }, - "(0040,E001)": { - tag: "(0040,E001)", - vr: "ST", - vm: "1", - name: "HL7InstanceIdentifier", - }, - "(0040,E004)": { - tag: "(0040,E004)", - vr: "DT", - vm: "1", - name: "HL7DocumentEffectiveTime", - }, - "(0040,E006)": { - tag: "(0040,E006)", - vr: "SQ", - vm: "1", - name: "HL7DocumentTypeCodeSequence", - }, - "(0040,E008)": { - tag: "(0040,E008)", - vr: "SQ", - vm: "1", - name: "DocumentClassCodeSequence", - }, - "(0040,E010)": { tag: "(0040,E010)", vr: "UR", vm: "1", name: "RetrieveURI" }, - "(0040,E011)": { - tag: "(0040,E011)", - vr: "UI", - vm: "1", - name: "RetrieveLocationUID", - }, - "(0040,E020)": { - tag: "(0040,E020)", - vr: "CS", - vm: "1", - name: "TypeOfInstances", - }, - "(0040,E021)": { - tag: "(0040,E021)", - vr: "SQ", - vm: "1", - name: "DICOMRetrievalSequence", - }, - "(0040,E022)": { - tag: "(0040,E022)", - vr: "SQ", - vm: "1", - name: "DICOMMediaRetrievalSequence", - }, - "(0040,E023)": { - tag: "(0040,E023)", - vr: "SQ", - vm: "1", - name: "WADORetrievalSequence", - }, - "(0040,E024)": { - tag: "(0040,E024)", - vr: "SQ", - vm: "1", - name: "XDSRetrievalSequence", - }, - "(0040,E025)": { - tag: "(0040,E025)", - vr: "SQ", - vm: "1", - name: "WADORSRetrievalSequence", - }, - "(0040,E030)": { - tag: "(0040,E030)", - vr: "UI", - vm: "1", - name: "RepositoryUniqueID", - }, - "(0040,E031)": { - tag: "(0040,E031)", - vr: "UI", - vm: "1", - name: "HomeCommunityID", - }, - "(0042,0010)": { - tag: "(0042,0010)", - vr: "ST", - vm: "1", - name: "DocumentTitle", - }, - "(0042,0011)": { - tag: "(0042,0011)", - vr: "OB", - vm: "1", - name: "EncapsulatedDocument", - }, - "(0042,0012)": { - tag: "(0042,0012)", - vr: "LO", - vm: "1", - name: "MIMETypeOfEncapsulatedDocument", - }, - "(0042,0013)": { - tag: "(0042,0013)", - vr: "SQ", - vm: "1", - name: "SourceInstanceSequence", - }, - "(0042,0014)": { - tag: "(0042,0014)", - vr: "LO", - vm: "1-n", - name: "ListOfMIMETypes", - }, - "(0042,0015)": { - tag: "(0042,0015)", - vr: "UL", - vm: "1", - name: "EncapsulatedDocumentLength", - }, - "(0044,0001)": { - tag: "(0044,0001)", - vr: "ST", - vm: "1", - name: "ProductPackageIdentifier", - }, - "(0044,0002)": { - tag: "(0044,0002)", - vr: "CS", - vm: "1", - name: "SubstanceAdministrationApproval", - }, - "(0044,0003)": { - tag: "(0044,0003)", - vr: "LT", - vm: "1", - name: "ApprovalStatusFurtherDescription", - }, - "(0044,0004)": { - tag: "(0044,0004)", - vr: "DT", - vm: "1", - name: "ApprovalStatusDateTime", - }, - "(0044,0007)": { - tag: "(0044,0007)", - vr: "SQ", - vm: "1", - name: "ProductTypeCodeSequence", - }, - "(0044,0008)": { - tag: "(0044,0008)", - vr: "LO", - vm: "1-n", - name: "ProductName", - }, - "(0044,0009)": { - tag: "(0044,0009)", - vr: "LT", - vm: "1", - name: "ProductDescription", - }, - "(0044,000A)": { - tag: "(0044,000A)", - vr: "LO", - vm: "1", - name: "ProductLotIdentifier", - }, - "(0044,000B)": { - tag: "(0044,000B)", - vr: "DT", - vm: "1", - name: "ProductExpirationDateTime", - }, - "(0044,0010)": { - tag: "(0044,0010)", - vr: "DT", - vm: "1", - name: "SubstanceAdministrationDateTime", - }, - "(0044,0011)": { - tag: "(0044,0011)", - vr: "LO", - vm: "1", - name: "SubstanceAdministrationNotes", - }, - "(0044,0012)": { - tag: "(0044,0012)", - vr: "LO", - vm: "1", - name: "SubstanceAdministrationDeviceID", - }, - "(0044,0013)": { - tag: "(0044,0013)", - vr: "SQ", - vm: "1", - name: "ProductParameterSequence", - }, - "(0044,0019)": { - tag: "(0044,0019)", - vr: "SQ", - vm: "1", - name: "SubstanceAdministrationParameterSequence", - }, - "(0044,0100)": { - tag: "(0044,0100)", - vr: "SQ", - vm: "1", - name: "ApprovalSequence", - }, - "(0044,0101)": { - tag: "(0044,0101)", - vr: "SQ", - vm: "1", - name: "AssertionCodeSequence", - }, - "(0044,0102)": { - tag: "(0044,0102)", - vr: "UI", - vm: "1", - name: "AssertionUID", - }, - "(0044,0103)": { - tag: "(0044,0103)", - vr: "SQ", - vm: "1", - name: "AsserterIdentificationSequence", - }, - "(0044,0104)": { - tag: "(0044,0104)", - vr: "DT", - vm: "1", - name: "AssertionDateTime", - }, - "(0044,0105)": { - tag: "(0044,0105)", - vr: "DT", - vm: "1", - name: "AssertionExpirationDateTime", - }, - "(0044,0106)": { - tag: "(0044,0106)", - vr: "UT", - vm: "1", - name: "AssertionComments", - }, - "(0044,0107)": { - tag: "(0044,0107)", - vr: "SQ", - vm: "1", - name: "RelatedAssertionSequence", - }, - "(0044,0108)": { - tag: "(0044,0108)", - vr: "UI", - vm: "1", - name: "ReferencedAssertionUID", - }, - "(0044,0109)": { - tag: "(0044,0109)", - vr: "SQ", - vm: "1", - name: "ApprovalSubjectSequence", - }, - "(0044,010A)": { - tag: "(0044,010A)", - vr: "SQ", - vm: "1", - name: "OrganizationalRoleCodeSequence", - }, - "(0046,0012)": { - tag: "(0046,0012)", - vr: "LO", - vm: "1", - name: "LensDescription", - }, - "(0046,0014)": { - tag: "(0046,0014)", - vr: "SQ", - vm: "1", - name: "RightLensSequence", - }, - "(0046,0015)": { - tag: "(0046,0015)", - vr: "SQ", - vm: "1", - name: "LeftLensSequence", - }, - "(0046,0016)": { - tag: "(0046,0016)", - vr: "SQ", - vm: "1", - name: "UnspecifiedLateralityLensSequence", - }, - "(0046,0018)": { - tag: "(0046,0018)", - vr: "SQ", - vm: "1", - name: "CylinderSequence", - }, - "(0046,0028)": { - tag: "(0046,0028)", - vr: "SQ", - vm: "1", - name: "PrismSequence", - }, - "(0046,0030)": { - tag: "(0046,0030)", - vr: "FD", - vm: "1", - name: "HorizontalPrismPower", - }, - "(0046,0032)": { - tag: "(0046,0032)", - vr: "CS", - vm: "1", - name: "HorizontalPrismBase", - }, - "(0046,0034)": { - tag: "(0046,0034)", - vr: "FD", - vm: "1", - name: "VerticalPrismPower", - }, - "(0046,0036)": { - tag: "(0046,0036)", - vr: "CS", - vm: "1", - name: "VerticalPrismBase", - }, - "(0046,0038)": { - tag: "(0046,0038)", - vr: "CS", - vm: "1", - name: "LensSegmentType", - }, - "(0046,0040)": { - tag: "(0046,0040)", - vr: "FD", - vm: "1", - name: "OpticalTransmittance", - }, - "(0046,0042)": { - tag: "(0046,0042)", - vr: "FD", - vm: "1", - name: "ChannelWidth", - }, - "(0046,0044)": { tag: "(0046,0044)", vr: "FD", vm: "1", name: "PupilSize" }, - "(0046,0046)": { tag: "(0046,0046)", vr: "FD", vm: "1", name: "CornealSize" }, - "(0046,0047)": { - tag: "(0046,0047)", - vr: "SQ", - vm: "1", - name: "CornealSizeSequence", - }, - "(0046,0050)": { - tag: "(0046,0050)", - vr: "SQ", - vm: "1", - name: "AutorefractionRightEyeSequence", - }, - "(0046,0052)": { - tag: "(0046,0052)", - vr: "SQ", - vm: "1", - name: "AutorefractionLeftEyeSequence", - }, - "(0046,0060)": { - tag: "(0046,0060)", - vr: "FD", - vm: "1", - name: "DistancePupillaryDistance", - }, - "(0046,0062)": { - tag: "(0046,0062)", - vr: "FD", - vm: "1", - name: "NearPupillaryDistance", - }, - "(0046,0063)": { - tag: "(0046,0063)", - vr: "FD", - vm: "1", - name: "IntermediatePupillaryDistance", - }, - "(0046,0064)": { - tag: "(0046,0064)", - vr: "FD", - vm: "1", - name: "OtherPupillaryDistance", - }, - "(0046,0070)": { - tag: "(0046,0070)", - vr: "SQ", - vm: "1", - name: "KeratometryRightEyeSequence", - }, - "(0046,0071)": { - tag: "(0046,0071)", - vr: "SQ", - vm: "1", - name: "KeratometryLeftEyeSequence", - }, - "(0046,0074)": { - tag: "(0046,0074)", - vr: "SQ", - vm: "1", - name: "SteepKeratometricAxisSequence", - }, - "(0046,0075)": { - tag: "(0046,0075)", - vr: "FD", - vm: "1", - name: "RadiusOfCurvature", - }, - "(0046,0076)": { - tag: "(0046,0076)", - vr: "FD", - vm: "1", - name: "KeratometricPower", - }, - "(0046,0077)": { - tag: "(0046,0077)", - vr: "FD", - vm: "1", - name: "KeratometricAxis", - }, - "(0046,0080)": { - tag: "(0046,0080)", - vr: "SQ", - vm: "1", - name: "FlatKeratometricAxisSequence", - }, - "(0046,0092)": { - tag: "(0046,0092)", - vr: "CS", - vm: "1", - name: "BackgroundColor", - }, - "(0046,0094)": { tag: "(0046,0094)", vr: "CS", vm: "1", name: "Optotype" }, - "(0046,0095)": { - tag: "(0046,0095)", - vr: "CS", - vm: "1", - name: "OptotypePresentation", - }, - "(0046,0097)": { - tag: "(0046,0097)", - vr: "SQ", - vm: "1", - name: "SubjectiveRefractionRightEyeSequence", - }, - "(0046,0098)": { - tag: "(0046,0098)", - vr: "SQ", - vm: "1", - name: "SubjectiveRefractionLeftEyeSequence", - }, - "(0046,0100)": { - tag: "(0046,0100)", - vr: "SQ", - vm: "1", - name: "AddNearSequence", - }, - "(0046,0101)": { - tag: "(0046,0101)", - vr: "SQ", - vm: "1", - name: "AddIntermediateSequence", - }, - "(0046,0102)": { - tag: "(0046,0102)", - vr: "SQ", - vm: "1", - name: "AddOtherSequence", - }, - "(0046,0104)": { tag: "(0046,0104)", vr: "FD", vm: "1", name: "AddPower" }, - "(0046,0106)": { - tag: "(0046,0106)", - vr: "FD", - vm: "1", - name: "ViewingDistance", - }, - "(0046,0110)": { - tag: "(0046,0110)", - vr: "SQ", - vm: "1", - name: "CorneaMeasurementsSequence", - }, - "(0046,0111)": { - tag: "(0046,0111)", - vr: "SQ", - vm: "1", - name: "SourceOfCorneaMeasurementDataCodeSequence", - }, - "(0046,0112)": { - tag: "(0046,0112)", - vr: "SQ", - vm: "1", - name: "SteepCornealAxisSequence", - }, - "(0046,0113)": { - tag: "(0046,0113)", - vr: "SQ", - vm: "1", - name: "FlatCornealAxisSequence", - }, - "(0046,0114)": { - tag: "(0046,0114)", - vr: "FD", - vm: "1", - name: "CornealPower", - }, - "(0046,0115)": { tag: "(0046,0115)", vr: "FD", vm: "1", name: "CornealAxis" }, - "(0046,0116)": { - tag: "(0046,0116)", - vr: "SQ", - vm: "1", - name: "CorneaMeasurementMethodCodeSequence", - }, - "(0046,0117)": { - tag: "(0046,0117)", - vr: "FL", - vm: "1", - name: "RefractiveIndexOfCornea", - }, - "(0046,0118)": { - tag: "(0046,0118)", - vr: "FL", - vm: "1", - name: "RefractiveIndexOfAqueousHumor", - }, - "(0046,0121)": { - tag: "(0046,0121)", - vr: "SQ", - vm: "1", - name: "VisualAcuityTypeCodeSequence", - }, - "(0046,0122)": { - tag: "(0046,0122)", - vr: "SQ", - vm: "1", - name: "VisualAcuityRightEyeSequence", - }, - "(0046,0123)": { - tag: "(0046,0123)", - vr: "SQ", - vm: "1", - name: "VisualAcuityLeftEyeSequence", - }, - "(0046,0124)": { - tag: "(0046,0124)", - vr: "SQ", - vm: "1", - name: "VisualAcuityBothEyesOpenSequence", - }, - "(0046,0125)": { - tag: "(0046,0125)", - vr: "CS", - vm: "1", - name: "ViewingDistanceType", - }, - "(0046,0135)": { - tag: "(0046,0135)", - vr: "SS", - vm: "2", - name: "VisualAcuityModifiers", - }, - "(0046,0137)": { - tag: "(0046,0137)", - vr: "FD", - vm: "1", - name: "DecimalVisualAcuity", - }, - "(0046,0139)": { - tag: "(0046,0139)", - vr: "LO", - vm: "1", - name: "OptotypeDetailedDefinition", - }, - "(0046,0145)": { - tag: "(0046,0145)", - vr: "SQ", - vm: "1", - name: "ReferencedRefractiveMeasurementsSequence", - }, - "(0046,0146)": { tag: "(0046,0146)", vr: "FD", vm: "1", name: "SpherePower" }, - "(0046,0147)": { - tag: "(0046,0147)", - vr: "FD", - vm: "1", - name: "CylinderPower", - }, - "(0046,0201)": { - tag: "(0046,0201)", - vr: "CS", - vm: "1", - name: "CornealTopographySurface", - }, - "(0046,0202)": { - tag: "(0046,0202)", - vr: "FL", - vm: "2", - name: "CornealVertexLocation", - }, - "(0046,0203)": { - tag: "(0046,0203)", - vr: "FL", - vm: "1", - name: "PupilCentroidXCoordinate", - }, - "(0046,0204)": { - tag: "(0046,0204)", - vr: "FL", - vm: "1", - name: "PupilCentroidYCoordinate", - }, - "(0046,0205)": { - tag: "(0046,0205)", - vr: "FL", - vm: "1", - name: "EquivalentPupilRadius", - }, - "(0046,0207)": { - tag: "(0046,0207)", - vr: "SQ", - vm: "1", - name: "CornealTopographyMapTypeCodeSequence", - }, - "(0046,0208)": { - tag: "(0046,0208)", - vr: "IS", - vm: "2-2n", - name: "VerticesOfTheOutlineOfPupil", - }, - "(0046,0210)": { - tag: "(0046,0210)", - vr: "SQ", - vm: "1", - name: "CornealTopographyMappingNormalsSequence", - }, - "(0046,0211)": { - tag: "(0046,0211)", - vr: "SQ", - vm: "1", - name: "MaximumCornealCurvatureSequence", - }, - "(0046,0212)": { - tag: "(0046,0212)", - vr: "FL", - vm: "1", - name: "MaximumCornealCurvature", - }, - "(0046,0213)": { - tag: "(0046,0213)", - vr: "FL", - vm: "2", - name: "MaximumCornealCurvatureLocation", - }, - "(0046,0215)": { - tag: "(0046,0215)", - vr: "SQ", - vm: "1", - name: "MinimumKeratometricSequence", - }, - "(0046,0218)": { - tag: "(0046,0218)", - vr: "SQ", - vm: "1", - name: "SimulatedKeratometricCylinderSequence", - }, - "(0046,0220)": { - tag: "(0046,0220)", - vr: "FL", - vm: "1", - name: "AverageCornealPower", - }, - "(0046,0224)": { - tag: "(0046,0224)", - vr: "FL", - vm: "1", - name: "CornealISValue", - }, - "(0046,0227)": { - tag: "(0046,0227)", - vr: "FL", - vm: "1", - name: "AnalyzedArea", - }, - "(0046,0230)": { - tag: "(0046,0230)", - vr: "FL", - vm: "1", - name: "SurfaceRegularityIndex", - }, - "(0046,0232)": { - tag: "(0046,0232)", - vr: "FL", - vm: "1", - name: "SurfaceAsymmetryIndex", - }, - "(0046,0234)": { - tag: "(0046,0234)", - vr: "FL", - vm: "1", - name: "CornealEccentricityIndex", - }, - "(0046,0236)": { - tag: "(0046,0236)", - vr: "FL", - vm: "1", - name: "KeratoconusPredictionIndex", - }, - "(0046,0238)": { - tag: "(0046,0238)", - vr: "FL", - vm: "1", - name: "DecimalPotentialVisualAcuity", - }, - "(0046,0242)": { - tag: "(0046,0242)", - vr: "CS", - vm: "1", - name: "CornealTopographyMapQualityEvaluation", - }, - "(0046,0244)": { - tag: "(0046,0244)", - vr: "SQ", - vm: "1", - name: "SourceImageCornealProcessedDataSequence", - }, - "(0046,0247)": { - tag: "(0046,0247)", - vr: "FL", - vm: "3", - name: "CornealPointLocation", - }, - "(0046,0248)": { - tag: "(0046,0248)", - vr: "CS", - vm: "1", - name: "CornealPointEstimated", - }, - "(0046,0249)": { tag: "(0046,0249)", vr: "FL", vm: "1", name: "AxialPower" }, - "(0046,0250)": { - tag: "(0046,0250)", - vr: "FL", - vm: "1", - name: "TangentialPower", - }, - "(0046,0251)": { - tag: "(0046,0251)", - vr: "FL", - vm: "1", - name: "RefractivePower", - }, - "(0046,0252)": { - tag: "(0046,0252)", - vr: "FL", - vm: "1", - name: "RelativeElevation", - }, - "(0046,0253)": { - tag: "(0046,0253)", - vr: "FL", - vm: "1", - name: "CornealWavefront", - }, - "(0048,0001)": { - tag: "(0048,0001)", - vr: "FL", - vm: "1", - name: "ImagedVolumeWidth", - }, - "(0048,0002)": { - tag: "(0048,0002)", - vr: "FL", - vm: "1", - name: "ImagedVolumeHeight", - }, - "(0048,0003)": { - tag: "(0048,0003)", - vr: "FL", - vm: "1", - name: "ImagedVolumeDepth", - }, - "(0048,0006)": { - tag: "(0048,0006)", - vr: "UL", - vm: "1", - name: "TotalPixelMatrixColumns", - }, - "(0048,0007)": { - tag: "(0048,0007)", - vr: "UL", - vm: "1", - name: "TotalPixelMatrixRows", - }, - "(0048,0008)": { - tag: "(0048,0008)", - vr: "SQ", - vm: "1", - name: "TotalPixelMatrixOriginSequence", - }, - "(0048,0010)": { - tag: "(0048,0010)", - vr: "CS", - vm: "1", - name: "SpecimenLabelInImage", - }, - "(0048,0011)": { tag: "(0048,0011)", vr: "CS", vm: "1", name: "FocusMethod" }, - "(0048,0012)": { - tag: "(0048,0012)", - vr: "CS", - vm: "1", - name: "ExtendedDepthOfField", - }, - "(0048,0013)": { - tag: "(0048,0013)", - vr: "US", - vm: "1", - name: "NumberOfFocalPlanes", - }, - "(0048,0014)": { - tag: "(0048,0014)", - vr: "FL", - vm: "1", - name: "DistanceBetweenFocalPlanes", - }, - "(0048,0015)": { - tag: "(0048,0015)", - vr: "US", - vm: "3", - name: "RecommendedAbsentPixelCIELabValue", - }, - "(0048,0100)": { - tag: "(0048,0100)", - vr: "SQ", - vm: "1", - name: "IlluminatorTypeCodeSequence", - }, - "(0048,0102)": { - tag: "(0048,0102)", - vr: "DS", - vm: "6", - name: "ImageOrientationSlide", - }, - "(0048,0105)": { - tag: "(0048,0105)", - vr: "SQ", - vm: "1", - name: "OpticalPathSequence", - }, - "(0048,0106)": { - tag: "(0048,0106)", - vr: "SH", - vm: "1", - name: "OpticalPathIdentifier", - }, - "(0048,0107)": { - tag: "(0048,0107)", - vr: "ST", - vm: "1", - name: "OpticalPathDescription", - }, - "(0048,0108)": { - tag: "(0048,0108)", - vr: "SQ", - vm: "1", - name: "IlluminationColorCodeSequence", - }, - "(0048,0110)": { - tag: "(0048,0110)", - vr: "SQ", - vm: "1", - name: "SpecimenReferenceSequence", - }, - "(0048,0111)": { - tag: "(0048,0111)", - vr: "DS", - vm: "1", - name: "CondenserLensPower", - }, - "(0048,0112)": { - tag: "(0048,0112)", - vr: "DS", - vm: "1", - name: "ObjectiveLensPower", - }, - "(0048,0113)": { - tag: "(0048,0113)", - vr: "DS", - vm: "1", - name: "ObjectiveLensNumericalAperture", - }, - "(0048,0120)": { - tag: "(0048,0120)", - vr: "SQ", - vm: "1", - name: "PaletteColorLookupTableSequence", - }, - "(0048,0200)": { - tag: "(0048,0200)", - vr: "SQ", - vm: "1", - name: "ReferencedImageNavigationSequence", - }, - "(0048,0201)": { - tag: "(0048,0201)", - vr: "US", - vm: "2", - name: "TopLeftHandCornerOfLocalizerArea", - }, - "(0048,0202)": { - tag: "(0048,0202)", - vr: "US", - vm: "2", - name: "BottomRightHandCornerOfLocalizerArea", - }, - "(0048,0207)": { - tag: "(0048,0207)", - vr: "SQ", - vm: "1", - name: "OpticalPathIdentificationSequence", - }, - "(0048,021A)": { - tag: "(0048,021A)", - vr: "SQ", - vm: "1", - name: "PlanePositionSlideSequence", - }, - "(0048,021E)": { - tag: "(0048,021E)", - vr: "SL", - vm: "1", - name: "ColumnPositionInTotalImagePixelMatrix", - }, - "(0048,021F)": { - tag: "(0048,021F)", - vr: "SL", - vm: "1", - name: "RowPositionInTotalImagePixelMatrix", - }, - "(0048,0301)": { - tag: "(0048,0301)", - vr: "CS", - vm: "1", - name: "PixelOriginInterpretation", - }, - "(0048,0302)": { - tag: "(0048,0302)", - vr: "UL", - vm: "1", - name: "NumberOfOpticalPaths", - }, - "(0048,0303)": { - tag: "(0048,0303)", - vr: "UL", - vm: "1", - name: "TotalPixelMatrixFocalPlanes", - }, - "(0050,0004)": { - tag: "(0050,0004)", - vr: "CS", - vm: "1", - name: "CalibrationImage", - }, - "(0050,0010)": { - tag: "(0050,0010)", - vr: "SQ", - vm: "1", - name: "DeviceSequence", - }, - "(0050,0012)": { - tag: "(0050,0012)", - vr: "SQ", - vm: "1", - name: "ContainerComponentTypeCodeSequence", - }, - "(0050,0013)": { - tag: "(0050,0013)", - vr: "FD", - vm: "1", - name: "ContainerComponentThickness", - }, - "(0050,0014)": { - tag: "(0050,0014)", - vr: "DS", - vm: "1", - name: "DeviceLength", - }, - "(0050,0015)": { - tag: "(0050,0015)", - vr: "FD", - vm: "1", - name: "ContainerComponentWidth", - }, - "(0050,0016)": { - tag: "(0050,0016)", - vr: "DS", - vm: "1", - name: "DeviceDiameter", - }, - "(0050,0017)": { - tag: "(0050,0017)", - vr: "CS", - vm: "1", - name: "DeviceDiameterUnits", - }, - "(0050,0018)": { - tag: "(0050,0018)", - vr: "DS", - vm: "1", - name: "DeviceVolume", - }, - "(0050,0019)": { - tag: "(0050,0019)", - vr: "DS", - vm: "1", - name: "InterMarkerDistance", - }, - "(0050,001A)": { - tag: "(0050,001A)", - vr: "CS", - vm: "1", - name: "ContainerComponentMaterial", - }, - "(0050,001B)": { - tag: "(0050,001B)", - vr: "LO", - vm: "1", - name: "ContainerComponentID", - }, - "(0050,001C)": { - tag: "(0050,001C)", - vr: "FD", - vm: "1", - name: "ContainerComponentLength", - }, - "(0050,001D)": { - tag: "(0050,001D)", - vr: "FD", - vm: "1", - name: "ContainerComponentDiameter", - }, - "(0050,001E)": { - tag: "(0050,001E)", - vr: "LO", - vm: "1", - name: "ContainerComponentDescription", - }, - "(0050,0020)": { - tag: "(0050,0020)", - vr: "LO", - vm: "1", - name: "DeviceDescription", - }, - "(0050,0021)": { - tag: "(0050,0021)", - vr: "ST", - vm: "1", - name: "LongDeviceDescription", - }, - "(0052,0001)": { - tag: "(0052,0001)", - vr: "FL", - vm: "1", - name: "ContrastBolusIngredientPercentByVolume", - }, - "(0052,0002)": { - tag: "(0052,0002)", - vr: "FD", - vm: "1", - name: "OCTFocalDistance", - }, - "(0052,0003)": { - tag: "(0052,0003)", - vr: "FD", - vm: "1", - name: "BeamSpotSize", - }, - "(0052,0004)": { - tag: "(0052,0004)", - vr: "FD", - vm: "1", - name: "EffectiveRefractiveIndex", - }, - "(0052,0006)": { - tag: "(0052,0006)", - vr: "CS", - vm: "1", - name: "OCTAcquisitionDomain", - }, - "(0052,0007)": { - tag: "(0052,0007)", - vr: "FD", - vm: "1", - name: "OCTOpticalCenterWavelength", - }, - "(0052,0008)": { - tag: "(0052,0008)", - vr: "FD", - vm: "1", - name: "AxialResolution", - }, - "(0052,0009)": { - tag: "(0052,0009)", - vr: "FD", - vm: "1", - name: "RangingDepth", - }, - "(0052,0011)": { tag: "(0052,0011)", vr: "FD", vm: "1", name: "ALineRate" }, - "(0052,0012)": { - tag: "(0052,0012)", - vr: "US", - vm: "1", - name: "ALinesPerFrame", - }, - "(0052,0013)": { - tag: "(0052,0013)", - vr: "FD", - vm: "1", - name: "CatheterRotationalRate", - }, - "(0052,0014)": { - tag: "(0052,0014)", - vr: "FD", - vm: "1", - name: "ALinePixelSpacing", - }, - "(0052,0016)": { - tag: "(0052,0016)", - vr: "SQ", - vm: "1", - name: "ModeOfPercutaneousAccessSequence", - }, - "(0052,0025)": { - tag: "(0052,0025)", - vr: "SQ", - vm: "1", - name: "IntravascularOCTFrameTypeSequence", - }, - "(0052,0026)": { - tag: "(0052,0026)", - vr: "CS", - vm: "1", - name: "OCTZOffsetApplied", - }, - "(0052,0027)": { - tag: "(0052,0027)", - vr: "SQ", - vm: "1", - name: "IntravascularFrameContentSequence", - }, - "(0052,0028)": { - tag: "(0052,0028)", - vr: "FD", - vm: "1", - name: "IntravascularLongitudinalDistance", - }, - "(0052,0029)": { - tag: "(0052,0029)", - vr: "SQ", - vm: "1", - name: "IntravascularOCTFrameContentSequence", - }, - "(0052,0030)": { - tag: "(0052,0030)", - vr: "SS", - vm: "1", - name: "OCTZOffsetCorrection", - }, - "(0052,0031)": { - tag: "(0052,0031)", - vr: "CS", - vm: "1", - name: "CatheterDirectionOfRotation", - }, - "(0052,0033)": { - tag: "(0052,0033)", - vr: "FD", - vm: "1", - name: "SeamLineLocation", - }, - "(0052,0034)": { - tag: "(0052,0034)", - vr: "FD", - vm: "1", - name: "FirstALineLocation", - }, - "(0052,0036)": { - tag: "(0052,0036)", - vr: "US", - vm: "1", - name: "SeamLineIndex", - }, - "(0052,0038)": { - tag: "(0052,0038)", - vr: "US", - vm: "1", - name: "NumberOfPaddedALines", - }, - "(0052,0039)": { - tag: "(0052,0039)", - vr: "CS", - vm: "1", - name: "InterpolationType", - }, - "(0052,003A)": { - tag: "(0052,003A)", - vr: "CS", - vm: "1", - name: "RefractiveIndexApplied", - }, - "(0054,0010)": { - tag: "(0054,0010)", - vr: "US", - vm: "1-n", - name: "EnergyWindowVector", - }, - "(0054,0011)": { - tag: "(0054,0011)", - vr: "US", - vm: "1", - name: "NumberOfEnergyWindows", - }, - "(0054,0012)": { - tag: "(0054,0012)", - vr: "SQ", - vm: "1", - name: "EnergyWindowInformationSequence", - }, - "(0054,0013)": { - tag: "(0054,0013)", - vr: "SQ", - vm: "1", - name: "EnergyWindowRangeSequence", - }, - "(0054,0014)": { - tag: "(0054,0014)", - vr: "DS", - vm: "1", - name: "EnergyWindowLowerLimit", - }, - "(0054,0015)": { - tag: "(0054,0015)", - vr: "DS", - vm: "1", - name: "EnergyWindowUpperLimit", - }, - "(0054,0016)": { - tag: "(0054,0016)", - vr: "SQ", - vm: "1", - name: "RadiopharmaceuticalInformationSequence", - }, - "(0054,0017)": { - tag: "(0054,0017)", - vr: "IS", - vm: "1", - name: "ResidualSyringeCounts", - }, - "(0054,0018)": { - tag: "(0054,0018)", - vr: "SH", - vm: "1", - name: "EnergyWindowName", - }, - "(0054,0020)": { - tag: "(0054,0020)", - vr: "US", - vm: "1-n", - name: "DetectorVector", - }, - "(0054,0021)": { - tag: "(0054,0021)", - vr: "US", - vm: "1", - name: "NumberOfDetectors", - }, - "(0054,0022)": { - tag: "(0054,0022)", - vr: "SQ", - vm: "1", - name: "DetectorInformationSequence", - }, - "(0054,0030)": { - tag: "(0054,0030)", - vr: "US", - vm: "1-n", - name: "PhaseVector", - }, - "(0054,0031)": { - tag: "(0054,0031)", - vr: "US", - vm: "1", - name: "NumberOfPhases", - }, - "(0054,0032)": { - tag: "(0054,0032)", - vr: "SQ", - vm: "1", - name: "PhaseInformationSequence", - }, - "(0054,0033)": { - tag: "(0054,0033)", - vr: "US", - vm: "1", - name: "NumberOfFramesInPhase", - }, - "(0054,0036)": { tag: "(0054,0036)", vr: "IS", vm: "1", name: "PhaseDelay" }, - "(0054,0038)": { - tag: "(0054,0038)", - vr: "IS", - vm: "1", - name: "PauseBetweenFrames", - }, - "(0054,0039)": { - tag: "(0054,0039)", - vr: "CS", - vm: "1", - name: "PhaseDescription", - }, - "(0054,0050)": { - tag: "(0054,0050)", - vr: "US", - vm: "1-n", - name: "RotationVector", - }, - "(0054,0051)": { - tag: "(0054,0051)", - vr: "US", - vm: "1", - name: "NumberOfRotations", - }, - "(0054,0052)": { - tag: "(0054,0052)", - vr: "SQ", - vm: "1", - name: "RotationInformationSequence", - }, - "(0054,0053)": { - tag: "(0054,0053)", - vr: "US", - vm: "1", - name: "NumberOfFramesInRotation", - }, - "(0054,0060)": { - tag: "(0054,0060)", - vr: "US", - vm: "1-n", - name: "RRIntervalVector", - }, - "(0054,0061)": { - tag: "(0054,0061)", - vr: "US", - vm: "1", - name: "NumberOfRRIntervals", - }, - "(0054,0062)": { - tag: "(0054,0062)", - vr: "SQ", - vm: "1", - name: "GatedInformationSequence", - }, - "(0054,0063)": { - tag: "(0054,0063)", - vr: "SQ", - vm: "1", - name: "DataInformationSequence", - }, - "(0054,0070)": { - tag: "(0054,0070)", - vr: "US", - vm: "1-n", - name: "TimeSlotVector", - }, - "(0054,0071)": { - tag: "(0054,0071)", - vr: "US", - vm: "1", - name: "NumberOfTimeSlots", - }, - "(0054,0072)": { - tag: "(0054,0072)", - vr: "SQ", - vm: "1", - name: "TimeSlotInformationSequence", - }, - "(0054,0073)": { - tag: "(0054,0073)", - vr: "DS", - vm: "1", - name: "TimeSlotTime", - }, - "(0054,0080)": { - tag: "(0054,0080)", - vr: "US", - vm: "1-n", - name: "SliceVector", - }, - "(0054,0081)": { - tag: "(0054,0081)", - vr: "US", - vm: "1", - name: "NumberOfSlices", - }, - "(0054,0090)": { - tag: "(0054,0090)", - vr: "US", - vm: "1-n", - name: "AngularViewVector", - }, - "(0054,0100)": { - tag: "(0054,0100)", - vr: "US", - vm: "1-n", - name: "TimeSliceVector", - }, - "(0054,0101)": { - tag: "(0054,0101)", - vr: "US", - vm: "1", - name: "NumberOfTimeSlices", - }, - "(0054,0200)": { tag: "(0054,0200)", vr: "DS", vm: "1", name: "StartAngle" }, - "(0054,0202)": { - tag: "(0054,0202)", - vr: "CS", - vm: "1", - name: "TypeOfDetectorMotion", - }, - "(0054,0210)": { - tag: "(0054,0210)", - vr: "IS", - vm: "1-n", - name: "TriggerVector", - }, - "(0054,0211)": { - tag: "(0054,0211)", - vr: "US", - vm: "1", - name: "NumberOfTriggersInPhase", - }, - "(0054,0220)": { - tag: "(0054,0220)", - vr: "SQ", - vm: "1", - name: "ViewCodeSequence", - }, - "(0054,0222)": { - tag: "(0054,0222)", - vr: "SQ", - vm: "1", - name: "ViewModifierCodeSequence", - }, - "(0054,0300)": { - tag: "(0054,0300)", - vr: "SQ", - vm: "1", - name: "RadionuclideCodeSequence", - }, - "(0054,0302)": { - tag: "(0054,0302)", - vr: "SQ", - vm: "1", - name: "AdministrationRouteCodeSequence", - }, - "(0054,0304)": { - tag: "(0054,0304)", - vr: "SQ", - vm: "1", - name: "RadiopharmaceuticalCodeSequence", - }, - "(0054,0306)": { - tag: "(0054,0306)", - vr: "SQ", - vm: "1", - name: "CalibrationDataSequence", - }, - "(0054,0308)": { - tag: "(0054,0308)", - vr: "US", - vm: "1", - name: "EnergyWindowNumber", - }, - "(0054,0400)": { tag: "(0054,0400)", vr: "SH", vm: "1", name: "ImageID" }, - "(0054,0410)": { - tag: "(0054,0410)", - vr: "SQ", - vm: "1", - name: "PatientOrientationCodeSequence", - }, - "(0054,0412)": { - tag: "(0054,0412)", - vr: "SQ", - vm: "1", - name: "PatientOrientationModifierCodeSequence", - }, - "(0054,0414)": { - tag: "(0054,0414)", - vr: "SQ", - vm: "1", - name: "PatientGantryRelationshipCodeSequence", - }, - "(0054,0500)": { - tag: "(0054,0500)", - vr: "CS", - vm: "1", - name: "SliceProgressionDirection", - }, - "(0054,0501)": { - tag: "(0054,0501)", - vr: "CS", - vm: "1", - name: "ScanProgressionDirection", - }, - "(0054,1000)": { tag: "(0054,1000)", vr: "CS", vm: "2", name: "SeriesType" }, - "(0054,1001)": { tag: "(0054,1001)", vr: "CS", vm: "1", name: "Units" }, - "(0054,1002)": { - tag: "(0054,1002)", - vr: "CS", - vm: "1", - name: "CountsSource", - }, - "(0054,1004)": { - tag: "(0054,1004)", - vr: "CS", - vm: "1", - name: "ReprojectionMethod", - }, - "(0054,1006)": { tag: "(0054,1006)", vr: "CS", vm: "1", name: "SUVType" }, - "(0054,1100)": { - tag: "(0054,1100)", - vr: "CS", - vm: "1", - name: "RandomsCorrectionMethod", - }, - "(0054,1101)": { - tag: "(0054,1101)", - vr: "LO", - vm: "1", - name: "AttenuationCorrectionMethod", - }, - "(0054,1102)": { - tag: "(0054,1102)", - vr: "CS", - vm: "1", - name: "DecayCorrection", - }, - "(0054,1103)": { - tag: "(0054,1103)", - vr: "LO", - vm: "1", - name: "ReconstructionMethod", - }, - "(0054,1104)": { - tag: "(0054,1104)", - vr: "LO", - vm: "1", - name: "DetectorLinesOfResponseUsed", - }, - "(0054,1105)": { - tag: "(0054,1105)", - vr: "LO", - vm: "1", - name: "ScatterCorrectionMethod", - }, - "(0054,1200)": { - tag: "(0054,1200)", - vr: "DS", - vm: "1", - name: "AxialAcceptance", - }, - "(0054,1201)": { tag: "(0054,1201)", vr: "IS", vm: "2", name: "AxialMash" }, - "(0054,1202)": { - tag: "(0054,1202)", - vr: "IS", - vm: "1", - name: "TransverseMash", - }, - "(0054,1203)": { - tag: "(0054,1203)", - vr: "DS", - vm: "2", - name: "DetectorElementSize", - }, - "(0054,1210)": { - tag: "(0054,1210)", - vr: "DS", - vm: "1", - name: "CoincidenceWindowWidth", - }, - "(0054,1220)": { - tag: "(0054,1220)", - vr: "CS", - vm: "1-n", - name: "SecondaryCountsType", - }, - "(0054,1300)": { - tag: "(0054,1300)", - vr: "DS", - vm: "1", - name: "FrameReferenceTime", - }, - "(0054,1310)": { - tag: "(0054,1310)", - vr: "IS", - vm: "1", - name: "PrimaryPromptsCountsAccumulated", - }, - "(0054,1311)": { - tag: "(0054,1311)", - vr: "IS", - vm: "1-n", - name: "SecondaryCountsAccumulated", - }, - "(0054,1320)": { - tag: "(0054,1320)", - vr: "DS", - vm: "1", - name: "SliceSensitivityFactor", - }, - "(0054,1321)": { tag: "(0054,1321)", vr: "DS", vm: "1", name: "DecayFactor" }, - "(0054,1322)": { - tag: "(0054,1322)", - vr: "DS", - vm: "1", - name: "DoseCalibrationFactor", - }, - "(0054,1323)": { - tag: "(0054,1323)", - vr: "DS", - vm: "1", - name: "ScatterFractionFactor", - }, - "(0054,1324)": { - tag: "(0054,1324)", - vr: "DS", - vm: "1", - name: "DeadTimeFactor", - }, - "(0054,1330)": { tag: "(0054,1330)", vr: "US", vm: "1", name: "ImageIndex" }, - "(0054,1400)": { - tag: "(0054,1400)", - vr: "CS", - vm: "1-n", - name: "CountsIncluded", - }, - "(0054,1401)": { - tag: "(0054,1401)", - vr: "CS", - vm: "1", - name: "DeadTimeCorrectionFlag", - }, - "(0060,3000)": { - tag: "(0060,3000)", - vr: "SQ", - vm: "1", - name: "HistogramSequence", - }, - "(0060,3002)": { - tag: "(0060,3002)", - vr: "US", - vm: "1", - name: "HistogramNumberOfBins", - }, - "(0060,3004)": { - tag: "(0060,3004)", - vr: "US|SS", - vm: "1", - name: "HistogramFirstBinValue", - }, - "(0060,3006)": { - tag: "(0060,3006)", - vr: "US|SS", - vm: "1", - name: "HistogramLastBinValue", - }, - "(0060,3008)": { - tag: "(0060,3008)", - vr: "US", - vm: "1", - name: "HistogramBinWidth", - }, - "(0060,3010)": { - tag: "(0060,3010)", - vr: "LO", - vm: "1", - name: "HistogramExplanation", - }, - "(0060,3020)": { - tag: "(0060,3020)", - vr: "UL", - vm: "1-n", - name: "HistogramData", - }, - "(0062,0001)": { - tag: "(0062,0001)", - vr: "CS", - vm: "1", - name: "SegmentationType", - }, - "(0062,0002)": { - tag: "(0062,0002)", - vr: "SQ", - vm: "1", - name: "SegmentSequence", - }, - "(0062,0003)": { - tag: "(0062,0003)", - vr: "SQ", - vm: "1", - name: "SegmentedPropertyCategoryCodeSequence", - }, - "(0062,0004)": { - tag: "(0062,0004)", - vr: "US", - vm: "1", - name: "SegmentNumber", - }, - "(0062,0005)": { - tag: "(0062,0005)", - vr: "LO", - vm: "1", - name: "SegmentLabel", - }, - "(0062,0006)": { - tag: "(0062,0006)", - vr: "ST", - vm: "1", - name: "SegmentDescription", - }, - "(0062,0007)": { - tag: "(0062,0007)", - vr: "SQ", - vm: "1", - name: "SegmentationAlgorithmIdentificationSequence", - }, - "(0062,0008)": { - tag: "(0062,0008)", - vr: "CS", - vm: "1", - name: "SegmentAlgorithmType", - }, - "(0062,0009)": { - tag: "(0062,0009)", - vr: "LO", - vm: "1-n", - name: "SegmentAlgorithmName", - }, - "(0062,000A)": { - tag: "(0062,000A)", - vr: "SQ", - vm: "1", - name: "SegmentIdentificationSequence", - }, - "(0062,000B)": { - tag: "(0062,000B)", - vr: "US", - vm: "1-n", - name: "ReferencedSegmentNumber", - }, - "(0062,000C)": { - tag: "(0062,000C)", - vr: "US", - vm: "1", - name: "RecommendedDisplayGrayscaleValue", - }, - "(0062,000D)": { - tag: "(0062,000D)", - vr: "US", - vm: "3", - name: "RecommendedDisplayCIELabValue", - }, - "(0062,000E)": { - tag: "(0062,000E)", - vr: "US", - vm: "1", - name: "MaximumFractionalValue", - }, - "(0062,000F)": { - tag: "(0062,000F)", - vr: "SQ", - vm: "1", - name: "SegmentedPropertyTypeCodeSequence", - }, - "(0062,0010)": { - tag: "(0062,0010)", - vr: "CS", - vm: "1", - name: "SegmentationFractionalType", - }, - "(0062,0011)": { - tag: "(0062,0011)", - vr: "SQ", - vm: "1", - name: "SegmentedPropertyTypeModifierCodeSequence", - }, - "(0062,0012)": { - tag: "(0062,0012)", - vr: "SQ", - vm: "1", - name: "UsedSegmentsSequence", - }, - "(0062,0013)": { - tag: "(0062,0013)", - vr: "CS", - vm: "1", - name: "SegmentsOverlap", - }, - "(0062,0020)": { tag: "(0062,0020)", vr: "UT", vm: "1", name: "TrackingID" }, - "(0062,0021)": { tag: "(0062,0021)", vr: "UI", vm: "1", name: "TrackingUID" }, - "(0064,0002)": { - tag: "(0064,0002)", - vr: "SQ", - vm: "1", - name: "DeformableRegistrationSequence", - }, - "(0064,0003)": { - tag: "(0064,0003)", - vr: "UI", - vm: "1", - name: "SourceFrameOfReferenceUID", - }, - "(0064,0005)": { - tag: "(0064,0005)", - vr: "SQ", - vm: "1", - name: "DeformableRegistrationGridSequence", - }, - "(0064,0007)": { - tag: "(0064,0007)", - vr: "UL", - vm: "3", - name: "GridDimensions", - }, - "(0064,0008)": { - tag: "(0064,0008)", - vr: "FD", - vm: "3", - name: "GridResolution", - }, - "(0064,0009)": { - tag: "(0064,0009)", - vr: "OF", - vm: "1", - name: "VectorGridData", - }, - "(0064,000F)": { - tag: "(0064,000F)", - vr: "SQ", - vm: "1", - name: "PreDeformationMatrixRegistrationSequence", - }, - "(0064,0010)": { - tag: "(0064,0010)", - vr: "SQ", - vm: "1", - name: "PostDeformationMatrixRegistrationSequence", - }, - "(0066,0001)": { - tag: "(0066,0001)", - vr: "UL", - vm: "1", - name: "NumberOfSurfaces", - }, - "(0066,0002)": { - tag: "(0066,0002)", - vr: "SQ", - vm: "1", - name: "SurfaceSequence", - }, - "(0066,0003)": { - tag: "(0066,0003)", - vr: "UL", - vm: "1", - name: "SurfaceNumber", - }, - "(0066,0004)": { - tag: "(0066,0004)", - vr: "LT", - vm: "1", - name: "SurfaceComments", - }, - "(0066,0009)": { - tag: "(0066,0009)", - vr: "CS", - vm: "1", - name: "SurfaceProcessing", - }, - "(0066,000A)": { - tag: "(0066,000A)", - vr: "FL", - vm: "1", - name: "SurfaceProcessingRatio", - }, - "(0066,000B)": { - tag: "(0066,000B)", - vr: "LO", - vm: "1", - name: "SurfaceProcessingDescription", - }, - "(0066,000C)": { - tag: "(0066,000C)", - vr: "FL", - vm: "1", - name: "RecommendedPresentationOpacity", - }, - "(0066,000D)": { - tag: "(0066,000D)", - vr: "CS", - vm: "1", - name: "RecommendedPresentationType", - }, - "(0066,000E)": { - tag: "(0066,000E)", - vr: "CS", - vm: "1", - name: "FiniteVolume", - }, - "(0066,0010)": { tag: "(0066,0010)", vr: "CS", vm: "1", name: "Manifold" }, - "(0066,0011)": { - tag: "(0066,0011)", - vr: "SQ", - vm: "1", - name: "SurfacePointsSequence", - }, - "(0066,0012)": { - tag: "(0066,0012)", - vr: "SQ", - vm: "1", - name: "SurfacePointsNormalsSequence", - }, - "(0066,0013)": { - tag: "(0066,0013)", - vr: "SQ", - vm: "1", - name: "SurfaceMeshPrimitivesSequence", - }, - "(0066,0015)": { - tag: "(0066,0015)", - vr: "UL", - vm: "1", - name: "NumberOfSurfacePoints", - }, - "(0066,0016)": { - tag: "(0066,0016)", - vr: "OF", - vm: "1", - name: "PointCoordinatesData", - }, - "(0066,0017)": { - tag: "(0066,0017)", - vr: "FL", - vm: "3", - name: "PointPositionAccuracy", - }, - "(0066,0018)": { - tag: "(0066,0018)", - vr: "FL", - vm: "1", - name: "MeanPointDistance", - }, - "(0066,0019)": { - tag: "(0066,0019)", - vr: "FL", - vm: "1", - name: "MaximumPointDistance", - }, - "(0066,001A)": { - tag: "(0066,001A)", - vr: "FL", - vm: "6", - name: "PointsBoundingBoxCoordinates", - }, - "(0066,001B)": { - tag: "(0066,001B)", - vr: "FL", - vm: "3", - name: "AxisOfRotation", - }, - "(0066,001C)": { - tag: "(0066,001C)", - vr: "FL", - vm: "3", - name: "CenterOfRotation", - }, - "(0066,001E)": { - tag: "(0066,001E)", - vr: "UL", - vm: "1", - name: "NumberOfVectors", - }, - "(0066,001F)": { - tag: "(0066,001F)", - vr: "US", - vm: "1", - name: "VectorDimensionality", - }, - "(0066,0020)": { - tag: "(0066,0020)", - vr: "FL", - vm: "1-n", - name: "VectorAccuracy", - }, - "(0066,0021)": { - tag: "(0066,0021)", - vr: "OF", - vm: "1", - name: "VectorCoordinateData", - }, - "(0066,0022)": { - tag: "(0066,0022)", - vr: "OD", - vm: "1", - name: "DoublePointCoordinatesData", - }, - "(0066,0023)": { - tag: "(0066,0023)", - vr: "OW", - vm: "1", - name: "TrianglePointIndexList", - }, - "(0066,0024)": { - tag: "(0066,0024)", - vr: "OW", - vm: "1", - name: "EdgePointIndexList", - }, - "(0066,0025)": { - tag: "(0066,0025)", - vr: "OW", - vm: "1", - name: "VertexPointIndexList", - }, - "(0066,0026)": { - tag: "(0066,0026)", - vr: "SQ", - vm: "1", - name: "TriangleStripSequence", - }, - "(0066,0027)": { - tag: "(0066,0027)", - vr: "SQ", - vm: "1", - name: "TriangleFanSequence", - }, - "(0066,0028)": { - tag: "(0066,0028)", - vr: "SQ", - vm: "1", - name: "LineSequence", - }, - "(0066,0029)": { - tag: "(0066,0029)", - vr: "OW", - vm: "1", - name: "PrimitivePointIndexList", - }, - "(0066,002A)": { - tag: "(0066,002A)", - vr: "UL", - vm: "1", - name: "SurfaceCount", - }, - "(0066,002B)": { - tag: "(0066,002B)", - vr: "SQ", - vm: "1", - name: "ReferencedSurfaceSequence", - }, - "(0066,002C)": { - tag: "(0066,002C)", - vr: "UL", - vm: "1", - name: "ReferencedSurfaceNumber", - }, - "(0066,002D)": { - tag: "(0066,002D)", - vr: "SQ", - vm: "1", - name: "SegmentSurfaceGenerationAlgorithmIdentificationSequence", - }, - "(0066,002E)": { - tag: "(0066,002E)", - vr: "SQ", - vm: "1", - name: "SegmentSurfaceSourceInstanceSequence", - }, - "(0066,002F)": { - tag: "(0066,002F)", - vr: "SQ", - vm: "1", - name: "AlgorithmFamilyCodeSequence", - }, - "(0066,0030)": { - tag: "(0066,0030)", - vr: "SQ", - vm: "1", - name: "AlgorithmNameCodeSequence", - }, - "(0066,0031)": { - tag: "(0066,0031)", - vr: "LO", - vm: "1", - name: "AlgorithmVersion", - }, - "(0066,0032)": { - tag: "(0066,0032)", - vr: "LT", - vm: "1", - name: "AlgorithmParameters", - }, - "(0066,0034)": { - tag: "(0066,0034)", - vr: "SQ", - vm: "1", - name: "FacetSequence", - }, - "(0066,0035)": { - tag: "(0066,0035)", - vr: "SQ", - vm: "1", - name: "SurfaceProcessingAlgorithmIdentificationSequence", - }, - "(0066,0036)": { - tag: "(0066,0036)", - vr: "LO", - vm: "1", - name: "AlgorithmName", - }, - "(0066,0037)": { - tag: "(0066,0037)", - vr: "FL", - vm: "1", - name: "RecommendedPointRadius", - }, - "(0066,0038)": { - tag: "(0066,0038)", - vr: "FL", - vm: "1", - name: "RecommendedLineThickness", - }, - "(0066,0040)": { - tag: "(0066,0040)", - vr: "OL", - vm: "1", - name: "LongPrimitivePointIndexList", - }, - "(0066,0041)": { - tag: "(0066,0041)", - vr: "OL", - vm: "1", - name: "LongTrianglePointIndexList", - }, - "(0066,0042)": { - tag: "(0066,0042)", - vr: "OL", - vm: "1", - name: "LongEdgePointIndexList", - }, - "(0066,0043)": { - tag: "(0066,0043)", - vr: "OL", - vm: "1", - name: "LongVertexPointIndexList", - }, - "(0066,0101)": { - tag: "(0066,0101)", - vr: "SQ", - vm: "1", - name: "TrackSetSequence", - }, - "(0066,0102)": { - tag: "(0066,0102)", - vr: "SQ", - vm: "1", - name: "TrackSequence", - }, - "(0066,0103)": { - tag: "(0066,0103)", - vr: "OW", - vm: "1", - name: "RecommendedDisplayCIELabValueList", - }, - "(0066,0104)": { - tag: "(0066,0104)", - vr: "SQ", - vm: "1", - name: "TrackingAlgorithmIdentificationSequence", - }, - "(0066,0105)": { - tag: "(0066,0105)", - vr: "UL", - vm: "1", - name: "TrackSetNumber", - }, - "(0066,0106)": { - tag: "(0066,0106)", - vr: "LO", - vm: "1", - name: "TrackSetLabel", - }, - "(0066,0107)": { - tag: "(0066,0107)", - vr: "UT", - vm: "1", - name: "TrackSetDescription", - }, - "(0066,0108)": { - tag: "(0066,0108)", - vr: "SQ", - vm: "1", - name: "TrackSetAnatomicalTypeCodeSequence", - }, - "(0066,0121)": { - tag: "(0066,0121)", - vr: "SQ", - vm: "1", - name: "MeasurementsSequence", - }, - "(0066,0124)": { - tag: "(0066,0124)", - vr: "SQ", - vm: "1", - name: "TrackSetStatisticsSequence", - }, - "(0066,0125)": { - tag: "(0066,0125)", - vr: "OF", - vm: "1", - name: "FloatingPointValues", - }, - "(0066,0129)": { - tag: "(0066,0129)", - vr: "OL", - vm: "1", - name: "TrackPointIndexList", - }, - "(0066,0130)": { - tag: "(0066,0130)", - vr: "SQ", - vm: "1", - name: "TrackStatisticsSequence", - }, - "(0066,0132)": { - tag: "(0066,0132)", - vr: "SQ", - vm: "1", - name: "MeasurementValuesSequence", - }, - "(0066,0133)": { - tag: "(0066,0133)", - vr: "SQ", - vm: "1", - name: "DiffusionAcquisitionCodeSequence", - }, - "(0066,0134)": { - tag: "(0066,0134)", - vr: "SQ", - vm: "1", - name: "DiffusionModelCodeSequence", - }, - "(0068,6210)": { tag: "(0068,6210)", vr: "LO", vm: "1", name: "ImplantSize" }, - "(0068,6221)": { - tag: "(0068,6221)", - vr: "LO", - vm: "1", - name: "ImplantTemplateVersion", - }, - "(0068,6222)": { - tag: "(0068,6222)", - vr: "SQ", - vm: "1", - name: "ReplacedImplantTemplateSequence", - }, - "(0068,6223)": { tag: "(0068,6223)", vr: "CS", vm: "1", name: "ImplantType" }, - "(0068,6224)": { - tag: "(0068,6224)", - vr: "SQ", - vm: "1", - name: "DerivationImplantTemplateSequence", - }, - "(0068,6225)": { - tag: "(0068,6225)", - vr: "SQ", - vm: "1", - name: "OriginalImplantTemplateSequence", - }, - "(0068,6226)": { - tag: "(0068,6226)", - vr: "DT", - vm: "1", - name: "EffectiveDateTime", - }, - "(0068,6230)": { - tag: "(0068,6230)", - vr: "SQ", - vm: "1", - name: "ImplantTargetAnatomySequence", - }, - "(0068,6260)": { - tag: "(0068,6260)", - vr: "SQ", - vm: "1", - name: "InformationFromManufacturerSequence", - }, - "(0068,6265)": { - tag: "(0068,6265)", - vr: "SQ", - vm: "1", - name: "NotificationFromManufacturerSequence", - }, - "(0068,6270)": { - tag: "(0068,6270)", - vr: "DT", - vm: "1", - name: "InformationIssueDateTime", - }, - "(0068,6280)": { - tag: "(0068,6280)", - vr: "ST", - vm: "1", - name: "InformationSummary", - }, - "(0068,62A0)": { - tag: "(0068,62A0)", - vr: "SQ", - vm: "1", - name: "ImplantRegulatoryDisapprovalCodeSequence", - }, - "(0068,62A5)": { - tag: "(0068,62A5)", - vr: "FD", - vm: "1", - name: "OverallTemplateSpatialTolerance", - }, - "(0068,62C0)": { - tag: "(0068,62C0)", - vr: "SQ", - vm: "1", - name: "HPGLDocumentSequence", - }, - "(0068,62D0)": { - tag: "(0068,62D0)", - vr: "US", - vm: "1", - name: "HPGLDocumentID", - }, - "(0068,62D5)": { - tag: "(0068,62D5)", - vr: "LO", - vm: "1", - name: "HPGLDocumentLabel", - }, - "(0068,62E0)": { - tag: "(0068,62E0)", - vr: "SQ", - vm: "1", - name: "ViewOrientationCodeSequence", - }, - "(0068,62F0)": { - tag: "(0068,62F0)", - vr: "SQ", - vm: "1", - name: "ViewOrientationModifierCodeSequence", - }, - "(0068,62F2)": { - tag: "(0068,62F2)", - vr: "FD", - vm: "1", - name: "HPGLDocumentScaling", - }, - "(0068,6300)": { - tag: "(0068,6300)", - vr: "OB", - vm: "1", - name: "HPGLDocument", - }, - "(0068,6310)": { - tag: "(0068,6310)", - vr: "US", - vm: "1", - name: "HPGLContourPenNumber", - }, - "(0068,6320)": { - tag: "(0068,6320)", - vr: "SQ", - vm: "1", - name: "HPGLPenSequence", - }, - "(0068,6330)": { - tag: "(0068,6330)", - vr: "US", - vm: "1", - name: "HPGLPenNumber", - }, - "(0068,6340)": { - tag: "(0068,6340)", - vr: "LO", - vm: "1", - name: "HPGLPenLabel", - }, - "(0068,6345)": { - tag: "(0068,6345)", - vr: "ST", - vm: "1", - name: "HPGLPenDescription", - }, - "(0068,6346)": { - tag: "(0068,6346)", - vr: "FD", - vm: "2", - name: "RecommendedRotationPoint", - }, - "(0068,6347)": { - tag: "(0068,6347)", - vr: "FD", - vm: "4", - name: "BoundingRectangle", - }, - "(0068,6350)": { - tag: "(0068,6350)", - vr: "US", - vm: "1-n", - name: "ImplantTemplate3DModelSurfaceNumber", - }, - "(0068,6360)": { - tag: "(0068,6360)", - vr: "SQ", - vm: "1", - name: "SurfaceModelDescriptionSequence", - }, - "(0068,6380)": { - tag: "(0068,6380)", - vr: "LO", - vm: "1", - name: "SurfaceModelLabel", - }, - "(0068,6390)": { - tag: "(0068,6390)", - vr: "FD", - vm: "1", - name: "SurfaceModelScalingFactor", - }, - "(0068,63A0)": { - tag: "(0068,63A0)", - vr: "SQ", - vm: "1", - name: "MaterialsCodeSequence", - }, - "(0068,63A4)": { - tag: "(0068,63A4)", - vr: "SQ", - vm: "1", - name: "CoatingMaterialsCodeSequence", - }, - "(0068,63A8)": { - tag: "(0068,63A8)", - vr: "SQ", - vm: "1", - name: "ImplantTypeCodeSequence", - }, - "(0068,63AC)": { - tag: "(0068,63AC)", - vr: "SQ", - vm: "1", - name: "FixationMethodCodeSequence", - }, - "(0068,63B0)": { - tag: "(0068,63B0)", - vr: "SQ", - vm: "1", - name: "MatingFeatureSetsSequence", - }, - "(0068,63C0)": { - tag: "(0068,63C0)", - vr: "US", - vm: "1", - name: "MatingFeatureSetID", - }, - "(0068,63D0)": { - tag: "(0068,63D0)", - vr: "LO", - vm: "1", - name: "MatingFeatureSetLabel", - }, - "(0068,63E0)": { - tag: "(0068,63E0)", - vr: "SQ", - vm: "1", - name: "MatingFeatureSequence", - }, - "(0068,63F0)": { - tag: "(0068,63F0)", - vr: "US", - vm: "1", - name: "MatingFeatureID", - }, - "(0068,6400)": { - tag: "(0068,6400)", - vr: "SQ", - vm: "1", - name: "MatingFeatureDegreeOfFreedomSequence", - }, - "(0068,6410)": { - tag: "(0068,6410)", - vr: "US", - vm: "1", - name: "DegreeOfFreedomID", - }, - "(0068,6420)": { - tag: "(0068,6420)", - vr: "CS", - vm: "1", - name: "DegreeOfFreedomType", - }, - "(0068,6430)": { - tag: "(0068,6430)", - vr: "SQ", - vm: "1", - name: "TwoDMatingFeatureCoordinatesSequence", - }, - "(0068,6440)": { - tag: "(0068,6440)", - vr: "US", - vm: "1", - name: "ReferencedHPGLDocumentID", - }, - "(0068,6450)": { - tag: "(0068,6450)", - vr: "FD", - vm: "2", - name: "TwoDMatingPoint", - }, - "(0068,6460)": { - tag: "(0068,6460)", - vr: "FD", - vm: "4", - name: "TwoDMatingAxes", - }, - "(0068,6470)": { - tag: "(0068,6470)", - vr: "SQ", - vm: "1", - name: "TwoDDegreeOfFreedomSequence", - }, - "(0068,6490)": { - tag: "(0068,6490)", - vr: "FD", - vm: "3", - name: "ThreeDDegreeOfFreedomAxis", - }, - "(0068,64A0)": { - tag: "(0068,64A0)", - vr: "FD", - vm: "2", - name: "RangeOfFreedom", - }, - "(0068,64C0)": { - tag: "(0068,64C0)", - vr: "FD", - vm: "3", - name: "ThreeDMatingPoint", - }, - "(0068,64D0)": { - tag: "(0068,64D0)", - vr: "FD", - vm: "9", - name: "ThreeDMatingAxes", - }, - "(0068,64F0)": { - tag: "(0068,64F0)", - vr: "FD", - vm: "3", - name: "TwoDDegreeOfFreedomAxis", - }, - "(0068,6500)": { - tag: "(0068,6500)", - vr: "SQ", - vm: "1", - name: "PlanningLandmarkPointSequence", - }, - "(0068,6510)": { - tag: "(0068,6510)", - vr: "SQ", - vm: "1", - name: "PlanningLandmarkLineSequence", - }, - "(0068,6520)": { - tag: "(0068,6520)", - vr: "SQ", - vm: "1", - name: "PlanningLandmarkPlaneSequence", - }, - "(0068,6530)": { - tag: "(0068,6530)", - vr: "US", - vm: "1", - name: "PlanningLandmarkID", - }, - "(0068,6540)": { - tag: "(0068,6540)", - vr: "LO", - vm: "1", - name: "PlanningLandmarkDescription", - }, - "(0068,6545)": { - tag: "(0068,6545)", - vr: "SQ", - vm: "1", - name: "PlanningLandmarkIdentificationCodeSequence", - }, - "(0068,6550)": { - tag: "(0068,6550)", - vr: "SQ", - vm: "1", - name: "TwoDPointCoordinatesSequence", - }, - "(0068,6560)": { - tag: "(0068,6560)", - vr: "FD", - vm: "2", - name: "TwoDPointCoordinates", - }, - "(0068,6590)": { - tag: "(0068,6590)", - vr: "FD", - vm: "3", - name: "ThreeDPointCoordinates", - }, - "(0068,65A0)": { - tag: "(0068,65A0)", - vr: "SQ", - vm: "1", - name: "TwoDLineCoordinatesSequence", - }, - "(0068,65B0)": { - tag: "(0068,65B0)", - vr: "FD", - vm: "4", - name: "TwoDLineCoordinates", - }, - "(0068,65D0)": { - tag: "(0068,65D0)", - vr: "FD", - vm: "6", - name: "ThreeDLineCoordinates", - }, - "(0068,65E0)": { - tag: "(0068,65E0)", - vr: "SQ", - vm: "1", - name: "TwoDPlaneCoordinatesSequence", - }, - "(0068,65F0)": { - tag: "(0068,65F0)", - vr: "FD", - vm: "4", - name: "TwoDPlaneIntersection", - }, - "(0068,6610)": { - tag: "(0068,6610)", - vr: "FD", - vm: "3", - name: "ThreeDPlaneOrigin", - }, - "(0068,6620)": { - tag: "(0068,6620)", - vr: "FD", - vm: "3", - name: "ThreeDPlaneNormal", - }, - "(0068,7001)": { - tag: "(0068,7001)", - vr: "CS", - vm: "1", - name: "ModelModification", - }, - "(0068,7002)": { - tag: "(0068,7002)", - vr: "CS", - vm: "1", - name: "ModelMirroring", - }, - "(0068,7003)": { - tag: "(0068,7003)", - vr: "SQ", - vm: "1", - name: "ModelUsageCodeSequence", - }, - "(0068,7004)": { - tag: "(0068,7004)", - vr: "UI", - vm: "1", - name: "ModelGroupUID", - }, - "(0068,7005)": { - tag: "(0068,7005)", - vr: "UR", - vm: "1", - name: "RelativeURIReferenceWithinEncapsulatedDocument", - }, - "(006A,0001)": { - tag: "(006A,0001)", - vr: "CS", - vm: "1", - name: "AnnotationCoordinateType", - }, - "(006A,0002)": { - tag: "(006A,0002)", - vr: "SQ", - vm: "1", - name: "AnnotationGroupSequence", - }, - "(006A,0003)": { - tag: "(006A,0003)", - vr: "UI", - vm: "1", - name: "AnnotationGroupUID", - }, - "(006A,0005)": { - tag: "(006A,0005)", - vr: "LO", - vm: "1", - name: "AnnotationGroupLabel", - }, - "(006A,0006)": { - tag: "(006A,0006)", - vr: "UT", - vm: "1", - name: "AnnotationGroupDescription", - }, - "(006A,0007)": { - tag: "(006A,0007)", - vr: "CS", - vm: "1", - name: "AnnotationGroupGenerationType", - }, - "(006A,0008)": { - tag: "(006A,0008)", - vr: "SQ", - vm: "1", - name: "AnnotationGroupAlgorithmIdentificationSequence", - }, - "(006A,0009)": { - tag: "(006A,0009)", - vr: "SQ", - vm: "1", - name: "AnnotationPropertyCategoryCodeSequence", - }, - "(006A,000A)": { - tag: "(006A,000A)", - vr: "SQ", - vm: "1", - name: "AnnotationPropertyTypeCodeSequence", - }, - "(006A,000B)": { - tag: "(006A,000B)", - vr: "SQ", - vm: "1", - name: "AnnotationPropertyTypeModifierCodeSequence", - }, - "(006A,000C)": { - tag: "(006A,000C)", - vr: "UL", - vm: "1", - name: "NumberOfAnnotations", - }, - "(006A,000D)": { - tag: "(006A,000D)", - vr: "CS", - vm: "1", - name: "AnnotationAppliesToAllOpticalPaths", - }, - "(006A,000E)": { - tag: "(006A,000E)", - vr: "SH", - vm: "1-n", - name: "ReferencedOpticalPathIdentifier", - }, - "(006A,000F)": { - tag: "(006A,000F)", - vr: "CS", - vm: "1", - name: "AnnotationAppliesToAllZPlanes", - }, - "(006A,0010)": { - tag: "(006A,0010)", - vr: "FD", - vm: "1-n", - name: "CommonZCoordinateValue", - }, - "(006A,0011)": { - tag: "(006A,0011)", - vr: "OL", - vm: "1", - name: "AnnotationIndexList", - }, - "(0070,0001)": { - tag: "(0070,0001)", - vr: "SQ", - vm: "1", - name: "GraphicAnnotationSequence", - }, - "(0070,0002)": { - tag: "(0070,0002)", - vr: "CS", - vm: "1", - name: "GraphicLayer", - }, - "(0070,0003)": { - tag: "(0070,0003)", - vr: "CS", - vm: "1", - name: "BoundingBoxAnnotationUnits", - }, - "(0070,0004)": { - tag: "(0070,0004)", - vr: "CS", - vm: "1", - name: "AnchorPointAnnotationUnits", - }, - "(0070,0005)": { - tag: "(0070,0005)", - vr: "CS", - vm: "1", - name: "GraphicAnnotationUnits", - }, - "(0070,0006)": { - tag: "(0070,0006)", - vr: "ST", - vm: "1", - name: "UnformattedTextValue", - }, - "(0070,0008)": { - tag: "(0070,0008)", - vr: "SQ", - vm: "1", - name: "TextObjectSequence", - }, - "(0070,0009)": { - tag: "(0070,0009)", - vr: "SQ", - vm: "1", - name: "GraphicObjectSequence", - }, - "(0070,0010)": { - tag: "(0070,0010)", - vr: "FL", - vm: "2", - name: "BoundingBoxTopLeftHandCorner", - }, - "(0070,0011)": { - tag: "(0070,0011)", - vr: "FL", - vm: "2", - name: "BoundingBoxBottomRightHandCorner", - }, - "(0070,0012)": { - tag: "(0070,0012)", - vr: "CS", - vm: "1", - name: "BoundingBoxTextHorizontalJustification", - }, - "(0070,0014)": { tag: "(0070,0014)", vr: "FL", vm: "2", name: "AnchorPoint" }, - "(0070,0015)": { - tag: "(0070,0015)", - vr: "CS", - vm: "1", - name: "AnchorPointVisibility", - }, - "(0070,0020)": { - tag: "(0070,0020)", - vr: "US", - vm: "1", - name: "GraphicDimensions", - }, - "(0070,0021)": { - tag: "(0070,0021)", - vr: "US", - vm: "1", - name: "NumberOfGraphicPoints", - }, - "(0070,0022)": { - tag: "(0070,0022)", - vr: "FL", - vm: "2-n", - name: "GraphicData", - }, - "(0070,0023)": { tag: "(0070,0023)", vr: "CS", vm: "1", name: "GraphicType" }, - "(0070,0024)": { - tag: "(0070,0024)", - vr: "CS", - vm: "1", - name: "GraphicFilled", - }, - "(0070,0040)": { - tag: "(0070,0040)", - vr: "IS", - vm: "1", - name: "ImageRotationRetired", - }, - "(0070,0041)": { - tag: "(0070,0041)", - vr: "CS", - vm: "1", - name: "ImageHorizontalFlip", - }, - "(0070,0042)": { - tag: "(0070,0042)", - vr: "US", - vm: "1", - name: "ImageRotation", - }, - "(0070,0050)": { - tag: "(0070,0050)", - vr: "US", - vm: "2", - name: "DisplayedAreaTopLeftHandCornerTrial", - }, - "(0070,0051)": { - tag: "(0070,0051)", - vr: "US", - vm: "2", - name: "DisplayedAreaBottomRightHandCornerTrial", - }, - "(0070,0052)": { - tag: "(0070,0052)", - vr: "SL", - vm: "2", - name: "DisplayedAreaTopLeftHandCorner", - }, - "(0070,0053)": { - tag: "(0070,0053)", - vr: "SL", - vm: "2", - name: "DisplayedAreaBottomRightHandCorner", - }, - "(0070,005A)": { - tag: "(0070,005A)", - vr: "SQ", - vm: "1", - name: "DisplayedAreaSelectionSequence", - }, - "(0070,0060)": { - tag: "(0070,0060)", - vr: "SQ", - vm: "1", - name: "GraphicLayerSequence", - }, - "(0070,0062)": { - tag: "(0070,0062)", - vr: "IS", - vm: "1", - name: "GraphicLayerOrder", - }, - "(0070,0066)": { - tag: "(0070,0066)", - vr: "US", - vm: "1", - name: "GraphicLayerRecommendedDisplayGrayscaleValue", - }, - "(0070,0067)": { - tag: "(0070,0067)", - vr: "US", - vm: "3", - name: "GraphicLayerRecommendedDisplayRGBValue", - }, - "(0070,0068)": { - tag: "(0070,0068)", - vr: "LO", - vm: "1", - name: "GraphicLayerDescription", - }, - "(0070,0080)": { - tag: "(0070,0080)", - vr: "CS", - vm: "1", - name: "ContentLabel", - }, - "(0070,0081)": { - tag: "(0070,0081)", - vr: "LO", - vm: "1", - name: "ContentDescription", - }, - "(0070,0082)": { - tag: "(0070,0082)", - vr: "DA", - vm: "1", - name: "PresentationCreationDate", - }, - "(0070,0083)": { - tag: "(0070,0083)", - vr: "TM", - vm: "1", - name: "PresentationCreationTime", - }, - "(0070,0084)": { - tag: "(0070,0084)", - vr: "PN", - vm: "1", - name: "ContentCreatorName", - }, - "(0070,0086)": { - tag: "(0070,0086)", - vr: "SQ", - vm: "1", - name: "ContentCreatorIdentificationCodeSequence", - }, - "(0070,0087)": { - tag: "(0070,0087)", - vr: "SQ", - vm: "1", - name: "AlternateContentDescriptionSequence", - }, - "(0070,0100)": { - tag: "(0070,0100)", - vr: "CS", - vm: "1", - name: "PresentationSizeMode", - }, - "(0070,0101)": { - tag: "(0070,0101)", - vr: "DS", - vm: "2", - name: "PresentationPixelSpacing", - }, - "(0070,0102)": { - tag: "(0070,0102)", - vr: "IS", - vm: "2", - name: "PresentationPixelAspectRatio", - }, - "(0070,0103)": { - tag: "(0070,0103)", - vr: "FL", - vm: "1", - name: "PresentationPixelMagnificationRatio", - }, - "(0070,0207)": { - tag: "(0070,0207)", - vr: "LO", - vm: "1", - name: "GraphicGroupLabel", - }, - "(0070,0208)": { - tag: "(0070,0208)", - vr: "ST", - vm: "1", - name: "GraphicGroupDescription", - }, - "(0070,0209)": { - tag: "(0070,0209)", - vr: "SQ", - vm: "1", - name: "CompoundGraphicSequence", - }, - "(0070,0226)": { - tag: "(0070,0226)", - vr: "UL", - vm: "1", - name: "CompoundGraphicInstanceID", - }, - "(0070,0227)": { tag: "(0070,0227)", vr: "LO", vm: "1", name: "FontName" }, - "(0070,0228)": { - tag: "(0070,0228)", - vr: "CS", - vm: "1", - name: "FontNameType", - }, - "(0070,0229)": { tag: "(0070,0229)", vr: "LO", vm: "1", name: "CSSFontName" }, - "(0070,0230)": { - tag: "(0070,0230)", - vr: "FD", - vm: "1", - name: "RotationAngle", - }, - "(0070,0231)": { - tag: "(0070,0231)", - vr: "SQ", - vm: "1", - name: "TextStyleSequence", - }, - "(0070,0232)": { - tag: "(0070,0232)", - vr: "SQ", - vm: "1", - name: "LineStyleSequence", - }, - "(0070,0233)": { - tag: "(0070,0233)", - vr: "SQ", - vm: "1", - name: "FillStyleSequence", - }, - "(0070,0234)": { - tag: "(0070,0234)", - vr: "SQ", - vm: "1", - name: "GraphicGroupSequence", - }, - "(0070,0241)": { - tag: "(0070,0241)", - vr: "US", - vm: "3", - name: "TextColorCIELabValue", - }, - "(0070,0242)": { - tag: "(0070,0242)", - vr: "CS", - vm: "1", - name: "HorizontalAlignment", - }, - "(0070,0243)": { - tag: "(0070,0243)", - vr: "CS", - vm: "1", - name: "VerticalAlignment", - }, - "(0070,0244)": { tag: "(0070,0244)", vr: "CS", vm: "1", name: "ShadowStyle" }, - "(0070,0245)": { - tag: "(0070,0245)", - vr: "FL", - vm: "1", - name: "ShadowOffsetX", - }, - "(0070,0246)": { - tag: "(0070,0246)", - vr: "FL", - vm: "1", - name: "ShadowOffsetY", - }, - "(0070,0247)": { - tag: "(0070,0247)", - vr: "US", - vm: "3", - name: "ShadowColorCIELabValue", - }, - "(0070,0248)": { tag: "(0070,0248)", vr: "CS", vm: "1", name: "Underlined" }, - "(0070,0249)": { tag: "(0070,0249)", vr: "CS", vm: "1", name: "Bold" }, - "(0070,0250)": { tag: "(0070,0250)", vr: "CS", vm: "1", name: "Italic" }, - "(0070,0251)": { - tag: "(0070,0251)", - vr: "US", - vm: "3", - name: "PatternOnColorCIELabValue", - }, - "(0070,0252)": { - tag: "(0070,0252)", - vr: "US", - vm: "3", - name: "PatternOffColorCIELabValue", - }, - "(0070,0253)": { - tag: "(0070,0253)", - vr: "FL", - vm: "1", - name: "LineThickness", - }, - "(0070,0254)": { - tag: "(0070,0254)", - vr: "CS", - vm: "1", - name: "LineDashingStyle", - }, - "(0070,0255)": { tag: "(0070,0255)", vr: "UL", vm: "1", name: "LinePattern" }, - "(0070,0256)": { tag: "(0070,0256)", vr: "OB", vm: "1", name: "FillPattern" }, - "(0070,0257)": { tag: "(0070,0257)", vr: "CS", vm: "1", name: "FillMode" }, - "(0070,0258)": { - tag: "(0070,0258)", - vr: "FL", - vm: "1", - name: "ShadowOpacity", - }, - "(0070,0261)": { tag: "(0070,0261)", vr: "FL", vm: "1", name: "GapLength" }, - "(0070,0262)": { - tag: "(0070,0262)", - vr: "FL", - vm: "1", - name: "DiameterOfVisibility", - }, - "(0070,0273)": { - tag: "(0070,0273)", - vr: "FL", - vm: "2", - name: "RotationPoint", - }, - "(0070,0274)": { - tag: "(0070,0274)", - vr: "CS", - vm: "1", - name: "TickAlignment", - }, - "(0070,0278)": { - tag: "(0070,0278)", - vr: "CS", - vm: "1", - name: "ShowTickLabel", - }, - "(0070,0279)": { - tag: "(0070,0279)", - vr: "CS", - vm: "1", - name: "TickLabelAlignment", - }, - "(0070,0282)": { - tag: "(0070,0282)", - vr: "CS", - vm: "1", - name: "CompoundGraphicUnits", - }, - "(0070,0284)": { - tag: "(0070,0284)", - vr: "FL", - vm: "1", - name: "PatternOnOpacity", - }, - "(0070,0285)": { - tag: "(0070,0285)", - vr: "FL", - vm: "1", - name: "PatternOffOpacity", - }, - "(0070,0287)": { - tag: "(0070,0287)", - vr: "SQ", - vm: "1", - name: "MajorTicksSequence", - }, - "(0070,0288)": { - tag: "(0070,0288)", - vr: "FL", - vm: "1", - name: "TickPosition", - }, - "(0070,0289)": { tag: "(0070,0289)", vr: "SH", vm: "1", name: "TickLabel" }, - "(0070,0294)": { - tag: "(0070,0294)", - vr: "CS", - vm: "1", - name: "CompoundGraphicType", - }, - "(0070,0295)": { - tag: "(0070,0295)", - vr: "UL", - vm: "1", - name: "GraphicGroupID", - }, - "(0070,0306)": { tag: "(0070,0306)", vr: "CS", vm: "1", name: "ShapeType" }, - "(0070,0308)": { - tag: "(0070,0308)", - vr: "SQ", - vm: "1", - name: "RegistrationSequence", - }, - "(0070,0309)": { - tag: "(0070,0309)", - vr: "SQ", - vm: "1", - name: "MatrixRegistrationSequence", - }, - "(0070,030A)": { - tag: "(0070,030A)", - vr: "SQ", - vm: "1", - name: "MatrixSequence", - }, - "(0070,030B)": { - tag: "(0070,030B)", - vr: "FD", - vm: "16", - name: "FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix", - }, - "(0070,030C)": { - tag: "(0070,030C)", - vr: "CS", - vm: "1", - name: "FrameOfReferenceTransformationMatrixType", - }, - "(0070,030D)": { - tag: "(0070,030D)", - vr: "SQ", - vm: "1", - name: "RegistrationTypeCodeSequence", - }, - "(0070,030F)": { - tag: "(0070,030F)", - vr: "ST", - vm: "1", - name: "FiducialDescription", - }, - "(0070,0310)": { - tag: "(0070,0310)", - vr: "SH", - vm: "1", - name: "FiducialIdentifier", - }, - "(0070,0311)": { - tag: "(0070,0311)", - vr: "SQ", - vm: "1", - name: "FiducialIdentifierCodeSequence", - }, - "(0070,0312)": { - tag: "(0070,0312)", - vr: "FD", - vm: "1", - name: "ContourUncertaintyRadius", - }, - "(0070,0314)": { - tag: "(0070,0314)", - vr: "SQ", - vm: "1", - name: "UsedFiducialsSequence", - }, - "(0070,0318)": { - tag: "(0070,0318)", - vr: "SQ", - vm: "1", - name: "GraphicCoordinatesDataSequence", - }, - "(0070,031A)": { tag: "(0070,031A)", vr: "UI", vm: "1", name: "FiducialUID" }, - "(0070,031B)": { - tag: "(0070,031B)", - vr: "UI", - vm: "1", - name: "ReferencedFiducialUID", - }, - "(0070,031C)": { - tag: "(0070,031C)", - vr: "SQ", - vm: "1", - name: "FiducialSetSequence", - }, - "(0070,031E)": { - tag: "(0070,031E)", - vr: "SQ", - vm: "1", - name: "FiducialSequence", - }, - "(0070,031F)": { - tag: "(0070,031F)", - vr: "SQ", - vm: "1", - name: "FiducialsPropertyCategoryCodeSequence", - }, - "(0070,0401)": { - tag: "(0070,0401)", - vr: "US", - vm: "3", - name: "GraphicLayerRecommendedDisplayCIELabValue", - }, - "(0070,0402)": { - tag: "(0070,0402)", - vr: "SQ", - vm: "1", - name: "BlendingSequence", - }, - "(0070,0403)": { - tag: "(0070,0403)", - vr: "FL", - vm: "1", - name: "RelativeOpacity", - }, - "(0070,0404)": { - tag: "(0070,0404)", - vr: "SQ", - vm: "1", - name: "ReferencedSpatialRegistrationSequence", - }, - "(0070,0405)": { - tag: "(0070,0405)", - vr: "CS", - vm: "1", - name: "BlendingPosition", - }, - "(0070,1101)": { - tag: "(0070,1101)", - vr: "UI", - vm: "1", - name: "PresentationDisplayCollectionUID", - }, - "(0070,1102)": { - tag: "(0070,1102)", - vr: "UI", - vm: "1", - name: "PresentationSequenceCollectionUID", - }, - "(0070,1103)": { - tag: "(0070,1103)", - vr: "US", - vm: "1", - name: "PresentationSequencePositionIndex", - }, - "(0070,1104)": { - tag: "(0070,1104)", - vr: "SQ", - vm: "1", - name: "RenderedImageReferenceSequence", - }, - "(0070,1201)": { - tag: "(0070,1201)", - vr: "SQ", - vm: "1", - name: "VolumetricPresentationStateInputSequence", - }, - "(0070,1202)": { - tag: "(0070,1202)", - vr: "CS", - vm: "1", - name: "PresentationInputType", - }, - "(0070,1203)": { - tag: "(0070,1203)", - vr: "US", - vm: "1", - name: "InputSequencePositionIndex", - }, - "(0070,1204)": { tag: "(0070,1204)", vr: "CS", vm: "1", name: "Crop" }, - "(0070,1205)": { - tag: "(0070,1205)", - vr: "US", - vm: "1-n", - name: "CroppingSpecificationIndex", - }, - "(0070,1206)": { - tag: "(0070,1206)", - vr: "CS", - vm: "1", - name: "CompositingMethod", - }, - "(0070,1207)": { - tag: "(0070,1207)", - vr: "US", - vm: "1", - name: "VolumetricPresentationInputNumber", - }, - "(0070,1208)": { - tag: "(0070,1208)", - vr: "CS", - vm: "1", - name: "ImageVolumeGeometry", - }, - "(0070,1209)": { - tag: "(0070,1209)", - vr: "UI", - vm: "1", - name: "VolumetricPresentationInputSetUID", - }, - "(0070,120A)": { - tag: "(0070,120A)", - vr: "SQ", - vm: "1", - name: "VolumetricPresentationInputSetSequence", - }, - "(0070,120B)": { tag: "(0070,120B)", vr: "CS", vm: "1", name: "GlobalCrop" }, - "(0070,120C)": { - tag: "(0070,120C)", - vr: "US", - vm: "1-n", - name: "GlobalCroppingSpecificationIndex", - }, - "(0070,120D)": { - tag: "(0070,120D)", - vr: "CS", - vm: "1", - name: "RenderingMethod", - }, - "(0070,1301)": { - tag: "(0070,1301)", - vr: "SQ", - vm: "1", - name: "VolumeCroppingSequence", - }, - "(0070,1302)": { - tag: "(0070,1302)", - vr: "CS", - vm: "1", - name: "VolumeCroppingMethod", - }, - "(0070,1303)": { - tag: "(0070,1303)", - vr: "FD", - vm: "6", - name: "BoundingBoxCrop", - }, - "(0070,1304)": { - tag: "(0070,1304)", - vr: "SQ", - vm: "1", - name: "ObliqueCroppingPlaneSequence", - }, - "(0070,1305)": { tag: "(0070,1305)", vr: "FD", vm: "4", name: "Plane" }, - "(0070,1306)": { tag: "(0070,1306)", vr: "FD", vm: "3", name: "PlaneNormal" }, - "(0070,1309)": { - tag: "(0070,1309)", - vr: "US", - vm: "1", - name: "CroppingSpecificationNumber", - }, - "(0070,1501)": { - tag: "(0070,1501)", - vr: "CS", - vm: "1", - name: "MultiPlanarReconstructionStyle", - }, - "(0070,1502)": { - tag: "(0070,1502)", - vr: "CS", - vm: "1", - name: "MPRThicknessType", - }, - "(0070,1503)": { - tag: "(0070,1503)", - vr: "FD", - vm: "1", - name: "MPRSlabThickness", - }, - "(0070,1505)": { - tag: "(0070,1505)", - vr: "FD", - vm: "3", - name: "MPRTopLeftHandCorner", - }, - "(0070,1507)": { - tag: "(0070,1507)", - vr: "FD", - vm: "3", - name: "MPRViewWidthDirection", - }, - "(0070,1508)": { - tag: "(0070,1508)", - vr: "FD", - vm: "1", - name: "MPRViewWidth", - }, - "(0070,150C)": { - tag: "(0070,150C)", - vr: "UL", - vm: "1", - name: "NumberOfVolumetricCurvePoints", - }, - "(0070,150D)": { - tag: "(0070,150D)", - vr: "OD", - vm: "1", - name: "VolumetricCurvePoints", - }, - "(0070,1511)": { - tag: "(0070,1511)", - vr: "FD", - vm: "3", - name: "MPRViewHeightDirection", - }, - "(0070,1512)": { - tag: "(0070,1512)", - vr: "FD", - vm: "1", - name: "MPRViewHeight", - }, - "(0070,1602)": { - tag: "(0070,1602)", - vr: "CS", - vm: "1", - name: "RenderProjection", - }, - "(0070,1603)": { - tag: "(0070,1603)", - vr: "FD", - vm: "3", - name: "ViewpointPosition", - }, - "(0070,1604)": { - tag: "(0070,1604)", - vr: "FD", - vm: "3", - name: "ViewpointLookAtPoint", - }, - "(0070,1605)": { - tag: "(0070,1605)", - vr: "FD", - vm: "3", - name: "ViewpointUpDirection", - }, - "(0070,1606)": { - tag: "(0070,1606)", - vr: "FD", - vm: "6", - name: "RenderFieldOfView", - }, - "(0070,1607)": { - tag: "(0070,1607)", - vr: "FD", - vm: "1", - name: "SamplingStepSize", - }, - "(0070,1701)": { - tag: "(0070,1701)", - vr: "CS", - vm: "1", - name: "ShadingStyle", - }, - "(0070,1702)": { - tag: "(0070,1702)", - vr: "FD", - vm: "1", - name: "AmbientReflectionIntensity", - }, - "(0070,1703)": { - tag: "(0070,1703)", - vr: "FD", - vm: "3", - name: "LightDirection", - }, - "(0070,1704)": { - tag: "(0070,1704)", - vr: "FD", - vm: "1", - name: "DiffuseReflectionIntensity", - }, - "(0070,1705)": { - tag: "(0070,1705)", - vr: "FD", - vm: "1", - name: "SpecularReflectionIntensity", - }, - "(0070,1706)": { tag: "(0070,1706)", vr: "FD", vm: "1", name: "Shininess" }, - "(0070,1801)": { - tag: "(0070,1801)", - vr: "SQ", - vm: "1", - name: "PresentationStateClassificationComponentSequence", - }, - "(0070,1802)": { - tag: "(0070,1802)", - vr: "CS", - vm: "1", - name: "ComponentType", - }, - "(0070,1803)": { - tag: "(0070,1803)", - vr: "SQ", - vm: "1", - name: "ComponentInputSequence", - }, - "(0070,1804)": { - tag: "(0070,1804)", - vr: "US", - vm: "1", - name: "VolumetricPresentationInputIndex", - }, - "(0070,1805)": { - tag: "(0070,1805)", - vr: "SQ", - vm: "1", - name: "PresentationStateCompositorComponentSequence", - }, - "(0070,1806)": { - tag: "(0070,1806)", - vr: "SQ", - vm: "1", - name: "WeightingTransferFunctionSequence", - }, - "(0070,1807)": { - tag: "(0070,1807)", - vr: "US", - vm: "3", - name: "WeightingLookupTableDescriptor", - }, - "(0070,1808)": { - tag: "(0070,1808)", - vr: "OB", - vm: "1", - name: "WeightingLookupTableData", - }, - "(0070,1901)": { - tag: "(0070,1901)", - vr: "SQ", - vm: "1", - name: "VolumetricAnnotationSequence", - }, - "(0070,1903)": { - tag: "(0070,1903)", - vr: "SQ", - vm: "1", - name: "ReferencedStructuredContextSequence", - }, - "(0070,1904)": { - tag: "(0070,1904)", - vr: "UI", - vm: "1", - name: "ReferencedContentItem", - }, - "(0070,1905)": { - tag: "(0070,1905)", - vr: "SQ", - vm: "1", - name: "VolumetricPresentationInputAnnotationSequence", - }, - "(0070,1907)": { - tag: "(0070,1907)", - vr: "CS", - vm: "1", - name: "AnnotationClipping", - }, - "(0070,1A01)": { - tag: "(0070,1A01)", - vr: "CS", - vm: "1", - name: "PresentationAnimationStyle", - }, - "(0070,1A03)": { - tag: "(0070,1A03)", - vr: "FD", - vm: "1", - name: "RecommendedAnimationRate", - }, - "(0070,1A04)": { - tag: "(0070,1A04)", - vr: "SQ", - vm: "1", - name: "AnimationCurveSequence", - }, - "(0070,1A05)": { - tag: "(0070,1A05)", - vr: "FD", - vm: "1", - name: "AnimationStepSize", - }, - "(0070,1A06)": { tag: "(0070,1A06)", vr: "FD", vm: "1", name: "SwivelRange" }, - "(0070,1A07)": { - tag: "(0070,1A07)", - vr: "OD", - vm: "1", - name: "VolumetricCurveUpDirections", - }, - "(0070,1A08)": { - tag: "(0070,1A08)", - vr: "SQ", - vm: "1", - name: "VolumeStreamSequence", - }, - "(0070,1A09)": { - tag: "(0070,1A09)", - vr: "LO", - vm: "1", - name: "RGBATransferFunctionDescription", - }, - "(0070,1B01)": { - tag: "(0070,1B01)", - vr: "SQ", - vm: "1", - name: "AdvancedBlendingSequence", - }, - "(0070,1B02)": { - tag: "(0070,1B02)", - vr: "US", - vm: "1", - name: "BlendingInputNumber", - }, - "(0070,1B03)": { - tag: "(0070,1B03)", - vr: "SQ", - vm: "1", - name: "BlendingDisplayInputSequence", - }, - "(0070,1B04)": { - tag: "(0070,1B04)", - vr: "SQ", - vm: "1", - name: "BlendingDisplaySequence", - }, - "(0070,1B06)": { - tag: "(0070,1B06)", - vr: "CS", - vm: "1", - name: "BlendingMode", - }, - "(0070,1B07)": { - tag: "(0070,1B07)", - vr: "CS", - vm: "1", - name: "TimeSeriesBlending", - }, - "(0070,1B08)": { - tag: "(0070,1B08)", - vr: "CS", - vm: "1", - name: "GeometryForDisplay", - }, - "(0070,1B11)": { - tag: "(0070,1B11)", - vr: "SQ", - vm: "1", - name: "ThresholdSequence", - }, - "(0070,1B12)": { - tag: "(0070,1B12)", - vr: "SQ", - vm: "1", - name: "ThresholdValueSequence", - }, - "(0070,1B13)": { - tag: "(0070,1B13)", - vr: "CS", - vm: "1", - name: "ThresholdType", - }, - "(0070,1B14)": { - tag: "(0070,1B14)", - vr: "FD", - vm: "1", - name: "ThresholdValue", - }, - "(0072,0002)": { - tag: "(0072,0002)", - vr: "SH", - vm: "1", - name: "HangingProtocolName", - }, - "(0072,0004)": { - tag: "(0072,0004)", - vr: "LO", - vm: "1", - name: "HangingProtocolDescription", - }, - "(0072,0006)": { - tag: "(0072,0006)", - vr: "CS", - vm: "1", - name: "HangingProtocolLevel", - }, - "(0072,0008)": { - tag: "(0072,0008)", - vr: "LO", - vm: "1", - name: "HangingProtocolCreator", - }, - "(0072,000A)": { - tag: "(0072,000A)", - vr: "DT", - vm: "1", - name: "HangingProtocolCreationDateTime", - }, - "(0072,000C)": { - tag: "(0072,000C)", - vr: "SQ", - vm: "1", - name: "HangingProtocolDefinitionSequence", - }, - "(0072,000E)": { - tag: "(0072,000E)", - vr: "SQ", - vm: "1", - name: "HangingProtocolUserIdentificationCodeSequence", - }, - "(0072,0010)": { - tag: "(0072,0010)", - vr: "LO", - vm: "1", - name: "HangingProtocolUserGroupName", - }, - "(0072,0012)": { - tag: "(0072,0012)", - vr: "SQ", - vm: "1", - name: "SourceHangingProtocolSequence", - }, - "(0072,0014)": { - tag: "(0072,0014)", - vr: "US", - vm: "1", - name: "NumberOfPriorsReferenced", - }, - "(0072,0020)": { - tag: "(0072,0020)", - vr: "SQ", - vm: "1", - name: "ImageSetsSequence", - }, - "(0072,0022)": { - tag: "(0072,0022)", - vr: "SQ", - vm: "1", - name: "ImageSetSelectorSequence", - }, - "(0072,0024)": { - tag: "(0072,0024)", - vr: "CS", - vm: "1", - name: "ImageSetSelectorUsageFlag", - }, - "(0072,0026)": { - tag: "(0072,0026)", - vr: "AT", - vm: "1", - name: "SelectorAttribute", - }, - "(0072,0028)": { - tag: "(0072,0028)", - vr: "US", - vm: "1", - name: "SelectorValueNumber", - }, - "(0072,0030)": { - tag: "(0072,0030)", - vr: "SQ", - vm: "1", - name: "TimeBasedImageSetsSequence", - }, - "(0072,0032)": { - tag: "(0072,0032)", - vr: "US", - vm: "1", - name: "ImageSetNumber", - }, - "(0072,0034)": { - tag: "(0072,0034)", - vr: "CS", - vm: "1", - name: "ImageSetSelectorCategory", - }, - "(0072,0038)": { - tag: "(0072,0038)", - vr: "US", - vm: "2", - name: "RelativeTime", - }, - "(0072,003A)": { - tag: "(0072,003A)", - vr: "CS", - vm: "1", - name: "RelativeTimeUnits", - }, - "(0072,003C)": { - tag: "(0072,003C)", - vr: "SS", - vm: "2", - name: "AbstractPriorValue", - }, - "(0072,003E)": { - tag: "(0072,003E)", - vr: "SQ", - vm: "1", - name: "AbstractPriorCodeSequence", - }, - "(0072,0040)": { - tag: "(0072,0040)", - vr: "LO", - vm: "1", - name: "ImageSetLabel", - }, - "(0072,0050)": { - tag: "(0072,0050)", - vr: "CS", - vm: "1", - name: "SelectorAttributeVR", - }, - "(0072,0052)": { - tag: "(0072,0052)", - vr: "AT", - vm: "1-n", - name: "SelectorSequencePointer", - }, - "(0072,0054)": { - tag: "(0072,0054)", - vr: "LO", - vm: "1-n", - name: "SelectorSequencePointerPrivateCreator", - }, - "(0072,0056)": { - tag: "(0072,0056)", - vr: "LO", - vm: "1", - name: "SelectorAttributePrivateCreator", - }, - "(0072,005E)": { - tag: "(0072,005E)", - vr: "AE", - vm: "1-n", - name: "SelectorAEValue", - }, - "(0072,005F)": { - tag: "(0072,005F)", - vr: "AS", - vm: "1-n", - name: "SelectorASValue", - }, - "(0072,0060)": { - tag: "(0072,0060)", - vr: "AT", - vm: "1-n", - name: "SelectorATValue", - }, - "(0072,0061)": { - tag: "(0072,0061)", - vr: "DA", - vm: "1-n", - name: "SelectorDAValue", - }, - "(0072,0062)": { - tag: "(0072,0062)", - vr: "CS", - vm: "1-n", - name: "SelectorCSValue", - }, - "(0072,0063)": { - tag: "(0072,0063)", - vr: "DT", - vm: "1-n", - name: "SelectorDTValue", - }, - "(0072,0064)": { - tag: "(0072,0064)", - vr: "IS", - vm: "1-n", - name: "SelectorISValue", - }, - "(0072,0065)": { - tag: "(0072,0065)", - vr: "OB", - vm: "1", - name: "SelectorOBValue", - }, - "(0072,0066)": { - tag: "(0072,0066)", - vr: "LO", - vm: "1-n", - name: "SelectorLOValue", - }, - "(0072,0067)": { - tag: "(0072,0067)", - vr: "OF", - vm: "1", - name: "SelectorOFValue", - }, - "(0072,0068)": { - tag: "(0072,0068)", - vr: "LT", - vm: "1", - name: "SelectorLTValue", - }, - "(0072,0069)": { - tag: "(0072,0069)", - vr: "OW", - vm: "1", - name: "SelectorOWValue", - }, - "(0072,006A)": { - tag: "(0072,006A)", - vr: "PN", - vm: "1-n", - name: "SelectorPNValue", - }, - "(0072,006B)": { - tag: "(0072,006B)", - vr: "TM", - vm: "1-n", - name: "SelectorTMValue", - }, - "(0072,006C)": { - tag: "(0072,006C)", - vr: "SH", - vm: "1-n", - name: "SelectorSHValue", - }, - "(0072,006D)": { - tag: "(0072,006D)", - vr: "UN", - vm: "1", - name: "SelectorUNValue", - }, - "(0072,006E)": { - tag: "(0072,006E)", - vr: "ST", - vm: "1", - name: "SelectorSTValue", - }, - "(0072,006F)": { - tag: "(0072,006F)", - vr: "UC", - vm: "1-n", - name: "SelectorUCValue", - }, - "(0072,0070)": { - tag: "(0072,0070)", - vr: "UT", - vm: "1", - name: "SelectorUTValue", - }, - "(0072,0071)": { - tag: "(0072,0071)", - vr: "UR", - vm: "1", - name: "SelectorURValue", - }, - "(0072,0072)": { - tag: "(0072,0072)", - vr: "DS", - vm: "1-n", - name: "SelectorDSValue", - }, - "(0072,0073)": { - tag: "(0072,0073)", - vr: "OD", - vm: "1", - name: "SelectorODValue", - }, - "(0072,0074)": { - tag: "(0072,0074)", - vr: "FD", - vm: "1-n", - name: "SelectorFDValue", - }, - "(0072,0075)": { - tag: "(0072,0075)", - vr: "OL", - vm: "1", - name: "SelectorOLValue", - }, - "(0072,0076)": { - tag: "(0072,0076)", - vr: "FL", - vm: "1-n", - name: "SelectorFLValue", - }, - "(0072,0078)": { - tag: "(0072,0078)", - vr: "UL", - vm: "1-n", - name: "SelectorULValue", - }, - "(0072,007A)": { - tag: "(0072,007A)", - vr: "US", - vm: "1-n", - name: "SelectorUSValue", - }, - "(0072,007C)": { - tag: "(0072,007C)", - vr: "SL", - vm: "1-n", - name: "SelectorSLValue", - }, - "(0072,007E)": { - tag: "(0072,007E)", - vr: "SS", - vm: "1-n", - name: "SelectorSSValue", - }, - "(0072,007F)": { - tag: "(0072,007F)", - vr: "UI", - vm: "1-n", - name: "SelectorUIValue", - }, - "(0072,0080)": { - tag: "(0072,0080)", - vr: "SQ", - vm: "1", - name: "SelectorCodeSequenceValue", - }, - "(0072,0081)": { - tag: "(0072,0081)", - vr: "OV", - vm: "1", - name: "SelectorOVValue", - }, - "(0072,0082)": { - tag: "(0072,0082)", - vr: "SV", - vm: "1-n", - name: "SelectorSVValue", - }, - "(0072,0083)": { - tag: "(0072,0083)", - vr: "UV", - vm: "1-n", - name: "SelectorUVValue", - }, - "(0072,0100)": { - tag: "(0072,0100)", - vr: "US", - vm: "1", - name: "NumberOfScreens", - }, - "(0072,0102)": { - tag: "(0072,0102)", - vr: "SQ", - vm: "1", - name: "NominalScreenDefinitionSequence", - }, - "(0072,0104)": { - tag: "(0072,0104)", - vr: "US", - vm: "1", - name: "NumberOfVerticalPixels", - }, - "(0072,0106)": { - tag: "(0072,0106)", - vr: "US", - vm: "1", - name: "NumberOfHorizontalPixels", - }, - "(0072,0108)": { - tag: "(0072,0108)", - vr: "FD", - vm: "4", - name: "DisplayEnvironmentSpatialPosition", - }, - "(0072,010A)": { - tag: "(0072,010A)", - vr: "US", - vm: "1", - name: "ScreenMinimumGrayscaleBitDepth", - }, - "(0072,010C)": { - tag: "(0072,010C)", - vr: "US", - vm: "1", - name: "ScreenMinimumColorBitDepth", - }, - "(0072,010E)": { - tag: "(0072,010E)", - vr: "US", - vm: "1", - name: "ApplicationMaximumRepaintTime", - }, - "(0072,0200)": { - tag: "(0072,0200)", - vr: "SQ", - vm: "1", - name: "DisplaySetsSequence", - }, - "(0072,0202)": { - tag: "(0072,0202)", - vr: "US", - vm: "1", - name: "DisplaySetNumber", - }, - "(0072,0203)": { - tag: "(0072,0203)", - vr: "LO", - vm: "1", - name: "DisplaySetLabel", - }, - "(0072,0204)": { - tag: "(0072,0204)", - vr: "US", - vm: "1", - name: "DisplaySetPresentationGroup", - }, - "(0072,0206)": { - tag: "(0072,0206)", - vr: "LO", - vm: "1", - name: "DisplaySetPresentationGroupDescription", - }, - "(0072,0208)": { - tag: "(0072,0208)", - vr: "CS", - vm: "1", - name: "PartialDataDisplayHandling", - }, - "(0072,0210)": { - tag: "(0072,0210)", - vr: "SQ", - vm: "1", - name: "SynchronizedScrollingSequence", - }, - "(0072,0212)": { - tag: "(0072,0212)", - vr: "US", - vm: "2-n", - name: "DisplaySetScrollingGroup", - }, - "(0072,0214)": { - tag: "(0072,0214)", - vr: "SQ", - vm: "1", - name: "NavigationIndicatorSequence", - }, - "(0072,0216)": { - tag: "(0072,0216)", - vr: "US", - vm: "1", - name: "NavigationDisplaySet", - }, - "(0072,0218)": { - tag: "(0072,0218)", - vr: "US", - vm: "1-n", - name: "ReferenceDisplaySets", - }, - "(0072,0300)": { - tag: "(0072,0300)", - vr: "SQ", - vm: "1", - name: "ImageBoxesSequence", - }, - "(0072,0302)": { - tag: "(0072,0302)", - vr: "US", - vm: "1", - name: "ImageBoxNumber", - }, - "(0072,0304)": { - tag: "(0072,0304)", - vr: "CS", - vm: "1", - name: "ImageBoxLayoutType", - }, - "(0072,0306)": { - tag: "(0072,0306)", - vr: "US", - vm: "1", - name: "ImageBoxTileHorizontalDimension", - }, - "(0072,0308)": { - tag: "(0072,0308)", - vr: "US", - vm: "1", - name: "ImageBoxTileVerticalDimension", - }, - "(0072,0310)": { - tag: "(0072,0310)", - vr: "CS", - vm: "1", - name: "ImageBoxScrollDirection", - }, - "(0072,0312)": { - tag: "(0072,0312)", - vr: "CS", - vm: "1", - name: "ImageBoxSmallScrollType", - }, - "(0072,0314)": { - tag: "(0072,0314)", - vr: "US", - vm: "1", - name: "ImageBoxSmallScrollAmount", - }, - "(0072,0316)": { - tag: "(0072,0316)", - vr: "CS", - vm: "1", - name: "ImageBoxLargeScrollType", - }, - "(0072,0318)": { - tag: "(0072,0318)", - vr: "US", - vm: "1", - name: "ImageBoxLargeScrollAmount", - }, - "(0072,0320)": { - tag: "(0072,0320)", - vr: "US", - vm: "1", - name: "ImageBoxOverlapPriority", - }, - "(0072,0330)": { - tag: "(0072,0330)", - vr: "FD", - vm: "1", - name: "CineRelativeToRealTime", - }, - "(0072,0400)": { - tag: "(0072,0400)", - vr: "SQ", - vm: "1", - name: "FilterOperationsSequence", - }, - "(0072,0402)": { - tag: "(0072,0402)", - vr: "CS", - vm: "1", - name: "FilterByCategory", - }, - "(0072,0404)": { - tag: "(0072,0404)", - vr: "CS", - vm: "1", - name: "FilterByAttributePresence", - }, - "(0072,0406)": { - tag: "(0072,0406)", - vr: "CS", - vm: "1", - name: "FilterByOperator", - }, - "(0072,0420)": { - tag: "(0072,0420)", - vr: "US", - vm: "3", - name: "StructuredDisplayBackgroundCIELabValue", - }, - "(0072,0421)": { - tag: "(0072,0421)", - vr: "US", - vm: "3", - name: "EmptyImageBoxCIELabValue", - }, - "(0072,0422)": { - tag: "(0072,0422)", - vr: "SQ", - vm: "1", - name: "StructuredDisplayImageBoxSequence", - }, - "(0072,0424)": { - tag: "(0072,0424)", - vr: "SQ", - vm: "1", - name: "StructuredDisplayTextBoxSequence", - }, - "(0072,0427)": { - tag: "(0072,0427)", - vr: "SQ", - vm: "1", - name: "ReferencedFirstFrameSequence", - }, - "(0072,0430)": { - tag: "(0072,0430)", - vr: "SQ", - vm: "1", - name: "ImageBoxSynchronizationSequence", - }, - "(0072,0432)": { - tag: "(0072,0432)", - vr: "US", - vm: "2-n", - name: "SynchronizedImageBoxList", - }, - "(0072,0434)": { - tag: "(0072,0434)", - vr: "CS", - vm: "1", - name: "TypeOfSynchronization", - }, - "(0072,0500)": { - tag: "(0072,0500)", - vr: "CS", - vm: "1", - name: "BlendingOperationType", - }, - "(0072,0510)": { - tag: "(0072,0510)", - vr: "CS", - vm: "1", - name: "ReformattingOperationType", - }, - "(0072,0512)": { - tag: "(0072,0512)", - vr: "FD", - vm: "1", - name: "ReformattingThickness", - }, - "(0072,0514)": { - tag: "(0072,0514)", - vr: "FD", - vm: "1", - name: "ReformattingInterval", - }, - "(0072,0516)": { - tag: "(0072,0516)", - vr: "CS", - vm: "1", - name: "ReformattingOperationInitialViewDirection", - }, - "(0072,0520)": { - tag: "(0072,0520)", - vr: "CS", - vm: "1-n", - name: "ThreeDRenderingType", - }, - "(0072,0600)": { - tag: "(0072,0600)", - vr: "SQ", - vm: "1", - name: "SortingOperationsSequence", - }, - "(0072,0602)": { - tag: "(0072,0602)", - vr: "CS", - vm: "1", - name: "SortByCategory", - }, - "(0072,0604)": { - tag: "(0072,0604)", - vr: "CS", - vm: "1", - name: "SortingDirection", - }, - "(0072,0700)": { - tag: "(0072,0700)", - vr: "CS", - vm: "2", - name: "DisplaySetPatientOrientation", - }, - "(0072,0702)": { tag: "(0072,0702)", vr: "CS", vm: "1", name: "VOIType" }, - "(0072,0704)": { - tag: "(0072,0704)", - vr: "CS", - vm: "1", - name: "PseudoColorType", - }, - "(0072,0705)": { - tag: "(0072,0705)", - vr: "SQ", - vm: "1", - name: "PseudoColorPaletteInstanceReferenceSequence", - }, - "(0072,0706)": { - tag: "(0072,0706)", - vr: "CS", - vm: "1", - name: "ShowGrayscaleInverted", - }, - "(0072,0710)": { - tag: "(0072,0710)", - vr: "CS", - vm: "1", - name: "ShowImageTrueSizeFlag", - }, - "(0072,0712)": { - tag: "(0072,0712)", - vr: "CS", - vm: "1", - name: "ShowGraphicAnnotationFlag", - }, - "(0072,0714)": { - tag: "(0072,0714)", - vr: "CS", - vm: "1", - name: "ShowPatientDemographicsFlag", - }, - "(0072,0716)": { - tag: "(0072,0716)", - vr: "CS", - vm: "1", - name: "ShowAcquisitionTechniquesFlag", - }, - "(0072,0717)": { - tag: "(0072,0717)", - vr: "CS", - vm: "1", - name: "DisplaySetHorizontalJustification", - }, - "(0072,0718)": { - tag: "(0072,0718)", - vr: "CS", - vm: "1", - name: "DisplaySetVerticalJustification", - }, - "(0074,0120)": { - tag: "(0074,0120)", - vr: "FD", - vm: "1", - name: "ContinuationStartMeterset", - }, - "(0074,0121)": { - tag: "(0074,0121)", - vr: "FD", - vm: "1", - name: "ContinuationEndMeterset", - }, - "(0074,1000)": { - tag: "(0074,1000)", - vr: "CS", - vm: "1", - name: "ProcedureStepState", - }, - "(0074,1002)": { - tag: "(0074,1002)", - vr: "SQ", - vm: "1", - name: "ProcedureStepProgressInformationSequence", - }, - "(0074,1004)": { - tag: "(0074,1004)", - vr: "DS", - vm: "1", - name: "ProcedureStepProgress", - }, - "(0074,1006)": { - tag: "(0074,1006)", - vr: "ST", - vm: "1", - name: "ProcedureStepProgressDescription", - }, - "(0074,1007)": { - tag: "(0074,1007)", - vr: "SQ", - vm: "1", - name: "ProcedureStepProgressParametersSequence", - }, - "(0074,1008)": { - tag: "(0074,1008)", - vr: "SQ", - vm: "1", - name: "ProcedureStepCommunicationsURISequence", - }, - "(0074,100A)": { tag: "(0074,100A)", vr: "UR", vm: "1", name: "ContactURI" }, - "(0074,100C)": { - tag: "(0074,100C)", - vr: "LO", - vm: "1", - name: "ContactDisplayName", - }, - "(0074,100E)": { - tag: "(0074,100E)", - vr: "SQ", - vm: "1", - name: "ProcedureStepDiscontinuationReasonCodeSequence", - }, - "(0074,1020)": { - tag: "(0074,1020)", - vr: "SQ", - vm: "1", - name: "BeamTaskSequence", - }, - "(0074,1022)": { - tag: "(0074,1022)", - vr: "CS", - vm: "1", - name: "BeamTaskType", - }, - "(0074,1024)": { - tag: "(0074,1024)", - vr: "IS", - vm: "1", - name: "BeamOrderIndexTrial", - }, - "(0074,1025)": { - tag: "(0074,1025)", - vr: "CS", - vm: "1", - name: "AutosequenceFlag", - }, - "(0074,1026)": { - tag: "(0074,1026)", - vr: "FD", - vm: "1", - name: "TableTopVerticalAdjustedPosition", - }, - "(0074,1027)": { - tag: "(0074,1027)", - vr: "FD", - vm: "1", - name: "TableTopLongitudinalAdjustedPosition", - }, - "(0074,1028)": { - tag: "(0074,1028)", - vr: "FD", - vm: "1", - name: "TableTopLateralAdjustedPosition", - }, - "(0074,102A)": { - tag: "(0074,102A)", - vr: "FD", - vm: "1", - name: "PatientSupportAdjustedAngle", - }, - "(0074,102B)": { - tag: "(0074,102B)", - vr: "FD", - vm: "1", - name: "TableTopEccentricAdjustedAngle", - }, - "(0074,102C)": { - tag: "(0074,102C)", - vr: "FD", - vm: "1", - name: "TableTopPitchAdjustedAngle", - }, - "(0074,102D)": { - tag: "(0074,102D)", - vr: "FD", - vm: "1", - name: "TableTopRollAdjustedAngle", - }, - "(0074,1030)": { - tag: "(0074,1030)", - vr: "SQ", - vm: "1", - name: "DeliveryVerificationImageSequence", - }, - "(0074,1032)": { - tag: "(0074,1032)", - vr: "CS", - vm: "1", - name: "VerificationImageTiming", - }, - "(0074,1034)": { - tag: "(0074,1034)", - vr: "CS", - vm: "1", - name: "DoubleExposureFlag", - }, - "(0074,1036)": { - tag: "(0074,1036)", - vr: "CS", - vm: "1", - name: "DoubleExposureOrdering", - }, - "(0074,1038)": { - tag: "(0074,1038)", - vr: "DS", - vm: "1", - name: "DoubleExposureMetersetTrial", - }, - "(0074,103A)": { - tag: "(0074,103A)", - vr: "DS", - vm: "4", - name: "DoubleExposureFieldDeltaTrial", - }, - "(0074,1040)": { - tag: "(0074,1040)", - vr: "SQ", - vm: "1", - name: "RelatedReferenceRTImageSequence", - }, - "(0074,1042)": { - tag: "(0074,1042)", - vr: "SQ", - vm: "1", - name: "GeneralMachineVerificationSequence", - }, - "(0074,1044)": { - tag: "(0074,1044)", - vr: "SQ", - vm: "1", - name: "ConventionalMachineVerificationSequence", - }, - "(0074,1046)": { - tag: "(0074,1046)", - vr: "SQ", - vm: "1", - name: "IonMachineVerificationSequence", - }, - "(0074,1048)": { - tag: "(0074,1048)", - vr: "SQ", - vm: "1", - name: "FailedAttributesSequence", - }, - "(0074,104A)": { - tag: "(0074,104A)", - vr: "SQ", - vm: "1", - name: "OverriddenAttributesSequence", - }, - "(0074,104C)": { - tag: "(0074,104C)", - vr: "SQ", - vm: "1", - name: "ConventionalControlPointVerificationSequence", - }, - "(0074,104E)": { - tag: "(0074,104E)", - vr: "SQ", - vm: "1", - name: "IonControlPointVerificationSequence", - }, - "(0074,1050)": { - tag: "(0074,1050)", - vr: "SQ", - vm: "1", - name: "AttributeOccurrenceSequence", - }, - "(0074,1052)": { - tag: "(0074,1052)", - vr: "AT", - vm: "1", - name: "AttributeOccurrencePointer", - }, - "(0074,1054)": { - tag: "(0074,1054)", - vr: "UL", - vm: "1", - name: "AttributeItemSelector", - }, - "(0074,1056)": { - tag: "(0074,1056)", - vr: "LO", - vm: "1", - name: "AttributeOccurrencePrivateCreator", - }, - "(0074,1057)": { - tag: "(0074,1057)", - vr: "IS", - vm: "1-n", - name: "SelectorSequencePointerItems", - }, - "(0074,1200)": { - tag: "(0074,1200)", - vr: "CS", - vm: "1", - name: "ScheduledProcedureStepPriority", - }, - "(0074,1202)": { - tag: "(0074,1202)", - vr: "LO", - vm: "1", - name: "WorklistLabel", - }, - "(0074,1204)": { - tag: "(0074,1204)", - vr: "LO", - vm: "1", - name: "ProcedureStepLabel", - }, - "(0074,1210)": { - tag: "(0074,1210)", - vr: "SQ", - vm: "1", - name: "ScheduledProcessingParametersSequence", - }, - "(0074,1212)": { - tag: "(0074,1212)", - vr: "SQ", - vm: "1", - name: "PerformedProcessingParametersSequence", - }, - "(0074,1216)": { - tag: "(0074,1216)", - vr: "SQ", - vm: "1", - name: "UnifiedProcedureStepPerformedProcedureSequence", - }, - "(0074,1220)": { - tag: "(0074,1220)", - vr: "SQ", - vm: "1", - name: "RelatedProcedureStepSequence", - }, - "(0074,1222)": { - tag: "(0074,1222)", - vr: "LO", - vm: "1", - name: "ProcedureStepRelationshipType", - }, - "(0074,1224)": { - tag: "(0074,1224)", - vr: "SQ", - vm: "1", - name: "ReplacedProcedureStepSequence", - }, - "(0074,1230)": { - tag: "(0074,1230)", - vr: "LO", - vm: "1", - name: "DeletionLock", - }, - "(0074,1234)": { tag: "(0074,1234)", vr: "AE", vm: "1", name: "ReceivingAE" }, - "(0074,1236)": { - tag: "(0074,1236)", - vr: "AE", - vm: "1", - name: "RequestingAE", - }, - "(0074,1238)": { - tag: "(0074,1238)", - vr: "LT", - vm: "1", - name: "ReasonForCancellation", - }, - "(0074,1242)": { tag: "(0074,1242)", vr: "CS", vm: "1", name: "SCPStatus" }, - "(0074,1244)": { - tag: "(0074,1244)", - vr: "CS", - vm: "1", - name: "SubscriptionListStatus", - }, - "(0074,1246)": { - tag: "(0074,1246)", - vr: "CS", - vm: "1", - name: "UnifiedProcedureStepListStatus", - }, - "(0074,1324)": { - tag: "(0074,1324)", - vr: "UL", - vm: "1", - name: "BeamOrderIndex", - }, - "(0074,1338)": { - tag: "(0074,1338)", - vr: "FD", - vm: "1", - name: "DoubleExposureMeterset", - }, - "(0074,133A)": { - tag: "(0074,133A)", - vr: "FD", - vm: "4", - name: "DoubleExposureFieldDelta", - }, - "(0074,1401)": { - tag: "(0074,1401)", - vr: "SQ", - vm: "1", - name: "BrachyTaskSequence", - }, - "(0074,1402)": { - tag: "(0074,1402)", - vr: "DS", - vm: "1", - name: "ContinuationStartTotalReferenceAirKerma", - }, - "(0074,1403)": { - tag: "(0074,1403)", - vr: "DS", - vm: "1", - name: "ContinuationEndTotalReferenceAirKerma", - }, - "(0074,1404)": { - tag: "(0074,1404)", - vr: "IS", - vm: "1", - name: "ContinuationPulseNumber", - }, - "(0074,1405)": { - tag: "(0074,1405)", - vr: "SQ", - vm: "1", - name: "ChannelDeliveryOrderSequence", - }, - "(0074,1406)": { - tag: "(0074,1406)", - vr: "IS", - vm: "1", - name: "ReferencedChannelNumber", - }, - "(0074,1407)": { - tag: "(0074,1407)", - vr: "DS", - vm: "1", - name: "StartCumulativeTimeWeight", - }, - "(0074,1408)": { - tag: "(0074,1408)", - vr: "DS", - vm: "1", - name: "EndCumulativeTimeWeight", - }, - "(0074,1409)": { - tag: "(0074,1409)", - vr: "SQ", - vm: "1", - name: "OmittedChannelSequence", - }, - "(0074,140A)": { - tag: "(0074,140A)", - vr: "CS", - vm: "1", - name: "ReasonForChannelOmission", - }, - "(0074,140B)": { - tag: "(0074,140B)", - vr: "LO", - vm: "1", - name: "ReasonForChannelOmissionDescription", - }, - "(0074,140C)": { - tag: "(0074,140C)", - vr: "IS", - vm: "1", - name: "ChannelDeliveryOrderIndex", - }, - "(0074,140D)": { - tag: "(0074,140D)", - vr: "SQ", - vm: "1", - name: "ChannelDeliveryContinuationSequence", - }, - "(0074,140E)": { - tag: "(0074,140E)", - vr: "SQ", - vm: "1", - name: "OmittedApplicationSetupSequence", - }, - "(0076,0001)": { - tag: "(0076,0001)", - vr: "LO", - vm: "1", - name: "ImplantAssemblyTemplateName", - }, - "(0076,0003)": { - tag: "(0076,0003)", - vr: "LO", - vm: "1", - name: "ImplantAssemblyTemplateIssuer", - }, - "(0076,0006)": { - tag: "(0076,0006)", - vr: "LO", - vm: "1", - name: "ImplantAssemblyTemplateVersion", - }, - "(0076,0008)": { - tag: "(0076,0008)", - vr: "SQ", - vm: "1", - name: "ReplacedImplantAssemblyTemplateSequence", - }, - "(0076,000A)": { - tag: "(0076,000A)", - vr: "CS", - vm: "1", - name: "ImplantAssemblyTemplateType", - }, - "(0076,000C)": { - tag: "(0076,000C)", - vr: "SQ", - vm: "1", - name: "OriginalImplantAssemblyTemplateSequence", - }, - "(0076,000E)": { - tag: "(0076,000E)", - vr: "SQ", - vm: "1", - name: "DerivationImplantAssemblyTemplateSequence", - }, - "(0076,0010)": { - tag: "(0076,0010)", - vr: "SQ", - vm: "1", - name: "ImplantAssemblyTemplateTargetAnatomySequence", - }, - "(0076,0020)": { - tag: "(0076,0020)", - vr: "SQ", - vm: "1", - name: "ProcedureTypeCodeSequence", - }, - "(0076,0030)": { - tag: "(0076,0030)", - vr: "LO", - vm: "1", - name: "SurgicalTechnique", - }, - "(0076,0032)": { - tag: "(0076,0032)", - vr: "SQ", - vm: "1", - name: "ComponentTypesSequence", - }, - "(0076,0034)": { - tag: "(0076,0034)", - vr: "SQ", - vm: "1", - name: "ComponentTypeCodeSequence", - }, - "(0076,0036)": { - tag: "(0076,0036)", - vr: "CS", - vm: "1", - name: "ExclusiveComponentType", - }, - "(0076,0038)": { - tag: "(0076,0038)", - vr: "CS", - vm: "1", - name: "MandatoryComponentType", - }, - "(0076,0040)": { - tag: "(0076,0040)", - vr: "SQ", - vm: "1", - name: "ComponentSequence", - }, - "(0076,0055)": { tag: "(0076,0055)", vr: "US", vm: "1", name: "ComponentID" }, - "(0076,0060)": { - tag: "(0076,0060)", - vr: "SQ", - vm: "1", - name: "ComponentAssemblySequence", - }, - "(0076,0070)": { - tag: "(0076,0070)", - vr: "US", - vm: "1", - name: "Component1ReferencedID", - }, - "(0076,0080)": { - tag: "(0076,0080)", - vr: "US", - vm: "1", - name: "Component1ReferencedMatingFeatureSetID", - }, - "(0076,0090)": { - tag: "(0076,0090)", - vr: "US", - vm: "1", - name: "Component1ReferencedMatingFeatureID", - }, - "(0076,00A0)": { - tag: "(0076,00A0)", - vr: "US", - vm: "1", - name: "Component2ReferencedID", - }, - "(0076,00B0)": { - tag: "(0076,00B0)", - vr: "US", - vm: "1", - name: "Component2ReferencedMatingFeatureSetID", - }, - "(0076,00C0)": { - tag: "(0076,00C0)", - vr: "US", - vm: "1", - name: "Component2ReferencedMatingFeatureID", - }, - "(0078,0001)": { - tag: "(0078,0001)", - vr: "LO", - vm: "1", - name: "ImplantTemplateGroupName", - }, - "(0078,0010)": { - tag: "(0078,0010)", - vr: "ST", - vm: "1", - name: "ImplantTemplateGroupDescription", - }, - "(0078,0020)": { - tag: "(0078,0020)", - vr: "LO", - vm: "1", - name: "ImplantTemplateGroupIssuer", - }, - "(0078,0024)": { - tag: "(0078,0024)", - vr: "LO", - vm: "1", - name: "ImplantTemplateGroupVersion", - }, - "(0078,0026)": { - tag: "(0078,0026)", - vr: "SQ", - vm: "1", - name: "ReplacedImplantTemplateGroupSequence", - }, - "(0078,0028)": { - tag: "(0078,0028)", - vr: "SQ", - vm: "1", - name: "ImplantTemplateGroupTargetAnatomySequence", - }, - "(0078,002A)": { - tag: "(0078,002A)", - vr: "SQ", - vm: "1", - name: "ImplantTemplateGroupMembersSequence", - }, - "(0078,002E)": { - tag: "(0078,002E)", - vr: "US", - vm: "1", - name: "ImplantTemplateGroupMemberID", - }, - "(0078,0050)": { - tag: "(0078,0050)", - vr: "FD", - vm: "3", - name: "ThreeDImplantTemplateGroupMemberMatchingPoint", - }, - "(0078,0060)": { - tag: "(0078,0060)", - vr: "FD", - vm: "9", - name: "ThreeDImplantTemplateGroupMemberMatchingAxes", - }, - "(0078,0070)": { - tag: "(0078,0070)", - vr: "SQ", - vm: "1", - name: "ImplantTemplateGroupMemberMatching2DCoordinatesSequence", - }, - "(0078,0090)": { - tag: "(0078,0090)", - vr: "FD", - vm: "2", - name: "TwoDImplantTemplateGroupMemberMatchingPoint", - }, - "(0078,00A0)": { - tag: "(0078,00A0)", - vr: "FD", - vm: "4", - name: "TwoDImplantTemplateGroupMemberMatchingAxes", - }, - "(0078,00B0)": { - tag: "(0078,00B0)", - vr: "SQ", - vm: "1", - name: "ImplantTemplateGroupVariationDimensionSequence", - }, - "(0078,00B2)": { - tag: "(0078,00B2)", - vr: "LO", - vm: "1", - name: "ImplantTemplateGroupVariationDimensionName", - }, - "(0078,00B4)": { - tag: "(0078,00B4)", - vr: "SQ", - vm: "1", - name: "ImplantTemplateGroupVariationDimensionRankSequence", - }, - "(0078,00B6)": { - tag: "(0078,00B6)", - vr: "US", - vm: "1", - name: "ReferencedImplantTemplateGroupMemberID", - }, - "(0078,00B8)": { - tag: "(0078,00B8)", - vr: "US", - vm: "1", - name: "ImplantTemplateGroupVariationDimensionRank", - }, - "(0080,0001)": { - tag: "(0080,0001)", - vr: "SQ", - vm: "1", - name: "SurfaceScanAcquisitionTypeCodeSequence", - }, - "(0080,0002)": { - tag: "(0080,0002)", - vr: "SQ", - vm: "1", - name: "SurfaceScanModeCodeSequence", - }, - "(0080,0003)": { - tag: "(0080,0003)", - vr: "SQ", - vm: "1", - name: "RegistrationMethodCodeSequence", - }, - "(0080,0004)": { - tag: "(0080,0004)", - vr: "FD", - vm: "1", - name: "ShotDurationTime", - }, - "(0080,0005)": { - tag: "(0080,0005)", - vr: "FD", - vm: "1", - name: "ShotOffsetTime", - }, - "(0080,0006)": { - tag: "(0080,0006)", - vr: "US", - vm: "1-n", - name: "SurfacePointPresentationValueData", - }, - "(0080,0007)": { - tag: "(0080,0007)", - vr: "US", - vm: "3-3n", - name: "SurfacePointColorCIELabValueData", - }, - "(0080,0008)": { - tag: "(0080,0008)", - vr: "SQ", - vm: "1", - name: "UVMappingSequence", - }, - "(0080,0009)": { - tag: "(0080,0009)", - vr: "SH", - vm: "1", - name: "TextureLabel", - }, - "(0080,0010)": { tag: "(0080,0010)", vr: "OF", vm: "1", name: "UValueData" }, - "(0080,0011)": { tag: "(0080,0011)", vr: "OF", vm: "1", name: "VValueData" }, - "(0080,0012)": { - tag: "(0080,0012)", - vr: "SQ", - vm: "1", - name: "ReferencedTextureSequence", - }, - "(0080,0013)": { - tag: "(0080,0013)", - vr: "SQ", - vm: "1", - name: "ReferencedSurfaceDataSequence", - }, - "(0082,0001)": { - tag: "(0082,0001)", - vr: "CS", - vm: "1", - name: "AssessmentSummary", - }, - "(0082,0003)": { - tag: "(0082,0003)", - vr: "UT", - vm: "1", - name: "AssessmentSummaryDescription", - }, - "(0082,0004)": { - tag: "(0082,0004)", - vr: "SQ", - vm: "1", - name: "AssessedSOPInstanceSequence", - }, - "(0082,0005)": { - tag: "(0082,0005)", - vr: "SQ", - vm: "1", - name: "ReferencedComparisonSOPInstanceSequence", - }, - "(0082,0006)": { - tag: "(0082,0006)", - vr: "UL", - vm: "1", - name: "NumberOfAssessmentObservations", - }, - "(0082,0007)": { - tag: "(0082,0007)", - vr: "SQ", - vm: "1", - name: "AssessmentObservationsSequence", - }, - "(0082,0008)": { - tag: "(0082,0008)", - vr: "CS", - vm: "1", - name: "ObservationSignificance", - }, - "(0082,000A)": { - tag: "(0082,000A)", - vr: "UT", - vm: "1", - name: "ObservationDescription", - }, - "(0082,000C)": { - tag: "(0082,000C)", - vr: "SQ", - vm: "1", - name: "StructuredConstraintObservationSequence", - }, - "(0082,0010)": { - tag: "(0082,0010)", - vr: "SQ", - vm: "1", - name: "AssessedAttributeValueSequence", - }, - "(0082,0016)": { - tag: "(0082,0016)", - vr: "LO", - vm: "1", - name: "AssessmentSetID", - }, - "(0082,0017)": { - tag: "(0082,0017)", - vr: "SQ", - vm: "1", - name: "AssessmentRequesterSequence", - }, - "(0082,0018)": { - tag: "(0082,0018)", - vr: "LO", - vm: "1", - name: "SelectorAttributeName", - }, - "(0082,0019)": { - tag: "(0082,0019)", - vr: "LO", - vm: "1", - name: "SelectorAttributeKeyword", - }, - "(0082,0021)": { - tag: "(0082,0021)", - vr: "SQ", - vm: "1", - name: "AssessmentTypeCodeSequence", - }, - "(0082,0022)": { - tag: "(0082,0022)", - vr: "SQ", - vm: "1", - name: "ObservationBasisCodeSequence", - }, - "(0082,0023)": { - tag: "(0082,0023)", - vr: "LO", - vm: "1", - name: "AssessmentLabel", - }, - "(0082,0032)": { - tag: "(0082,0032)", - vr: "CS", - vm: "1", - name: "ConstraintType", - }, - "(0082,0033)": { - tag: "(0082,0033)", - vr: "UT", - vm: "1", - name: "SpecificationSelectionGuidance", - }, - "(0082,0034)": { - tag: "(0082,0034)", - vr: "SQ", - vm: "1", - name: "ConstraintValueSequence", - }, - "(0082,0035)": { - tag: "(0082,0035)", - vr: "SQ", - vm: "1", - name: "RecommendedDefaultValueSequence", - }, - "(0082,0036)": { - tag: "(0082,0036)", - vr: "CS", - vm: "1", - name: "ConstraintViolationSignificance", - }, - "(0082,0037)": { - tag: "(0082,0037)", - vr: "UT", - vm: "1", - name: "ConstraintViolationCondition", - }, - "(0082,0038)": { - tag: "(0082,0038)", - vr: "CS", - vm: "1", - name: "ModifiableConstraintFlag", - }, - "(0088,0130)": { - tag: "(0088,0130)", - vr: "SH", - vm: "1", - name: "StorageMediaFileSetID", - }, - "(0088,0140)": { - tag: "(0088,0140)", - vr: "UI", - vm: "1", - name: "StorageMediaFileSetUID", - }, - "(0088,0200)": { - tag: "(0088,0200)", - vr: "SQ", - vm: "1", - name: "IconImageSequence", - }, - "(0088,0904)": { tag: "(0088,0904)", vr: "LO", vm: "1", name: "TopicTitle" }, - "(0088,0906)": { - tag: "(0088,0906)", - vr: "ST", - vm: "1", - name: "TopicSubject", - }, - "(0088,0910)": { tag: "(0088,0910)", vr: "LO", vm: "1", name: "TopicAuthor" }, - "(0088,0912)": { - tag: "(0088,0912)", - vr: "LO", - vm: "1-32", - name: "TopicKeywords", - }, - "(0100,0410)": { - tag: "(0100,0410)", - vr: "CS", - vm: "1", - name: "SOPInstanceStatus", - }, - "(0100,0420)": { - tag: "(0100,0420)", - vr: "DT", - vm: "1", - name: "SOPAuthorizationDateTime", - }, - "(0100,0424)": { - tag: "(0100,0424)", - vr: "LT", - vm: "1", - name: "SOPAuthorizationComment", - }, - "(0100,0426)": { - tag: "(0100,0426)", - vr: "LO", - vm: "1", - name: "AuthorizationEquipmentCertificationNumber", - }, - "(0400,0005)": { tag: "(0400,0005)", vr: "US", vm: "1", name: "MACIDNumber" }, - "(0400,0010)": { - tag: "(0400,0010)", - vr: "UI", - vm: "1", - name: "MACCalculationTransferSyntaxUID", - }, - "(0400,0015)": { - tag: "(0400,0015)", - vr: "CS", - vm: "1", - name: "MACAlgorithm", - }, - "(0400,0020)": { - tag: "(0400,0020)", - vr: "AT", - vm: "1-n", - name: "DataElementsSigned", - }, - "(0400,0100)": { - tag: "(0400,0100)", - vr: "UI", - vm: "1", - name: "DigitalSignatureUID", - }, - "(0400,0105)": { - tag: "(0400,0105)", - vr: "DT", - vm: "1", - name: "DigitalSignatureDateTime", - }, - "(0400,0110)": { - tag: "(0400,0110)", - vr: "CS", - vm: "1", - name: "CertificateType", - }, - "(0400,0115)": { - tag: "(0400,0115)", - vr: "OB", - vm: "1", - name: "CertificateOfSigner", - }, - "(0400,0120)": { tag: "(0400,0120)", vr: "OB", vm: "1", name: "Signature" }, - "(0400,0305)": { - tag: "(0400,0305)", - vr: "CS", - vm: "1", - name: "CertifiedTimestampType", - }, - "(0400,0310)": { - tag: "(0400,0310)", - vr: "OB", - vm: "1", - name: "CertifiedTimestamp", - }, - "(0400,0315)": { tag: "(0400,0315)", vr: "FL", vm: "1", name: "" }, - "(0400,0401)": { - tag: "(0400,0401)", - vr: "SQ", - vm: "1", - name: "DigitalSignaturePurposeCodeSequence", - }, - "(0400,0402)": { - tag: "(0400,0402)", - vr: "SQ", - vm: "1", - name: "ReferencedDigitalSignatureSequence", - }, - "(0400,0403)": { - tag: "(0400,0403)", - vr: "SQ", - vm: "1", - name: "ReferencedSOPInstanceMACSequence", - }, - "(0400,0404)": { tag: "(0400,0404)", vr: "OB", vm: "1", name: "MAC" }, - "(0400,0500)": { - tag: "(0400,0500)", - vr: "SQ", - vm: "1", - name: "EncryptedAttributesSequence", - }, - "(0400,0510)": { - tag: "(0400,0510)", - vr: "UI", - vm: "1", - name: "EncryptedContentTransferSyntaxUID", - }, - "(0400,0520)": { - tag: "(0400,0520)", - vr: "OB", - vm: "1", - name: "EncryptedContent", - }, - "(0400,0550)": { - tag: "(0400,0550)", - vr: "SQ", - vm: "1", - name: "ModifiedAttributesSequence", - }, - "(0400,0551)": { - tag: "(0400,0551)", - vr: "SQ", - vm: "1", - name: "NonconformingModifiedAttributesSequence", - }, - "(0400,0552)": { - tag: "(0400,0552)", - vr: "OB", - vm: "1", - name: "NonconformingDataElementValue", - }, - "(0400,0561)": { - tag: "(0400,0561)", - vr: "SQ", - vm: "1", - name: "OriginalAttributesSequence", - }, - "(0400,0562)": { - tag: "(0400,0562)", - vr: "DT", - vm: "1", - name: "AttributeModificationDateTime", - }, - "(0400,0563)": { - tag: "(0400,0563)", - vr: "LO", - vm: "1", - name: "ModifyingSystem", - }, - "(0400,0564)": { - tag: "(0400,0564)", - vr: "LO", - vm: "1", - name: "SourceOfPreviousValues", - }, - "(0400,0565)": { - tag: "(0400,0565)", - vr: "CS", - vm: "1", - name: "ReasonForTheAttributeModification", - }, - "(0400,0600)": { - tag: "(0400,0600)", - vr: "CS", - vm: "1", - name: "InstanceOriginStatus", - }, - "(1000,xxx0)": { - tag: "(1000,xxx0)", - vr: "US", - vm: "3", - name: "EscapeTriplet", - }, - "(1000,xxx1)": { - tag: "(1000,xxx1)", - vr: "US", - vm: "3", - name: "RunLengthTriplet", - }, - "(1000,xxx2)": { - tag: "(1000,xxx2)", - vr: "US", - vm: "1", - name: "HuffmanTableSize", - }, - "(1000,xxx3)": { - tag: "(1000,xxx3)", - vr: "US", - vm: "3", - name: "HuffmanTableTriplet", - }, - "(1000,xxx4)": { - tag: "(1000,xxx4)", - vr: "US", - vm: "1", - name: "ShiftTableSize", - }, - "(1000,xxx5)": { - tag: "(1000,xxx5)", - vr: "US", - vm: "3", - name: "ShiftTableTriplet", - }, - "(1010,xxxx)": { tag: "(1010,xxxx)", vr: "US", vm: "1-n", name: "ZonalMap" }, - "(2000,0010)": { - tag: "(2000,0010)", - vr: "IS", - vm: "1", - name: "NumberOfCopies", - }, - "(2000,001E)": { - tag: "(2000,001E)", - vr: "SQ", - vm: "1", - name: "PrinterConfigurationSequence", - }, - "(2000,0020)": { - tag: "(2000,0020)", - vr: "CS", - vm: "1", - name: "PrintPriority", - }, - "(2000,0030)": { tag: "(2000,0030)", vr: "CS", vm: "1", name: "MediumType" }, - "(2000,0040)": { - tag: "(2000,0040)", - vr: "CS", - vm: "1", - name: "FilmDestination", - }, - "(2000,0050)": { - tag: "(2000,0050)", - vr: "LO", - vm: "1", - name: "FilmSessionLabel", - }, - "(2000,0060)": { - tag: "(2000,0060)", - vr: "IS", - vm: "1", - name: "MemoryAllocation", - }, - "(2000,0061)": { - tag: "(2000,0061)", - vr: "IS", - vm: "1", - name: "MaximumMemoryAllocation", - }, - "(2000,0062)": { - tag: "(2000,0062)", - vr: "CS", - vm: "1", - name: "ColorImagePrintingFlag", - }, - "(2000,0063)": { - tag: "(2000,0063)", - vr: "CS", - vm: "1", - name: "CollationFlag", - }, - "(2000,0065)": { - tag: "(2000,0065)", - vr: "CS", - vm: "1", - name: "AnnotationFlag", - }, - "(2000,0067)": { - tag: "(2000,0067)", - vr: "CS", - vm: "1", - name: "ImageOverlayFlag", - }, - "(2000,0069)": { - tag: "(2000,0069)", - vr: "CS", - vm: "1", - name: "PresentationLUTFlag", - }, - "(2000,006A)": { - tag: "(2000,006A)", - vr: "CS", - vm: "1", - name: "ImageBoxPresentationLUTFlag", - }, - "(2000,00A0)": { - tag: "(2000,00A0)", - vr: "US", - vm: "1", - name: "MemoryBitDepth", - }, - "(2000,00A1)": { - tag: "(2000,00A1)", - vr: "US", - vm: "1", - name: "PrintingBitDepth", - }, - "(2000,00A2)": { - tag: "(2000,00A2)", - vr: "SQ", - vm: "1", - name: "MediaInstalledSequence", - }, - "(2000,00A4)": { - tag: "(2000,00A4)", - vr: "SQ", - vm: "1", - name: "OtherMediaAvailableSequence", - }, - "(2000,00A8)": { - tag: "(2000,00A8)", - vr: "SQ", - vm: "1", - name: "SupportedImageDisplayFormatsSequence", - }, - "(2000,0500)": { - tag: "(2000,0500)", - vr: "SQ", - vm: "1", - name: "ReferencedFilmBoxSequence", - }, - "(2000,0510)": { - tag: "(2000,0510)", - vr: "SQ", - vm: "1", - name: "ReferencedStoredPrintSequence", - }, - "(2010,0010)": { - tag: "(2010,0010)", - vr: "ST", - vm: "1", - name: "ImageDisplayFormat", - }, - "(2010,0030)": { - tag: "(2010,0030)", - vr: "CS", - vm: "1", - name: "AnnotationDisplayFormatID", - }, - "(2010,0040)": { - tag: "(2010,0040)", - vr: "CS", - vm: "1", - name: "FilmOrientation", - }, - "(2010,0050)": { tag: "(2010,0050)", vr: "CS", vm: "1", name: "FilmSizeID" }, - "(2010,0052)": { - tag: "(2010,0052)", - vr: "CS", - vm: "1", - name: "PrinterResolutionID", - }, - "(2010,0054)": { - tag: "(2010,0054)", - vr: "CS", - vm: "1", - name: "DefaultPrinterResolutionID", - }, - "(2010,0060)": { - tag: "(2010,0060)", - vr: "CS", - vm: "1", - name: "MagnificationType", - }, - "(2010,0080)": { - tag: "(2010,0080)", - vr: "CS", - vm: "1", - name: "SmoothingType", - }, - "(2010,00A6)": { - tag: "(2010,00A6)", - vr: "CS", - vm: "1", - name: "DefaultMagnificationType", - }, - "(2010,00A7)": { - tag: "(2010,00A7)", - vr: "CS", - vm: "1-n", - name: "OtherMagnificationTypesAvailable", - }, - "(2010,00A8)": { - tag: "(2010,00A8)", - vr: "CS", - vm: "1", - name: "DefaultSmoothingType", - }, - "(2010,00A9)": { - tag: "(2010,00A9)", - vr: "CS", - vm: "1-n", - name: "OtherSmoothingTypesAvailable", - }, - "(2010,0100)": { - tag: "(2010,0100)", - vr: "CS", - vm: "1", - name: "BorderDensity", - }, - "(2010,0110)": { - tag: "(2010,0110)", - vr: "CS", - vm: "1", - name: "EmptyImageDensity", - }, - "(2010,0120)": { tag: "(2010,0120)", vr: "US", vm: "1", name: "MinDensity" }, - "(2010,0130)": { tag: "(2010,0130)", vr: "US", vm: "1", name: "MaxDensity" }, - "(2010,0140)": { tag: "(2010,0140)", vr: "CS", vm: "1", name: "Trim" }, - "(2010,0150)": { - tag: "(2010,0150)", - vr: "ST", - vm: "1", - name: "ConfigurationInformation", - }, - "(2010,0152)": { - tag: "(2010,0152)", - vr: "LT", - vm: "1", - name: "ConfigurationInformationDescription", - }, - "(2010,0154)": { - tag: "(2010,0154)", - vr: "IS", - vm: "1", - name: "MaximumCollatedFilms", - }, - "(2010,015E)": { - tag: "(2010,015E)", - vr: "US", - vm: "1", - name: "Illumination", - }, - "(2010,0160)": { - tag: "(2010,0160)", - vr: "US", - vm: "1", - name: "ReflectedAmbientLight", - }, - "(2010,0376)": { - tag: "(2010,0376)", - vr: "DS", - vm: "2", - name: "PrinterPixelSpacing", - }, - "(2010,0500)": { - tag: "(2010,0500)", - vr: "SQ", - vm: "1", - name: "ReferencedFilmSessionSequence", - }, - "(2010,0510)": { - tag: "(2010,0510)", - vr: "SQ", - vm: "1", - name: "ReferencedImageBoxSequence", - }, - "(2010,0520)": { - tag: "(2010,0520)", - vr: "SQ", - vm: "1", - name: "ReferencedBasicAnnotationBoxSequence", - }, - "(2020,0010)": { - tag: "(2020,0010)", - vr: "US", - vm: "1", - name: "ImageBoxPosition", - }, - "(2020,0020)": { tag: "(2020,0020)", vr: "CS", vm: "1", name: "Polarity" }, - "(2020,0030)": { - tag: "(2020,0030)", - vr: "DS", - vm: "1", - name: "RequestedImageSize", - }, - "(2020,0040)": { - tag: "(2020,0040)", - vr: "CS", - vm: "1", - name: "RequestedDecimateCropBehavior", - }, - "(2020,0050)": { - tag: "(2020,0050)", - vr: "CS", - vm: "1", - name: "RequestedResolutionID", - }, - "(2020,00A0)": { - tag: "(2020,00A0)", - vr: "CS", - vm: "1", - name: "RequestedImageSizeFlag", - }, - "(2020,00A2)": { - tag: "(2020,00A2)", - vr: "CS", - vm: "1", - name: "DecimateCropResult", - }, - "(2020,0110)": { - tag: "(2020,0110)", - vr: "SQ", - vm: "1", - name: "BasicGrayscaleImageSequence", - }, - "(2020,0111)": { - tag: "(2020,0111)", - vr: "SQ", - vm: "1", - name: "BasicColorImageSequence", - }, - "(2020,0130)": { - tag: "(2020,0130)", - vr: "SQ", - vm: "1", - name: "ReferencedImageOverlayBoxSequence", - }, - "(2020,0140)": { - tag: "(2020,0140)", - vr: "SQ", - vm: "1", - name: "ReferencedVOILUTBoxSequence", - }, - "(2030,0010)": { - tag: "(2030,0010)", - vr: "US", - vm: "1", - name: "AnnotationPosition", - }, - "(2030,0020)": { tag: "(2030,0020)", vr: "LO", vm: "1", name: "TextString" }, - "(2040,0010)": { - tag: "(2040,0010)", - vr: "SQ", - vm: "1", - name: "ReferencedOverlayPlaneSequence", - }, - "(2040,0011)": { - tag: "(2040,0011)", - vr: "US", - vm: "1-99", - name: "ReferencedOverlayPlaneGroups", - }, - "(2040,0020)": { - tag: "(2040,0020)", - vr: "SQ", - vm: "1", - name: "OverlayPixelDataSequence", - }, - "(2040,0060)": { - tag: "(2040,0060)", - vr: "CS", - vm: "1", - name: "OverlayMagnificationType", - }, - "(2040,0070)": { - tag: "(2040,0070)", - vr: "CS", - vm: "1", - name: "OverlaySmoothingType", - }, - "(2040,0072)": { - tag: "(2040,0072)", - vr: "CS", - vm: "1", - name: "OverlayOrImageMagnification", - }, - "(2040,0074)": { - tag: "(2040,0074)", - vr: "US", - vm: "1", - name: "MagnifyToNumberOfColumns", - }, - "(2040,0080)": { - tag: "(2040,0080)", - vr: "CS", - vm: "1", - name: "OverlayForegroundDensity", - }, - "(2040,0082)": { - tag: "(2040,0082)", - vr: "CS", - vm: "1", - name: "OverlayBackgroundDensity", - }, - "(2040,0090)": { tag: "(2040,0090)", vr: "CS", vm: "1", name: "OverlayMode" }, - "(2040,0100)": { - tag: "(2040,0100)", - vr: "CS", - vm: "1", - name: "ThresholdDensity", - }, - "(2040,0500)": { - tag: "(2040,0500)", - vr: "SQ", - vm: "1", - name: "ReferencedImageBoxSequenceRetired", - }, - "(2050,0010)": { - tag: "(2050,0010)", - vr: "SQ", - vm: "1", - name: "PresentationLUTSequence", - }, - "(2050,0020)": { - tag: "(2050,0020)", - vr: "CS", - vm: "1", - name: "PresentationLUTShape", - }, - "(2050,0500)": { - tag: "(2050,0500)", - vr: "SQ", - vm: "1", - name: "ReferencedPresentationLUTSequence", - }, - "(2100,0010)": { tag: "(2100,0010)", vr: "SH", vm: "1", name: "PrintJobID" }, - "(2100,0020)": { - tag: "(2100,0020)", - vr: "CS", - vm: "1", - name: "ExecutionStatus", - }, - "(2100,0030)": { - tag: "(2100,0030)", - vr: "CS", - vm: "1", - name: "ExecutionStatusInfo", - }, - "(2100,0040)": { - tag: "(2100,0040)", - vr: "DA", - vm: "1", - name: "CreationDate", - }, - "(2100,0050)": { - tag: "(2100,0050)", - vr: "TM", - vm: "1", - name: "CreationTime", - }, - "(2100,0070)": { tag: "(2100,0070)", vr: "AE", vm: "1", name: "Originator" }, - "(2100,0140)": { - tag: "(2100,0140)", - vr: "AE", - vm: "1", - name: "DestinationAE", - }, - "(2100,0160)": { tag: "(2100,0160)", vr: "SH", vm: "1", name: "OwnerID" }, - "(2100,0170)": { - tag: "(2100,0170)", - vr: "IS", - vm: "1", - name: "NumberOfFilms", - }, - "(2100,0500)": { - tag: "(2100,0500)", - vr: "SQ", - vm: "1", - name: "ReferencedPrintJobSequencePullStoredPrint", - }, - "(2110,0010)": { - tag: "(2110,0010)", - vr: "CS", - vm: "1", - name: "PrinterStatus", - }, - "(2110,0020)": { - tag: "(2110,0020)", - vr: "CS", - vm: "1", - name: "PrinterStatusInfo", - }, - "(2110,0030)": { tag: "(2110,0030)", vr: "LO", vm: "1", name: "PrinterName" }, - "(2110,0099)": { - tag: "(2110,0099)", - vr: "SH", - vm: "1", - name: "PrintQueueID", - }, - "(2120,0010)": { tag: "(2120,0010)", vr: "CS", vm: "1", name: "QueueStatus" }, - "(2120,0050)": { - tag: "(2120,0050)", - vr: "SQ", - vm: "1", - name: "PrintJobDescriptionSequence", - }, - "(2120,0070)": { - tag: "(2120,0070)", - vr: "SQ", - vm: "1", - name: "ReferencedPrintJobSequence", - }, - "(2130,0010)": { - tag: "(2130,0010)", - vr: "SQ", - vm: "1", - name: "PrintManagementCapabilitiesSequence", - }, - "(2130,0015)": { - tag: "(2130,0015)", - vr: "SQ", - vm: "1", - name: "PrinterCharacteristicsSequence", - }, - "(2130,0030)": { - tag: "(2130,0030)", - vr: "SQ", - vm: "1", - name: "FilmBoxContentSequence", - }, - "(2130,0040)": { - tag: "(2130,0040)", - vr: "SQ", - vm: "1", - name: "ImageBoxContentSequence", - }, - "(2130,0050)": { - tag: "(2130,0050)", - vr: "SQ", - vm: "1", - name: "AnnotationContentSequence", - }, - "(2130,0060)": { - tag: "(2130,0060)", - vr: "SQ", - vm: "1", - name: "ImageOverlayBoxContentSequence", - }, - "(2130,0080)": { - tag: "(2130,0080)", - vr: "SQ", - vm: "1", - name: "PresentationLUTContentSequence", - }, - "(2130,00A0)": { - tag: "(2130,00A0)", - vr: "SQ", - vm: "1", - name: "ProposedStudySequence", - }, - "(2130,00C0)": { - tag: "(2130,00C0)", - vr: "SQ", - vm: "1", - name: "OriginalImageSequence", - }, - "(2200,0001)": { - tag: "(2200,0001)", - vr: "CS", - vm: "1", - name: "LabelUsingInformationExtractedFromInstances", - }, - "(2200,0002)": { tag: "(2200,0002)", vr: "UT", vm: "1", name: "LabelText" }, - "(2200,0003)": { - tag: "(2200,0003)", - vr: "CS", - vm: "1", - name: "LabelStyleSelection", - }, - "(2200,0004)": { - tag: "(2200,0004)", - vr: "LT", - vm: "1", - name: "MediaDisposition", - }, - "(2200,0005)": { - tag: "(2200,0005)", - vr: "LT", - vm: "1", - name: "BarcodeValue", - }, - "(2200,0006)": { - tag: "(2200,0006)", - vr: "CS", - vm: "1", - name: "BarcodeSymbology", - }, - "(2200,0007)": { - tag: "(2200,0007)", - vr: "CS", - vm: "1", - name: "AllowMediaSplitting", - }, - "(2200,0008)": { - tag: "(2200,0008)", - vr: "CS", - vm: "1", - name: "IncludeNonDICOMObjects", - }, - "(2200,0009)": { - tag: "(2200,0009)", - vr: "CS", - vm: "1", - name: "IncludeDisplayApplication", - }, - "(2200,000A)": { - tag: "(2200,000A)", - vr: "CS", - vm: "1", - name: "PreserveCompositeInstancesAfterMediaCreation", - }, - "(2200,000B)": { - tag: "(2200,000B)", - vr: "US", - vm: "1", - name: "TotalNumberOfPiecesOfMediaCreated", - }, - "(2200,000C)": { - tag: "(2200,000C)", - vr: "LO", - vm: "1", - name: "RequestedMediaApplicationProfile", - }, - "(2200,000D)": { - tag: "(2200,000D)", - vr: "SQ", - vm: "1", - name: "ReferencedStorageMediaSequence", - }, - "(2200,000E)": { - tag: "(2200,000E)", - vr: "AT", - vm: "1-n", - name: "FailureAttributes", - }, - "(2200,000F)": { - tag: "(2200,000F)", - vr: "CS", - vm: "1", - name: "AllowLossyCompression", - }, - "(2200,0020)": { - tag: "(2200,0020)", - vr: "CS", - vm: "1", - name: "RequestPriority", - }, - "(3002,0002)": { - tag: "(3002,0002)", - vr: "SH", - vm: "1", - name: "RTImageLabel", - }, - "(3002,0003)": { tag: "(3002,0003)", vr: "LO", vm: "1", name: "RTImageName" }, - "(3002,0004)": { - tag: "(3002,0004)", - vr: "ST", - vm: "1", - name: "RTImageDescription", - }, - "(3002,000A)": { - tag: "(3002,000A)", - vr: "CS", - vm: "1", - name: "ReportedValuesOrigin", - }, - "(3002,000C)": { - tag: "(3002,000C)", - vr: "CS", - vm: "1", - name: "RTImagePlane", - }, - "(3002,000D)": { - tag: "(3002,000D)", - vr: "DS", - vm: "3", - name: "XRayImageReceptorTranslation", - }, - "(3002,000E)": { - tag: "(3002,000E)", - vr: "DS", - vm: "1", - name: "XRayImageReceptorAngle", - }, - "(3002,0010)": { - tag: "(3002,0010)", - vr: "DS", - vm: "6", - name: "RTImageOrientation", - }, - "(3002,0011)": { - tag: "(3002,0011)", - vr: "DS", - vm: "2", - name: "ImagePlanePixelSpacing", - }, - "(3002,0012)": { - tag: "(3002,0012)", - vr: "DS", - vm: "2", - name: "RTImagePosition", - }, - "(3002,0020)": { - tag: "(3002,0020)", - vr: "SH", - vm: "1", - name: "RadiationMachineName", - }, - "(3002,0022)": { - tag: "(3002,0022)", - vr: "DS", - vm: "1", - name: "RadiationMachineSAD", - }, - "(3002,0024)": { - tag: "(3002,0024)", - vr: "DS", - vm: "1", - name: "RadiationMachineSSD", - }, - "(3002,0026)": { tag: "(3002,0026)", vr: "DS", vm: "1", name: "RTImageSID" }, - "(3002,0028)": { - tag: "(3002,0028)", - vr: "DS", - vm: "1", - name: "SourceToReferenceObjectDistance", - }, - "(3002,0029)": { - tag: "(3002,0029)", - vr: "IS", - vm: "1", - name: "FractionNumber", - }, - "(3002,0030)": { - tag: "(3002,0030)", - vr: "SQ", - vm: "1", - name: "ExposureSequence", - }, - "(3002,0032)": { - tag: "(3002,0032)", - vr: "DS", - vm: "1", - name: "MetersetExposure", - }, - "(3002,0034)": { - tag: "(3002,0034)", - vr: "DS", - vm: "4", - name: "DiaphragmPosition", - }, - "(3002,0040)": { - tag: "(3002,0040)", - vr: "SQ", - vm: "1", - name: "FluenceMapSequence", - }, - "(3002,0041)": { - tag: "(3002,0041)", - vr: "CS", - vm: "1", - name: "FluenceDataSource", - }, - "(3002,0042)": { - tag: "(3002,0042)", - vr: "DS", - vm: "1", - name: "FluenceDataScale", - }, - "(3002,0050)": { - tag: "(3002,0050)", - vr: "SQ", - vm: "1", - name: "PrimaryFluenceModeSequence", - }, - "(3002,0051)": { tag: "(3002,0051)", vr: "CS", vm: "1", name: "FluenceMode" }, - "(3002,0052)": { - tag: "(3002,0052)", - vr: "SH", - vm: "1", - name: "FluenceModeID", - }, - "(3004,0001)": { tag: "(3004,0001)", vr: "CS", vm: "1", name: "DVHType" }, - "(3004,0002)": { tag: "(3004,0002)", vr: "CS", vm: "1", name: "DoseUnits" }, - "(3004,0004)": { tag: "(3004,0004)", vr: "CS", vm: "1", name: "DoseType" }, - "(3004,0005)": { - tag: "(3004,0005)", - vr: "CS", - vm: "1", - name: "SpatialTransformOfDose", - }, - "(3004,0006)": { tag: "(3004,0006)", vr: "LO", vm: "1", name: "DoseComment" }, - "(3004,0008)": { - tag: "(3004,0008)", - vr: "DS", - vm: "3", - name: "NormalizationPoint", - }, - "(3004,000A)": { - tag: "(3004,000A)", - vr: "CS", - vm: "1", - name: "DoseSummationType", - }, - "(3004,000C)": { - tag: "(3004,000C)", - vr: "DS", - vm: "2-n", - name: "GridFrameOffsetVector", - }, - "(3004,000E)": { - tag: "(3004,000E)", - vr: "DS", - vm: "1", - name: "DoseGridScaling", - }, - "(3004,0010)": { - tag: "(3004,0010)", - vr: "SQ", - vm: "1", - name: "RTDoseROISequence", - }, - "(3004,0012)": { tag: "(3004,0012)", vr: "DS", vm: "1", name: "DoseValue" }, - "(3004,0014)": { - tag: "(3004,0014)", - vr: "CS", - vm: "1-3", - name: "TissueHeterogeneityCorrection", - }, - "(3004,0040)": { - tag: "(3004,0040)", - vr: "DS", - vm: "3", - name: "DVHNormalizationPoint", - }, - "(3004,0042)": { - tag: "(3004,0042)", - vr: "DS", - vm: "1", - name: "DVHNormalizationDoseValue", - }, - "(3004,0050)": { tag: "(3004,0050)", vr: "SQ", vm: "1", name: "DVHSequence" }, - "(3004,0052)": { - tag: "(3004,0052)", - vr: "DS", - vm: "1", - name: "DVHDoseScaling", - }, - "(3004,0054)": { - tag: "(3004,0054)", - vr: "CS", - vm: "1", - name: "DVHVolumeUnits", - }, - "(3004,0056)": { - tag: "(3004,0056)", - vr: "IS", - vm: "1", - name: "DVHNumberOfBins", - }, - "(3004,0058)": { tag: "(3004,0058)", vr: "DS", vm: "2-2n", name: "DVHData" }, - "(3004,0060)": { - tag: "(3004,0060)", - vr: "SQ", - vm: "1", - name: "DVHReferencedROISequence", - }, - "(3004,0062)": { - tag: "(3004,0062)", - vr: "CS", - vm: "1", - name: "DVHROIContributionType", - }, - "(3004,0070)": { - tag: "(3004,0070)", - vr: "DS", - vm: "1", - name: "DVHMinimumDose", - }, - "(3004,0072)": { - tag: "(3004,0072)", - vr: "DS", - vm: "1", - name: "DVHMaximumDose", - }, - "(3004,0074)": { tag: "(3004,0074)", vr: "DS", vm: "1", name: "DVHMeanDose" }, - "(3006,0002)": { - tag: "(3006,0002)", - vr: "SH", - vm: "1", - name: "StructureSetLabel", - }, - "(3006,0004)": { - tag: "(3006,0004)", - vr: "LO", - vm: "1", - name: "StructureSetName", - }, - "(3006,0006)": { - tag: "(3006,0006)", - vr: "ST", - vm: "1", - name: "StructureSetDescription", - }, - "(3006,0008)": { - tag: "(3006,0008)", - vr: "DA", - vm: "1", - name: "StructureSetDate", - }, - "(3006,0009)": { - tag: "(3006,0009)", - vr: "TM", - vm: "1", - name: "StructureSetTime", - }, - "(3006,0010)": { - tag: "(3006,0010)", - vr: "SQ", - vm: "1", - name: "ReferencedFrameOfReferenceSequence", - }, - "(3006,0012)": { - tag: "(3006,0012)", - vr: "SQ", - vm: "1", - name: "RTReferencedStudySequence", - }, - "(3006,0014)": { - tag: "(3006,0014)", - vr: "SQ", - vm: "1", - name: "RTReferencedSeriesSequence", - }, - "(3006,0016)": { - tag: "(3006,0016)", - vr: "SQ", - vm: "1", - name: "ContourImageSequence", - }, - "(3006,0018)": { - tag: "(3006,0018)", - vr: "SQ", - vm: "1", - name: "PredecessorStructureSetSequence", - }, - "(3006,0020)": { - tag: "(3006,0020)", - vr: "SQ", - vm: "1", - name: "StructureSetROISequence", - }, - "(3006,0022)": { tag: "(3006,0022)", vr: "IS", vm: "1", name: "ROINumber" }, - "(3006,0024)": { - tag: "(3006,0024)", - vr: "UI", - vm: "1", - name: "ReferencedFrameOfReferenceUID", - }, - "(3006,0026)": { tag: "(3006,0026)", vr: "LO", vm: "1", name: "ROIName" }, - "(3006,0028)": { - tag: "(3006,0028)", - vr: "ST", - vm: "1", - name: "ROIDescription", - }, - "(3006,002A)": { - tag: "(3006,002A)", - vr: "IS", - vm: "3", - name: "ROIDisplayColor", - }, - "(3006,002C)": { tag: "(3006,002C)", vr: "DS", vm: "1", name: "ROIVolume" }, - "(3006,0030)": { - tag: "(3006,0030)", - vr: "SQ", - vm: "1", - name: "RTRelatedROISequence", - }, - "(3006,0033)": { - tag: "(3006,0033)", - vr: "CS", - vm: "1", - name: "RTROIRelationship", - }, - "(3006,0036)": { - tag: "(3006,0036)", - vr: "CS", - vm: "1", - name: "ROIGenerationAlgorithm", - }, - "(3006,0037)": { - tag: "(3006,0037)", - vr: "SQ", - vm: "1", - name: "ROIDerivationAlgorithmIdentificationSequence", - }, - "(3006,0038)": { - tag: "(3006,0038)", - vr: "LO", - vm: "1", - name: "ROIGenerationDescription", - }, - "(3006,0039)": { - tag: "(3006,0039)", - vr: "SQ", - vm: "1", - name: "ROIContourSequence", - }, - "(3006,0040)": { - tag: "(3006,0040)", - vr: "SQ", - vm: "1", - name: "ContourSequence", - }, - "(3006,0042)": { - tag: "(3006,0042)", - vr: "CS", - vm: "1", - name: "ContourGeometricType", - }, - "(3006,0044)": { - tag: "(3006,0044)", - vr: "DS", - vm: "1", - name: "ContourSlabThickness", - }, - "(3006,0045)": { - tag: "(3006,0045)", - vr: "DS", - vm: "3", - name: "ContourOffsetVector", - }, - "(3006,0046)": { - tag: "(3006,0046)", - vr: "IS", - vm: "1", - name: "NumberOfContourPoints", - }, - "(3006,0048)": { - tag: "(3006,0048)", - vr: "IS", - vm: "1", - name: "ContourNumber", - }, - "(3006,0049)": { - tag: "(3006,0049)", - vr: "IS", - vm: "1-n", - name: "AttachedContours", - }, - "(3006,004A)": { - tag: "(3006,004A)", - vr: "SQ", - vm: "1", - name: "SourcePixelPlanesCharacteristicsSequence", - }, - "(3006,0050)": { - tag: "(3006,0050)", - vr: "DS", - vm: "3-3n", - name: "ContourData", - }, - "(3006,0080)": { - tag: "(3006,0080)", - vr: "SQ", - vm: "1", - name: "RTROIObservationsSequence", - }, - "(3006,0082)": { - tag: "(3006,0082)", - vr: "IS", - vm: "1", - name: "ObservationNumber", - }, - "(3006,0084)": { - tag: "(3006,0084)", - vr: "IS", - vm: "1", - name: "ReferencedROINumber", - }, - "(3006,0085)": { - tag: "(3006,0085)", - vr: "SH", - vm: "1", - name: "ROIObservationLabel", - }, - "(3006,0086)": { - tag: "(3006,0086)", - vr: "SQ", - vm: "1", - name: "RTROIIdentificationCodeSequence", - }, - "(3006,0088)": { - tag: "(3006,0088)", - vr: "ST", - vm: "1", - name: "ROIObservationDescription", - }, - "(3006,00A0)": { - tag: "(3006,00A0)", - vr: "SQ", - vm: "1", - name: "RelatedRTROIObservationsSequence", - }, - "(3006,00A4)": { - tag: "(3006,00A4)", - vr: "CS", - vm: "1", - name: "RTROIInterpretedType", - }, - "(3006,00A6)": { - tag: "(3006,00A6)", - vr: "PN", - vm: "1", - name: "ROIInterpreter", - }, - "(3006,00B0)": { - tag: "(3006,00B0)", - vr: "SQ", - vm: "1", - name: "ROIPhysicalPropertiesSequence", - }, - "(3006,00B2)": { - tag: "(3006,00B2)", - vr: "CS", - vm: "1", - name: "ROIPhysicalProperty", - }, - "(3006,00B4)": { - tag: "(3006,00B4)", - vr: "DS", - vm: "1", - name: "ROIPhysicalPropertyValue", - }, - "(3006,00B6)": { - tag: "(3006,00B6)", - vr: "SQ", - vm: "1", - name: "ROIElementalCompositionSequence", - }, - "(3006,00B7)": { - tag: "(3006,00B7)", - vr: "US", - vm: "1", - name: "ROIElementalCompositionAtomicNumber", - }, - "(3006,00B8)": { - tag: "(3006,00B8)", - vr: "FL", - vm: "1", - name: "ROIElementalCompositionAtomicMassFraction", - }, - "(3006,00B9)": { - tag: "(3006,00B9)", - vr: "SQ", - vm: "1", - name: "AdditionalRTROIIdentificationCodeSequence", - }, - "(3006,00C0)": { - tag: "(3006,00C0)", - vr: "SQ", - vm: "1", - name: "FrameOfReferenceRelationshipSequence", - }, - "(3006,00C2)": { - tag: "(3006,00C2)", - vr: "UI", - vm: "1", - name: "RelatedFrameOfReferenceUID", - }, - "(3006,00C4)": { - tag: "(3006,00C4)", - vr: "CS", - vm: "1", - name: "FrameOfReferenceTransformationType", - }, - "(3006,00C6)": { - tag: "(3006,00C6)", - vr: "DS", - vm: "16", - name: "FrameOfReferenceTransformationMatrix", - }, - "(3006,00C8)": { - tag: "(3006,00C8)", - vr: "LO", - vm: "1", - name: "FrameOfReferenceTransformationComment", - }, - "(3006,00C9)": { - tag: "(3006,00C9)", - vr: "SQ", - vm: "1", - name: "PatientLocationCoordinatesSequence", - }, - "(3006,00CA)": { - tag: "(3006,00CA)", - vr: "SQ", - vm: "1", - name: "PatientLocationCoordinatesCodeSequence", - }, - "(3006,00CB)": { - tag: "(3006,00CB)", - vr: "SQ", - vm: "1", - name: "PatientSupportPositionSequence", - }, - "(3008,0010)": { - tag: "(3008,0010)", - vr: "SQ", - vm: "1", - name: "MeasuredDoseReferenceSequence", - }, - "(3008,0012)": { - tag: "(3008,0012)", - vr: "ST", - vm: "1", - name: "MeasuredDoseDescription", - }, - "(3008,0014)": { - tag: "(3008,0014)", - vr: "CS", - vm: "1", - name: "MeasuredDoseType", - }, - "(3008,0016)": { - tag: "(3008,0016)", - vr: "DS", - vm: "1", - name: "MeasuredDoseValue", - }, - "(3008,0020)": { - tag: "(3008,0020)", - vr: "SQ", - vm: "1", - name: "TreatmentSessionBeamSequence", - }, - "(3008,0021)": { - tag: "(3008,0021)", - vr: "SQ", - vm: "1", - name: "TreatmentSessionIonBeamSequence", - }, - "(3008,0022)": { - tag: "(3008,0022)", - vr: "IS", - vm: "1", - name: "CurrentFractionNumber", - }, - "(3008,0024)": { - tag: "(3008,0024)", - vr: "DA", - vm: "1", - name: "TreatmentControlPointDate", - }, - "(3008,0025)": { - tag: "(3008,0025)", - vr: "TM", - vm: "1", - name: "TreatmentControlPointTime", - }, - "(3008,002A)": { - tag: "(3008,002A)", - vr: "CS", - vm: "1", - name: "TreatmentTerminationStatus", - }, - "(3008,002B)": { - tag: "(3008,002B)", - vr: "SH", - vm: "1", - name: "TreatmentTerminationCode", - }, - "(3008,002C)": { - tag: "(3008,002C)", - vr: "CS", - vm: "1", - name: "TreatmentVerificationStatus", - }, - "(3008,0030)": { - tag: "(3008,0030)", - vr: "SQ", - vm: "1", - name: "ReferencedTreatmentRecordSequence", - }, - "(3008,0032)": { - tag: "(3008,0032)", - vr: "DS", - vm: "1", - name: "SpecifiedPrimaryMeterset", - }, - "(3008,0033)": { - tag: "(3008,0033)", - vr: "DS", - vm: "1", - name: "SpecifiedSecondaryMeterset", - }, - "(3008,0036)": { - tag: "(3008,0036)", - vr: "DS", - vm: "1", - name: "DeliveredPrimaryMeterset", - }, - "(3008,0037)": { - tag: "(3008,0037)", - vr: "DS", - vm: "1", - name: "DeliveredSecondaryMeterset", - }, - "(3008,003A)": { - tag: "(3008,003A)", - vr: "DS", - vm: "1", - name: "SpecifiedTreatmentTime", - }, - "(3008,003B)": { - tag: "(3008,003B)", - vr: "DS", - vm: "1", - name: "DeliveredTreatmentTime", - }, - "(3008,0040)": { - tag: "(3008,0040)", - vr: "SQ", - vm: "1", - name: "ControlPointDeliverySequence", - }, - "(3008,0041)": { - tag: "(3008,0041)", - vr: "SQ", - vm: "1", - name: "IonControlPointDeliverySequence", - }, - "(3008,0042)": { - tag: "(3008,0042)", - vr: "DS", - vm: "1", - name: "SpecifiedMeterset", - }, - "(3008,0044)": { - tag: "(3008,0044)", - vr: "DS", - vm: "1", - name: "DeliveredMeterset", - }, - "(3008,0045)": { - tag: "(3008,0045)", - vr: "FL", - vm: "1", - name: "MetersetRateSet", - }, - "(3008,0046)": { - tag: "(3008,0046)", - vr: "FL", - vm: "1", - name: "MetersetRateDelivered", - }, - "(3008,0047)": { - tag: "(3008,0047)", - vr: "FL", - vm: "1-n", - name: "ScanSpotMetersetsDelivered", - }, - "(3008,0048)": { - tag: "(3008,0048)", - vr: "DS", - vm: "1", - name: "DoseRateDelivered", - }, - "(3008,0050)": { - tag: "(3008,0050)", - vr: "SQ", - vm: "1", - name: "TreatmentSummaryCalculatedDoseReferenceSequence", - }, - "(3008,0052)": { - tag: "(3008,0052)", - vr: "DS", - vm: "1", - name: "CumulativeDoseToDoseReference", - }, - "(3008,0054)": { - tag: "(3008,0054)", - vr: "DA", - vm: "1", - name: "FirstTreatmentDate", - }, - "(3008,0056)": { - tag: "(3008,0056)", - vr: "DA", - vm: "1", - name: "MostRecentTreatmentDate", - }, - "(3008,005A)": { - tag: "(3008,005A)", - vr: "IS", - vm: "1", - name: "NumberOfFractionsDelivered", - }, - "(3008,0060)": { - tag: "(3008,0060)", - vr: "SQ", - vm: "1", - name: "OverrideSequence", - }, - "(3008,0061)": { - tag: "(3008,0061)", - vr: "AT", - vm: "1", - name: "ParameterSequencePointer", - }, - "(3008,0062)": { - tag: "(3008,0062)", - vr: "AT", - vm: "1", - name: "OverrideParameterPointer", - }, - "(3008,0063)": { - tag: "(3008,0063)", - vr: "IS", - vm: "1", - name: "ParameterItemIndex", - }, - "(3008,0064)": { - tag: "(3008,0064)", - vr: "IS", - vm: "1", - name: "MeasuredDoseReferenceNumber", - }, - "(3008,0065)": { - tag: "(3008,0065)", - vr: "AT", - vm: "1", - name: "ParameterPointer", - }, - "(3008,0066)": { - tag: "(3008,0066)", - vr: "ST", - vm: "1", - name: "OverrideReason", - }, - "(3008,0067)": { - tag: "(3008,0067)", - vr: "US", - vm: "1", - name: "ParameterValueNumber", - }, - "(3008,0068)": { - tag: "(3008,0068)", - vr: "SQ", - vm: "1", - name: "CorrectedParameterSequence", - }, - "(3008,006A)": { - tag: "(3008,006A)", - vr: "FL", - vm: "1", - name: "CorrectionValue", - }, - "(3008,0070)": { - tag: "(3008,0070)", - vr: "SQ", - vm: "1", - name: "CalculatedDoseReferenceSequence", - }, - "(3008,0072)": { - tag: "(3008,0072)", - vr: "IS", - vm: "1", - name: "CalculatedDoseReferenceNumber", - }, - "(3008,0074)": { - tag: "(3008,0074)", - vr: "ST", - vm: "1", - name: "CalculatedDoseReferenceDescription", - }, - "(3008,0076)": { - tag: "(3008,0076)", - vr: "DS", - vm: "1", - name: "CalculatedDoseReferenceDoseValue", - }, - "(3008,0078)": { - tag: "(3008,0078)", - vr: "DS", - vm: "1", - name: "StartMeterset", - }, - "(3008,007A)": { tag: "(3008,007A)", vr: "DS", vm: "1", name: "EndMeterset" }, - "(3008,0080)": { - tag: "(3008,0080)", - vr: "SQ", - vm: "1", - name: "ReferencedMeasuredDoseReferenceSequence", - }, - "(3008,0082)": { - tag: "(3008,0082)", - vr: "IS", - vm: "1", - name: "ReferencedMeasuredDoseReferenceNumber", - }, - "(3008,0090)": { - tag: "(3008,0090)", - vr: "SQ", - vm: "1", - name: "ReferencedCalculatedDoseReferenceSequence", - }, - "(3008,0092)": { - tag: "(3008,0092)", - vr: "IS", - vm: "1", - name: "ReferencedCalculatedDoseReferenceNumber", - }, - "(3008,00A0)": { - tag: "(3008,00A0)", - vr: "SQ", - vm: "1", - name: "BeamLimitingDeviceLeafPairsSequence", - }, - "(3008,00B0)": { - tag: "(3008,00B0)", - vr: "SQ", - vm: "1", - name: "RecordedWedgeSequence", - }, - "(3008,00C0)": { - tag: "(3008,00C0)", - vr: "SQ", - vm: "1", - name: "RecordedCompensatorSequence", - }, - "(3008,00D0)": { - tag: "(3008,00D0)", - vr: "SQ", - vm: "1", - name: "RecordedBlockSequence", - }, - "(3008,00D1)": { - tag: "(3008,00D1)", - vr: "SQ", - vm: "1", - name: "RecordedBlockSlabSequence", - }, - "(3008,00E0)": { - tag: "(3008,00E0)", - vr: "SQ", - vm: "1", - name: "TreatmentSummaryMeasuredDoseReferenceSequence", - }, - "(3008,00F0)": { - tag: "(3008,00F0)", - vr: "SQ", - vm: "1", - name: "RecordedSnoutSequence", - }, - "(3008,00F2)": { - tag: "(3008,00F2)", - vr: "SQ", - vm: "1", - name: "RecordedRangeShifterSequence", - }, - "(3008,00F4)": { - tag: "(3008,00F4)", - vr: "SQ", - vm: "1", - name: "RecordedLateralSpreadingDeviceSequence", - }, - "(3008,00F6)": { - tag: "(3008,00F6)", - vr: "SQ", - vm: "1", - name: "RecordedRangeModulatorSequence", - }, - "(3008,0100)": { - tag: "(3008,0100)", - vr: "SQ", - vm: "1", - name: "RecordedSourceSequence", - }, - "(3008,0105)": { - tag: "(3008,0105)", - vr: "LO", - vm: "1", - name: "SourceSerialNumber", - }, - "(3008,0110)": { - tag: "(3008,0110)", - vr: "SQ", - vm: "1", - name: "TreatmentSessionApplicationSetupSequence", - }, - "(3008,0116)": { - tag: "(3008,0116)", - vr: "CS", - vm: "1", - name: "ApplicationSetupCheck", - }, - "(3008,0120)": { - tag: "(3008,0120)", - vr: "SQ", - vm: "1", - name: "RecordedBrachyAccessoryDeviceSequence", - }, - "(3008,0122)": { - tag: "(3008,0122)", - vr: "IS", - vm: "1", - name: "ReferencedBrachyAccessoryDeviceNumber", - }, - "(3008,0130)": { - tag: "(3008,0130)", - vr: "SQ", - vm: "1", - name: "RecordedChannelSequence", - }, - "(3008,0132)": { - tag: "(3008,0132)", - vr: "DS", - vm: "1", - name: "SpecifiedChannelTotalTime", - }, - "(3008,0134)": { - tag: "(3008,0134)", - vr: "DS", - vm: "1", - name: "DeliveredChannelTotalTime", - }, - "(3008,0136)": { - tag: "(3008,0136)", - vr: "IS", - vm: "1", - name: "SpecifiedNumberOfPulses", - }, - "(3008,0138)": { - tag: "(3008,0138)", - vr: "IS", - vm: "1", - name: "DeliveredNumberOfPulses", - }, - "(3008,013A)": { - tag: "(3008,013A)", - vr: "DS", - vm: "1", - name: "SpecifiedPulseRepetitionInterval", - }, - "(3008,013C)": { - tag: "(3008,013C)", - vr: "DS", - vm: "1", - name: "DeliveredPulseRepetitionInterval", - }, - "(3008,0140)": { - tag: "(3008,0140)", - vr: "SQ", - vm: "1", - name: "RecordedSourceApplicatorSequence", - }, - "(3008,0142)": { - tag: "(3008,0142)", - vr: "IS", - vm: "1", - name: "ReferencedSourceApplicatorNumber", - }, - "(3008,0150)": { - tag: "(3008,0150)", - vr: "SQ", - vm: "1", - name: "RecordedChannelShieldSequence", - }, - "(3008,0152)": { - tag: "(3008,0152)", - vr: "IS", - vm: "1", - name: "ReferencedChannelShieldNumber", - }, - "(3008,0160)": { - tag: "(3008,0160)", - vr: "SQ", - vm: "1", - name: "BrachyControlPointDeliveredSequence", - }, - "(3008,0162)": { - tag: "(3008,0162)", - vr: "DA", - vm: "1", - name: "SafePositionExitDate", - }, - "(3008,0164)": { - tag: "(3008,0164)", - vr: "TM", - vm: "1", - name: "SafePositionExitTime", - }, - "(3008,0166)": { - tag: "(3008,0166)", - vr: "DA", - vm: "1", - name: "SafePositionReturnDate", - }, - "(3008,0168)": { - tag: "(3008,0168)", - vr: "TM", - vm: "1", - name: "SafePositionReturnTime", - }, - "(3008,0171)": { - tag: "(3008,0171)", - vr: "SQ", - vm: "1", - name: "PulseSpecificBrachyControlPointDeliveredSequence", - }, - "(3008,0172)": { tag: "(3008,0172)", vr: "US", vm: "1", name: "PulseNumber" }, - "(3008,0173)": { - tag: "(3008,0173)", - vr: "SQ", - vm: "1", - name: "BrachyPulseControlPointDeliveredSequence", - }, - "(3008,0200)": { - tag: "(3008,0200)", - vr: "CS", - vm: "1", - name: "CurrentTreatmentStatus", - }, - "(3008,0202)": { - tag: "(3008,0202)", - vr: "ST", - vm: "1", - name: "TreatmentStatusComment", - }, - "(3008,0220)": { - tag: "(3008,0220)", - vr: "SQ", - vm: "1", - name: "FractionGroupSummarySequence", - }, - "(3008,0223)": { - tag: "(3008,0223)", - vr: "IS", - vm: "1", - name: "ReferencedFractionNumber", - }, - "(3008,0224)": { - tag: "(3008,0224)", - vr: "CS", - vm: "1", - name: "FractionGroupType", - }, - "(3008,0230)": { - tag: "(3008,0230)", - vr: "CS", - vm: "1", - name: "BeamStopperPosition", - }, - "(3008,0240)": { - tag: "(3008,0240)", - vr: "SQ", - vm: "1", - name: "FractionStatusSummarySequence", - }, - "(3008,0250)": { - tag: "(3008,0250)", - vr: "DA", - vm: "1", - name: "TreatmentDate", - }, - "(3008,0251)": { - tag: "(3008,0251)", - vr: "TM", - vm: "1", - name: "TreatmentTime", - }, - "(300A,0002)": { tag: "(300A,0002)", vr: "SH", vm: "1", name: "RTPlanLabel" }, - "(300A,0003)": { tag: "(300A,0003)", vr: "LO", vm: "1", name: "RTPlanName" }, - "(300A,0004)": { - tag: "(300A,0004)", - vr: "ST", - vm: "1", - name: "RTPlanDescription", - }, - "(300A,0006)": { tag: "(300A,0006)", vr: "DA", vm: "1", name: "RTPlanDate" }, - "(300A,0007)": { tag: "(300A,0007)", vr: "TM", vm: "1", name: "RTPlanTime" }, - "(300A,0009)": { - tag: "(300A,0009)", - vr: "LO", - vm: "1-n", - name: "TreatmentProtocols", - }, - "(300A,000A)": { tag: "(300A,000A)", vr: "CS", vm: "1", name: "PlanIntent" }, - "(300A,000B)": { - tag: "(300A,000B)", - vr: "LO", - vm: "1-n", - name: "TreatmentSites", - }, - "(300A,000C)": { - tag: "(300A,000C)", - vr: "CS", - vm: "1", - name: "RTPlanGeometry", - }, - "(300A,000E)": { - tag: "(300A,000E)", - vr: "ST", - vm: "1", - name: "PrescriptionDescription", - }, - "(300A,0010)": { - tag: "(300A,0010)", - vr: "SQ", - vm: "1", - name: "DoseReferenceSequence", - }, - "(300A,0012)": { - tag: "(300A,0012)", - vr: "IS", - vm: "1", - name: "DoseReferenceNumber", - }, - "(300A,0013)": { - tag: "(300A,0013)", - vr: "UI", - vm: "1", - name: "DoseReferenceUID", - }, - "(300A,0014)": { - tag: "(300A,0014)", - vr: "CS", - vm: "1", - name: "DoseReferenceStructureType", - }, - "(300A,0015)": { - tag: "(300A,0015)", - vr: "CS", - vm: "1", - name: "NominalBeamEnergyUnit", - }, - "(300A,0016)": { - tag: "(300A,0016)", - vr: "LO", - vm: "1", - name: "DoseReferenceDescription", - }, - "(300A,0018)": { - tag: "(300A,0018)", - vr: "DS", - vm: "3", - name: "DoseReferencePointCoordinates", - }, - "(300A,001A)": { - tag: "(300A,001A)", - vr: "DS", - vm: "1", - name: "NominalPriorDose", - }, - "(300A,0020)": { - tag: "(300A,0020)", - vr: "CS", - vm: "1", - name: "DoseReferenceType", - }, - "(300A,0021)": { - tag: "(300A,0021)", - vr: "DS", - vm: "1", - name: "ConstraintWeight", - }, - "(300A,0022)": { - tag: "(300A,0022)", - vr: "DS", - vm: "1", - name: "DeliveryWarningDose", - }, - "(300A,0023)": { - tag: "(300A,0023)", - vr: "DS", - vm: "1", - name: "DeliveryMaximumDose", - }, - "(300A,0025)": { - tag: "(300A,0025)", - vr: "DS", - vm: "1", - name: "TargetMinimumDose", - }, - "(300A,0026)": { - tag: "(300A,0026)", - vr: "DS", - vm: "1", - name: "TargetPrescriptionDose", - }, - "(300A,0027)": { - tag: "(300A,0027)", - vr: "DS", - vm: "1", - name: "TargetMaximumDose", - }, - "(300A,0028)": { - tag: "(300A,0028)", - vr: "DS", - vm: "1", - name: "TargetUnderdoseVolumeFraction", - }, - "(300A,002A)": { - tag: "(300A,002A)", - vr: "DS", - vm: "1", - name: "OrganAtRiskFullVolumeDose", - }, - "(300A,002B)": { - tag: "(300A,002B)", - vr: "DS", - vm: "1", - name: "OrganAtRiskLimitDose", - }, - "(300A,002C)": { - tag: "(300A,002C)", - vr: "DS", - vm: "1", - name: "OrganAtRiskMaximumDose", - }, - "(300A,002D)": { - tag: "(300A,002D)", - vr: "DS", - vm: "1", - name: "OrganAtRiskOverdoseVolumeFraction", - }, - "(300A,0040)": { - tag: "(300A,0040)", - vr: "SQ", - vm: "1", - name: "ToleranceTableSequence", - }, - "(300A,0042)": { - tag: "(300A,0042)", - vr: "IS", - vm: "1", - name: "ToleranceTableNumber", - }, - "(300A,0043)": { - tag: "(300A,0043)", - vr: "SH", - vm: "1", - name: "ToleranceTableLabel", - }, - "(300A,0044)": { - tag: "(300A,0044)", - vr: "DS", - vm: "1", - name: "GantryAngleTolerance", - }, - "(300A,0046)": { - tag: "(300A,0046)", - vr: "DS", - vm: "1", - name: "BeamLimitingDeviceAngleTolerance", - }, - "(300A,0048)": { - tag: "(300A,0048)", - vr: "SQ", - vm: "1", - name: "BeamLimitingDeviceToleranceSequence", - }, - "(300A,004A)": { - tag: "(300A,004A)", - vr: "DS", - vm: "1", - name: "BeamLimitingDevicePositionTolerance", - }, - "(300A,004B)": { - tag: "(300A,004B)", - vr: "FL", - vm: "1", - name: "SnoutPositionTolerance", - }, - "(300A,004C)": { - tag: "(300A,004C)", - vr: "DS", - vm: "1", - name: "PatientSupportAngleTolerance", - }, - "(300A,004E)": { - tag: "(300A,004E)", - vr: "DS", - vm: "1", - name: "TableTopEccentricAngleTolerance", - }, - "(300A,004F)": { - tag: "(300A,004F)", - vr: "FL", - vm: "1", - name: "TableTopPitchAngleTolerance", - }, - "(300A,0050)": { - tag: "(300A,0050)", - vr: "FL", - vm: "1", - name: "TableTopRollAngleTolerance", - }, - "(300A,0051)": { - tag: "(300A,0051)", - vr: "DS", - vm: "1", - name: "TableTopVerticalPositionTolerance", - }, - "(300A,0052)": { - tag: "(300A,0052)", - vr: "DS", - vm: "1", - name: "TableTopLongitudinalPositionTolerance", - }, - "(300A,0053)": { - tag: "(300A,0053)", - vr: "DS", - vm: "1", - name: "TableTopLateralPositionTolerance", - }, - "(300A,0055)": { - tag: "(300A,0055)", - vr: "CS", - vm: "1", - name: "RTPlanRelationship", - }, - "(300A,0070)": { - tag: "(300A,0070)", - vr: "SQ", - vm: "1", - name: "FractionGroupSequence", - }, - "(300A,0071)": { - tag: "(300A,0071)", - vr: "IS", - vm: "1", - name: "FractionGroupNumber", - }, - "(300A,0072)": { - tag: "(300A,0072)", - vr: "LO", - vm: "1", - name: "FractionGroupDescription", - }, - "(300A,0078)": { - tag: "(300A,0078)", - vr: "IS", - vm: "1", - name: "NumberOfFractionsPlanned", - }, - "(300A,0079)": { - tag: "(300A,0079)", - vr: "IS", - vm: "1", - name: "NumberOfFractionPatternDigitsPerDay", - }, - "(300A,007A)": { - tag: "(300A,007A)", - vr: "IS", - vm: "1", - name: "RepeatFractionCycleLength", - }, - "(300A,007B)": { - tag: "(300A,007B)", - vr: "LT", - vm: "1", - name: "FractionPattern", - }, - "(300A,0080)": { - tag: "(300A,0080)", - vr: "IS", - vm: "1", - name: "NumberOfBeams", - }, - "(300A,0082)": { - tag: "(300A,0082)", - vr: "DS", - vm: "3", - name: "BeamDoseSpecificationPoint", - }, - "(300A,0083)": { - tag: "(300A,0083)", - vr: "UI", - vm: "1", - name: "ReferencedDoseReferenceUID", - }, - "(300A,0084)": { tag: "(300A,0084)", vr: "DS", vm: "1", name: "BeamDose" }, - "(300A,0086)": { - tag: "(300A,0086)", - vr: "DS", - vm: "1", - name: "BeamMeterset", - }, - "(300A,0088)": { - tag: "(300A,0088)", - vr: "FL", - vm: "1", - name: "BeamDosePointDepth", - }, - "(300A,0089)": { - tag: "(300A,0089)", - vr: "FL", - vm: "1", - name: "BeamDosePointEquivalentDepth", - }, - "(300A,008A)": { - tag: "(300A,008A)", - vr: "FL", - vm: "1", - name: "BeamDosePointSSD", - }, - "(300A,008B)": { - tag: "(300A,008B)", - vr: "CS", - vm: "1", - name: "BeamDoseMeaning", - }, - "(300A,008C)": { - tag: "(300A,008C)", - vr: "SQ", - vm: "1", - name: "BeamDoseVerificationControlPointSequence", - }, - "(300A,008D)": { - tag: "(300A,008D)", - vr: "FL", - vm: "1", - name: "AverageBeamDosePointDepth", - }, - "(300A,008E)": { - tag: "(300A,008E)", - vr: "FL", - vm: "1", - name: "AverageBeamDosePointEquivalentDepth", - }, - "(300A,008F)": { - tag: "(300A,008F)", - vr: "FL", - vm: "1", - name: "AverageBeamDosePointSSD", - }, - "(300A,0090)": { - tag: "(300A,0090)", - vr: "CS", - vm: "1", - name: "BeamDoseType", - }, - "(300A,0091)": { - tag: "(300A,0091)", - vr: "DS", - vm: "1", - name: "AlternateBeamDose", - }, - "(300A,0092)": { - tag: "(300A,0092)", - vr: "CS", - vm: "1", - name: "AlternateBeamDoseType", - }, - "(300A,0093)": { - tag: "(300A,0093)", - vr: "CS", - vm: "1", - name: "DepthValueAveragingFlag", - }, - "(300A,0094)": { - tag: "(300A,0094)", - vr: "DS", - vm: "1", - name: "BeamDosePointSourceToExternalContourDistance", - }, - "(300A,00A0)": { - tag: "(300A,00A0)", - vr: "IS", - vm: "1", - name: "NumberOfBrachyApplicationSetups", - }, - "(300A,00A2)": { - tag: "(300A,00A2)", - vr: "DS", - vm: "3", - name: "BrachyApplicationSetupDoseSpecificationPoint", - }, - "(300A,00A4)": { - tag: "(300A,00A4)", - vr: "DS", - vm: "1", - name: "BrachyApplicationSetupDose", - }, - "(300A,00B0)": { - tag: "(300A,00B0)", - vr: "SQ", - vm: "1", - name: "BeamSequence", - }, - "(300A,00B2)": { - tag: "(300A,00B2)", - vr: "SH", - vm: "1", - name: "TreatmentMachineName", - }, - "(300A,00B3)": { - tag: "(300A,00B3)", - vr: "CS", - vm: "1", - name: "PrimaryDosimeterUnit", - }, - "(300A,00B4)": { - tag: "(300A,00B4)", - vr: "DS", - vm: "1", - name: "SourceAxisDistance", - }, - "(300A,00B6)": { - tag: "(300A,00B6)", - vr: "SQ", - vm: "1", - name: "BeamLimitingDeviceSequence", - }, - "(300A,00B8)": { - tag: "(300A,00B8)", - vr: "CS", - vm: "1", - name: "RTBeamLimitingDeviceType", - }, - "(300A,00BA)": { - tag: "(300A,00BA)", - vr: "DS", - vm: "1", - name: "SourceToBeamLimitingDeviceDistance", - }, - "(300A,00BB)": { - tag: "(300A,00BB)", - vr: "FL", - vm: "1", - name: "IsocenterToBeamLimitingDeviceDistance", - }, - "(300A,00BC)": { - tag: "(300A,00BC)", - vr: "IS", - vm: "1", - name: "NumberOfLeafJawPairs", - }, - "(300A,00BE)": { - tag: "(300A,00BE)", - vr: "DS", - vm: "3-n", - name: "LeafPositionBoundaries", - }, - "(300A,00C0)": { tag: "(300A,00C0)", vr: "IS", vm: "1", name: "BeamNumber" }, - "(300A,00C2)": { tag: "(300A,00C2)", vr: "LO", vm: "1", name: "BeamName" }, - "(300A,00C3)": { - tag: "(300A,00C3)", - vr: "ST", - vm: "1", - name: "BeamDescription", - }, - "(300A,00C4)": { tag: "(300A,00C4)", vr: "CS", vm: "1", name: "BeamType" }, - "(300A,00C5)": { - tag: "(300A,00C5)", - vr: "FD", - vm: "1", - name: "BeamDeliveryDurationLimit", - }, - "(300A,00C6)": { - tag: "(300A,00C6)", - vr: "CS", - vm: "1", - name: "RadiationType", - }, - "(300A,00C7)": { - tag: "(300A,00C7)", - vr: "CS", - vm: "1", - name: "HighDoseTechniqueType", - }, - "(300A,00C8)": { - tag: "(300A,00C8)", - vr: "IS", - vm: "1", - name: "ReferenceImageNumber", - }, - "(300A,00CA)": { - tag: "(300A,00CA)", - vr: "SQ", - vm: "1", - name: "PlannedVerificationImageSequence", - }, - "(300A,00CC)": { - tag: "(300A,00CC)", - vr: "LO", - vm: "1-n", - name: "ImagingDeviceSpecificAcquisitionParameters", - }, - "(300A,00CE)": { - tag: "(300A,00CE)", - vr: "CS", - vm: "1", - name: "TreatmentDeliveryType", - }, - "(300A,00D0)": { - tag: "(300A,00D0)", - vr: "IS", - vm: "1", - name: "NumberOfWedges", - }, - "(300A,00D1)": { - tag: "(300A,00D1)", - vr: "SQ", - vm: "1", - name: "WedgeSequence", - }, - "(300A,00D2)": { tag: "(300A,00D2)", vr: "IS", vm: "1", name: "WedgeNumber" }, - "(300A,00D3)": { tag: "(300A,00D3)", vr: "CS", vm: "1", name: "WedgeType" }, - "(300A,00D4)": { tag: "(300A,00D4)", vr: "SH", vm: "1", name: "WedgeID" }, - "(300A,00D5)": { tag: "(300A,00D5)", vr: "IS", vm: "1", name: "WedgeAngle" }, - "(300A,00D6)": { tag: "(300A,00D6)", vr: "DS", vm: "1", name: "WedgeFactor" }, - "(300A,00D7)": { - tag: "(300A,00D7)", - vr: "FL", - vm: "1", - name: "TotalWedgeTrayWaterEquivalentThickness", - }, - "(300A,00D8)": { - tag: "(300A,00D8)", - vr: "DS", - vm: "1", - name: "WedgeOrientation", - }, - "(300A,00D9)": { - tag: "(300A,00D9)", - vr: "FL", - vm: "1", - name: "IsocenterToWedgeTrayDistance", - }, - "(300A,00DA)": { - tag: "(300A,00DA)", - vr: "DS", - vm: "1", - name: "SourceToWedgeTrayDistance", - }, - "(300A,00DB)": { - tag: "(300A,00DB)", - vr: "FL", - vm: "1", - name: "WedgeThinEdgePosition", - }, - "(300A,00DC)": { tag: "(300A,00DC)", vr: "SH", vm: "1", name: "BolusID" }, - "(300A,00DD)": { - tag: "(300A,00DD)", - vr: "ST", - vm: "1", - name: "BolusDescription", - }, - "(300A,00DE)": { - tag: "(300A,00DE)", - vr: "DS", - vm: "1", - name: "EffectiveWedgeAngle", - }, - "(300A,00E0)": { - tag: "(300A,00E0)", - vr: "IS", - vm: "1", - name: "NumberOfCompensators", - }, - "(300A,00E1)": { tag: "(300A,00E1)", vr: "SH", vm: "1", name: "MaterialID" }, - "(300A,00E2)": { - tag: "(300A,00E2)", - vr: "DS", - vm: "1", - name: "TotalCompensatorTrayFactor", - }, - "(300A,00E3)": { - tag: "(300A,00E3)", - vr: "SQ", - vm: "1", - name: "CompensatorSequence", - }, - "(300A,00E4)": { - tag: "(300A,00E4)", - vr: "IS", - vm: "1", - name: "CompensatorNumber", - }, - "(300A,00E5)": { - tag: "(300A,00E5)", - vr: "SH", - vm: "1", - name: "CompensatorID", - }, - "(300A,00E6)": { - tag: "(300A,00E6)", - vr: "DS", - vm: "1", - name: "SourceToCompensatorTrayDistance", - }, - "(300A,00E7)": { - tag: "(300A,00E7)", - vr: "IS", - vm: "1", - name: "CompensatorRows", - }, - "(300A,00E8)": { - tag: "(300A,00E8)", - vr: "IS", - vm: "1", - name: "CompensatorColumns", - }, - "(300A,00E9)": { - tag: "(300A,00E9)", - vr: "DS", - vm: "2", - name: "CompensatorPixelSpacing", - }, - "(300A,00EA)": { - tag: "(300A,00EA)", - vr: "DS", - vm: "2", - name: "CompensatorPosition", - }, - "(300A,00EB)": { - tag: "(300A,00EB)", - vr: "DS", - vm: "1-n", - name: "CompensatorTransmissionData", - }, - "(300A,00EC)": { - tag: "(300A,00EC)", - vr: "DS", - vm: "1-n", - name: "CompensatorThicknessData", - }, - "(300A,00ED)": { - tag: "(300A,00ED)", - vr: "IS", - vm: "1", - name: "NumberOfBoli", - }, - "(300A,00EE)": { - tag: "(300A,00EE)", - vr: "CS", - vm: "1", - name: "CompensatorType", - }, - "(300A,00EF)": { - tag: "(300A,00EF)", - vr: "SH", - vm: "1", - name: "CompensatorTrayID", - }, - "(300A,00F0)": { - tag: "(300A,00F0)", - vr: "IS", - vm: "1", - name: "NumberOfBlocks", - }, - "(300A,00F2)": { - tag: "(300A,00F2)", - vr: "DS", - vm: "1", - name: "TotalBlockTrayFactor", - }, - "(300A,00F3)": { - tag: "(300A,00F3)", - vr: "FL", - vm: "1", - name: "TotalBlockTrayWaterEquivalentThickness", - }, - "(300A,00F4)": { - tag: "(300A,00F4)", - vr: "SQ", - vm: "1", - name: "BlockSequence", - }, - "(300A,00F5)": { tag: "(300A,00F5)", vr: "SH", vm: "1", name: "BlockTrayID" }, - "(300A,00F6)": { - tag: "(300A,00F6)", - vr: "DS", - vm: "1", - name: "SourceToBlockTrayDistance", - }, - "(300A,00F7)": { - tag: "(300A,00F7)", - vr: "FL", - vm: "1", - name: "IsocenterToBlockTrayDistance", - }, - "(300A,00F8)": { tag: "(300A,00F8)", vr: "CS", vm: "1", name: "BlockType" }, - "(300A,00F9)": { - tag: "(300A,00F9)", - vr: "LO", - vm: "1", - name: "AccessoryCode", - }, - "(300A,00FA)": { - tag: "(300A,00FA)", - vr: "CS", - vm: "1", - name: "BlockDivergence", - }, - "(300A,00FB)": { - tag: "(300A,00FB)", - vr: "CS", - vm: "1", - name: "BlockMountingPosition", - }, - "(300A,00FC)": { tag: "(300A,00FC)", vr: "IS", vm: "1", name: "BlockNumber" }, - "(300A,00FE)": { tag: "(300A,00FE)", vr: "LO", vm: "1", name: "BlockName" }, - "(300A,0100)": { - tag: "(300A,0100)", - vr: "DS", - vm: "1", - name: "BlockThickness", - }, - "(300A,0102)": { - tag: "(300A,0102)", - vr: "DS", - vm: "1", - name: "BlockTransmission", - }, - "(300A,0104)": { - tag: "(300A,0104)", - vr: "IS", - vm: "1", - name: "BlockNumberOfPoints", - }, - "(300A,0106)": { - tag: "(300A,0106)", - vr: "DS", - vm: "2-2n", - name: "BlockData", - }, - "(300A,0107)": { - tag: "(300A,0107)", - vr: "SQ", - vm: "1", - name: "ApplicatorSequence", - }, - "(300A,0108)": { - tag: "(300A,0108)", - vr: "SH", - vm: "1", - name: "ApplicatorID", - }, - "(300A,0109)": { - tag: "(300A,0109)", - vr: "CS", - vm: "1", - name: "ApplicatorType", - }, - "(300A,010A)": { - tag: "(300A,010A)", - vr: "LO", - vm: "1", - name: "ApplicatorDescription", - }, - "(300A,010C)": { - tag: "(300A,010C)", - vr: "DS", - vm: "1", - name: "CumulativeDoseReferenceCoefficient", - }, - "(300A,010E)": { - tag: "(300A,010E)", - vr: "DS", - vm: "1", - name: "FinalCumulativeMetersetWeight", - }, - "(300A,0110)": { - tag: "(300A,0110)", - vr: "IS", - vm: "1", - name: "NumberOfControlPoints", - }, - "(300A,0111)": { - tag: "(300A,0111)", - vr: "SQ", - vm: "1", - name: "ControlPointSequence", - }, - "(300A,0112)": { - tag: "(300A,0112)", - vr: "IS", - vm: "1", - name: "ControlPointIndex", - }, - "(300A,0114)": { - tag: "(300A,0114)", - vr: "DS", - vm: "1", - name: "NominalBeamEnergy", - }, - "(300A,0115)": { tag: "(300A,0115)", vr: "DS", vm: "1", name: "DoseRateSet" }, - "(300A,0116)": { - tag: "(300A,0116)", - vr: "SQ", - vm: "1", - name: "WedgePositionSequence", - }, - "(300A,0118)": { - tag: "(300A,0118)", - vr: "CS", - vm: "1", - name: "WedgePosition", - }, - "(300A,011A)": { - tag: "(300A,011A)", - vr: "SQ", - vm: "1", - name: "BeamLimitingDevicePositionSequence", - }, - "(300A,011C)": { - tag: "(300A,011C)", - vr: "DS", - vm: "2-2n", - name: "LeafJawPositions", - }, - "(300A,011E)": { tag: "(300A,011E)", vr: "DS", vm: "1", name: "GantryAngle" }, - "(300A,011F)": { - tag: "(300A,011F)", - vr: "CS", - vm: "1", - name: "GantryRotationDirection", - }, - "(300A,0120)": { - tag: "(300A,0120)", - vr: "DS", - vm: "1", - name: "BeamLimitingDeviceAngle", - }, - "(300A,0121)": { - tag: "(300A,0121)", - vr: "CS", - vm: "1", - name: "BeamLimitingDeviceRotationDirection", - }, - "(300A,0122)": { - tag: "(300A,0122)", - vr: "DS", - vm: "1", - name: "PatientSupportAngle", - }, - "(300A,0123)": { - tag: "(300A,0123)", - vr: "CS", - vm: "1", - name: "PatientSupportRotationDirection", - }, - "(300A,0124)": { - tag: "(300A,0124)", - vr: "DS", - vm: "1", - name: "TableTopEccentricAxisDistance", - }, - "(300A,0125)": { - tag: "(300A,0125)", - vr: "DS", - vm: "1", - name: "TableTopEccentricAngle", - }, - "(300A,0126)": { - tag: "(300A,0126)", - vr: "CS", - vm: "1", - name: "TableTopEccentricRotationDirection", - }, - "(300A,0128)": { - tag: "(300A,0128)", - vr: "DS", - vm: "1", - name: "TableTopVerticalPosition", - }, - "(300A,0129)": { - tag: "(300A,0129)", - vr: "DS", - vm: "1", - name: "TableTopLongitudinalPosition", - }, - "(300A,012A)": { - tag: "(300A,012A)", - vr: "DS", - vm: "1", - name: "TableTopLateralPosition", - }, - "(300A,012C)": { - tag: "(300A,012C)", - vr: "DS", - vm: "3", - name: "IsocenterPosition", - }, - "(300A,012E)": { - tag: "(300A,012E)", - vr: "DS", - vm: "3", - name: "SurfaceEntryPoint", - }, - "(300A,0130)": { - tag: "(300A,0130)", - vr: "DS", - vm: "1", - name: "SourceToSurfaceDistance", - }, - "(300A,0131)": { - tag: "(300A,0131)", - vr: "FL", - vm: "1", - name: "AverageBeamDosePointSourceToExternalContourDistance", - }, - "(300A,0132)": { - tag: "(300A,0132)", - vr: "FL", - vm: "1", - name: "SourceToExternalContourDistance", - }, - "(300A,0133)": { - tag: "(300A,0133)", - vr: "FL", - vm: "3", - name: "ExternalContourEntryPoint", - }, - "(300A,0134)": { - tag: "(300A,0134)", - vr: "DS", - vm: "1", - name: "CumulativeMetersetWeight", - }, - "(300A,0140)": { - tag: "(300A,0140)", - vr: "FL", - vm: "1", - name: "TableTopPitchAngle", - }, - "(300A,0142)": { - tag: "(300A,0142)", - vr: "CS", - vm: "1", - name: "TableTopPitchRotationDirection", - }, - "(300A,0144)": { - tag: "(300A,0144)", - vr: "FL", - vm: "1", - name: "TableTopRollAngle", - }, - "(300A,0146)": { - tag: "(300A,0146)", - vr: "CS", - vm: "1", - name: "TableTopRollRotationDirection", - }, - "(300A,0148)": { - tag: "(300A,0148)", - vr: "FL", - vm: "1", - name: "HeadFixationAngle", - }, - "(300A,014A)": { - tag: "(300A,014A)", - vr: "FL", - vm: "1", - name: "GantryPitchAngle", - }, - "(300A,014C)": { - tag: "(300A,014C)", - vr: "CS", - vm: "1", - name: "GantryPitchRotationDirection", - }, - "(300A,014E)": { - tag: "(300A,014E)", - vr: "FL", - vm: "1", - name: "GantryPitchAngleTolerance", - }, - "(300A,0150)": { tag: "(300A,0150)", vr: "CS", vm: "1", name: "FixationEye" }, - "(300A,0151)": { - tag: "(300A,0151)", - vr: "DS", - vm: "1", - name: "ChairHeadFramePosition", - }, - "(300A,0152)": { - tag: "(300A,0152)", - vr: "DS", - vm: "1", - name: "HeadFixationAngleTolerance", - }, - "(300A,0153)": { - tag: "(300A,0153)", - vr: "DS", - vm: "1", - name: "ChairHeadFramePositionTolerance", - }, - "(300A,0154)": { - tag: "(300A,0154)", - vr: "DS", - vm: "1", - name: "FixationLightAzimuthalAngleTolerance", - }, - "(300A,0155)": { - tag: "(300A,0155)", - vr: "DS", - vm: "1", - name: "FixationLightPolarAngleTolerance", - }, - "(300A,0180)": { - tag: "(300A,0180)", - vr: "SQ", - vm: "1", - name: "PatientSetupSequence", - }, - "(300A,0182)": { - tag: "(300A,0182)", - vr: "IS", - vm: "1", - name: "PatientSetupNumber", - }, - "(300A,0183)": { - tag: "(300A,0183)", - vr: "LO", - vm: "1", - name: "PatientSetupLabel", - }, - "(300A,0184)": { - tag: "(300A,0184)", - vr: "LO", - vm: "1", - name: "PatientAdditionalPosition", - }, - "(300A,0190)": { - tag: "(300A,0190)", - vr: "SQ", - vm: "1", - name: "FixationDeviceSequence", - }, - "(300A,0192)": { - tag: "(300A,0192)", - vr: "CS", - vm: "1", - name: "FixationDeviceType", - }, - "(300A,0194)": { - tag: "(300A,0194)", - vr: "SH", - vm: "1", - name: "FixationDeviceLabel", - }, - "(300A,0196)": { - tag: "(300A,0196)", - vr: "ST", - vm: "1", - name: "FixationDeviceDescription", - }, - "(300A,0198)": { - tag: "(300A,0198)", - vr: "SH", - vm: "1", - name: "FixationDevicePosition", - }, - "(300A,0199)": { - tag: "(300A,0199)", - vr: "FL", - vm: "1", - name: "FixationDevicePitchAngle", - }, - "(300A,019A)": { - tag: "(300A,019A)", - vr: "FL", - vm: "1", - name: "FixationDeviceRollAngle", - }, - "(300A,01A0)": { - tag: "(300A,01A0)", - vr: "SQ", - vm: "1", - name: "ShieldingDeviceSequence", - }, - "(300A,01A2)": { - tag: "(300A,01A2)", - vr: "CS", - vm: "1", - name: "ShieldingDeviceType", - }, - "(300A,01A4)": { - tag: "(300A,01A4)", - vr: "SH", - vm: "1", - name: "ShieldingDeviceLabel", - }, - "(300A,01A6)": { - tag: "(300A,01A6)", - vr: "ST", - vm: "1", - name: "ShieldingDeviceDescription", - }, - "(300A,01A8)": { - tag: "(300A,01A8)", - vr: "SH", - vm: "1", - name: "ShieldingDevicePosition", - }, - "(300A,01B0)": { - tag: "(300A,01B0)", - vr: "CS", - vm: "1", - name: "SetupTechnique", - }, - "(300A,01B2)": { - tag: "(300A,01B2)", - vr: "ST", - vm: "1", - name: "SetupTechniqueDescription", - }, - "(300A,01B4)": { - tag: "(300A,01B4)", - vr: "SQ", - vm: "1", - name: "SetupDeviceSequence", - }, - "(300A,01B6)": { - tag: "(300A,01B6)", - vr: "CS", - vm: "1", - name: "SetupDeviceType", - }, - "(300A,01B8)": { - tag: "(300A,01B8)", - vr: "SH", - vm: "1", - name: "SetupDeviceLabel", - }, - "(300A,01BA)": { - tag: "(300A,01BA)", - vr: "ST", - vm: "1", - name: "SetupDeviceDescription", - }, - "(300A,01BC)": { - tag: "(300A,01BC)", - vr: "DS", - vm: "1", - name: "SetupDeviceParameter", - }, - "(300A,01D0)": { - tag: "(300A,01D0)", - vr: "ST", - vm: "1", - name: "SetupReferenceDescription", - }, - "(300A,01D2)": { - tag: "(300A,01D2)", - vr: "DS", - vm: "1", - name: "TableTopVerticalSetupDisplacement", - }, - "(300A,01D4)": { - tag: "(300A,01D4)", - vr: "DS", - vm: "1", - name: "TableTopLongitudinalSetupDisplacement", - }, - "(300A,01D6)": { - tag: "(300A,01D6)", - vr: "DS", - vm: "1", - name: "TableTopLateralSetupDisplacement", - }, - "(300A,0200)": { - tag: "(300A,0200)", - vr: "CS", - vm: "1", - name: "BrachyTreatmentTechnique", - }, - "(300A,0202)": { - tag: "(300A,0202)", - vr: "CS", - vm: "1", - name: "BrachyTreatmentType", - }, - "(300A,0206)": { - tag: "(300A,0206)", - vr: "SQ", - vm: "1", - name: "TreatmentMachineSequence", - }, - "(300A,0210)": { - tag: "(300A,0210)", - vr: "SQ", - vm: "1", - name: "SourceSequence", - }, - "(300A,0212)": { - tag: "(300A,0212)", - vr: "IS", - vm: "1", - name: "SourceNumber", - }, - "(300A,0214)": { tag: "(300A,0214)", vr: "CS", vm: "1", name: "SourceType" }, - "(300A,0216)": { - tag: "(300A,0216)", - vr: "LO", - vm: "1", - name: "SourceManufacturer", - }, - "(300A,0218)": { - tag: "(300A,0218)", - vr: "DS", - vm: "1", - name: "ActiveSourceDiameter", - }, - "(300A,021A)": { - tag: "(300A,021A)", - vr: "DS", - vm: "1", - name: "ActiveSourceLength", - }, - "(300A,021B)": { - tag: "(300A,021B)", - vr: "SH", - vm: "1", - name: "SourceModelID", - }, - "(300A,021C)": { - tag: "(300A,021C)", - vr: "LO", - vm: "1", - name: "SourceDescription", - }, - "(300A,0222)": { - tag: "(300A,0222)", - vr: "DS", - vm: "1", - name: "SourceEncapsulationNominalThickness", - }, - "(300A,0224)": { - tag: "(300A,0224)", - vr: "DS", - vm: "1", - name: "SourceEncapsulationNominalTransmission", - }, - "(300A,0226)": { - tag: "(300A,0226)", - vr: "LO", - vm: "1", - name: "SourceIsotopeName", - }, - "(300A,0228)": { - tag: "(300A,0228)", - vr: "DS", - vm: "1", - name: "SourceIsotopeHalfLife", - }, - "(300A,0229)": { - tag: "(300A,0229)", - vr: "CS", - vm: "1", - name: "SourceStrengthUnits", - }, - "(300A,022A)": { - tag: "(300A,022A)", - vr: "DS", - vm: "1", - name: "ReferenceAirKermaRate", - }, - "(300A,022B)": { - tag: "(300A,022B)", - vr: "DS", - vm: "1", - name: "SourceStrength", - }, - "(300A,022C)": { - tag: "(300A,022C)", - vr: "DA", - vm: "1", - name: "SourceStrengthReferenceDate", - }, - "(300A,022E)": { - tag: "(300A,022E)", - vr: "TM", - vm: "1", - name: "SourceStrengthReferenceTime", - }, - "(300A,0230)": { - tag: "(300A,0230)", - vr: "SQ", - vm: "1", - name: "ApplicationSetupSequence", - }, - "(300A,0232)": { - tag: "(300A,0232)", - vr: "CS", - vm: "1", - name: "ApplicationSetupType", - }, - "(300A,0234)": { - tag: "(300A,0234)", - vr: "IS", - vm: "1", - name: "ApplicationSetupNumber", - }, - "(300A,0236)": { - tag: "(300A,0236)", - vr: "LO", - vm: "1", - name: "ApplicationSetupName", - }, - "(300A,0238)": { - tag: "(300A,0238)", - vr: "LO", - vm: "1", - name: "ApplicationSetupManufacturer", - }, - "(300A,0240)": { - tag: "(300A,0240)", - vr: "IS", - vm: "1", - name: "TemplateNumber", - }, - "(300A,0242)": { - tag: "(300A,0242)", - vr: "SH", - vm: "1", - name: "TemplateType", - }, - "(300A,0244)": { - tag: "(300A,0244)", - vr: "LO", - vm: "1", - name: "TemplateName", - }, - "(300A,0250)": { - tag: "(300A,0250)", - vr: "DS", - vm: "1", - name: "TotalReferenceAirKerma", - }, - "(300A,0260)": { - tag: "(300A,0260)", - vr: "SQ", - vm: "1", - name: "BrachyAccessoryDeviceSequence", - }, - "(300A,0262)": { - tag: "(300A,0262)", - vr: "IS", - vm: "1", - name: "BrachyAccessoryDeviceNumber", - }, - "(300A,0263)": { - tag: "(300A,0263)", - vr: "SH", - vm: "1", - name: "BrachyAccessoryDeviceID", - }, - "(300A,0264)": { - tag: "(300A,0264)", - vr: "CS", - vm: "1", - name: "BrachyAccessoryDeviceType", - }, - "(300A,0266)": { - tag: "(300A,0266)", - vr: "LO", - vm: "1", - name: "BrachyAccessoryDeviceName", - }, - "(300A,026A)": { - tag: "(300A,026A)", - vr: "DS", - vm: "1", - name: "BrachyAccessoryDeviceNominalThickness", - }, - "(300A,026C)": { - tag: "(300A,026C)", - vr: "DS", - vm: "1", - name: "BrachyAccessoryDeviceNominalTransmission", - }, - "(300A,0271)": { - tag: "(300A,0271)", - vr: "DS", - vm: "1", - name: "ChannelEffectiveLength", - }, - "(300A,0272)": { - tag: "(300A,0272)", - vr: "DS", - vm: "1", - name: "ChannelInnerLength", - }, - "(300A,0273)": { - tag: "(300A,0273)", - vr: "SH", - vm: "1", - name: "AfterloaderChannelID", - }, - "(300A,0274)": { - tag: "(300A,0274)", - vr: "DS", - vm: "1", - name: "SourceApplicatorTipLength", - }, - "(300A,0280)": { - tag: "(300A,0280)", - vr: "SQ", - vm: "1", - name: "ChannelSequence", - }, - "(300A,0282)": { - tag: "(300A,0282)", - vr: "IS", - vm: "1", - name: "ChannelNumber", - }, - "(300A,0284)": { - tag: "(300A,0284)", - vr: "DS", - vm: "1", - name: "ChannelLength", - }, - "(300A,0286)": { - tag: "(300A,0286)", - vr: "DS", - vm: "1", - name: "ChannelTotalTime", - }, - "(300A,0288)": { - tag: "(300A,0288)", - vr: "CS", - vm: "1", - name: "SourceMovementType", - }, - "(300A,028A)": { - tag: "(300A,028A)", - vr: "IS", - vm: "1", - name: "NumberOfPulses", - }, - "(300A,028C)": { - tag: "(300A,028C)", - vr: "DS", - vm: "1", - name: "PulseRepetitionInterval", - }, - "(300A,0290)": { - tag: "(300A,0290)", - vr: "IS", - vm: "1", - name: "SourceApplicatorNumber", - }, - "(300A,0291)": { - tag: "(300A,0291)", - vr: "SH", - vm: "1", - name: "SourceApplicatorID", - }, - "(300A,0292)": { - tag: "(300A,0292)", - vr: "CS", - vm: "1", - name: "SourceApplicatorType", - }, - "(300A,0294)": { - tag: "(300A,0294)", - vr: "LO", - vm: "1", - name: "SourceApplicatorName", - }, - "(300A,0296)": { - tag: "(300A,0296)", - vr: "DS", - vm: "1", - name: "SourceApplicatorLength", - }, - "(300A,0298)": { - tag: "(300A,0298)", - vr: "LO", - vm: "1", - name: "SourceApplicatorManufacturer", - }, - "(300A,029C)": { - tag: "(300A,029C)", - vr: "DS", - vm: "1", - name: "SourceApplicatorWallNominalThickness", - }, - "(300A,029E)": { - tag: "(300A,029E)", - vr: "DS", - vm: "1", - name: "SourceApplicatorWallNominalTransmission", - }, - "(300A,02A0)": { - tag: "(300A,02A0)", - vr: "DS", - vm: "1", - name: "SourceApplicatorStepSize", - }, - "(300A,02A1)": { - tag: "(300A,02A1)", - vr: "IS", - vm: "1", - name: "ApplicatorShapeReferencedROINumber", - }, - "(300A,02A2)": { - tag: "(300A,02A2)", - vr: "IS", - vm: "1", - name: "TransferTubeNumber", - }, - "(300A,02A4)": { - tag: "(300A,02A4)", - vr: "DS", - vm: "1", - name: "TransferTubeLength", - }, - "(300A,02B0)": { - tag: "(300A,02B0)", - vr: "SQ", - vm: "1", - name: "ChannelShieldSequence", - }, - "(300A,02B2)": { - tag: "(300A,02B2)", - vr: "IS", - vm: "1", - name: "ChannelShieldNumber", - }, - "(300A,02B3)": { - tag: "(300A,02B3)", - vr: "SH", - vm: "1", - name: "ChannelShieldID", - }, - "(300A,02B4)": { - tag: "(300A,02B4)", - vr: "LO", - vm: "1", - name: "ChannelShieldName", - }, - "(300A,02B8)": { - tag: "(300A,02B8)", - vr: "DS", - vm: "1", - name: "ChannelShieldNominalThickness", - }, - "(300A,02BA)": { - tag: "(300A,02BA)", - vr: "DS", - vm: "1", - name: "ChannelShieldNominalTransmission", - }, - "(300A,02C8)": { - tag: "(300A,02C8)", - vr: "DS", - vm: "1", - name: "FinalCumulativeTimeWeight", - }, - "(300A,02D0)": { - tag: "(300A,02D0)", - vr: "SQ", - vm: "1", - name: "BrachyControlPointSequence", - }, - "(300A,02D2)": { - tag: "(300A,02D2)", - vr: "DS", - vm: "1", - name: "ControlPointRelativePosition", - }, - "(300A,02D4)": { - tag: "(300A,02D4)", - vr: "DS", - vm: "3", - name: "ControlPoint3DPosition", - }, - "(300A,02D6)": { - tag: "(300A,02D6)", - vr: "DS", - vm: "1", - name: "CumulativeTimeWeight", - }, - "(300A,02E0)": { - tag: "(300A,02E0)", - vr: "CS", - vm: "1", - name: "CompensatorDivergence", - }, - "(300A,02E1)": { - tag: "(300A,02E1)", - vr: "CS", - vm: "1", - name: "CompensatorMountingPosition", - }, - "(300A,02E2)": { - tag: "(300A,02E2)", - vr: "DS", - vm: "1-n", - name: "SourceToCompensatorDistance", - }, - "(300A,02E3)": { - tag: "(300A,02E3)", - vr: "FL", - vm: "1", - name: "TotalCompensatorTrayWaterEquivalentThickness", - }, - "(300A,02E4)": { - tag: "(300A,02E4)", - vr: "FL", - vm: "1", - name: "IsocenterToCompensatorTrayDistance", - }, - "(300A,02E5)": { - tag: "(300A,02E5)", - vr: "FL", - vm: "1", - name: "CompensatorColumnOffset", - }, - "(300A,02E6)": { - tag: "(300A,02E6)", - vr: "FL", - vm: "1-n", - name: "IsocenterToCompensatorDistances", - }, - "(300A,02E7)": { - tag: "(300A,02E7)", - vr: "FL", - vm: "1", - name: "CompensatorRelativeStoppingPowerRatio", - }, - "(300A,02E8)": { - tag: "(300A,02E8)", - vr: "FL", - vm: "1", - name: "CompensatorMillingToolDiameter", - }, - "(300A,02EA)": { - tag: "(300A,02EA)", - vr: "SQ", - vm: "1", - name: "IonRangeCompensatorSequence", - }, - "(300A,02EB)": { - tag: "(300A,02EB)", - vr: "LT", - vm: "1", - name: "CompensatorDescription", - }, - "(300A,0302)": { - tag: "(300A,0302)", - vr: "IS", - vm: "1", - name: "RadiationMassNumber", - }, - "(300A,0304)": { - tag: "(300A,0304)", - vr: "IS", - vm: "1", - name: "RadiationAtomicNumber", - }, - "(300A,0306)": { - tag: "(300A,0306)", - vr: "SS", - vm: "1", - name: "RadiationChargeState", - }, - "(300A,0308)": { tag: "(300A,0308)", vr: "CS", vm: "1", name: "ScanMode" }, - "(300A,0309)": { - tag: "(300A,0309)", - vr: "CS", - vm: "1", - name: "ModulatedScanModeType", - }, - "(300A,030A)": { - tag: "(300A,030A)", - vr: "FL", - vm: "2", - name: "VirtualSourceAxisDistances", - }, - "(300A,030C)": { - tag: "(300A,030C)", - vr: "SQ", - vm: "1", - name: "SnoutSequence", - }, - "(300A,030D)": { - tag: "(300A,030D)", - vr: "FL", - vm: "1", - name: "SnoutPosition", - }, - "(300A,030F)": { tag: "(300A,030F)", vr: "SH", vm: "1", name: "SnoutID" }, - "(300A,0312)": { - tag: "(300A,0312)", - vr: "IS", - vm: "1", - name: "NumberOfRangeShifters", - }, - "(300A,0314)": { - tag: "(300A,0314)", - vr: "SQ", - vm: "1", - name: "RangeShifterSequence", - }, - "(300A,0316)": { - tag: "(300A,0316)", - vr: "IS", - vm: "1", - name: "RangeShifterNumber", - }, - "(300A,0318)": { - tag: "(300A,0318)", - vr: "SH", - vm: "1", - name: "RangeShifterID", - }, - "(300A,0320)": { - tag: "(300A,0320)", - vr: "CS", - vm: "1", - name: "RangeShifterType", - }, - "(300A,0322)": { - tag: "(300A,0322)", - vr: "LO", - vm: "1", - name: "RangeShifterDescription", - }, - "(300A,0330)": { - tag: "(300A,0330)", - vr: "IS", - vm: "1", - name: "NumberOfLateralSpreadingDevices", - }, - "(300A,0332)": { - tag: "(300A,0332)", - vr: "SQ", - vm: "1", - name: "LateralSpreadingDeviceSequence", - }, - "(300A,0334)": { - tag: "(300A,0334)", - vr: "IS", - vm: "1", - name: "LateralSpreadingDeviceNumber", - }, - "(300A,0336)": { - tag: "(300A,0336)", - vr: "SH", - vm: "1", - name: "LateralSpreadingDeviceID", - }, - "(300A,0338)": { - tag: "(300A,0338)", - vr: "CS", - vm: "1", - name: "LateralSpreadingDeviceType", - }, - "(300A,033A)": { - tag: "(300A,033A)", - vr: "LO", - vm: "1", - name: "LateralSpreadingDeviceDescription", - }, - "(300A,033C)": { - tag: "(300A,033C)", - vr: "FL", - vm: "1", - name: "LateralSpreadingDeviceWaterEquivalentThickness", - }, - "(300A,0340)": { - tag: "(300A,0340)", - vr: "IS", - vm: "1", - name: "NumberOfRangeModulators", - }, - "(300A,0342)": { - tag: "(300A,0342)", - vr: "SQ", - vm: "1", - name: "RangeModulatorSequence", - }, - "(300A,0344)": { - tag: "(300A,0344)", - vr: "IS", - vm: "1", - name: "RangeModulatorNumber", - }, - "(300A,0346)": { - tag: "(300A,0346)", - vr: "SH", - vm: "1", - name: "RangeModulatorID", - }, - "(300A,0348)": { - tag: "(300A,0348)", - vr: "CS", - vm: "1", - name: "RangeModulatorType", - }, - "(300A,034A)": { - tag: "(300A,034A)", - vr: "LO", - vm: "1", - name: "RangeModulatorDescription", - }, - "(300A,034C)": { - tag: "(300A,034C)", - vr: "SH", - vm: "1", - name: "BeamCurrentModulationID", - }, - "(300A,0350)": { - tag: "(300A,0350)", - vr: "CS", - vm: "1", - name: "PatientSupportType", - }, - "(300A,0352)": { - tag: "(300A,0352)", - vr: "SH", - vm: "1", - name: "PatientSupportID", - }, - "(300A,0354)": { - tag: "(300A,0354)", - vr: "LO", - vm: "1", - name: "PatientSupportAccessoryCode", - }, - "(300A,0355)": { - tag: "(300A,0355)", - vr: "LO", - vm: "1", - name: "TrayAccessoryCode", - }, - "(300A,0356)": { - tag: "(300A,0356)", - vr: "FL", - vm: "1", - name: "FixationLightAzimuthalAngle", - }, - "(300A,0358)": { - tag: "(300A,0358)", - vr: "FL", - vm: "1", - name: "FixationLightPolarAngle", - }, - "(300A,035A)": { - tag: "(300A,035A)", - vr: "FL", - vm: "1", - name: "MetersetRate", - }, - "(300A,0360)": { - tag: "(300A,0360)", - vr: "SQ", - vm: "1", - name: "RangeShifterSettingsSequence", - }, - "(300A,0362)": { - tag: "(300A,0362)", - vr: "LO", - vm: "1", - name: "RangeShifterSetting", - }, - "(300A,0364)": { - tag: "(300A,0364)", - vr: "FL", - vm: "1", - name: "IsocenterToRangeShifterDistance", - }, - "(300A,0366)": { - tag: "(300A,0366)", - vr: "FL", - vm: "1", - name: "RangeShifterWaterEquivalentThickness", - }, - "(300A,0370)": { - tag: "(300A,0370)", - vr: "SQ", - vm: "1", - name: "LateralSpreadingDeviceSettingsSequence", - }, - "(300A,0372)": { - tag: "(300A,0372)", - vr: "LO", - vm: "1", - name: "LateralSpreadingDeviceSetting", - }, - "(300A,0374)": { - tag: "(300A,0374)", - vr: "FL", - vm: "1", - name: "IsocenterToLateralSpreadingDeviceDistance", - }, - "(300A,0380)": { - tag: "(300A,0380)", - vr: "SQ", - vm: "1", - name: "RangeModulatorSettingsSequence", - }, - "(300A,0382)": { - tag: "(300A,0382)", - vr: "FL", - vm: "1", - name: "RangeModulatorGatingStartValue", - }, - "(300A,0384)": { - tag: "(300A,0384)", - vr: "FL", - vm: "1", - name: "RangeModulatorGatingStopValue", - }, - "(300A,0386)": { - tag: "(300A,0386)", - vr: "FL", - vm: "1", - name: "RangeModulatorGatingStartWaterEquivalentThickness", - }, - "(300A,0388)": { - tag: "(300A,0388)", - vr: "FL", - vm: "1", - name: "RangeModulatorGatingStopWaterEquivalentThickness", - }, - "(300A,038A)": { - tag: "(300A,038A)", - vr: "FL", - vm: "1", - name: "IsocenterToRangeModulatorDistance", - }, - "(300A,038F)": { - tag: "(300A,038F)", - vr: "FL", - vm: "1-n", - name: "ScanSpotTimeOffset", - }, - "(300A,0390)": { - tag: "(300A,0390)", - vr: "SH", - vm: "1", - name: "ScanSpotTuneID", - }, - "(300A,0391)": { - tag: "(300A,0391)", - vr: "IS", - vm: "1-n", - name: "ScanSpotPrescribedIndices", - }, - "(300A,0392)": { - tag: "(300A,0392)", - vr: "IS", - vm: "1", - name: "NumberOfScanSpotPositions", - }, - "(300A,0393)": { - tag: "(300A,0393)", - vr: "CS", - vm: "1", - name: "ScanSpotReordered", - }, - "(300A,0394)": { - tag: "(300A,0394)", - vr: "FL", - vm: "1-n", - name: "ScanSpotPositionMap", - }, - "(300A,0395)": { - tag: "(300A,0395)", - vr: "CS", - vm: "1", - name: "ScanSpotReorderingAllowed", - }, - "(300A,0396)": { - tag: "(300A,0396)", - vr: "FL", - vm: "1-n", - name: "ScanSpotMetersetWeights", - }, - "(300A,0398)": { - tag: "(300A,0398)", - vr: "FL", - vm: "2", - name: "ScanningSpotSize", - }, - "(300A,0399)": { - tag: "(300A,0399)", - vr: "FL", - vm: "2-2n", - name: "ScanSpotSizesDelivered", - }, - "(300A,039A)": { - tag: "(300A,039A)", - vr: "IS", - vm: "1", - name: "NumberOfPaintings", - }, - "(300A,03A0)": { - tag: "(300A,03A0)", - vr: "SQ", - vm: "1", - name: "IonToleranceTableSequence", - }, - "(300A,03A2)": { - tag: "(300A,03A2)", - vr: "SQ", - vm: "1", - name: "IonBeamSequence", - }, - "(300A,03A4)": { - tag: "(300A,03A4)", - vr: "SQ", - vm: "1", - name: "IonBeamLimitingDeviceSequence", - }, - "(300A,03A6)": { - tag: "(300A,03A6)", - vr: "SQ", - vm: "1", - name: "IonBlockSequence", - }, - "(300A,03A8)": { - tag: "(300A,03A8)", - vr: "SQ", - vm: "1", - name: "IonControlPointSequence", - }, - "(300A,03AA)": { - tag: "(300A,03AA)", - vr: "SQ", - vm: "1", - name: "IonWedgeSequence", - }, - "(300A,03AC)": { - tag: "(300A,03AC)", - vr: "SQ", - vm: "1", - name: "IonWedgePositionSequence", - }, - "(300A,0401)": { - tag: "(300A,0401)", - vr: "SQ", - vm: "1", - name: "ReferencedSetupImageSequence", - }, - "(300A,0402)": { - tag: "(300A,0402)", - vr: "ST", - vm: "1", - name: "SetupImageComment", - }, - "(300A,0410)": { - tag: "(300A,0410)", - vr: "SQ", - vm: "1", - name: "MotionSynchronizationSequence", - }, - "(300A,0412)": { - tag: "(300A,0412)", - vr: "FL", - vm: "3", - name: "ControlPointOrientation", - }, - "(300A,0420)": { - tag: "(300A,0420)", - vr: "SQ", - vm: "1", - name: "GeneralAccessorySequence", - }, - "(300A,0421)": { - tag: "(300A,0421)", - vr: "SH", - vm: "1", - name: "GeneralAccessoryID", - }, - "(300A,0422)": { - tag: "(300A,0422)", - vr: "ST", - vm: "1", - name: "GeneralAccessoryDescription", - }, - "(300A,0423)": { - tag: "(300A,0423)", - vr: "CS", - vm: "1", - name: "GeneralAccessoryType", - }, - "(300A,0424)": { - tag: "(300A,0424)", - vr: "IS", - vm: "1", - name: "GeneralAccessoryNumber", - }, - "(300A,0425)": { - tag: "(300A,0425)", - vr: "FL", - vm: "1", - name: "SourceToGeneralAccessoryDistance", - }, - "(300A,0426)": { - tag: "(300A,0426)", - vr: "DS", - vm: "1", - name: "IsocenterToGeneralAccessoryDistance", - }, - "(300A,0431)": { - tag: "(300A,0431)", - vr: "SQ", - vm: "1", - name: "ApplicatorGeometrySequence", - }, - "(300A,0432)": { - tag: "(300A,0432)", - vr: "CS", - vm: "1", - name: "ApplicatorApertureShape", - }, - "(300A,0433)": { - tag: "(300A,0433)", - vr: "FL", - vm: "1", - name: "ApplicatorOpening", - }, - "(300A,0434)": { - tag: "(300A,0434)", - vr: "FL", - vm: "1", - name: "ApplicatorOpeningX", - }, - "(300A,0435)": { - tag: "(300A,0435)", - vr: "FL", - vm: "1", - name: "ApplicatorOpeningY", - }, - "(300A,0436)": { - tag: "(300A,0436)", - vr: "FL", - vm: "1", - name: "SourceToApplicatorMountingPositionDistance", - }, - "(300A,0440)": { - tag: "(300A,0440)", - vr: "IS", - vm: "1", - name: "NumberOfBlockSlabItems", - }, - "(300A,0441)": { - tag: "(300A,0441)", - vr: "SQ", - vm: "1", - name: "BlockSlabSequence", - }, - "(300A,0442)": { - tag: "(300A,0442)", - vr: "DS", - vm: "1", - name: "BlockSlabThickness", - }, - "(300A,0443)": { - tag: "(300A,0443)", - vr: "US", - vm: "1", - name: "BlockSlabNumber", - }, - "(300A,0450)": { - tag: "(300A,0450)", - vr: "SQ", - vm: "1", - name: "DeviceMotionControlSequence", - }, - "(300A,0451)": { - tag: "(300A,0451)", - vr: "CS", - vm: "1", - name: "DeviceMotionExecutionMode", - }, - "(300A,0452)": { - tag: "(300A,0452)", - vr: "CS", - vm: "1", - name: "DeviceMotionObservationMode", - }, - "(300A,0453)": { - tag: "(300A,0453)", - vr: "SQ", - vm: "1", - name: "DeviceMotionParameterCodeSequence", - }, - "(300A,0501)": { - tag: "(300A,0501)", - vr: "FL", - vm: "1", - name: "DistalDepthFraction", - }, - "(300A,0502)": { tag: "(300A,0502)", vr: "FL", vm: "1", name: "DistalDepth" }, - "(300A,0503)": { - tag: "(300A,0503)", - vr: "FL", - vm: "2", - name: "NominalRangeModulationFractions", - }, - "(300A,0504)": { - tag: "(300A,0504)", - vr: "FL", - vm: "2", - name: "NominalRangeModulatedRegionDepths", - }, - "(300A,0505)": { - tag: "(300A,0505)", - vr: "SQ", - vm: "1", - name: "DepthDoseParametersSequence", - }, - "(300A,0506)": { - tag: "(300A,0506)", - vr: "SQ", - vm: "1", - name: "DeliveredDepthDoseParametersSequence", - }, - "(300A,0507)": { - tag: "(300A,0507)", - vr: "FL", - vm: "1", - name: "DeliveredDistalDepthFraction", - }, - "(300A,0508)": { - tag: "(300A,0508)", - vr: "FL", - vm: "1", - name: "DeliveredDistalDepth", - }, - "(300A,0509)": { - tag: "(300A,0509)", - vr: "FL", - vm: "2", - name: "DeliveredNominalRangeModulationFractions", - }, - "(300A,0510)": { - tag: "(300A,0510)", - vr: "FL", - vm: "2", - name: "DeliveredNominalRangeModulatedRegionDepths", - }, - "(300A,0511)": { - tag: "(300A,0511)", - vr: "CS", - vm: "1", - name: "DeliveredReferenceDoseDefinition", - }, - "(300A,0512)": { - tag: "(300A,0512)", - vr: "CS", - vm: "1", - name: "ReferenceDoseDefinition", - }, - "(300A,0600)": { - tag: "(300A,0600)", - vr: "US", - vm: "1", - name: "RTControlPointIndex", - }, - "(300A,0601)": { - tag: "(300A,0601)", - vr: "US", - vm: "1", - name: "RadiationGenerationModeIndex", - }, - "(300A,0602)": { - tag: "(300A,0602)", - vr: "US", - vm: "1", - name: "ReferencedDefinedDeviceIndex", - }, - "(300A,0603)": { - tag: "(300A,0603)", - vr: "US", - vm: "1", - name: "RadiationDoseIdentificationIndex", - }, - "(300A,0604)": { - tag: "(300A,0604)", - vr: "US", - vm: "1", - name: "NumberOfRTControlPoints", - }, - "(300A,0605)": { - tag: "(300A,0605)", - vr: "US", - vm: "1", - name: "ReferencedRadiationGenerationModeIndex", - }, - "(300A,0606)": { - tag: "(300A,0606)", - vr: "US", - vm: "1", - name: "TreatmentPositionIndex", - }, - "(300A,0607)": { - tag: "(300A,0607)", - vr: "US", - vm: "1", - name: "ReferencedDeviceIndex", - }, - "(300A,0608)": { - tag: "(300A,0608)", - vr: "LO", - vm: "1", - name: "TreatmentPositionGroupLabel", - }, - "(300A,0609)": { - tag: "(300A,0609)", - vr: "UI", - vm: "1", - name: "TreatmentPositionGroupUID", - }, - "(300A,060A)": { - tag: "(300A,060A)", - vr: "SQ", - vm: "1", - name: "TreatmentPositionGroupSequence", - }, - "(300A,060B)": { - tag: "(300A,060B)", - vr: "US", - vm: "1", - name: "ReferencedTreatmentPositionIndex", - }, - "(300A,060C)": { - tag: "(300A,060C)", - vr: "US", - vm: "1", - name: "ReferencedRadiationDoseIdentificationIndex", - }, - "(300A,060D)": { - tag: "(300A,060D)", - vr: "FD", - vm: "1", - name: "RTAccessoryHolderWaterEquivalentThickness", - }, - "(300A,060E)": { - tag: "(300A,060E)", - vr: "US", - vm: "1", - name: "ReferencedRTAccessoryHolderDeviceIndex", - }, - "(300A,060F)": { - tag: "(300A,060F)", - vr: "CS", - vm: "1", - name: "RTAccessoryHolderSlotExistenceFlag", - }, - "(300A,0610)": { - tag: "(300A,0610)", - vr: "SQ", - vm: "1", - name: "RTAccessoryHolderSlotSequence", - }, - "(300A,0611)": { - tag: "(300A,0611)", - vr: "LO", - vm: "1", - name: "RTAccessoryHolderSlotID", - }, - "(300A,0612)": { - tag: "(300A,0612)", - vr: "FD", - vm: "1", - name: "RTAccessoryHolderSlotDistance", - }, - "(300A,0613)": { - tag: "(300A,0613)", - vr: "FD", - vm: "1", - name: "RTAccessorySlotDistance", - }, - "(300A,0614)": { - tag: "(300A,0614)", - vr: "SQ", - vm: "1", - name: "RTAccessoryHolderDefinitionSequence", - }, - "(300A,0615)": { - tag: "(300A,0615)", - vr: "LO", - vm: "1", - name: "RTAccessoryDeviceSlotID", - }, - "(300A,0616)": { - tag: "(300A,0616)", - vr: "SQ", - vm: "1", - name: "RTRadiationSequence", - }, - "(300A,0617)": { - tag: "(300A,0617)", - vr: "SQ", - vm: "1", - name: "RadiationDoseSequence", - }, - "(300A,0618)": { - tag: "(300A,0618)", - vr: "SQ", - vm: "1", - name: "RadiationDoseIdentificationSequence", - }, - "(300A,0619)": { - tag: "(300A,0619)", - vr: "LO", - vm: "1", - name: "RadiationDoseIdentificationLabel", - }, - "(300A,061A)": { - tag: "(300A,061A)", - vr: "CS", - vm: "1", - name: "ReferenceDoseType", - }, - "(300A,061B)": { - tag: "(300A,061B)", - vr: "CS", - vm: "1", - name: "PrimaryDoseValueIndicator", - }, - "(300A,061C)": { - tag: "(300A,061C)", - vr: "SQ", - vm: "1", - name: "DoseValuesSequence", - }, - "(300A,061D)": { - tag: "(300A,061D)", - vr: "CS", - vm: "1-n", - name: "DoseValuePurpose", - }, - "(300A,061E)": { - tag: "(300A,061E)", - vr: "FD", - vm: "3", - name: "ReferenceDosePointCoordinates", - }, - "(300A,061F)": { - tag: "(300A,061F)", - vr: "SQ", - vm: "1", - name: "RadiationDoseValuesParametersSequence", - }, - "(300A,0620)": { - tag: "(300A,0620)", - vr: "SQ", - vm: "1", - name: "MetersetToDoseMappingSequence", - }, - "(300A,0621)": { - tag: "(300A,0621)", - vr: "SQ", - vm: "1", - name: "ExpectedInVivoMeasurementValuesSequence", - }, - "(300A,0622)": { - tag: "(300A,0622)", - vr: "US", - vm: "1", - name: "ExpectedInVivoMeasurementValueIndex", - }, - "(300A,0623)": { - tag: "(300A,0623)", - vr: "LO", - vm: "1", - name: "RadiationDoseInVivoMeasurementLabel", - }, - "(300A,0624)": { - tag: "(300A,0624)", - vr: "FD", - vm: "2", - name: "RadiationDoseCentralAxisDisplacement", - }, - "(300A,0625)": { - tag: "(300A,0625)", - vr: "FD", - vm: "1", - name: "RadiationDoseValue", - }, - "(300A,0626)": { - tag: "(300A,0626)", - vr: "FD", - vm: "1", - name: "RadiationDoseSourceToSkinDistance", - }, - "(300A,0627)": { - tag: "(300A,0627)", - vr: "FD", - vm: "3", - name: "RadiationDoseMeasurementPointCoordinates", - }, - "(300A,0628)": { - tag: "(300A,0628)", - vr: "FD", - vm: "1", - name: "RadiationDoseSourceToExternalContourDistance", - }, - "(300A,0629)": { - tag: "(300A,0629)", - vr: "SQ", - vm: "1", - name: "RTToleranceSetSequence", - }, - "(300A,062A)": { - tag: "(300A,062A)", - vr: "LO", - vm: "1", - name: "RTToleranceSetLabel", - }, - "(300A,062B)": { - tag: "(300A,062B)", - vr: "SQ", - vm: "1", - name: "AttributeToleranceValuesSequence", - }, - "(300A,062C)": { - tag: "(300A,062C)", - vr: "FD", - vm: "1", - name: "ToleranceValue", - }, - "(300A,062D)": { - tag: "(300A,062D)", - vr: "SQ", - vm: "1", - name: "PatientSupportPositionToleranceSequence", - }, - "(300A,062E)": { - tag: "(300A,062E)", - vr: "FD", - vm: "1", - name: "TreatmentTimeLimit", - }, - "(300A,062F)": { - tag: "(300A,062F)", - vr: "SQ", - vm: "1", - name: "CArmPhotonElectronControlPointSequence", - }, - "(300A,0630)": { - tag: "(300A,0630)", - vr: "SQ", - vm: "1", - name: "ReferencedRTRadiationSequence", - }, - "(300A,0631)": { - tag: "(300A,0631)", - vr: "SQ", - vm: "1", - name: "ReferencedRTInstanceSequence", - }, - "(300A,0632)": { - tag: "(300A,0632)", - vr: "SQ", - vm: "1", - name: "ReferencedRTPatientSetupSequence", - }, - "(300A,0634)": { - tag: "(300A,0634)", - vr: "FD", - vm: "1", - name: "SourceToPatientSurfaceDistance", - }, - "(300A,0635)": { - tag: "(300A,0635)", - vr: "SQ", - vm: "1", - name: "TreatmentMachineSpecialModeCodeSequence", - }, - "(300A,0636)": { - tag: "(300A,0636)", - vr: "US", - vm: "1", - name: "IntendedNumberOfFractions", - }, - "(300A,0637)": { - tag: "(300A,0637)", - vr: "CS", - vm: "1", - name: "RTRadiationSetIntent", - }, - "(300A,0638)": { - tag: "(300A,0638)", - vr: "CS", - vm: "1", - name: "RTRadiationPhysicalAndGeometricContentDetailFlag", - }, - "(300A,0639)": { - tag: "(300A,0639)", - vr: "CS", - vm: "1", - name: "RTRecordFlag", - }, - "(300A,063A)": { - tag: "(300A,063A)", - vr: "SQ", - vm: "1", - name: "TreatmentDeviceIdentificationSequence", - }, - "(300A,063B)": { - tag: "(300A,063B)", - vr: "SQ", - vm: "1", - name: "ReferencedRTPhysicianIntentSequence", - }, - "(300A,063C)": { - tag: "(300A,063C)", - vr: "FD", - vm: "1", - name: "CumulativeMeterset", - }, - "(300A,063D)": { - tag: "(300A,063D)", - vr: "FD", - vm: "1", - name: "DeliveryRate", - }, - "(300A,063E)": { - tag: "(300A,063E)", - vr: "SQ", - vm: "1", - name: "DeliveryRateUnitSequence", - }, - "(300A,063F)": { - tag: "(300A,063F)", - vr: "SQ", - vm: "1", - name: "TreatmentPositionSequence", - }, - "(300A,0640)": { - tag: "(300A,0640)", - vr: "FD", - vm: "1", - name: "RadiationSourceAxisDistance", - }, - "(300A,0641)": { - tag: "(300A,0641)", - vr: "US", - vm: "1", - name: "NumberOfRTBeamLimitingDevices", - }, - "(300A,0642)": { - tag: "(300A,0642)", - vr: "FD", - vm: "1", - name: "RTBeamLimitingDeviceProximalDistance", - }, - "(300A,0643)": { - tag: "(300A,0643)", - vr: "FD", - vm: "1", - name: "RTBeamLimitingDeviceDistalDistance", - }, - "(300A,0644)": { - tag: "(300A,0644)", - vr: "SQ", - vm: "1", - name: "ParallelRTBeamDelimiterDeviceOrientationLabelCodeSequence", - }, - "(300A,0645)": { - tag: "(300A,0645)", - vr: "FD", - vm: "1", - name: "BeamModifierOrientationAngle", - }, - "(300A,0646)": { - tag: "(300A,0646)", - vr: "SQ", - vm: "1", - name: "FixedRTBeamDelimiterDeviceSequence", - }, - "(300A,0647)": { - tag: "(300A,0647)", - vr: "SQ", - vm: "1", - name: "ParallelRTBeamDelimiterDeviceSequence", - }, - "(300A,0648)": { - tag: "(300A,0648)", - vr: "US", - vm: "1", - name: "NumberOfParallelRTBeamDelimiters", - }, - "(300A,0649)": { - tag: "(300A,0649)", - vr: "FD", - vm: "2-n", - name: "ParallelRTBeamDelimiterBoundaries", - }, - "(300A,064A)": { - tag: "(300A,064A)", - vr: "FD", - vm: "2-n", - name: "ParallelRTBeamDelimiterPositions", - }, - "(300A,064B)": { - tag: "(300A,064B)", - vr: "FD", - vm: "2", - name: "RTBeamLimitingDeviceOffset", - }, - "(300A,064C)": { - tag: "(300A,064C)", - vr: "SQ", - vm: "1", - name: "RTBeamDelimiterGeometrySequence", - }, - "(300A,064D)": { - tag: "(300A,064D)", - vr: "SQ", - vm: "1", - name: "RTBeamLimitingDeviceDefinitionSequence", - }, - "(300A,064E)": { - tag: "(300A,064E)", - vr: "CS", - vm: "1", - name: "ParallelRTBeamDelimiterOpeningMode", - }, - "(300A,064F)": { - tag: "(300A,064F)", - vr: "CS", - vm: "1-n", - name: "ParallelRTBeamDelimiterLeafMountingSide", - }, - "(300A,0650)": { - tag: "(300A,0650)", - vr: "UI", - vm: "1", - name: "PatientSetupUID", - }, - "(300A,0651)": { - tag: "(300A,0651)", - vr: "SQ", - vm: "1", - name: "WedgeDefinitionSequence", - }, - "(300A,0652)": { - tag: "(300A,0652)", - vr: "FD", - vm: "1", - name: "RadiationBeamWedgeAngle", - }, - "(300A,0653)": { - tag: "(300A,0653)", - vr: "FD", - vm: "1", - name: "RadiationBeamWedgeThinEdgeDistance", - }, - "(300A,0654)": { - tag: "(300A,0654)", - vr: "FD", - vm: "1", - name: "RadiationBeamEffectiveWedgeAngle", - }, - "(300A,0655)": { - tag: "(300A,0655)", - vr: "US", - vm: "1", - name: "NumberOfWedgePositions", - }, - "(300A,0656)": { - tag: "(300A,0656)", - vr: "SQ", - vm: "1", - name: "RTBeamLimitingDeviceOpeningSequence", - }, - "(300A,0657)": { - tag: "(300A,0657)", - vr: "US", - vm: "1", - name: "NumberOfRTBeamLimitingDeviceOpenings", - }, - "(300A,0658)": { - tag: "(300A,0658)", - vr: "SQ", - vm: "1", - name: "RadiationDosimeterUnitSequence", - }, - "(300A,0659)": { - tag: "(300A,0659)", - vr: "SQ", - vm: "1", - name: "RTDeviceDistanceReferenceLocationCodeSequence", - }, - "(300A,065A)": { - tag: "(300A,065A)", - vr: "SQ", - vm: "1", - name: "RadiationDeviceConfigurationAndCommissioningKeySequence", - }, - "(300A,065B)": { - tag: "(300A,065B)", - vr: "SQ", - vm: "1", - name: "PatientSupportPositionParameterSequence", - }, - "(300A,065C)": { - tag: "(300A,065C)", - vr: "CS", - vm: "1", - name: "PatientSupportPositionSpecificationMethod", - }, - "(300A,065D)": { - tag: "(300A,065D)", - vr: "SQ", - vm: "1", - name: "PatientSupportPositionDeviceParameterSequence", - }, - "(300A,065E)": { - tag: "(300A,065E)", - vr: "US", - vm: "1", - name: "DeviceOrderIndex", - }, - "(300A,065F)": { - tag: "(300A,065F)", - vr: "US", - vm: "1", - name: "PatientSupportPositionParameterOrderIndex", - }, - "(300A,0660)": { - tag: "(300A,0660)", - vr: "SQ", - vm: "1", - name: "PatientSupportPositionDeviceToleranceSequence", - }, - "(300A,0661)": { - tag: "(300A,0661)", - vr: "US", - vm: "1", - name: "PatientSupportPositionToleranceOrderIndex", - }, - "(300A,0662)": { - tag: "(300A,0662)", - vr: "SQ", - vm: "1", - name: "CompensatorDefinitionSequence", - }, - "(300A,0663)": { - tag: "(300A,0663)", - vr: "CS", - vm: "1", - name: "CompensatorMapOrientation", - }, - "(300A,0664)": { - tag: "(300A,0664)", - vr: "OF", - vm: "1", - name: "CompensatorProximalThicknessMap", - }, - "(300A,0665)": { - tag: "(300A,0665)", - vr: "OF", - vm: "1", - name: "CompensatorDistalThicknessMap", - }, - "(300A,0666)": { - tag: "(300A,0666)", - vr: "FD", - vm: "1", - name: "CompensatorBasePlaneOffset", - }, - "(300A,0667)": { - tag: "(300A,0667)", - vr: "SQ", - vm: "1", - name: "CompensatorShapeFabricationCodeSequence", - }, - "(300A,0668)": { - tag: "(300A,0668)", - vr: "SQ", - vm: "1", - name: "CompensatorShapeSequence", - }, - "(300A,0669)": { - tag: "(300A,0669)", - vr: "FD", - vm: "1", - name: "RadiationBeamCompensatorMillingToolDiameter", - }, - "(300A,066A)": { - tag: "(300A,066A)", - vr: "SQ", - vm: "1", - name: "BlockDefinitionSequence", - }, - "(300A,066B)": { - tag: "(300A,066B)", - vr: "OF", - vm: "1", - name: "BlockEdgeData", - }, - "(300A,066C)": { - tag: "(300A,066C)", - vr: "CS", - vm: "1", - name: "BlockOrientation", - }, - "(300A,066D)": { - tag: "(300A,066D)", - vr: "FD", - vm: "1", - name: "RadiationBeamBlockThickness", - }, - "(300A,066E)": { - tag: "(300A,066E)", - vr: "FD", - vm: "1", - name: "RadiationBeamBlockSlabThickness", - }, - "(300A,066F)": { - tag: "(300A,066F)", - vr: "SQ", - vm: "1", - name: "BlockEdgeDataSequence", - }, - "(300A,0670)": { - tag: "(300A,0670)", - vr: "US", - vm: "1", - name: "NumberOfRTAccessoryHolders", - }, - "(300A,0671)": { - tag: "(300A,0671)", - vr: "SQ", - vm: "1", - name: "GeneralAccessoryDefinitionSequence", - }, - "(300A,0672)": { - tag: "(300A,0672)", - vr: "US", - vm: "1", - name: "NumberOfGeneralAccessories", - }, - "(300A,0673)": { - tag: "(300A,0673)", - vr: "SQ", - vm: "1", - name: "BolusDefinitionSequence", - }, - "(300A,0674)": { - tag: "(300A,0674)", - vr: "US", - vm: "1", - name: "NumberOfBoluses", - }, - "(300A,0675)": { - tag: "(300A,0675)", - vr: "UI", - vm: "1", - name: "EquipmentFrameOfReferenceUID", - }, - "(300A,0676)": { - tag: "(300A,0676)", - vr: "ST", - vm: "1", - name: "EquipmentFrameOfReferenceDescription", - }, - "(300A,0677)": { - tag: "(300A,0677)", - vr: "SQ", - vm: "1", - name: "EquipmentReferencePointCoordinatesSequence", - }, - "(300A,0678)": { - tag: "(300A,0678)", - vr: "SQ", - vm: "1", - name: "EquipmentReferencePointCodeSequence", - }, - "(300A,0679)": { - tag: "(300A,0679)", - vr: "FD", - vm: "1", - name: "RTBeamLimitingDeviceAngle", - }, - "(300A,067A)": { - tag: "(300A,067A)", - vr: "FD", - vm: "1", - name: "SourceRollAngle", - }, - "(300A,067B)": { - tag: "(300A,067B)", - vr: "SQ", - vm: "1", - name: "RadiationGenerationModeSequence", - }, - "(300A,067C)": { - tag: "(300A,067C)", - vr: "SH", - vm: "1", - name: "RadiationGenerationModeLabel", - }, - "(300A,067D)": { - tag: "(300A,067D)", - vr: "ST", - vm: "1", - name: "RadiationGenerationModeDescription", - }, - "(300A,067E)": { - tag: "(300A,067E)", - vr: "SQ", - vm: "1", - name: "RadiationGenerationModeMachineCodeSequence", - }, - "(300A,067F)": { - tag: "(300A,067F)", - vr: "SQ", - vm: "1", - name: "RadiationTypeCodeSequence", - }, - "(300A,0680)": { - tag: "(300A,0680)", - vr: "DS", - vm: "1", - name: "NominalEnergy", - }, - "(300A,0681)": { - tag: "(300A,0681)", - vr: "DS", - vm: "1", - name: "MinimumNominalEnergy", - }, - "(300A,0682)": { - tag: "(300A,0682)", - vr: "DS", - vm: "1", - name: "MaximumNominalEnergy", - }, - "(300A,0683)": { - tag: "(300A,0683)", - vr: "SQ", - vm: "1", - name: "RadiationFluenceModifierCodeSequence", - }, - "(300A,0684)": { - tag: "(300A,0684)", - vr: "SQ", - vm: "1", - name: "EnergyUnitCodeSequence", - }, - "(300A,0685)": { - tag: "(300A,0685)", - vr: "US", - vm: "1", - name: "NumberOfRadiationGenerationModes", - }, - "(300A,0686)": { - tag: "(300A,0686)", - vr: "SQ", - vm: "1", - name: "PatientSupportDevicesSequence", - }, - "(300A,0687)": { - tag: "(300A,0687)", - vr: "US", - vm: "1", - name: "NumberOfPatientSupportDevices", - }, - "(300A,0688)": { - tag: "(300A,0688)", - vr: "FD", - vm: "1", - name: "RTBeamModifierDefinitionDistance", - }, - "(300A,0689)": { - tag: "(300A,0689)", - vr: "SQ", - vm: "1", - name: "BeamAreaLimitSequence", - }, - "(300A,068A)": { - tag: "(300A,068A)", - vr: "SQ", - vm: "1", - name: "ReferencedRTPrescriptionSequence", - }, - "(300A,0700)": { - tag: "(300A,0700)", - vr: "UI", - vm: "1", - name: "TreatmentSessionUID", - }, - "(300A,0701)": { - tag: "(300A,0701)", - vr: "CS", - vm: "1", - name: "RTRadiationUsage", - }, - "(300A,0702)": { - tag: "(300A,0702)", - vr: "SQ", - vm: "1", - name: "ReferencedRTRadiationSetSequence", - }, - "(300A,0703)": { - tag: "(300A,0703)", - vr: "SQ", - vm: "1", - name: "ReferencedRTRadiationRecordSequence", - }, - "(300A,0704)": { - tag: "(300A,0704)", - vr: "US", - vm: "1", - name: "RTRadiationSetDeliveryNumber", - }, - "(300A,0705)": { - tag: "(300A,0705)", - vr: "US", - vm: "1", - name: "ClinicalFractionNumber", - }, - "(300A,0706)": { - tag: "(300A,0706)", - vr: "CS", - vm: "1", - name: "RTTreatmentFractionCompletionStatus", - }, - "(300A,0707)": { - tag: "(300A,0707)", - vr: "CS", - vm: "1", - name: "RTRadiationSetUsage", - }, - "(300A,0708)": { - tag: "(300A,0708)", - vr: "CS", - vm: "1", - name: "TreatmentDeliveryContinuationFlag", - }, - "(300A,0709)": { - tag: "(300A,0709)", - vr: "CS", - vm: "1", - name: "TreatmentRecordContentOrigin", - }, - "(300A,0714)": { - tag: "(300A,0714)", - vr: "CS", - vm: "1", - name: "RTTreatmentTerminationStatus", - }, - "(300A,0715)": { - tag: "(300A,0715)", - vr: "SQ", - vm: "1", - name: "RTTreatmentTerminationReasonCodeSequence", - }, - "(300A,0716)": { - tag: "(300A,0716)", - vr: "SQ", - vm: "1", - name: "MachineSpecificTreatmentTerminationCodeSequence", - }, - "(300A,0722)": { - tag: "(300A,0722)", - vr: "SQ", - vm: "1", - name: "RTRadiationSalvageRecordControlPointSequence", - }, - "(300A,0723)": { - tag: "(300A,0723)", - vr: "CS", - vm: "1", - name: "StartingMetersetValueKnownFlag", - }, - "(300A,0730)": { - tag: "(300A,0730)", - vr: "ST", - vm: "1", - name: "TreatmentTerminationDescription", - }, - "(300A,0731)": { - tag: "(300A,0731)", - vr: "SQ", - vm: "1", - name: "TreatmentToleranceViolationSequence", - }, - "(300A,0732)": { - tag: "(300A,0732)", - vr: "CS", - vm: "1", - name: "TreatmentToleranceViolationCategory", - }, - "(300A,0733)": { - tag: "(300A,0733)", - vr: "SQ", - vm: "1", - name: "TreatmentToleranceViolationAttributeSequence", - }, - "(300A,0734)": { - tag: "(300A,0734)", - vr: "ST", - vm: "1", - name: "TreatmentToleranceViolationDescription", - }, - "(300A,0735)": { - tag: "(300A,0735)", - vr: "ST", - vm: "1", - name: "TreatmentToleranceViolationIdentification", - }, - "(300A,0736)": { - tag: "(300A,0736)", - vr: "DT", - vm: "1", - name: "TreatmentToleranceViolationDateTime", - }, - "(300A,073A)": { - tag: "(300A,073A)", - vr: "DT", - vm: "1", - name: "RecordedRTControlPointDateTime", - }, - "(300A,073B)": { - tag: "(300A,073B)", - vr: "US", - vm: "1", - name: "ReferencedRadiationRTControlPointIndex", - }, - "(300A,073E)": { - tag: "(300A,073E)", - vr: "SQ", - vm: "1", - name: "AlternateValueSequence", - }, - "(300A,073F)": { - tag: "(300A,073F)", - vr: "SQ", - vm: "1", - name: "ConfirmationSequence", - }, - "(300A,0740)": { - tag: "(300A,0740)", - vr: "SQ", - vm: "1", - name: "InterlockSequence", - }, - "(300A,0741)": { - tag: "(300A,0741)", - vr: "DT", - vm: "1", - name: "InterlockDateTime", - }, - "(300A,0742)": { - tag: "(300A,0742)", - vr: "ST", - vm: "1", - name: "InterlockDescription", - }, - "(300A,0743)": { - tag: "(300A,0743)", - vr: "SQ", - vm: "1", - name: "InterlockOriginatingDeviceSequence", - }, - "(300A,0744)": { - tag: "(300A,0744)", - vr: "SQ", - vm: "1", - name: "InterlockCodeSequence", - }, - "(300A,0745)": { - tag: "(300A,0745)", - vr: "SQ", - vm: "1", - name: "InterlockResolutionCodeSequence", - }, - "(300A,0746)": { - tag: "(300A,0746)", - vr: "SQ", - vm: "1", - name: "InterlockResolutionUserSequence", - }, - "(300A,0760)": { - tag: "(300A,0760)", - vr: "DT", - vm: "1", - name: "OverrideDateTime", - }, - "(300A,0761)": { - tag: "(300A,0761)", - vr: "SQ", - vm: "1", - name: "TreatmentToleranceViolationTypeCodeSequence", - }, - "(300A,0762)": { - tag: "(300A,0762)", - vr: "SQ", - vm: "1", - name: "TreatmentToleranceViolationCauseCodeSequence", - }, - "(300A,0772)": { - tag: "(300A,0772)", - vr: "SQ", - vm: "1", - name: "MeasuredMetersetToDoseMappingSequence", - }, - "(300A,0773)": { - tag: "(300A,0773)", - vr: "US", - vm: "1", - name: "ReferencedExpectedInVivoMeasurementValueIndex", - }, - "(300A,0774)": { - tag: "(300A,0774)", - vr: "SQ", - vm: "1", - name: "DoseMeasurementDeviceCodeSequence", - }, - "(300A,0780)": { - tag: "(300A,0780)", - vr: "SQ", - vm: "1", - name: "AdditionalParameterRecordingInstanceSequence", - }, - "(300A,0782)": { tag: "(300A,0782)", vr: "US", vm: "1", name: "" }, - "(300A,0783)": { - tag: "(300A,0783)", - vr: "ST", - vm: "1", - name: "InterlockOriginDescription", - }, - "(300A,0784)": { - tag: "(300A,0784)", - vr: "SQ", - vm: "1", - name: "RTPatientPositionScopeSequence", - }, - "(300A,0785)": { - tag: "(300A,0785)", - vr: "UI", - vm: "1", - name: "ReferencedTreatmentPositionGroupUID", - }, - "(300A,0786)": { - tag: "(300A,0786)", - vr: "US", - vm: "1", - name: "RadiationOrderIndex", - }, - "(300A,0787)": { - tag: "(300A,0787)", - vr: "SQ", - vm: "1", - name: "OmittedRadiationSequence", - }, - "(300A,0788)": { - tag: "(300A,0788)", - vr: "SQ", - vm: "1", - name: "ReasonForOmissionCodeSequence", - }, - "(300A,0789)": { - tag: "(300A,0789)", - vr: "SQ", - vm: "1", - name: "RTDeliveryStartPatientPositionSequence", - }, - "(300A,078A)": { - tag: "(300A,078A)", - vr: "SQ", - vm: "1", - name: "RTTreatmentPreparationPatientPositionSequence", - }, - "(300A,078B)": { - tag: "(300A,078B)", - vr: "SQ", - vm: "1", - name: "ReferencedRTTreatmentPreparationSequence", - }, - "(300A,078C)": { - tag: "(300A,078C)", - vr: "SQ", - vm: "1", - name: "ReferencedPatientSetupPhotoSequence", - }, - "(300A,078D)": { - tag: "(300A,078D)", - vr: "SQ", - vm: "1", - name: "PatientTreatmentPreparationMethodCodeSequence", - }, - "(300A,078E)": { - tag: "(300A,078E)", - vr: "LT", - vm: "1", - name: "PatientTreatmentPreparationProcedureParameterDescription", - }, - "(300A,078F)": { - tag: "(300A,078F)", - vr: "SQ", - vm: "1", - name: "PatientTreatmentPreparationDeviceSequence", - }, - "(300A,0790)": { - tag: "(300A,0790)", - vr: "SQ", - vm: "1", - name: "PatientTreatmentPreparationProcedureSequence", - }, - "(300A,0791)": { - tag: "(300A,0791)", - vr: "SQ", - vm: "1", - name: "PatientTreatmentPreparationProcedureCodeSequence", - }, - "(300A,0792)": { - tag: "(300A,0792)", - vr: "LT", - vm: "1", - name: "PatientTreatmentPreparationMethodDescription", - }, - "(300A,0793)": { - tag: "(300A,0793)", - vr: "SQ", - vm: "1", - name: "PatientTreatmentPreparationProcedureParameterSequence", - }, - "(300A,0794)": { - tag: "(300A,0794)", - vr: "LT", - vm: "1", - name: "PatientSetupPhotoDescription", - }, - "(300A,0795)": { - tag: "(300A,0795)", - vr: "US", - vm: "1", - name: "PatientTreatmentPreparationProcedureIndex", - }, - "(300A,0796)": { - tag: "(300A,0796)", - vr: "US", - vm: "1", - name: "ReferencedPatientSetupProcedureIndex", - }, - "(300A,0797)": { - tag: "(300A,0797)", - vr: "SQ", - vm: "1", - name: "RTRadiationTaskSequence", - }, - "(300A,0798)": { - tag: "(300A,0798)", - vr: "SQ", - vm: "1", - name: "RTPatientPositionDisplacementSequence", - }, - "(300A,0799)": { - tag: "(300A,0799)", - vr: "SQ", - vm: "1", - name: "RTPatientPositionSequence", - }, - "(300A,079A)": { - tag: "(300A,079A)", - vr: "LO", - vm: "1", - name: "DisplacementReferenceLabel", - }, - "(300A,079B)": { - tag: "(300A,079B)", - vr: "FD", - vm: "16", - name: "DisplacementMatrix", - }, - "(300A,079C)": { - tag: "(300A,079C)", - vr: "SQ", - vm: "1", - name: "PatientSupportDisplacementSequence", - }, - "(300A,079D)": { - tag: "(300A,079D)", - vr: "SQ", - vm: "1", - name: "DisplacementReferenceLocationCodeSequence", - }, - "(300A,079E)": { - tag: "(300A,079E)", - vr: "CS", - vm: "1", - name: "RTRadiationSetDeliveryUsage", - }, - "(300C,0002)": { - tag: "(300C,0002)", - vr: "SQ", - vm: "1", - name: "ReferencedRTPlanSequence", - }, - "(300C,0004)": { - tag: "(300C,0004)", - vr: "SQ", - vm: "1", - name: "ReferencedBeamSequence", - }, - "(300C,0006)": { - tag: "(300C,0006)", - vr: "IS", - vm: "1", - name: "ReferencedBeamNumber", - }, - "(300C,0007)": { - tag: "(300C,0007)", - vr: "IS", - vm: "1", - name: "ReferencedReferenceImageNumber", - }, - "(300C,0008)": { - tag: "(300C,0008)", - vr: "DS", - vm: "1", - name: "StartCumulativeMetersetWeight", - }, - "(300C,0009)": { - tag: "(300C,0009)", - vr: "DS", - vm: "1", - name: "EndCumulativeMetersetWeight", - }, - "(300C,000A)": { - tag: "(300C,000A)", - vr: "SQ", - vm: "1", - name: "ReferencedBrachyApplicationSetupSequence", - }, - "(300C,000C)": { - tag: "(300C,000C)", - vr: "IS", - vm: "1", - name: "ReferencedBrachyApplicationSetupNumber", - }, - "(300C,000E)": { - tag: "(300C,000E)", - vr: "IS", - vm: "1", - name: "ReferencedSourceNumber", - }, - "(300C,0020)": { - tag: "(300C,0020)", - vr: "SQ", - vm: "1", - name: "ReferencedFractionGroupSequence", - }, - "(300C,0022)": { - tag: "(300C,0022)", - vr: "IS", - vm: "1", - name: "ReferencedFractionGroupNumber", - }, - "(300C,0040)": { - tag: "(300C,0040)", - vr: "SQ", - vm: "1", - name: "ReferencedVerificationImageSequence", - }, - "(300C,0042)": { - tag: "(300C,0042)", - vr: "SQ", - vm: "1", - name: "ReferencedReferenceImageSequence", - }, - "(300C,0050)": { - tag: "(300C,0050)", - vr: "SQ", - vm: "1", - name: "ReferencedDoseReferenceSequence", - }, - "(300C,0051)": { - tag: "(300C,0051)", - vr: "IS", - vm: "1", - name: "ReferencedDoseReferenceNumber", - }, - "(300C,0055)": { - tag: "(300C,0055)", - vr: "SQ", - vm: "1", - name: "BrachyReferencedDoseReferenceSequence", - }, - "(300C,0060)": { - tag: "(300C,0060)", - vr: "SQ", - vm: "1", - name: "ReferencedStructureSetSequence", - }, - "(300C,006A)": { - tag: "(300C,006A)", - vr: "IS", - vm: "1", - name: "ReferencedPatientSetupNumber", - }, - "(300C,0080)": { - tag: "(300C,0080)", - vr: "SQ", - vm: "1", - name: "ReferencedDoseSequence", - }, - "(300C,00A0)": { - tag: "(300C,00A0)", - vr: "IS", - vm: "1", - name: "ReferencedToleranceTableNumber", - }, - "(300C,00B0)": { - tag: "(300C,00B0)", - vr: "SQ", - vm: "1", - name: "ReferencedBolusSequence", - }, - "(300C,00C0)": { - tag: "(300C,00C0)", - vr: "IS", - vm: "1", - name: "ReferencedWedgeNumber", - }, - "(300C,00D0)": { - tag: "(300C,00D0)", - vr: "IS", - vm: "1", - name: "ReferencedCompensatorNumber", - }, - "(300C,00E0)": { - tag: "(300C,00E0)", - vr: "IS", - vm: "1", - name: "ReferencedBlockNumber", - }, - "(300C,00F0)": { - tag: "(300C,00F0)", - vr: "IS", - vm: "1", - name: "ReferencedControlPointIndex", - }, - "(300C,00F2)": { - tag: "(300C,00F2)", - vr: "SQ", - vm: "1", - name: "ReferencedControlPointSequence", - }, - "(300C,00F4)": { - tag: "(300C,00F4)", - vr: "IS", - vm: "1", - name: "ReferencedStartControlPointIndex", - }, - "(300C,00F6)": { - tag: "(300C,00F6)", - vr: "IS", - vm: "1", - name: "ReferencedStopControlPointIndex", - }, - "(300C,0100)": { - tag: "(300C,0100)", - vr: "IS", - vm: "1", - name: "ReferencedRangeShifterNumber", - }, - "(300C,0102)": { - tag: "(300C,0102)", - vr: "IS", - vm: "1", - name: "ReferencedLateralSpreadingDeviceNumber", - }, - "(300C,0104)": { - tag: "(300C,0104)", - vr: "IS", - vm: "1", - name: "ReferencedRangeModulatorNumber", - }, - "(300C,0111)": { - tag: "(300C,0111)", - vr: "SQ", - vm: "1", - name: "OmittedBeamTaskSequence", - }, - "(300C,0112)": { - tag: "(300C,0112)", - vr: "CS", - vm: "1", - name: "ReasonForOmission", - }, - "(300C,0113)": { - tag: "(300C,0113)", - vr: "LO", - vm: "1", - name: "ReasonForOmissionDescription", - }, - "(300C,0114)": { - tag: "(300C,0114)", - vr: "SQ", - vm: "1", - name: "PrescriptionOverviewSequence", - }, - "(300C,0115)": { - tag: "(300C,0115)", - vr: "FL", - vm: "1", - name: "TotalPrescriptionDose", - }, - "(300C,0116)": { - tag: "(300C,0116)", - vr: "SQ", - vm: "1", - name: "PlanOverviewSequence", - }, - "(300C,0117)": { - tag: "(300C,0117)", - vr: "US", - vm: "1", - name: "PlanOverviewIndex", - }, - "(300C,0118)": { - tag: "(300C,0118)", - vr: "US", - vm: "1", - name: "ReferencedPlanOverviewIndex", - }, - "(300C,0119)": { - tag: "(300C,0119)", - vr: "US", - vm: "1", - name: "NumberOfFractionsIncluded", - }, - "(300C,0120)": { - tag: "(300C,0120)", - vr: "SQ", - vm: "1", - name: "DoseCalibrationConditionsSequence", - }, - "(300C,0121)": { - tag: "(300C,0121)", - vr: "FD", - vm: "1", - name: "AbsorbedDoseToMetersetRatio", - }, - "(300C,0122)": { - tag: "(300C,0122)", - vr: "FD", - vm: "2", - name: "DelineatedRadiationFieldSize", - }, - "(300C,0123)": { - tag: "(300C,0123)", - vr: "CS", - vm: "1", - name: "DoseCalibrationConditionsVerifiedFlag", - }, - "(300C,0124)": { - tag: "(300C,0124)", - vr: "FD", - vm: "1", - name: "CalibrationReferencePointDepth", - }, - "(300C,0125)": { - tag: "(300C,0125)", - vr: "SQ", - vm: "1", - name: "GatingBeamHoldTransitionSequence", - }, - "(300C,0126)": { - tag: "(300C,0126)", - vr: "CS", - vm: "1", - name: "BeamHoldTransition", - }, - "(300C,0127)": { - tag: "(300C,0127)", - vr: "DT", - vm: "1", - name: "BeamHoldTransitionDateTime", - }, - "(300C,0128)": { - tag: "(300C,0128)", - vr: "SQ", - vm: "1", - name: "BeamHoldOriginatingDeviceSequence", - }, - "(300E,0002)": { - tag: "(300E,0002)", - vr: "CS", - vm: "1", - name: "ApprovalStatus", - }, - "(300E,0004)": { tag: "(300E,0004)", vr: "DA", vm: "1", name: "ReviewDate" }, - "(300E,0005)": { tag: "(300E,0005)", vr: "TM", vm: "1", name: "ReviewTime" }, - "(300E,0008)": { - tag: "(300E,0008)", - vr: "PN", - vm: "1", - name: "ReviewerName", - }, - "(3010,0001)": { - tag: "(3010,0001)", - vr: "SQ", - vm: "1", - name: "RadiobiologicalDoseEffectSequence", - }, - "(3010,0002)": { - tag: "(3010,0002)", - vr: "CS", - vm: "1", - name: "RadiobiologicalDoseEffectFlag", - }, - "(3010,0003)": { - tag: "(3010,0003)", - vr: "SQ", - vm: "1", - name: "EffectiveDoseCalculationMethodCategoryCodeSequence", - }, - "(3010,0004)": { - tag: "(3010,0004)", - vr: "SQ", - vm: "1", - name: "EffectiveDoseCalculationMethodCodeSequence", - }, - "(3010,0005)": { - tag: "(3010,0005)", - vr: "LO", - vm: "1", - name: "EffectiveDoseCalculationMethodDescription", - }, - "(3010,0006)": { - tag: "(3010,0006)", - vr: "UI", - vm: "1", - name: "ConceptualVolumeUID", - }, - "(3010,0007)": { - tag: "(3010,0007)", - vr: "SQ", - vm: "1", - name: "OriginatingSOPInstanceReferenceSequence", - }, - "(3010,0008)": { - tag: "(3010,0008)", - vr: "SQ", - vm: "1", - name: "ConceptualVolumeConstituentSequence", - }, - "(3010,0009)": { - tag: "(3010,0009)", - vr: "SQ", - vm: "1", - name: "EquivalentConceptualVolumeInstanceReferenceSequence", - }, - "(3010,000A)": { - tag: "(3010,000A)", - vr: "SQ", - vm: "1", - name: "EquivalentConceptualVolumesSequence", - }, - "(3010,000B)": { - tag: "(3010,000B)", - vr: "UI", - vm: "1", - name: "ReferencedConceptualVolumeUID", - }, - "(3010,000C)": { - tag: "(3010,000C)", - vr: "UT", - vm: "1", - name: "ConceptualVolumeCombinationExpression", - }, - "(3010,000D)": { - tag: "(3010,000D)", - vr: "US", - vm: "1", - name: "ConceptualVolumeConstituentIndex", - }, - "(3010,000E)": { - tag: "(3010,000E)", - vr: "CS", - vm: "1", - name: "ConceptualVolumeCombinationFlag", - }, - "(3010,000F)": { - tag: "(3010,000F)", - vr: "ST", - vm: "1", - name: "ConceptualVolumeCombinationDescription", - }, - "(3010,0010)": { - tag: "(3010,0010)", - vr: "CS", - vm: "1", - name: "ConceptualVolumeSegmentationDefinedFlag", - }, - "(3010,0011)": { - tag: "(3010,0011)", - vr: "SQ", - vm: "1", - name: "ConceptualVolumeSegmentationReferenceSequence", - }, - "(3010,0012)": { - tag: "(3010,0012)", - vr: "SQ", - vm: "1", - name: "ConceptualVolumeConstituentSegmentationReferenceSequence", - }, - "(3010,0013)": { - tag: "(3010,0013)", - vr: "UI", - vm: "1", - name: "ConstituentConceptualVolumeUID", - }, - "(3010,0014)": { - tag: "(3010,0014)", - vr: "SQ", - vm: "1", - name: "DerivationConceptualVolumeSequence", - }, - "(3010,0015)": { - tag: "(3010,0015)", - vr: "UI", - vm: "1", - name: "SourceConceptualVolumeUID", - }, - "(3010,0016)": { - tag: "(3010,0016)", - vr: "SQ", - vm: "1", - name: "ConceptualVolumeDerivationAlgorithmSequence", - }, - "(3010,0017)": { - tag: "(3010,0017)", - vr: "ST", - vm: "1", - name: "ConceptualVolumeDescription", - }, - "(3010,0018)": { - tag: "(3010,0018)", - vr: "SQ", - vm: "1", - name: "SourceConceptualVolumeSequence", - }, - "(3010,0019)": { - tag: "(3010,0019)", - vr: "SQ", - vm: "1", - name: "AuthorIdentificationSequence", - }, - "(3010,001A)": { - tag: "(3010,001A)", - vr: "LO", - vm: "1", - name: "ManufacturerModelVersion", - }, - "(3010,001B)": { - tag: "(3010,001B)", - vr: "UC", - vm: "1", - name: "DeviceAlternateIdentifier", - }, - "(3010,001C)": { - tag: "(3010,001C)", - vr: "CS", - vm: "1", - name: "DeviceAlternateIdentifierType", - }, - "(3010,001D)": { - tag: "(3010,001D)", - vr: "LT", - vm: "1", - name: "DeviceAlternateIdentifierFormat", - }, - "(3010,001E)": { - tag: "(3010,001E)", - vr: "LO", - vm: "1", - name: "SegmentationCreationTemplateLabel", - }, - "(3010,001F)": { - tag: "(3010,001F)", - vr: "UI", - vm: "1", - name: "SegmentationTemplateUID", - }, - "(3010,0020)": { - tag: "(3010,0020)", - vr: "US", - vm: "1", - name: "ReferencedSegmentReferenceIndex", - }, - "(3010,0021)": { - tag: "(3010,0021)", - vr: "SQ", - vm: "1", - name: "SegmentReferenceSequence", - }, - "(3010,0022)": { - tag: "(3010,0022)", - vr: "US", - vm: "1", - name: "SegmentReferenceIndex", - }, - "(3010,0023)": { - tag: "(3010,0023)", - vr: "SQ", - vm: "1", - name: "DirectSegmentReferenceSequence", - }, - "(3010,0024)": { - tag: "(3010,0024)", - vr: "SQ", - vm: "1", - name: "CombinationSegmentReferenceSequence", - }, - "(3010,0025)": { - tag: "(3010,0025)", - vr: "SQ", - vm: "1", - name: "ConceptualVolumeSequence", - }, - "(3010,0026)": { - tag: "(3010,0026)", - vr: "SQ", - vm: "1", - name: "SegmentedRTAccessoryDeviceSequence", - }, - "(3010,0027)": { - tag: "(3010,0027)", - vr: "SQ", - vm: "1", - name: "SegmentCharacteristicsSequence", - }, - "(3010,0028)": { - tag: "(3010,0028)", - vr: "SQ", - vm: "1", - name: "RelatedSegmentCharacteristicsSequence", - }, - "(3010,0029)": { - tag: "(3010,0029)", - vr: "US", - vm: "1", - name: "SegmentCharacteristicsPrecedence", - }, - "(3010,002A)": { - tag: "(3010,002A)", - vr: "SQ", - vm: "1", - name: "RTSegmentAnnotationSequence", - }, - "(3010,002B)": { - tag: "(3010,002B)", - vr: "SQ", - vm: "1", - name: "SegmentAnnotationCategoryCodeSequence", - }, - "(3010,002C)": { - tag: "(3010,002C)", - vr: "SQ", - vm: "1", - name: "SegmentAnnotationTypeCodeSequence", - }, - "(3010,002D)": { tag: "(3010,002D)", vr: "LO", vm: "1", name: "DeviceLabel" }, - "(3010,002E)": { - tag: "(3010,002E)", - vr: "SQ", - vm: "1", - name: "DeviceTypeCodeSequence", - }, - "(3010,002F)": { - tag: "(3010,002F)", - vr: "SQ", - vm: "1", - name: "SegmentAnnotationTypeModifierCodeSequence", - }, - "(3010,0030)": { - tag: "(3010,0030)", - vr: "SQ", - vm: "1", - name: "PatientEquipmentRelationshipCodeSequence", - }, - "(3010,0031)": { - tag: "(3010,0031)", - vr: "UI", - vm: "1", - name: "ReferencedFiducialsUID", - }, - "(3010,0032)": { - tag: "(3010,0032)", - vr: "SQ", - vm: "1", - name: "PatientTreatmentOrientationSequence", - }, - "(3010,0033)": { - tag: "(3010,0033)", - vr: "SH", - vm: "1", - name: "UserContentLabel", - }, - "(3010,0034)": { - tag: "(3010,0034)", - vr: "LO", - vm: "1", - name: "UserContentLongLabel", - }, - "(3010,0035)": { tag: "(3010,0035)", vr: "SH", vm: "1", name: "EntityLabel" }, - "(3010,0036)": { tag: "(3010,0036)", vr: "LO", vm: "1", name: "EntityName" }, - "(3010,0037)": { - tag: "(3010,0037)", - vr: "ST", - vm: "1", - name: "EntityDescription", - }, - "(3010,0038)": { - tag: "(3010,0038)", - vr: "LO", - vm: "1", - name: "EntityLongLabel", - }, - "(3010,0039)": { tag: "(3010,0039)", vr: "US", vm: "1", name: "DeviceIndex" }, - "(3010,003A)": { - tag: "(3010,003A)", - vr: "US", - vm: "1", - name: "RTTreatmentPhaseIndex", - }, - "(3010,003B)": { - tag: "(3010,003B)", - vr: "UI", - vm: "1", - name: "RTTreatmentPhaseUID", - }, - "(3010,003C)": { - tag: "(3010,003C)", - vr: "US", - vm: "1", - name: "RTPrescriptionIndex", - }, - "(3010,003D)": { - tag: "(3010,003D)", - vr: "US", - vm: "1", - name: "RTSegmentAnnotationIndex", - }, - "(3010,003E)": { - tag: "(3010,003E)", - vr: "US", - vm: "1", - name: "BasisRTTreatmentPhaseIndex", - }, - "(3010,003F)": { - tag: "(3010,003F)", - vr: "US", - vm: "1", - name: "RelatedRTTreatmentPhaseIndex", - }, - "(3010,0040)": { - tag: "(3010,0040)", - vr: "US", - vm: "1", - name: "ReferencedRTTreatmentPhaseIndex", - }, - "(3010,0041)": { - tag: "(3010,0041)", - vr: "US", - vm: "1", - name: "ReferencedRTPrescriptionIndex", - }, - "(3010,0042)": { - tag: "(3010,0042)", - vr: "US", - vm: "1", - name: "ReferencedParentRTPrescriptionIndex", - }, - "(3010,0043)": { - tag: "(3010,0043)", - vr: "ST", - vm: "1", - name: "ManufacturerDeviceIdentifier", - }, - "(3010,0044)": { - tag: "(3010,0044)", - vr: "SQ", - vm: "1", - name: "InstanceLevelReferencedPerformedProcedureStepSequence", - }, - "(3010,0045)": { - tag: "(3010,0045)", - vr: "CS", - vm: "1", - name: "RTTreatmentPhaseIntentPresenceFlag", - }, - "(3010,0046)": { - tag: "(3010,0046)", - vr: "CS", - vm: "1", - name: "RadiotherapyTreatmentType", - }, - "(3010,0047)": { - tag: "(3010,0047)", - vr: "CS", - vm: "1-n", - name: "TeletherapyRadiationType", - }, - "(3010,0048)": { - tag: "(3010,0048)", - vr: "CS", - vm: "1-n", - name: "BrachytherapySourceType", - }, - "(3010,0049)": { - tag: "(3010,0049)", - vr: "SQ", - vm: "1", - name: "ReferencedRTTreatmentPhaseSequence", - }, - "(3010,004A)": { - tag: "(3010,004A)", - vr: "SQ", - vm: "1", - name: "ReferencedDirectSegmentInstanceSequence", - }, - "(3010,004B)": { - tag: "(3010,004B)", - vr: "SQ", - vm: "1", - name: "IntendedRTTreatmentPhaseSequence", - }, - "(3010,004C)": { - tag: "(3010,004C)", - vr: "DA", - vm: "1", - name: "IntendedPhaseStartDate", - }, - "(3010,004D)": { - tag: "(3010,004D)", - vr: "DA", - vm: "1", - name: "IntendedPhaseEndDate", - }, - "(3010,004E)": { - tag: "(3010,004E)", - vr: "SQ", - vm: "1", - name: "RTTreatmentPhaseIntervalSequence", - }, - "(3010,004F)": { - tag: "(3010,004F)", - vr: "CS", - vm: "1", - name: "TemporalRelationshipIntervalAnchor", - }, - "(3010,0050)": { - tag: "(3010,0050)", - vr: "FD", - vm: "1", - name: "MinimumNumberOfIntervalDays", - }, - "(3010,0051)": { - tag: "(3010,0051)", - vr: "FD", - vm: "1", - name: "MaximumNumberOfIntervalDays", - }, - "(3010,0052)": { - tag: "(3010,0052)", - vr: "UI", - vm: "1-n", - name: "PertinentSOPClassesInStudy", - }, - "(3010,0053)": { - tag: "(3010,0053)", - vr: "UI", - vm: "1-n", - name: "PertinentSOPClassesInSeries", - }, - "(3010,0054)": { - tag: "(3010,0054)", - vr: "LO", - vm: "1", - name: "RTPrescriptionLabel", - }, - "(3010,0055)": { - tag: "(3010,0055)", - vr: "SQ", - vm: "1", - name: "RTPhysicianIntentPredecessorSequence", - }, - "(3010,0056)": { - tag: "(3010,0056)", - vr: "LO", - vm: "1", - name: "RTTreatmentApproachLabel", - }, - "(3010,0057)": { - tag: "(3010,0057)", - vr: "SQ", - vm: "1", - name: "RTPhysicianIntentSequence", - }, - "(3010,0058)": { - tag: "(3010,0058)", - vr: "US", - vm: "1", - name: "RTPhysicianIntentIndex", - }, - "(3010,0059)": { - tag: "(3010,0059)", - vr: "CS", - vm: "1", - name: "RTTreatmentIntentType", - }, - "(3010,005A)": { - tag: "(3010,005A)", - vr: "UT", - vm: "1", - name: "RTPhysicianIntentNarrative", - }, - "(3010,005B)": { - tag: "(3010,005B)", - vr: "SQ", - vm: "1", - name: "RTProtocolCodeSequence", - }, - "(3010,005C)": { - tag: "(3010,005C)", - vr: "ST", - vm: "1", - name: "ReasonForSuperseding", - }, - "(3010,005D)": { - tag: "(3010,005D)", - vr: "SQ", - vm: "1", - name: "RTDiagnosisCodeSequence", - }, - "(3010,005E)": { - tag: "(3010,005E)", - vr: "US", - vm: "1", - name: "ReferencedRTPhysicianIntentIndex", - }, - "(3010,005F)": { - tag: "(3010,005F)", - vr: "SQ", - vm: "1", - name: "RTPhysicianIntentInputInstanceSequence", - }, - "(3010,0060)": { - tag: "(3010,0060)", - vr: "SQ", - vm: "1", - name: "RTAnatomicPrescriptionSequence", - }, - "(3010,0061)": { - tag: "(3010,0061)", - vr: "UT", - vm: "1", - name: "PriorTreatmentDoseDescription", - }, - "(3010,0062)": { - tag: "(3010,0062)", - vr: "SQ", - vm: "1", - name: "PriorTreatmentReferenceSequence", - }, - "(3010,0063)": { - tag: "(3010,0063)", - vr: "CS", - vm: "1", - name: "DosimetricObjectiveEvaluationScope", - }, - "(3010,0064)": { - tag: "(3010,0064)", - vr: "SQ", - vm: "1", - name: "TherapeuticRoleCategoryCodeSequence", - }, - "(3010,0065)": { - tag: "(3010,0065)", - vr: "SQ", - vm: "1", - name: "TherapeuticRoleTypeCodeSequence", - }, - "(3010,0066)": { - tag: "(3010,0066)", - vr: "US", - vm: "1", - name: "ConceptualVolumeOptimizationPrecedence", - }, - "(3010,0067)": { - tag: "(3010,0067)", - vr: "SQ", - vm: "1", - name: "ConceptualVolumeCategoryCodeSequence", - }, - "(3010,0068)": { - tag: "(3010,0068)", - vr: "CS", - vm: "1", - name: "ConceptualVolumeBlockingConstraint", - }, - "(3010,0069)": { - tag: "(3010,0069)", - vr: "SQ", - vm: "1", - name: "ConceptualVolumeTypeCodeSequence", - }, - "(3010,006A)": { - tag: "(3010,006A)", - vr: "SQ", - vm: "1", - name: "ConceptualVolumeTypeModifierCodeSequence", - }, - "(3010,006B)": { - tag: "(3010,006B)", - vr: "SQ", - vm: "1", - name: "RTPrescriptionSequence", - }, - "(3010,006C)": { - tag: "(3010,006C)", - vr: "SQ", - vm: "1", - name: "DosimetricObjectiveSequence", - }, - "(3010,006D)": { - tag: "(3010,006D)", - vr: "SQ", - vm: "1", - name: "DosimetricObjectiveTypeCodeSequence", - }, - "(3010,006E)": { - tag: "(3010,006E)", - vr: "UI", - vm: "1", - name: "DosimetricObjectiveUID", - }, - "(3010,006F)": { - tag: "(3010,006F)", - vr: "UI", - vm: "1", - name: "ReferencedDosimetricObjectiveUID", - }, - "(3010,0070)": { - tag: "(3010,0070)", - vr: "SQ", - vm: "1", - name: "DosimetricObjectiveParameterSequence", - }, - "(3010,0071)": { - tag: "(3010,0071)", - vr: "SQ", - vm: "1", - name: "ReferencedDosimetricObjectivesSequence", - }, - "(3010,0073)": { - tag: "(3010,0073)", - vr: "CS", - vm: "1", - name: "AbsoluteDosimetricObjectiveFlag", - }, - "(3010,0074)": { - tag: "(3010,0074)", - vr: "FD", - vm: "1", - name: "DosimetricObjectiveWeight", - }, - "(3010,0075)": { - tag: "(3010,0075)", - vr: "CS", - vm: "1", - name: "DosimetricObjectivePurpose", - }, - "(3010,0076)": { - tag: "(3010,0076)", - vr: "SQ", - vm: "1", - name: "PlanningInputInformationSequence", - }, - "(3010,0077)": { - tag: "(3010,0077)", - vr: "LO", - vm: "1", - name: "TreatmentSite", - }, - "(3010,0078)": { - tag: "(3010,0078)", - vr: "SQ", - vm: "1", - name: "TreatmentSiteCodeSequence", - }, - "(3010,0079)": { - tag: "(3010,0079)", - vr: "SQ", - vm: "1", - name: "FractionPatternSequence", - }, - "(3010,007A)": { - tag: "(3010,007A)", - vr: "UT", - vm: "1", - name: "TreatmentTechniqueNotes", - }, - "(3010,007B)": { - tag: "(3010,007B)", - vr: "UT", - vm: "1", - name: "PrescriptionNotes", - }, - "(3010,007C)": { - tag: "(3010,007C)", - vr: "IS", - vm: "1", - name: "NumberOfIntervalFractions", - }, - "(3010,007D)": { - tag: "(3010,007D)", - vr: "US", - vm: "1", - name: "NumberOfFractions", - }, - "(3010,007E)": { - tag: "(3010,007E)", - vr: "US", - vm: "1", - name: "IntendedDeliveryDuration", - }, - "(3010,007F)": { - tag: "(3010,007F)", - vr: "UT", - vm: "1", - name: "FractionationNotes", - }, - "(3010,0080)": { - tag: "(3010,0080)", - vr: "SQ", - vm: "1", - name: "RTTreatmentTechniqueCodeSequence", - }, - "(3010,0081)": { - tag: "(3010,0081)", - vr: "SQ", - vm: "1", - name: "PrescriptionNotesSequence", - }, - "(3010,0082)": { - tag: "(3010,0082)", - vr: "SQ", - vm: "1", - name: "FractionBasedRelationshipSequence", - }, - "(3010,0083)": { - tag: "(3010,0083)", - vr: "CS", - vm: "1", - name: "FractionBasedRelationshipIntervalAnchor", - }, - "(3010,0084)": { - tag: "(3010,0084)", - vr: "FD", - vm: "1", - name: "MinimumHoursBetweenFractions", - }, - "(3010,0085)": { - tag: "(3010,0085)", - vr: "TM", - vm: "1-n", - name: "IntendedFractionStartTime", - }, - "(3010,0086)": { - tag: "(3010,0086)", - vr: "LT", - vm: "1", - name: "IntendedStartDayOfWeek", - }, - "(3010,0087)": { - tag: "(3010,0087)", - vr: "SQ", - vm: "1", - name: "WeekdayFractionPatternSequence", - }, - "(3010,0088)": { - tag: "(3010,0088)", - vr: "SQ", - vm: "1", - name: "DeliveryTimeStructureCodeSequence", - }, - "(3010,0089)": { - tag: "(3010,0089)", - vr: "SQ", - vm: "1", - name: "TreatmentSiteModifierCodeSequence", - }, - "(3010,0090)": { - tag: "(3010,0090)", - vr: "CS", - vm: "1", - name: "RoboticBaseLocationIndicator", - }, - "(3010,0091)": { - tag: "(3010,0091)", - vr: "SQ", - vm: "1", - name: "RoboticPathNodeSetCodeSequence", - }, - "(3010,0092)": { - tag: "(3010,0092)", - vr: "UL", - vm: "1", - name: "RoboticNodeIdentifier", - }, - "(3010,0093)": { - tag: "(3010,0093)", - vr: "FD", - vm: "3", - name: "RTTreatmentSourceCoordinates", - }, - "(3010,0094)": { - tag: "(3010,0094)", - vr: "FD", - vm: "1", - name: "RadiationSourceCoordinateSystemYawAngle", - }, - "(3010,0095)": { - tag: "(3010,0095)", - vr: "FD", - vm: "1", - name: "RadiationSourceCoordinateSystemRollAngle", - }, - "(3010,0096)": { - tag: "(3010,0096)", - vr: "FD", - vm: "1", - name: "RadiationSourceCoordinateSystemPitchAngle", - }, - "(3010,0097)": { - tag: "(3010,0097)", - vr: "SQ", - vm: "1", - name: "RoboticPathControlPointSequence", - }, - "(3010,0098)": { - tag: "(3010,0098)", - vr: "SQ", - vm: "1", - name: "TomotherapeuticControlPointSequence", - }, - "(3010,0099)": { - tag: "(3010,0099)", - vr: "FD", - vm: "1-n", - name: "TomotherapeuticLeafOpenDurations", - }, - "(3010,009A)": { - tag: "(3010,009A)", - vr: "FD", - vm: "1-n", - name: "TomotherapeuticLeafInitialClosedDurations", - }, - "(4000,0010)": { tag: "(4000,0010)", vr: "LT", vm: "1", name: "Arbitrary" }, - "(4000,4000)": { - tag: "(4000,4000)", - vr: "LT", - vm: "1", - name: "TextComments", - }, - "(4008,0040)": { tag: "(4008,0040)", vr: "SH", vm: "1", name: "ResultsID" }, - "(4008,0042)": { - tag: "(4008,0042)", - vr: "LO", - vm: "1", - name: "ResultsIDIssuer", - }, - "(4008,0050)": { - tag: "(4008,0050)", - vr: "SQ", - vm: "1", - name: "ReferencedInterpretationSequence", - }, - "(4008,00FF)": { - tag: "(4008,00FF)", - vr: "CS", - vm: "1", - name: "ReportProductionStatusTrial", - }, - "(4008,0100)": { - tag: "(4008,0100)", - vr: "DA", - vm: "1", - name: "InterpretationRecordedDate", - }, - "(4008,0101)": { - tag: "(4008,0101)", - vr: "TM", - vm: "1", - name: "InterpretationRecordedTime", - }, - "(4008,0102)": { - tag: "(4008,0102)", - vr: "PN", - vm: "1", - name: "InterpretationRecorder", - }, - "(4008,0103)": { - tag: "(4008,0103)", - vr: "LO", - vm: "1", - name: "ReferenceToRecordedSound", - }, - "(4008,0108)": { - tag: "(4008,0108)", - vr: "DA", - vm: "1", - name: "InterpretationTranscriptionDate", - }, - "(4008,0109)": { - tag: "(4008,0109)", - vr: "TM", - vm: "1", - name: "InterpretationTranscriptionTime", - }, - "(4008,010A)": { - tag: "(4008,010A)", - vr: "PN", - vm: "1", - name: "InterpretationTranscriber", - }, - "(4008,010B)": { - tag: "(4008,010B)", - vr: "ST", - vm: "1", - name: "InterpretationText", - }, - "(4008,010C)": { - tag: "(4008,010C)", - vr: "PN", - vm: "1", - name: "InterpretationAuthor", - }, - "(4008,0111)": { - tag: "(4008,0111)", - vr: "SQ", - vm: "1", - name: "InterpretationApproverSequence", - }, - "(4008,0112)": { - tag: "(4008,0112)", - vr: "DA", - vm: "1", - name: "InterpretationApprovalDate", - }, - "(4008,0113)": { - tag: "(4008,0113)", - vr: "TM", - vm: "1", - name: "InterpretationApprovalTime", - }, - "(4008,0114)": { - tag: "(4008,0114)", - vr: "PN", - vm: "1", - name: "PhysicianApprovingInterpretation", - }, - "(4008,0115)": { - tag: "(4008,0115)", - vr: "LT", - vm: "1", - name: "InterpretationDiagnosisDescription", - }, - "(4008,0117)": { - tag: "(4008,0117)", - vr: "SQ", - vm: "1", - name: "InterpretationDiagnosisCodeSequence", - }, - "(4008,0118)": { - tag: "(4008,0118)", - vr: "SQ", - vm: "1", - name: "ResultsDistributionListSequence", - }, - "(4008,0119)": { - tag: "(4008,0119)", - vr: "PN", - vm: "1", - name: "DistributionName", - }, - "(4008,011A)": { - tag: "(4008,011A)", - vr: "LO", - vm: "1", - name: "DistributionAddress", - }, - "(4008,0200)": { - tag: "(4008,0200)", - vr: "SH", - vm: "1", - name: "InterpretationID", - }, - "(4008,0202)": { - tag: "(4008,0202)", - vr: "LO", - vm: "1", - name: "InterpretationIDIssuer", - }, - "(4008,0210)": { - tag: "(4008,0210)", - vr: "CS", - vm: "1", - name: "InterpretationTypeID", - }, - "(4008,0212)": { - tag: "(4008,0212)", - vr: "CS", - vm: "1", - name: "InterpretationStatusID", - }, - "(4008,0300)": { tag: "(4008,0300)", vr: "ST", vm: "1", name: "Impressions" }, - "(4008,4000)": { - tag: "(4008,4000)", - vr: "ST", - vm: "1", - name: "ResultsComments", - }, - "(4010,0001)": { - tag: "(4010,0001)", - vr: "CS", - vm: "1", - name: "LowEnergyDetectors", - }, - "(4010,0002)": { - tag: "(4010,0002)", - vr: "CS", - vm: "1", - name: "HighEnergyDetectors", - }, - "(4010,0004)": { - tag: "(4010,0004)", - vr: "SQ", - vm: "1", - name: "DetectorGeometrySequence", - }, - "(4010,1001)": { - tag: "(4010,1001)", - vr: "SQ", - vm: "1", - name: "ThreatROIVoxelSequence", - }, - "(4010,1004)": { - tag: "(4010,1004)", - vr: "FL", - vm: "3", - name: "ThreatROIBase", - }, - "(4010,1005)": { - tag: "(4010,1005)", - vr: "FL", - vm: "3", - name: "ThreatROIExtents", - }, - "(4010,1006)": { - tag: "(4010,1006)", - vr: "OB", - vm: "1", - name: "ThreatROIBitmap", - }, - "(4010,1007)": { - tag: "(4010,1007)", - vr: "SH", - vm: "1", - name: "RouteSegmentID", - }, - "(4010,1008)": { tag: "(4010,1008)", vr: "CS", vm: "1", name: "GantryType" }, - "(4010,1009)": { - tag: "(4010,1009)", - vr: "CS", - vm: "1", - name: "OOIOwnerType", - }, - "(4010,100A)": { - tag: "(4010,100A)", - vr: "SQ", - vm: "1", - name: "RouteSegmentSequence", - }, - "(4010,1010)": { - tag: "(4010,1010)", - vr: "US", - vm: "1", - name: "PotentialThreatObjectID", - }, - "(4010,1011)": { - tag: "(4010,1011)", - vr: "SQ", - vm: "1", - name: "ThreatSequence", - }, - "(4010,1012)": { - tag: "(4010,1012)", - vr: "CS", - vm: "1", - name: "ThreatCategory", - }, - "(4010,1013)": { - tag: "(4010,1013)", - vr: "LT", - vm: "1", - name: "ThreatCategoryDescription", - }, - "(4010,1014)": { - tag: "(4010,1014)", - vr: "CS", - vm: "1", - name: "ATDAbilityAssessment", - }, - "(4010,1015)": { - tag: "(4010,1015)", - vr: "CS", - vm: "1", - name: "ATDAssessmentFlag", - }, - "(4010,1016)": { - tag: "(4010,1016)", - vr: "FL", - vm: "1", - name: "ATDAssessmentProbability", - }, - "(4010,1017)": { tag: "(4010,1017)", vr: "FL", vm: "1", name: "Mass" }, - "(4010,1018)": { tag: "(4010,1018)", vr: "FL", vm: "1", name: "Density" }, - "(4010,1019)": { tag: "(4010,1019)", vr: "FL", vm: "1", name: "ZEffective" }, - "(4010,101A)": { - tag: "(4010,101A)", - vr: "SH", - vm: "1", - name: "BoardingPassID", - }, - "(4010,101B)": { - tag: "(4010,101B)", - vr: "FL", - vm: "3", - name: "CenterOfMass", - }, - "(4010,101C)": { tag: "(4010,101C)", vr: "FL", vm: "3", name: "CenterOfPTO" }, - "(4010,101D)": { - tag: "(4010,101D)", - vr: "FL", - vm: "6-n", - name: "BoundingPolygon", - }, - "(4010,101E)": { - tag: "(4010,101E)", - vr: "SH", - vm: "1", - name: "RouteSegmentStartLocationID", - }, - "(4010,101F)": { - tag: "(4010,101F)", - vr: "SH", - vm: "1", - name: "RouteSegmentEndLocationID", - }, - "(4010,1020)": { - tag: "(4010,1020)", - vr: "CS", - vm: "1", - name: "RouteSegmentLocationIDType", - }, - "(4010,1021)": { - tag: "(4010,1021)", - vr: "CS", - vm: "1-n", - name: "AbortReason", - }, - "(4010,1023)": { tag: "(4010,1023)", vr: "FL", vm: "1", name: "VolumeOfPTO" }, - "(4010,1024)": { tag: "(4010,1024)", vr: "CS", vm: "1", name: "AbortFlag" }, - "(4010,1025)": { - tag: "(4010,1025)", - vr: "DT", - vm: "1", - name: "RouteSegmentStartTime", - }, - "(4010,1026)": { - tag: "(4010,1026)", - vr: "DT", - vm: "1", - name: "RouteSegmentEndTime", - }, - "(4010,1027)": { tag: "(4010,1027)", vr: "CS", vm: "1", name: "TDRType" }, - "(4010,1028)": { - tag: "(4010,1028)", - vr: "CS", - vm: "1", - name: "InternationalRouteSegment", - }, - "(4010,1029)": { - tag: "(4010,1029)", - vr: "LO", - vm: "1-n", - name: "ThreatDetectionAlgorithmAndVersion", - }, - "(4010,102A)": { - tag: "(4010,102A)", - vr: "SH", - vm: "1", - name: "AssignedLocation", - }, - "(4010,102B)": { - tag: "(4010,102B)", - vr: "DT", - vm: "1", - name: "AlarmDecisionTime", - }, - "(4010,1031)": { - tag: "(4010,1031)", - vr: "CS", - vm: "1", - name: "AlarmDecision", - }, - "(4010,1033)": { - tag: "(4010,1033)", - vr: "US", - vm: "1", - name: "NumberOfTotalObjects", - }, - "(4010,1034)": { - tag: "(4010,1034)", - vr: "US", - vm: "1", - name: "NumberOfAlarmObjects", - }, - "(4010,1037)": { - tag: "(4010,1037)", - vr: "SQ", - vm: "1", - name: "PTORepresentationSequence", - }, - "(4010,1038)": { - tag: "(4010,1038)", - vr: "SQ", - vm: "1", - name: "ATDAssessmentSequence", - }, - "(4010,1039)": { tag: "(4010,1039)", vr: "CS", vm: "1", name: "TIPType" }, - "(4010,103A)": { - tag: "(4010,103A)", - vr: "CS", - vm: "1", - name: "DICOSVersion", - }, - "(4010,1041)": { - tag: "(4010,1041)", - vr: "DT", - vm: "1", - name: "OOIOwnerCreationTime", - }, - "(4010,1042)": { tag: "(4010,1042)", vr: "CS", vm: "1", name: "OOIType" }, - "(4010,1043)": { tag: "(4010,1043)", vr: "FL", vm: "3", name: "OOISize" }, - "(4010,1044)": { - tag: "(4010,1044)", - vr: "CS", - vm: "1", - name: "AcquisitionStatus", - }, - "(4010,1045)": { - tag: "(4010,1045)", - vr: "SQ", - vm: "1", - name: "BasisMaterialsCodeSequence", - }, - "(4010,1046)": { tag: "(4010,1046)", vr: "CS", vm: "1", name: "PhantomType" }, - "(4010,1047)": { - tag: "(4010,1047)", - vr: "SQ", - vm: "1", - name: "OOIOwnerSequence", - }, - "(4010,1048)": { tag: "(4010,1048)", vr: "CS", vm: "1", name: "ScanType" }, - "(4010,1051)": { tag: "(4010,1051)", vr: "LO", vm: "1", name: "ItineraryID" }, - "(4010,1052)": { - tag: "(4010,1052)", - vr: "SH", - vm: "1", - name: "ItineraryIDType", - }, - "(4010,1053)": { - tag: "(4010,1053)", - vr: "LO", - vm: "1", - name: "ItineraryIDAssigningAuthority", - }, - "(4010,1054)": { tag: "(4010,1054)", vr: "SH", vm: "1", name: "RouteID" }, - "(4010,1055)": { - tag: "(4010,1055)", - vr: "SH", - vm: "1", - name: "RouteIDAssigningAuthority", - }, - "(4010,1056)": { - tag: "(4010,1056)", - vr: "CS", - vm: "1", - name: "InboundArrivalType", - }, - "(4010,1058)": { tag: "(4010,1058)", vr: "SH", vm: "1", name: "CarrierID" }, - "(4010,1059)": { - tag: "(4010,1059)", - vr: "CS", - vm: "1", - name: "CarrierIDAssigningAuthority", - }, - "(4010,1060)": { - tag: "(4010,1060)", - vr: "FL", - vm: "3", - name: "SourceOrientation", - }, - "(4010,1061)": { - tag: "(4010,1061)", - vr: "FL", - vm: "3", - name: "SourcePosition", - }, - "(4010,1062)": { tag: "(4010,1062)", vr: "FL", vm: "1", name: "BeltHeight" }, - "(4010,1064)": { - tag: "(4010,1064)", - vr: "SQ", - vm: "1", - name: "AlgorithmRoutingCodeSequence", - }, - "(4010,1067)": { - tag: "(4010,1067)", - vr: "CS", - vm: "1", - name: "TransportClassification", - }, - "(4010,1068)": { - tag: "(4010,1068)", - vr: "LT", - vm: "1", - name: "OOITypeDescriptor", - }, - "(4010,1069)": { - tag: "(4010,1069)", - vr: "FL", - vm: "1", - name: "TotalProcessingTime", - }, - "(4010,106C)": { - tag: "(4010,106C)", - vr: "OB", - vm: "1", - name: "DetectorCalibrationData", - }, - "(4010,106D)": { - tag: "(4010,106D)", - vr: "CS", - vm: "1", - name: "AdditionalScreeningPerformed", - }, - "(4010,106E)": { - tag: "(4010,106E)", - vr: "CS", - vm: "1", - name: "AdditionalInspectionSelectionCriteria", - }, - "(4010,106F)": { - tag: "(4010,106F)", - vr: "SQ", - vm: "1", - name: "AdditionalInspectionMethodSequence", - }, - "(4010,1070)": { - tag: "(4010,1070)", - vr: "CS", - vm: "1", - name: "AITDeviceType", - }, - "(4010,1071)": { - tag: "(4010,1071)", - vr: "SQ", - vm: "1", - name: "QRMeasurementsSequence", - }, - "(4010,1072)": { - tag: "(4010,1072)", - vr: "SQ", - vm: "1", - name: "TargetMaterialSequence", - }, - "(4010,1073)": { - tag: "(4010,1073)", - vr: "FD", - vm: "1", - name: "SNRThreshold", - }, - "(4010,1075)": { - tag: "(4010,1075)", - vr: "DS", - vm: "1", - name: "ImageScaleRepresentation", - }, - "(4010,1076)": { - tag: "(4010,1076)", - vr: "SQ", - vm: "1", - name: "ReferencedPTOSequence", - }, - "(4010,1077)": { - tag: "(4010,1077)", - vr: "SQ", - vm: "1", - name: "ReferencedTDRInstanceSequence", - }, - "(4010,1078)": { - tag: "(4010,1078)", - vr: "ST", - vm: "1", - name: "PTOLocationDescription", - }, - "(4010,1079)": { - tag: "(4010,1079)", - vr: "SQ", - vm: "1", - name: "AnomalyLocatorIndicatorSequence", - }, - "(4010,107A)": { - tag: "(4010,107A)", - vr: "FL", - vm: "3", - name: "AnomalyLocatorIndicator", - }, - "(4010,107B)": { - tag: "(4010,107B)", - vr: "SQ", - vm: "1", - name: "PTORegionSequence", - }, - "(4010,107C)": { - tag: "(4010,107C)", - vr: "CS", - vm: "1", - name: "InspectionSelectionCriteria", - }, - "(4010,107D)": { - tag: "(4010,107D)", - vr: "SQ", - vm: "1", - name: "SecondaryInspectionMethodSequence", - }, - "(4010,107E)": { - tag: "(4010,107E)", - vr: "DS", - vm: "6", - name: "PRCSToRCSOrientation", - }, - "(4FFE,0001)": { - tag: "(4FFE,0001)", - vr: "SQ", - vm: "1", - name: "MACParametersSequence", - }, - "(50xx,0005)": { - tag: "(50xx,0005)", - vr: "US", - vm: "1", - name: "CurveDimensions", - }, - "(50xx,0010)": { - tag: "(50xx,0010)", - vr: "US", - vm: "1", - name: "NumberOfPoints", - }, - "(50xx,0020)": { tag: "(50xx,0020)", vr: "CS", vm: "1", name: "TypeOfData" }, - "(50xx,0022)": { - tag: "(50xx,0022)", - vr: "LO", - vm: "1", - name: "CurveDescription", - }, - "(50xx,0030)": { tag: "(50xx,0030)", vr: "SH", vm: "1-n", name: "AxisUnits" }, - "(50xx,0040)": { - tag: "(50xx,0040)", - vr: "SH", - vm: "1-n", - name: "AxisLabels", - }, - "(50xx,0103)": { - tag: "(50xx,0103)", - vr: "US", - vm: "1", - name: "DataValueRepresentation", - }, - "(50xx,0104)": { - tag: "(50xx,0104)", - vr: "US", - vm: "1-n", - name: "MinimumCoordinateValue", - }, - "(50xx,0105)": { - tag: "(50xx,0105)", - vr: "US", - vm: "1-n", - name: "MaximumCoordinateValue", - }, - "(50xx,0106)": { - tag: "(50xx,0106)", - vr: "SH", - vm: "1-n", - name: "CurveRange", - }, - "(50xx,0110)": { - tag: "(50xx,0110)", - vr: "US", - vm: "1-n", - name: "CurveDataDescriptor", - }, - "(50xx,0112)": { - tag: "(50xx,0112)", - vr: "US", - vm: "1-n", - name: "CoordinateStartValue", - }, - "(50xx,0114)": { - tag: "(50xx,0114)", - vr: "US", - vm: "1-n", - name: "CoordinateStepValue", - }, - "(50xx,1001)": { - tag: "(50xx,1001)", - vr: "CS", - vm: "1", - name: "CurveActivationLayer", - }, - "(50xx,2000)": { tag: "(50xx,2000)", vr: "US", vm: "1", name: "AudioType" }, - "(50xx,2002)": { - tag: "(50xx,2002)", - vr: "US", - vm: "1", - name: "AudioSampleFormat", - }, - "(50xx,2004)": { - tag: "(50xx,2004)", - vr: "US", - vm: "1", - name: "NumberOfChannels", - }, - "(50xx,2006)": { - tag: "(50xx,2006)", - vr: "UL", - vm: "1", - name: "NumberOfSamples", - }, - "(50xx,2008)": { tag: "(50xx,2008)", vr: "UL", vm: "1", name: "SampleRate" }, - "(50xx,200A)": { tag: "(50xx,200A)", vr: "UL", vm: "1", name: "TotalTime" }, - "(50xx,200C)": { - tag: "(50xx,200C)", - vr: "OB|OW", - vm: "1", - name: "AudioSampleData", - }, - "(50xx,200E)": { - tag: "(50xx,200E)", - vr: "LT", - vm: "1", - name: "AudioComments", - }, - "(50xx,2500)": { tag: "(50xx,2500)", vr: "LO", vm: "1", name: "CurveLabel" }, - "(50xx,2600)": { - tag: "(50xx,2600)", - vr: "SQ", - vm: "1", - name: "CurveReferencedOverlaySequence", - }, - "(50xx,2610)": { - tag: "(50xx,2610)", - vr: "US", - vm: "1", - name: "CurveReferencedOverlayGroup", - }, - "(50xx,3000)": { - tag: "(50xx,3000)", - vr: "OB|OW", - vm: "1", - name: "CurveData", - }, - "(5200,9229)": { - tag: "(5200,9229)", - vr: "SQ", - vm: "1", - name: "SharedFunctionalGroupsSequence", - }, - "(5200,9230)": { - tag: "(5200,9230)", - vr: "SQ", - vm: "1", - name: "PerFrameFunctionalGroupsSequence", - }, - "(5400,0100)": { - tag: "(5400,0100)", - vr: "SQ", - vm: "1", - name: "WaveformSequence", - }, - "(5400,0110)": { - tag: "(5400,0110)", - vr: "OB|OW", - vm: "1", - name: "ChannelMinimumValue", - }, - "(5400,0112)": { - tag: "(5400,0112)", - vr: "OB|OW", - vm: "1", - name: "ChannelMaximumValue", - }, - "(5400,1004)": { - tag: "(5400,1004)", - vr: "US", - vm: "1", - name: "WaveformBitsAllocated", - }, - "(5400,1006)": { - tag: "(5400,1006)", - vr: "CS", - vm: "1", - name: "WaveformSampleInterpretation", - }, - "(5400,100A)": { - tag: "(5400,100A)", - vr: "OB|OW", - vm: "1", - name: "WaveformPaddingValue", - }, - "(5400,1010)": { - tag: "(5400,1010)", - vr: "OB|OW", - vm: "1", - name: "WaveformData", - }, - "(5600,0010)": { - tag: "(5600,0010)", - vr: "OF", - vm: "1", - name: "FirstOrderPhaseCorrectionAngle", - }, - "(5600,0020)": { - tag: "(5600,0020)", - vr: "OF", - vm: "1", - name: "SpectroscopyData", - }, - "(60xx,0010)": { tag: "(60xx,0010)", vr: "US", vm: "1", name: "OverlayRows" }, - "(60xx,0011)": { - tag: "(60xx,0011)", - vr: "US", - vm: "1", - name: "OverlayColumns", - }, - "(60xx,0012)": { - tag: "(60xx,0012)", - vr: "US", - vm: "1", - name: "OverlayPlanes", - }, - "(60xx,0015)": { - tag: "(60xx,0015)", - vr: "IS", - vm: "1", - name: "NumberOfFramesInOverlay", - }, - "(60xx,0022)": { - tag: "(60xx,0022)", - vr: "LO", - vm: "1", - name: "OverlayDescription", - }, - "(60xx,0040)": { tag: "(60xx,0040)", vr: "CS", vm: "1", name: "OverlayType" }, - "(60xx,0045)": { - tag: "(60xx,0045)", - vr: "LO", - vm: "1", - name: "OverlaySubtype", - }, - "(60xx,0050)": { - tag: "(60xx,0050)", - vr: "SS", - vm: "2", - name: "OverlayOrigin", - }, - "(60xx,0051)": { - tag: "(60xx,0051)", - vr: "US", - vm: "1", - name: "ImageFrameOrigin", - }, - "(60xx,0052)": { - tag: "(60xx,0052)", - vr: "US", - vm: "1", - name: "OverlayPlaneOrigin", - }, - "(60xx,0060)": { - tag: "(60xx,0060)", - vr: "CS", - vm: "1", - name: "OverlayCompressionCode", - }, - "(60xx,0061)": { - tag: "(60xx,0061)", - vr: "SH", - vm: "1", - name: "OverlayCompressionOriginator", - }, - "(60xx,0062)": { - tag: "(60xx,0062)", - vr: "SH", - vm: "1", - name: "OverlayCompressionLabel", - }, - "(60xx,0063)": { - tag: "(60xx,0063)", - vr: "CS", - vm: "1", - name: "OverlayCompressionDescription", - }, - "(60xx,0066)": { - tag: "(60xx,0066)", - vr: "AT", - vm: "1-n", - name: "OverlayCompressionStepPointers", - }, - "(60xx,0068)": { - tag: "(60xx,0068)", - vr: "US", - vm: "1", - name: "OverlayRepeatInterval", - }, - "(60xx,0069)": { - tag: "(60xx,0069)", - vr: "US", - vm: "1", - name: "OverlayBitsGrouped", - }, - "(60xx,0100)": { - tag: "(60xx,0100)", - vr: "US", - vm: "1", - name: "OverlayBitsAllocated", - }, - "(60xx,0102)": { - tag: "(60xx,0102)", - vr: "US", - vm: "1", - name: "OverlayBitPosition", - }, - "(60xx,0110)": { - tag: "(60xx,0110)", - vr: "CS", - vm: "1", - name: "OverlayFormat", - }, - "(60xx,0200)": { - tag: "(60xx,0200)", - vr: "US", - vm: "1", - name: "OverlayLocation", - }, - "(60xx,0800)": { - tag: "(60xx,0800)", - vr: "CS", - vm: "1-n", - name: "OverlayCodeLabel", - }, - "(60xx,0802)": { - tag: "(60xx,0802)", - vr: "US", - vm: "1", - name: "OverlayNumberOfTables", - }, - "(60xx,0803)": { - tag: "(60xx,0803)", - vr: "AT", - vm: "1-n", - name: "OverlayCodeTableLocation", - }, - "(60xx,0804)": { - tag: "(60xx,0804)", - vr: "US", - vm: "1", - name: "OverlayBitsForCodeWord", - }, - "(60xx,1001)": { - tag: "(60xx,1001)", - vr: "CS", - vm: "1", - name: "OverlayActivationLayer", - }, - "(60xx,1100)": { - tag: "(60xx,1100)", - vr: "US", - vm: "1", - name: "OverlayDescriptorGray", - }, - "(60xx,1101)": { - tag: "(60xx,1101)", - vr: "US", - vm: "1", - name: "OverlayDescriptorRed", - }, - "(60xx,1102)": { - tag: "(60xx,1102)", - vr: "US", - vm: "1", - name: "OverlayDescriptorGreen", - }, - "(60xx,1103)": { - tag: "(60xx,1103)", - vr: "US", - vm: "1", - name: "OverlayDescriptorBlue", - }, - "(60xx,1200)": { - tag: "(60xx,1200)", - vr: "US", - vm: "1-n", - name: "OverlaysGray", - }, - "(60xx,1201)": { - tag: "(60xx,1201)", - vr: "US", - vm: "1-n", - name: "OverlaysRed", - }, - "(60xx,1202)": { - tag: "(60xx,1202)", - vr: "US", - vm: "1-n", - name: "OverlaysGreen", - }, - "(60xx,1203)": { - tag: "(60xx,1203)", - vr: "US", - vm: "1-n", - name: "OverlaysBlue", - }, - "(60xx,1301)": { tag: "(60xx,1301)", vr: "IS", vm: "1", name: "ROIArea" }, - "(60xx,1302)": { tag: "(60xx,1302)", vr: "DS", vm: "1", name: "ROIMean" }, - "(60xx,1303)": { - tag: "(60xx,1303)", - vr: "DS", - vm: "1", - name: "ROIStandardDeviation", - }, - "(60xx,1500)": { - tag: "(60xx,1500)", - vr: "LO", - vm: "1", - name: "OverlayLabel", - }, - "(60xx,3000)": { - tag: "(60xx,3000)", - vr: "OB|OW", - vm: "1", - name: "OverlayData", - }, - "(60xx,4000)": { - tag: "(60xx,4000)", - vr: "LT", - vm: "1", - name: "OverlayComments", - }, - "(7FE0,0001)": { - tag: "(7FE0,0001)", - vr: "OV", - vm: "1", - name: "ExtendedOffsetTable", - }, - "(7FE0,0002)": { - tag: "(7FE0,0002)", - vr: "OV", - vm: "1", - name: "ExtendedOffsetTableLengths", - }, - "(7FE0,0008)": { - tag: "(7FE0,0008)", - vr: "OF", - vm: "1", - name: "FloatPixelData", - }, - "(7FE0,0009)": { - tag: "(7FE0,0009)", - vr: "OD", - vm: "1", - name: "DoubleFloatPixelData", - }, - "(7FE0,0010)": { - tag: "(7FE0,0010)", - vr: "OB|OW", - vm: "1", - name: "PixelData", - }, - "(7FE0,0020)": { - tag: "(7FE0,0020)", - vr: "OW", - vm: "1", - name: "CoefficientsSDVN", - }, - "(7FE0,0030)": { - tag: "(7FE0,0030)", - vr: "OW", - vm: "1", - name: "CoefficientsSDHN", - }, - "(7FE0,0040)": { - tag: "(7FE0,0040)", - vr: "OW", - vm: "1", - name: "CoefficientsSDDN", - }, - "(7Fxx,0010)": { - tag: "(7Fxx,0010)", - vr: "OB|OW", - vm: "1", - name: "VariablePixelData", - }, - "(7Fxx,0011)": { - tag: "(7Fxx,0011)", - vr: "US", - vm: "1", - name: "VariableNextDataGroup", - }, - "(7Fxx,0020)": { - tag: "(7Fxx,0020)", - vr: "OW", - vm: "1", - name: "VariableCoefficientsSDVN", - }, - "(7Fxx,0030)": { - tag: "(7Fxx,0030)", - vr: "OW", - vm: "1", - name: "VariableCoefficientsSDHN", - }, - "(7Fxx,0040)": { - tag: "(7Fxx,0040)", - vr: "OW", - vm: "1", - name: "VariableCoefficientsSDDN", - }, - "(FFFA,FFFA)": { - tag: "(FFFA,FFFA)", - vr: "SQ", - vm: "1", - name: "DigitalSignaturesSequence", - }, - "(FFFC,FFFC)": { - tag: "(FFFC,FFFC)", - vr: "OB", - vm: "1", - name: "DataSetTrailingPadding", - }, - "(FFFE,E000)": { tag: "(FFFE,E000)", vr: "", vm: "1", name: "Item" }, - "(FFFE,E00D)": { - tag: "(FFFE,E00D)", - vr: "", - vm: "1", - name: "ItemDelimitationItem", - }, - "(FFFE,E0DD)": { - tag: "(FFFE,E0DD)", - vr: "", - vm: "1", - name: "SequenceDelimitationItem", - }, -}; - -export const uids = { - "1.2.840.10008.1.1": "Verification SOP Class", - "1.2.840.10008.1.2": - "Implicit VR Little Endian: Default Transfer Syntax for DICOM", - "1.2.840.10008.1.2.1": "Explicit VR Little Endian", - "1.2.840.10008.1.2.1.99": "Deflated Explicit VR Little Endian", - "1.2.840.10008.1.2.2": "Explicit VR Big Endian (Retired)", - "1.2.840.10008.1.2.4.50": - "JPEG Baseline (Process 1): Default Transfer Syntax for Lossy JPEG 8 Bit Image Compression", - "1.2.840.10008.1.2.4.51": - "JPEG Extended (Process 2 & 4): Default Transfer Syntax for Lossy JPEG 12 Bit Image Compression (Process 4 only)", - "1.2.840.10008.1.2.4.52": "JPEG Extended (Process 3 & 5) (Retired)", - "1.2.840.10008.1.2.4.53": - "JPEG Spectral Selection, Non-Hierarchical (Process 6 & 8) (Retired)", - "1.2.840.10008.1.2.4.54": - "JPEG Spectral Selection, Non-Hierarchical (Process 7 & 9) (Retired)", - "1.2.840.10008.1.2.4.55": - "JPEG Full Progression, Non-Hierarchical (Process 10 & 12) (Retired)", - "1.2.840.10008.1.2.4.56": - "JPEG Full Progression, Non-Hierarchical (Process 11 & 13) (Retired)", - "1.2.840.10008.1.2.4.57": "JPEG Lossless, Non-Hierarchical (Process 14)", - "1.2.840.10008.1.2.4.58": - "JPEG Lossless, Non-Hierarchical (Process 15) (Retired)", - "1.2.840.10008.1.2.4.59": - "JPEG Extended, Hierarchical (Process 16 & 18) (Retired)", - "1.2.840.10008.1.2.4.60": - "JPEG Extended, Hierarchical (Process 17 & 19) (Retired)", - "1.2.840.10008.1.2.4.61": - "JPEG Spectral Selection, Hierarchical (Process 20 & 22) (Retired)", - "1.2.840.10008.1.2.4.62": - "JPEG Spectral Selection, Hierarchical (Process 21 & 23) (Retired)", - "1.2.840.10008.1.2.4.63": - "JPEG Full Progression, Hierarchical (Process 24 & 26) (Retired)", - "1.2.840.10008.1.2.4.64": - "JPEG Full Progression, Hierarchical (Process 25 & 27) (Retired)", - "1.2.840.10008.1.2.4.65": - "JPEG Lossless, Hierarchical (Process 28) (Retired)", - "1.2.840.10008.1.2.4.66": - "JPEG Lossless, Hierarchical (Process 29) (Retired)", - "1.2.840.10008.1.2.4.70": - "JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 [Selection Value 1]): Default Transfer Syntax for Lossless JPEG Image Compression", - "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", - "1.2.840.10008.1.2.4.92": - "JPEG 2000 Part 2 Multi-component Image Compression (Lossless Only)", - "1.2.840.10008.1.2.4.93": - "JPEG 2000 Part 2 Multi-component Image Compression", - "1.2.840.10008.1.2.4.94": "JPIP Referenced", - "1.2.840.10008.1.2.4.95": "JPIP Referenced Deflate", - "1.2.840.10008.1.2.4.100": "MPEG2 Main Profile @ Main Level", - "1.2.840.10008.1.2.4.101": "MPEG2 Main Profile @ High Level", - "1.2.840.10008.1.2.4.102": "MPEG-4 AVC/H.264 High Profile / Level 4.1", - "1.2.840.10008.1.2.4.103": - "MPEG-4 AVC/H.264 BD-compatible High Profile / Level 4.1", - "1.2.840.10008.1.2.4.104": - "MPEG-4 AVC/H.264 High Profile / Level 4.2 For 2D Video", - "1.2.840.10008.1.2.4.105": - "MPEG-4 AVC/H.264 High Profile / Level 4.2 For 3D Video", - "1.2.840.10008.1.2.4.106": "MPEG-4 AVC/H.264 Stereo High Profile / Level 4.2", - "1.2.840.10008.1.2.5": "RLE Lossless", - "1.2.840.10008.1.2.6.1": "RFC 2557 MIME encapsulation", - "1.2.840.10008.1.2.6.2": "XML Encoding", - "1.2.840.10008.1.3.10": "Media Storage Directory Storage", - "1.2.840.10008.1.4.1.1": "Talairach Brain Atlas Frame of Reference", - "1.2.840.10008.1.4.1.2": "SPM2 T1 Frame of Reference", - "1.2.840.10008.1.4.1.3": "SPM2 T2 Frame of Reference", - "1.2.840.10008.1.4.1.4": "SPM2 PD Frame of Reference", - "1.2.840.10008.1.4.1.5": "SPM2 EPI Frame of Reference", - "1.2.840.10008.1.4.1.6": "SPM2 FIL T1 Frame of Reference", - "1.2.840.10008.1.4.1.7": "SPM2 PET Frame of Reference", - "1.2.840.10008.1.4.1.8": "SPM2 TRANSM Frame of Reference", - "1.2.840.10008.1.4.1.9": "SPM2 SPECT Frame of Reference", - "1.2.840.10008.1.4.1.10": "SPM2 GRAY Frame of Reference", - "1.2.840.10008.1.4.1.11": "SPM2 WHITE Frame of Reference", - "1.2.840.10008.1.4.1.12": "SPM2 CSF Frame of Reference", - "1.2.840.10008.1.4.1.13": "SPM2 BRAINMASK Frame of Reference", - "1.2.840.10008.1.4.1.14": "SPM2 AVG305T1 Frame of Reference", - "1.2.840.10008.1.4.1.15": "SPM2 AVG152T1 Frame of Reference", - "1.2.840.10008.1.4.1.16": "SPM2 AVG152T2 Frame of Reference", - "1.2.840.10008.1.4.1.17": "SPM2 AVG152PD Frame of Reference", - "1.2.840.10008.1.4.1.18": "SPM2 SINGLESUBJT1 Frame of Reference", - "1.2.840.10008.1.4.2.1": "ICBM 452 T1 Frame of Reference", - "1.2.840.10008.1.4.2.2": "ICBM Single Subject MRI Frame of Reference", - "1.2.840.10008.1.5.1": "Hot Iron Color Palette SOP Instance", - "1.2.840.10008.1.5.2": "PET Color Palette SOP Instance", - "1.2.840.10008.1.5.3": "Hot Metal Blue Color Palette SOP Instance", - "1.2.840.10008.1.5.4": "PET 20 Step Color Palette SOP Instance", - "1.2.840.10008.1.9": "Basic Study Content Notification SOP Class (Retired)", - "1.2.840.10008.1.20.1": "Storage Commitment Push Model SOP Class", - "1.2.840.10008.1.20.1.1": "Storage Commitment Push Model SOP Instance", - "1.2.840.10008.1.20.2": "Storage Commitment Pull Model SOP Class (Retired)", - "1.2.840.10008.1.20.2.1": - "Storage Commitment Pull Model SOP Instance (Retired)", - "1.2.840.10008.1.40": "Procedural Event Logging SOP Class", - "1.2.840.10008.1.40.1": "Procedural Event Logging SOP Instance", - "1.2.840.10008.1.42": "Substance Administration Logging SOP Class", - "1.2.840.10008.1.42.1": "Substance Administration Logging SOP Instance", - "1.2.840.10008.2.6.1": "DICOM UID Registry", - "1.2.840.10008.2.16.4": "DICOM Controlled Terminology", - "1.2.840.10008.3.1.1.1": "DICOM Application Context Name", - "1.2.840.10008.3.1.2.1.1": "Detached Patient Management SOP Class (Retired)", - "1.2.840.10008.3.1.2.1.4": - "Detached Patient Management Meta SOP Class (Retired)", - "1.2.840.10008.3.1.2.2.1": "Detached Visit Management SOP Class (Retired)", - "1.2.840.10008.3.1.2.3.1": "Detached Study Management SOP Class (Retired)", - "1.2.840.10008.3.1.2.3.2": "Study Component Management SOP Class (Retired)", - "1.2.840.10008.3.1.2.3.3": "Modality Performed Procedure Step SOP Class", - "1.2.840.10008.3.1.2.3.4": - "Modality Performed Procedure Step Retrieve SOP Class", - "1.2.840.10008.3.1.2.3.5": - "Modality Performed Procedure Step Notification SOP Class", - "1.2.840.10008.3.1.2.5.1": "Detached Results Management SOP Class (Retired)", - "1.2.840.10008.3.1.2.5.4": - "Detached Results Management Meta SOP Class (Retired)", - "1.2.840.10008.3.1.2.5.5": - "Detached Study Management Meta SOP Class (Retired)", - "1.2.840.10008.3.1.2.6.1": - "Detached Interpretation Management SOP Class (Retired)", - "1.2.840.10008.4.2": "Storage Service Class", - "1.2.840.10008.5.1.1.1": "Basic Film Session SOP Class", - "1.2.840.10008.5.1.1.2": "Basic Film Box SOP Class", - "1.2.840.10008.5.1.1.4": "Basic Grayscale Image Box SOP Class", - "1.2.840.10008.5.1.1.4.1": "Basic Color Image Box SOP Class", - "1.2.840.10008.5.1.1.4.2": "Referenced Image Box SOP Class (Retired)", - "1.2.840.10008.5.1.1.9": "Basic Grayscale Print Management Meta SOP Class", - "1.2.840.10008.5.1.1.9.1": - "Referenced Grayscale Print Management Meta SOP Class (Retired)", - "1.2.840.10008.5.1.1.14": "Print Job SOP Class", - "1.2.840.10008.5.1.1.15": "Basic Annotation Box SOP Class", - "1.2.840.10008.5.1.1.16": "Printer SOP Class", - "1.2.840.10008.5.1.1.16.376": "Printer Configuration Retrieval SOP Class", - "1.2.840.10008.5.1.1.17": "Printer SOP Instance", - "1.2.840.10008.5.1.1.17.376": "Printer Configuration Retrieval SOP Instance", - "1.2.840.10008.5.1.1.18": "Basic Color Print Management Meta SOP Class", - "1.2.840.10008.5.1.1.18.1": - "Referenced Color Print Management Meta SOP Class (Retired)", - "1.2.840.10008.5.1.1.22": "VOI LUT Box SOP Class", - "1.2.840.10008.5.1.1.23": "Presentation LUT SOP Class", - "1.2.840.10008.5.1.1.24": "Image Overlay Box SOP Class (Retired)", - "1.2.840.10008.5.1.1.24.1": - "Basic Print Image Overlay Box SOP Class (Retired)", - "1.2.840.10008.5.1.1.25": "Print Queue SOP Instance (Retired)", - "1.2.840.10008.5.1.1.26": "Print Queue Management SOP Class (Retired)", - "1.2.840.10008.5.1.1.27": "Stored Print Storage SOP Class (Retired)", - "1.2.840.10008.5.1.1.29": - "Hardcopy Grayscale Image Storage SOP Class (Retired)", - "1.2.840.10008.5.1.1.30": "Hardcopy Color Image Storage SOP Class (Retired)", - "1.2.840.10008.5.1.1.31": "Pull Print Request SOP Class (Retired)", - "1.2.840.10008.5.1.1.32": - "Pull Stored Print Management Meta SOP Class (Retired)", - "1.2.840.10008.5.1.1.33": "Media Creation Management SOP Class UID", - "1.2.840.10008.5.1.1.40": "Display System SOP Class", - "1.2.840.10008.5.1.1.40.1": "Display System SOP Instance", - "1.2.840.10008.5.1.4.1.1.1": "Computed Radiography Image Storage", - "1.2.840.10008.5.1.4.1.1.1.1": - "Digital X-Ray Image Storage - For Presentation", - "1.2.840.10008.5.1.4.1.1.1.1.1": - "Digital X-Ray Image Storage - For Processing", - "1.2.840.10008.5.1.4.1.1.1.2": - "Digital Mammography X-Ray Image Storage - For Presentation", - "1.2.840.10008.5.1.4.1.1.1.2.1": - "Digital Mammography X-Ray Image Storage - For Processing", - "1.2.840.10008.5.1.4.1.1.1.3": - "Digital Intra-Oral X-Ray Image Storage - For Presentation", - "1.2.840.10008.5.1.4.1.1.1.3.1": - "Digital Intra-Oral X-Ray Image Storage - For Processing", - "1.2.840.10008.5.1.4.1.1.2": "CT Image Storage", - "1.2.840.10008.5.1.4.1.1.2.1": "Enhanced CT Image Storage", - "1.2.840.10008.5.1.4.1.1.2.2": "Legacy Converted Enhanced CT Image Storage", - "1.2.840.10008.5.1.4.1.1.3": "Ultrasound Multi-frame Image Storage (Retired)", - "1.2.840.10008.5.1.4.1.1.3.1": "Ultrasound Multi-frame Image Storage", - "1.2.840.10008.5.1.4.1.1.4": "MR Image Storage", - "1.2.840.10008.5.1.4.1.1.4.1": "Enhanced MR Image Storage", - "1.2.840.10008.5.1.4.1.1.4.2": "MR Spectroscopy Storage", - "1.2.840.10008.5.1.4.1.1.4.3": "Enhanced MR Color Image Storage", - "1.2.840.10008.5.1.4.1.1.4.4": "Legacy Converted Enhanced MR Image Storage", - "1.2.840.10008.5.1.4.1.1.5": "Nuclear Medicine Image Storage (Retired)", - "1.2.840.10008.5.1.4.1.1.6": "Ultrasound Image Storage (Retired)", - "1.2.840.10008.5.1.4.1.1.6.1": "Ultrasound Image Storage", - "1.2.840.10008.5.1.4.1.1.6.2": "Enhanced US Volume Storage", - "1.2.840.10008.5.1.4.1.1.7": "Secondary Capture Image Storage", - "1.2.840.10008.5.1.4.1.1.7.1": - "Multi-frame Single Bit Secondary Capture Image Storage", - "1.2.840.10008.5.1.4.1.1.7.2": - "Multi-frame Grayscale Byte Secondary Capture Image Storage", - "1.2.840.10008.5.1.4.1.1.7.3": - "Multi-frame Grayscale Word Secondary Capture Image Storage", - "1.2.840.10008.5.1.4.1.1.7.4": - "Multi-frame True Color Secondary Capture Image Storage", - "1.2.840.10008.5.1.4.1.1.8": "Standalone Overlay Storage (Retired)", - "1.2.840.10008.5.1.4.1.1.9": "Standalone Curve Storage (Retired)", - "1.2.840.10008.5.1.4.1.1.9.1": "Waveform Storage - Trial (Retired)", - "1.2.840.10008.5.1.4.1.1.9.1.1": "12-lead ECG Waveform Storage", - "1.2.840.10008.5.1.4.1.1.9.1.2": "General ECG Waveform Storage", - "1.2.840.10008.5.1.4.1.1.9.1.3": "Ambulatory ECG Waveform Storage", - "1.2.840.10008.5.1.4.1.1.9.2.1": "Hemodynamic Waveform Storage", - "1.2.840.10008.5.1.4.1.1.9.3.1": "Cardiac Electrophysiology Waveform Storage", - "1.2.840.10008.5.1.4.1.1.9.4.1": "Basic Voice Audio Waveform Storage", - "1.2.840.10008.5.1.4.1.1.9.4.2": "General Audio Waveform Storage", - "1.2.840.10008.5.1.4.1.1.9.5.1": "Arterial Pulse Waveform Storage", - "1.2.840.10008.5.1.4.1.1.9.6.1": "Respiratory Waveform Storage", - "1.2.840.10008.5.1.4.1.1.10": "Standalone Modality LUT Storage (Retired)", - "1.2.840.10008.5.1.4.1.1.11": "Standalone VOI LUT Storage (Retired)", - "1.2.840.10008.5.1.4.1.1.11.1": - "Grayscale Softcopy Presentation State Storage SOP Class", - "1.2.840.10008.5.1.4.1.1.11.2": - "Color Softcopy Presentation State Storage SOP Class", - "1.2.840.10008.5.1.4.1.1.11.3": - "Pseudo-Color Softcopy Presentation State Storage SOP Class", - "1.2.840.10008.5.1.4.1.1.11.4": - "Blending Softcopy Presentation State Storage SOP Class", - "1.2.840.10008.5.1.4.1.1.11.5": - "XA/XRF Grayscale Softcopy Presentation State Storage", - "1.2.840.10008.5.1.4.1.1.12.1": "X-Ray Angiographic Image Storage", - "1.2.840.10008.5.1.4.1.1.12.1.1": "Enhanced XA Image Storage", - "1.2.840.10008.5.1.4.1.1.12.2": "X-Ray Radiofluoroscopic Image Storage", - "1.2.840.10008.5.1.4.1.1.12.2.1": "Enhanced XRF Image Storage", - "1.2.840.10008.5.1.4.1.1.12.3": - "X-Ray Angiographic Bi-Plane Image Storage (Retired)", - "1.2.840.10008.5.1.4.1.1.13.1.1": "X-Ray 3D Angiographic Image Storage", - "1.2.840.10008.5.1.4.1.1.13.1.2": "X-Ray 3D Craniofacial Image Storage", - "1.2.840.10008.5.1.4.1.1.13.1.3": "Breast Tomosynthesis Image Storage", - "1.2.840.10008.5.1.4.1.1.13.1.4": - "Breast Projection X-Ray Image Storage - For Presentation", - "1.2.840.10008.5.1.4.1.1.13.1.5": - "Breast Projection X-Ray Image Storage - For Processing", - "1.2.840.10008.5.1.4.1.1.14.1": - "Intravascular Optical Coherence Tomography Image Storage - For Presentation", - "1.2.840.10008.5.1.4.1.1.14.2": - "Intravascular Optical Coherence Tomography Image Storage - For Processing", - "1.2.840.10008.5.1.4.1.1.20": "Nuclear Medicine Image Storage", - "1.2.840.10008.5.1.4.1.1.30": "Parametric Map Storage", - "1.2.840.10008.5.1.4.1.1.66": "Raw Data Storage", - "1.2.840.10008.5.1.4.1.1.66.1": "Spatial Registration Storage", - "1.2.840.10008.5.1.4.1.1.66.2": "Spatial Fiducials Storage", - "1.2.840.10008.5.1.4.1.1.66.3": "Deformable Spatial Registration Storage", - "1.2.840.10008.5.1.4.1.1.66.4": "Segmentation Storage", - "1.2.840.10008.5.1.4.1.1.66.5": "Surface Segmentation Storage", - "1.2.840.10008.5.1.4.1.1.67": "Real World Value Mapping Storage", - "1.2.840.10008.5.1.4.1.1.68.1": "Surface Scan Mesh Storage", - "1.2.840.10008.5.1.4.1.1.68.2": "Surface Scan Point Cloud Storage", - "1.2.840.10008.5.1.4.1.1.77.1": "VL Image Storage - Trial (Retired)", - "1.2.840.10008.5.1.4.1.1.77.2": - "VL Multi-frame Image Storage - Trial (Retired)", - "1.2.840.10008.5.1.4.1.1.77.1.1": "VL Endoscopic Image Storage", - "1.2.840.10008.5.1.4.1.1.77.1.1.1": "Video Endoscopic Image Storage", - "1.2.840.10008.5.1.4.1.1.77.1.2": "VL Microscopic Image Storage", - "1.2.840.10008.5.1.4.1.1.77.1.2.1": "Video Microscopic Image Storage", - "1.2.840.10008.5.1.4.1.1.77.1.3": - "VL Slide-Coordinates Microscopic Image Storage", - "1.2.840.10008.5.1.4.1.1.77.1.4": "VL Photographic Image Storage", - "1.2.840.10008.5.1.4.1.1.77.1.4.1": "Video Photographic Image Storage", - "1.2.840.10008.5.1.4.1.1.77.1.5.1": - "Ophthalmic Photography 8 Bit Image Storage", - "1.2.840.10008.5.1.4.1.1.77.1.5.2": - "Ophthalmic Photography 16 Bit Image Storage", - "1.2.840.10008.5.1.4.1.1.77.1.5.3": "Stereometric Relationship Storage", - "1.2.840.10008.5.1.4.1.1.77.1.5.4": "Ophthalmic Tomography Image Storage", - "1.2.840.10008.5.1.4.1.1.77.1.5.5": - "Wide Field Ophthalmic Photography Stereographic Projection Image Storage", - "1.2.840.10008.5.1.4.1.1.77.1.5.6": - "Wide Field Ophthalmic Photography 3D Coordinates Image Storage", - "1.2.840.10008.5.1.4.1.1.77.1.6": "VL Whole Slide Microscopy Image Storage", - "1.2.840.10008.5.1.4.1.1.78.1": "Lensometry Measurements Storage", - "1.2.840.10008.5.1.4.1.1.78.2": "Autorefraction Measurements Storage", - "1.2.840.10008.5.1.4.1.1.78.3": "Keratometry Measurements Storage", - "1.2.840.10008.5.1.4.1.1.78.4": "Subjective Refraction Measurements Storage", - "1.2.840.10008.5.1.4.1.1.78.5": "Visual Acuity Measurements Storage", - "1.2.840.10008.5.1.4.1.1.78.6": "Spectacle Prescription Report Storage", - "1.2.840.10008.5.1.4.1.1.78.7": "Ophthalmic Axial Measurements Storage", - "1.2.840.10008.5.1.4.1.1.78.8": "Intraocular Lens Calculations Storage", - "1.2.840.10008.5.1.4.1.1.79.1": - "Macular Grid Thickness and Volume Report Storage", - "1.2.840.10008.5.1.4.1.1.80.1": - "Ophthalmic Visual Field Static Perimetry Measurements Storage", - "1.2.840.10008.5.1.4.1.1.81.1": "Ophthalmic Thickness Map Storage", - "1.2.840.10008.5.1.4.1.1.82.1": "Corneal Topography Map Storage", - "1.2.840.10008.5.1.4.1.1.88.1": "Text SR Storage - Trial (Retired)", - "1.2.840.10008.5.1.4.1.1.88.2": "Audio SR Storage - Trial (Retired)", - "1.2.840.10008.5.1.4.1.1.88.3": "Detail SR Storage - Trial (Retired)", - "1.2.840.10008.5.1.4.1.1.88.4": "Comprehensive SR Storage - Trial (Retired)", - "1.2.840.10008.5.1.4.1.1.88.11": "Basic Text SR Storage", - "1.2.840.10008.5.1.4.1.1.88.22": "Enhanced SR Storage", - "1.2.840.10008.5.1.4.1.1.88.33": "Comprehensive SR Storage", - "1.2.840.10008.5.1.4.1.1.88.34": "Comprehensive 3D SR Storage", - "1.2.840.10008.5.1.4.1.1.88.35": "Extensible SR Storage", - "1.2.840.10008.5.1.4.1.1.88.40": "Procedure Log Storage", - "1.2.840.10008.5.1.4.1.1.88.50": "Mammography CAD SR Storage", - "1.2.840.10008.5.1.4.1.1.88.59": "Key Object Selection Document Storage", - "1.2.840.10008.5.1.4.1.1.88.65": "Chest CAD SR Storage", - "1.2.840.10008.5.1.4.1.1.88.67": "X-Ray Radiation Dose SR Storage", - "1.2.840.10008.5.1.4.1.1.88.68": - "Radiopharmaceutical Radiation Dose SR Storage", - "1.2.840.10008.5.1.4.1.1.88.69": "Colon CAD SR Storage", - "1.2.840.10008.5.1.4.1.1.88.70": "Implantation Plan SR Storage", - "1.2.840.10008.5.1.4.1.1.104.1": "Encapsulated PDF Storage", - "1.2.840.10008.5.1.4.1.1.104.2": "Encapsulated CDA Storage", - "1.2.840.10008.5.1.4.1.1.128": "Positron Emission Tomography Image Storage", - "1.2.840.10008.5.1.4.1.1.128.1": - "Legacy Converted Enhanced PET Image Storage", - "1.2.840.10008.5.1.4.1.1.129": "Standalone PET Curve Storage (Retired)", - "1.2.840.10008.5.1.4.1.1.130": "Enhanced PET Image Storage", - "1.2.840.10008.5.1.4.1.1.131": "Basic Structured Display Storage", - "1.2.840.10008.5.1.4.1.1.481.1": "RT Image Storage", - "1.2.840.10008.5.1.4.1.1.481.2": "RT Dose Storage", - "1.2.840.10008.5.1.4.1.1.481.3": "RT Structure Set Storage", - "1.2.840.10008.5.1.4.1.1.481.4": "RT Beams Treatment Record Storage", - "1.2.840.10008.5.1.4.1.1.481.5": "RT Plan Storage", - "1.2.840.10008.5.1.4.1.1.481.6": "RT Brachy Treatment Record Storage", - "1.2.840.10008.5.1.4.1.1.481.7": "RT Treatment Summary Record Storage", - "1.2.840.10008.5.1.4.1.1.481.8": "RT Ion Plan Storage", - "1.2.840.10008.5.1.4.1.1.481.9": "RT Ion Beams Treatment Record Storage", - "1.2.840.10008.5.1.4.1.1.501.1": "DICOS CT Image Storage", - "1.2.840.10008.5.1.4.1.1.501.2.1": - "DICOS Digital X-Ray Image Storage - For Presentation", - "1.2.840.10008.5.1.4.1.1.501.2.2": - "DICOS Digital X-Ray Image Storage - For Processing", - "1.2.840.10008.5.1.4.1.1.501.3": "DICOS Threat Detection Report Storage", - "1.2.840.10008.5.1.4.1.1.501.4": "DICOS 2D AIT Storage", - "1.2.840.10008.5.1.4.1.1.501.5": "DICOS 3D AIT Storage", - "1.2.840.10008.5.1.4.1.1.501.6": "DICOS Quadrupole Resonance (QR) Storage", - "1.2.840.10008.5.1.4.1.1.601.1": "Eddy Current Image Storage", - "1.2.840.10008.5.1.4.1.1.601.2": "Eddy Current Multi-frame Image Storage", - "1.2.840.10008.5.1.4.1.2.1.1": - "Patient Root Query/Retrieve Information Model - FIND", - "1.2.840.10008.5.1.4.1.2.1.2": - "Patient Root Query/Retrieve Information Model - MOVE", - "1.2.840.10008.5.1.4.1.2.1.3": - "Patient Root Query/Retrieve Information Model - GET", - "1.2.840.10008.5.1.4.1.2.2.1": - "Study Root Query/Retrieve Information Model - FIND", - "1.2.840.10008.5.1.4.1.2.2.2": - "Study Root Query/Retrieve Information Model - MOVE", - "1.2.840.10008.5.1.4.1.2.2.3": - "Study Root Query/Retrieve Information Model - GET", - "1.2.840.10008.5.1.4.1.2.3.1": - "Patient/Study Only Query/Retrieve Information Model - FIND (Retired)", - "1.2.840.10008.5.1.4.1.2.3.2": - "Patient/Study Only Query/Retrieve Information Model - MOVE (Retired)", - "1.2.840.10008.5.1.4.1.2.3.3": - "Patient/Study Only Query/Retrieve Information Model - GET (Retired)", - "1.2.840.10008.5.1.4.1.2.4.2": "Composite Instance Root Retrieve - MOVE", - "1.2.840.10008.5.1.4.1.2.4.3": "Composite Instance Root Retrieve - GET", - "1.2.840.10008.5.1.4.1.2.5.3": - "Composite Instance Retrieve Without Bulk Data - GET", - "1.2.840.10008.5.1.4.31": "Modality Worklist Information Model - FIND", - "1.2.840.10008.5.1.4.32": - "General Purpose Worklist Management Meta SOP Class (Retired)", - "1.2.840.10008.5.1.4.32.1": - "General Purpose Worklist Information Model - FIND (Retired)", - "1.2.840.10008.5.1.4.32.2": - "General Purpose Scheduled Procedure Step SOP Class (Retired)", - "1.2.840.10008.5.1.4.32.3": - "General Purpose Performed Procedure Step SOP Class (Retired)", - "1.2.840.10008.5.1.4.33": "Instance Availability Notification SOP Class", - "1.2.840.10008.5.1.4.34.1": - "RT Beams Delivery Instruction Storage - Trial (Retired)", - "1.2.840.10008.5.1.4.34.2": - "RT Conventional Machine Verification - Trial (Retired)", - "1.2.840.10008.5.1.4.34.3": "RT Ion Machine Verification - Trial (Retired)", - "1.2.840.10008.5.1.4.34.4": - "Unified Worklist and Procedure Step Service Class - Trial (Retired)", - "1.2.840.10008.5.1.4.34.4.1": - "Unified Procedure Step - Push SOP Class - Trial (Retired)", - "1.2.840.10008.5.1.4.34.4.2": - "Unified Procedure Step - Watch SOP Class - Trial (Retired)", - "1.2.840.10008.5.1.4.34.4.3": - "Unified Procedure Step - Pull SOP Class - Trial (Retired)", - "1.2.840.10008.5.1.4.34.4.4": - "Unified Procedure Step - Event SOP Class - Trial (Retired)", - "1.2.840.10008.5.1.4.34.5": "UPS Global Subscription SOP Instance", - "1.2.840.10008.5.1.4.34.5.1": "UPS Filtered Global Subscription SOP Instance", - "1.2.840.10008.5.1.4.34.6": - "Unified Worklist and Procedure Step Service Class", - "1.2.840.10008.5.1.4.34.6.1": "Unified Procedure Step - Push SOP Class", - "1.2.840.10008.5.1.4.34.6.2": "Unified Procedure Step - Watch SOP Class", - "1.2.840.10008.5.1.4.34.6.3": "Unified Procedure Step - Pull SOP Class", - "1.2.840.10008.5.1.4.34.6.4": "Unified Procedure Step - Event SOP Class", - "1.2.840.10008.5.1.4.34.7": "RT Beams Delivery Instruction Storage", - "1.2.840.10008.5.1.4.34.8": "RT Conventional Machine Verification", - "1.2.840.10008.5.1.4.34.9": "RT Ion Machine Verification", - "1.2.840.10008.5.1.4.37.1": "General Relevant Patient Information Query", - "1.2.840.10008.5.1.4.37.2": - "Breast Imaging Relevant Patient Information Query", - "1.2.840.10008.5.1.4.37.3": "Cardiac Relevant Patient Information Query", - "1.2.840.10008.5.1.4.38.1": "Hanging Protocol Storage", - "1.2.840.10008.5.1.4.38.2": "Hanging Protocol Information Model - FIND", - "1.2.840.10008.5.1.4.38.3": "Hanging Protocol Information Model - MOVE", - "1.2.840.10008.5.1.4.38.4": "Hanging Protocol Information Model - GET", - "1.2.840.10008.5.1.4.39.1": "Color Palette Storage", - "1.2.840.10008.5.1.4.39.2": "Color Palette Information Model - FIND", - "1.2.840.10008.5.1.4.39.3": "Color Palette Information Model - MOVE", - "1.2.840.10008.5.1.4.39.4": "Color Palette Information Model - GET", - "1.2.840.10008.5.1.4.41": "Product Characteristics Query SOP Class", - "1.2.840.10008.5.1.4.42": "Substance Approval Query SOP Class", - "1.2.840.10008.5.1.4.43.1": "Generic Implant Template Storage", - "1.2.840.10008.5.1.4.43.2": - "Generic Implant Template Information Model - FIND", - "1.2.840.10008.5.1.4.43.3": - "Generic Implant Template Information Model - MOVE", - "1.2.840.10008.5.1.4.43.4": - "Generic Implant Template Information Model - GET", - "1.2.840.10008.5.1.4.44.1": "Implant Assembly Template Storage", - "1.2.840.10008.5.1.4.44.2": - "Implant Assembly Template Information Model - FIND", - "1.2.840.10008.5.1.4.44.3": - "Implant Assembly Template Information Model - MOVE", - "1.2.840.10008.5.1.4.44.4": - "Implant Assembly Template Information Model - GET", - "1.2.840.10008.5.1.4.45.1": "Implant Template Group Storage", - "1.2.840.10008.5.1.4.45.2": "Implant Template Group Information Model - FIND", - "1.2.840.10008.5.1.4.45.3": "Implant Template Group Information Model - MOVE", - "1.2.840.10008.5.1.4.45.4": "Implant Template Group Information Model - GET", - "1.2.840.10008.7.1.1": "Native DICOM Model", - "1.2.840.10008.7.1.2": "Abstract Multi-Dimensional Image Model", - "1.2.840.10008.8.1.1": "DICOM Content Mapping Resource", - "1.2.840.10008.15.0.3.1": "dicomDeviceName", - "1.2.840.10008.15.0.3.2": "dicomDescription", - "1.2.840.10008.15.0.3.3": "dicomManufacturer", - "1.2.840.10008.15.0.3.4": "dicomManufacturerModelName", - "1.2.840.10008.15.0.3.5": "dicomSoftwareVersion", - "1.2.840.10008.15.0.3.6": "dicomVendorData", - "1.2.840.10008.15.0.3.7": "dicomAETitle", - "1.2.840.10008.15.0.3.8": "dicomNetworkConnectionReference", - "1.2.840.10008.15.0.3.9": "dicomApplicationCluster", - "1.2.840.10008.15.0.3.10": "dicomAssociationInitiator", - "1.2.840.10008.15.0.3.11": "dicomAssociationAcceptor", - "1.2.840.10008.15.0.3.12": "dicomHostname", - "1.2.840.10008.15.0.3.13": "dicomPort", - "1.2.840.10008.15.0.3.14": "dicomSOPClass", - "1.2.840.10008.15.0.3.15": "dicomTransferRole", - "1.2.840.10008.15.0.3.16": "dicomTransferSyntax", - "1.2.840.10008.15.0.3.17": "dicomPrimaryDeviceType", - "1.2.840.10008.15.0.3.18": "dicomRelatedDeviceReference", - "1.2.840.10008.15.0.3.19": "dicomPreferredCalledAETitle", - "1.2.840.10008.15.0.3.20": "dicomTLSCyphersuite", - "1.2.840.10008.15.0.3.21": "dicomAuthorizedNodeCertificateReference", - "1.2.840.10008.15.0.3.22": "dicomThisNodeCertificateReference", - "1.2.840.10008.15.0.3.23": "dicomInstalled", - "1.2.840.10008.15.0.3.24": "dicomStationName", - "1.2.840.10008.15.0.3.25": "dicomDeviceSerialNumber", - "1.2.840.10008.15.0.3.26": "dicomInstitutionName", - "1.2.840.10008.15.0.3.27": "dicomInstitutionAddress", - "1.2.840.10008.15.0.3.28": "dicomInstitutionDepartmentName", - "1.2.840.10008.15.0.3.29": "dicomIssuerOfPatientID", - "1.2.840.10008.15.0.3.30": "dicomPreferredCallingAETitle", - "1.2.840.10008.15.0.3.31": "dicomSupportedCharacterSet", - "1.2.840.10008.15.0.4.1": "dicomConfigurationRoot", - "1.2.840.10008.15.0.4.2": "dicomDevicesRoot", - "1.2.840.10008.15.0.4.3": "dicomUniqueAETitlesRegistryRoot", - "1.2.840.10008.15.0.4.4": "dicomDevice", - "1.2.840.10008.15.0.4.5": "dicomNetworkAE", - "1.2.840.10008.15.0.4.6": "dicomNetworkConnection", - "1.2.840.10008.15.0.4.7": "dicomUniqueAETitle", - "1.2.840.10008.15.0.4.8": "dicomTransferCapability", - "1.2.840.10008.15.1.1": "Universal Coordinated Time", -}; diff --git a/src/components/Preview/displays/dicomUtils/dicomDict.ts b/src/components/Preview/displays/dicomUtils/dicomDict.ts deleted file mode 100644 index fa222a666..000000000 --- a/src/components/Preview/displays/dicomUtils/dicomDict.ts +++ /dev/null @@ -1,479 +0,0 @@ -import { TAG_DICT, uids } from "./dataDictionary"; -import Rusha from "rusha"; -import dicomParser from "dicom-parser"; - -function imageFrameLink(frameIndex: any) { - let linkText = "<a class='imageFrameDownload' "; - linkText += `data-frameIndex='${frameIndex}'`; - linkText += ` href='#'> Frame #${frameIndex}</a>`; - return linkText; -} - -const rusha = new Rusha(); - -// helper function to see if a string only has ascii characters in it -function isASCII(str: any) { - //Ts-ignore - // biome-ignore lint/suspicious/noControlCharactersInRegex: <explanation> - return /^[\x00-\x7F]*$/.test(str); -} - -function sha1(byteArray: any, position?: any, length?: any) { - const subArray = dicomParser.sharedCopy( - byteArray, - position || 0, - length || byteArray.length, - ); - return rusha.digest(subArray); -} - -function sha1Text(byteArray: any, position?: any, length?: any) { - const showSHA1 = false; - if (showSHA1 === false) { - return ""; - } - const text = `; SHA1 ${sha1(byteArray, position, length)}`; - return text; -} - -function escapeSpecialCharacters(str: any) { - return str - .replace(/&/g, "&") - .replace(/</g, "<") - .replace(/>/g, ">") - .replace(/"/g, """); -} - -function isStringVr(vr: string) { - if ( - vr === "AT" || - vr === "FL" || - vr === "FD" || - vr === "OB" || - vr === "OF" || - vr === "OW" || - vr === "SI" || - vr === "SQ" || - vr === "SS" || - vr === "UL" || - vr === "US" - ) { - return false; - } - return true; -} - -function mapUid(str: any) { - //@ts-ignore - const uid = uids[str]; - if (uid) { - return ` [ ${uid} ]`; - } - return ""; -} - -const showPrivateElements = true; -const showP10Header = true; -const showEmptyValues = true; -const showLength = false; -const showVR = false; -const showFragments = true; -const showFrames = true; -const maxLength = 128; - -function getTag(tag: any) { - const group = tag.substring(1, 5); - const element = tag.substring(5, 9); - const tagIndex = `(${group},${element})`.toUpperCase(); - - //@ts-ignore - const attr = TAG_DICT[tagIndex]; - return attr; -} - -export function dumpDataSet(dataSet: any, output: any, testOutput: any) { - try { - const keys = []; - for (const propertyName in dataSet.elements) { - keys.push(propertyName); - } - keys.sort(); - - // the dataSet.elements object contains properties for each element parsed. The name of the property - // is based on the elements tag and looks like 'xGGGGEEEE' where GGGG is the group number and EEEE is the - // element number both with lowercase hexadecimal letters. For example, the Series Description DICOM element 0008,103E would - // be named 'x0008103e'. Here we iterate over each property (element) so we can build a string describing its - // contents to add to the output array - for (let k = 0; k < keys.length; k++) { - const propertyName = keys[k]; - const element = dataSet.elements[propertyName]; - - //@ts-ignore - if (showP10Header === false && element.tag <= "x0002ffff") { - continue; - } - - if ( - //@ts-ignore - showPrivateElements === false && - dicomParser.isPrivateTag(element.tag) - ) { - continue; - } - //@ts-ignore - if (showEmptyValues === false && element.length <= 0) { - continue; - } - let text = ""; - let title = ""; - - let color = "black"; - - const tag = getTag(element.tag); - - // The output string begins with the element name (or tag if not in data dictionary), length and VR (if present). VR is undefined for - // implicit transfer syntaxes - if (tag === undefined) { - let lengthText = `length=${element.length}`; - if (element.hadUndefinedLength) { - lengthText += " (-1)"; - } - //@ts-ignore - if (showLength === true) { - text += `${lengthText}; `; - } - - title += lengthText; - - let vrText = ""; - if (element.vr) { - vrText += `VR=${element.vr}`; - } - - if (showVR) { - text += `${vrText}; `; - } - if (vrText) { - title += `; ${vrText}`; - } - - title += `dataOffset=${element.dataOffset}`; - // make text lighter since this is an unknown attribute - color = "#C8C8C8"; - } else { - let vrText = ""; - if (element.vr) { - vrText += `VR=${element.vr}`; - } - - if (showVR) { - text += `${vrText}; `; - } - if (vrText) { - title += `${vrText}`; - } - - title += `; dataOffset=${element.dataOffset}`; - } - - // Here we check for Sequence items and iterate over them if present. items will not be set in the - // element object for elements that don't have SQ VR type. Note that implicit little endian - // sequences will are currently not parsed. - if (element.items) { - output.push(`<li>${text}</li>`); - output.push("<ul>"); - - // each item contains its own data set so we iterate over the items - // and recursively call this function - let itemNumber = 0; - element.items.forEach((item: any) => { - output.push(`<li>Item #${itemNumber++} ${item.tag}`); - let lengthText = ` length=${item.length}`; - if (item.hadUndefinedLength) { - lengthText += " (-1)"; - } - //@ts-ignore - if (showLength === true) { - text += `${lengthText}; `; - output.push(lengthText); - } - output.push("</li>"); - output.push("<ul>"); - dumpDataSet(item.dataSet, output, testOutput); - output.push("</ul>"); - }); - output.push("</ul>"); - } else if (element.fragments) { - text += `encapsulated pixel data with ${element.basicOffsetTable.length} offsets and ${element.fragments.length} fragments`; - text += sha1Text(dataSet.byteArray, element.dataOffset, element.length); - - output.push(`<li title='${title}'=>${text}</li>`); - - if (showFragments && element.encapsulatedPixelData) { - output.push("Fragments:<br>"); - output.push("<ul>"); - let itemNumber = 0; - element.fragments.forEach((fragment: any) => { - let str = `<li>Fragment #${itemNumber++} dataOffset = ${ - fragment.position - }`; - str += `; offset = ${fragment.offset}`; - str += `; length = ${fragment.length}`; - str += sha1Text( - dataSet.byteArray, - fragment.position, - fragment.length, - ); - str += "</li>"; - - output.push(str); - }); - output.push("</ul>"); - } - if (showFrames && element.encapsulatedPixelData) { - output.push("Frames:<br>"); - output.push("<ul>"); - let bot = element.basicOffsetTable; - // if empty bot and not RLE, calculate it - if (bot.length === 0) { - bot = dicomParser.createJPEGBasicOffsetTable(dataSet, element); - } - - for (let frameIndex = 0; frameIndex < bot.length; frameIndex++) { - let str = "<li>"; - str += imageFrameLink(frameIndex); - str += ` dataOffset = ${ - element.fragments[0].position + bot[frameIndex] - }`; - str += `; offset = ${bot[frameIndex]}`; - const imageFrame = dicomParser.readEncapsulatedImageFrame( - dataSet, - element, - frameIndex, - bot, - ); - str += `; length = ${imageFrame.length}`; - str += sha1Text(imageFrame); - str += "</li>"; - output.push(str); - } - output.push("</ul>"); - } - } else { - // use VR to display the right value - let vr; - if (element.vr !== undefined) { - vr = element.vr; - } else { - if (tag !== undefined) { - vr = tag.vr; - } - } - - // if the length of the element is less than 128 we try to show it. We put this check in - // to avoid displaying large strings which makes it harder to use. - if (element.length < maxLength) { - // Since the dataset might be encoded using implicit transfer syntax and we aren't using - // a data dictionary, we need some simple logic to figure out what data types these - // elements might be. Since the dataset might also be explicit we could be switch on the - // VR and do a better job on this, perhaps we can do that in another example - - // First we check to see if the element's length is appropriate for a UI or US VR. - // US is an important type because it is used for the - // image Rows and Columns so that is why those are assumed over other VR types. - if (element.vr === undefined && tag === undefined) { - if (element.length === 2) { - text += ` (${dataSet.uint16(propertyName)})`; - } else if (element.length === 4) { - text += ` (${dataSet.uint32(propertyName)})`; - } - - // Next we ask the dataset to give us the element's data in string form. Most elements are - // strings but some aren't so we do a quick check to make sure it actually has all ascii - // characters so we know it is reasonable to display it. - const str = dataSet.string(propertyName); - const stringIsAscii = isASCII(str); - - if (stringIsAscii) { - // the string will be undefined if the element is present but has no data - // (i.e. attribute is of type 2 or 3 ) so we only display the string if it has - // data. Note that the length of the element will be 0 to indicate "no data" - // so we don't put anything here for the value in that case. - if (str !== undefined) { - text += escapeSpecialCharacters(str) + mapUid(str); - } - } else { - if (element.length !== 2 && element.length !== 4) { - color = "#C8C8C8"; - // If it is some other length and we have no string - text += "<i>binary data</i>"; - } - } - } else { - if (isStringVr(vr)) { - // Next we ask the dataset to give us the element's data in string form. Most elements are - // strings but some aren't so we do a quick check to make sure it actually has all ascii - // characters so we know it is reasonable to display it. - const str = dataSet.string(propertyName); - const stringIsAscii = isASCII(str); - - if (stringIsAscii) { - // the string will be undefined if the element is present but has no data - // (i.e. attribute is of type 2 or 3 ) so we only display the string if it has - // data. Note that the length of the element will be 0 to indicate "no data" - // so we don't put anything here for the value in that case. - if (str !== undefined) { - text += escapeSpecialCharacters(str) + mapUid(str); - } - } else { - if (element.length !== 2 && element.length !== 4) { - color = "#C8C8C8"; - // If it is some other length and we have no string - text += "<i>binary data</i>"; - } - } - } else if (vr === "US") { - text += dataSet.uint16(propertyName); - for ( - let i = 1; - i < dataSet.elements[propertyName].length / 2; - i++ - ) { - text += `\\${dataSet.uint16(propertyName, i)}`; - } - } else if (vr === "SS") { - text += dataSet.int16(propertyName); - for ( - let i = 1; - i < dataSet.elements[propertyName].length / 2; - i++ - ) { - text += `\\${dataSet.int16(propertyName, i)}`; - } - } else if (vr === "UL") { - text += dataSet.uint32(propertyName); - for ( - let i = 1; - i < dataSet.elements[propertyName].length / 4; - i++ - ) { - text += `\\${dataSet.uint32(propertyName, i)}`; - } - } else if (vr === "SL") { - text += dataSet.int32(propertyName); - for ( - let i = 1; - i < dataSet.elements[propertyName].length / 4; - i++ - ) { - text += `\\${dataSet.int32(propertyName, i)}`; - } - } else if (vr == "FD") { - text += dataSet.double(propertyName); - for ( - let i = 1; - i < dataSet.elements[propertyName].length / 8; - i++ - ) { - text += `\\${dataSet.double(propertyName, i)}`; - } - } else if (vr === "FL") { - text += dataSet.float(propertyName); - for ( - let i = 1; - i < dataSet.elements[propertyName].length / 4; - i++ - ) { - text += `\\${dataSet.float(propertyName, i)}`; - } - } else if ( - vr === "OB" || - vr === "OW" || - vr === "UN" || - vr === "OF" || - vr === "UT" - ) { - color = "#C8C8C8"; - // If it is some other length and we have no string - /* - if (element.length === 2) { - text += - "<i>" + - dataDownloadLink(element, "binary data") + - " of length " + - element.length + - " as uint16: " + - dataSet.uint16(propertyName) + - "</i>"; - } else if (element.length === 4) { - text += - "<i>" + - dataDownloadLink(element, "binary data") + - " of length " + - element.length + - " as uint32: " + - dataSet.uint32(propertyName) + - "</i>"; - } else { - text += - "<i>" + - dataDownloadLink(element, "binary data") + - " of length " + - element.length + - " and VR " + - vr + - "</i>"; - } - */ - } else if (vr === "AT") { - const group = dataSet.uint16(propertyName, 0); - const groupHexStr = `0000${group.toString(16)}`.substring(-4); - const element = dataSet.uint16(propertyName, 1); - const elementHexStr = `0000${element.toString(16)}`.substring(-4); - text += `x${groupHexStr}${elementHexStr}`; - } else if (vr === "SQ") { - } else { - // If it is some other length and we have no string - text += `<i>no display code for VR ${vr} yet, sorry!</i>`; - } - } - - if (element.length === 0) { - color = "#C8C8C8"; - } - } else { - color = "#C8C8C8"; - /* - // Add text saying the data is too long to show... - text += "<i>" + dataDownloadLink(element, "data"); - text += " of length " + element.length + " for VR " + vr + " too long to show</i>"; - text += sha1Text(dataSet.byteArray, element.dataOffset, element.length); - */ - } - // finally we add the string to our output array surrounded by li elements so it shows up in the - // DOM as a list - - if (tag) { - testOutput.push({ - [tag.name]: text, - }); - } - - output.push( - `<li style="color:${color};" title="${title}">${text}</li>`, - ); - } - } - } catch (err) { - return testOutput; - } - - return testOutput.sort((a: any, b: any) => { - const keyA = Object.keys(a)[0]; - const keyB = Object.keys(b)[0]; - - if (keyA < keyB) return -1; - if (keyA > keyB) return 1; - return 0; - }); -} diff --git a/src/components/Preview/displays/dicomUtils/hardcodedMetaDataProvider.ts b/src/components/Preview/displays/dicomUtils/hardcodedMetaDataProvider.ts deleted file mode 100644 index 2e6f09b57..000000000 --- a/src/components/Preview/displays/dicomUtils/hardcodedMetaDataProvider.ts +++ /dev/null @@ -1,72 +0,0 @@ -// Add hardcoded meta data provider for color images -export default function hardcodedMetaDataProvider( - type: string, - imageId: string, - imageIds: string[], -) { - const colonIndex = imageId.indexOf(":"); - const scheme = imageId.substring(0, colonIndex); - if (scheme !== "web") { - return; - } - - if (type === "imagePixelModule") { - const imagePixelModule = { - pixelRepresentation: 0, - bitsAllocated: 24, - bitsStored: 24, - highBit: 24, - photometricInterpretation: "RGB", - samplesPerPixel: 3, - }; - - return imagePixelModule; - } - if (type === "generalSeriesModule") { - const generalSeriesModule = { - modality: "SC", - seriesNumber: 1, - seriesDescription: "Color", - seriesDate: "20190201", - seriesTime: "120000", - seriesInstanceUID: "1.2.276.0.7230010.3.1.4.83233.20190201120000.1", - }; - - return generalSeriesModule; - } - if (type === "imagePlaneModule") { - const index = imageIds.indexOf(imageId); - // console.warn(index); - const imagePlaneModule = { - imageOrientationPatient: [1, 0, 0, 0, 1, 0], - imagePositionPatient: [0, 0, index * 5], - pixelSpacing: [1, 1], - columnPixelSpacing: 1, - rowPixelSpacing: 1, - frameOfReferenceUID: "FORUID", - columns: 2048, - rows: 1216, - rowCosines: [1, 0, 0], - columnCosines: [0, 1, 0], - }; - - return imagePlaneModule; - } - if (type === "voiLutModule") { - return { - // According to the DICOM standard, the width is the number of samples - // in the input, so 256 samples. - windowWidth: [256], - // The center is offset by 0.5 to allow for an integer value for even - // sample counts - windowCenter: [128], - }; - } - if (type === "modalityLutModule") { - return { - rescaleSlope: 1, - rescaleIntercept: 0, - }; - } - return undefined; -} diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index e6bfe86b3..87bd474c1 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -1,28 +1,24 @@ +import * as cornerstone from "@cornerstonejs/core"; import { + EVENTS, Enums, RenderingEngine, type Types, - imageLoader, init, - metaData, volumeLoader, - EVENTS, } from "@cornerstonejs/core"; -import * as cornerstone from "@cornerstonejs/core"; import cornerstonejsDICOMImageLoader from "@cornerstonejs/dicom-image-loader"; import { cornerstoneStreamingDynamicImageVolumeLoader, cornerstoneStreamingImageVolumeLoader, } from "@cornerstonejs/streaming-image-volume-loader"; +import * as cornerstoneTools from "@cornerstonejs/tools"; import { type Types as CornerstoneToolTypes, init as csToolsInit, } from "@cornerstonejs/tools"; -import * as cornerstoneTools from "@cornerstonejs/tools"; import dicomParser from "dicom-parser"; -import hardcodedMetaDataProvider from "./hardcodedMetaDataProvider"; import ptScalingMetaDataProvider from "./ptScalingMetaDataProvider"; -import registerWebImageLoader from "./webImageLoader"; //@ts-ignore window.cornerstone = cornerstone; @@ -170,7 +166,6 @@ export const basicInit = async () => { initVolumeLoader(); await init(); csToolsInit(); - registerWebImageLoader(imageLoader); }; export type IStackViewport = Types.IStackViewport; @@ -200,18 +195,45 @@ export const handleEvents = ( }; export const loadDicomImage = async (blob: Blob) => { - const imageID = cornerstonejsDICOMImageLoader.wadouri.fileManager.add(blob); - const image = await cornerstone.imageLoader.loadImage(imageID); + try { + const imageID = cornerstonejsDICOMImageLoader.wadouri.fileManager.add(blob); - // Detect if the DICOM is a multi-frame image - //@ts-ignore - const numberOfFrames = image.data.string("x00280008"); - const framesCount = numberOfFrames ? Number.parseInt(numberOfFrames, 10) : 1; + let bufferSize = 256 * 1024; // Start with 256 KB + const maxBufferSize = 5 * 1024 * 1024; // Maximum 5 MB - return { - imageID, - framesCount, - }; + let arrayBuffer: ArrayBuffer; + let dataSet: dicomParser.DataSet | undefined = undefined; + + while (bufferSize <= maxBufferSize) { + arrayBuffer = await blob.slice(0, bufferSize).arrayBuffer(); + try { + dataSet = dicomParser.parseDicom(new Uint8Array(arrayBuffer), { + untilTag: "x00280008", + }); + break; // Parsing succeeded, exit the loop + } catch (error: any) { + if (error?.exception?.includes("buffer overrun")) { + // Increase the buffer size and try again + bufferSize *= 2; // Double the buffer size + } else { + // Other parsing error + throw error; + } + } + } + if (!dataSet) { + throw new Error("Unable to parse DICOM file within buffer size limit."); + } + // Get the Number of Frames + const numberOfFramesString = dataSet.string("x00280008") || "1"; + const framesCount = Number.parseInt(numberOfFramesString, 10); + return { + imageID, + framesCount, + }; + } catch (e) { + throw new Error("Error parsing the DICOM file"); + } }; type ImagePoint = [number, number]; @@ -269,12 +291,6 @@ export const displayDicomImage = async ( const viewportId = uniqueId; const renderingEngineId = `myRenderingEngine_${uniqueId}`; const imageIds = [imageId]; - if (imageId.startsWith("web")) { - metaData.addProvider( - (type, imageId) => hardcodedMetaDataProvider(type, imageId, imageIds), - 10000, - ); - } const renderingEngine = new RenderingEngine(renderingEngineId); const viewportInput = { viewportId, diff --git a/src/components/Preview/displays/dicomUtils/webImageLoader.ts b/src/components/Preview/displays/dicomUtils/webImageLoader.ts deleted file mode 100644 index 4a04c1ccd..000000000 --- a/src/components/Preview/displays/dicomUtils/webImageLoader.ts +++ /dev/null @@ -1,268 +0,0 @@ -import * as cornerstone from "@cornerstonejs/core"; - -import ChrisAPIClient from "../../../../api/chrisapiclient"; - -const canvas = document.createElement("canvas"); -let lastImageIdDrawn: string | undefined; - -/** - * Creates a cornerstone Image object for the specified Image and imageId - * - * @param image - An Image - * @param imageId - the imageId for this image - * @returns Cornerstone Image Object - */ -function createImage(image: HTMLImageElement, imageId: string): any { - // extract the attributes we need - const rows = image.naturalHeight; - const columns = image.naturalWidth; - - function getPixelData(targetBuffer: { - arrayBuffer: ArrayBuffer; - offset: number; - length: number; - }): Uint8Array { - const imageData = getImageData(); - - let targetArray: Uint8Array; - - // Check if targetBuffer is provided for volume viewports - if (targetBuffer) { - targetArray = new Uint8Array( - targetBuffer.arrayBuffer, - targetBuffer.offset, - targetBuffer.length, - ); - } else { - targetArray = new Uint8Array(imageData.width * imageData.height * 3); - } - - // modify original image data and remove alpha channel (RGBA to RGB) - convertImageDataToRGB(imageData, targetArray); - - return targetArray; - } - - function convertImageDataToRGB( - imageData: ImageData, - targetArray: Uint8Array, - ): void { - for (let i = 0, j = 0; i < imageData.data.length; i += 4, j += 3) { - targetArray[j] = imageData.data[i]; - targetArray[j + 1] = imageData.data[i + 1]; - targetArray[j + 2] = imageData.data[i + 2]; - } - } - - function getImageData(): ImageData { - let context: CanvasRenderingContext2D; - - if (lastImageIdDrawn === imageId) { - context = canvas.getContext("2d")!; - } else { - canvas.height = image.naturalHeight; - canvas.width = image.naturalWidth; - context = canvas.getContext("2d")!; - context.drawImage(image, 0, 0); - lastImageIdDrawn = imageId; - } - - return context.getImageData(0, 0, image.naturalWidth, image.naturalHeight); - } - - function getCanvas(): HTMLCanvasElement { - if (lastImageIdDrawn === imageId) { - return canvas; - } - - canvas.height = image.naturalHeight; - canvas.width = image.naturalWidth; - const context = canvas.getContext("2d")!; - - context.drawImage(image, 0, 0); - lastImageIdDrawn = imageId; - - return canvas; - } - - // Extract the various attributes we need - return { - imageId, - minPixelValue: 0, - maxPixelValue: 255, - slope: 1, - intercept: 0, - windowCenter: 128, - windowWidth: 255, - getPixelData, - getCanvas, - getImage: () => image, - rows, - columns, - height: rows, - width: columns, - color: true, - // we converted the canvas rgba already to rgb above - rgba: false, - columnPixelSpacing: 1, // for web it's always 1 - rowPixelSpacing: 1, // for web it's always 1 - invert: false, - sizeInBytes: rows * columns * 3, - }; -} - -function arrayBufferToImage( - arrayBuffer: ArrayBuffer, -): Promise<HTMLImageElement> { - return new Promise((resolve, reject) => { - const image = new Image(); - const arrayBufferView = new Uint8Array(arrayBuffer); - const blob = new Blob([arrayBufferView]); - const urlCreator = window.URL || window.webkitURL; - const imageUrl = urlCreator.createObjectURL(blob); - - image.src = imageUrl; - image.onload = () => { - resolve(image); - urlCreator.revokeObjectURL(imageUrl); - }; - - image.onerror = (error) => { - urlCreator.revokeObjectURL(imageUrl); - reject(error); - }; - }); -} - -// -// This is a cornerstone image loader for web images such as PNG and JPEG -// -const options: { beforeSend?: (xhr: XMLHttpRequest) => void } = { - // callback allowing customization of the xhr (e.g. adding custom auth headers, cors, etc) - beforeSend: (xhr) => { - // xhr - const client = ChrisAPIClient.getClient(); - const token = client.auth.token; - xhr.setRequestHeader("Authorization", `Token ${token}`); - }, -}; - -// Loads an image given a URL to an image -function loadImage( - uri: string, - imageId: string, -): { promise: Promise<any>; cancelFn: () => void } { - const xhr = new XMLHttpRequest(); - - xhr.open("GET", uri, true); - xhr.responseType = "arraybuffer"; - if (options.beforeSend) { - options.beforeSend(xhr); - } - - xhr.onprogress = (oProgress) => { - if (oProgress.lengthComputable) { - // evt.loaded the bytes browser receive - // evt.total the total bytes set by the header - const loaded = oProgress.loaded; - const total = oProgress.total; - const percentComplete = Math.round((loaded / total) * 100); - - const eventDetail = { - imageId, - loaded, - total, - percentComplete, - }; - - cornerstone.triggerEvent( - cornerstone.eventTarget, - "cornerstoneimageloadprogress", - eventDetail, - ); - } - }; - - const promise = new Promise<any>((resolve, reject) => { - xhr.onload = function () { - const imagePromise = arrayBufferToImage(this.response); - - imagePromise - .then((image) => { - const imageObject = createImage(image, imageId); - - resolve(imageObject); - }) - .catch((error) => { - console.error(error); - reject(error); - }); - }; - - xhr.onerror = (error) => { - reject(error); - }; - - xhr.send(); - }); - - const cancelFn = () => { - xhr.abort(); - }; - - return { - promise, - cancelFn, - }; -} - -function registerWebImageLoader(imageLoader: any): void { - imageLoader.registerImageLoader("web", _loadImageIntoBuffer); -} - -/** - * Small stripped down loader from cornerstoneDICOMImageLoader - * Which doesn't create cornerstone images that we don't need - */ -export function _loadImageIntoBuffer( - imageId: string, - options?: Record<string, any>, -): { promise: Promise<Record<string, any>>; cancelFn: () => void } { - const uri = imageId.replace("web:", ""); - - const promise = new Promise((resolve, reject) => { - // get the pixel data from the server - loadImage(uri, imageId) - .promise.then( - (image) => { - if ( - !options || - !options.targetBuffer || - !options.targetBuffer.length || - !options.targetBuffer.offset - ) { - resolve(image); - return; - } - - // @ts-ignore - image.getPixelData(options.targetBuffer); - - resolve(true); - }, - (error) => { - reject(error); - }, - ) - .catch((error) => { - reject(error); - }); - }); - - return { - promise, - cancelFn: undefined, - }; -} - -export default registerWebImageLoader; diff --git a/src/types/index.d.ts b/src/types/index.d.ts index ad50fe05b..4922ca99e 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -6,3 +6,4 @@ declare module "rusha"; declare module "hammerjs"; declare module "preval.macro"; declare module "@cornerstonejs/dicom-image-loader"; +declare module "dcmjs"; From 4c860e62578708e711bac74befbdfd6cccab2d1b Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Thu, 24 Oct 2024 10:45:00 -0400 Subject: [PATCH 320/337] feat: cleanup --- src/components/Preview/displays/DcmDisplay.tsx | 10 +--------- src/components/Preview/displays/dicomUtils/utils.ts | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 414f6c31d..4347c21b3 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -188,15 +188,7 @@ const DcmDisplay = (props: DcmImageProps) => { // biome-ignore lint/complexity/noUselessCatch: <explanation> throw e; } - }, [ - selectedFile, - cacheStack, - fname, - currentImageIndex, - selectedIndex, - displayDicomImage, - loadDicomImage, - ]); + }, [selectedFile, cacheStack, fname, currentImageIndex, selectedIndex]); // Use React Query to fetch and cache the preview data const { isLoading, data, isError, error } = useQuery({ diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index 87bd474c1..d6210bf72 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -178,7 +178,7 @@ export const handleEvents = ( const previousTool = actionState.previouslyActive as string; const id = toolGroup?.id; - if (activeTool === "TagInfo") return; + if (activeTool === "TagInfo" || activeTool === "Play") return; if (id) { toolGroup?.setToolPassive(previousTool); From cbee7f0f98d66e5c53a392d79522fc589f5f4022 Mon Sep 17 00:00:00 2001 From: Jennings Zhang <dev@sl.jennin.xyz> Date: Thu, 24 Oct 2024 15:45:25 -0400 Subject: [PATCH 321/337] Fix pypx types (#1281) * Show error message for pfdcmStudies.error * Fix simplifyPypxSeriesData undefineds --- src/api/pfdcm/client.ts | 50 ++++++++++++++------------ src/app.css | 6 ++-- src/components/Pacs/PacsController.tsx | 5 +-- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/api/pfdcm/client.ts b/src/api/pfdcm/client.ts index 6e0f6a029..54c8e8e46 100644 --- a/src/api/pfdcm/client.ts +++ b/src/api/pfdcm/client.ts @@ -198,6 +198,9 @@ function getValue( data: { [key: string]: PypxTag | ReadonlyArray<{ [key: string]: PypxTag }> }, name: string, ): string { + if (!(name in data)) { + return ""; + } if ("value" in data[name]) { return "" + data[name].value; } @@ -205,35 +208,36 @@ function getValue( } function simplifyPypxSeriesData(data: { [key: string]: PypxTag }): Series { - const parsedNumInstances = - data.NumberOfSeriesRelatedInstances.value === 0 - ? NaN - : parseInt(data.NumberOfSeriesRelatedInstances.value); - const NumberOfSeriesRelatedInstances = Number.isNaN(parsedNumInstances) + const numInstances = parseInt( + getValue(data, "NumberOfSeriesRelatedInstances"), + ); + const NumberOfSeriesRelatedInstances = Number.isNaN(numInstances) ? null - : parsedNumInstances; + : numInstances; return { - SpecificCharacterSet: "" + data.SpecificCharacterSet.value, + SpecificCharacterSet: getValue(data, "SpecificCharacterSet"), StudyDate: parsePypxDicomDate(data.StudyDate), SeriesDate: parsePypxDicomDate(data.SeriesDate), - AccessionNumber: "" + data.AccessionNumber.value, - RetrieveAETitle: "" + data.RetrieveAETitle.value, - Modality: "" + data.Modality.value, - StudyDescription: "" + data.StudyDescription.value, - SeriesDescription: "" + data.SeriesDescription.value, - PatientName: "" + data.PatientName.value, - PatientID: "" + data.PatientID.value, + AccessionNumber: getValue(data, "AccessionNumber"), + RetrieveAETitle: getValue(data, "RetrieveAETitle"), + Modality: getValue(data, "Modality"), + StudyDescription: getValue(data, "StudyDescription"), + SeriesDescription: getValue(data, "SeriesDescription"), + PatientName: getValue(data, "PatientName"), + PatientID: getValue(data, "PatientID"), PatientBirthDate: parsePypxDicomDate(data.PatientBirthDate), - PatientSex: "" + data.PatientSex.value, - PatientAge: "" + data.PatientAge.value, - ProtocolName: "" + data.ProtocolName.value, - AcquisitionProtocolName: "" + data.AcquisitionProtocolName.value, - AcquisitionProtocolDescription: - "" + data.AcquisitionProtocolDescription.value, - StudyInstanceUID: "" + data.StudyInstanceUID.value, - SeriesInstanceUID: "" + data.SeriesInstanceUID.value, + PatientSex: getValue(data, "PatientSex"), + PatientAge: getValue(data, "PatientAge"), + ProtocolName: getValue(data, "ProtocolName"), + AcquisitionProtocolName: getValue(data, "AcquisitionProtocolName"), + AcquisitionProtocolDescription: getValue( + data, + "AcquisitionProtocolDescription", + ), + StudyInstanceUID: getValue(data, "StudyInstanceUID"), + SeriesInstanceUID: getValue(data, "SeriesInstanceUID"), NumberOfSeriesRelatedInstances, - PerformedStationAETitle: "" + data.PerformedStationAETitle.value, + PerformedStationAETitle: getValue(data, "PerformedStationAETitle"), }; } diff --git a/src/app.css b/src/app.css index 6b79447e8..a33b2182f 100644 --- a/src/app.css +++ b/src/app.css @@ -65,13 +65,13 @@ .small-button { width: 16px; height: 16px; - font-size: 0.8rem + font-size: 0.8rem; } .large-button { width: 24px; height: 24px; - font-size:1rem; + font-size: 1rem; } .button-style { @@ -81,5 +81,5 @@ display: flex !important; justify-content: center !important; align-items: center !important; - line-height:0 !important + line-height: 0 !important; } diff --git a/src/components/Pacs/PacsController.tsx b/src/components/Pacs/PacsController.tsx index 5d93388ba..eb17c7ef7 100644 --- a/src/components/Pacs/PacsController.tsx +++ b/src/components/Pacs/PacsController.tsx @@ -371,8 +371,9 @@ const PacsController: React.FC<PacsControllerProps> = ({ }, [preferences, studies]); const error = React.useMemo( - () => wsError || pfdcmServices.error?.message, - [wsError, pfdcmServices.error], + () => + wsError || pfdcmServices.error?.message || pfdcmStudies.error?.message, + [wsError, pfdcmServices.error, pfdcmStudies.error], ); // ======================================== From 7457f65fb6a30c966957a67983c9f528353d64d6 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 25 Oct 2024 12:02:03 -0400 Subject: [PATCH 322/337] feat: Update pipeline export --- src/app.css | 6 +- src/components/PipelinesCopy/index.tsx | 36 ++++++++- .../PipelinesCopy/useDownloadSource.tsx | 80 +++++++++++++++++++ .../Preview/displays/DcmDisplay.tsx | 1 + 4 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 src/components/PipelinesCopy/useDownloadSource.tsx diff --git a/src/app.css b/src/app.css index 6b79447e8..a33b2182f 100644 --- a/src/app.css +++ b/src/app.css @@ -65,13 +65,13 @@ .small-button { width: 16px; height: 16px; - font-size: 0.8rem + font-size: 0.8rem; } .large-button { width: 24px; height: 24px; - font-size:1rem; + font-size: 1rem; } .button-style { @@ -81,5 +81,5 @@ display: flex !important; justify-content: center !important; align-items: center !important; - line-height:0 !important + line-height: 0 !important; } diff --git a/src/components/PipelinesCopy/index.tsx b/src/components/PipelinesCopy/index.tsx index debc8d237..62eb05c06 100644 --- a/src/components/PipelinesCopy/index.tsx +++ b/src/components/PipelinesCopy/index.tsx @@ -5,25 +5,32 @@ import { MenuToggle, Pagination, TextInput, + Button, } from "@patternfly/react-core"; import SearchIcon from "@patternfly/react-icons/dist/esm/icons/search-icon"; import { useQuery, useQueryClient } from "@tanstack/react-query"; -import { Alert, Collapse } from "../Antd"; import { useContext, useState } from "react"; import { fetchPipelines, fetchResources } from "../../api/common"; +import { Alert, Collapse } from "../Antd"; import { EmptyStateComponent, SpinContainer } from "../Common"; import { ThemeContext } from "../DarkTheme/useTheme"; import { usePaginate } from "../Feeds/usePaginate"; import "./Pipelines.css"; -import PipelinesComponent from "./PipelinesComponent"; import PipelineUpload from "./PipelineUpload"; +import PipelinesComponent from "./PipelinesComponent"; import { PIPELINEQueryTypes, type PerPipelinePayload, PipelineContext, Types, } from "./context"; -import { useAppSelector } from "../../store/hooks"; +import { DownloadIcon } from "@patternfly/react-icons"; +import ChrisAPIClient from "../../api/chrisapiclient"; +import type { + PipelineSourceFile, + PipelineSourceFileList, +} from "@fnndsc/chrisapi"; +import { useDownloadSource } from "./useDownloadSource"; type LoadingResources = { [key: string]: boolean; @@ -170,6 +177,10 @@ const PipelinesCopy = () => { handlePipelineSearch(""); }; + /* Code to Download Pipeline Source Files */ + + const downloadPipelineMutation = useDownloadSource(); + return ( <div> <div @@ -238,7 +249,11 @@ const PipelinesCopy = () => { key: id, label: ( <div - style={{ display: "flex", justifyContent: "space-between" }} + style={{ + display: "flex", + justifyContent: "space-between", + alignItems: "center", + }} > <div style={{ display: "flex", flexDirection: "column" }}> <span>{name}</span> @@ -251,6 +266,19 @@ const PipelinesCopy = () => { {description} </span> </div> + <Button + variant="tertiary" + size="sm" + style={{ + padding: "0.5em", + }} + onClick={async (e) => { + e.stopPropagation(); + + downloadPipelineMutation.mutate(pipeline); + }} + icon={<DownloadIcon />} + /> </div> ), children: ( diff --git a/src/components/PipelinesCopy/useDownloadSource.tsx b/src/components/PipelinesCopy/useDownloadSource.tsx new file mode 100644 index 000000000..85497625b --- /dev/null +++ b/src/components/PipelinesCopy/useDownloadSource.tsx @@ -0,0 +1,80 @@ +// hooks/useDownloadPipeline.ts +import { useMutation } from "@tanstack/react-query"; +import { notification } from "antd"; +import ChrisAPIClient from "../../api/chrisapiclient"; +import type { + PipelineSourceFileList, + PipelineSourceFile, + Pipeline, +} from "@fnndsc/chrisapi"; + +const fetchPipelineSourceFiles = async (pipeline: Pipeline) => { + const client = ChrisAPIClient.getClient(); + const response: PipelineSourceFileList = await client.getPipelineSourceFiles({ + //@ts-ignore + pipeline_id: pipeline.data.id, + pipeline_name: pipeline.data.fname, + }); + + const arrayOfPipelines = response.getItems() as PipelineSourceFile[]; + + if (arrayOfPipelines.length === 0) { + throw new Error("Failed to find a source file"); + } + const neededPipeline = arrayOfPipelines.find( + (currentPipeline) => + currentPipeline.data.pipeline_name === pipeline.data.name, + ); + + if (!neededPipeline) { + throw new Error("Failed to find a source file"); + } + + // Get the file type (ftype) from the response + const fileType = neededPipeline.data.ftype || "txt"; // Default to 'txt' if ftype is undefined + + // Get the pipeline name and construct the file name with extension + const fileName = `${pipeline.data.name}.${fileType}`; + + // Get the file blob + const blob = await neededPipeline.getFileBlob(); + + // Create a URL for the blob + const url = window.URL.createObjectURL(blob); + + // Create a temporary anchor element + const a = document.createElement("a"); + a.href = url; + a.download = fileName; // Use the constructed file name + document.body.appendChild(a); + a.click(); + + // Clean up + document.body.removeChild(a); + window.URL.revokeObjectURL(url); + + return fileName; +}; + +export const useDownloadSource = () => { + const data = useMutation({ + mutationFn: fetchPipelineSourceFiles, + onError: (error: any) => { + notification.error({ + message: "Download Failed", + description: + error instanceof Error + ? error.message + : "An error occurred during download.", + }); + }, + onSuccess: (fileName: string) => { + notification.success({ + message: "Download Successful", + description: `The file "${fileName}" has been downloaded successfully.`, + }); + data.reset(); + }, + }); + return data; +}; diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 4347c21b3..81176bd44 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -195,6 +195,7 @@ const DcmDisplay = (props: DcmImageProps) => { queryKey: ["cornerstone-preview", fname], queryFn: previewFile, enabled: !!selectedFile && !!elementRef.current, + retry: false, }); useEffect(() => { From e82e70e98048658baed3b7dba9e4bd6a8e6ea515 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 25 Oct 2024 12:08:37 -0400 Subject: [PATCH 323/337] feat: Fix loading state --- src/components/Preview/displays/DcmDisplay.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 81176bd44..9fa2b1163 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -313,7 +313,7 @@ const DcmDisplay = (props: DcmImageProps) => { ); // Check if the first frame is still loading - const loadingFirstFrame = isLoading || !data; + const loadingFirstFrame = isLoading && !data; /** * Load more images when scrolling near the end. From 44640c3172b6825fd5a033068dbb03e8c7dc701c Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 25 Oct 2024 12:19:41 -0400 Subject: [PATCH 324/337] feat: debugging --- src/components/Preview/displays/DcmDisplay.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 9fa2b1163..664a31508 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -315,6 +315,8 @@ const DcmDisplay = (props: DcmImageProps) => { // Check if the first frame is still loading const loadingFirstFrame = isLoading && !data; + console.log("isError", isError); + /** * Load more images when scrolling near the end. * Also handles loading multi-frame images. From 3914af1741816a7e96ce32d144f547fc5c348b79 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 25 Oct 2024 14:12:54 -0400 Subject: [PATCH 325/337] feat: Update Dcm Display for ultrasounds --- package.json | 7 +- pnpm-lock.yaml | 1308 ++++++++--------- .../Preview/displays/DcmDisplay.tsx | 32 +- .../Preview/displays/dicomUtils/utils.ts | 70 +- 4 files changed, 650 insertions(+), 767 deletions(-) diff --git a/package.json b/package.json index 0903d470e..94385127a 100644 --- a/package.json +++ b/package.json @@ -39,10 +39,9 @@ }, "dependencies": { "@ant-design/icons": "^5.5.1", - "@cornerstonejs/core": "^1.84.4", - "@cornerstonejs/dicom-image-loader": "^1.84.4", - "@cornerstonejs/streaming-image-volume-loader": "^1.84.4", - "@cornerstonejs/tools": "^1.84.4", + "@cornerstonejs/core": "^1.86.0", + "@cornerstonejs/dicom-image-loader": "^1.86.0", + "@cornerstonejs/tools": "^1.86.0", "@fnndsc/chrisapi": "^1.22.0", "@niivue/niivue": "0.44.2", "@patternfly/react-catalog-view-extension": "^5.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 16df9a696..4678904ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,17 +12,14 @@ importers: specifier: ^5.5.1 version: 5.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@cornerstonejs/core': - specifier: ^1.84.4 - version: 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + specifier: ^1.86.0 + version: 1.86.0(@babel/preset-env@7.26.0(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.95.0)(wslink@2.2.1) '@cornerstonejs/dicom-image-loader': - specifier: ^1.84.4 - version: 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) - '@cornerstonejs/streaming-image-volume-loader': - specifier: ^1.84.4 - version: 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + specifier: ^1.86.0 + version: 1.86.0(@babel/preset-env@7.26.0(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.95.0)(wslink@2.2.1) '@cornerstonejs/tools': - specifier: ^1.84.4 - version: 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@icr/polyseg-wasm@0.4.0)(@kitware/vtk.js@30.4.1(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(autoprefixer@10.4.20(postcss@8.4.47))(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)(webpack@5.94.0)(wslink@2.2.1) + specifier: ^1.86.0 + version: 1.86.0(@babel/preset-env@7.26.0(@babel/core@7.25.2))(@icr/polyseg-wasm@0.4.0)(@kitware/vtk.js@30.4.1(@babel/preset-env@7.26.0(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.95.0)(wslink@2.2.1))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(autoprefixer@10.4.20(postcss@8.4.47))(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)(webpack@5.95.0)(wslink@2.2.1) '@fnndsc/chrisapi': specifier: ^1.22.0 version: 1.22.0 @@ -330,10 +327,18 @@ packages: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.26.0': + resolution: {integrity: sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.25.4': resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.0': + resolution: {integrity: sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==} + engines: {node: '>=6.9.0'} + '@babel/core@7.25.2': resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} @@ -342,30 +347,34 @@ packages: resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.6': - resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + '@babel/generator@7.26.0': + resolution: {integrity: sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.24.7': - resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': - resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.25.2': resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.25.4': - resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==} + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.25.2': - resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} + '@babel/helper-create-regexp-features-plugin@7.25.9': + resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -375,36 +384,50 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-member-expression-to-functions@7.24.8': - resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.24.7': resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.25.2': resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.24.7': - resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} '@babel/helper-plugin-utils@7.24.8': resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.0': - resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.25.0': - resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -413,24 +436,40 @@ packages: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': - resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + '@babel/helper-simple-access@7.25.9': + resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.24.8': resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.24.8': resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.0': - resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} engines: {node: '>=6.9.0'} '@babel/helpers@7.25.0': @@ -446,37 +485,37 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.25.6': - resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + '@babel/parser@7.26.0': + resolution: {integrity: sha512-aP8x5pIw3xvYr/sXT+SEUwyhrXT8rUJRZltK/qN3Db80dcKpTett8cJxHyjk+xYSVXvNnl2SfcJVjbwxpOSscA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3': - resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0': - resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0': - resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7': - resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0': - resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -487,102 +526,24 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-dynamic-import@7.8.3': - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-export-namespace-from@7.8.3': - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.25.6': - resolution: {integrity: sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==} + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.25.6': - resolution: {integrity: sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==} + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.24.7': resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.4': resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} engines: {node: '>=6.9.0'} @@ -595,302 +556,308 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.24.7': - resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.25.4': - resolution: {integrity: sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==} + '@babel/plugin-transform-async-generator-functions@7.25.9': + resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.24.7': - resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.24.7': - resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} + '@babel/plugin-transform-block-scoped-functions@7.25.9': + resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.25.0': - resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} + '@babel/plugin-transform-block-scoping@7.25.9': + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.25.4': - resolution: {integrity: sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==} + '@babel/plugin-transform-class-properties@7.25.9': + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.24.7': - resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.25.4': - resolution: {integrity: sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==} + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.24.7': - resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.24.8': - resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.24.7': - resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} + '@babel/plugin-transform-dotall-regex@7.25.9': + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.24.7': - resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} + '@babel/plugin-transform-duplicate-keys@7.25.9': + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0': - resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.24.7': - resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} + '@babel/plugin-transform-dynamic-import@7.25.9': + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.24.7': - resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} + '@babel/plugin-transform-exponentiation-operator@7.25.9': + resolution: {integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.24.7': - resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} + '@babel/plugin-transform-export-namespace-from@7.25.9': + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.24.7': - resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} + '@babel/plugin-transform-for-of@7.25.9': + resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.25.1': - resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.24.7': - resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} + '@babel/plugin-transform-json-strings@7.25.9': + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.25.2': - resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.24.7': - resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} + '@babel/plugin-transform-logical-assignment-operators@7.25.9': + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.24.7': - resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} + '@babel/plugin-transform-member-expression-literals@7.25.9': + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.24.7': - resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} + '@babel/plugin-transform-modules-amd@7.25.9': + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.24.8': - resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} + '@babel/plugin-transform-modules-commonjs@7.25.9': + resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.25.0': - resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} + '@babel/plugin-transform-modules-systemjs@7.25.9': + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.24.7': - resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} + '@babel/plugin-transform-modules-umd@7.25.9': + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.24.7': - resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.24.7': - resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} + '@babel/plugin-transform-new-target@7.25.9': + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.7': - resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': + resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.24.7': - resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} + '@babel/plugin-transform-numeric-separator@7.25.9': + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.24.7': - resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} + '@babel/plugin-transform-object-rest-spread@7.25.9': + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.24.7': - resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} + '@babel/plugin-transform-object-super@7.25.9': + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.24.7': - resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} + '@babel/plugin-transform-optional-catch-binding@7.25.9': + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.24.8': - resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} + '@babel/plugin-transform-optional-chaining@7.25.9': + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.24.7': - resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.25.4': - resolution: {integrity: sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==} + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.24.7': - resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.24.7': - resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} + '@babel/plugin-transform-property-literals@7.25.9': + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.24.7': - resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} + '@babel/plugin-transform-regenerator@7.25.9': + resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-reserved-words@7.24.7': - resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.25.9': + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.24.7': - resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.24.7': - resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.24.7': - resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.24.7': - resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} + '@babel/plugin-transform-template-literals@7.25.9': + resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.24.8': - resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} + '@babel/plugin-transform-typeof-symbol@7.25.9': + resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.24.7': - resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} + '@babel/plugin-transform-unicode-escapes@7.25.9': + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.24.7': - resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} + '@babel/plugin-transform-unicode-property-regex@7.25.9': + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.24.7': - resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.25.4': - resolution: {integrity: sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==} + '@babel/plugin-transform-unicode-sets-regex@7.25.9': + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.25.4': - resolution: {integrity: sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==} + '@babel/preset-env@7.26.0': + resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -900,9 +867,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/regjsgen@0.8.0': - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - '@babel/runtime-corejs3@7.25.9': resolution: {integrity: sha512-eHeq2HWhgn3aH6Gz4Dnajqp8U5DjBg3h933LlGJ52hAN6Kx34KAL7O3NzwTrldl9PrgKTyBcz0ScVIQ3A6e2fA==} engines: {node: '>=6.9.0'} @@ -923,20 +887,24 @@ packages: resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.4': resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.6': - resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} engines: {node: '>=6.9.0'} '@babel/types@7.25.4': resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.6': - resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -1011,17 +979,14 @@ packages: resolution: {integrity: sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==} engines: {node: '>=0.14'} - '@cornerstonejs/core@1.84.4': - resolution: {integrity: sha512-+6Sa5EUWVbXqiR/+tHFzzMrMO8V2mAmi1oQt3iiBIm5roXzU++1smsckWgsRdZOgfHhQbHjkdEixlfuMGToiaw==} - - '@cornerstonejs/dicom-image-loader@1.84.4': - resolution: {integrity: sha512-IFRKmau82ku0vaqAduc98HcObgCfeyzZdAfQ/HiYA4RfWMZSGJm9DQiZXW+VUzlzim+8HEdwOrKY79AK7GylLg==} + '@cornerstonejs/core@1.86.0': + resolution: {integrity: sha512-yY3TC5abtU4hgcyBONQo+S0MXYgRyWzV/8bWujXilugAj5moDakex/zMc+YGIKlp4PvQBBRFjbu0H8YW3pseSw==} - '@cornerstonejs/streaming-image-volume-loader@1.84.4': - resolution: {integrity: sha512-pspEAliroIAWk27MBcK2fc2Mm4M9SkbntXZJZMyiH42zufncm627HpJ4nzDHYkceNfyy+ifZynrH1/uF73QWDQ==} + '@cornerstonejs/dicom-image-loader@1.86.0': + resolution: {integrity: sha512-OPZCGdtdomj3TGktATQcLVIpTVv7ZqF8EyPgkEX+eIRXILzpu5Nm6gf3Lwofa5HVFwvmoJmVnU8jToKcoKPkqQ==} - '@cornerstonejs/tools@1.84.4': - resolution: {integrity: sha512-p2G811Xoez88hhYvIzHqXwsCjT0laLJc0hDREUapxqjcgL8FbKsIq+Pn8pWT2z/eYBcOW5ocXxnTRAs6mFRpuA==} + '@cornerstonejs/tools@1.86.0': + resolution: {integrity: sha512-yyy7r9Vo0NrTYYeKQtVqpbLRrVaequd9Q6aU2ifiNusdi6w+8Xslh1U/AHfw2Y9fueK8JBkLnKL+o/nLfdaOuQ==} peerDependencies: '@icr/polyseg-wasm': 0.4.0 '@kitware/vtk.js': 30.4.1 @@ -1696,9 +1661,6 @@ packages: '@types/node@22.5.5': resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} - '@types/node@22.6.1': - resolution: {integrity: sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==} - '@types/offscreencanvas@2019.7.3': resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} @@ -1992,6 +1954,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -2014,8 +1981,8 @@ packages: caniuse-lite@1.0.30001653: resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==} - caniuse-lite@1.0.30001663: - resolution: {integrity: sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==} + caniuse-lite@1.0.30001669: + resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} canvas-color-tracker@1.2.2: resolution: {integrity: sha512-r+u/Ft2ka4Rj274Ts4L9bhYZLuMvbuJ/yL4seP0s+Pi+i9CM0caD+Sd//yseS5EVBJ2SKSmq36h2mNYUCdmTfA==} @@ -2305,8 +2272,8 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-gpu@5.0.45: - resolution: {integrity: sha512-59oJS71ODAVPGMjBfyHPPOnM9efOhJpOliQZ8I1UG4p440PjYCVYWgAgY+BiO3JPe/BXbRzPAn+XbVqIESXkDQ==} + detect-gpu@5.0.53: + resolution: {integrity: sha512-RObVib0a6wjcNvljcTynCiqTGOV1pY+RnZojsdjr2tsI5fF8Uj4CFdsT7ccw4QQIAlO0l8FTYES+Pq64AirZQA==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -2342,6 +2309,9 @@ packages: electron-to-chromium@1.5.13: resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + electron-to-chromium@1.5.46: + resolution: {integrity: sha512-1XDk0Z8/YRgB2t5GeEg8DPK592DLjVmd/5uwAu6c/S4Z0CUwV/RwYqe5GWxQqcoN3bJ5U7hYMiMRPZzpCzSBhQ==} + email-validator@2.0.4: resolution: {integrity: sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==} engines: {node: '>4.0'} @@ -2390,6 +2360,10 @@ packages: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -2759,15 +2733,16 @@ packages: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -3660,12 +3635,15 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + regexpu-core@6.1.1: + resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==} engines: {node: '>=4'} - regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.11.1: + resolution: {integrity: sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==} hasBin: true release-zalgo@1.0.0: @@ -3717,9 +3695,6 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -3842,8 +3817,8 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -4011,6 +3986,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -4275,8 +4256,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - webpack@5.94.0: - resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==} + webpack@5.95.0: + resolution: {integrity: sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -4425,8 +4406,16 @@ snapshots: '@babel/highlight': 7.24.7 picocolors: 1.1.0 + '@babel/code-frame@7.26.0': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.0 + '@babel/compat-data@7.25.4': {} + '@babel/compat-data@7.26.0': {} + '@babel/core@7.25.2': dependencies: '@ampproject/remapping': 2.3.0 @@ -4454,21 +4443,22 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/generator@7.25.6': + '@babel/generator@7.26.0': dependencies: - '@babel/types': 7.25.6 + '@babel/parser': 7.26.0 + '@babel/types': 7.26.0 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + jsesc: 3.0.2 - '@babel/helper-annotate-as-pure@7.24.7': + '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.26.0 - '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -4480,41 +4470,49 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.25.2)': + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.0 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/traverse': 7.25.6 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.25.9 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2)': + '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - regexpu-core: 5.3.2 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.1.1 semver: 6.3.1 '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 debug: 4.3.7 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: - supports-color - '@babel/helper-member-expression-to-functions@7.24.8': + '@babel/helper-member-expression-to-functions@7.25.9': dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -4525,6 +4523,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -4535,27 +4540,38 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.24.7': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.25.2)': dependencies: - '@babel/types': 7.25.6 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.0 '@babel/helper-plugin-utils@7.24.8': {} - '@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2)': + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-wrap-function': 7.25.0 - '@babel/traverse': 7.25.6 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2)': + '@babel/helper-replace-supers@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/traverse': 7.25.6 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -4566,24 +4582,37 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + '@babel/helper-simple-access@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color '@babel/helper-string-parser@7.24.8': {} + '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-option@7.24.8': {} - '@babel/helper-wrap-function@7.25.0': + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helper-wrap-function@7.25.9': dependencies: - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -4603,42 +4632,42 @@ snapshots: dependencies: '@babel/types': 7.25.4 - '@babel/parser@7.25.6': + '@babel/parser@7.26.0': dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.26.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.6 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.6 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -4646,96 +4675,21 @@ snapshots: dependencies: '@babel/core': 7.25.2 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-import-assertions@7.25.6(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.25.2)': + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -4744,418 +4698,398 @@ snapshots: '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-async-generator-functions@7.25.4(@babel/core@7.25.2)': + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/traverse': 7.25.6 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.25.2) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-class-properties@7.25.4(@babel/core@7.25.2)': + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.4(@babel/core@7.25.2)': + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) - '@babel/traverse': 7.25.6 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.25.2) + '@babel/traverse': 7.25.9 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/template': 7.25.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 - '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2)': + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2)': + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.6 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2)': + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2)': + '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-simple-access': 7.24.7 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-simple-access': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.6 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.25.2) - '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2)': + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-private-methods@7.25.4(@babel/core@7.25.2)': + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 regenerator-transform: 0.15.2 - '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2)': + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-unicode-sets-regex@7.25.4(@babel/core@7.25.2)': + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/preset-env@7.25.4(@babel/core@7.25.2)': + '@babel/preset-env@7.26.0(@babel/core@7.25.2)': dependencies: - '@babel/compat-data': 7.25.4 + '@babel/compat-data': 7.26.0 '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.25.2) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2) + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.25.2) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-import-assertions': 7.25.6(@babel/core@7.25.2) - '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.25.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.25.2) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) - '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-async-generator-functions': 7.25.4(@babel/core@7.25.2) - '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-transform-class-properties': 7.25.4(@babel/core@7.25.2) - '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-classes': 7.25.4(@babel/core@7.25.2) - '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) - '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) - '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-private-methods': 7.25.4(@babel/core@7.25.2) - '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-sets-regex': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.25.2) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) @@ -5168,12 +5102,10 @@ snapshots: '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/types': 7.25.6 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.25.4 esutils: 2.0.3 - '@babel/regjsgen@0.8.0': {} - '@babel/runtime-corejs3@7.25.9': dependencies: core-js-pure: 3.38.1 @@ -5197,6 +5129,12 @@ snapshots: '@babel/parser': 7.25.4 '@babel/types': 7.25.4 + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.0 + '@babel/parser': 7.26.0 + '@babel/types': 7.26.0 + '@babel/traverse@7.25.4': dependencies: '@babel/code-frame': 7.24.7 @@ -5209,13 +5147,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.25.6': + '@babel/traverse@7.25.9': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 + '@babel/code-frame': 7.26.0 + '@babel/generator': 7.26.0 + '@babel/parser': 7.26.0 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: @@ -5227,11 +5165,10 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - '@babel/types@7.25.6': + '@babel/types@7.26.0': dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 '@bcoe/v8-coverage@0.2.3': {} @@ -5278,11 +5215,11 @@ snapshots: '@cornerstonejs/codec-openjph@2.4.5': {} - '@cornerstonejs/core@1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1)': + '@cornerstonejs/core@1.86.0(@babel/preset-env@7.26.0(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.95.0)(wslink@2.2.1)': dependencies: - '@kitware/vtk.js': 30.4.1(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + '@kitware/vtk.js': 30.4.1(@babel/preset-env@7.26.0(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.95.0)(wslink@2.2.1) comlink: 4.4.1 - detect-gpu: 5.0.45 + detect-gpu: 5.0.53 gl-matrix: 3.4.3 lodash.clonedeep: 4.5.0 transitivePeerDependencies: @@ -5291,13 +5228,13 @@ snapshots: - webpack - wslink - '@cornerstonejs/dicom-image-loader@1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1)': + '@cornerstonejs/dicom-image-loader@1.86.0(@babel/preset-env@7.26.0(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.95.0)(wslink@2.2.1)': 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 - '@cornerstonejs/core': 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + '@cornerstonejs/core': 1.86.0(@babel/preset-env@7.26.0(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.95.0)(wslink@2.2.1) dicom-parser: 1.8.21 pako: 2.1.0 uuid: 9.0.1 @@ -5307,21 +5244,11 @@ snapshots: - webpack - wslink - '@cornerstonejs/streaming-image-volume-loader@1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1)': + '@cornerstonejs/tools@1.86.0(@babel/preset-env@7.26.0(@babel/core@7.25.2))(@icr/polyseg-wasm@0.4.0)(@kitware/vtk.js@30.4.1(@babel/preset-env@7.26.0(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.95.0)(wslink@2.2.1))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(autoprefixer@10.4.20(postcss@8.4.47))(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)(webpack@5.95.0)(wslink@2.2.1)': dependencies: - '@cornerstonejs/core': 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) - comlink: 4.4.1 - transitivePeerDependencies: - - '@babel/preset-env' - - autoprefixer - - webpack - - wslink - - '@cornerstonejs/tools@1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@icr/polyseg-wasm@0.4.0)(@kitware/vtk.js@30.4.1(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(autoprefixer@10.4.20(postcss@8.4.47))(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)(webpack@5.94.0)(wslink@2.2.1)': - dependencies: - '@cornerstonejs/core': 1.84.4(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + '@cornerstonejs/core': 1.86.0(@babel/preset-env@7.26.0(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.95.0)(wslink@2.2.1) '@icr/polyseg-wasm': 0.4.0 - '@kitware/vtk.js': 30.4.1(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1) + '@kitware/vtk.js': 30.4.1(@babel/preset-env@7.26.0(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.95.0)(wslink@2.2.1) '@types/d3-array': 3.2.1 '@types/d3-interpolate': 3.0.4 '@types/offscreencanvas': 2019.7.3 @@ -5464,9 +5391,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@kitware/vtk.js@30.4.1(@babel/preset-env@7.25.4(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.94.0)(wslink@2.2.1)': + '@kitware/vtk.js@30.4.1(@babel/preset-env@7.26.0(@babel/core@7.25.2))(autoprefixer@10.4.20(postcss@8.4.47))(webpack@5.95.0)(wslink@2.2.1)': dependencies: - '@babel/preset-env': 7.25.4(@babel/core@7.25.2) + '@babel/preset-env': 7.26.0(@babel/core@7.25.2) '@babel/runtime': 7.22.11 '@types/webxr': 0.5.20 autoprefixer: 10.4.20(postcss@8.4.47) @@ -5482,7 +5409,7 @@ snapshots: spark-md5: 3.0.2 stream-browserify: 3.0.0 webworker-promise: 0.5.0 - worker-loader: 3.0.8(webpack@5.94.0) + worker-loader: 3.0.8(webpack@5.95.0) wslink: 2.2.1 xmlbuilder2: 3.0.2 transitivePeerDependencies: @@ -5961,10 +5888,6 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@22.6.1': - dependencies: - undici-types: 6.19.8 - '@types/offscreencanvas@2019.7.3': {} '@types/parse-json@4.0.2': {} @@ -6280,7 +6203,7 @@ snapshots: autoprefixer@10.4.20(postcss@8.4.47): dependencies: browserslist: 4.23.3 - caniuse-lite: 1.0.30001663 + caniuse-lite: 1.0.30001653 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.0 @@ -6303,7 +6226,7 @@ snapshots: babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): dependencies: - '@babel/compat-data': 7.25.4 + '@babel/compat-data': 7.26.0 '@babel/core': 7.25.2 '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) semver: 6.3.1 @@ -6356,6 +6279,13 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) + browserslist@4.24.2: + dependencies: + caniuse-lite: 1.0.30001669 + electron-to-chromium: 1.5.46 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) + buffer-from@1.1.2: {} cac@6.7.14: {} @@ -6373,7 +6303,7 @@ snapshots: caniuse-lite@1.0.30001653: {} - caniuse-lite@1.0.30001663: {} + caniuse-lite@1.0.30001669: {} canvas-color-tracker@1.2.2: dependencies: @@ -6648,7 +6578,7 @@ snapshots: dequal@2.0.3: {} - detect-gpu@5.0.45: + detect-gpu@5.0.53: dependencies: webgl-constants: 1.1.1 @@ -6689,6 +6619,8 @@ snapshots: electron-to-chromium@1.5.13: {} + electron-to-chromium@1.5.46: {} + email-validator@2.0.4: {} emoji-regex@8.0.0: {} @@ -6746,6 +6678,8 @@ snapshots: escalade@3.1.2: {} + escalade@3.2.0: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} @@ -7097,7 +7031,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.6.1 + '@types/node': 22.5.5 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -7115,10 +7049,10 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - jsesc@0.5.0: {} - jsesc@2.5.2: {} + jsesc@3.0.2: {} + json-parse-even-better-errors@2.3.1: {} json-schema-traverse@0.4.1: {} @@ -8169,7 +8103,7 @@ snapshots: readable-stream@3.6.2: dependencies: inherits: 2.0.4 - string_decoder: 1.1.1 + string_decoder: 1.3.0 util-deprecate: 1.0.2 rechoir@0.6.2: @@ -8207,18 +8141,20 @@ snapshots: dependencies: '@babel/runtime': 7.25.6 - regexpu-core@5.3.2: + regexpu-core@6.1.1: dependencies: - '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 regenerate-unicode-properties: 10.2.0 - regjsparser: 0.9.1 + regjsgen: 0.8.0 + regjsparser: 0.11.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.0 - regjsparser@0.9.1: + regjsgen@0.8.0: {} + + regjsparser@0.11.1: dependencies: - jsesc: 0.5.0 + jsesc: 3.0.2 release-zalgo@1.0.0: dependencies: @@ -8276,8 +8212,6 @@ snapshots: dependencies: tslib: 2.7.0 - safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} sanitize-html@2.13.0: @@ -8394,9 +8328,9 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string_decoder@1.1.1: + string_decoder@1.3.0: dependencies: - safe-buffer: 5.1.2 + safe-buffer: 5.2.1 strip-ansi@6.0.1: dependencies: @@ -8432,14 +8366,14 @@ snapshots: tapable@2.2.1: {} - terser-webpack-plugin@5.3.10(webpack@5.94.0): + terser-webpack-plugin@5.3.10(webpack@5.95.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.33.0 - webpack: 5.94.0 + webpack: 5.95.0 terser@5.33.0: dependencies: @@ -8534,6 +8468,12 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 + update-browserslist-db@1.1.1(browserslist@4.24.2): + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.0 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -8853,7 +8793,7 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.94.0: + webpack@5.95.0: dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -8875,7 +8815,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.94.0) + terser-webpack-plugin: 5.3.10(webpack@5.95.0) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -8903,11 +8843,11 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - worker-loader@3.0.8(webpack@5.94.0): + worker-loader@3.0.8(webpack@5.95.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.94.0 + webpack: 5.95.0 wrap-ansi@6.2.0: dependencies: diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 664a31508..c25c2de29 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -122,7 +122,7 @@ const DcmDisplay = (props: DcmImageProps) => { * If the image is already cached, it uses the cached data. * Otherwise, it loads the image and caches it. */ - const previewFile = useCallback(async () => { + const previewFile = async () => { try { if (!elementRef.current) return {}; const existingImageEntry = cacheStack?.[fname]; @@ -162,7 +162,7 @@ const DcmDisplay = (props: DcmImageProps) => { framesCount > 1 ? Array.from( { length: framesCount }, - (_, i) => `${imageID}?frame=${i}`, + (_, i) => `${imageID}#frame=${i + 1}`, ) : imageID; @@ -173,7 +173,7 @@ const DcmDisplay = (props: DcmImageProps) => { const elementId = `cornerstone-element-${fname}`; const { viewport, renderingEngine } = await displayDicomImage( elementRef.current, - framesCount > 1 ? framesList[0] : imageID, + framesCount > 1 ? framesList : [imageID], elementId, ); @@ -188,7 +188,7 @@ const DcmDisplay = (props: DcmImageProps) => { // biome-ignore lint/complexity/noUselessCatch: <explanation> throw e; } - }, [selectedFile, cacheStack, fname, currentImageIndex, selectedIndex]); + }; // Use React Query to fetch and cache the preview data const { isLoading, data, isError, error } = useQuery({ @@ -240,18 +240,6 @@ const DcmDisplay = (props: DcmImageProps) => { }; }, [stopCinePlay]); - /** - * Load multi-frame images into the viewport. - */ - const loadMultiFrames = useCallback(async () => { - if (activeViewportRef.current) { - const currentIndex = activeViewportRef.current.getCurrentImageIdIndex(); - const imageIDs = imageStack[fname] as string[]; - await activeViewportRef.current.setStack(imageIDs, currentIndex); - activeViewportRef.current.render(); - } - }, [imageStack, fname]); - /** * Generator function to yield image files starting from a specific index. */ @@ -315,8 +303,6 @@ const DcmDisplay = (props: DcmImageProps) => { // Check if the first frame is still loading const loadingFirstFrame = isLoading && !data; - console.log("isError", isError); - /** * Load more images when scrolling near the end. * Also handles loading multi-frame images. @@ -324,17 +310,14 @@ const DcmDisplay = (props: DcmImageProps) => { useEffect(() => { if ( !loadingFirstFrame && - !Array.isArray(data?.[selectedFile.data.fname]) && + data && + !Array.isArray(data[fname]) && filteredList.length > lastLoadedIndex && Object.keys(cacheStack).length !== filteredList.length && !multiFrameDisplay ) { loadMoreImages(filteredList); } - - if (!loadingFirstFrame && multiFrameDisplay) { - loadMultiFrames(); - } }, [ loadingFirstFrame, filteredList, @@ -342,9 +325,8 @@ const DcmDisplay = (props: DcmImageProps) => { cacheStack, multiFrameDisplay, loadMoreImages, - loadMultiFrames, data, - selectedFile, + fname, ]); /** diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index d6210bf72..cc609aabf 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -5,13 +5,8 @@ import { RenderingEngine, type Types, init, - volumeLoader, } from "@cornerstonejs/core"; import cornerstonejsDICOMImageLoader from "@cornerstonejs/dicom-image-loader"; -import { - cornerstoneStreamingDynamicImageVolumeLoader, - cornerstoneStreamingImageVolumeLoader, -} from "@cornerstonejs/streaming-image-volume-loader"; import * as cornerstoneTools from "@cornerstonejs/tools"; import { type Types as CornerstoneToolTypes, @@ -142,28 +137,11 @@ export const initializeCornerstoneForDicoms = () => { cornerstonejsDICOMImageLoader.webWorkerManager.initialize(config); }; -function initVolumeLoader() { - volumeLoader.registerUnknownVolumeLoader( - //@ts-ignore - cornerstoneStreamingImageVolumeLoader, - ); - volumeLoader.registerVolumeLoader( - "cornerstoneStreamingImageVolume", - //@ts-ignore - cornerstoneStreamingImageVolumeLoader, - ); - volumeLoader.registerVolumeLoader( - "cornerstoneStreamingDynamicImageVolume", - //@ts-ignore - cornerstoneStreamingDynamicImageVolumeLoader, - ); -} - export const basicInit = async () => { cornerstone.setUseSharedArrayBuffer(Enums.SharedArrayBufferModes.FALSE); initProviders(); initializeCornerstoneForDicoms(); - initVolumeLoader(); + await init(); csToolsInit(); }; @@ -196,43 +174,28 @@ export const handleEvents = ( export const loadDicomImage = async (blob: Blob) => { try { + // Generate a unique file ID for the blob const imageID = cornerstonejsDICOMImageLoader.wadouri.fileManager.add(blob); + // Load the image using Cornerstone; this ensures the image and metadata are available + await cornerstone.imageLoader.loadImage(imageID); - let bufferSize = 256 * 1024; // Start with 256 KB - const maxBufferSize = 5 * 1024 * 1024; // Maximum 5 MB + // Retrieve metadata using the metadata provider + const generalImageModule = await cornerstone.metaData.get( + "multiframeModule", + imageID, + ); - let arrayBuffer: ArrayBuffer; - let dataSet: dicomParser.DataSet | undefined = undefined; + // Extract the Number of Frames; default to 1 if not available + const framesCount = generalImageModule?.NumberOfFrames + ? Number.parseInt(generalImageModule.NumberOfFrames, 10) + : 1; - while (bufferSize <= maxBufferSize) { - arrayBuffer = await blob.slice(0, bufferSize).arrayBuffer(); - try { - dataSet = dicomParser.parseDicom(new Uint8Array(arrayBuffer), { - untilTag: "x00280008", - }); - break; // Parsing succeeded, exit the loop - } catch (error: any) { - if (error?.exception?.includes("buffer overrun")) { - // Increase the buffer size and try again - bufferSize *= 2; // Double the buffer size - } else { - // Other parsing error - throw error; - } - } - } - if (!dataSet) { - throw new Error("Unable to parse DICOM file within buffer size limit."); - } - // Get the Number of Frames - const numberOfFramesString = dataSet.string("x00280008") || "1"; - const framesCount = Number.parseInt(numberOfFramesString, 10); return { imageID, framesCount, }; } catch (e) { - throw new Error("Error parsing the DICOM file"); + throw new Error(`Error loading the DICOM image: ${(e as Error).message}`); } }; @@ -281,7 +244,7 @@ function createDisplayArea( export const displayDicomImage = async ( element: HTMLDivElement, - imageId: string, + imageIds: string[], uniqueId: string, ): Promise<{ viewport: Types.IStackViewport; @@ -290,7 +253,6 @@ export const displayDicomImage = async ( try { const viewportId = uniqueId; const renderingEngineId = `myRenderingEngine_${uniqueId}`; - const imageIds = [imageId]; const renderingEngine = new RenderingEngine(renderingEngineId); const viewportInput = { viewportId, @@ -307,9 +269,9 @@ export const displayDicomImage = async ( viewport.setProperties(displayArea); await viewport.setStack(imageIds); cornerstoneTools.utilities.stackPrefetch.enable(viewport.element); - viewport.render(); // Set the stack scroll mouse wheel tool toolGroup?.setToolActive(StackScrollMouseWheelTool.toolName); + viewport.render(); return { viewport, renderingEngine, From fd5b1e9e23a6d2ff43af0bce1c16105613c91cae Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 25 Oct 2024 15:30:06 -0400 Subject: [PATCH 326/337] feat: Use cine tools from cornerstone instead of custom implementation --- .../Preview/displays/DcmDisplay.tsx | 86 +++++++++---------- .../Preview/displays/dicomUtils/utils.ts | 4 + 2 files changed, 46 insertions(+), 44 deletions(-) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index c25c2de29..126be85fb 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -12,7 +12,9 @@ import { displayDicomImage, handleEvents, loadDicomImage, + playClip, setUpTooling, + stopClip, } from "./dicomUtils/utils"; import type { IStackViewport } from "./dicomUtils/utils"; @@ -59,7 +61,6 @@ const DcmDisplay = (props: DcmImageProps) => { const cacheRef = useRef<{ [key: string]: ImageStackType }>({ [CACHE_KEY]: {}, }); - const cineIntervalIdRef = useRef<NodeJS.Timeout | null>(null); // Derived values const size = useSize(dicomImageRef); @@ -213,9 +214,8 @@ const DcmDisplay = (props: DcmImageProps) => { * Stop cine playback. */ const stopCinePlay = useCallback(() => { - if (cineIntervalIdRef.current) { - clearInterval(cineIntervalIdRef.current); - cineIntervalIdRef.current = null; + if (elementRef.current) { + stopClip(elementRef.current); } }, []); @@ -240,6 +240,44 @@ const DcmDisplay = (props: DcmImageProps) => { }; }, [stopCinePlay]); + /** + * Start cine playback. + */ + + const startCinePlay = useCallback(() => { + if (elementRef.current) { + const clipOptions = { + framesPerSecond: 24, + loop: true, + }; + + try { + playClip(elementRef.current, clipOptions); + } catch (error) { + notification.error({ message: "Failed to play this clip" }); + } + } else { + notification.error({ + message: "Cine playback cannot start: conditions not met.", + }); + } + }, []); + + /** + * Manage cine playback based on `actionState["Play"]` state. + */ + useEffect(() => { + const isPlaying = actionState.Play === true; + if (isPlaying) { + startCinePlay(); + } else { + stopCinePlay(); + } + return () => { + stopCinePlay(); + }; + }, [actionState.Play, startCinePlay, stopCinePlay]); + /** * Generator function to yield image files starting from a specific index. */ @@ -396,46 +434,6 @@ const DcmDisplay = (props: DcmImageProps) => { .padStart(totalDigits, "0"); const imageCountDisplay = imageCount.toString().padStart(totalDigits, "0"); - /** - * Start cine playback. - */ - const startCinePlay = useCallback(() => { - if ( - cineIntervalIdRef.current || - !activeViewportRef.current || - !imageStack[fname] || - imageCount <= 1 - ) - return; - - const defaultPlaybackSpeed = 24; // Default playback speed (fps) - const frameDuration = 1000 / defaultPlaybackSpeed; // Frame duration in milliseconds - - cineIntervalIdRef.current = setInterval(() => { - if (activeViewportRef.current) { - let currentIndex = activeViewportRef.current.getCurrentImageIdIndex(); - currentIndex = (currentIndex + 1) % imageCount; - activeViewportRef.current.setImageIdIndex(currentIndex); - setCurrentImageIndex(currentIndex); - } - }, frameDuration); - }, [imageStack, fname, imageCount]); - - /** - * Manage cine playback based on `actionState["Play"]` state. - */ - useEffect(() => { - const isPlaying = actionState.Play === true; - if (isPlaying && imageCount > 1) { - startCinePlay(); - } else { - stopCinePlay(); - } - return () => { - stopCinePlay(); - }; - }, [actionState.Play, startCinePlay, stopCinePlay, imageCount]); - /* Manage Tooling */ useEffect(() => { if (actionState && activeViewportRef.current) { diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index cc609aabf..7ee3b5bc3 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -33,12 +33,16 @@ const { LengthTool, ToolGroupManager, Enums: csToolsEnums, + utilities, } = cornerstoneTools; const { MouseBindings } = csToolsEnums; export const events = EVENTS; let toolGroup: CornerstoneToolTypes.IToolGroup | undefined; +export const stopClip = utilities.cine.stopClip; +export const playClip = utilities.cine.playClip; + function initProviders() { cornerstone.metaData.addProvider( ptScalingMetaDataProvider.get.bind(ptScalingMetaDataProvider), From e5dfd6f94ff2c3a0172ee12645505ddf4fc4bb9b Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Fri, 25 Oct 2024 16:53:58 -0400 Subject: [PATCH 327/337] feat: minor bug fix --- src/components/PipelinesCopy/useDownloadSource.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/PipelinesCopy/useDownloadSource.tsx b/src/components/PipelinesCopy/useDownloadSource.tsx index 85497625b..4469ab506 100644 --- a/src/components/PipelinesCopy/useDownloadSource.tsx +++ b/src/components/PipelinesCopy/useDownloadSource.tsx @@ -71,7 +71,7 @@ export const useDownloadSource = () => { onSuccess: (fileName: string) => { notification.success({ message: "Download Successful", - description: `The file "${fileName}" has been downloaded successfully.`, + description: `The pipeline "${fileName}" has been downloaded successfully.`, }); data.reset(); }, From 1ba5094f5bcc9781ff7c3064b2f12213df7b260e Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Tue, 29 Oct 2024 16:27:02 -0400 Subject: [PATCH 328/337] feat: Add progress bar to dicom display --- .../FeedOutputBrowser/FileBrowser.tsx | 2 +- src/components/Feeds/FeedListView.tsx | 30 +++++++------ .../Preview/displays/DcmDisplay.tsx | 43 ++++++++++++++++--- .../Preview/displays/NiiVueDisplay.tsx | 19 +------- .../Preview/displays/dicomUtils/utils.ts | 19 ++++++++ 5 files changed, 75 insertions(+), 38 deletions(-) diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 56363f868..9036a9057 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -74,7 +74,7 @@ const FileBrowser = (props: FileBrowserProps) => { const selectedFile = useAppSelector((state) => state.explorer.selectedFile); const drawerState = useAppSelector((state) => state.drawers); const username = useAppSelector((state) => state.user.username); - const { subFoldersMap, linkFilesMap, filesMap, filesPagination, folderList } = + const { subFoldersMap, linkFilesMap, filesMap, folderList } = pluginFilesPayload; const breadcrumb = additionalKey.split("/"); const currentPath = `home/${username}/feeds/feed_${feed?.data.id}/${selected?.data.plugin_name}_${selected?.data.id}/data`; diff --git a/src/components/Feeds/FeedListView.tsx b/src/components/Feeds/FeedListView.tsx index 4fb0675a6..68877cc05 100644 --- a/src/components/Feeds/FeedListView.tsx +++ b/src/components/Feeds/FeedListView.tsx @@ -305,20 +305,22 @@ const TableSelectable: React.FC = () => { </div> </div> - <Operations - origin={{ - type: OperationContext.FEEDS, - additionalKeys: [perPage, page, type, search, searchType], - }} - customStyle={{ - toolbarItem: { paddingInlineStart: "0" }, - toolbar: { - paddingTop: "0", - paddingBottom: "0", - background: "inherit", - }, - }} - /> + {isLoggedIn && ( + <Operations + origin={{ + type: OperationContext.FEEDS, + additionalKeys: [perPage, page, type, search, searchType], + }} + customStyle={{ + toolbarItem: { paddingInlineStart: "0" }, + toolbar: { + paddingTop: "0", + paddingBottom: "0", + background: "inherit", + }, + }} + /> + )} </PageSection> <PageSection style={{ paddingBlockStart: "0.5em" }}> {loadingFeedState ? ( diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 126be85fb..fb42614aa 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -1,5 +1,6 @@ import type { RenderingEngine } from "@cornerstonejs/core"; import { useQuery } from "@tanstack/react-query"; +import axios, { type AxiosProgressEvent } from "axios"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { type IFileBlob, getFileExtension } from "../../../api/model"; import { notification } from "../../Antd"; @@ -8,6 +9,7 @@ import useSize from "../../FeedTree/useSize"; import type { ActionState } from "../FileDetailView"; import { events, + type IStackViewport, basicInit, displayDicomImage, handleEvents, @@ -15,8 +17,9 @@ import { playClip, setUpTooling, stopClip, + stupidlyGetFileResourceUrl, } from "./dicomUtils/utils"; -import type { IStackViewport } from "./dicomUtils/utils"; +import { Progress } from "antd"; export type DcmImageProps = { selectedFile: IFileBlob; @@ -52,6 +55,7 @@ const DcmDisplay = (props: DcmImageProps) => { const [multiFrameDisplay, setMultiFrameDisplay] = useState(false); const [isLoadingMore, setIsLoadingMore] = useState(false); const [lastLoadedIndex, setLastLoadedIndex] = useState(0); + const [downloadProgress, setDownloadProgress] = useState(0); // Refs const dicomImageRef = useRef<HTMLDivElement>(null); @@ -118,6 +122,31 @@ const DcmDisplay = (props: DcmImageProps) => { [filteredList, selectedFile.data.id], ); + /** Fetch File Blob */ + + const downloadDicomFile = async (url: string, token: string) => { + try { + const response = await axios.get(url, { + responseType: "blob", + headers: { + Authorization: `Token ${token}`, + }, + onDownloadProgress: (progressEvent: AxiosProgressEvent) => { + if (progressEvent.total) { + const percentCompleted = Math.round( + (progressEvent.loaded * 100) / progressEvent.total, + ); + setDownloadProgress(percentCompleted); + } + }, + }); + return response.data; // This is the Blob + } catch (e) { + // biome-ignore lint/complexity/noUselessCatch: <explanation> + throw e; + } + }; + /** * Preview the selected DICOM file. * If the image is already cached, it uses the cached data. @@ -155,7 +184,9 @@ const DcmDisplay = (props: DcmImageProps) => { } // Load new image if not in cache - const blob = await selectedFile.getFileBlob(); + + const url = stupidlyGetFileResourceUrl(selectedFile); + const blob = await downloadDicomFile(url, selectedFile.auth.token); const imageData = await loadDicomImage(blob); const { framesCount, imageID } = imageData; @@ -186,8 +217,7 @@ const DcmDisplay = (props: DcmImageProps) => { cacheRef.current[CACHE_KEY] = newImageStack; return newImageStack; } catch (e) { - // biome-ignore lint/complexity/noUselessCatch: <explanation> - throw e; + throw new Error("Failed to load the dicom image"); } }; @@ -201,6 +231,7 @@ const DcmDisplay = (props: DcmImageProps) => { useEffect(() => { if (isError) { + console.log("Error", error); notification.error({ message: "Error Loading DICOM Image", description: @@ -443,7 +474,9 @@ const DcmDisplay = (props: DcmImageProps) => { return ( <> - {loadingFirstFrame && <SpinContainer title="Displaying image..." />} + {downloadProgress > 0 && downloadProgress < 100 && ( + <Progress percent={downloadProgress} /> + )} <div id="content" ref={dicomImageRef} diff --git a/src/components/Preview/displays/NiiVueDisplay.tsx b/src/components/Preview/displays/NiiVueDisplay.tsx index d1a58e797..75e5facf4 100644 --- a/src/components/Preview/displays/NiiVueDisplay.tsx +++ b/src/components/Preview/displays/NiiVueDisplay.tsx @@ -1,4 +1,3 @@ -import { Collection } from "@fnndsc/chrisapi"; import { SLICE_TYPE } from "@niivue/niivue"; import { FreeSurferColorLUT, @@ -9,6 +8,7 @@ import React from "react"; import type { IFileBlob } from "../../../api/model.ts"; import SizedNiivueCanvas from "../../SizedNiivueCanvas"; import styles from "./NiiVueDisplay.module.css"; +import { stupidlyGetFileResourceUrl } from "./dicomUtils/utils.ts"; type NiiVueDisplayProps = { selectedFile?: IFileBlob; @@ -97,22 +97,5 @@ const NiiVueDisplay: React.FC<NiiVueDisplayProps> = ({ selectedFile }) => { ); }; -/** - * Get the `file_resource` URL. (Collection+JSON is very annoying). - * - * FIXME: there is a huge inefficiency here. - * Prior to the rendering of the {@link NiiVueDisplay} component, the file - * data was already retrieved by ChRIS_ui, and its blob data are stored in - * the props. But for NiiVue to work (well) it wants the file's URL to - * retrieve the file itself. So the file is retrieved a total of two times, - * even though it should only be retrieved once. - */ -function stupidlyGetFileResourceUrl(file: IFileBlob): string { - return Collection.getLinkRelationUrls( - file?.collection.items[0], - "file_resource", - )[0]; -} - const MemoedNiiVueDisplay = React.memo(NiiVueDisplay); export default MemoedNiiVueDisplay; diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index 7ee3b5bc3..e9418b231 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -14,6 +14,8 @@ import { } from "@cornerstonejs/tools"; import dicomParser from "dicom-parser"; import ptScalingMetaDataProvider from "./ptScalingMetaDataProvider"; +import type { IFileBlob } from "../../../../api/model"; +import { Collection } from "@fnndsc/chrisapi"; //@ts-ignore window.cornerstone = cornerstone; @@ -284,3 +286,20 @@ export const displayDicomImage = async ( throw new Error(e as string); } }; + +/** + * Get the `file_resource` URL. (Collection+JSON is very annoying). + * + * FIXME: there is a huge inefficiency here. + * Prior to the rendering of the {@link NiiVueDisplay} component, the file + * data was already retrieved by ChRIS_ui, and its blob data are stored in + * the props. But for NiiVue to work (well) it wants the file's URL to + * retrieve the file itself. So the file is retrieved a total of two times, + * even though it should only be retrieved once. + */ +export function stupidlyGetFileResourceUrl(file: IFileBlob): string { + return Collection.getLinkRelationUrls( + file?.collection.items[0], + "file_resource", + )[0]; +} From 73e40f6dd2ce6a01e19a109772071cb398a284b5 Mon Sep 17 00:00:00 2001 From: PintoGideon <gideonpinto123@gmail.com> Date: Wed, 30 Oct 2024 11:37:06 -0400 Subject: [PATCH 329/337] feat: Update the ui to show file upload progress indicators --- src/components/NewLibrary/components/Cart.tsx | 150 +++++++++++------- .../NewLibrary/components/RadialProgress.tsx | 31 ---- src/components/NewLibrary/utils/longpress.tsx | 10 ++ .../Preview/displays/DcmDisplay.tsx | 10 +- src/store/cart/cartSlice.ts | 16 +- src/store/cart/types.ts | 2 + src/store/cart/uploadSaga.ts | 15 +- 7 files changed, 139 insertions(+), 95 deletions(-) delete mode 100644 src/components/NewLibrary/components/RadialProgress.tsx diff --git a/src/components/NewLibrary/components/Cart.tsx b/src/components/NewLibrary/components/Cart.tsx index 17fb0eb2e..819d3948c 100644 --- a/src/components/NewLibrary/components/Cart.tsx +++ b/src/components/NewLibrary/components/Cart.tsx @@ -21,9 +21,13 @@ import { useAppDispatch, useAppSelector } from "../../../store/hooks"; import { Drawer, List, Popconfirm, Space } from "../../Antd"; import { DotsIndicator, EmptyStateComponent } from "../../Common"; import { CheckCircleIcon, CloseIcon, FileIcon, FolderIcon } from "../../Icons"; -import { ShowInFolder, TitleNameClipped, elipses } from "../utils/longpress"; +import { + ShowInFolder, + TitleNameClipped, + elipses, + formatBytesWithPadding, +} from "../utils/longpress"; import "./Cart.css"; -import ProgressRing from "./RadialProgress"; const Cart = () => { const dispatch = useAppDispatch(); @@ -274,6 +278,7 @@ interface UploadStatusProps { name: string; dispatch: AppDispatch; } + const UploadStatus: React.FC<UploadStatusProps> = ({ status, type, @@ -283,13 +288,13 @@ const UploadStatus: React.FC<UploadStatusProps> = ({ const isError = status.currentStep.includes("Cancelled") || status.currentStep.startsWith("Error"); - const isComplete = - type === "file" - ? (status as FileUploadObject).progress === 100 && - status.currentStep === "Upload Complete" - : (status as FolderUploadObject).done === - (status as FolderUploadObject).total && - status.currentStep === "Upload Complete"; + + // Determine if the upload is complete + const isComplete = status.currentStep === "Upload Complete"; + + // Determine when to show the status text + const showStatusText = + status.currentStep === "Server Processing..." || isError || isComplete; const handleAction = () => { if (status.currentStep === "Uploading...") { @@ -299,53 +304,88 @@ const UploadStatus: React.FC<UploadStatusProps> = ({ } }; - return ( - <List.Item - key={name} - actions={[ - <div key={`status-${name}`}> - <TitleNameClipped value={35} name={status.currentStep} /> - </div>, - isComplete ? ( - <CheckCircleIcon - key={`anon-${name}-progress`} - color="#3E8635" - width="2em" - height="2em" - /> - ) : isError ? ( - <CloseIcon - color="red" - width="2em" - height="2em" - key={`anon-${name}-cancel`} - /> - ) : type === "file" ? ( - <ProgressRing - key={`anon-${name}-progress`} - value={(status as FileUploadObject).progress} - /> - ) : ( - <div key={`anon-${name}-progress`}> - {(status as FolderUploadObject).done}/ - {(status as FolderUploadObject).total} - </div> - ), - <ShowInFolder - isError={isError} - key={`anon-${name}-show`} - path={status.path} - />, - <Button - onClick={handleAction} - variant="secondary" - size="sm" - key={`a-${name}`} - > - {status.currentStep === "Uploading..." ? "Cancel" : "Clear"} - </Button>, - ]} + const loadedBytes = formatBytesWithPadding( + (status as FileUploadObject).loaded || 0, + ); + const totalBytes = formatBytesWithPadding( + (status as FileUploadObject).total || 0, + ); + + // Build the actions array based on the current status + const actions = []; + + if (showStatusText) { + // Conditionally add the status text (e.g., "Server Processing...", errors, completion) + actions.push( + <div key={`status-${name}`}> + <TitleNameClipped value={35} name={status.currentStep} /> + </div>, + ); + } + + if (isComplete) { + // Add the appropriate icon or progress + actions.push( + <CheckCircleIcon + key={`anon-${name}-progress`} + color="#3E8635" + width="2em" + height="2em" + />, + ); + } else if (isError) { + actions.push( + <CloseIcon + color="red" + width="2em" + height="2em" + key={`anon-${name}-cancel`} + />, + ); + } else if (type === "file" && !showStatusText) { + // Show progress during upload + actions.push( + <div + key={`anon-${name}-bytes`} + style={{ + fontFamily: "monospace", + }} + > + {loadedBytes}/{totalBytes} + </div>, + ); + } else if (type === "folder") { + actions.push( + <div key={`anon-${name}-progress`}> + {(status as FolderUploadObject).done}/ + {(status as FolderUploadObject).total} + </div>, + ); + } + + // Add the "Show in Folder" component + actions.push( + <ShowInFolder + isError={isError} + key={`anon-${name}-show`} + path={status.path} + />, + ); + + // Add the action button ("Cancel" or "Clear") + actions.push( + <Button + onClick={handleAction} + variant="secondary" + size="sm" + key={`a-${name}`} > + {status.currentStep === "Uploading..." ? "Cancel" : "Clear"} + </Button>, + ); + + return ( + <List.Item key={name} actions={actions}> <List.Item.Meta avatar={type === "file" ? <FileIcon /> : <FolderIcon />} title={<TitleNameClipped name={name} value={30} />} diff --git a/src/components/NewLibrary/components/RadialProgress.tsx b/src/components/NewLibrary/components/RadialProgress.tsx deleted file mode 100644 index f6caac3da..000000000 --- a/src/components/NewLibrary/components/RadialProgress.tsx +++ /dev/null @@ -1,31 +0,0 @@ -interface ProgressRingProps { - value: number; -} - -const ProgressRing: React.FC<ProgressRingProps> = ({ value }) => { - const radius = 6; - const circumference = radius * 2 * Math.PI; - - // Calculate dashoffset based on progress - const dashoffset = circumference - (value / 100) * circumference; - - return ( - <svg className="progress-ring"> - <title>File Upload Progress - - - ); -}; - -export default ProgressRing; diff --git a/src/components/NewLibrary/utils/longpress.tsx b/src/components/NewLibrary/utils/longpress.tsx index 67e10af56..744329b68 100644 --- a/src/components/NewLibrary/utils/longpress.tsx +++ b/src/components/NewLibrary/utils/longpress.tsx @@ -241,3 +241,13 @@ export const useAssociatedFeed = (folderPath: string) => { enabled: Boolean(feedMatches?.length), }); }; + +export function formatBytesWithPadding(bytes: number): string { + if (bytes === 0) return " 0.00 B "; + const k = 1024; + const dm = 2; // Decimal places + const sizes = [" B ", "KB", "MB", "GB", "TB"]; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + const formattedNumber = (bytes / k ** i).toFixed(dm).padStart(6, " "); + return `${formattedNumber} ${sizes[i]}`; +} diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index fb42614aa..d89a5f003 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -1,10 +1,10 @@ import type { RenderingEngine } from "@cornerstonejs/core"; import { useQuery } from "@tanstack/react-query"; +import { Progress } from "antd"; import axios, { type AxiosProgressEvent } from "axios"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { type IFileBlob, getFileExtension } from "../../../api/model"; import { notification } from "../../Antd"; -import { SpinContainer } from "../../Common"; import useSize from "../../FeedTree/useSize"; import type { ActionState } from "../FileDetailView"; import { @@ -19,7 +19,6 @@ import { stopClip, stupidlyGetFileResourceUrl, } from "./dicomUtils/utils"; -import { Progress } from "antd"; export type DcmImageProps = { selectedFile: IFileBlob; @@ -474,9 +473,6 @@ const DcmDisplay = (props: DcmImageProps) => { return ( <> - {downloadProgress > 0 && downloadProgress < 100 && ( - - )}
{ )}
+ {downloadProgress > 0 && downloadProgress < 100 && ( + + )} + {/* DICOM Image Display */}
, ) { - const { step, fileName, progress, controller, path, type } = - action.payload; + const { + step, + fileName, + progress, + loaded, + total, + controller, + path, + type, + } = action.payload; state.fileUploadStatus[fileName] = { currentStep: step, progress, + loaded, + total, controller, path, type, diff --git a/src/store/cart/types.ts b/src/store/cart/types.ts index 732472710..41aa2db83 100644 --- a/src/store/cart/types.ts +++ b/src/store/cart/types.ts @@ -28,6 +28,8 @@ export type FolderUploadObject = { export type FileUploadObject = { currentStep: string; progress: number; + loaded: number; + total: number; controller: AbortController | null; path: string; type: string; diff --git a/src/store/cart/uploadSaga.ts b/src/store/cart/uploadSaga.ts index 79232e902..530f24583 100644 --- a/src/store/cart/uploadSaga.ts +++ b/src/store/cart/uploadSaga.ts @@ -22,8 +22,9 @@ function createUploadChannel(config: any) { return eventChannel((emitter) => { const onUploadProgress = (progressEvent: AxiosProgressEvent) => { if (progressEvent.progress) { + const { loaded, total } = progressEvent; const progress = Math.round(progressEvent.progress * 100); - emitter({ progress }); + emitter({ progress, loaded, total }); } }; @@ -113,7 +114,7 @@ function* uploadFileBatch( return call(function* () { try { while (true) { - const { progress, response, error, cancelled } = + const { progress, loaded, total, response, error, cancelled } = yield take(uploadChannel); if (cancelled) { @@ -156,6 +157,8 @@ function* uploadFileBatch( updateFileUploadStatus, name, progress, + loaded, + total, response, currentPath, controller, @@ -215,6 +218,8 @@ function* uploadFileBatch( step: "Error: Failed to create a feed", fileName: nameForFeed as string, progress: 0, + loaded: 0, + total: 0, controller: null, path: currentPath, type: "file", @@ -325,6 +330,8 @@ function* handleUploadError( step, fileName: name, progress: 0, + loaded: 0, + total: 0, controller: null, path: currentPath, type: "file", @@ -335,6 +342,8 @@ function* handleUploadError( function* updateFileUploadStatus( name: string, progress: number, + loaded: number, + total: number, response: any, currentPath: string, controller: AbortController, @@ -357,6 +366,8 @@ function* updateFileUploadStatus( step, fileName: name, progress, + loaded, + total, controller, path: currentPath, type: "file", From d447c029ee68e92583bdd663fcd0fac080590ffd Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Fri, 1 Nov 2024 13:55:55 -0400 Subject: [PATCH 330/337] feat: Add the 'Install All' button to the Store Page --- .../FeedOutputBrowser/FileBrowser.tsx | 21 ++- .../NewLibrary/components/LibraryTable.tsx | 22 ++- .../Preview/displays/DcmDisplay.tsx | 72 +++++--- .../Preview/displays/DicomCacheContext.tsx | 38 ++++ .../Preview/displays/ViewerDisplay.tsx | 4 +- .../Preview/displays/dicomUtils/utils.ts | 5 +- src/components/Store/index.tsx | 163 +++++++++++++++++- 7 files changed, 268 insertions(+), 57 deletions(-) create mode 100644 src/components/Preview/displays/DicomCacheContext.tsx diff --git a/src/components/FeedOutputBrowser/FileBrowser.tsx b/src/components/FeedOutputBrowser/FileBrowser.tsx index 9036a9057..de4c1420d 100644 --- a/src/components/FeedOutputBrowser/FileBrowser.tsx +++ b/src/components/FeedOutputBrowser/FileBrowser.tsx @@ -40,6 +40,7 @@ import { OperationContext } from "../NewLibrary/context"; import FileDetailView from "../Preview/FileDetailView"; import XtkViewer from "../XtkViewer/XtkViewer"; import type { FileBrowserProps } from "./types"; +import { DicomCacheProvider } from "../Preview/displays/DicomCacheContext"; const previewAnimation = [{ opacity: "0.0" }, { opacity: "1.0" }]; @@ -354,15 +355,17 @@ const FileBrowser = (props: FileBrowserProps) => { {drawerState.preview.currentlyActive === "preview" && selectedFile && ( - + + + )} {drawerState.preview.currentlyActive === "xtk" && } diff --git a/src/components/NewLibrary/components/LibraryTable.tsx b/src/components/NewLibrary/components/LibraryTable.tsx index 34d4f5b77..39e3095e8 100644 --- a/src/components/NewLibrary/components/LibraryTable.tsx +++ b/src/components/NewLibrary/components/LibraryTable.tsx @@ -35,6 +35,7 @@ import { FolderContextMenu } from "./ContextMenu"; import { getFileName, getLinkFileName } from "./FileCard"; import { getFolderName } from "./FolderCard"; import TruncatedText from "./TruncatedText"; +import { DicomCacheProvider } from "../../Preview/displays/DicomCacheContext"; interface TableProps { data: { @@ -297,15 +298,17 @@ const LibraryTable: React.FC = ({ placement="right" > {selectedFile && ( - + + + )} = ({ origin={origin} /> ))} + {data.files.map((resource: FileBrowserFolderFile, index) => ( { filesLoading, actionState, } = props; + const { cache, setCache } = useDicomCache(); // State variables const [currentImageIndex, setCurrentImageIndex] = useState(0); @@ -61,13 +63,10 @@ const DcmDisplay = (props: DcmImageProps) => { const elementRef = useRef(null); const renderingEngineRef = useRef(null); const activeViewportRef = useRef(null); - const cacheRef = useRef<{ [key: string]: ImageStackType }>({ - [CACHE_KEY]: {}, - }); // Derived values const size = useSize(dicomImageRef); - const cacheStack = cacheRef.current[CACHE_KEY]; + const cacheStack = cache[CACHE_KEY] || {}; const fname = selectedFile.data.fname; /** @@ -173,10 +172,12 @@ const DcmDisplay = (props: DcmImageProps) => { setMultiFrameDisplay(false); } - await activeViewportRef.current.setStack( - imageIDs, - index !== -1 ? index : 0, - ); + // Ensure index is valid + if (index < 0 || index >= imageIDs.length) { + index = 0; + } + + await activeViewportRef.current.setStack(imageIDs, index); activeViewportRef.current.render(); setCurrentImageIndex(index); return cacheStack; @@ -212,11 +213,18 @@ const DcmDisplay = (props: DcmImageProps) => { activeViewportRef.current = viewport; renderingEngineRef.current = renderingEngine; setImageStack(newImageStack); - setCurrentImageIndex(selectedIndex); - cacheRef.current[CACHE_KEY] = newImageStack; + setCurrentImageIndex(selectedIndex || 0); + // Update the cache using the context + setCache(() => { + const updatedCache = { + [CACHE_KEY]: newImageStack, + }; + return updatedCache; + }); return newImageStack; } catch (e) { - throw new Error("Failed to load the dicom image"); + // biome-ignore lint/complexity/noUselessCatch: + throw e; } }; @@ -230,12 +238,9 @@ const DcmDisplay = (props: DcmImageProps) => { useEffect(() => { if (isError) { - console.log("Error", error); notification.error({ - message: "Error Loading DICOM Image", - description: - (error as Error)?.message || - "An error occurred while loading the DICOM Image", + message: error.name, + description: (error as Error)?.message, }); } }, [isError, error]); @@ -251,12 +256,12 @@ const DcmDisplay = (props: DcmImageProps) => { /** * Clean up when the component unmounts. - * Destroys the rendering engine and clears caches and intervals. + * Destroys the rendering engine and clears intervals. */ useEffect(() => { return () => { renderingEngineRef.current?.destroy(); - cacheRef.current = { [CACHE_KEY]: {} }; + setIsLoadingMore(false); setLastLoadedIndex(0); setImageStack({}); @@ -273,7 +278,6 @@ const DcmDisplay = (props: DcmImageProps) => { /** * Start cine playback. */ - const startCinePlay = useCallback(() => { if (elementRef.current) { const clipOptions = { @@ -331,8 +335,11 @@ const DcmDisplay = (props: DcmImageProps) => { setImageStack(cacheStack); if (activeViewportRef.current) { const imageIDs = Object.values(cacheStack).flat() as string[]; - await activeViewportRef.current.setStack(imageIDs, selectedIndex); + // Ensure currentImageIndex is within bounds + const index = Math.min(currentImageIndex, imageIDs.length - 1); + await activeViewportRef.current.setStack(imageIDs, index); activeViewportRef.current.render(); + setCurrentImageIndex(index); } return; } @@ -340,32 +347,38 @@ const DcmDisplay = (props: DcmImageProps) => { setIsLoadingMore(true); const generator = imageFileGenerator(filteredList, lastLoadedIndex); const newImages: ImageStackType = {}; - for (let next = generator.next(); !next.done; next = generator.next()) { const file = next.value; if (cacheStack[file.data.fname]) { continue; // Skip if already in cache } - const blob = await file.getFileBlob(); const imageData = await loadDicomImage(blob); newImages[file.data.fname] = imageData.imageID; } - const updatedImageStack = { ...cacheStack, ...newImages }; setImageStack(updatedImageStack); - cacheRef.current[CACHE_KEY] = updatedImageStack; + // Update the cache using the context + setCache(() => { + const updatedCache = { + [CACHE_KEY]: updatedImageStack, + }; + return updatedCache; + }); if (activeViewportRef.current) { const imageIDs = Object.values(updatedImageStack).flat() as string[]; - await activeViewportRef.current.setStack(imageIDs, selectedIndex); + // Ensure currentImageIndex is within bounds + const index = Math.min(currentImageIndex, imageIDs.length - 1); + await activeViewportRef.current.setStack(imageIDs, index); activeViewportRef.current.render(); + setCurrentImageIndex(index); } setLastLoadedIndex(lastLoadedIndex + Object.keys(newImages).length); setIsLoadingMore(false); }, - [cacheStack, lastLoadedIndex, selectedIndex, loadDicomImage], + [cacheStack, lastLoadedIndex, currentImageIndex, loadDicomImage], ); // Check if the first frame is still loading @@ -408,7 +421,9 @@ const DcmDisplay = (props: DcmImageProps) => { (!multiFrameDisplay && Object.keys(imageStack).length > 1) ) { const newIndex = activeViewportRef.current.getCurrentImageIdIndex(); - setCurrentImageIndex(newIndex); + if (newIndex !== currentImageIndex) { + setCurrentImageIndex(newIndex); + } } if ( @@ -429,6 +444,7 @@ const DcmDisplay = (props: DcmImageProps) => { filesLoading, loadingFirstFrame, handlePagination, + currentImageIndex, ]); // Add event listener for image rendered event @@ -504,7 +520,7 @@ const DcmDisplay = (props: DcmImageProps) => { {/* Loading More Indicator */} {isLoadingMore && (
- Loading more... + More Files are being loaded...
)} diff --git a/src/components/Preview/displays/DicomCacheContext.tsx b/src/components/Preview/displays/DicomCacheContext.tsx new file mode 100644 index 000000000..6d356ba99 --- /dev/null +++ b/src/components/Preview/displays/DicomCacheContext.tsx @@ -0,0 +1,38 @@ +// DicomCacheContext.tsx + +import type React from "react"; +import { createContext, useContext, useState } from "react"; + +type ImageStackType = { + [key: string]: string | string[]; +}; + +type DicomCacheContextType = { + cache: { [key: string]: ImageStackType }; + setCache: React.Dispatch< + React.SetStateAction<{ [key: string]: ImageStackType }> + >; +}; + +const DicomCacheContext = createContext( + undefined, +); + +export const useDicomCache = () => { + const context = useContext(DicomCacheContext); + if (!context) { + throw new Error("useDicomCache must be used within a DicomCacheProvider"); + } + return context; +}; + +export const DicomCacheProvider = ({ + children, +}: { children: React.ReactNode }) => { + const [cache, setCache] = useState<{ [key: string]: ImageStackType }>({}); + return ( + + {children} + + ); +}; diff --git a/src/components/Preview/displays/ViewerDisplay.tsx b/src/components/Preview/displays/ViewerDisplay.tsx index f33537dc7..b85fa80e3 100644 --- a/src/components/Preview/displays/ViewerDisplay.tsx +++ b/src/components/Preview/displays/ViewerDisplay.tsx @@ -1,4 +1,6 @@ +import type { FileBrowserFolderFile, PACSFile } from "@fnndsc/chrisapi"; import type * as React from "react"; +import type { IFileBlob } from "../../../api/model"; import type { ActionState } from "../FileDetailView"; import { CatchallDisplay, @@ -12,8 +14,6 @@ import { VideoDisplay, XtkDisplay, } from "./index"; -import type { FileBrowserFolderFile, PACSFile } from "@fnndsc/chrisapi"; -import type { IFileBlob } from "../../../api/model"; const components = { JsonDisplay, diff --git a/src/components/Preview/displays/dicomUtils/utils.ts b/src/components/Preview/displays/dicomUtils/utils.ts index e9418b231..1048f3d1b 100644 --- a/src/components/Preview/displays/dicomUtils/utils.ts +++ b/src/components/Preview/displays/dicomUtils/utils.ts @@ -200,8 +200,9 @@ export const loadDicomImage = async (blob: Blob) => { imageID, framesCount, }; - } catch (e) { - throw new Error(`Error loading the DICOM image: ${(e as Error).message}`); + } catch (e: any) { + const error_message = e?.error?.message || "Failed to load"; + throw new Error(`${error_message}`); } }; diff --git a/src/components/Store/index.tsx b/src/components/Store/index.tsx index 1231d68e3..6fc815173 100644 --- a/src/components/Store/index.tsx +++ b/src/components/Store/index.tsx @@ -32,7 +32,7 @@ import { } from "@patternfly/react-core"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { format } from "date-fns"; -import { type Ref, useEffect, useState, useCallback, useMemo } from "react"; +import { type Ref, useCallback, useEffect, useMemo, useState } from "react"; import { Cookies, useCookies } from "react-cookie"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useAppSelector } from "../../store/hooks"; @@ -40,6 +40,7 @@ import { Alert, Spin, notification } from "../Antd"; import { SpinContainer } from "../Common"; import { CheckCircleIcon, SearchIcon } from "../Icons"; import "../SinglePlugin/singlePlugin.css"; +import { useMediaQuery } from "react-responsive"; import { InfoSection } from "../Common"; import { fetchPluginForMeta, @@ -67,6 +68,15 @@ const Store: React.FC = () => { >([]); const [dropdown, setDropdown] = useState(false); + // New state variables + const [installingPluginInfo, setInstallingPluginInfo] = useState<{ + name: string; + version: string; + } | null>(null); + const [installationErrors, setInstallationErrors] = useState([]); + + const isMobile = useMediaQuery({ maxWidth: 768 }); + const defaultStoreURL = import.meta.env.VITE_CHRIS_STORE_URL; const localCubeURL = import.meta.env.VITE_CHRIS_UI_URL; const cookies = new Cookies(); @@ -218,6 +228,105 @@ const Store: React.FC = () => { } }; + const bulkInstallPlugins = async (pluginsWithVersions: Plugin[]) => { + const failedPlugins = []; + const installedPlugins = []; + + const notificationKey = "installing-plugins"; + for (const selectedPlugin of pluginsWithVersions) { + if (selectedPlugin) { + try { + // Update the state to indicate which plugin is being installed + setInstallingPluginInfo({ + name: selectedPlugin.data.name, + version: selectedPlugin.data.version, + }); + + if (isMobile) { + api.info({ + key: notificationKey, + message: "Installing Plugins", + description: ( + + Installing plugin: {selectedPlugin.data.name} version:{" "} + {selectedPlugin.data.version} + + ), + duration: 0, + }); + } + + await handleInstall(selectedPlugin); + installedPlugins.push(selectedPlugin.data.name); + } catch (error: any) { + failedPlugins.push({ + name: selectedPlugin.data.name, + error: error.message, + }); + api.destroy(notificationKey); + } + } + } + // After installation is complete, reset the installingPluginInfo + setInstallingPluginInfo(null); + api.destroy(notificationKey); + if (failedPlugins.length > 0) { + // Update the installationErrors state + setInstallationErrors( + failedPlugins.map((fp) => `${fp.name}: ${fp.error}`), + ); + throw new Error("Failed to install some plugins"); + } + + return installedPlugins; + }; + + const bulkInstallMutation = useMutation({ + mutationFn: bulkInstallPlugins, + onSuccess: () => { + api.success({ + message: "All selected plugins were successfully installed.", + }); + // Invalidate queries to refresh installed plugins + queryClient.invalidateQueries({ queryKey: ["existingStorePlugins"] }); + }, + onError: () => { + api.error({ + message: "Failed to install the plugins", + description: ( +
    + {installationErrors.map((error, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: +
  • {error}
  • + ))} +
+ ), + }); + }, + }); + + const handleInstallAll = async () => { + // Ensure configuration is set + if (!username || !password || !computeResource || !configureURL) { + setIsConfigModalOpen(true); + return; + } + + const pluginsToInstall = data?.pluginMetaList || []; + + // For each plugin, determine the selected version or default version + const pluginsWithVersions = pluginsToInstall.map((plugin) => { + const selectedVersion = version[plugin.data.id] || plugin.data.version; + const selectedPlugin = plugin.data.plugins.find( + (p: any) => p.data.version === selectedVersion, + ); + return selectedPlugin; + }); + + // Trigger the mutation + bulkInstallMutation.mutate(pluginsWithVersions); + }; + const handleInstallMutation = useMutation({ mutationFn: (selectedPlugin: Plugin) => handleInstall(selectedPlugin), onSuccess: (_data) => { @@ -277,10 +386,14 @@ const Store: React.FC = () => { description: "Your configuration has been saved successfully.", duration: 1, }); - // If there is a plugin pending installation, proceed to install if (installingPlugin) { + // If there is a plugin pending installation, proceed to install handleSave(); } + + if (bulkInstallMutation.isIdle) { + handleInstallAll(); + } }; const TitleComponent = useMemo( @@ -393,17 +506,53 @@ const Store: React.FC = () => { -
- - You are currently viewing plugins fetched from {configureURL} - + + You are currently viewing plugins fetched from {configureURL} + +
+ + {/* Display installation progress */} + + {bulkInstallMutation.isPending && + installingPluginInfo && + !isMobile && ( + + {" "} + Installing plugin: {installingPluginInfo.name} version:{" "} + {installingPluginInfo.version} + + } + style={{ height: "100%", padding: "0.75em" }} + /> + )}
From 807990ad7fad721cd77733074e389d102262c251 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Fri, 1 Nov 2024 14:53:09 -0400 Subject: [PATCH 331/337] feat: Add filters to the store page --- src/api/common.ts | 10 +-- .../PipelinesCopy/PipelineUpload.tsx | 2 +- src/components/PipelinesCopy/TitleChange.tsx | 4 +- src/components/PipelinesCopy/index.tsx | 5 -- .../PipelinesCopy/useDownloadSource.tsx | 10 +-- src/components/PipelinesCopy/utils.ts | 9 +-- src/components/Store/index.tsx | 78 +++++++++++++------ 7 files changed, 66 insertions(+), 52 deletions(-) diff --git a/src/api/common.ts b/src/api/common.ts index 561dc2cd3..d5bb7a3b1 100644 --- a/src/api/common.ts +++ b/src/api/common.ts @@ -16,13 +16,6 @@ export function elipses(str: string, len: number) { return `${str.slice(0, len - 3)}...`; } -interface FetchParams { - limit: number; - offset: number; - fname_icontains?: string; - fname_nslashes?: string; -} - export interface TreeType { id: number; plugin_id: number; @@ -174,8 +167,7 @@ export const fetchResource = async ( // Type Definitions interface FetchParams { - limit: number; - offset: number; + [key: string]: string | number; } interface FetchResourcesResult { diff --git a/src/components/PipelinesCopy/PipelineUpload.tsx b/src/components/PipelinesCopy/PipelineUpload.tsx index 71cf47de0..ae28c97b3 100644 --- a/src/components/PipelinesCopy/PipelineUpload.tsx +++ b/src/components/PipelinesCopy/PipelineUpload.tsx @@ -5,6 +5,7 @@ import { isEmpty } from "lodash"; import { useRef, useState } from "react"; import { Cookies } from "react-cookie"; import ChrisAPIClient from "../../api/chrisapiclient"; +import { useAppSelector } from "../../store/hooks"; import { Alert } from "../Antd"; import { fetchPluginMetasFromStore, @@ -12,7 +13,6 @@ import { } from "../PipelinesCopy/utils"; import { uploadPipelineSourceFile } from "./utils"; import { extractPluginInfo } from "./utils"; -import { useAppSelector } from "../../store/hooks"; interface Notification { type: "warning" | "success" | "info" | "error" | undefined; description: string; diff --git a/src/components/PipelinesCopy/TitleChange.tsx b/src/components/PipelinesCopy/TitleChange.tsx index 76f6049b3..ad6e78517 100644 --- a/src/components/PipelinesCopy/TitleChange.tsx +++ b/src/components/PipelinesCopy/TitleChange.tsx @@ -1,8 +1,8 @@ import type { Pipeline, PluginPiping } from "@fnndsc/chrisapi"; -import { Alert, Form, Space } from "../Antd"; +import { Button, TextInput } from "@patternfly/react-core"; import { useContext, useEffect, useState } from "react"; +import { Alert, Form, Space } from "../Antd"; import { PipelineContext, Types } from "./context"; -import { TextInput, Button } from "@patternfly/react-core"; type OwnProps = { currentPipeline: Pipeline; diff --git a/src/components/PipelinesCopy/index.tsx b/src/components/PipelinesCopy/index.tsx index 62eb05c06..6609c6b63 100644 --- a/src/components/PipelinesCopy/index.tsx +++ b/src/components/PipelinesCopy/index.tsx @@ -25,11 +25,6 @@ import { Types, } from "./context"; import { DownloadIcon } from "@patternfly/react-icons"; -import ChrisAPIClient from "../../api/chrisapiclient"; -import type { - PipelineSourceFile, - PipelineSourceFileList, -} from "@fnndsc/chrisapi"; import { useDownloadSource } from "./useDownloadSource"; type LoadingResources = { diff --git a/src/components/PipelinesCopy/useDownloadSource.tsx b/src/components/PipelinesCopy/useDownloadSource.tsx index 4469ab506..ed60a1a80 100644 --- a/src/components/PipelinesCopy/useDownloadSource.tsx +++ b/src/components/PipelinesCopy/useDownloadSource.tsx @@ -1,12 +1,12 @@ +import type { + Pipeline, + PipelineSourceFile, + PipelineSourceFileList, +} from "@fnndsc/chrisapi"; // hooks/useDownloadPipeline.ts import { useMutation } from "@tanstack/react-query"; import { notification } from "antd"; import ChrisAPIClient from "../../api/chrisapiclient"; -import type { - PipelineSourceFileList, - PipelineSourceFile, - Pipeline, -} from "@fnndsc/chrisapi"; const fetchPipelineSourceFiles = async (pipeline: Pipeline) => { const client = ChrisAPIClient.getClient(); diff --git a/src/components/PipelinesCopy/utils.ts b/src/components/PipelinesCopy/utils.ts index b5b1e78cb..c04b9b478 100644 --- a/src/components/PipelinesCopy/utils.ts +++ b/src/components/PipelinesCopy/utils.ts @@ -3,12 +3,9 @@ import type Client from "@fnndsc/chrisapi"; import axios from "axios"; import { fetchResource } from "../../api/common"; -interface Params { - limit: number; - offset: number; - name?: string; - name_exact?: string; -} +type Params = { + [key: string]: string | number; +}; /** * Fetches plugin metadata from the ChRIS store. diff --git a/src/components/Store/index.tsx b/src/components/Store/index.tsx index 6fc815173..2ec6d15d5 100644 --- a/src/components/Store/index.tsx +++ b/src/components/Store/index.tsx @@ -6,7 +6,7 @@ import Client, { import { ActionGroup, Badge, - Button, + Button as PFButton, Card, CardBody, Form, @@ -20,7 +20,7 @@ import { type MenuToggleElement, Modal, PageSection, - Select, + Select as PFSelect, SelectOption, Split, SplitItem, @@ -36,7 +36,7 @@ import { type Ref, useCallback, useEffect, useMemo, useState } from "react"; import { Cookies, useCookies } from "react-cookie"; import ChrisAPIClient from "../../api/chrisapiclient"; import { useAppSelector } from "../../store/hooks"; -import { Alert, Spin, notification } from "../Antd"; +import { Alert, Spin, notification, Dropdown, type MenuProps } from "antd"; // Imported Menu and Dropdown from antd import { SpinContainer } from "../Common"; import { CheckCircleIcon, SearchIcon } from "../Icons"; import "../SinglePlugin/singlePlugin.css"; @@ -48,6 +48,7 @@ import { handleInstallPlugin, } from "../PipelinesCopy/utils"; import WrapperConnect from "../Wrapper"; +import { DownOutlined } from "@ant-design/icons"; // Imported DownOutlined icon const Store: React.FC = () => { const isStaff = useAppSelector((state) => state.user.isStaff); @@ -67,6 +68,9 @@ const Store: React.FC = () => { string[] >([]); const [dropdown, setDropdown] = useState(false); + const [searchField, setSearchField] = useState< + "name" | "category" | "authors" + >("name"); // New state variables const [installingPluginInfo, setInstallingPluginInfo] = useState<{ @@ -155,17 +159,21 @@ const Store: React.FC = () => { document.title = "Store Catalog"; setTempURLValue(configure_url || defaultStoreURL); setConfigureURL(configure_url || defaultStoreURL); - }, [isStaff, configure_url, defaultStoreURL, isLoggedIn]); + }, [configure_url]); const fetchPlugins = useCallback( async (search: string) => { const client = new Client(configureURL); try { - const params = { + const params: { + [key: string]: number | string; + } = { limit: 20, offset: 0, - name: search.trim().toLowerCase(), }; + if (search.trim() !== "") { + params[searchField] = search.trim().toLowerCase(); + } const pluginMetas = await fetchPluginMetas(client, params); const newPluginPayload = await Promise.all( @@ -181,7 +189,7 @@ const Store: React.FC = () => { throw error; } }, - [configureURL], + [configureURL, searchField], ); const fetchExistingPlugins = useCallback(async () => { @@ -344,7 +352,7 @@ const Store: React.FC = () => { }); const { data, isLoading, isError, error } = useQuery({ - queryKey: ["storePlugins", search, configureURL], + queryKey: ["storePlugins", search, configureURL, searchField], queryFn: () => fetchPlugins(search), retry: false, }); @@ -406,6 +414,18 @@ const Store: React.FC = () => { [], ); + const items: MenuProps["items"] = [ + { + key: "name", + label: "Name", + }, + { key: "category", label: "Category" }, + { + key: "authors", + label: "Author", + }, + ]; + return ( {contextHolder} @@ -451,7 +471,7 @@ const Store: React.FC = () => { {computeResourceOptions.length > 0 ? ( - + ) : ( { )} - - + @@ -518,14 +541,14 @@ const Store: React.FC = () => { height: "40px", }} > - - + {/* Display installation progress */} {bulkInstallMutation.isPending && @@ -556,16 +579,23 @@ const Store: React.FC = () => {
- + setSearch(value)} icon={} - placeholder="Search for plugins by name" + placeholder={`Search for plugins by ${searchField}`} /> + + + + {`Filter by: ${searchField}`} + + + {isLoading && } @@ -639,7 +669,7 @@ const Store: React.FC = () => {
Installed
) : ( - + )} @@ -714,7 +744,7 @@ const VersionSelect = ({ ); return ( - + ); }; From 33edd2853ac1967f206bfe3ccc3f8774f89480a6 Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Fri, 1 Nov 2024 15:01:25 -0400 Subject: [PATCH 332/337] feat: Add a loading spinner to Dcm Display --- src/components/Preview/displays/DcmDisplay.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/Preview/displays/DcmDisplay.tsx b/src/components/Preview/displays/DcmDisplay.tsx index 4c03c4ea8..9a24a99fb 100644 --- a/src/components/Preview/displays/DcmDisplay.tsx +++ b/src/components/Preview/displays/DcmDisplay.tsx @@ -5,8 +5,10 @@ import axios, { type AxiosProgressEvent } from "axios"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { type IFileBlob, getFileExtension } from "../../../api/model"; import { notification } from "../../Antd"; +import { SpinContainer } from "../../Common"; import useSize from "../../FeedTree/useSize"; import type { ActionState } from "../FileDetailView"; +import { useDicomCache } from "./DicomCacheContext"; import { events, type IStackViewport, @@ -19,7 +21,6 @@ import { stopClip, stupidlyGetFileResourceUrl, } from "./dicomUtils/utils"; -import { useDicomCache } from "./DicomCacheContext"; export type DcmImageProps = { selectedFile: IFileBlob; @@ -487,6 +488,8 @@ const DcmDisplay = (props: DcmImageProps) => { } }, [actionState]); + const showProgress = downloadProgress > 0 && downloadProgress < 100; + return ( <>
{
)} - - {downloadProgress > 0 && downloadProgress < 100 && ( - + {isLoading && !showProgress && ( + )} + {showProgress && } {/* DICOM Image Display */}
Date: Fri, 1 Nov 2024 15:21:51 -0400 Subject: [PATCH 333/337] fix: Filtering bug --- src/components/Store/index.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/Store/index.tsx b/src/components/Store/index.tsx index 2ec6d15d5..dcdbb1510 100644 --- a/src/components/Store/index.tsx +++ b/src/components/Store/index.tsx @@ -418,11 +418,17 @@ const Store: React.FC = () => { { key: "name", label: "Name", + onClick: () => setSearchField("name"), + }, + { + key: "category", + label: "Category", + onClick: () => setSearchField("category"), }, - { key: "category", label: "Category" }, { key: "authors", label: "Author", + onClick: () => setSearchField("authors"), }, ]; From 68c6794ad11eda26e735181af06c8acde1a49c67 Mon Sep 17 00:00:00 2001 From: Rudolph Pienaar Date: Mon, 4 Nov 2024 13:40:09 -0500 Subject: [PATCH 334/337] Add CITATION.cffwq --- CITATION.cff | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 000000000..ec49e5230 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,32 @@ +cff-version: 1.2.0 +message: If you use this software, please cite it as below. +title: ChRIS User Interface +version: 2.0.0 +date-released: 2024-11-04 +repository-code: https://github.com/FNNDSC/ChRIS_ui +license: MIT +type: software +authors: + - family-names: Gideon + given-names: Pinto + - family-names: Zhang + given-names: Jennings + orcid: https://orcid.org/0000-0001-6473-3316 + - family-names: Pienaar + given-names: Rudolph + orcid: https://orcid.org/0000-0002-8684-3185 +keywords: + - ChRIS + - web-based user interface + - medical imaging + - DICOM + - PACS +abstract: | + ChRIS_ui is the reference user interface for the ChRIS project. This interface is a web-based + and communicates with the core underlying backend (CUBE) to provide a full and rich interface + experience, including an internal filesystem browser, many built-in image file type rendering + support, management of computational workflows, sharing of data and results, and much more. +references: + - type: software + title: "ChRIS Backend" + url: "https://github.com/FNNDSC/ChRIS_ultron_backEnd" From a6b6506df50919215349efca58569b6fa9dd1e8a Mon Sep 17 00:00:00 2001 From: Rudolph Pienaar Date: Mon, 4 Nov 2024 13:43:59 -0500 Subject: [PATCH 335/337] Update authors --- CITATION.cff | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index ec49e5230..e38df16ca 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -7,8 +7,12 @@ repository-code: https://github.com/FNNDSC/ChRIS_ui license: MIT type: software authors: - - family-names: Gideon - given-names: Pinto + - family-names: Pinto + given-names: Gideon + - family-names: Samal + given-names: Sandip + - family-names: Ruisel-Bernal + given-names: Jorge - family-names: Zhang given-names: Jennings orcid: https://orcid.org/0000-0001-6473-3316 From dd045b3e678bd5338567aeea4eaa4551a27bb63f Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Tue, 5 Nov 2024 12:58:57 -0500 Subject: [PATCH 336/337] feat: Update SignUp and SimpleLoginPage components to use updated useSignUpAllowed hook --- src/components/Login/index.tsx | 84 +++++++++++++++------------------ src/components/Signup/index.tsx | 66 +++++++++++++++++++++++++- src/store/hooks.ts | 69 ++++++++++++++++++++++++++- 3 files changed, 170 insertions(+), 49 deletions(-) diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index 467684f73..72ae1eff3 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -1,7 +1,5 @@ import ChrisApiClient from "@fnndsc/chrisapi"; import { - HelperText, - HelperTextItem, ListItem, ListVariant, LoginFooterItem, @@ -9,34 +7,37 @@ import { LoginMainFooterBandItem, LoginPage, } from "@patternfly/react-core"; +import { App } from "antd"; import queryString from "query-string"; -import React from "react"; +// src/components/LoginPage/SimpleLoginPage.tsx +import type React from "react"; +import { useState } from "react"; import { useCookies } from "react-cookie"; import { Link, useLocation, useNavigate } from "react-router-dom"; import ChrisAPIClient from "../../api/chrisapiclient"; import ChRIS_Logo_Inline from "../../assets/chris-logo-inline.png"; import ChRIS_Logo from "../../assets/chris-logo.png"; +import { useAppDispatch } from "../../store/hooks.ts"; import { setAuthTokenSuccess } from "../../store/user/userSlice"; -import { ExclamationCircleIcon } from "../Icons"; import "./Login.css"; -import { useAppDispatch } from "../../store/hooks.ts"; +import { useSignUpAllowed } from "../../store/hooks.ts"; + +type Status = "idle" | "loading" | "success" | "error"; export const SimpleLoginPage: React.FunctionComponent = () => { const navigate = useNavigate(); const location = useLocation(); const dispatch = useAppDispatch(); const [_cookies, setCookie] = useCookies([""]); - const [showHelperText, setShowHelperText] = React.useState(false); - const [username, setUsername] = React.useState(""); - const [isValidUsername, setIsValidUsername] = React.useState(true); - const [password, setPassword] = React.useState(""); - const [isValidPassword, setIsValidPassword] = React.useState(true); - const [errorMessage, setErrorMessage] = React.useState(""); - - enum LoginErrorMessage { - invalidCredentials = "Invalid Credentials", - serverError = "There was a problem connecting to the server!", - } + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + const [status, setStatus] = useState("idle"); + + // Use the custom hook + const { signUpAllowed } = useSignUpAllowed(); + + // Use the message API from Ant Design + const { message } = App.useApp(); async function handleSubmit( event: @@ -46,10 +47,15 @@ export const SimpleLoginPage: React.FunctionComponent = () => { event.preventDefault(); const authURL = import.meta.env.VITE_CHRIS_UI_AUTH_URL; - let token: string; + + setStatus("loading"); try { - token = await ChrisApiClient.getAuthToken(authURL, username, password); + const token = await ChrisApiClient.getAuthToken( + authURL, + username, + password, + ); if (token && username) { const oneDayToSeconds = 24 * 60 * 60; setCookie(`${username}_token`, token, { @@ -74,6 +80,8 @@ export const SimpleLoginPage: React.FunctionComponent = () => { }), ); + setStatus("success"); + const { redirectTo } = queryString.parse(location.search) as { redirectTo: string; }; @@ -93,17 +101,13 @@ export const SimpleLoginPage: React.FunctionComponent = () => { navigate("/"); } } - } catch (error: unknown) { - setShowHelperText(true); - // Allows error message to be displayed in red - setIsValidUsername(false); - setIsValidPassword(false); - - setErrorMessage(() => - //@ts-ignore + } catch (error: any) { + setStatus("error"); + message.error( error.response - ? LoginErrorMessage.invalidCredentials - : LoginErrorMessage.serverError, + ? "Invalid Credentials" + : "There was a problem connecting to the server!", + 3, ); } } @@ -122,20 +126,12 @@ export const SimpleLoginPage: React.FunctionComponent = () => { setPassword(value); }; - let helperText: React.ReactNode = null; - if (showHelperText) { - helperText = ( - - {errorMessage} - - ); - } - - const signUpForAccountMessage = ( + // Conditionally render the "Sign up" link based on signUpAllowed state + const signUpForAccountMessage = signUpAllowed ? ( Need an account? Sign up. - ); + ) : null; const forgotCredentials = ( @@ -144,7 +140,7 @@ export const SimpleLoginPage: React.FunctionComponent = () => { ); const listItem = ( - + <> Terms of Use{" "} @@ -160,24 +156,20 @@ export const SimpleLoginPage: React.FunctionComponent = () => { Privacy Policy - + ); const loginForm = ( } usernameLabel="Username" usernameValue={username} onChangeUsername={handleUsernameChange} - isValidUsername={isValidUsername} passwordLabel="Password" passwordValue={password} onChangePassword={handlePasswordChange} - isValidPassword={isValidPassword} onLoginButtonClick={handleSubmit} loginButtonLabel="Log in" + isLoginButtonDisabled={status === "loading"} /> ); diff --git a/src/components/Signup/index.tsx b/src/components/Signup/index.tsx index 05491624e..a681245fb 100644 --- a/src/components/Signup/index.tsx +++ b/src/components/Signup/index.tsx @@ -1,13 +1,75 @@ import { LoginPage } from "@patternfly/react-core"; +import { App, Spin } from "antd"; +import React from "react"; +import { useNavigate } from "react-router-dom"; +import { useSignUpAllowed } from "../../store/hooks"; import SignUpForm from "./SignUpForm"; -const SignUp = () => { +const SignUp: React.FunctionComponent = () => { + const { signUpAllowed, isLoading, isError } = useSignUpAllowed(); + const navigate = useNavigate(); + + // Use the message API from Ant Design + const { message } = App.useApp(); + + React.useEffect(() => { + let timer: NodeJS.Timeout; + + if (!isLoading && !signUpAllowed) { + // If sign-ups are not allowed, show error and redirect after delay + message.error( + "Anonymous sign-ups are not allowed on this platform. Redirecting to login page...", + 3, // Duration in seconds + ); + timer = setTimeout(() => { + navigate("/login"); + }, 3000); // Redirect after 3 seconds + } else if (isError) { + // If there was an error checking sign-up availability + message.error( + "Failed to check sign-up availability. Please try again later. Redirecting to login page...", + 3, + ); + timer = setTimeout(() => { + navigate("/login"); + }, 3000); + } + + // Cleanup the timer if the component unmounts + return () => { + if (timer) { + clearTimeout(timer); + } + }; + }, [signUpAllowed, isLoading, isError, navigate, message]); + + // Determine what content to render inside the LoginPage + let content: React.ReactNode; + if (isLoading) { + // Display a loading spinner while checking sign-up availability + content = ( +
+ +
+ ); + } else if ((!isLoading && !signUpAllowed) || isError) { + // Show a message indicating redirecting + content = ( +
+

Redirecting to the login page...

+
+ ); + } else { + // If sign-ups are allowed, render the sign-up form + content = ; + } + return ( - + {content} ); }; diff --git a/src/store/hooks.ts b/src/store/hooks.ts index ba719d930..75a768996 100644 --- a/src/store/hooks.ts +++ b/src/store/hooks.ts @@ -1,5 +1,11 @@ import type { Feed, FileBrowserFolderFile } from "@fnndsc/chrisapi"; -import { useMutation } from "@tanstack/react-query"; +import { + type UseQueryOptions, + useMutation, + useQuery, +} from "@tanstack/react-query"; +import { App } from "antd"; +import { useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; import ChrisAPIClient from "../api/chrisapiclient"; import { getFileName } from "../api/common"; @@ -70,3 +76,64 @@ const useDownload = (feed?: Feed) => { }; export default useDownload; + +// src/hooks/useSignUpAllowed.ts + +export const useSignUpAllowed = () => { + // Use the message API from Ant Design + const { message } = App.useApp(); + + const fetchSignUpAllowed = async (): Promise => { + const apiUrl = import.meta.env.VITE_CHRIS_UI_USERS_URL; + + if (!apiUrl) { + throw new Error("URL for fetching the users is not set correctly"); + } + + // Make an unauthenticated GET request to api/v1/users/ + const response = await fetch(apiUrl, { + method: "GET", + }); + + if (!response.ok) { + throw new Error(`Server responded with status ${response.status}`); + } + + // Get the Allow header from the response + const allowHeader = response.headers.get("Allow"); + + return allowHeader?.includes("POST") || false; + }; + + // Explicitly define the type for options + const queryOptions: UseQueryOptions< + boolean, + Error, + boolean, + ["signUpAllowed"] + > = { + queryKey: ["signUpAllowed"], + queryFn: fetchSignUpAllowed, + retry: false, + }; + + const { + data: signUpAllowed, + isLoading, + isError, + error, + } = useQuery(queryOptions); + + // Handle errors using useEffect + useEffect(() => { + if (isError && error) { + message.error( + error.message || + "Failed to check sign-up availability. Please try again later.", + 3, // Duration in seconds + ); + } + }, [isError, error, message]); + + return { signUpAllowed, isLoading, isError, error }; +}; From 36f2dcb927fd246cc9589091ed97dfc0b6466a4d Mon Sep 17 00:00:00 2001 From: PintoGideon Date: Fri, 8 Nov 2024 15:37:26 -0500 Subject: [PATCH 337/337] feat: Update Sign Up --- src/components/Wrapper/Toolbar.tsx | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/components/Wrapper/Toolbar.tsx b/src/components/Wrapper/Toolbar.tsx index 386b27f5d..67ee593b7 100644 --- a/src/components/Wrapper/Toolbar.tsx +++ b/src/components/Wrapper/Toolbar.tsx @@ -18,7 +18,11 @@ import { useMediaQuery } from "react-responsive"; import { useLocation, useNavigate } from "react-router"; import ChrisAPIClient from "../../api/chrisapiclient"; import { clearCartOnLogout } from "../../store/cart/cartSlice"; -import { useAppDispatch, useAppSelector } from "../../store/hooks"; +import { + useAppDispatch, + useAppSelector, + useSignUpAllowed, +} from "../../store/hooks"; import { setLogoutSuccess } from "../../store/user/userSlice"; import { ThemeContext } from "../DarkTheme/useTheme"; import FeedDetails from "../FeedDetails"; @@ -34,7 +38,7 @@ const ToolbarComponent: React.FC = ( props: ToolbarComponentProps, ) => { const isSmallerScreen = useMediaQuery({ maxWidth: 1224 }); - + const { signUpAllowed } = useSignUpAllowed(); const { token, titleComponent } = props; const dispatch = useAppDispatch(); const navigate = useNavigate(); @@ -164,13 +168,15 @@ const ToolbarComponent: React.FC = ( > Login - + {signUpAllowed && ( + + )} )}