@ohif/extension-cornerstone-dicom-sr 3.11.0-beta.76 → 3.11.0-beta.78

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.
@@ -1,2 +1,2 @@
1
1
  /*! For license information please see ohif-extension-cornerstone-dicom-sr.umd.js.LICENSE.txt */
2
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("@ohif/i18n"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/adapters"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("gl-matrix"),require("dcmjs"),require("@ohif/ui-next"),require("@ohif/core/src/contextProviders/SystemProvider")):"function"==typeof define&&define.amd?define(["@ohif/core","@ohif/i18n","@ohif/extension-cornerstone","@cornerstonejs/adapters","@cornerstonejs/tools","@cornerstonejs/core","gl-matrix","dcmjs","@ohif/ui-next","@ohif/core/src/contextProviders/SystemProvider"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-sr"]=t(require("@ohif/core"),require("@ohif/i18n"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/adapters"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("gl-matrix"),require("dcmjs"),require("@ohif/ui-next"),require("@ohif/core/src/contextProviders/SystemProvider")):e["ohif-extension-cornerstone-dicom-sr"]=t(e["@ohif/core"],e["@ohif/i18n"],e["@ohif/extension-cornerstone"],e["@cornerstonejs/adapters"],e["@cornerstonejs/tools"],e["@cornerstonejs/core"],e["gl-matrix"],e.dcmjs,e["@ohif/ui-next"],e["@ohif/core/src/contextProviders/SystemProvider"])}(globalThis,((e,t,n,o,r,a,s,i,c,l)=>(()=>{var u,d,f={525:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>O});var o=n(598),r=n.n(o),a=n(326),s=n(2),i=n(942),c=n(291),l=n(669),u=n(55),d=n(492);function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)({}).hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},f.apply(null,arguments)}function p(e){const{servicesManager:t}=(0,d.useSystem)(),{children:n,dataSource:o,displaySets:r,viewportOptions:s}=e,{displaySetService:p}=t.services,m=s.viewportId;if(r.length>1)throw new Error("SR viewport should only have a single display set");const S=r[0],{setPositionPresentation:g}=(0,l.usePositionPresentationStore)(),[h,I]=(0,u.useViewportGrid)(),[y,C]=(0,a.useState)(0),[R,T]=(0,a.useState)(null),[O,D]=(0,a.useState)(null),[v,E]=(0,a.useState)(null),{viewports:b,activeViewportId:w}=h,N=(0,a.useCallback)((e=>{const{measurements:t}=S;(0,i.m1)(v,t.map((e=>e.TrackingUniqueIdentifier)),e)}),[v,y,S]),x=(0,a.useCallback)((e=>{const{StudyInstanceUID:t,displaySetInstanceUID:n,sopClassUids:o}=S;t&&n&&(o&&o.length>1&&console.warn("More than one SOPClassUID in the same series is not yet supported."),async function(e,t,n){const{measurements:o}=e,r=o[t],{displaySetInstanceUID:a}=r;e.keyImageDisplaySet||(e.keyImageDisplaySet=(0,c.A)(n,e));if(!a)return{referencedDisplaySetMetadata:null,referencedDisplaySet:null};const s=n.getDisplaySetByUID(a),i=s.images[0],l={PatientID:i.PatientID,PatientName:i.PatientName,PatientSex:i.PatientSex,PatientAge:i.PatientAge,SliceThickness:i.SliceThickness,StudyDate:i.StudyDate,SeriesDescription:i.SeriesDescription,SeriesInstanceUID:i.SeriesInstanceUID,SeriesNumber:i.SeriesNumber,ManufacturerModelName:i.ManufacturerModelName,SpacingBetweenSlices:i.SpacingBetweenSlices};return{referencedDisplaySetMetadata:l,referencedDisplaySet:s}}(S,e,p).then((({referencedDisplaySet:t,referencedDisplaySetMetadata:n})=>{if(!t||!n)return;C(e),T(t),D(n);const{presentationIds:o}=s,r=S.measurements[e];g(o.positionPresentationId,{viewReference:{referencedImageId:r.imageId}})})))}),[o,S,R,m]),U=(0,a.useCallback)((()=>{if(!R)return null;const{measurements:t}=S;return t[y]?a.createElement(l.OHIFCornerstoneViewport,f({},e,{displaySets:[R],viewportOptions:{...s,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:t=>{e.onElementEnabled?.(t),(e=>{E(e.detail.element)})(t)},isJumpToMeasurementDisabled:!0})):null}),[R,m,y]);(0,a.useEffect)((()=>{const e=p.subscribe(p.EVENTS.DISPLAY_SETS_REMOVED,(({displaySetInstanceUIDs:e})=>{const t=b.get(w);e.includes(t.displaySetInstanceUID)&&I.setDisplaySetsForViewport({viewportId:w,displaySetInstanceUIDs:[]})}));return()=>{e.unsubscribe()}}),[]),(0,a.useEffect)((()=>{(async()=>{S.isLoaded||await S.load(),x(y)})()}),[S]),(0,a.useEffect)((()=>{(async()=>{S.isLoaded||await S.load(),v&&S.isLoaded&&N(y)})()}),[y,v,N,S]);let M=null;return R&&O?(n&&n.length&&(M=n.map(((e,t)=>e&&a.cloneElement(e,{viewportId:m,key:t})))),a.createElement(a.Fragment,null,a.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},U(),M))):null}p.propTypes={displaySets:r().arrayOf(r().object),viewportId:r().string.isRequired,dataSource:r().object,children:r().node,viewportLabel:r().string,viewportOptions:r().object};const m=p;var S=n(193);const g={TEXT:e=>e.TextValue,CODE:e=>e.ConceptCodeSequence?.[0]?.CodeMeaning,UIDREF:e=>e.UID,NUM:e=>{const t=e.MeasuredValueSequence?.[0];if(!t)return;const{NumericValue:n,MeasurementUnitsCodeSequence:o}=t,{CodeValue:r}=o;return`${n} ${r}`},PNAME:e=>{const t=e.PersonName?.[0];return t?s.utils.formatPN(t):void 0},DATE:e=>{const{Date:t}=e;return t?s.utils.formatDate(t):void 0},TIME:e=>{const{Time:t}=e;return t?s.utils.formatTime(t):void 0},DATETIME:e=>{const{DateTime:t}=e;if("string"!=typeof t)return;if(t.length<14)return t;const n=t.substring(0,8),o=t.substring(8,14);return`${s.utils.formatDate(n)} ${s.utils.formatTime(o)}`}};function h(e){const{contentItem:t,nodeIndexesTree:n,continuityOfContent:o}=e,{ConceptNameCodeSequence:r}=t,{CodeValue:s,CodeMeaning:i}=r,c=0===n[n.length-1],l=function(e){const{ValueType:t}=e,n=g[t];return n?n(e):`[${t} is not supported]`}(t)??"[empty]",u="CONTINUOUS"===o,d=s===S.n7.Finding,f=u&&!c&&/^[a-zA-Z0-9]/.test(l?.[0]);let p="whitespace-pre-line";return s===S.n7.Finding&&(p="whitespace-pre-wrap"),u?a.createElement(a.Fragment,null,a.createElement("span",{className:p,title:i},f?" ":"",l)):a.createElement(a.Fragment,null,a.createElement("div",{className:"mb-2"},a.createElement("span",{className:"font-bold"},i,": "),d?a.createElement("pre",null,l):a.createElement("span",{className:p},l)))}function I(){return I=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)({}).hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},I.apply(null,arguments)}function y(e){const{container:t,nodeIndexesTree:n=[0],containerNumberedTree:o=[1]}=e,{ContinuityOfContent:r,ConceptNameCodeSequence:s}=t,{CodeMeaning:i}=s??{};let c=1;const l=t.ContentSequence?.map(((e,t)=>{const{ValueType:s}=e,i=[...n,t],l=i.join(".");let u,d;if("CONTAINER"===s){u=y,d={container:e,nodeIndexesTree:i,containerNumberedTree:[...o,c++]}}else u=h,d={contentItem:e,nodeIndexesTree:i,continuityOfContent:r};return a.createElement(u,I({key:l},d))}));return a.createElement("div",null,a.createElement("div",{className:"font-bold"},o.join("."),". ",i),a.createElement("div",{className:"ml-4 mb-2"},l))}function C(e){const{displaySets:t}=e,n=t[0].instances[0];return a.createElement("div",{className:"relative flex h-full w-full flex-col overflow-auto p-4 text-white"},a.createElement("div",null,a.createElement(y,{container:n})))}h.propTypes={contentItem:r().object,nodeIndexesTree:r().arrayOf(r().number),continuityOfContent:r().string},y.propTypes={container:r().object,nodeIndexesTree:r().arrayOf(r().number),containerNumberedTree:r().arrayOf(r().number)},C.propTypes={displaySets:r().arrayOf(r().object),viewportId:r().string.isRequired,dataSource:r().object,children:r().node,viewportLabel:r().string,viewportOptions:r().object,servicesManager:r().object.isRequired,extensionManager:r().instanceOf(s.ExtensionManager).isRequired};const R=C;function T(e){const{displaySets:t}=e,{isImagingMeasurementReport:n}=t[0];return n?a.createElement(m,e):a.createElement(R,e)}T.propTypes={displaySets:r().arrayOf(r().object),viewportId:r().string.isRequired,dataSource:r().object,children:r().node,viewportLabel:r().string,viewportOptions:r().object,servicesManager:r().object.isRequired,extensionManager:r().instanceOf(s.ExtensionManager).isRequired};const O=T},193:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>c,bY:()=>i,n7:()=>s,sh:()=>a});var o=n(142);const{CodeScheme:r}=o.adaptersSR.Cornerstone3D,a={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"},s={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",FindingSiteSCT:"363698007"},i={SRT:"SRT",SCT:"SCT",CornerstoneCodeSchemes:[r.CodingSchemeDesignator,"CST4"]},c={CodeNameCodeSequenceValues:s,CodingSchemeDesignators:i,RelationshipType:{INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},SCOORDTypes:a}},942:(e,t,n)=>{"use strict";n.d(t,{eF:()=>s,m1:()=>a});var o=n(557);const r={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function a(e,t,n=0){const a=(0,o.getEnabledElement)(e),{viewport:s}=a;r.trackingIdentifiersByViewportId[s.id]={trackingUniqueIdentifiers:t,activeIndex:n}}function s(e){const t=(0,o.getEnabledElement)(e),{viewport:n}=t;return r.trackingIdentifiersByViewportId[n.id]?r.trackingIdentifiersByViewportId[n.id]:{trackingUniqueIdentifiers:[]}}},291:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var o=n(2);const r=o.classes.ImageSet,a=(e,t)=>{const{displaySetInstanceUID:n,ReferencedSOPInstanceUID:o}=e,r=t.getDisplaySetByUID(n);if(r.images)return r.images.find((e=>e.SOPInstanceUID===o))},s=(e,t)=>{const n=[],o={};for(const r of t.measurements){const{imageId:t}=r;if(!t)continue;if(o[t])continue;const s=a(r,e);s?(o[t]=s,n.push(s)):console.log("Measurement",r,"had no instances found")}return n},i=(e,t)=>{const n=s(e,t),o=new r(n),a=n[0];if(a)return o.setAttributes({displaySetInstanceUID:o.uid,SeriesDate:a.SeriesDate,SeriesTime:a.SeriesTime,SeriesInstanceUID:o.uid,StudyInstanceUID:a.StudyInstanceUID,SeriesNumber:a.SeriesNumber||0,SOPClassUID:a.SOPClassUID,SeriesDescription:`${t.SeriesDescription} KO ${t.instance.SeriesNumber}`,Modality:"KO",isMultiFrame:!1,numImageFrames:n.length,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",isReconstructable:!1,isCompositeStack:!0,madeInClient:!0,excludeFromThumbnailBrowser:!0,updateInstances:function(){this.images.splice(0,this.images.length,...s(e,t)),this.numImageFrames=this.images.length}}),e.addDisplaySets(o),o}},856:(e,t,n)=>{"use strict";var o=n(183);function r(){}function a(){}a.resetWarningCache=r,e.exports=function(){function e(e,t,n,r,a,s){if(s!==o){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:r};return n.PropTypes=n,n}},598:(e,t,n)=>{e.exports=n(856)()},183:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},249:(e,t)=>{"use strict";var n=Symbol.for("react.element"),o=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),i=Symbol.for("react.provider"),c=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,g={};function h(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function I(){}function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},I.prototype=h.prototype;var C=y.prototype=new I;C.constructor=y,S(C,h.prototype),C.isPureReactComponent=!0;var R=Array.isArray,T=Object.prototype.hasOwnProperty,O={current:null},D={key:!0,ref:!0,__self:!0,__source:!0};function v(e,t,o){var r,a={},s=null,i=null;if(null!=t)for(r in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(s=""+t.key),t)T.call(t,r)&&!D.hasOwnProperty(r)&&(a[r]=t[r]);var c=arguments.length-2;if(1===c)a.children=o;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];a.children=l}if(e&&e.defaultProps)for(r in c=e.defaultProps)void 0===a[r]&&(a[r]=c[r]);return{$$typeof:n,type:e,key:s,ref:i,props:a,_owner:O.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var b=/\/+/g;function w(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function N(e,t,r,a,s){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=null);var c=!1;if(null===e)c=!0;else switch(i){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case n:case o:c=!0}}if(c)return s=s(c=e),e=""===a?"."+w(c,0):a,R(s)?(r="",null!=e&&(r=e.replace(b,"$&/")+"/"),N(s,t,r,"",(function(e){return e}))):null!=s&&(E(s)&&(s=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(s,r+(!s.key||c&&c.key===s.key?"":(""+s.key).replace(b,"$&/")+"/")+e)),t.push(s)),1;if(c=0,a=""===a?".":a+":",R(e))for(var l=0;l<e.length;l++){var u=a+w(i=e[l],l);c+=N(i,t,r,u,s)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(i=e.next()).done;)c+=N(i=i.value,t,r,u=a+w(i,l++),s);else if("object"===i)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return c}function x(e,t,n){if(null==e)return e;var o=[],r=0;return N(e,o,"","",(function(e){return t.call(n,e,r++)})),o}function U(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var M={current:null},P={transition:null},q={ReactCurrentDispatcher:M,ReactCurrentBatchConfig:P,ReactCurrentOwner:O};function _(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:x,forEach:function(e,t,n){x(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return x(e,(function(){t++})),t},toArray:function(e){return x(e,(function(e){return e}))||[]},only:function(e){if(!E(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=h,t.Fragment=r,t.Profiler=s,t.PureComponent=y,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=q,t.act=_,t.cloneElement=function(e,t,o){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var r=S({},e.props),a=e.key,s=e.ref,i=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,i=O.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)T.call(t,l)&&!D.hasOwnProperty(l)&&(r[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)r.children=o;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];r.children=c}return{$$typeof:n,type:e.type,key:a,ref:s,props:r,_owner:i}},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=v,t.createFactory=function(e){var t=v.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=E,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:U}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=P.transition;P.transition={};try{e()}finally{P.transition=t}},t.unstable_act=_,t.useCallback=function(e,t){return M.current.useCallback(e,t)},t.useContext=function(e){return M.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return M.current.useDeferredValue(e)},t.useEffect=function(e,t){return M.current.useEffect(e,t)},t.useId=function(){return M.current.useId()},t.useImperativeHandle=function(e,t,n){return M.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return M.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return M.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return M.current.useMemo(e,t)},t.useReducer=function(e,t,n){return M.current.useReducer(e,t,n)},t.useRef=function(e){return M.current.useRef(e)},t.useState=function(e){return M.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return M.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return M.current.useTransition()},t.version="18.3.1"},326:(e,t,n)=>{"use strict";e.exports=n(249)},142:e=>{"use strict";e.exports=o},557:e=>{"use strict";e.exports=a},713:e=>{"use strict";e.exports=r},2:t=>{"use strict";t.exports=e},492:e=>{"use strict";e.exports=l},669:e=>{"use strict";e.exports=n},545:e=>{"use strict";e.exports=t},55:e=>{"use strict";e.exports=c},111:e=>{"use strict";e.exports=i},155:e=>{"use strict";e.exports=s}},p={};function m(e){var t=p[e];if(void 0!==t)return t.exports;var n=p[e]={exports:{}};return f[e](n,n.exports,m),n.exports}m.m=f,u=[],m.O=(e,t,n,o)=>{if(!t){var r=1/0;for(c=0;c<u.length;c++){for(var[t,n,o]=u[c],a=!0,s=0;s<t.length;s++)(!1&o||r>=o)&&Object.keys(m.O).every((e=>m.O[e](t[s])))?t.splice(s--,1):(a=!1,o<r&&(r=o));if(a){u.splice(c--,1);var i=n();void 0!==i&&(e=i)}}return e}o=o||0;for(var c=u.length;c>0&&u[c-1][2]>o;c--)u[c]=u[c-1];u[c]=[t,n,o]},m.F={},m.E=e=>{Object.keys(m.F).map((t=>{m.F[t](e)}))},m.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return m.d(t,{a:t}),t},m.d=(e,t)=>{for(var n in t)m.o(t,n)&&!m.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},m.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),m.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d={524:0},m.F.j=e=>{if(!m.o(d,e)||void 0===d[e]){d[e]=null;var t=document.createElement("link");m.nc&&t.setAttribute("nonce",m.nc),t.rel="prefetch",t.as="script",t.href=m.p+m.u(e),document.head.appendChild(t)}},m.O.j=e=>0===d[e],m.O(0,[524],(()=>{m.E(524)}),5);var S={};return(()=>{"use strict";m.r(S),m.d(S,{Enums:()=>u.Ay,createReferencedImageDisplaySet:()=>pe.A,default:()=>he,hydrateStructuredReport:()=>Z,srProtocol:()=>A,toolNames:()=>g});var e=m(326),t=m(2),n=m.n(t),o=m(545),r=m.n(o),a=m(669),s=m(142),i=m(713),c=m(557),l=m(155),u=m(193);const d=1e-4,f=({GraphicData:e,ValueType:t,imageId:n})=>{const o=[];if("SCOORD3D"===t)for(let t=0;t<e.length;t+=3)o.push([e[t],e[t+1],e[t+2]]);else for(let t=0;t<e.length;t+=2){const r=c.utilities.imageToWorldCoords(n,[e[t],e[t+1]]);o.push(r)}return o};const p=function({GraphicType:e,GraphicData:t,ValueType:n,imageId:o}){let r=[];switch(e){case u.sh.POINT:case u.sh.MULTIPOINT:case u.sh.POLYLINE:r=f({GraphicData:t,ValueType:n,imageId:o});break;case u.sh.CIRCLE:{const e=f({GraphicData:t,ValueType:n,imageId:o}),a=e[0],s=e[1],i=l.vec3.distance(a,s),u=c.metaData.get("imagePlaneModule",o);if(!u)throw new Error("No imagePlaneModule found");const{columnCosines:d,rowCosines:p}=u,m=l.vec3.create();l.vec3.scaleAndAdd(m,a,d,i);const S=l.vec3.create();l.vec3.scaleAndAdd(S,a,d,-i);const g=l.vec3.create();l.vec3.scaleAndAdd(g,a,p,i);const h=l.vec3.create();l.vec3.scaleAndAdd(h,a,p,-i),r=[m,S,g,h];break}case u.sh.ELLIPSE:{const e=f({GraphicData:t,ValueType:n,imageId:o}),a=l.vec3.fromValues(...e[0]),s=l.vec3.fromValues(...e[1]),i=l.vec3.fromValues(...e[2]),u=l.vec3.fromValues(...e[3]),p=l.vec3.create();l.vec3.sub(p,s,a),l.vec3.normalize(p,p);const m=l.vec3.create();l.vec3.sub(m,u,i),l.vec3.normalize(m,m);const S=c.metaData.get("imagePlaneModule",o);if(!S)throw new Error("imageId does not have imagePlaneModule metadata");const{columnCosines:g}=S,h=l.vec3.fromValues(...g),I=Math.abs(l.vec3.dot(h,p)),y=Math.abs(l.vec3.dot(h,m)),C=Math.abs(I),R=Math.abs(y);r=[],Math.abs(C-1)<d?r=[e[0],e[1],e[2],e[3]]:Math.abs(R-1)<d?r=[e[2],e[3],e[0],e[1]]:console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED");break}default:console.warn("Unsupported GraphicType:",e)}return r},g={DICOMSRDisplay:"DICOMSRDisplay",SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI",SRSCOORD3DPoint:"SRSCOORD3DPoint"};function h(e,t,n){let o=g.DICOMSRDisplay;const r=e.coords.reduce(((e,n)=>(e[n.GraphicType]=e[n.GraphicType]||[],e[n.GraphicType].push(p({...n,imageId:t})),e)),{}),{TrackingUniqueIdentifier:a}=e,{ValueType:s,GraphicType:l}=e.coords[0],u=r[l];let d=null;if(t){const e=c.metaData.get("imagePlaneModule",t);d=e?.frameOfReferenceUID}"SCOORD3D"===s&&(o=g.SRSCOORD3DPoint,d=e.coords[0].ReferencedFrameOfReferenceSequence);const f={annotationUID:a,highlighted:!1,isLocked:!1,invalidated:!1,metadata:{toolName:o,valueType:s,graphicType:l,FrameOfReferenceUID:d,referencedImageId:t},data:{label:e.labels?.[0]?.value||void 0,displayText:e.displayText||void 0,handles:{textBox:e.textBox??{},points:u[0]},cachedStats:{},frameNumber:n,renderableData:r,TrackingUniqueIdentifier:a,labels:e.labels}};i.annotation.state.addAnnotation(f)}const{MeasurementReport:I}=s.adaptersSR.Cornerstone3D;const y=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-sr"}').UU,C="dicom-sr",R=`${y}.sopClassHandlerModule.${C}`,T="dicom-sr-3d",O=`${y}.sopClassHandlerModule.${T}`,{sopClassDictionary:D}=t.utils,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:v,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:E}=a.Enums,{ImageSet:b,MetadataProvider:w}=t.classes,{CodeScheme:N}=s.adaptersSR.Cornerstone3D,x=[D.BasicTextSR,D.EnhancedSR,D.ComprehensiveSR];function U(e,n){return this.instances.push(...e),t.utils.sortStudyInstances(this.instances),this.instance=this.instances[this.instances.length-1],this.isLoaded=!1,this}function M(e,n,o){if(!e||!e.length)throw new Error("No instances were provided");t.utils.sortStudyInstances(e);const a=e[e.length-1],{StudyInstanceUID:s,SeriesInstanceUID:i,SOPInstanceUID:c,SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,ConceptNameCodeSequence:m,SOPClassUID:S}=a;((e,t)=>{t.forEach((t=>{if(t.StudyInstanceUID!==e)throw console.warn("Not all instances have the same UID",e,t),new Error(`Instances ${t.SOPInstanceUID} does not belong to ${e}`)}))})(a.StudyInstanceUID,e);const g=S===D.Comprehensive3DSR,h=m?.CodeValue===u.n7.ImagingMeasurementReport,y={Modality:"SR",displaySetInstanceUID:t.utils.guid(),SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,SOPInstanceUID:c,SeriesInstanceUID:i,StudyInstanceUID:s,SOPClassHandlerId:g?O:R,SOPClassUID:S,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,isImagingMeasurementReport:h,sopClassUids:x,instance:a,addInstances:U,label:l||`${r().t("Series")} ${d} - ${r().t("SR")}`};return y.load=()=>async function(e,t,n){const{displaySetService:o,measurementService:r}=t.services,a=n.getDataSources(),s=a[0],{ContentSequence:i}=e.instance;async function c(t,n=null,o=null){for(const r in t)if("object"==typeof t[r]&&null!==t[r])await c(t[r],t,r);else if(Array.isArray(t[r]))await Promise.all(t[r].map((e=>c(e,t,r))));else if("BulkDataURI"===r){const a=await s.retrieve.bulkDataURI({BulkDataURI:t[r],StudyInstanceUID:e.instance.StudyInstanceUID,SeriesInstanceUID:e.instance.SeriesInstanceUID,SOPInstanceUID:e.instance.SOPInstanceUID});n&&o&&(n[o]=new Float32Array(a))}}!0!==e.isLoaded&&await c(i);e.isImagingMeasurementReport?(e.referencedImages=function(e){const t=e.find((e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImageLibrary));if(!t)return[];const n=V(t.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImageLibraryGroup));if(!n)return[];const o=[];return V(n.ContentSequence).forEach((e=>{const{ReferencedSOPSequence:t}=e;if(t)for(const e of V(t))if(e.ReferencedSOPClassUID){const{ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n}=e;o.push({ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n})}})),o}(i),e.measurements=function(e){const t=e.find((e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImagingMeasurements));if(!t)return[];const n=function(e){const t={};return e.forEach((e=>{const n=V(e.ContentSequence),o=n.find((e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingUniqueIdentifier));o||console.warn("No Tracking Unique Identifier, skipping ambiguous measurement.");const r=o.UID;void 0===t[r]?t[r]=[...n]:n.forEach((e=>{e.ConceptNameCodeSequence.CodeValue!==u.n7.TrackingUniqueIdentifier&&t[r].push(e)}))})),t}(V(t.ContentSequence).filter((e=>e.ConceptNameCodeSequence.CodeValue===u.n7.MeasurementGroup))),o=[];return Object.keys(n).forEach((e=>{const t=function(e){if(e.some((e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType)))return function(e){const t=e.find((e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType)),n=e.find((e=>"UIDREF"===e.ValueType)),o=e.find((e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingIdentifier));if(!t)return void console.warn(`graphic ValueType ${t.ValueType} not currently supported, skipping annotation.`);const r=e.filter((e=>"NUM"===e.ValueType)),a={loaded:!1,labels:[],coords:[_(t)],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:o.TextValue};r.forEach((e=>{const{ConceptNameCodeSequence:t,MeasuredValueSequence:n}=e;n&&a.labels.push(k(t,n))}));const s=e.filter((e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===u.bY.SCT&&e.ConceptNameCodeSequence.CodeValue===u.n7.FindingSiteSCT));s.length&&a.labels.push({label:u.n7.FindingSiteSCT,value:s[0].ConceptCodeSequence.CodeMeaning});return a}(e);return function(e){const t=e.filter((e=>"NUM"===e.ValueType)),n=e.find((e=>"UIDREF"===e.ValueType)),o=e.find((e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingIdentifier)),r=e.find((e=>e.ConceptNameCodeSequence.CodeValue===u.n7.Finding)),a=e.filter((e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===u.bY.SRT&&e.ConceptNameCodeSequence.CodeValue===u.n7.FindingSite)),s={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:o.TextValue};r&&u.bY.CornerstoneCodeSchemes.includes(r.ConceptCodeSequence.CodingSchemeDesignator)&&r.ConceptCodeSequence.CodeValue===N.codeValues.CORNERSTONEFREETEXT&&s.labels.push({label:N.codeValues.CORNERSTONEFREETEXT,value:r.ConceptCodeSequence.CodeMeaning});if(a.length){const e=a.find((e=>u.bY.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===N.codeValues.CORNERSTONEFREETEXT));e&&s.labels.push({label:N.codeValues.CORNERSTONEFREETEXT,value:e.ConceptCodeSequence.CodeMeaning})}return t.forEach((e=>{const{ConceptNameCodeSequence:t,ContentSequence:n,MeasuredValueSequence:o}=e,{ValueType:r}=n;if("SCOORD"===!r)return void console.warn(`Graphic ${r} not currently supported, skipping annotation.`);const a=_(n);a&&s.coords.push(a),o&&s.labels.push(k(t,o))})),s}(e)}(n[e]);t&&o.push(t)})),o}(i)):(e.referencedImages=[],e.measurements=[]);const l=r.getSourceMappings(v,E);e.isHydrated=!1,e.isRehydratable=function(e,t){if(!t||!t.length)return!1;const n=new Set;for(const e of t)n.add(e.annotationType);const{measurements:o}=e;for(let e=0;e<o.length;e++){const{TrackingIdentifier:t}=o[e]||{};if(!t){console.warn("No tracking identifier for measurement ",o[e]);continue}const r=I.getAdapterForTrackingIdentifier(t);if(r&&n.has(r.toolType))return!0;console.log("Measurement is not rehydratable",t,o[e])}return console.log("No measurements found which were rehydratable"),!1}(e,l),e.isLoaded=!0,o.activeDisplaySets.forEach((n=>{P(e,n,s,t)})),o.subscribe(o.EVENTS.DISPLAY_SETS_ADDED,(n=>{const{displaySetsAdded:o}=n;o.forEach((n=>{P(e,n,s,t)}))}))}(y,n,o),[y]}function P(e,t,n,o){const{customizationService:r}=o.services,a=e.measurements.filter((e=>!1===e.loaded));if(0===a.length||!(t instanceof b)||t.unsupported)return;const s=new Map,i=n.getImageIdsForDisplaySet(t);for(const e of i){const{SOPInstanceUID:t,frameNumber:n}=w.getUIDsFromImageID(e),o=`${t}:${n||1}`;s.set(o,e)}if(!a?.length)return;const c=e.SOPClassUID===D.Comprehensive3DSR;for(let n=a.length-1;n>=0;n--){let o=a[n];const i=r.getCustomization("onBeforeSRAddMeasurement");if("function"==typeof i&&(o=i({measurement:o,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID})),c){h(o,null,null),o.loaded=!0;continue}const l=o.coords[0].ReferencedSOPSequence;if(!l)continue;const{ReferencedSOPInstanceUID:u}=l,d=l.ReferencedFrameNumber||1,f=`${u}:${d}`,p=s.get(f);p&&q(o,u,d)&&(h(o,p,d),o.loaded=!0,o.imageId=p,o.displaySetInstanceUID=t.displaySetInstanceUID,o.ReferencedSOPInstanceUID=u,o.frameNumber=d,a.splice(n,1))}}function q(e,t,n){const{coords:o}=e,r=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence?.ReferencedFrameNumber||1;if(n&&Number(n)!==Number(r))return!1;for(let e=0;e<o.length;e++){const n=o[e],{ReferencedSOPInstanceUID:r}=n.ReferencedSOPSequence;if(r===t)return!0}return!1}const _=e=>{const{ValueType:t,GraphicType:n,GraphicData:o}=e,r={ValueType:t,GraphicType:n,GraphicData:o};return r.ReferencedSOPSequence=e.ContentSequence?.ReferencedSOPSequence,r.ReferencedFrameOfReferenceSequence=e.ReferencedFrameOfReferenceUID||e.ContentSequence?.ReferencedFrameOfReferenceSequence,r};function k(e,t){const{CodeMeaning:n}=e,{NumericValue:o,MeasurementUnitsCodeSequence:r}=t,{CodeValue:a}=r;return{label:n,value:`${o?Number(o).toFixed(2):""} ${a}`}}function V(e){return e?Array.isArray(e)?e:[e]:[]}const L=function(e){const{servicesManager:t,extensionManager:n}=e,o=e=>M(e,t,n);return[{name:C,sopClassUids:x,getDisplaySetsFromSeries:o},{name:T,sopClassUids:[D.Comprehensive3DSR],getDisplaySetsFromSeries:o}]},A={id:"@ohif/sr",name:"SR Key Images",protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{srDisplaySetId:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"SR"}}]}},stages:[{name:"SR Key Images",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId"}]}]}]};var F=m(111),j=m.n(F);const{log:B}=n();const $=function(e,t){const n={};function o(o,r){if(!o.metadata?.referencedImageId)return void B.warn(`[DICOMSR] No referencedImageId found for ${r} ${o.id}`);const a=o.metadata.referencedImageId;n[a]||(n[a]={});const s=n[a];s[r]||(s[r]={data:[]});const i=e.find((e=>e.uid===o.annotationUID)),c=s[r].data;let{finding:l}=i;const u=[];i.label&&(t.includes(r)?l={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:i.label}:u.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:i.label})),i.findingSites&&u.push(...i.findingSites);const d=Object.assign({},o,{finding:l,findingSites:u});c.push(d)}const r=e.map((e=>e.uid)).slice(),a=i.annotation.state.getAnnotationManager(),s=a.getFramesOfReference();for(let e=0;e<s.length;e++){const t=s[e],i=a.getAnnotations(t),c=Object.keys(i);for(let e=0;e<c.length;e++){const t=c[e],a=i[t];if(a)for(let e=0;e<a.length;e++){const s=a[e],i=r.findIndex((e=>e===s.annotationUID));if(-1!==i&&(o(s,t),r.splice(i,1),!r.length))return n}}}return n},{CodeScheme:G}=s.adaptersSR.Cornerstone3D;const{locking:W}=i.annotation,{guid:H}=n().utils,{MeasurementReport:z,CORNERSTONE_3D_TAG:Y}=s.adaptersSR.Cornerstone3D,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:X,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:J}=a.Enums,K=(e,t)=>{if(!t||"CORNERSTONEJS"===t.CodingSchemeDesignator)return;const n=`${t.CodingSchemeDesignator}:${t.CodeValue}`;return{...e[n],ref:n,...t,text:t.CodeMeaning}},Q=(e,t)=>{if(!t||!t.length)return;const n=[];for(let o=0;o<t.length;o++){const r=K(e,t[o][0]||t[o]);r&&n.push(r)}return n.length&&n||void 0};function Z({servicesManager:e,extensionManager:n,commandsManager:o},r){const a=n.getActiveDataSource()[0],{measurementService:s,displaySetService:i,customizationService:l}=e.services,u=l.getCustomization("codingValues"),d=l.getCustomization("panelMeasurement.disableEditing"),f=i.getDisplaySetByUID(r),p=s.getSourceMappings(X,J);if(!p||!p.length)throw new Error("Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.");const m=t.DicomMetadataStore.getInstance(f.StudyInstanceUID,f.SeriesInstanceUID,f.SOPInstanceUID),S={},g={};f.measurements.forEach((e=>{const{ReferencedSOPInstanceUID:t,imageId:n,frameNumber:o}=e;S[t]||(S[t]=n,g[t]=[]),g[t][o]||(g[t][o]=n)}));const h=m;let I=z.generateToolState(h,S,c.utilities.imageToWorldCoords,c.metaData);const y=l.getCustomization("onBeforeSRHydration")?.value;"function"==typeof y&&(I=y({storedMeasurementByAnnotationType:I,displaySet:f}));const C=p.map((e=>e.annotationType)),R={};Object.keys(I).forEach((e=>{C.includes(e)&&(R[e]=I[e])}));const T=[];let O;Object.keys(R).forEach((e=>{R[e].forEach((e=>{const t=e.annotation.data&&e.annotation.data.frameNumber||1,n=g[e.sopInstanceUid][t]||S[e.sopInstanceUid];T.includes(n)||T.push(n)}))}));const D=[];for(let e=0;e<T.length;e++){const t=T[e],{SeriesInstanceUID:n,StudyInstanceUID:o}=c.metaData.get("instance",t);D.includes(n)||D.push(n),O?O!==o&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):O=o}return Object.keys(R).forEach((e=>{R[e].forEach((t=>{const n=t.annotation.data&&t.annotation.data.frameNumber||1,r=g[t.sopInstanceUid][n]||S[t.sopInstanceUid];t.uid=H();const i=c.metaData.get("instance",r),{FrameOfReferenceUID:l}=i,f={annotationUID:t.annotation.annotationUID,data:t.annotation.data,metadata:{toolName:e,referencedImageId:r,FrameOfReferenceUID:l}},m=s.getSource(X,J);f.data.label=function(e){const{findingSites:t=[],finding:n}=e;let o=t.find((e=>e.CodeValue===G.codeValues.CORNERSTONEFREETEXT));return o?o.CodeMeaning:n&&n.CodeValue===G.codeValues.CORNERSTONEFREETEXT?n.CodeMeaning:void 0}(t),f.data.finding=K(u,t.finding?.[0]),f.data.findingSites=Q(u,t.findingSites),f.data.findingSites?.forEach((e=>{e.type&&(f.data[e.type]=e)}));const h=p.find((t=>t.annotationType===e)),I=s.addRawMeasurement(m,e,{annotation:f},h.toMeasurementSchema,a);o.runCommand("updateMeasurement",{uid:I,code:f.data.finding}),d&&W.setAnnotationLocked(I,!0),T.includes(r)||T.push(r)}))})),f.isHydrated=!0,{StudyInstanceUID:O,SeriesInstanceUIDs:D}}const{MeasurementReport:ee}=s.adaptersSR.Cornerstone3D,{log:te}=n(),ne=(e,t,n={})=>{const o=$(e,t),r=ee.generateReport(o,c.metaData,c.utilities.worldToImageCoords,n),{dataset:a}=r;return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a.InstanceNumber=n.InstanceNumber??1,a},oe=e=>{const{servicesManager:n,extensionManager:o,commandsManager:r}=e,{customizationService:a,viewportGridService:s,displaySetService:i}=n.services,c={changeColorMeasurement:({uid:e})=>{throw new Error("Unsupported operation: changeColorMeasurement")},downloadReport:({measurementData:e,additionalFindingTypes:t,options:n={}})=>{const o=ne(e,t,n),r=j().data.datasetToBlob(o),a=URL.createObjectURL(r);window.location.assign(a)},storeMeasurements:async({measurementData:e,dataSource:n,additionalFindingTypes:o,options:r={}})=>{if(te.info("[DICOMSR] storeMeasurements"),!n||!n.store||!n.store.dicom)return te.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const s=ne(e,o,r),{StudyInstanceUID:i,ContentSequence:c}=s;if(!c?.[4].ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",s),new Error("Invalid report, no content");const l=a.getCustomization("onBeforeDicomStore");let u;return"function"==typeof l&&(u=l({dicomDict:u,measurementData:e,naturalizedReport:s})),await n.store.dicom(s,null,u),i&&n.deleteStudyMetadataPromise(i),t.DicomMetadataStore.addInstances([s],!0),s}catch(e){throw console.warn(e),te.error(`[DICOMSR] Error while saving the measurements: ${e.message}`),new Error(e.message||"Error while saving the measurements.")}},hydrateStructuredReport:({displaySetInstanceUID:e})=>Z({servicesManager:n,extensionManager:o,commandsManager:r},e)};return{actions:c,definitions:{downloadReport:c.downloadReport,storeMeasurements:c.storeMeasurements,hydrateStructuredReport:c.hydrateStructuredReport},defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};var re=m(942);class ae extends i.AnnotationTool{constructor(e={},t={configuration:{}}){super(e,t),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:o}=n;let r=i.annotation.state.getAnnotations(this.getToolName(),o);if(!r?.length)return;if(r=this.filterInteractableAnnotationsForElement(o,r),!r?.length)return;const a=(0,re.eF)(o),{activeIndex:s,trackingUniqueIdentifiers:c}=a,l=c[s],d=r.filter((e=>c.includes(e.data?.TrackingUniqueIdentifier)));if(!n._actors?.size)return;const f={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},{style:p}=i.annotation.config;for(let e=0;e<d.length;e++){const o=d[e],r=o.annotationUID,{renderableData:a,TrackingUniqueIdentifier:s}=o.data,{referencedImageId:c}=o.metadata;f.annotationUID=r;const m=p.getToolGroupToolStyles(this.toolGroupId)[this.getToolName()],S=this.getStyle("lineWidth",f,o),g=this.getStyle("lineDash",f,o),h={color:s===l?"rgb(0, 255, 0)":this.getStyle("color",f,o),lineDash:g,lineWidth:S,...m};Object.keys(a).forEach((e=>{const s=a[e];let l,d;switch(e){case u.sh.POINT:l=this.renderPoint;break;case u.sh.MULTIPOINT:l=this.renderMultipoint;break;case u.sh.POLYLINE:l=this.renderPolyLine;break;case u.sh.CIRCLE:l=this.renderEllipse;break;case u.sh.ELLIPSE:l=this.renderEllipse,d=i.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const p=l(t,n,s,r,c,h);this.renderTextBox(t,n,p,d,o,f,h)}))}}}_getTextBoxLinesFromLabels(e){const t=Math.min(e.length,5),n=[];for(let o=0;o<t;o++){const t=e[o];n.push(`${ie(t.label)}: ${t.value}`)}return n}renderPolyLine(e,t,n,o,r,a){const s={color:a.color,width:a.lineWidth,lineDash:a.lineDash};let c=[];return n.map(((n,r)=>{const a=n.map((e=>t.worldToCanvas(e))),l=`${r}`;2===a.length?i.drawing.drawLine(e,o,l,a[0],a[1],s):i.drawing.drawPolyline(e,o,l,a,s),c=c.concat(a)})),c}renderMultipoint(e,t,n,o,r,a){let s;n.map(((n,r)=>{s=n.map((e=>t.worldToCanvas(e)));i.drawing.drawHandles(e,o,"0",s,{color:a.color})}))}renderPoint(e,t,n,o,r,a){const s=[];return n.map(((n,l)=>{const u=n[0];if(s.push(t.worldToCanvas(u)),void 0!==n[1])s.push(t.worldToCanvas(n[1]));else{const e=c.metaData.get("imagePixelModule",r);let n=10,o=10;if(e){const{columns:t,rows:r}=e;n=t/10,o=r/10}const a=c.utilities.worldToImageCoords(r,u),i=c.utilities.imageToWorldCoords(r,[a[0]+n,a[1]+o]);s.push(t.worldToCanvas(i))}const d=`${l}`;i.drawing.drawArrow(e,o,d,s[1],s[0],{color:a.color,width:a.lineWidth})})),s}renderEllipse(e,t,n,o,r,a){let s;return n.map(((n,r)=>{if(0===n.length)return;const c=n,l=t.getRotation();let u;s=c.map((e=>t.worldToCanvas(e))),u=90==l||270==l?i.utilities.math.ellipse.getCanvasEllipseCorners([s[2],s[3],s[0],s[1]]):i.utilities.math.ellipse.getCanvasEllipseCorners(s);const d=`${r}`;i.drawing.drawEllipse(e,o,d,u[0],u[1],{color:a.color,width:a.lineWidth,lineDash:a.lineDash})})),s}renderTextBox(e,t,n,o,r,a,s={}){if(!n||!r)return;const{annotationUID:c,data:l={}}=r,{labels:u}=l,{color:d}=s;let f=n;"function"==typeof o&&(f=o(n));const p=this._getTextBoxLinesFromLabels(u),m=i.utilities.drawing.getTextBoxCoordsCanvas(f);r.data?.handles?.textBox?.worldPosition||(r.data.handles.textBox.worldPosition=t.canvasToWorld(m));const S=t.worldToCanvas(r.data.handles.textBox.worldPosition),g=this.getLinkedTextBoxStyle(a,r),h=i.drawing.drawLinkedTextBox(e,c,"1",p,S,n,{},{...g,color:d}),{x:I,y,width:C,height:R}=h;r.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([I,y]),topRight:t.canvasToWorld([I+C,y]),bottomLeft:t.canvasToWorld([I,y+R]),bottomRight:t.canvasToWorld([I+C,y+R])}}}ae.toolName=g.DICOMSRDisplay;const se={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function ie(e){const t=se[e];return void 0!==t?t:e}class ce extends i.AnnotationDisplayTool{constructor(e={},t={configuration:{}}){super(e,t),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:o}=n,r=i.annotation.state.getAnnotations(this.getToolName(),o);if(!r?.length)return;const a=r;if(!n._actors?.size)return;const s={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<a.length;e++){const o=a[e],r=o.annotationUID,{renderableData:c}=o.data,{POINT:l}=c;s.annotationUID=r;const u=this.getStyle("lineWidth",s,o),d=this.getStyle("lineDash",s,o),f={color:this.getStyle("color",s,o),lineDash:d,lineWidth:u},p=l[0][0];if(!n.isReferenceViewable({FrameOfReferenceUID:o.metadata.FrameOfReferenceUID,cameraFocalPoint:p},{asNearbyProjection:!0}))continue;const m=n.worldToCanvas(p),S=[m,[m[0]+20,m[1]+20]];i.drawing.drawArrow(t,r,"1",S[1],S[0],{color:f.color,width:f.lineWidth}),this.renderTextBox(t,n,S,o,s,f)}}}_getTextBoxLinesFromLabels(e){Math.min(e.length,5);return[]}renderTextBox(e,t,n,o,r,a={}){if(!n||!o)return;const{annotationUID:s,data:c={}}=o,{labels:l}=c,u=[];for(const e of l)"363698007"===e.label&&u.push(`Finding Site: ${e.value}`);const{color:d}=a,f=n,p=i.utilities.drawing.getTextBoxCoordsCanvas(f);o.data?.handles?.textBox?.worldPosition||(o.data.handles.textBox.worldPosition=t.canvasToWorld(p));const m=t.worldToCanvas(o.data.handles.textBox.worldPosition),S=this.getLinkedTextBoxStyle(r,o),g=i.drawing.drawLinkedTextBox(e,s,"1",u,m,n,{},{...S,color:d}),{x:h,y:I,width:y,height:C}=g;o.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([h,I]),topRight:t.canvasToWorld([h+y,I]),bottomLeft:t.canvasToWorld([h,I+C]),bottomRight:t.canvasToWorld([h+y,I+C])}}getLinkedTextBoxStyle(e,t){return{visibility:this.getStyle("textBoxVisibility",e,t),fontFamily:this.getStyle("textBoxFontFamily",e,t),fontSize:this.getStyle("textBoxFontSize",e,t),color:this.getStyle("textBoxColor",e,t),shadow:this.getStyle("textBoxShadow",e,t),background:this.getStyle("textBoxBackground",e,t),lineWidth:this.getStyle("textBoxLinkLineWidth",e,t),lineDash:this.getStyle("textBoxLinkLineDash",e,t)}}}ce.toolName=g.SRSCOORD3DPoint;const le={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:a}=e,{metadata:s,data:i,annotationUID:c}=a;if(!s||!i)return console.warn("Probe tool: Missing metadata or data"),null;const{toolName:l}=s,{points:u}=i.handles,d=function(e){const{data:t}=e;if(!t)return[""];const{labels:n}=t,o=[];for(const e of n)"33636980076"===e.label&&o.push(`Finding Site: ${e.value}`);return o}(a);return{uid:c,points:u,metadata:s,toolName:s.toolName,label:i.label,displayText:d,data:i.cachedStats,type:o?.(l)??null}}};function ue(e,t,n={}){class o extends t{constructor(e,t){e.configuration=e.configuration?{...e.configuration,...n}:n,super(e,t)}}o.toolName=e,(0,i.addTool)(o)}const{CORNERSTONE_3D_TOOLS_SOURCE_NAME:de,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:fe}=a.Enums;var pe=m(291);function me(){return me=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)({}).hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},me.apply(null,arguments)}const Se=e.lazy((()=>Promise.resolve().then(m.bind(m,525)))),ge=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(Se,t)),he={id:y,onModeEnter:function({servicesManager:e}){const{displaySetService:t}=e.services;[...t.getDisplaySetCache().values()].filter((e=>e.SOPClassHandlerId===R||e.SOPClassHandlerId===O)).forEach((e=>{e.isHydrated=!1}))},preRegistration:function({configuration:e={},servicesManager:t}){const{measurementService:n,cornerstoneViewportService:o}=t.services;ue(g.DICOMSRDisplay,ae),ue(g.SRLength,i.LengthTool),ue(g.SRBidirectional,i.BidirectionalTool),ue(g.SREllipticalROI,i.EllipticalROITool),ue(g.SRCircleROI,i.CircleROITool),ue(g.SRArrowAnnotate,i.ArrowAnnotateTool),ue(g.SRAngle,i.AngleTool),ue(g.SRPlanarFreehandROI,i.PlanarFreehandROITool),ue(g.SRRectangleROI,i.RectangleROITool),ue(g.SRSCOORD3DPoint,ce),ue(g.SRCobbAngle,i.CobbAngleTool);const r=n.getSource(de,fe),{POINT:a}=n.VALUE_TYPES;n.addMapping(r,"SRSCOORD3DPoint",a,le.toAnnotation,le.toMeasurement);const s={lineDash:"4,4"};i.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{[g.DICOMSRDisplay]:s,SRLength:s,SRBidirectional:s,SREllipticalROI:s,SRCircleROI:s,SRArrowAnnotate:s,SRCobbAngle:s,SRAngle:s,SRPlanarFreehandROI:s,SRRectangleROI:s,global:{}})},getViewportModule:({servicesManager:t,extensionManager:n})=>[{name:"dicom-sr",component:o=>e.createElement(ge,me({servicesManager:t,extensionManager:n},o))}],getCommandsModule:oe,getSopClassHandlerModule:L,getUtilityModule:({servicesManager:e})=>[{name:"tools",exports:{toolNames:g}}]}})(),S=m.O(S)})()));
2
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("@ohif/i18n"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/adapters"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("gl-matrix"),require("dcmjs"),require("@ohif/ui-next"),require("@ohif/core/src/contextProviders/SystemProvider")):"function"==typeof define&&define.amd?define(["@ohif/core","@ohif/i18n","@ohif/extension-cornerstone","@cornerstonejs/adapters","@cornerstonejs/tools","@cornerstonejs/core","gl-matrix","dcmjs","@ohif/ui-next","@ohif/core/src/contextProviders/SystemProvider"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-sr"]=t(require("@ohif/core"),require("@ohif/i18n"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/adapters"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("gl-matrix"),require("dcmjs"),require("@ohif/ui-next"),require("@ohif/core/src/contextProviders/SystemProvider")):e["ohif-extension-cornerstone-dicom-sr"]=t(e["@ohif/core"],e["@ohif/i18n"],e["@ohif/extension-cornerstone"],e["@cornerstonejs/adapters"],e["@cornerstonejs/tools"],e["@cornerstonejs/core"],e["gl-matrix"],e.dcmjs,e["@ohif/ui-next"],e["@ohif/core/src/contextProviders/SystemProvider"])}(globalThis,(e,t,n,r,o,a,s,i,c,l)=>(()=>{var u,d,f={2:t=>{"use strict";t.exports=e},55:e=>{"use strict";e.exports=c},111:e=>{"use strict";e.exports=i},142:e=>{"use strict";e.exports=r},155:e=>{"use strict";e.exports=s},183:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},193:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>c,bY:()=>i,n7:()=>s,sh:()=>a});var r=n(142);const{CodeScheme:o}=r.adaptersSR.Cornerstone3D,a={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"},s={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",FindingSiteSCT:"363698007"},i={SRT:"SRT",SCT:"SCT",CornerstoneCodeSchemes:[o.CodingSchemeDesignator,"CST4"]},c={CodeNameCodeSequenceValues:s,CodingSchemeDesignators:i,RelationshipType:{INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},SCOORDTypes:a}},249:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),i=Symbol.for("react.provider"),c=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,g={};function h(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function I(){}function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},I.prototype=h.prototype;var C=y.prototype=new I;C.constructor=y,S(C,h.prototype),C.isPureReactComponent=!0;var R=Array.isArray,T=Object.prototype.hasOwnProperty,O={current:null},D={key:!0,ref:!0,__self:!0,__source:!0};function v(e,t,r){var o,a={},s=null,i=null;if(null!=t)for(o in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(s=""+t.key),t)T.call(t,o)&&!D.hasOwnProperty(o)&&(a[o]=t[o]);var c=arguments.length-2;if(1===c)a.children=r;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];a.children=l}if(e&&e.defaultProps)for(o in c=e.defaultProps)void 0===a[o]&&(a[o]=c[o]);return{$$typeof:n,type:e,key:s,ref:i,props:a,_owner:O.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var b=/\/+/g;function w(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(e){return t[e]})}(""+e.key):t.toString(36)}function N(e,t,o,a,s){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=null);var c=!1;if(null===e)c=!0;else switch(i){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case n:case r:c=!0}}if(c)return s=s(c=e),e=""===a?"."+w(c,0):a,R(s)?(o="",null!=e&&(o=e.replace(b,"$&/")+"/"),N(s,t,o,"",function(e){return e})):null!=s&&(E(s)&&(s=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(s,o+(!s.key||c&&c.key===s.key?"":(""+s.key).replace(b,"$&/")+"/")+e)),t.push(s)),1;if(c=0,a=""===a?".":a+":",R(e))for(var l=0;l<e.length;l++){var u=a+w(i=e[l],l);c+=N(i,t,o,u,s)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(i=e.next()).done;)c+=N(i=i.value,t,o,u=a+w(i,l++),s);else if("object"===i)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return c}function x(e,t,n){if(null==e)return e;var r=[],o=0;return N(e,r,"","",function(e){return t.call(n,e,o++)}),r}function U(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)},function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var M={current:null},P={transition:null},q={ReactCurrentDispatcher:M,ReactCurrentBatchConfig:P,ReactCurrentOwner:O};function _(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:x,forEach:function(e,t,n){x(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return x(e,function(){t++}),t},toArray:function(e){return x(e,function(e){return e})||[]},only:function(e){if(!E(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=h,t.Fragment=o,t.Profiler=s,t.PureComponent=y,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=q,t.act=_,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=S({},e.props),a=e.key,s=e.ref,i=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,i=O.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)T.call(t,l)&&!D.hasOwnProperty(l)&&(o[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)o.children=r;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];o.children=c}return{$$typeof:n,type:e.type,key:a,ref:s,props:o,_owner:i}},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=v,t.createFactory=function(e){var t=v.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=E,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:U}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=P.transition;P.transition={};try{e()}finally{P.transition=t}},t.unstable_act=_,t.useCallback=function(e,t){return M.current.useCallback(e,t)},t.useContext=function(e){return M.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return M.current.useDeferredValue(e)},t.useEffect=function(e,t){return M.current.useEffect(e,t)},t.useId=function(){return M.current.useId()},t.useImperativeHandle=function(e,t,n){return M.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return M.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return M.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return M.current.useMemo(e,t)},t.useReducer=function(e,t,n){return M.current.useReducer(e,t,n)},t.useRef=function(e){return M.current.useRef(e)},t.useState=function(e){return M.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return M.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return M.current.useTransition()},t.version="18.3.1"},291:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2);const o=r.classes.ImageSet,a=(e,t)=>{const{displaySetInstanceUID:n,ReferencedSOPInstanceUID:r}=e,o=t.getDisplaySetByUID(n);if(o.images)return o.images.find(e=>e.SOPInstanceUID===r)},s=(e,t)=>{const n=[],r={};for(const o of t.measurements){const{imageId:t}=o;if(!t)continue;if(r[t])continue;const s=a(o,e);s?(r[t]=s,n.push(s)):console.log("Measurement",o,"had no instances found")}return n},i=(e,t)=>{const n=s(e,t),r=new o(n),a=n[0];if(a)return r.setAttributes({displaySetInstanceUID:r.uid,SeriesDate:a.SeriesDate,SeriesTime:a.SeriesTime,SeriesInstanceUID:r.uid,StudyInstanceUID:a.StudyInstanceUID,SeriesNumber:a.SeriesNumber||0,SOPClassUID:a.SOPClassUID,SeriesDescription:`${t.SeriesDescription} KO ${t.instance.SeriesNumber}`,Modality:"KO",isMultiFrame:!1,numImageFrames:n.length,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",isReconstructable:!1,isCompositeStack:!0,madeInClient:!0,excludeFromThumbnailBrowser:!0,updateInstances:function(){this.images.splice(0,this.images.length,...s(e,t)),this.numImageFrames=this.images.length}}),e.addDisplaySets(r),r}},326:(e,t,n)=>{"use strict";e.exports=n(249)},492:e=>{"use strict";e.exports=l},525:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>O});var r=n(598),o=n.n(r),a=n(326),s=n(2),i=n(942),c=n(291),l=n(669),u=n(55),d=n(492);function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f.apply(null,arguments)}function p(e){const{servicesManager:t}=(0,d.useSystem)(),{children:n,dataSource:r,displaySets:o,viewportOptions:s}=e,{displaySetService:p}=t.services,m=s.viewportId;if(o.length>1)throw new Error("SR viewport should only have a single display set");const S=o[0],{setPositionPresentation:g}=(0,l.usePositionPresentationStore)(),[h,I]=(0,u.useViewportGrid)(),[y,C]=(0,a.useState)(0),[R,T]=(0,a.useState)(null),[O,D]=(0,a.useState)(null),[v,E]=(0,a.useState)(null),{viewports:b,activeViewportId:w}=h,N=(0,a.useCallback)(e=>{const{measurements:t}=S;(0,i.m1)(v,t.map(e=>e.TrackingUniqueIdentifier),e)},[v,y,S]),x=(0,a.useCallback)(e=>{const{StudyInstanceUID:t,displaySetInstanceUID:n,sopClassUids:r}=S;t&&n&&(r&&r.length>1&&console.warn("More than one SOPClassUID in the same series is not yet supported."),async function(e,t,n){const{measurements:r}=e,o=r[t],{displaySetInstanceUID:a}=o;e.keyImageDisplaySet||(e.keyImageDisplaySet=(0,c.A)(n,e));if(!a)return{referencedDisplaySetMetadata:null,referencedDisplaySet:null};const s=n.getDisplaySetByUID(a),i=s.images[0],l={PatientID:i.PatientID,PatientName:i.PatientName,PatientSex:i.PatientSex,PatientAge:i.PatientAge,SliceThickness:i.SliceThickness,StudyDate:i.StudyDate,SeriesDescription:i.SeriesDescription,SeriesInstanceUID:i.SeriesInstanceUID,SeriesNumber:i.SeriesNumber,ManufacturerModelName:i.ManufacturerModelName,SpacingBetweenSlices:i.SpacingBetweenSlices};return{referencedDisplaySetMetadata:l,referencedDisplaySet:s}}(S,e,p).then(({referencedDisplaySet:t,referencedDisplaySetMetadata:n})=>{if(!t||!n)return;C(e),T(t),D(n);const{presentationIds:r}=s,o=S.measurements[e];g(r.positionPresentationId,{viewReference:{referencedImageId:o.imageId}})}))},[r,S,R,m]),U=(0,a.useCallback)(()=>{if(!R)return null;const{measurements:t}=S;return t[y]?a.createElement(l.OHIFCornerstoneViewport,f({},e,{displaySets:[R],viewportOptions:{...s,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:t=>{e.onElementEnabled?.(t),(e=>{E(e.detail.element)})(t)},isJumpToMeasurementDisabled:!0})):null},[R,m,y]);(0,a.useEffect)(()=>{const e=p.subscribe(p.EVENTS.DISPLAY_SETS_REMOVED,({displaySetInstanceUIDs:e})=>{const t=b.get(w);e.includes(t.displaySetInstanceUID)&&I.setDisplaySetsForViewport({viewportId:w,displaySetInstanceUIDs:[]})});return()=>{e.unsubscribe()}},[]),(0,a.useEffect)(()=>{(async()=>{S.isLoaded||await S.load(),x(y)})()},[S]),(0,a.useEffect)(()=>{(async()=>{S.isLoaded||await S.load(),v&&S.isLoaded&&N(y)})()},[y,v,N,S]);let M=null;return R&&O?(n&&n.length&&(M=n.map((e,t)=>e&&a.cloneElement(e,{viewportId:m,key:t}))),a.createElement(a.Fragment,null,a.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},U(),M))):null}p.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object};const m=p;var S=n(193);const g={TEXT:e=>e.TextValue,CODE:e=>e.ConceptCodeSequence?.[0]?.CodeMeaning,UIDREF:e=>e.UID,NUM:e=>{const t=e.MeasuredValueSequence?.[0];if(!t)return;const{NumericValue:n,MeasurementUnitsCodeSequence:r}=t,{CodeValue:o}=r;return`${n} ${o}`},PNAME:e=>{const t=e.PersonName?.[0];return t?s.utils.formatPN(t):void 0},DATE:e=>{const{Date:t}=e;return t?s.utils.formatDate(t):void 0},TIME:e=>{const{Time:t}=e;return t?s.utils.formatTime(t):void 0},DATETIME:e=>{const{DateTime:t}=e;if("string"!=typeof t)return;if(t.length<14)return t;const n=t.substring(0,8),r=t.substring(8,14);return`${s.utils.formatDate(n)} ${s.utils.formatTime(r)}`}};function h(e){const{contentItem:t,nodeIndexesTree:n,continuityOfContent:r}=e,{ConceptNameCodeSequence:o}=t,{CodeValue:s,CodeMeaning:i}=o,c=0===n[n.length-1],l=function(e){const{ValueType:t}=e,n=g[t];return n?n(e):`[${t} is not supported]`}(t)??"[empty]",u="CONTINUOUS"===r,d=s===S.n7.Finding,f=u&&!c&&/^[a-zA-Z0-9]/.test(l?.[0]);let p="whitespace-pre-line";return s===S.n7.Finding&&(p="whitespace-pre-wrap"),u?a.createElement(a.Fragment,null,a.createElement("span",{className:p,title:i},f?" ":"",l)):a.createElement(a.Fragment,null,a.createElement("div",{className:"mb-2"},a.createElement("span",{className:"font-bold"},i,": "),d?a.createElement("pre",null,l):a.createElement("span",{className:p},l)))}function I(){return I=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},I.apply(null,arguments)}function y(e){const{container:t,nodeIndexesTree:n=[0],containerNumberedTree:r=[1]}=e,{ContinuityOfContent:o,ConceptNameCodeSequence:s}=t,{CodeMeaning:i}=s??{};let c=1;const l=t.ContentSequence?.map((e,t)=>{const{ValueType:s}=e,i=[...n,t],l=i.join(".");let u,d;if("CONTAINER"===s){u=y,d={container:e,nodeIndexesTree:i,containerNumberedTree:[...r,c++]}}else u=h,d={contentItem:e,nodeIndexesTree:i,continuityOfContent:o};return a.createElement(u,I({key:l},d))});return a.createElement("div",null,a.createElement("div",{className:"font-bold"},r.join("."),". ",i),a.createElement("div",{className:"ml-4 mb-2"},l))}function C(e){const{displaySets:t}=e,n=t[0].instances[0];return a.createElement("div",{className:"relative flex h-full w-full flex-col overflow-auto p-4 text-white"},a.createElement("div",null,a.createElement(y,{container:n})))}h.propTypes={contentItem:o().object,nodeIndexesTree:o().arrayOf(o().number),continuityOfContent:o().string},y.propTypes={container:o().object,nodeIndexesTree:o().arrayOf(o().number),containerNumberedTree:o().arrayOf(o().number)},C.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object,servicesManager:o().object.isRequired,extensionManager:o().instanceOf(s.ExtensionManager).isRequired};const R=C;function T(e){const{displaySets:t}=e,{isImagingMeasurementReport:n}=t[0];return n?a.createElement(m,e):a.createElement(R,e)}T.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object,servicesManager:o().object.isRequired,extensionManager:o().instanceOf(s.ExtensionManager).isRequired};const O=T},545:e=>{"use strict";e.exports=t},557:e=>{"use strict";e.exports=a},598:(e,t,n)=>{e.exports=n(856)()},669:e=>{"use strict";e.exports=n},713:e=>{"use strict";e.exports=o},856:(e,t,n)=>{"use strict";var r=n(183);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,s){if(s!==r){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},942:(e,t,n)=>{"use strict";n.d(t,{eF:()=>s,m1:()=>a});var r=n(557);const o={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function a(e,t,n=0){const a=(0,r.getEnabledElement)(e),{viewport:s}=a;o.trackingIdentifiersByViewportId[s.id]={trackingUniqueIdentifiers:t,activeIndex:n}}function s(e){const t=(0,r.getEnabledElement)(e),{viewport:n}=t;return o.trackingIdentifiersByViewportId[n.id]?o.trackingIdentifiersByViewportId[n.id]:{trackingUniqueIdentifiers:[]}}}},p={};function m(e){var t=p[e];if(void 0!==t)return t.exports;var n=p[e]={exports:{}};return f[e](n,n.exports,m),n.exports}m.m=f,u=[],m.O=(e,t,n,r)=>{if(!t){var o=1/0;for(c=0;c<u.length;c++){for(var[t,n,r]=u[c],a=!0,s=0;s<t.length;s++)(!1&r||o>=r)&&Object.keys(m.O).every(e=>m.O[e](t[s]))?t.splice(s--,1):(a=!1,r<o&&(o=r));if(a){u.splice(c--,1);var i=n();void 0!==i&&(e=i)}}return e}r=r||0;for(var c=u.length;c>0&&u[c-1][2]>r;c--)u[c]=u[c-1];u[c]=[t,n,r]},m.F={},m.E=e=>{Object.keys(m.F).map(t=>{m.F[t](e)})},m.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return m.d(t,{a:t}),t},m.d=(e,t)=>{for(var n in t)m.o(t,n)&&!m.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},m.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),m.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d={524:0},m.F.j=e=>{if(!m.o(d,e)||void 0===d[e]){d[e]=null;var t=document.createElement("link");t.charset="utf-8",m.nc&&t.setAttribute("nonce",m.nc),t.rel="prefetch",t.as="script",t.href=m.p+m.u(e),document.head.appendChild(t)}},m.O.j=e=>0===d[e],m.O(0,[524],()=>{m.E(524)},5);var S={};return(()=>{"use strict";m.r(S),m.d(S,{Enums:()=>u.Ay,createReferencedImageDisplaySet:()=>pe.A,default:()=>he,hydrateStructuredReport:()=>Z,srProtocol:()=>A,toolNames:()=>g});var e=m(326),t=m(2),n=m.n(t),r=m(545),o=m.n(r),a=m(669),s=m(142),i=m(713),c=m(557),l=m(155),u=m(193);const d=1e-4,f=({GraphicData:e,ValueType:t,imageId:n})=>{const r=[];if("SCOORD3D"===t)for(let t=0;t<e.length;t+=3)r.push([e[t],e[t+1],e[t+2]]);else for(let t=0;t<e.length;t+=2){const o=c.utilities.imageToWorldCoords(n,[e[t],e[t+1]]);r.push(o)}return r};const p=function({GraphicType:e,GraphicData:t,ValueType:n,imageId:r}){let o=[];switch(e){case u.sh.POINT:case u.sh.MULTIPOINT:case u.sh.POLYLINE:o=f({GraphicData:t,ValueType:n,imageId:r});break;case u.sh.CIRCLE:{const e=f({GraphicData:t,ValueType:n,imageId:r}),a=e[0],s=e[1],i=l.vec3.distance(a,s),u=c.metaData.get("imagePlaneModule",r);if(!u)throw new Error("No imagePlaneModule found");const{columnCosines:d,rowCosines:p}=u,m=l.vec3.create();l.vec3.scaleAndAdd(m,a,d,i);const S=l.vec3.create();l.vec3.scaleAndAdd(S,a,d,-i);const g=l.vec3.create();l.vec3.scaleAndAdd(g,a,p,i);const h=l.vec3.create();l.vec3.scaleAndAdd(h,a,p,-i),o=[m,S,g,h];break}case u.sh.ELLIPSE:{const e=f({GraphicData:t,ValueType:n,imageId:r}),a=l.vec3.fromValues(...e[0]),s=l.vec3.fromValues(...e[1]),i=l.vec3.fromValues(...e[2]),u=l.vec3.fromValues(...e[3]),p=l.vec3.create();l.vec3.sub(p,s,a),l.vec3.normalize(p,p);const m=l.vec3.create();l.vec3.sub(m,u,i),l.vec3.normalize(m,m);const S=c.metaData.get("imagePlaneModule",r);if(!S)throw new Error("imageId does not have imagePlaneModule metadata");const{columnCosines:g}=S,h=l.vec3.fromValues(...g),I=Math.abs(l.vec3.dot(h,p)),y=Math.abs(l.vec3.dot(h,m)),C=Math.abs(I),R=Math.abs(y);o=[],Math.abs(C-1)<d?o=[e[0],e[1],e[2],e[3]]:Math.abs(R-1)<d?o=[e[2],e[3],e[0],e[1]]:console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED");break}default:console.warn("Unsupported GraphicType:",e)}return o},g={DICOMSRDisplay:"DICOMSRDisplay",SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI",SRSCOORD3DPoint:"SRSCOORD3DPoint"};function h(e,t,n){let r=g.DICOMSRDisplay;const o=e.coords.reduce((e,n)=>(e[n.GraphicType]=e[n.GraphicType]||[],e[n.GraphicType].push(p({...n,imageId:t})),e),{}),{TrackingUniqueIdentifier:a}=e,{ValueType:s,GraphicType:l}=e.coords[0],u=o[l];let d=null;if(t){const e=c.metaData.get("imagePlaneModule",t);d=e?.frameOfReferenceUID}"SCOORD3D"===s&&(r=g.SRSCOORD3DPoint,d=e.coords[0].ReferencedFrameOfReferenceSequence);const f={annotationUID:a,highlighted:!1,isLocked:!1,invalidated:!1,metadata:{toolName:r,valueType:s,graphicType:l,FrameOfReferenceUID:d,referencedImageId:t},data:{label:e.labels?.[0]?.value||void 0,displayText:e.displayText||void 0,handles:{textBox:e.textBox??{},points:u[0]},cachedStats:{},frameNumber:n,renderableData:o,TrackingUniqueIdentifier:a,labels:e.labels}};i.annotation.state.addAnnotation(f)}const{MeasurementReport:I}=s.adaptersSR.Cornerstone3D;const y=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-sr"}').UU,C="dicom-sr",R=`${y}.sopClassHandlerModule.${C}`,T="dicom-sr-3d",O=`${y}.sopClassHandlerModule.${T}`,{sopClassDictionary:D}=t.utils,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:v,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:E}=a.Enums,{ImageSet:b,MetadataProvider:w}=t.classes,{CodeScheme:N}=s.adaptersSR.Cornerstone3D,x=[D.BasicTextSR,D.EnhancedSR,D.ComprehensiveSR];function U(e,n){return this.instances.push(...e),t.utils.sortStudyInstances(this.instances),this.instance=this.instances[this.instances.length-1],this.isLoaded=!1,this}function M(e,n,r){if(!e||!e.length)throw new Error("No instances were provided");t.utils.sortStudyInstances(e);const a=e[e.length-1],{StudyInstanceUID:s,SeriesInstanceUID:i,SOPInstanceUID:c,SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,ConceptNameCodeSequence:m,SOPClassUID:S}=a;((e,t)=>{t.forEach(t=>{if(t.StudyInstanceUID!==e)throw console.warn("Not all instances have the same UID",e,t),new Error(`Instances ${t.SOPInstanceUID} does not belong to ${e}`)})})(a.StudyInstanceUID,e);const g=S===D.Comprehensive3DSR,h=m?.CodeValue===u.n7.ImagingMeasurementReport,y={Modality:"SR",displaySetInstanceUID:t.utils.guid(),SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,SOPInstanceUID:c,SeriesInstanceUID:i,StudyInstanceUID:s,SOPClassHandlerId:g?O:R,SOPClassUID:S,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,isImagingMeasurementReport:h,sopClassUids:x,instance:a,addInstances:U,label:l||`${o().t("Series")} ${d} - ${o().t("SR")}`};return y.load=()=>async function(e,t,n){const{displaySetService:r,measurementService:o}=t.services,a=n.getDataSources(),s=a[0],{ContentSequence:i}=e.instance;async function c(t,n=null,r=null){for(const o in t)if("object"==typeof t[o]&&null!==t[o])await c(t[o],t,o);else if(Array.isArray(t[o]))await Promise.all(t[o].map(e=>c(e,t,o)));else if("BulkDataURI"===o){const a=await s.retrieve.bulkDataURI({BulkDataURI:t[o],StudyInstanceUID:e.instance.StudyInstanceUID,SeriesInstanceUID:e.instance.SeriesInstanceUID,SOPInstanceUID:e.instance.SOPInstanceUID});n&&r&&(n[r]=new Float32Array(a))}}!0!==e.isLoaded&&await c(i);e.isImagingMeasurementReport?(e.referencedImages=function(e){const t=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImageLibrary);if(!t)return[];const n=V(t.ContentSequence).find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImageLibraryGroup);if(!n)return[];const r=[];return V(n.ContentSequence).forEach(e=>{const{ReferencedSOPSequence:t}=e;if(t)for(const e of V(t))if(e.ReferencedSOPClassUID){const{ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n}=e;r.push({ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n})}}),r}(i),e.measurements=function(e){const t=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImagingMeasurements);if(!t)return[];const n=function(e){const t={};return e.forEach(e=>{const n=V(e.ContentSequence),r=n.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingUniqueIdentifier);r||console.warn("No Tracking Unique Identifier, skipping ambiguous measurement.");const o=r.UID;void 0===t[o]?t[o]=[...n]:n.forEach(e=>{e.ConceptNameCodeSequence.CodeValue!==u.n7.TrackingUniqueIdentifier&&t[o].push(e)})}),t}(V(t.ContentSequence).filter(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.MeasurementGroup)),r=[];return Object.keys(n).forEach(e=>{const t=function(e){if(e.some(e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType))return function(e){const t=e.find(e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType),n=e.find(e=>"UIDREF"===e.ValueType),r=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingIdentifier);if(!t)return void console.warn(`graphic ValueType ${t.ValueType} not currently supported, skipping annotation.`);const o=e.filter(e=>"NUM"===e.ValueType),a={loaded:!1,labels:[],coords:[_(t)],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};o.forEach(e=>{const{ConceptNameCodeSequence:t,MeasuredValueSequence:n}=e;n&&a.labels.push(k(t,n))});const s=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===u.bY.SCT&&e.ConceptNameCodeSequence.CodeValue===u.n7.FindingSiteSCT);s.length&&a.labels.push({label:u.n7.FindingSiteSCT,value:s[0].ConceptCodeSequence.CodeMeaning});return a}(e);return function(e){const t=e.filter(e=>"NUM"===e.ValueType),n=e.find(e=>"UIDREF"===e.ValueType),r=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingIdentifier),o=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.Finding),a=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===u.bY.SRT&&e.ConceptNameCodeSequence.CodeValue===u.n7.FindingSite),s={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};o&&u.bY.CornerstoneCodeSchemes.includes(o.ConceptCodeSequence.CodingSchemeDesignator)&&o.ConceptCodeSequence.CodeValue===N.codeValues.CORNERSTONEFREETEXT&&s.labels.push({label:N.codeValues.CORNERSTONEFREETEXT,value:o.ConceptCodeSequence.CodeMeaning});if(a.length){const e=a.find(e=>u.bY.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===N.codeValues.CORNERSTONEFREETEXT);e&&s.labels.push({label:N.codeValues.CORNERSTONEFREETEXT,value:e.ConceptCodeSequence.CodeMeaning})}return t.forEach(e=>{const{ConceptNameCodeSequence:t,ContentSequence:n,MeasuredValueSequence:r}=e,{ValueType:o}=n;if("SCOORD"===!o)return void console.warn(`Graphic ${o} not currently supported, skipping annotation.`);const a=_(n);a&&s.coords.push(a),r&&s.labels.push(k(t,r))}),s}(e)}(n[e]);t&&r.push(t)}),r}(i)):(e.referencedImages=[],e.measurements=[]);const l=o.getSourceMappings(v,E);e.isHydrated=!1,e.isRehydratable=function(e,t){if(!t||!t.length)return!1;const n=new Set;for(const e of t)n.add(e.annotationType);const{measurements:r}=e;for(let e=0;e<r.length;e++){const{TrackingIdentifier:t}=r[e]||{};if(!t){console.warn("No tracking identifier for measurement ",r[e]);continue}const o=I.getAdapterForTrackingIdentifier(t);if(o&&n.has(o.toolType))return!0;console.log("Measurement is not rehydratable",t,r[e])}return console.log("No measurements found which were rehydratable"),!1}(e,l),e.isLoaded=!0,r.activeDisplaySets.forEach(n=>{P(e,n,s,t)}),r.subscribe(r.EVENTS.DISPLAY_SETS_ADDED,n=>{const{displaySetsAdded:r}=n;r.forEach(n=>{P(e,n,s,t)})})}(y,n,r),[y]}function P(e,t,n,r){const{customizationService:o}=r.services,a=e.measurements.filter(e=>!1===e.loaded);if(0===a.length||!(t instanceof b)||t.unsupported)return;const s=new Map,i=n.getImageIdsForDisplaySet(t);for(const e of i){const{SOPInstanceUID:t,frameNumber:n}=w.getUIDsFromImageID(e),r=`${t}:${n||1}`;s.set(r,e)}if(!a?.length)return;const c=e.SOPClassUID===D.Comprehensive3DSR;for(let n=a.length-1;n>=0;n--){let r=a[n];const i=o.getCustomization("onBeforeSRAddMeasurement");if("function"==typeof i&&(r=i({measurement:r,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID})),c){h(r,null,null),r.loaded=!0;continue}const l=r.coords[0].ReferencedSOPSequence;if(!l)continue;const{ReferencedSOPInstanceUID:u}=l,d=l.ReferencedFrameNumber||1,f=`${u}:${d}`,p=s.get(f);p&&q(r,u,d)&&(h(r,p,d),r.loaded=!0,r.imageId=p,r.displaySetInstanceUID=t.displaySetInstanceUID,r.ReferencedSOPInstanceUID=u,r.frameNumber=d,a.splice(n,1))}}function q(e,t,n){const{coords:r}=e,o=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence?.ReferencedFrameNumber||1;if(n&&Number(n)!==Number(o))return!1;for(let e=0;e<r.length;e++){const n=r[e],{ReferencedSOPInstanceUID:o}=n.ReferencedSOPSequence;if(o===t)return!0}return!1}const _=e=>{const{ValueType:t,GraphicType:n,GraphicData:r}=e,o={ValueType:t,GraphicType:n,GraphicData:r};return o.ReferencedSOPSequence=e.ContentSequence?.ReferencedSOPSequence,o.ReferencedFrameOfReferenceSequence=e.ReferencedFrameOfReferenceUID||e.ContentSequence?.ReferencedFrameOfReferenceSequence,o};function k(e,t){const{CodeMeaning:n}=e,{NumericValue:r,MeasurementUnitsCodeSequence:o}=t,{CodeValue:a}=o;return{label:n,value:`${r?Number(r).toFixed(2):""} ${a}`}}function V(e){return e?Array.isArray(e)?e:[e]:[]}const L=function(e){const{servicesManager:t,extensionManager:n}=e,r=e=>M(e,t,n);return[{name:C,sopClassUids:x,getDisplaySetsFromSeries:r},{name:T,sopClassUids:[D.Comprehensive3DSR],getDisplaySetsFromSeries:r}]},A={id:"@ohif/sr",name:"SR Key Images",protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{srDisplaySetId:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"SR"}}]}},stages:[{name:"SR Key Images",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId"}]}]}]};var F=m(111),j=m.n(F);const{log:B}=n();const $=function(e,t){const n={};function r(r,o){if(!r.metadata?.referencedImageId)return void B.warn(`[DICOMSR] No referencedImageId found for ${o} ${r.id}`);const a=r.metadata.referencedImageId;n[a]||(n[a]={});const s=n[a];s[o]||(s[o]={data:[]});const i=e.find(e=>e.uid===r.annotationUID),c=s[o].data;let{finding:l}=i;const u=[];i.label&&(t.includes(o)?l={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:i.label}:u.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:i.label})),i.findingSites&&u.push(...i.findingSites);const d=Object.assign({},r,{finding:l,findingSites:u});c.push(d)}const o=e.map(e=>e.uid).slice(),a=i.annotation.state.getAnnotationManager(),s=a.getFramesOfReference();for(let e=0;e<s.length;e++){const t=s[e],i=a.getAnnotations(t),c=Object.keys(i);for(let e=0;e<c.length;e++){const t=c[e],a=i[t];if(a)for(let e=0;e<a.length;e++){const s=a[e],i=o.findIndex(e=>e===s.annotationUID);if(-1!==i&&(r(s,t),o.splice(i,1),!o.length))return n}}}return n},{CodeScheme:G}=s.adaptersSR.Cornerstone3D;const{locking:W}=i.annotation,{guid:H}=n().utils,{MeasurementReport:z,CORNERSTONE_3D_TAG:Y}=s.adaptersSR.Cornerstone3D,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:X,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:J}=a.Enums,K=(e,t)=>{if(!t||"CORNERSTONEJS"===t.CodingSchemeDesignator)return;const n=`${t.CodingSchemeDesignator}:${t.CodeValue}`;return{...e[n],ref:n,...t,text:t.CodeMeaning}},Q=(e,t)=>{if(!t||!t.length)return;const n=[];for(let r=0;r<t.length;r++){const o=K(e,t[r][0]||t[r]);o&&n.push(o)}return n.length&&n||void 0};function Z({servicesManager:e,extensionManager:n,commandsManager:r},o){const a=n.getActiveDataSource()[0],{measurementService:s,displaySetService:i,customizationService:l}=e.services,u=l.getCustomization("codingValues"),d=l.getCustomization("panelMeasurement.disableEditing"),f=i.getDisplaySetByUID(o),p=s.getSourceMappings(X,J);if(!p||!p.length)throw new Error("Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.");const m=t.DicomMetadataStore.getInstance(f.StudyInstanceUID,f.SeriesInstanceUID,f.SOPInstanceUID),S={},g={};f.measurements.forEach(e=>{const{ReferencedSOPInstanceUID:t,imageId:n,frameNumber:r}=e;S[t]||(S[t]=n,g[t]=[]),g[t][r]||(g[t][r]=n)});const h=m;let I=z.generateToolState(h,S,c.utilities.imageToWorldCoords,c.metaData);const y=l.getCustomization("onBeforeSRHydration")?.value;"function"==typeof y&&(I=y({storedMeasurementByAnnotationType:I,displaySet:f}));const C=p.map(e=>e.annotationType),R={};Object.keys(I).forEach(e=>{C.includes(e)&&(R[e]=I[e])});const T=[];let O;Object.keys(R).forEach(e=>{R[e].forEach(e=>{const t=e.annotation.data&&e.annotation.data.frameNumber||1,n=g[e.sopInstanceUid][t]||S[e.sopInstanceUid];T.includes(n)||T.push(n)})});const D=[];for(let e=0;e<T.length;e++){const t=T[e],{SeriesInstanceUID:n,StudyInstanceUID:r}=c.metaData.get("instance",t);D.includes(n)||D.push(n),O?O!==r&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):O=r}return Object.keys(R).forEach(e=>{R[e].forEach(t=>{const n=t.annotation.data&&t.annotation.data.frameNumber||1,o=g[t.sopInstanceUid][n]||S[t.sopInstanceUid];t.uid=H();const i=c.metaData.get("instance",o),{FrameOfReferenceUID:l}=i,f={annotationUID:t.annotation.annotationUID,data:t.annotation.data,metadata:{toolName:e,referencedImageId:o,FrameOfReferenceUID:l}},m=s.getSource(X,J);f.data.label=function(e){const{findingSites:t=[],finding:n}=e;let r=t.find(e=>e.CodeValue===G.codeValues.CORNERSTONEFREETEXT);return r?r.CodeMeaning:n&&n.CodeValue===G.codeValues.CORNERSTONEFREETEXT?n.CodeMeaning:void 0}(t),f.data.finding=K(u,t.finding?.[0]),f.data.findingSites=Q(u,t.findingSites),f.data.findingSites?.forEach(e=>{e.type&&(f.data[e.type]=e)});const h=p.find(t=>t.annotationType===e),I=s.addRawMeasurement(m,e,{annotation:f},h.toMeasurementSchema,a);r.runCommand("updateMeasurement",{uid:I,code:f.data.finding}),d&&W.setAnnotationLocked(I,!0),T.includes(o)||T.push(o)})}),f.isHydrated=!0,{StudyInstanceUID:O,SeriesInstanceUIDs:D}}const{MeasurementReport:ee}=s.adaptersSR.Cornerstone3D,{log:te}=n(),ne=(e,t,n={})=>{const r=$(e,t),o=ee.generateReport(r,c.metaData,c.utilities.worldToImageCoords,n),{dataset:a}=o;return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a.InstanceNumber=n.InstanceNumber??1,a},re=e=>{const{servicesManager:n,extensionManager:r,commandsManager:o}=e,{customizationService:a,viewportGridService:s,displaySetService:i}=n.services,c={changeColorMeasurement:({uid:e})=>{throw new Error("Unsupported operation: changeColorMeasurement")},downloadReport:({measurementData:e,additionalFindingTypes:t,options:n={}})=>{const r=ne(e,t,n),o=j().data.datasetToBlob(r),a=URL.createObjectURL(o);window.location.assign(a)},storeMeasurements:async({measurementData:e,dataSource:n,additionalFindingTypes:r,options:o={}})=>{if(te.info("[DICOMSR] storeMeasurements"),!n||!n.store||!n.store.dicom)return te.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const s=ne(e,r,o),{StudyInstanceUID:i,ContentSequence:c}=s;if(!c?.[4].ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",s),new Error("Invalid report, no content");const l=a.getCustomization("onBeforeDicomStore");let u;return"function"==typeof l&&(u=l({dicomDict:u,measurementData:e,naturalizedReport:s})),await n.store.dicom(s,null,u),i&&n.deleteStudyMetadataPromise(i),t.DicomMetadataStore.addInstances([s],!0),s}catch(e){throw console.warn(e),te.error(`[DICOMSR] Error while saving the measurements: ${e.message}`),new Error(e.message||"Error while saving the measurements.")}},hydrateStructuredReport:({displaySetInstanceUID:e})=>Z({servicesManager:n,extensionManager:r,commandsManager:o},e)};return{actions:c,definitions:{downloadReport:c.downloadReport,storeMeasurements:c.storeMeasurements,hydrateStructuredReport:c.hydrateStructuredReport},defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};var oe=m(942);class ae extends i.AnnotationTool{constructor(e={},t={configuration:{}}){super(e,t),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:r}=n;let o=i.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;if(o=this.filterInteractableAnnotationsForElement(r,o),!o?.length)return;const a=(0,oe.eF)(r),{activeIndex:s,trackingUniqueIdentifiers:c}=a,l=c[s],d=o.filter(e=>c.includes(e.data?.TrackingUniqueIdentifier));if(!n._actors?.size)return;const f={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},{style:p}=i.annotation.config;for(let e=0;e<d.length;e++){const r=d[e],o=r.annotationUID,{renderableData:a,TrackingUniqueIdentifier:s}=r.data,{referencedImageId:c}=r.metadata;f.annotationUID=o;const m=p.getToolGroupToolStyles(this.toolGroupId)[this.getToolName()],S=this.getStyle("lineWidth",f,r),g=this.getStyle("lineDash",f,r),h={color:s===l?"rgb(0, 255, 0)":this.getStyle("color",f,r),lineDash:g,lineWidth:S,...m};Object.keys(a).forEach(e=>{const s=a[e];let l,d;switch(e){case u.sh.POINT:l=this.renderPoint;break;case u.sh.MULTIPOINT:l=this.renderMultipoint;break;case u.sh.POLYLINE:l=this.renderPolyLine;break;case u.sh.CIRCLE:l=this.renderEllipse;break;case u.sh.ELLIPSE:l=this.renderEllipse,d=i.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const p=l(t,n,s,o,c,h);this.renderTextBox(t,n,p,d,r,f,h)})}}}_getTextBoxLinesFromLabels(e){const t=Math.min(e.length,5),n=[];for(let r=0;r<t;r++){const t=e[r];n.push(`${ie(t.label)}: ${t.value}`)}return n}renderPolyLine(e,t,n,r,o,a){const s={color:a.color,width:a.lineWidth,lineDash:a.lineDash};let c=[];return n.map((n,o)=>{const a=n.map(e=>t.worldToCanvas(e)),l=`${o}`;2===a.length?i.drawing.drawLine(e,r,l,a[0],a[1],s):i.drawing.drawPolyline(e,r,l,a,s),c=c.concat(a)}),c}renderMultipoint(e,t,n,r,o,a){let s;n.map((n,o)=>{s=n.map(e=>t.worldToCanvas(e));i.drawing.drawHandles(e,r,"0",s,{color:a.color})})}renderPoint(e,t,n,r,o,a){const s=[];return n.map((n,l)=>{const u=n[0];if(s.push(t.worldToCanvas(u)),void 0!==n[1])s.push(t.worldToCanvas(n[1]));else{const e=c.metaData.get("imagePixelModule",o);let n=10,r=10;if(e){const{columns:t,rows:o}=e;n=t/10,r=o/10}const a=c.utilities.worldToImageCoords(o,u),i=c.utilities.imageToWorldCoords(o,[a[0]+n,a[1]+r]);s.push(t.worldToCanvas(i))}const d=`${l}`;i.drawing.drawArrow(e,r,d,s[1],s[0],{color:a.color,width:a.lineWidth})}),s}renderEllipse(e,t,n,r,o,a){let s;return n.map((n,o)=>{if(0===n.length)return;const c=n,l=t.getRotation();let u;s=c.map(e=>t.worldToCanvas(e)),u=90==l||270==l?i.utilities.math.ellipse.getCanvasEllipseCorners([s[2],s[3],s[0],s[1]]):i.utilities.math.ellipse.getCanvasEllipseCorners(s);const d=`${o}`;i.drawing.drawEllipse(e,r,d,u[0],u[1],{color:a.color,width:a.lineWidth,lineDash:a.lineDash})}),s}renderTextBox(e,t,n,r,o,a,s={}){if(!n||!o)return;const{annotationUID:c,data:l={}}=o,{labels:u}=l,{color:d}=s;let f=n;"function"==typeof r&&(f=r(n));const p=this._getTextBoxLinesFromLabels(u),m=i.utilities.drawing.getTextBoxCoordsCanvas(f);o.data?.handles?.textBox?.worldPosition||(o.data.handles.textBox.worldPosition=t.canvasToWorld(m));const S=t.worldToCanvas(o.data.handles.textBox.worldPosition),g=this.getLinkedTextBoxStyle(a,o),h=i.drawing.drawLinkedTextBox(e,c,"1",p,S,n,{},{...g,color:d}),{x:I,y,width:C,height:R}=h;o.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([I,y]),topRight:t.canvasToWorld([I+C,y]),bottomLeft:t.canvasToWorld([I,y+R]),bottomRight:t.canvasToWorld([I+C,y+R])}}}ae.toolName=g.DICOMSRDisplay;const se={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function ie(e){const t=se[e];return void 0!==t?t:e}class ce extends i.AnnotationDisplayTool{constructor(e={},t={configuration:{}}){super(e,t),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:r}=n,o=i.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;const a=o;if(!n._actors?.size)return;const s={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<a.length;e++){const r=a[e],o=r.annotationUID,{renderableData:c}=r.data,{POINT:l}=c;s.annotationUID=o;const u=this.getStyle("lineWidth",s,r),d=this.getStyle("lineDash",s,r),f={color:this.getStyle("color",s,r),lineDash:d,lineWidth:u},p=l[0][0];if(!n.isReferenceViewable({FrameOfReferenceUID:r.metadata.FrameOfReferenceUID,cameraFocalPoint:p},{asNearbyProjection:!0}))continue;const m=n.worldToCanvas(p),S=[m,[m[0]+20,m[1]+20]];i.drawing.drawArrow(t,o,"1",S[1],S[0],{color:f.color,width:f.lineWidth}),this.renderTextBox(t,n,S,r,s,f)}}}_getTextBoxLinesFromLabels(e){Math.min(e.length,5);return[]}renderTextBox(e,t,n,r,o,a={}){if(!n||!r)return;const{annotationUID:s,data:c={}}=r,{labels:l}=c,u=[];for(const e of l)"363698007"===e.label&&u.push(`Finding Site: ${e.value}`);const{color:d}=a,f=n,p=i.utilities.drawing.getTextBoxCoordsCanvas(f);r.data?.handles?.textBox?.worldPosition||(r.data.handles.textBox.worldPosition=t.canvasToWorld(p));const m=t.worldToCanvas(r.data.handles.textBox.worldPosition),S=this.getLinkedTextBoxStyle(o,r),g=i.drawing.drawLinkedTextBox(e,s,"1",u,m,n,{},{...S,color:d}),{x:h,y:I,width:y,height:C}=g;r.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([h,I]),topRight:t.canvasToWorld([h+y,I]),bottomLeft:t.canvasToWorld([h,I+C]),bottomRight:t.canvasToWorld([h+y,I+C])}}getLinkedTextBoxStyle(e,t){return{visibility:this.getStyle("textBoxVisibility",e,t),fontFamily:this.getStyle("textBoxFontFamily",e,t),fontSize:this.getStyle("textBoxFontSize",e,t),color:this.getStyle("textBoxColor",e,t),shadow:this.getStyle("textBoxShadow",e,t),background:this.getStyle("textBoxBackground",e,t),lineWidth:this.getStyle("textBoxLinkLineWidth",e,t),lineDash:this.getStyle("textBoxLinkLineDash",e,t)}}}ce.toolName=g.SRSCOORD3DPoint;const le={toAnnotation:e=>{},toMeasurement:(e,t,n,r,o)=>{const{annotation:a}=e,{metadata:s,data:i,annotationUID:c}=a;if(!s||!i)return console.warn("Probe tool: Missing metadata or data"),null;const{toolName:l}=s,{points:u}=i.handles,d=function(e){const{data:t}=e;if(!t)return[""];const{labels:n}=t,r=[];for(const e of n)"33636980076"===e.label&&r.push(`Finding Site: ${e.value}`);return r}(a);return{uid:c,points:u,metadata:s,toolName:s.toolName,label:i.label,displayText:d,data:i.cachedStats,type:r?.(l)??null}}};function ue(e,t,n={}){class r extends t{constructor(e,t){e.configuration=e.configuration?{...e.configuration,...n}:n,super(e,t)}}r.toolName=e,(0,i.addTool)(r)}const{CORNERSTONE_3D_TOOLS_SOURCE_NAME:de,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:fe}=a.Enums;var pe=m(291);function me(){return me=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},me.apply(null,arguments)}const Se=e.lazy(()=>Promise.resolve().then(m.bind(m,525))),ge=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(Se,t)),he={id:y,onModeEnter:function({servicesManager:e}){const{displaySetService:t}=e.services;[...t.getDisplaySetCache().values()].filter(e=>e.SOPClassHandlerId===R||e.SOPClassHandlerId===O).forEach(e=>{e.isHydrated=!1})},preRegistration:function({configuration:e={},servicesManager:t}){const{measurementService:n,cornerstoneViewportService:r}=t.services;ue(g.DICOMSRDisplay,ae),ue(g.SRLength,i.LengthTool),ue(g.SRBidirectional,i.BidirectionalTool),ue(g.SREllipticalROI,i.EllipticalROITool),ue(g.SRCircleROI,i.CircleROITool),ue(g.SRArrowAnnotate,i.ArrowAnnotateTool),ue(g.SRAngle,i.AngleTool),ue(g.SRPlanarFreehandROI,i.PlanarFreehandROITool),ue(g.SRRectangleROI,i.RectangleROITool),ue(g.SRSCOORD3DPoint,ce),ue(g.SRCobbAngle,i.CobbAngleTool);const o=n.getSource(de,fe),{POINT:a}=n.VALUE_TYPES;n.addMapping(o,"SRSCOORD3DPoint",a,le.toAnnotation,le.toMeasurement);const s={lineDash:"4,4"};i.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{[g.DICOMSRDisplay]:s,SRLength:s,SRBidirectional:s,SREllipticalROI:s,SRCircleROI:s,SRArrowAnnotate:s,SRCobbAngle:s,SRAngle:s,SRPlanarFreehandROI:s,SRRectangleROI:s,global:{}})},getViewportModule:({servicesManager:t,extensionManager:n})=>[{name:"dicom-sr",component:r=>e.createElement(ge,me({servicesManager:t,extensionManager:n},r))}],getCommandsModule:re,getSopClassHandlerModule:L,getUtilityModule:({servicesManager:e})=>[{name:"tools",exports:{toolNames:g}}]}})(),S=m.O(S)})());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ohif/extension-cornerstone-dicom-sr",
3
- "version": "3.11.0-beta.76",
3
+ "version": "3.11.0-beta.78",
4
4
  "description": "OHIF extension for an SR Cornerstone Viewport",
5
5
  "author": "OHIF",
6
6
  "license": "MIT",
@@ -34,10 +34,10 @@
34
34
  "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
35
35
  },
36
36
  "peerDependencies": {
37
- "@ohif/core": "3.11.0-beta.76",
38
- "@ohif/extension-cornerstone": "3.11.0-beta.76",
39
- "@ohif/extension-measurement-tracking": "3.11.0-beta.76",
40
- "@ohif/ui": "3.11.0-beta.76",
37
+ "@ohif/core": "3.11.0-beta.78",
38
+ "@ohif/extension-cornerstone": "3.11.0-beta.78",
39
+ "@ohif/extension-measurement-tracking": "3.11.0-beta.78",
40
+ "@ohif/ui": "3.11.0-beta.78",
41
41
  "dcmjs": "^0.42.0",
42
42
  "dicom-parser": "^1.8.9",
43
43
  "hammerjs": "^2.0.8",
@@ -46,9 +46,9 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@babel/runtime": "^7.20.13",
49
- "@cornerstonejs/adapters": "^3.28.2",
50
- "@cornerstonejs/core": "^3.28.2",
51
- "@cornerstonejs/tools": "^3.28.2",
49
+ "@cornerstonejs/adapters": "^3.29.2",
50
+ "@cornerstonejs/core": "^3.29.2",
51
+ "@cornerstonejs/tools": "^3.29.2",
52
52
  "classnames": "^2.3.2"
53
53
  }
54
54
  }