@ohif/app 3.7.0-beta.101 → 3.7.0-beta.103

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/{202.bundle.96bbb4547a346fe3921f.js → 202.bundle.d3490836f71e001dd30f.js} +746 -19
  2. package/dist/{221.bundle.dcacfa132a78c43ae8fe.js → 221.bundle.fa691676166a763b3532.js} +69 -13
  3. package/dist/{342.bundle.d44d95d71fb2e5d12367.js → 342.bundle.ebb4ecaa8c01121ba631.js} +2 -2
  4. package/dist/{831.bundle.83658f62fcc769043605.js → 757.bundle.ec8301d8e70d2b990f65.js} +368 -1
  5. package/dist/{782.bundle.c7c9b143e04a7ef54d1d.js → 788.bundle.fe33643e596da75dd819.js} +5 -305
  6. package/dist/{82.bundle.be2ff9210bb2fad38907.js → 82.bundle.a0573d156476c90d027d.js} +2 -2
  7. package/dist/{app.bundle.7d673420913b4ea775e5.js → app.bundle.af8d271d6a055aea0d7e.js} +88 -45
  8. package/dist/index.html +1 -1
  9. package/dist/sw.js +1 -1
  10. package/package.json +19 -18
  11. /package/dist/{12.bundle.596ce30cd85f6b9a1e47.js → 12.bundle.1aabdfb5ae5e2b35227d.js} +0 -0
  12. /package/dist/{181.bundle.169383e9b1a0358b44e8.js → 181.bundle.ceb057236403bcb630ac.js} +0 -0
  13. /package/dist/{19.bundle.ce766e7df8a696dbbf02.js → 19.bundle.630c39bd619e2972f28c.js} +0 -0
  14. /package/dist/{236.bundle.63061204c6e1d3ebda51.js → 236.bundle.0dd5d6e378bd111ee299.js} +0 -0
  15. /package/dist/{281.bundle.e8f6e02a0cb9ef57e70f.js → 281.bundle.e69fa5589df69f09bef4.js} +0 -0
  16. /package/dist/{359.bundle.69603175835e0b5b7532.js → 359.bundle.f98356e616452aabcecf.js} +0 -0
  17. /package/dist/{370.bundle.25df86d9d452b1774297.js → 370.bundle.0b6840140282701c2b50.js} +0 -0
  18. /package/dist/{410.bundle.f8924c20812caea77a95.js → 410.bundle.b79b78e6f05d934baabb.js} +0 -0
  19. /package/dist/{506.bundle.a788df1a79060b03fdb0.js → 506.bundle.3595d92c1184b4bcc672.js} +0 -0
  20. /package/dist/{613.bundle.1044517a8a209ba730f6.js → 613.bundle.0b467379f6e2c48310eb.js} +0 -0
  21. /package/dist/{663.bundle.f96cd84411734fc5cbd5.js → 663.bundle.1557498a7e6611c89820.js} +0 -0
  22. /package/dist/{687.bundle.e79e2ab836a1d2adacf4.js → 687.bundle.6dca84018ee6521f9e39.js} +0 -0
  23. /package/dist/{743.bundle.4bfe6e562ffb2c22708f.js → 743.bundle.495448aa95758144af74.js} +0 -0
  24. /package/dist/{774.bundle.7528cba56a1407357144.js → 774.bundle.4b2dc46a35012b898e1a.js} +0 -0
  25. /package/dist/{814.bundle.573f81eb69e871f5deb0.js → 814.bundle.11686c2624a07d288fcc.js} +0 -0
  26. /package/dist/{822.bundle.0545d6dbb49515aa04ee.js → 822.bundle.891f2e57b1b7bc2f4cb4.js} +0 -0
  27. /package/dist/{957.bundle.71558794566041f37a92.js → 957.bundle.0fba9c5956bdb9972c73.js} +0 -0
  28. /package/dist/{99.bundle.9bd882e014262ad3ebf4.js → 99.bundle.f1e44cd6ede9d2782697.js} +0 -0
@@ -1,6 +1,6 @@
1
- (self["webpackChunk"] = self["webpackChunk"] || []).push([[782],{
1
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[788],{
2
2
 
3
- /***/ 43851:
3
+ /***/ 4483:
4
4
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
5
5
 
6
6
  "use strict";
@@ -1964,310 +1964,10 @@ function createAndDownloadTMTVReport(segReport, additionalReportRows) {
1964
1964
  a.download = `${firstReport.PatientID}_tmtv.csv`;
1965
1965
  a.click();
1966
1966
  }
1967
- ;// CONCATENATED MODULE: ../../../extensions/tmtv/src/utils/dicomRTAnnotationExport/RTStructureSet/measurements/RectangleROIStartEndThreshold.js
1968
- // comment
1969
- class RectangleROIStartEndThreshold_RectangleROIStartEndThreshold {
1970
- constructor() {}
1971
- static getContourSequence(toolData, metadataProvider) {
1972
- const {
1973
- data
1974
- } = toolData;
1975
- const {
1976
- projectionPoints,
1977
- projectionPointsImageIds
1978
- } = data.cachedStats;
1979
- return projectionPoints.map((point, index) => {
1980
- const ContourData = getPointData(point);
1981
- const ContourImageSequence = getContourImageSequence(projectionPointsImageIds[index], metadataProvider);
1982
- return {
1983
- NumberOfContourPoints: ContourData.length / 3,
1984
- ContourImageSequence,
1985
- ContourGeometricType: 'CLOSED_PLANAR',
1986
- ContourData
1987
- };
1988
- });
1989
- }
1990
- }
1991
- RectangleROIStartEndThreshold_RectangleROIStartEndThreshold.toolName = 'RectangleROIStartEndThreshold';
1992
- function getPointData(points) {
1993
- // Since this is a closed contour, the order of the points is important.
1994
- // re-order the points to be in the correct order clockwise
1995
- // Spread to make sure Float32Arrays are converted to arrays
1996
- const orderedPoints = [...points[0], ...points[1], ...points[3], ...points[2]];
1997
- const pointsArray = orderedPoints.flat();
1998
-
1999
- // reduce the precision of the points to 2 decimal places
2000
- const pointsArrayWithPrecision = pointsArray.map(point => {
2001
- return point.toFixed(2);
2002
- });
2003
- return pointsArrayWithPrecision;
2004
- }
2005
- function getContourImageSequence(imageId, metadataProvider) {
2006
- const sopCommon = metadataProvider.get('sopCommonModule', imageId);
2007
- return {
2008
- ReferencedSOPClassUID: sopCommon.sopClassUID,
2009
- ReferencedSOPInstanceUID: sopCommon.sopInstanceUID
2010
- };
2011
- }
2012
- /* harmony default export */ const measurements_RectangleROIStartEndThreshold = (RectangleROIStartEndThreshold_RectangleROIStartEndThreshold);
2013
- ;// CONCATENATED MODULE: ../../../extensions/tmtv/src/utils/dicomRTAnnotationExport/RTStructureSet/measurements/AnnotationToPointData.js
2014
-
2015
- function validateAnnotation(annotation) {
2016
- if (!annotation?.data) {
2017
- throw new Error('Tool data is empty');
2018
- }
2019
- if (!annotation.metadata || annotation.metadata.referenceImageId) {
2020
- throw new Error('Tool data is not associated with any imageId');
2021
- }
2022
- }
2023
- class AnnotationToPointData {
2024
- constructor() {}
2025
- static convert(annotation, index, metadataProvider) {
2026
- validateAnnotation(annotation);
2027
- const {
2028
- toolName
2029
- } = annotation.metadata;
2030
- const toolClass = AnnotationToPointData.TOOL_NAMES[toolName];
2031
- if (!toolClass) {
2032
- throw new Error(`Unknown tool type: ${toolName}, cannot convert to RTSSReport`);
2033
- }
2034
-
2035
- // Each toolData should become a list of contours, ContourSequence
2036
- // contains a list of contours with their pointData, their geometry
2037
- // type and their length.
2038
- const ContourSequence = toolClass.getContourSequence(annotation, metadataProvider);
2039
-
2040
- // Todo: random rgb color for now, options should be passed in
2041
- const color = [Math.floor(Math.random() * 255), Math.floor(Math.random() * 255), Math.floor(Math.random() * 255)];
2042
- return {
2043
- ReferencedROINumber: index + 1,
2044
- ROIDisplayColor: color,
2045
- ContourSequence
2046
- };
2047
- }
2048
- static register(toolClass) {
2049
- AnnotationToPointData.TOOL_NAMES[toolClass.toolName] = toolClass;
2050
- }
2051
- }
2052
- AnnotationToPointData.TOOL_NAMES = {};
2053
- AnnotationToPointData.register(measurements_RectangleROIStartEndThreshold);
2054
- /* harmony default export */ const measurements_AnnotationToPointData = (AnnotationToPointData);
2055
1967
  // EXTERNAL MODULE: ../../../node_modules/dcmjs/build/dcmjs.es.js
2056
1968
  var dcmjs_es = __webpack_require__(67540);
2057
- ;// CONCATENATED MODULE: ../../../extensions/tmtv/src/utils/dicomRTAnnotationExport/RTStructureSet/RTSSReport.js
2058
-
2059
-
2060
-
2061
- const {
2062
- DicomMetaDictionary
2063
- } = dcmjs_es["default"].data;
2064
- class RTSSReport {
2065
- constructor() {}
2066
-
2067
- /**
2068
- * Convert handles to RTSSReport report object containing the dcmjs dicom dataset.
2069
- *
2070
- * Note: The tool data needs to be formatted in a specific way, and currently
2071
- * it is limited to the RectangleROIStartEndTool in the Cornerstone.
2072
- *
2073
- * @param annotations Array of Cornerstone tool annotation data
2074
- * @param metadataProvider Metadata provider
2075
- * @param options report generation options
2076
- * @returns Report object containing the dataset
2077
- */
2078
- static generateReport(annotations, metadataProvider, options) {
2079
- let dataset = initializeDataset(annotations, metadataProvider);
2080
- annotations.forEach((annotation, index) => {
2081
- const ContourSequence = measurements_AnnotationToPointData.convert(annotation, index, metadataProvider, options);
2082
- dataset.StructureSetROISequence.push(getStructureSetModule(annotation, index, metadataProvider));
2083
- dataset.ROIContourSequence.push(ContourSequence);
2084
- dataset.RTROIObservationsSequence.push(getRTROIObservationsSequence(annotation, index, metadataProvider));
2085
-
2086
- // ReferencedSeriesSequence
2087
- // Todo: handle more than one series
2088
- dataset.ReferencedSeriesSequence = getReferencedSeriesSequence(annotation, index, metadataProvider);
2089
-
2090
- // ReferencedFrameOfReferenceSequence
2091
- dataset.ReferencedFrameOfReferenceSequence = getReferencedFrameOfReferenceSequence(annotation, metadataProvider, dataset);
2092
- });
2093
- const fileMetaInformationVersionArray = new Uint8Array(2);
2094
- fileMetaInformationVersionArray[1] = 1;
2095
- const _meta = {
2096
- FileMetaInformationVersion: {
2097
- Value: [fileMetaInformationVersionArray.buffer],
2098
- vr: 'OB'
2099
- },
2100
- TransferSyntaxUID: {
2101
- Value: ['1.2.840.10008.1.2.1'],
2102
- vr: 'UI'
2103
- },
2104
- ImplementationClassUID: {
2105
- Value: [DicomMetaDictionary.uid()],
2106
- // TODO: could be git hash or other valid id
2107
- vr: 'UI'
2108
- },
2109
- ImplementationVersionName: {
2110
- Value: ['dcmjs'],
2111
- vr: 'SH'
2112
- }
2113
- };
2114
- dataset._meta = _meta;
2115
- return dataset;
2116
- }
2117
-
2118
- /**
2119
- * Generate Cornerstone tool state from dataset
2120
- * @param {object} dataset dataset
2121
- * @param {object} hooks
2122
- * @param {function} hooks.getToolClass Function to map dataset to a tool class
2123
- * @returns
2124
- */
2125
- static generateToolState(dataset) {
2126
- let hooks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2127
- // Todo
2128
- console.warn('RTSSReport.generateToolState not implemented');
2129
- }
2130
- }
2131
- function initializeDataset(annotations, metadataProvider) {
2132
- const rtSOPInstanceUID = DicomMetaDictionary.uid();
2133
-
2134
- // get the first annotation data
2135
- const {
2136
- referencedImageId: imageId,
2137
- FrameOfReferenceUID
2138
- } = annotations[0].metadata;
2139
- const {
2140
- studyInstanceUID
2141
- } = metadataProvider.get('generalSeriesModule', imageId);
2142
- const patientModule = getPatientModule(imageId, metadataProvider);
2143
- const rtSeriesModule = getRTSeriesModule(imageId, metadataProvider);
2144
- return {
2145
- StructureSetROISequence: [],
2146
- ROIContourSequence: [],
2147
- RTROIObservationsSequence: [],
2148
- ReferencedSeriesSequence: [],
2149
- ReferencedFrameOfReferenceSequence: [],
2150
- ...patientModule,
2151
- ...rtSeriesModule,
2152
- StudyInstanceUID: studyInstanceUID,
2153
- SOPClassUID: '1.2.840.10008.5.1.4.1.1.481.3',
2154
- // RT Structure Set Storage
2155
- SOPInstanceUID: rtSOPInstanceUID,
2156
- Manufacturer: 'dcmjs',
2157
- Modality: 'RTSTRUCT',
2158
- FrameOfReferenceUID,
2159
- PositionReferenceIndicator: '',
2160
- StructureSetLabel: '',
2161
- StructureSetName: '',
2162
- ReferringPhysicianName: '',
2163
- OperatorsName: '',
2164
- StructureSetDate: DicomMetaDictionary.date(),
2165
- StructureSetTime: DicomMetaDictionary.time()
2166
- };
2167
- }
2168
- function getPatientModule(imageId, metadataProvider) {
2169
- const generalSeriesModule = metadataProvider.get('generalSeriesModule', imageId);
2170
- const generalStudyModule = metadataProvider.get('generalStudyModule', imageId);
2171
- const patientStudyModule = metadataProvider.get('patientStudyModule', imageId);
2172
- const patientModule = metadataProvider.get('patientModule', imageId);
2173
- const patientDemographicModule = metadataProvider.get('patientDemographicModule', imageId);
2174
- return {
2175
- Modality: generalSeriesModule.modality,
2176
- PatientID: patientModule.patientId,
2177
- PatientName: patientModule.patientName,
2178
- PatientBirthDate: '',
2179
- PatientAge: patientStudyModule.patientAge,
2180
- PatientSex: patientDemographicModule.patientSex,
2181
- PatientWeight: patientStudyModule.patientWeight,
2182
- StudyDate: generalStudyModule.studyDate,
2183
- StudyTime: generalStudyModule.studyTime,
2184
- StudyID: 'ToDo',
2185
- AccessionNumber: generalStudyModule.accessionNumber
2186
- };
2187
- }
2188
- function getReferencedFrameOfReferenceSequence(toolData, metadataProvider, dataset) {
2189
- const {
2190
- referencedImageId: imageId,
2191
- FrameOfReferenceUID
2192
- } = toolData.metadata;
2193
- const instance = metadataProvider.get('instance', imageId);
2194
- const {
2195
- SeriesInstanceUID
2196
- } = instance;
2197
- const {
2198
- ReferencedSeriesSequence
2199
- } = dataset;
2200
- return [{
2201
- FrameOfReferenceUID,
2202
- RTReferencedStudySequence: [{
2203
- ReferencedSOPClassUID: dataset.SOPClassUID,
2204
- ReferencedSOPInstanceUID: dataset.SOPInstanceUID,
2205
- RTReferencedSeriesSequence: [{
2206
- SeriesInstanceUID,
2207
- ContourImageSequence: [...ReferencedSeriesSequence[0].ReferencedInstanceSequence]
2208
- }]
2209
- }]
2210
- }];
2211
- }
2212
- function getReferencedSeriesSequence(toolData, index, metadataProvider) {
2213
- // grab imageId from toolData
2214
- const {
2215
- referencedImageId: imageId
2216
- } = toolData.metadata;
2217
- const instance = metadataProvider.get('instance', imageId);
2218
- const {
2219
- SeriesInstanceUID,
2220
- StudyInstanceUID
2221
- } = instance;
2222
- const ReferencedSeriesSequence = [];
2223
- if (SeriesInstanceUID) {
2224
- const series = core_src.DicomMetadataStore.getSeries(StudyInstanceUID, SeriesInstanceUID);
2225
- const ReferencedSeries = {
2226
- SeriesInstanceUID,
2227
- ReferencedInstanceSequence: []
2228
- };
2229
- series.instances.forEach(instance => {
2230
- const {
2231
- SOPInstanceUID,
2232
- SOPClassUID
2233
- } = instance;
2234
- ReferencedSeries.ReferencedInstanceSequence.push({
2235
- ReferencedSOPClassUID: SOPClassUID,
2236
- ReferencedSOPInstanceUID: SOPInstanceUID
2237
- });
2238
- });
2239
- ReferencedSeriesSequence.push(ReferencedSeries);
2240
- }
2241
- return ReferencedSeriesSequence;
2242
- }
2243
- function getRTSeriesModule(imageId, metadataProvider) {
2244
- return {
2245
- SeriesInstanceUID: DicomMetaDictionary.uid(),
2246
- // generate a new series instance uid
2247
- SeriesNumber: '99' // Todo:: what should be the series number?
2248
- };
2249
- }
2250
-
2251
- function getStructureSetModule(toolData, index, metadataProvider) {
2252
- const {
2253
- FrameOfReferenceUID
2254
- } = toolData.metadata;
2255
- return {
2256
- ROINumber: index + 1,
2257
- ROIName: `Todo: name ${index + 1}`,
2258
- ROIDescription: `Todo: description ${index + 1}`,
2259
- ROIGenerationAlgorithm: 'Todo: algorithm',
2260
- ReferencedFrameOfReferenceUID: FrameOfReferenceUID
2261
- };
2262
- }
2263
- function getRTROIObservationsSequence(toolData, index, metadataProvider) {
2264
- return {
2265
- ObservationNumber: index + 1,
2266
- ReferencedROINumber: index + 1,
2267
- RTROIInterpretedType: 'Todo: type',
2268
- ROIInterpreter: 'Todo: interpreter'
2269
- };
2270
- }
1969
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/adapters/dist/adapters.es.js
1970
+ var adapters_es = __webpack_require__(91202);
2271
1971
  ;// CONCATENATED MODULE: ../../../extensions/tmtv/src/utils/dicomRTAnnotationExport/RTStructureSet/dicomRTAnnotationExport.js
2272
1972
 
2273
1973
 
@@ -2277,7 +1977,7 @@ const {
2277
1977
  } = dcmjs_es["default"].data;
2278
1978
  const metadataProvider = core_src.classes.MetadataProvider;
2279
1979
  function dicomRTAnnotationExport(annotations) {
2280
- const dataset = RTSSReport.generateReport(annotations, metadataProvider);
1980
+ const dataset = adapters_es.adaptersSEG.Cornerstone3D.RTStruct.RTSS.generateRTSSFromAnnotations(annotations, metadataProvider, core_src.DicomMetadataStore);
2281
1981
  const reportBlob = datasetToBlob(dataset);
2282
1982
 
2283
1983
  //Create a URL for the binary.
@@ -6462,7 +6462,7 @@ class SegmentationService extends src/* PubSubService */.hC {
6462
6462
  volumeId: segmentationId,
6463
6463
  targetBuffer: {
6464
6464
  type: 'Uint8Array',
6465
- sharedArrayBuffer: true
6465
+ sharedArrayBuffer: window.SharedArrayBuffer
6466
6466
  }
6467
6467
  });
6468
6468
  const defaultScheme = this._getDefaultSegmentationScheme();
@@ -7202,7 +7202,7 @@ class SegmentationService extends src/* PubSubService */.hC {
7202
7202
  volumeId: segmentationId,
7203
7203
  targetBuffer: {
7204
7204
  type: 'Uint8Array',
7205
- sharedArrayBuffer: true
7205
+ sharedArrayBuffer: window.SharedArrayBuffer
7206
7206
  }
7207
7207
  });
7208
7208
  const derivedVolumeScalarData = derivedVolume.getScalarData();
@@ -975,8 +975,8 @@ function WorkList(_ref) {
975
975
  };
976
976
  });
977
977
  const hasStudies = numOfStudies > 0;
978
- const versionNumber = "3.7.0-beta.101";
979
- const commitHash = "8bc12a37d0353160ae5ea4624dc0b244b7d59c07";
978
+ const versionNumber = "3.7.0-beta.103";
979
+ const commitHash = "4911e4796cef5e22cb7cc0ca73dc5c956bc75339";
980
980
  const menuOptions = [{
981
981
  title: t('Header:About'),
982
982
  icon: 'info',
@@ -1937,7 +1937,7 @@ async function loadModule(module) {
1937
1937
  return imported.default;
1938
1938
  }
1939
1939
  if (module === "@ohif/extension-measurement-tracking") {
1940
- const imported = await Promise.all(/* import() */[__webpack_require__.e(743), __webpack_require__.e(775), __webpack_require__.e(957), __webpack_require__.e(604), __webpack_require__.e(417), __webpack_require__.e(202), __webpack_require__.e(530), __webpack_require__.e(342), __webpack_require__.e(663), __webpack_require__.e(19)]).then(__webpack_require__.bind(__webpack_require__, 28030));
1940
+ const imported = await Promise.all(/* import() */[__webpack_require__.e(743), __webpack_require__.e(775), __webpack_require__.e(957), __webpack_require__.e(604), __webpack_require__.e(202), __webpack_require__.e(417), __webpack_require__.e(530), __webpack_require__.e(342), __webpack_require__.e(663), __webpack_require__.e(19)]).then(__webpack_require__.bind(__webpack_require__, 28030));
1941
1941
  return imported.default;
1942
1942
  }
1943
1943
  if (module === "@ohif/extension-cornerstone-dicom-sr") {
@@ -1945,7 +1945,7 @@ async function loadModule(module) {
1945
1945
  return imported.default;
1946
1946
  }
1947
1947
  if (module === "@ohif/extension-cornerstone-dicom-seg") {
1948
- const imported = await Promise.all(/* import() */[__webpack_require__.e(743), __webpack_require__.e(775), __webpack_require__.e(957), __webpack_require__.e(604), __webpack_require__.e(417), __webpack_require__.e(202), __webpack_require__.e(831), __webpack_require__.e(342), __webpack_require__.e(221)]).then(__webpack_require__.bind(__webpack_require__, 9943));
1948
+ const imported = await Promise.all(/* import() */[__webpack_require__.e(743), __webpack_require__.e(775), __webpack_require__.e(957), __webpack_require__.e(604), __webpack_require__.e(202), __webpack_require__.e(417), __webpack_require__.e(757), __webpack_require__.e(342), __webpack_require__.e(221)]).then(__webpack_require__.bind(__webpack_require__, 9943));
1949
1949
  return imported.default;
1950
1950
  }
1951
1951
  if (module === "@ohif/extension-dicom-microscopy") {
@@ -1961,7 +1961,7 @@ async function loadModule(module) {
1961
1961
  return imported.default;
1962
1962
  }
1963
1963
  if (module === "@ohif/extension-tmtv") {
1964
- const imported = await Promise.all(/* import() */[__webpack_require__.e(743), __webpack_require__.e(775), __webpack_require__.e(957), __webpack_require__.e(782)]).then(__webpack_require__.bind(__webpack_require__, 43851));
1964
+ const imported = await Promise.all(/* import() */[__webpack_require__.e(743), __webpack_require__.e(775), __webpack_require__.e(957), __webpack_require__.e(202), __webpack_require__.e(788)]).then(__webpack_require__.bind(__webpack_require__, 4483));
1965
1965
  return imported.default;
1966
1966
  }
1967
1967
  if (module === "@ohif/extension-test") {
@@ -8674,7 +8674,7 @@ const detectionOptions = {
8674
8674
  }
8675
8675
  });
8676
8676
  ;// CONCATENATED MODULE: ../../i18n/package.json
8677
- const package_namespaceObject = JSON.parse('{"i8":"3.7.0-beta.100"}');
8677
+ const package_namespaceObject = JSON.parse('{"i8":"3.7.0-beta.102"}');
8678
8678
  ;// CONCATENATED MODULE: ../../i18n/src/utils.js
8679
8679
  const languagesMap = {
8680
8680
  ar: 'Arabic',
@@ -12091,42 +12091,40 @@ var iconToolBrush = function iconToolBrush(props) {
12091
12091
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", props, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("g", {
12092
12092
  fill: "none",
12093
12093
  fillRule: "evenodd"
12094
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("g", {
12094
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12095
+ d: "M3.246 22.329a.432.432 0 0 1 .024-.79c2.056-.833 1.394-3.177 2.004-4.43a3.075 3.075 0 0 1 4.083-1.405c4.592 2.238-.874 9.117-6.11 6.625ZM21.597 3.302a1.194 1.194 0 0 0-1.635.045L9.692 13.589a5.196 5.196 0 0 1 3.129 2.646l8.92-11.298a1.194 1.194 0 0 0-.144-1.635Z",
12095
12096
  stroke: "currentColor",
12097
+ strokeWidth: "1.25",
12096
12098
  strokeLinecap: "round",
12097
- strokeLinejoin: "round",
12098
- strokeWidth: "1.75"
12099
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12100
- d: "M1.16 23.256a.5.5 0 0 1 .027-.915c2.381-.964 1.614-3.678 2.321-5.13a3.56 3.56 0 0 1 4.728-1.626c5.316 2.592-1.012 10.557-7.076 7.67ZM22.408 1.225a1.382 1.382 0 0 0-1.893.052L8.625 13.136a6.017 6.017 0 0 1 3.621 3.064l10.33-13.082a1.382 1.382 0 0 0-.168-1.893Z"
12101
- })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12102
- d: "M-.625-.125h25v25h-25z"
12099
+ strokeLinejoin: "round"
12100
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12101
+ d: "M0 0h25v25H0z"
12103
12102
  })));
12104
12103
  };
12105
12104
  iconToolBrush.defaultProps = {
12106
- width: "23.749",
12107
- height: "24.749",
12108
- viewBox: "0 0 23.749 24.749",
12105
+ width: "25",
12106
+ height: "25",
12107
+ viewBox: "0 0 25 25",
12109
12108
  xmlns: "http://www.w3.org/2000/svg"
12110
12109
  };
12111
12110
  var iconToolEraser = function iconToolEraser(props) {
12112
12111
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", props, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("g", {
12113
12112
  fill: "none",
12114
12113
  fillRule: "evenodd"
12115
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("g", {
12114
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12115
+ d: "M8.391 20.504a5.08 5.08 0 0 1-3.118-1.291l-1.982-1.984a1.832 1.832 0 0 1 0-2.583L14.404 3.533a1.832 1.832 0 0 1 2.583 0l4.721 4.721c.71.715.71 1.869 0 2.583l-8.373 8.374a5.08 5.08 0 0 1-3.118 1.293H8.391ZM10.217 7.719l7.305 7.305M2 22.328h21",
12116
12116
  stroke: "currentColor",
12117
+ strokeWidth: "1.25",
12117
12118
  strokeLinecap: "round",
12118
- strokeLinejoin: "round",
12119
- strokeWidth: "1.25"
12120
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12121
- d: "M7.625 19.795a5.564 5.564 0 0 1-3.415-1.414l-2.171-2.173a2.006 2.006 0 0 1 0-2.829L14.21 1.21a2.006 2.006 0 0 1 2.829 0l5.171 5.17a2.006 2.006 0 0 1 0 2.83l-9.171 9.17a5.564 5.564 0 0 1-3.414 1.416h-2ZM9.625 5.794l8 8M.625 21.794h23"
12122
- })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12123
- d: "M-.375-1.375h25v25h-25z"
12119
+ strokeLinejoin: "round"
12120
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12121
+ d: "M0 0h25v25H0z"
12124
12122
  })));
12125
12123
  };
12126
12124
  iconToolEraser.defaultProps = {
12127
- width: "24.25",
12128
- height: "22.418",
12129
- viewBox: "0 0 24.25 22.418",
12125
+ width: "25",
12126
+ height: "25",
12127
+ viewBox: "0 0 25 25",
12130
12128
  xmlns: "http://www.w3.org/2000/svg"
12131
12129
  };
12132
12130
  var iconToolScissor = function iconToolScissor(props) {
@@ -12161,36 +12159,68 @@ iconToolScissor.defaultProps = {
12161
12159
  viewBox: "0 0 24.25 20.25",
12162
12160
  xmlns: "http://www.w3.org/2000/svg"
12163
12161
  };
12164
- var iconToolThreshold = function iconToolThreshold(props) {
12162
+ var iconToolShape = function iconToolShape(props) {
12165
12163
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", props, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("g", {
12166
12164
  fill: "none",
12167
12165
  fillRule: "evenodd"
12168
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("g", {
12166
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12167
+ d: "M0 0h25v25H0z"
12168
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("rect", {
12169
12169
  stroke: "currentColor",
12170
- transform: "translate(.75 .75)",
12171
- strokeWidth: "1.5"
12170
+ strokeWidth: "1.5",
12171
+ x: "3",
12172
+ y: "3",
12173
+ width: "13",
12174
+ height: "13",
12175
+ rx: "1"
12176
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("circle", {
12177
+ stroke: "currentColor",
12178
+ strokeWidth: "1.5",
12179
+ cx: "16.5",
12180
+ cy: "16.5",
12181
+ r: "6.5"
12182
+ })));
12183
+ };
12184
+ iconToolShape.defaultProps = {
12185
+ width: "25",
12186
+ height: "25",
12187
+ viewBox: "0 0 25 25",
12188
+ xmlns: "http://www.w3.org/2000/svg"
12189
+ };
12190
+ var iconToolThreshold = function iconToolThreshold(props) {
12191
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", props, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("g", {
12192
+ fill: "none",
12193
+ fillRule: "evenodd"
12172
12194
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12195
+ stroke: "currentColor",
12196
+ strokeWidth: "1.25",
12173
12197
  strokeLinecap: "round",
12174
- d: "M19.5 12.5H23M0 12.5h14"
12198
+ d: "M19.457 16.87H22.5M2.5 16.87h12.174"
12175
12199
  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("circle", {
12176
- cx: "16.5",
12177
- cy: "12.5",
12178
- r: "2.5"
12200
+ stroke: "currentColor",
12201
+ strokeWidth: "1.25",
12202
+ cx: "16.848",
12203
+ cy: "16.87",
12204
+ r: "2.174"
12179
12205
  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12206
+ stroke: "currentColor",
12207
+ strokeWidth: "1.25",
12180
12208
  strokeLinecap: "round",
12181
- d: "M10.5 2.5h12M0 2.5h5.5"
12209
+ d: "M11.63 8.174h10.435M2.5 8.174h4.783"
12182
12210
  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("circle", {
12183
- cx: "8",
12184
- cy: "2.5",
12185
- r: "2.5"
12186
- })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12187
- d: "M-.25-4.25h25v25h-25z"
12211
+ stroke: "currentColor",
12212
+ strokeWidth: "1.25",
12213
+ cx: "9.457",
12214
+ cy: "8.174",
12215
+ r: "2.174"
12216
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", {
12217
+ d: "M0 0h25v25H0z"
12188
12218
  })));
12189
12219
  };
12190
12220
  iconToolThreshold.defaultProps = {
12191
- width: "24.5",
12192
- height: "16.5",
12193
- viewBox: "0 0 24.5 16.5",
12221
+ width: "25",
12222
+ height: "25",
12223
+ viewBox: "0 0 25 25",
12194
12224
  xmlns: "http://www.w3.org/2000/svg"
12195
12225
  };
12196
12226
  /** Old OHIF */
@@ -12364,6 +12394,7 @@ const ICONS = {
12364
12394
  'icon-tool-brush': iconToolBrush,
12365
12395
  'icon-tool-eraser': iconToolEraser,
12366
12396
  'icon-tool-scissor': iconToolScissor,
12397
+ 'icon-tool-shape': iconToolShape,
12367
12398
  'icon-tool-threshold': iconToolThreshold,
12368
12399
  /** Old OHIF */
12369
12400
  'old-trash': oldTrash,
@@ -33906,6 +33937,7 @@ function SegmentationDropDownRow(_ref) {
33906
33937
  onToggleSegmentationVisibility,
33907
33938
  onSegmentationEdit,
33908
33939
  onSegmentationDownload,
33940
+ onSegmentationDownloadRTSS,
33909
33941
  storeSegmentation,
33910
33942
  onSegmentationDelete,
33911
33943
  onSegmentationAdd
@@ -33933,6 +33965,7 @@ function SegmentationDropDownRow(_ref) {
33933
33965
  alignment: "left",
33934
33966
  itemsClassName: "text-primary-active",
33935
33967
  showBorders: false,
33968
+ maxCharactersPerLine: 30,
33936
33969
  list: [...(!disableEditing ? [{
33937
33970
  title: 'Add New Segmentation',
33938
33971
  onClick: () => {
@@ -33954,10 +33987,15 @@ function SegmentationDropDownRow(_ref) {
33954
33987
  storeSegmentation(activeSegmentation.id);
33955
33988
  }
33956
33989
  }] : []), ...[{
33957
- title: 'Download',
33990
+ title: 'Download DICOM SEG',
33958
33991
  onClick: () => {
33959
33992
  onSegmentationDownload(activeSegmentation.id);
33960
33993
  }
33994
+ }, {
33995
+ title: 'Download DICOM RTSTRUCT',
33996
+ onClick: () => {
33997
+ onSegmentationDownloadRTSS(activeSegmentation.id);
33998
+ }
33961
33999
  }]]
33962
34000
  }, /*#__PURE__*/react.createElement("div", {
33963
34001
  className: "hover:bg-secondary-dark mx-1 grid h-[28px] w-[28px] cursor-pointer place-items-center rounded-[4px]"
@@ -34004,6 +34042,7 @@ SegmentationDropDownRow.propTypes = {
34004
34042
  onToggleSegmentationVisibility: (prop_types_default()).func,
34005
34043
  onSegmentationEdit: (prop_types_default()).func,
34006
34044
  onSegmentationDownload: (prop_types_default()).func,
34045
+ onSegmentationDownloadRTSS: (prop_types_default()).func,
34007
34046
  storeSegmentation: (prop_types_default()).func,
34008
34047
  onSegmentationDelete: (prop_types_default()).func,
34009
34048
  onSegmentationAdd: (prop_types_default()).func
@@ -34247,6 +34286,7 @@ const SegmentationGroupTable = _ref => {
34247
34286
  onSegmentationClick,
34248
34287
  onSegmentationDelete,
34249
34288
  onSegmentationDownload,
34289
+ onSegmentationDownloadRTSS,
34250
34290
  storeSegmentation,
34251
34291
  // segment handlers
34252
34292
  onSegmentClick,
@@ -34321,6 +34361,7 @@ const SegmentationGroupTable = _ref => {
34321
34361
  onSegmentationDelete: onSegmentationDelete,
34322
34362
  onSegmentationEdit: onSegmentationEdit,
34323
34363
  onSegmentationDownload: onSegmentationDownload,
34364
+ onSegmentationDownloadRTSS: onSegmentationDownloadRTSS,
34324
34365
  storeSegmentation: storeSegmentation,
34325
34366
  onSegmentationAdd: onSegmentationAdd,
34326
34367
  onToggleSegmentationVisibility: onToggleSegmentationVisibility
@@ -34383,6 +34424,7 @@ SegmentationGroupTable.propTypes = {
34383
34424
  onSegmentationClick: (prop_types_default()).func.isRequired,
34384
34425
  onSegmentationDelete: (prop_types_default()).func.isRequired,
34385
34426
  onSegmentationDownload: (prop_types_default()).func.isRequired,
34427
+ onSegmentationDownloadRTSS: (prop_types_default()).func.isRequired,
34386
34428
  storeSegmentation: (prop_types_default()).func.isRequired,
34387
34429
  onSegmentClick: (prop_types_default()).func.isRequired,
34388
34430
  onSegmentAdd: (prop_types_default()).func.isRequired,
@@ -34411,6 +34453,7 @@ SegmentationGroupTable.defaultProps = {
34411
34453
  onSegmentationClick: () => {},
34412
34454
  onSegmentationDelete: () => {},
34413
34455
  onSegmentationDownload: () => {},
34456
+ onSemgnetationDownloadRTSS: () => {},
34414
34457
  storeSegmentation: () => {},
34415
34458
  onSegmentClick: () => {},
34416
34459
  onSegmentAdd: () => {},
@@ -159400,7 +159443,7 @@ var selectOrdinal = function selectOrdinal() {
159400
159443
  /******/ // This function allow to reference async chunks
159401
159444
  /******/ __webpack_require__.u = (chunkId) => {
159402
159445
  /******/ // return url for filenames based on template
159403
- /******/ return "" + (chunkId === 18 ? "dicom-microscopy-viewer" : chunkId) + ".bundle." + {"12":"596ce30cd85f6b9a1e47","18":"2c146384eb9466d02ff8","19":"ce766e7df8a696dbbf02","23":"e008ad788170f2ed5569","82":"be2ff9210bb2fad38907","99":"9bd882e014262ad3ebf4","125":"253395f320b72180da63","181":"169383e9b1a0358b44e8","202":"96bbb4547a346fe3921f","220":"f7e1c96c94245e70f2be","221":"dcacfa132a78c43ae8fe","236":"63061204c6e1d3ebda51","250":"8084960e3318cda37317","281":"e8f6e02a0cb9ef57e70f","342":"d44d95d71fb2e5d12367","359":"69603175835e0b5b7532","370":"25df86d9d452b1774297","410":"f8924c20812caea77a95","417":"af0a207c29b109f84159","451":"9fd36f52ff69594f0669","471":"b3d77b83b1593c09a504","506":"a788df1a79060b03fdb0","530":"a03b6f942ace3e1baa1e","579":"8fc434a0c13d3f662d42","604":"a51f83e64004bca5f497","613":"1044517a8a209ba730f6","663":"f96cd84411734fc5cbd5","686":"dccef1f36e4bc79bcc48","687":"e79e2ab836a1d2adacf4","743":"4bfe6e562ffb2c22708f","774":"7528cba56a1407357144","775":"2285e7e0e67878948c0d","782":"c7c9b143e04a7ef54d1d","814":"573f81eb69e871f5deb0","822":"0545d6dbb49515aa04ee","831":"83658f62fcc769043605","886":"4b3a7f2079d085fdbcb3","957":"71558794566041f37a92"}[chunkId] + ".js";
159446
+ /******/ return "" + (chunkId === 18 ? "dicom-microscopy-viewer" : chunkId) + ".bundle." + {"12":"1aabdfb5ae5e2b35227d","18":"2c146384eb9466d02ff8","19":"630c39bd619e2972f28c","23":"e008ad788170f2ed5569","82":"a0573d156476c90d027d","99":"f1e44cd6ede9d2782697","125":"253395f320b72180da63","181":"ceb057236403bcb630ac","202":"d3490836f71e001dd30f","220":"f7e1c96c94245e70f2be","221":"fa691676166a763b3532","236":"0dd5d6e378bd111ee299","250":"8084960e3318cda37317","281":"e69fa5589df69f09bef4","342":"ebb4ecaa8c01121ba631","359":"f98356e616452aabcecf","370":"0b6840140282701c2b50","410":"b79b78e6f05d934baabb","417":"af0a207c29b109f84159","451":"9fd36f52ff69594f0669","471":"b3d77b83b1593c09a504","506":"3595d92c1184b4bcc672","530":"a03b6f942ace3e1baa1e","579":"8fc434a0c13d3f662d42","604":"a51f83e64004bca5f497","613":"0b467379f6e2c48310eb","663":"1557498a7e6611c89820","686":"dccef1f36e4bc79bcc48","687":"6dca84018ee6521f9e39","743":"495448aa95758144af74","757":"ec8301d8e70d2b990f65","774":"4b2dc46a35012b898e1a","775":"2285e7e0e67878948c0d","788":"fe33643e596da75dd819","814":"11686c2624a07d288fcc","822":"891f2e57b1b7bc2f4cb4","886":"4b3a7f2079d085fdbcb3","957":"0fba9c5956bdb9972c73"}[chunkId] + ".js";
159404
159447
  /******/ };
159405
159448
  /******/ })();
159406
159449
  /******/
package/dist/index.html CHANGED
@@ -1,2 +1,2 @@
1
1
  <!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"/><meta name="theme-color" content="#000000"/><meta name="mobile-web-app-capable" content="yes"/><meta name="application-name" content="OHIF Viewer"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><meta name="apple-mobile-web-app-title" content="@ohif/app"/><meta name="msapplication-TileColor" content="#fff"/><meta name="msapplication-TileImage" content="/assets/mstile-144x144.png"/><meta name="msapplication-config" content="/assets/browserconfig.xml"/><script>console.time('scriptToView');
2
- window.PUBLIC_URL = '/';</script><link rel="manifest" href="/manifest.json"/><link rel="shortcut icon" href="/assets/favicon.ico"/><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"/><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"/><link rel="apple-touch-icon" sizes="57x57" href="/assets/apple-touch-icon-57x57.png"/><link rel="apple-touch-icon" sizes="60x60" href="/assets/apple-touch-icon-60x60.png"/><link rel="apple-touch-icon" sizes="72x72" href="/assets/apple-touch-icon-72x72.png"/><link rel="apple-touch-icon" sizes="76x76" href="/assets/apple-touch-icon-76x76.png"/><link rel="apple-touch-icon" sizes="114x114" href="/assets/apple-touch-icon-114x114.png"/><link rel="apple-touch-icon" sizes="120x120" href="/assets/apple-touch-icon-120x120.png"/><link rel="apple-touch-icon" sizes="144x144" href="/assets/apple-touch-icon-144x144.png"/><link rel="apple-touch-icon" sizes="152x152" href="/assets/apple-touch-icon-152x152.png"/><link rel="apple-touch-icon" sizes="167x167" href="/assets/apple-touch-icon-167x167.png"/><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon-180x180.png"/><link rel="apple-touch-icon" sizes="1024x1024" href="/assets/apple-touch-icon-1024x1024.png"/><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 480px) and (-webkit-device-pixel-ratio: 1)" href="/assets/apple-touch-startup-image-320x460.png"/><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 480px) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-640x920.png"/><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-640x1096.png"/><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-750x1294.png"/><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 3)" href="/assets/apple-touch-startup-image-1182x2208.png"/><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 3)" href="/assets/apple-touch-startup-image-1242x2148.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 1)" href="/assets/apple-touch-startup-image-748x1024.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 1)" href="/assets/apple-touch-startup-image-768x1004.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-1496x2048.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-1536x2008.png"/><link rel="icon" type="image/png" sizes="228x228" href="/assets/coast-228x228.png"/><link rel="yandex-tableau-widget" href="/assets/yandex-browser-manifest.json"/><script rel="preload" as="script" src="/app-config.js"></script><script rel="preload" as="script" type="module" src="/init-service-worker.js"></script><title>OHIF Viewer</title><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/><link href="https://fonts.googleapis.com/css?family=Inter:100,300,400,500,700&display=swap" rel="stylesheet" rel="preload" as="style"/><script defer="defer" src="/app.bundle.7d673420913b4ea775e5.js"></script><link href="/app.bundle.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
2
+ window.PUBLIC_URL = '/';</script><link rel="manifest" href="/manifest.json"/><link rel="shortcut icon" href="/assets/favicon.ico"/><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"/><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"/><link rel="apple-touch-icon" sizes="57x57" href="/assets/apple-touch-icon-57x57.png"/><link rel="apple-touch-icon" sizes="60x60" href="/assets/apple-touch-icon-60x60.png"/><link rel="apple-touch-icon" sizes="72x72" href="/assets/apple-touch-icon-72x72.png"/><link rel="apple-touch-icon" sizes="76x76" href="/assets/apple-touch-icon-76x76.png"/><link rel="apple-touch-icon" sizes="114x114" href="/assets/apple-touch-icon-114x114.png"/><link rel="apple-touch-icon" sizes="120x120" href="/assets/apple-touch-icon-120x120.png"/><link rel="apple-touch-icon" sizes="144x144" href="/assets/apple-touch-icon-144x144.png"/><link rel="apple-touch-icon" sizes="152x152" href="/assets/apple-touch-icon-152x152.png"/><link rel="apple-touch-icon" sizes="167x167" href="/assets/apple-touch-icon-167x167.png"/><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon-180x180.png"/><link rel="apple-touch-icon" sizes="1024x1024" href="/assets/apple-touch-icon-1024x1024.png"/><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 480px) and (-webkit-device-pixel-ratio: 1)" href="/assets/apple-touch-startup-image-320x460.png"/><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 480px) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-640x920.png"/><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-640x1096.png"/><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-750x1294.png"/><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 3)" href="/assets/apple-touch-startup-image-1182x2208.png"/><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 3)" href="/assets/apple-touch-startup-image-1242x2148.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 1)" href="/assets/apple-touch-startup-image-748x1024.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 1)" href="/assets/apple-touch-startup-image-768x1004.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-1496x2048.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-1536x2008.png"/><link rel="icon" type="image/png" sizes="228x228" href="/assets/coast-228x228.png"/><link rel="yandex-tableau-widget" href="/assets/yandex-browser-manifest.json"/><script rel="preload" as="script" src="/app-config.js"></script><script rel="preload" as="script" type="module" src="/init-service-worker.js"></script><title>OHIF Viewer</title><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/><link href="https://fonts.googleapis.com/css?family=Inter:100,300,400,500,700&display=swap" rel="stylesheet" rel="preload" as="style"/><script defer="defer" src="/app.bundle.af8d271d6a055aea0d7e.js"></script><link href="/app.bundle.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>