UNPKG

modified-dicom-pacs

Version:

A modified version of DICOM PACS implementation

1 lines 279 kB
"use strict";(globalThis.webpackChunk=globalThis.webpackChunk||[]).push([[321],{76255:(e,t,n)=>{n.d(t,{It:()=>d,R4:()=>m});var o=n(41766),r=n(11374),i=n.n(r),a=n(5085),s=n(77954);const l={default:{[a.ld.topLeft]:[],[a.ld.topRight]:[],[a.ld.bottomLeft]:[],[a.ld.bottomRight]:[]}},c=(0,o.createContext)(l);function d({children:e,service:t}){const[n,r]=(0,o.useReducer)(((e,t)=>{switch(t.type){case"SET_ACTION_COMPONENT":{const{viewportId:n,id:o,component:r,location:i,indexPriority:a=0}=t.payload;let s=e?.[n]?.[i]?[...e[n][i]]:[];const l=s.findIndex((e=>e.id===o));if(-1!==l&&(s=[...s.slice(0,l),...s.slice(l+1)]),r){const e=s.findIndex((e=>a<=e.indexPriority));s=[...s.slice(0,e),{id:o,component:r,indexPriority:a},...s.slice(e+1)]}return{...e,[n]:{...e[n],[i]:s}}}case"CLEAR_ACTION_COMPONENTS":{const n=t.payload,o={...e};return delete o[n],o}default:return{...e}}}),l),i=(0,o.useCallback)((()=>n),[n]),a=(0,o.useCallback)((e=>{r({type:"SET_ACTION_COMPONENT",payload:e})}),[r]),s=(0,o.useCallback)((e=>{e.forEach((e=>r({type:"SET_ACTION_COMPONENT",payload:e})))}),[r]),d=(0,o.useCallback)((e=>r({type:"CLEAR_ACTION_COMPONENTS",payload:e})),[r]);(0,o.useEffect)((()=>{t&&t.setServiceImplementation({getState:i,setComponent:a,setComponents:s,clear:d})}),[i,t,a,s]);const m={getState:i,setComponent:e=>t.setComponent(e),setComponents:e=>t.setComponents(e),clear:e=>t.clear(e)},p=(0,o.useMemo)((()=>[n,m]),[n,m]);return o.createElement(c.Provider,{value:p},e)}d.propTypes={children:i().node,service:i().instanceOf(s.A).isRequired};const m=()=>(0,o.useContext)(c)},12702:(e,t,n)=>{n.r(t),n.d(t,{ImageOverlayViewerTool:()=>U,Types:()=>r,default:()=>Jn,getActiveViewportEnabledElement:()=>w,measurementMappingUtils:()=>o,toolNames:()=>R});var o={};n.r(o),n.d(o,{getDisplayUnit:()=>k,getFirstAnnotationSelected:()=>F,getHandlesFromPoints:()=>x,getSOPInstanceAttributes:()=>P.A,isAnnotationSelected:()=>L,setAnnotationSelected:()=>G});var r={};n.r(r);var i=n(41766),a=n(92136),s=n(39371),l=n(23722),c=n(55411),d=n(54578),m=n.n(d),p=n(45561),u=n.n(p);const{registerVolumeLoader:g}=a.volumeLoader;let h=!1;function I(e,t,n){m().external.cornerstone=a,m().external.dicomParser=u(),g("cornerstoneStreamingImageVolume",l.FC),g("cornerstoneStreamingDynamicImageVolume",l.Mr),m().configure({decodeConfig:{convertFloatPixelDataToInt:!1,use16BitDataType:Boolean(t.useNorm16Texture)||Boolean(t.preferSizeOverAccuracy)},beforeSend:function(t){const o=n.getActiveDataSource()?.[0].getConfig()??{},r=e.getAuthorizationHeader(),i={Accept:c.utils.generateAcceptHeader(o.acceptHeader,o.requestTransferSyntaxUID,o.omitQuotationForMultipartRequest)};return r&&Object.assign(i,r),i},errorInterceptor:e=>{c.r_.getHTTPErrorHandler(e)}}),function(e){const t={maxWebWorkers:Math.min(Math.max(navigator.hardwareConcurrency-1,1),e.maxNumberOfWebWorkers),startWebWorkersOnDemand:!0,taskConfiguration:{decodeTask:{initializeCodecsOnStartup:!1,usePDFJS:!1,strict:!1}}};h||(m().webWorkerManager.initialize(t),h=!0)}(t)}var S=n(5085);function v(e,t,n){const o=!!n&&n.exclusive,r=n?n.items:[];return new Promise(((n,i)=>{t.create({id:"select-annotation",isDraggable:!1,showOverlay:!0,content:S.nd,defaultPosition:{x:window.innerWidth/2,y:window.innerHeight/2},contentProps:{labellingDoneCallback:o=>{t.dismiss({id:"select-annotation"}),"string"==typeof o&&(e.label=o),n(e)},measurementData:e,componentClassName:{},labelData:r,exclusive:o}})}))}const f=function(e,t,n,o=!0,r={}){const a="dialog-enter-annotation",s=t?o?t.text:t.label:"",{dialogTitle:l="Annotation",inputLabel:c="Enter your annotation",validateFunc:d=(e=>!0)}=r,m=({action:t,value:o})=>{switch(t.id){case"save":if("function"==typeof d&&!d(o.label))return;n(o.label,t.id);break;case"cancel":n("",t.id)}e.dismiss({id:a})};e&&e.create({id:a,centralize:!0,isDraggable:!1,showOverlay:!0,content:S.lG,contentProps:{title:l,value:{label:s},noCloseButton:!0,onClose:()=>e.dismiss({id:a}),actions:[{id:"cancel",text:"Cancel",type:S.Ny.NW.secondary},{id:"save",text:"Save",type:S.Ny.NW.primary}],onSubmit:m,body:({value:e,setValue:t})=>i.createElement(S.pd,{autoFocus:!0,className:"border-primary-main bg-black",type:"text",id:"annotation",label:c,labelClassName:"text-white text-[14px] leading-[1.2]",value:e.label,onChange:e=>{e.persist(),t((t=>({...t,label:e.target.value})))},onKeyPress:t=>{"Enter"===t.key&&m({value:e,action:{id:"save"}})}})}})};var y=n(71353);function w(e){const{activeViewportId:t}=e.getState(),{element:n}=(0,y.kJ)(t)||{};return(0,a.getEnabledElement)(n)}const{calibrateImageSpacing:T}=s.utilities;class E extends s.LengthTool{constructor(...e){super(...e),this._renderingViewport=void 0,this._lengthToolRenderAnnotation=this.renderAnnotation,this.renderAnnotation=(e,t)=>{const{viewport:n}=e;return this._renderingViewport=n,this._lengthToolRenderAnnotation(e,t)}}_getTextLines(e,t){const[n,o]=e.handles.points.map((e=>this._renderingViewport.worldToCanvas(e)));return[`${Math.round(100*function(e,t){const n=e[0]-t[0],o=e[1]-t[1];return Math.sqrt(n*n+o*o)}(n,o))/100}px`]}}E.toolName="CalibrationLine";const D=E;function b(e,t){const{uiDialogService:n,viewportGridService:o}=e.services,r=t.detail,{annotation:{metadata:i,data:a}}=r,{referencedImageId:s}=i,l=w(o),{viewport:c}=l,d=Math.round(100*function(e,t){const n=e[0]-t[0],o=e[1]-t[1],r=e[2]-t[2];return Math.sqrt(n*n+o*o+r*r)}(a.handles.points[0],a.handles.points[1]))/100;return new Promise(((e,t)=>{n?f(n,{text:"",label:`${d}`},((n,o)=>{"save"===o?((e=>{const t=e/d;T(s,c.getRenderingEngine(),{type:"User",scale:1/t})})(Number.parseFloat(n)),e(!0)):t("cancel")}),!1,{dialogTitle:"Calibration",inputLabel:"Actual Physical distance (mm)",validateFunc:e=>{try{const t=Number.parseFloat(e);return!isNaN(t)&&0!==t}catch{return!1}}}):t("UIDialogService is not initiated")}))}var O=n(17541);const N=new Map,A={add:(e,t)=>{N.get(e)!==t&&N.set(e,t)},get:(e,t)=>{if(!Array.isArray(t)&&"overlayPlaneModule"===e)return N.get(t)}};a.metaData.addProvider(A.get,1e4);const C=A;class M extends s.AnnotationDisplayTool{constructor(e={},t={supportedInteractionTypes:[],configuration:{fillColor:[255,127,127,255]}}){super(e,t),this.onSetToolDisabled=()=>{},this.renderAnnotation=(e,t)=>{const{viewport:n}=e,o=this.getReferencedImageId(n);if(!o)return;const r=a.metaData.get("overlayPlaneModule",o),i=r?.overlays;return i?.length?(i.forEach((e=>{e.x||=0,e.y||=0})),M.addOverlayPlaneModule(o,r),this._getCachedStat(o,r,this.configuration.fillColor).then((n=>{n.overlays.forEach((n=>{this._renderOverlay(e,t,n)}))})),!0):void 0}}getReferencedImageId(e){if(e instanceof a.VolumeViewport)return;return this.getTargetId(e).split("imageId:")[1]}_renderOverlay(e,t,n){const{viewport:o}=e,r=this.getReferencedImageId(o);if(!r)return;const{_id:i,columns:l,rows:c,x:d,y:m}=n,p=a.utilities.imageToWorldCoords(r,[d-1,m-1]),u=o.worldToCanvas(p),g=a.utilities.imageToWorldCoords(r,[l,c]),h=o.worldToCanvas(g),I=`image-overlay-${i}`,S=t.getSvgNode(I),v={"data-id":I,width:h[0]-u[0],height:h[1]-u[1],x:u[0],y:u[1],href:n.dataUrl};if(isNaN(v.x)||isNaN(v.y)||isNaN(v.width)||isNaN(v.height))return console.warn("Invalid rendering attribute for image overlay",v["data-id"]),!1;if(S)s.drawing.setAttributesIfNecessary(v,S),t.setNodeTouched(I);else{const e=document.createElementNS("http://www.w3.org/2000/svg","image");s.drawing.setNewAttributesIfValid(v,e),t.appendNode(e,I)}return!0}async _getCachedStat(e,t,n){if(0===t.overlays.filter((e=>e.pixelData&&!e.dataUrl)).length)return t;const o=await Promise.all(t.overlays.filter((e=>e.pixelData)).map((async(e,t)=>{let o=null;if(e.pixelData.Value)o=e.pixelData.Value;else if(e.pixelData instanceof Array)o=e.pixelData[0];else if(e.pixelData.retrieveBulkData)o=await e.pixelData.retrieveBulkData();else if(e.pixelData.InlineBinary){const t=(0,O.Vk)(e.pixelData.InlineBinary);o=await t.arrayBuffer()}if(!o)return;const r=this._renderOverlayToDataUrl({width:e.columns,height:e.rows},e.color||n,o);return{...e,_id:(0,O.Os)(),dataUrl:r,color:n}})));return t.overlays=o,t}_isSameColor(e,t){return e&&t&&e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]}_renderOverlayToDataUrl({width:e,height:t},n,o){const r=new DataView(o),i=e*t,a=document.createElement("canvas");a.width=e,a.height=t;const s=a.getContext("2d");s.clearRect(0,0,e,t),s.globalCompositeOperation="copy";const l=s.getImageData(0,0,e,t),c=l.data;for(let e=0,t=0,o=0;e<i;e++)r.getUint8(o)&1<<t&&(c[4*e]=n[0],c[4*e+1]=n[1],c[4*e+2]=n[2],c[4*e+3]=n[3]),t>=7?(t=0,o++):t++;return s.putImageData(l,0,0),a.toDataURL()}}M.toolName="ImageOverlayViewer",M.addOverlayPlaneModule=C.add;const U=M;const R={Pan:s.PanTool.toolName,ArrowAnnotate:s.ArrowAnnotateTool.toolName,WindowLevel:s.WindowLevelTool.toolName,StackScroll:s.StackScrollTool.toolName,StackScrollMouseWheel:s.StackScrollMouseWheelTool.toolName,Zoom:s.ZoomTool.toolName,VolumeRotateMouseWheel:s.VolumeRotateMouseWheelTool.toolName,MipJumpToClick:s.MIPJumpToClickTool.toolName,Length:s.LengthTool.toolName,DragProbe:s.DragProbeTool.toolName,Probe:s.ProbeTool.toolName,RectangleROI:s.RectangleROITool.toolName,RectangleROIThreshold:s.RectangleROIThresholdTool.toolName,EllipticalROI:s.EllipticalROITool.toolName,CircleROI:s.CircleROITool.toolName,Bidirectional:s.BidirectionalTool.toolName,Angle:s.AngleTool.toolName,CobbAngle:s.CobbAngleTool.toolName,Magnify:s.MagnifyTool.toolName,Crosshairs:s.CrosshairsTool.toolName,SegmentationDisplay:s.SegmentationDisplayTool.toolName,Brush:s.BrushTool.toolName,PaintFill:s.PaintFillTool.toolName,ReferenceLines:s.ReferenceLinesTool.toolName,CalibrationLine:D.toolName,TrackballRotateTool:s.TrackballRotateTool.toolName,CircleScissors:s.CircleScissorsTool.toolName,RectangleScissors:s.RectangleScissorsTool.toolName,SphereScissors:s.SphereScissorsTool.toolName,ImageOverlayViewer:U.toolName,AdvancedMagnify:s.AdvancedMagnifyTool.toolName,UltrasoundDirectional:s.UltrasoundDirectionalTool.toolName,SplineROI:s.SplineROITool.toolName,LivewireContour:s.LivewireContourTool.toolName,PlanarFreehandROI:s.PlanarFreehandROITool.toolName,OrientationMarker:s.OrientationMarkerTool.toolName},V=["Length","EllipticalROI","CircleROI","Bidirectional","ArrowAnnotate","Angle","CobbAngle","Probe","RectangleROI","PlanarFreehandROI","SplineROI","LivewireContour","Probe","UltrasoundDirectionalTool"];var P=n(1663);const _={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i,viewportId:a}=e,{metadata:s,data:l,annotationUID:d}=i;if(!s||!l)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:p,FrameOfReferenceUID:u}=s;if(!V.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:h,StudyInstanceUID:I}=(0,P.A)(p,n,a);let S;S=g?t.getDisplaySetForSOPInstanceUID(g,h):t.getDisplaySetsForSeries(h);const{points:v,textBox:f}=l.handles,y=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return[];const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,P.A)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{length:m,unit:p="mm"}=n;a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,unit:p,length:m})})),a}(i,t),w=function(e,t,n){if(!e||!e.length)return"";const o=[],{length:r,SeriesNumber:i,SOPInstanceUID:a,frameNumber:s,unit:l}=e[0],d=t.images.find((e=>e.SOPInstanceUID===a));let m;d&&(m=d.InstanceNumber);const p=m?` I: ${m}`:"",u=t.isMultiFrame?` F: ${s}`:"";if(null==r)return o;const g=c.utils.roundNumber(r,2);return o.push(`${g} ${l} (S: ${i}${p}${u})`),o}(y,S);return{uid:d,SOPInstanceUID:g,FrameOfReferenceUID:u,points:v,textBox:f,metadata:s,referenceSeriesUID:h,referenceStudyUID:I,frameNumber:y[0]?.frameNumber||1,toolName:s.toolName,displaySetInstanceUID:S.displaySetInstanceUID,label:l.label,displayText:w,data:l.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const r=[],i=[];r.push("AnnotationType"),i.push("Cornerstone:Length"),e.forEach((e=>{const{length:t,unit:n}=e;r.push("Length"),i.push(t),r.push("Unit"),i.push(n)})),n&&(r.push("FrameOfReferenceUID"),i.push(n));t&&(r.push("points"),i.push(t.map((e=>e.join(" "))).join(";")));return{columns:r,values:i}}(y,v,u)}}};function x(e){if(e.longAxis&&e.shortAxis){const t={};return t.start=e.longAxis[0],t.end=e.longAxis[1],t.perpendicularStart=e.longAxis[0],t.perpendicularEnd=e.longAxis[1],t}return e.map(((e,t)=>t%10==0?{start:e}:{end:e})).reduce(((e,t)=>Object.assign(e,{...t})),{})}function L(e){return s.annotation.selection.isAnnotationSelected(e)}function G(e,t){L(e)!==t&&s.annotation.selection.setAnnotationSelected(e,t)}function F(e){const[t]=s.annotation.selection.getAnnotationsSelected()||[];if(t)return s.annotation.state.getAnnotation(t)}const k=e=>null==e?"":e;const $={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i,viewportId:a}=e,{metadata:s,data:l,annotationUID:d}=i;if(!s||!l)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:p,FrameOfReferenceUID:u}=s;if(!V.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:h,StudyInstanceUID:I}=(0,P.A)(p,n,a);let S;S=g?t.getDisplaySetForSOPInstanceUID(g,h):t.getDisplaySetsForSeries(h);const{points:v,textBox:f}=l.handles,y=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i,referencedSeriesInstanceUID:a}=n;if(!Object.keys(r).length)return[];const s=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:a,frameNumber:l}=(0,P.A)(i),c=t.getDisplaySetForSOPInstanceUID(o,a,l),{SeriesNumber:d}=c,{length:m,width:p,unit:u}=n;s.push({SeriesInstanceUID:a,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,unit:u,length:m,width:p})})),s}(i,t),w=function(e,t,n){if(!e||!e.length)return"";const o=[],{length:r,width:i,unit:a,SeriesNumber:s,SOPInstanceUID:l,frameNumber:d}=e[0],m=c.utils.roundNumber(r,2),p=c.utils.roundNumber(i,2),u=t.images.find((e=>e.SOPInstanceUID===l));let g;u&&(g=u.InstanceNumber);const h=g?` I: ${g}`:"",I=t.isMultiFrame?` F: ${d}`:"";return o.push(`L: ${m} ${k(a)} (S: ${s}${h}${I})`),o.push(`W: ${p} ${k(a)}`),o}(y,S);return{uid:d,SOPInstanceUID:g,FrameOfReferenceUID:u,points:v,textBox:f,metadata:s,referenceSeriesUID:h,referenceStudyUID:I,frameNumber:y[0]?.frameNumber||1,toolName:s.toolName,displaySetInstanceUID:S.displaySetInstanceUID,label:l.label,displayText:w,data:l.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const r=[],i=[];r.push("AnnotationType"),i.push("Cornerstone:Bidirectional"),e.forEach((e=>{const{length:t,width:n,unit:o}=e;r.push("Length","Width","Unit"),i.push(t,n,o)})),n&&(r.push("FrameOfReferenceUID"),i.push(n));t&&(r.push("points"),i.push(t.map((e=>e.join(" "))).join(";")));return{columns:r,values:i}}(y,v,u)}}},B=(e,t,n)=>{if(Array.isArray(e)&&e.length>0){const o=e.map((e=>c.utils.roundNumber(e,2)));return`${n.charAt(0).toUpperCase()+n.slice(1)}: ${o.join(", ")} <small>${k(t)}</small>`}const o=c.utils.roundNumber(e,2);return`${n.charAt(0).toUpperCase()+n.slice(1)}: ${o} <small>${k(t)}</small>`};const z={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i,viewportId:a}=e,{metadata:s,data:l,annotationUID:d}=i;if(!s||!l)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:p,FrameOfReferenceUID:u}=s;if(!V.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:h,StudyInstanceUID:I}=(0,P.A)(p,n,a);let S;S=g?t.getDisplaySetForSOPInstanceUID(g,h):t.getDisplaySetsForSeries(h);const{points:v,textBox:f}=l.handles,y=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return[];const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,P.A)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{mean:m,stdDev:p,max:u,area:g,Modality:h,areaUnit:I,modalityUnit:S}=n;a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,Modality:h,unit:S,areaUnit:I,mean:m,stdDev:p,max:u,area:g})})),a}(i,t),w=function(e,t,n){if(!e||!e.length)return"";const o=[],{area:r,SOPInstanceUID:i,frameNumber:a,areaUnit:s}=e[0],l=t.images.find((e=>e.SOPInstanceUID===i));let d;l&&(d=l.InstanceNumber);const m=d?` I: ${d}`:"",p=t.isMultiFrame?` F: ${a}`:"",u=c.utils.roundNumber(r,2);return o.push(`${u} ${k(s)}`),e.forEach((e=>{const{unit:t,max:n,SeriesNumber:r}=e,i=`${B(n,t,"max")}(S:${r}${m}${p})`;o.includes(i)||o.push(i)})),o}(y,S);return{uid:d,SOPInstanceUID:g,FrameOfReferenceUID:u,points:v,textBox:f,metadata:s,referenceSeriesUID:h,referenceStudyUID:I,frameNumber:y[0]?.frameNumber||1,toolName:s.toolName,displaySetInstanceUID:S.displaySetInstanceUID,label:l.label,displayText:w,data:l.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const r=[],i=[];r.push("AnnotationType"),i.push("Cornerstone:EllipticalROI"),e.forEach((e=>{const{mean:t,stdDev:n,max:o,area:a,unit:s,areaUnit:l}=e;t&&s&&o&&a&&(r.push(`max (${s})`,`mean (${s})`,`std (${s})`,"Area","Unit"),i.push(o,t,n,a,l))})),n&&(r.push("FrameOfReferenceUID"),i.push(n));t&&(r.push("points"),i.push(t.map((e=>e.join(" "))).join(";")));return{columns:r,values:i}}(y,v,u)}}},j={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i,viewportId:a}=e,{metadata:s,data:l,annotationUID:d}=i;if(!s||!l)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:p,FrameOfReferenceUID:u}=s;if(!V.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:h,StudyInstanceUID:I}=(0,P.A)(p,n,a);let S;S=g?t.getDisplaySetForSOPInstanceUID(g,h):t.getDisplaySetsForSeries(h);const{points:v,textBox:f}=l.handles,y=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return[];const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,P.A)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{mean:m,stdDev:p,max:u,area:g,Modality:h,areaUnit:I,modalityUnit:S}=n;a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,Modality:h,unit:S,mean:m,stdDev:p,max:u,area:g,areaUnit:I})})),a}(i,t),w=function(e,t,n){if(!e||!e.length)return"";const o=[],{area:r,SOPInstanceUID:i,frameNumber:a,areaUnit:s}=e[0],l=t.images.find((e=>e.SOPInstanceUID===i));let d;l&&(d=l.InstanceNumber);const m=d?` I: ${d}`:"",p=t.isMultiFrame?` F: ${a}`:"",u=c.utils.roundNumber(r||0,2);return o.push(`${u} ${k(s)}`),e.forEach((e=>{const{unit:t,max:n,SeriesNumber:r}=e,i=`${B(n,t,"max")}(S:${r}${m}${p})`;o.includes(i)||o.push(i)})),o}(y,S);return{uid:d,SOPInstanceUID:g,FrameOfReferenceUID:u,points:v,textBox:f,metadata:s,referenceSeriesUID:h,referenceStudyUID:I,frameNumber:y[0]?.frameNumber||1,toolName:s.toolName,displaySetInstanceUID:S.displaySetInstanceUID,label:l.label,displayText:w,data:l.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const r=[],i=[];r.push("AnnotationType"),i.push("Cornerstone:CircleROI"),e.forEach((e=>{const{mean:t,stdDev:n,max:o,area:a,unit:s,areaUnit:l}=e;t&&s&&o&&a&&(r.push(`max (${s})`,`mean (${s})`,`std (${s})`,"Area","Unit"),i.push(o,t,n,a,l))})),n&&(r.push("FrameOfReferenceUID"),i.push(n));t&&(r.push("points"),i.push(t.map((e=>e.join(" "))).join(";")));return{columns:r,values:i}}(y,v,u)}}};const W=j;const q={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i,viewportId:a}=e,{metadata:s,data:l,annotationUID:c}=i;if(!s||!l)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:d,referencedImageId:m,FrameOfReferenceUID:p}=s;if(!V.includes(d))throw new Error("Tool not supported");const{SOPInstanceUID:u,SeriesInstanceUID:g,StudyInstanceUID:h}=(0,P.A)(m,n,a);let I;I=u?t.getDisplaySetForSOPInstanceUID(u,g):t.getDisplaySetsForSeries(g);const{points:S,textBox:v}=l.handles,f=function(e,t){const{metadata:n,data:o}=e,{text:r}=o,{referencedImageId:i}=n,a=[],{SOPInstanceUID:s,SeriesInstanceUID:l,frameNumber:c}=(0,P.A)(i),d=t.getDisplaySetForSOPInstanceUID(s,l,c),{SeriesNumber:m}=d;return a.push({SeriesInstanceUID:l,SOPInstanceUID:s,SeriesNumber:m,frameNumber:c,text:r}),a}(i,t),y=function(e,t,n){if(!e)return"";const o=[],{SeriesNumber:r,SOPInstanceUID:i,frameNumber:a}=e[0],s=t.images.find((e=>e.SOPInstanceUID===i));let l;s&&(l=s.InstanceNumber);const c=l?` I: ${l}`:"",d=t.isMultiFrame?` F: ${a}`:"";return o.push(`(S: ${r}${c}${d})`),o}(f,I);return{uid:c,SOPInstanceUID:u,FrameOfReferenceUID:p,points:S,textBox:v,metadata:s,referenceSeriesUID:g,referenceStudyUID:h,frameNumber:f[0]?.frameNumber||1,toolName:s.toolName,displaySetInstanceUID:I.displaySetInstanceUID,label:l.text,displayText:y,data:l.cachedStats,type:o(d),getReport:()=>{throw new Error("Not implemented")}}}},H={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i,viewportId:a}=e,{metadata:s,data:l,annotationUID:d}=i;if(!s||!l)return console.warn("Cobb Angle tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:p,FrameOfReferenceUID:u}=s;if(!V.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:h,StudyInstanceUID:I}=(0,P.A)(p,n,a);let S;S=g?t.getDisplaySetForSOPInstanceUID(g,h):t.getDisplaySetsForSeries(h);const{points:v,textBox:f}=l.handles,y=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return;const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,P.A)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{angle:m}=n,p="°";a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,unit:p,angle:m})})),a}(i,t),w=function(e,t,n){if(!e||!e.length)return"";const o=[],{angle:r,unit:i,SeriesNumber:a,SOPInstanceUID:s,frameNumber:l}=e[0],d=t.images.find((e=>e.SOPInstanceUID===s));let m;d&&(m=d.InstanceNumber);const p=m?` I: ${m}`:"",u=t.isMultiFrame?` F: ${l}`:"";if(void 0===r)return o;const g=c.utils.roundNumber(r,2);return o.push(`${g} ${k(i)} (S: ${a}${p}${u})`),o}(y,S);return{uid:d,SOPInstanceUID:g,FrameOfReferenceUID:u,points:v,textBox:f,metadata:s,referenceSeriesUID:h,referenceStudyUID:I,frameNumber:y?.[0]?.frameNumber||1,toolName:s.toolName,displaySetInstanceUID:S.displaySetInstanceUID,label:l.label,displayText:w,data:l.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const r=[],i=[];r.push("AnnotationType"),i.push("Cornerstone:CobbAngle"),e.forEach((e=>{const{angle:t,unit:n}=e;r.push(`Angle (${n})`),i.push(t)})),n&&(r.push("FrameOfReferenceUID"),i.push(n));t&&(r.push("points"),i.push(t.map((e=>e.join(" "))).join(";")));return{columns:r,values:i}}(y,v,u)}}};const Y=H,Z={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i,viewportId:a}=e,{metadata:s,data:l,annotationUID:d}=i;if(!s||!l)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:p,FrameOfReferenceUID:u}=s;if(!V.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:h,StudyInstanceUID:I}=(0,P.A)(p,n,a);let S;S=g?t.getDisplaySetForSOPInstanceUID(g,h):t.getDisplaySetsForSeries(h);const{points:v,textBox:f}=l.handles,y=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return;const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,P.A)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{angle:m}=n,p="°";a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,unit:p,angle:m})})),a}(i,t),w=function(e,t,n){if(!e||!e.length)return"";const o=[],{angle:r,unit:i,SeriesNumber:a,SOPInstanceUID:s,frameNumber:l}=e[0],d=t.images.find((e=>e.SOPInstanceUID===s));let m;d&&(m=d.InstanceNumber);const p=m?` I: ${m}`:"",u=t.isMultiFrame?` F: ${l}`:"";if(void 0===r)return o;const g=c.utils.roundNumber(r,2);return o.push(`${g} ${k(i)} (S: ${a}${p}${u})`),o}(y,S);return{uid:d,SOPInstanceUID:g,FrameOfReferenceUID:u,points:v,textBox:f,metadata:s,referenceSeriesUID:h,referenceStudyUID:I,frameNumber:y?.[0]?.frameNumber||1,toolName:s.toolName,displaySetInstanceUID:S.displaySetInstanceUID,label:l.label,displayText:w,data:l.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const r=[],i=[];r.push("AnnotationType"),i.push("Cornerstone:Angle"),e.forEach((e=>{const{angle:t,unit:n}=e;r.push(`Angle (${n})`),i.push(t)})),n&&(r.push("FrameOfReferenceUID"),i.push(n));t&&(r.push("points"),i.push(t.map((e=>e.join(" "))).join(";")));return{columns:r,values:i}}(y,v,u)}}};const K=Z;function Q(e,t,n){const{PlanarFreehandROI:o}=n.get("cornerstone.measurements"),{displayText:r}=o,{metadata:i,data:a}=e;if(!a.cachedStats||!a.cachedStats[`imageId:${i.referencedImageId}`])return[];const{SOPInstanceUID:s,frameNumber:l}=(0,P.A)(i.referencedImageId),d=[],m=t.images.find((e=>e.SOPInstanceUID===s));let p;m&&(p=m.InstanceNumber);const u=p?` I: ${p}`:"",g=t.isMultiFrame?` F: ${l}`:"",{SeriesNumber:h}=t;h&&d.push(`S: ${h}${u}${g}`);const I=a.cachedStats[`imageId:${i.referencedImageId}`],S=e=>Array.isArray(e)?e.map((e=>isNaN(e)?e:c.utils.roundNumber(e))):isNaN(e)?e:c.utils.roundNumber(e);return r.forEach((({displayName:e,value:t,type:n})=>{if("value"===n){const n=I[t],o=I[((e,t)=>e.find((({type:e,for:n})=>"unit"===e&&n.includes(t)))?.value)(r,t)]||"";d.push(((e,t,n)=>`${e}: ${Array.isArray(t)?S(t).join(", "):S(t)} ${n}`)(e,n,o))}})),d}const J={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i}=e,{metadata:a,data:s,annotationUID:l}=i;if(!a||!s)return console.warn("PlanarFreehandROI tool: Missing metadata or data"),null;const{toolName:c,referencedImageId:d,FrameOfReferenceUID:m}=a;if(!V.includes(c))throw new Error(`Tool ${c} not supported`);const{SOPInstanceUID:p,SeriesInstanceUID:u,frameNumber:g,StudyInstanceUID:h}=(0,P.A)(d);let I;return I=p?t.getDisplaySetForSOPInstanceUID(p,u):t.getDisplaySetsForSeries(u),{uid:l,SOPInstanceUID:p,FrameOfReferenceUID:m,points:s.contour.polyline,textBox:s.handles.textBox,metadata:a,frameNumber:g,referenceSeriesUID:u,referenceStudyUID:h,toolName:a.toolName,displaySetInstanceUID:I.displaySetInstanceUID,label:s.label,displayText:Q(i,I,r),data:s.cachedStats,type:o(c),getReport:()=>function(e,t){const{PlanarFreehandROI:n}=t.get("cornerstone.measurements"),{report:o}=n,r=[],i=[];r.push("AnnotationType"),i.push("Cornerstone:PlanarFreehandROI");const{metadata:a,data:s}=e,l=s.cachedStats[`imageId:${a.referencedImageId}`];o.forEach((({name:e,value:t})=>{r.push(e),l[t]?i.push(l[t]):i.push("not available")})),a.FrameOfReferenceUID&&(r.push("FrameOfReferenceUID"),i.push(a.FrameOfReferenceUID));s.contour.polyline&&(r.push("points"),i.push(s.contour.polyline.map((e=>e.join(" "))).join(";")));return{columns:r,values:i}}(i,r)}}},X={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i,viewportId:a}=e,{metadata:s,data:l,annotationUID:d}=i;if(!s||!l)return console.warn("Rectangle ROI tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:p,FrameOfReferenceUID:u}=s;if(!V.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:h,StudyInstanceUID:I}=(0,P.A)(p,n,a);let S;S=g?t.getDisplaySetForSOPInstanceUID(g,h):t.getDisplaySetsForSeries(h);const{points:v,textBox:f}=l.handles,y=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return[];const a=[];return Object.keys(r).forEach((e=>{const o=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:s,SeriesInstanceUID:l,frameNumber:c}=(0,P.A)(i),d=t.getDisplaySetForSOPInstanceUID(s,l,c),{SeriesNumber:m}=d,{mean:p,stdDev:u,max:g,area:h,Modality:I,modalityUnit:S,areaUnit:v}=o;a.push({SeriesInstanceUID:l,SOPInstanceUID:s,SeriesNumber:m,frameNumber:c,Modality:I,unit:S,mean:p,stdDev:u,metadata:n,max:g,area:h,areaUnit:v})})),a}(i,t),w=function(e,t,n){if(!e||!e.length)return"";const o=[],{area:r,SOPInstanceUID:i,frameNumber:a,areaUnit:s}=e[0],l=t.images.find((e=>e.SOPInstanceUID===i));let d;l&&(d=l.InstanceNumber);const m=d?` I: ${d}`:"",p=t.isMultiFrame?` F: ${a}`:"",u=c.utils.roundNumber(r||0,2);return o.push(`${u} ${k(s)}`),e.forEach((e=>{const{unit:t,max:n,SeriesNumber:r}=e,i=`${B(n,t,"max")}(S:${r}${m}${p})`;o.includes(i)||o.push(i)})),o}(y,S);return{uid:d,SOPInstanceUID:g,FrameOfReferenceUID:u,points:v,textBox:f,metadata:s,referenceSeriesUID:h,referenceStudyUID:I,frameNumber:y[0]?.frameNumber||1,toolName:s.toolName,displaySetInstanceUID:S.displaySetInstanceUID,label:l.label,displayText:w,data:l.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const r=[],i=[];r.push("AnnotationType"),i.push("Cornerstone:RectangleROI"),e.forEach((e=>{const{mean:t,stdDev:n,max:o,area:a,unit:s,areaUnit:l}=e;t&&s&&o&&a&&(r.push("Maximum","Mean","Std Dev","Pixel Unit","Area","Unit"),i.push(o,t,n,s,a,l))})),n&&(r.push("FrameOfReferenceUID"),i.push(n));t&&(r.push("points"),i.push(t.map((e=>e.join(" "))).join(";")));return{columns:r,values:i}}(y,v,u)}}};const ee=X;function te(e,t,n){const{SplineROI:o}=n.get("cornerstone.measurements"),{displayText:r}=o,{metadata:i,data:a}=e;if(!a.cachedStats||!a.cachedStats[`imageId:${i.referencedImageId}`])return[];const{SOPInstanceUID:s,frameNumber:l}=(0,P.A)(i.referencedImageId),d=[],m=t.images.find((e=>e.SOPInstanceUID===s));let p;m&&(p=m.InstanceNumber);const u=p?` I: ${p}`:"",g=t.isMultiFrame?` F: ${l}`:"",{SeriesNumber:h}=t;h&&d.push(`S: ${h}${u}${g}`);const I=a.cachedStats[`imageId:${i.referencedImageId}`],S=e=>Array.isArray(e)?e.map((e=>isNaN(e)?e:c.utils.roundNumber(e))):isNaN(e)?e:c.utils.roundNumber(e);return r.forEach((({displayName:e,value:t,type:n})=>{if("value"===n){const n=I[t],o=I[((e,t)=>e.find((({type:e,for:n})=>"unit"===e&&n.includes(t)))?.value)(r,t)]||"";d.push(((e,t,n)=>`${e}: ${Array.isArray(t)?S(t).join(", "):S(t)} ${n}`)(e,n,o))}})),d}const ne={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i}=e,{metadata:a,data:s,annotationUID:l}=i;if(!a||!s)return console.warn("SplineROI tool: Missing metadata or data"),null;const{toolName:c,referencedImageId:d,FrameOfReferenceUID:m}=a;if(!V.includes(c))throw new Error(`Tool ${c} not supported`);const{SOPInstanceUID:p,SeriesInstanceUID:u,frameNumber:g,StudyInstanceUID:h}=(0,P.A)(d);let I;return I=p?t.getDisplaySetForSOPInstanceUID(p,u):t.getDisplaySetsForSeries(u),{uid:l,SOPInstanceUID:p,FrameOfReferenceUID:m,points:s.contour.polyline,textBox:s.handles.textBox,metadata:a,frameNumber:g,referenceSeriesUID:u,referenceStudyUID:h,toolName:a.toolName,displaySetInstanceUID:I.displaySetInstanceUID,label:s.label,displayText:te(i,I,r),data:s.cachedStats,type:o(c),getReport:()=>function(e,t){const{SplineROI:n}=t.get("cornerstone.measurements"),{report:o}=n,r=[],i=[];r.push("AnnotationType"),i.push("Cornerstone:SplineROI");const{metadata:a,data:s}=e,l=s.cachedStats[`imageId:${a.referencedImageId}`];o.forEach((({name:e,value:t})=>{r.push(e),l[t]?i.push(l[t]):i.push("not available")})),a.FrameOfReferenceUID&&(r.push("FrameOfReferenceUID"),i.push(a.FrameOfReferenceUID));s.contour.polyline&&(r.push("points"),i.push(s.contour.polyline.map((e=>e.join(" "))).join(";")));return{columns:r,values:i}}(i,r)}}};function oe(e,t,n){const{metadata:o,data:r}=e;if(!r.cachedStats||!r.cachedStats[`imageId:${o.referencedImageId}`])return[];const{area:i,areaUnit:a}=r.cachedStats[`imageId:${o.referencedImageId}`],{SOPInstanceUID:s,frameNumber:l}=(0,P.A)(o.referencedImageId),d=[],m=t.images.find((e=>e.SOPInstanceUID===s));let p;m&&(p=m.InstanceNumber);const u=p?` I: ${p}`:"",g=t.isMultiFrame?` F: ${l}`:"",{SeriesNumber:h}=t;if(h&&d.push(`S: ${h}${u}${g}`),i){const e=c.utils.roundNumber(i||0,2);d.push(`${e} ${k(a)}`)}return d}const re={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i}=e,{metadata:a,data:s,annotationUID:l}=i;if(!a||!s)return console.warn("Livewire tool: Missing metadata or data"),null;const{toolName:c,referencedImageId:d,FrameOfReferenceUID:m}=a;if(!V.includes(c))throw new Error(`Tool ${c} not supported`);const{SOPInstanceUID:p,SeriesInstanceUID:u,frameNumber:g,StudyInstanceUID:h}=(0,P.A)(d);let I;return I=p?t.getDisplaySetForSOPInstanceUID(p,u):t.getDisplaySetsForSeries(u),{uid:l,SOPInstanceUID:p,FrameOfReferenceUID:m,points:s.contour.polyline,textBox:s.handles.textBox,metadata:a,frameNumber:g,referenceSeriesUID:u,referenceStudyUID:h,toolName:a.toolName,displaySetInstanceUID:I.displaySetInstanceUID,label:s.label,displayText:oe(i,I,r),data:s.cachedStats,type:o(c),getReport:()=>function(e,t){const n=[],o=[];n.push("AnnotationType"),o.push("Cornerstone:Livewire");const{metadata:r,data:i}=e;r.FrameOfReferenceUID&&(n.push("FrameOfReferenceUID"),o.push(r.FrameOfReferenceUID));i.contour.polyline&&(n.push("points"),o.push(i.contour.polyline.map((e=>e.join(" "))).join(";")));return{columns:n,values:o}}(i)}}};const ie={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i,viewportId:a}=e,{metadata:s,data:l,annotationUID:d}=i;if(!s||!l)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:p,FrameOfReferenceUID:u}=s;if(!V.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:h,StudyInstanceUID:I}=(0,P.A)(p);let S;S=g?t.getDisplaySetForSOPInstanceUID(g,h):t.getDisplaySetsForSeries(h);const{points:v}=l.handles,f=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return;const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,P.A)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{value:m}=n,p="HU";a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,unit:p,value:m})})),a}(i,t),y=function(e,t,n){if(!e||!e.length)return"";const o=[],{value:r,unit:i,SeriesNumber:a,SOPInstanceUID:s,frameNumber:l}=e[0],d=t.images.find((e=>e.SOPInstanceUID===s));let m;d&&(m=d.InstanceNumber);const p=m?` I: ${m}`:"",u=t.isMultiFrame?` F: ${l}`:"";if(void 0===r)return o;const g=c.utils.roundNumber(r,2);return o.push(`${g} ${k(i)} (S: ${a}${p}${u})`),o}(f,S);return{uid:d,SOPInstanceUID:g,FrameOfReferenceUID:u,points:v,metadata:s,referenceSeriesUID:h,referenceStudyUID:I,frameNumber:f?.[0]?.frameNumber||1,toolName:s.toolName,displaySetInstanceUID:S.displaySetInstanceUID,label:l.label,displayText:y,data:l.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const r=[],i=[];r.push("AnnotationType"),i.push("Cornerstone:Probe"),e.forEach((e=>{const{value:t,unit:n}=e;r.push(`Probe (${n})`),i.push(t)})),n&&(r.push("FrameOfReferenceUID"),i.push(n));t&&(r.push("points"),i.push(t.map((e=>e.join(" "))).join(";")));return{columns:r,values:i}}(f,v,u)}}};const ae={toAnnotation:e=>{},toMeasurement:(e,t,n,o,r)=>{const{annotation:i,viewportId:a}=e,{metadata:s,data:l,annotationUID:d}=i;if(!s||!l)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:p,FrameOfReferenceUID:u}=s;if(!V.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:h,StudyInstanceUID:I}=(0,P.A)(p);let S;S=g?t.getDisplaySetForSOPInstanceUID(g,h):t.getDisplaySetsForSeries(h);const{points:v}=l.handles,f=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return;const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,P.A)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{xValues:m,yValues:p,units:u,isUnitless:g,isHorizontal:h}=n;a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,xValues:m,yValues:p,units:u,isUnitless:g,isHorizontal:h})})),a}(i,t),y=function(e,t,n){if(!e||!e.length)return"";const o=[],{xValues:r,yValues:i,units:a,isUnitless:s,SeriesNumber:l,SOPInstanceUID:d,frameNumber:m}=e[0],p=t.images.find((e=>e.SOPInstanceUID===d));let u;p&&(u=p.InstanceNumber);const g=u?` I: ${u}`:"",h=t.isMultiFrame?` F: ${m}`:"",I=`(S: ${l}${g}${h})`;if(void 0===r||void 0===i)return o;if(s)o.push(`${c.utils.roundNumber(r[0],2)} ${a[0]} ${I}`);else{const e=Math.abs(r[1]-r[0]),t=Math.abs(i[1]-i[0]);o.push(`${c.utils.roundNumber(e)} ${a[0]} ${I}`),o.push(`${c.utils.roundNumber(t)} ${a[1]} ${I}`)}return o}(f,S);return{uid:d,SOPInstanceUID:g,FrameOfReferenceUID:u,points:v,metadata:s,referenceSeriesUID:h,referenceStudyUID:I,frameNumber:f?.[0]?.frameNumber||1,toolName:s.toolName,displaySetInstanceUID:S.displaySetInstanceUID,label:l.label,displayText:y,data:l.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const r=[],i=[];r.push("AnnotationType"),i.push("Cornerstone:UltrasoundDirectional"),e.forEach((e=>{const{xValues:t,yValues:n,units:o,isUnitless:a}=e;if(a)r.push("Length"+o[0]),i.push(c.utils.roundNumber(t[0],2));else{const e=Math.abs(t[1]-t[0]),a=Math.abs(n[1]-n[0]);r.push("Time"+o[0]),i.push(c.utils.roundNumber(e,2)),r.push("Length"+o[1]),i.push(c.utils.roundNumber(a,2))}})),n&&(r.push("FrameOfReferenceUID"),i.push(n));t&&(r.push("points"),i.push(t.map((e=>e.join(" "))).join(";")));return{columns:r,values:i}}(f,v,u)}}},se=(e,t,n,o)=>{const r=e=>{const{POLYLINE:t,ELLIPSE:n,CIRCLE:o,RECTANGLE:r,BIDIRECTIONAL:i,POINT:a,ANGLE:s}=c.MeasurementService.VALUE_TYPES;return{Length:t,EllipticalROI:n,CircleROI:o,RectangleROI:r,PlanarFreehandROI:t,Bidirectional:i,ArrowAnnotate:a,CobbAngle:s,Angle:s,SplineROI:t,LivewireContour:t,Probe:a,UltrasoundDirectional:t}[e]};return{Length:{toAnnotation:_.toAnnotation,toMeasurement:e=>_.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.POLYLINE,points:2}]},Bidirectional:{toAnnotation:$.toAnnotation,toMeasurement:e=>$.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.POLYLINE,points:2},{valueType:c.MeasurementService.VALUE_TYPES.POLYLINE,points:2}]},EllipticalROI:{toAnnotation:z.toAnnotation,toMeasurement:e=>z.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.ELLIPSE}]},CircleROI:{toAnnotation:W.toAnnotation,toMeasurement:e=>W.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.CIRCLE}]},RectangleROI:{toAnnotation:ee.toAnnotation,toMeasurement:e=>ee.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.POLYLINE}]},PlanarFreehandROI:{toAnnotation:J.toAnnotation,toMeasurement:e=>J.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.POLYLINE}]},SplineROI:{toAnnotation:ne.toAnnotation,toMeasurement:e=>ne.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.POLYLINE}]},LivewireContour:{toAnnotation:re.toAnnotation,toMeasurement:e=>re.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.POLYLINE}]},ArrowAnnotate:{toAnnotation:q.toAnnotation,toMeasurement:e=>q.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.POINT,points:1}]},Probe:{toAnnotation:ie.toAnnotation,toMeasurement:e=>ie.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.POINT,points:1}]},CobbAngle:{toAnnotation:Y.toAnnotation,toMeasurement:e=>Y.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.ANGLE}]},Angle:{toAnnotation:K.toAnnotation,toMeasurement:e=>K.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.ANGLE}]},UltrasoundDirectional:{toAnnotation:ae.toAnnotation,toMeasurement:e=>ae.toMeasurement(e,t,n,r,o),matchingCriteria:[{valueType:c.MeasurementService.VALUE_TYPES.POLYLINE,points:2}]}}},{removeAnnotation:le}=s.annotation.state,ce=s.Enums.Events,de="Cornerstone3DTools",me=e=>{const{measurementService:t,displaySetService:n,cornerstoneViewportService:o,customizationService:r}=e.services,i=((e,t,n,o)=>{const{Length:r,Bidirectional:i,EllipticalROI:a,CircleROI:s,ArrowAnnotate:l,Angle:c,CobbAngle:d,RectangleROI:m,PlanarFreehandROI:p,SplineROI:u,LivewireContour:g,Probe:h,UltrasoundDirectional:I}=se(e,t,n,o),S=e.createSource(de,"0.1");return e.addMapping(S,"Length",r.matchingCriteria,r.toAnnotation,r.toMeasurement),e.addMapping(S,"Crosshairs",r.matchingCriteria,(()=>(console.warn("Crosshairs mapping not implemented."),{})),(()=>(console.warn("Crosshairs mapping not implemented."),{}))),e.addMapping(S,"Bidirectional",i.matchingCriteria,i.toAnnotation,i.toMeasurement),e.addMapping(S,"EllipticalROI",a.matchingCriteria,a.toAnnotation,a.toMeasurement),e.addMapping(S,"CircleROI",s.matchingCriteria,s.toAnnotation,s.toMeasurement),e.addMapping(S,"ArrowAnnotate",l.matchingCriteria,l.toAnnotation,l.toMeasurement),e.addMapping(S,"CobbAngle",d.matchingCriteria,d.toAnnotation,d.toMeasurement),e.addMapping(S,"Angle",c.matchingCriteria,c.toAnnotation,c.toMeasurement),e.addMapping(S,"RectangleROI",m.matchingCriteria,m.toAnnotation,m.toMeasurement),e.addMapping(S,"PlanarFreehandROI",p.matchingCriteria,p.toAnnotation,p.toMeasurement),e.addMapping(S,"SplineROI",u.matchingCriteria,u.toAnnotation,u.toMeasurement),e.addMapping(S,"CalibrationLine",r.matchingCriteria,r.toAnnotation,r.toMeasurement),e.addMapping(S,"LivewireContour",g.matchingCriteria,g.toAnnotation,g.toMeasurement),e.addMapping(S,"Probe",h.matchingCriteria,h.toAnnotation,h.toMeasurement),e.addMapping(S,"UltrasoundDirectionalTool",I.matchingCriteria,I.toAnnotation,I.toMeasurement),S})(t,n,o,r);pe(t,o,i);const{annotationToMeasurement:s,remove:l}=i;function c(t){try{const n=t.detail,{annotation:{metadata:r,annotationUID:i}}=n,{toolName:a}=r;t.type===p&&a===R.CalibrationLine?b(e,t).then((()=>{console.log("calibration applied")}),(()=>!0)).finally((()=>{le(i),d(t),o.resize()})):(n.uid=i,s(a,n))}catch(e){console.warn("Failed to update measurement:",e)}}function d(e){try{try{const n=e.detail,{annotation:{annotationUID:o}}=n;t.getMeasurement(o)&&(console.log("~~ removeEvt",e),l(o,n))}catch(e){console.warn("Failed to update measurement:",e)}}catch(e){console.warn("Failed to remove measurement:",e)}}const m=ce.ANNOTATION_ADDED,p=ce.ANNOTATION_COMPLETED,u=ce.ANNOTATION_MODIFIED,g=ce.ANNOTATION_REMOVED,h=ce.ANNOTATION_SELECTION_CHANGE;return a.eventTarget.addEventListener(m,c),a.eventTarget.addEventListener(p,c),a.eventTarget.addEventListener(u,(function(e){try{const n=e.detail,{annotation:{metadata:o,annotationUID:r}}=n;if(!t.getMeasurement(r))return;const{toolName:i}=o;n.uid=r,s(i,n,!0)}catch(e){console.warn("Failed to update measurement:",e)}})),a.eventTarget.addEventListener(g,d),a.eventTarget.addEventListener(h,(function(e){try{const n=e.detail,{added:o,removed:r}=n;r&&r.forEach((e=>t.setMeasurementSelected(e,!1))),o&&o.forEach((e=>t.setMeasurementSelected(e,!0)))}catch(e){console.warn("Failed to select and unselect measurements:",e)}})),i},pe=(e,t,n)=>{const{MEASUREMENT_REMOVED:o,MEASUREMENTS_CLEARED:r,MEASUREMENT_UPDATED:i,RAW_MEASUREMENT_ADDED:a}=e.EVENTS;e.getSource(de,"0.1");e.subscribe(r,(({measurements:e})=>{if(Object.keys(e).length)for(const t of Object.values(e)){const{uid:e,source:n}=t;n.name===de&&le(e)}})),e.subscribe(i,(({source:e,measurement:t,notYetUpdatedAtSource:n})=>{if(e.name!==de)return;if(!1===n)return;const{uid:o,label:r}=t,i=s.annotation.state.getAnnotation(o),{data:a,metadata:l}=i;a&&(a.label!==r&&(a.label=r),"ArrowAnnotate"===l.toolName&&(a.text=r))})),e.subscribe(a,(({source:e,measurement:t,data:n,dataSource:o})=>{if(e.name!==de)return;const{referenceSeriesUID:r,referenceStudyUID:i,SOPInstanceUID:a}=t,l=c.DicomMetadataStore.getInstance(i,r,a);let d,m=1;t?.metadata?.referencedImageId?(d=t.metadata.referencedImageId,m=(0,P.A)(t.metadata.referencedImageId).frameNumber):d=o.getImageIdsForInstance({instance:l});s.annotation.state.getAnnotationManager().addAnnotation({annotationUID:t.uid,highlighted:!1,isLocked:!1,invalidated:!1,metadata:{toolName:t.toolName,FrameOfReferenceUID:t.FrameOfReferenceUID,referencedImageId:d},data:{...n.annotation.data||{},text:n.annotation.data.text,handles:{...n.annotation.data.handles},cachedStats:{...n.annotation.data.cachedStats},label:n.annotation.data.label,frameNumber:m}})})),e.subscribe(o,(({source:e,measurement:n})=>{if(e?.name&&e.name!==de)return;le(n);t.getRenderingEngine().render()}))};function ue(e){const t=function(e){return e?e.getActors().map((e=>a.cache.getVolume(e.uid))):[]}(e);return t.find((e=>e.isDynamicVolume()))??t[0]}const ge=function(e){const{cineService:t}=e.services;t.setServiceImplementation({getSyncedViewports:t=>function(e,t){const{viewportGridService:n,cornerstoneViewportService:o}=e.services,{viewports:r}=n.getState(),i=r.get(t);if("volume"!==i?.viewportOptions?.viewportType)return[];const a=o.getCornerstoneViewport(t),s=a?ue(a):null;if(!s?.isDynamicVolume())return[];const{volumeId:l}=s;return Array.from(r.values()).filter((({viewportId:e})=>{const n=o.getCornerstoneViewport(e);return e!==t&&n?.hasVolumeId(l)})).map((({viewportId:e})=>({viewportId:e})))}(e,t),playClip:(e,t)=>s.utilities.cine.playClip(e,t),stopClip:(e,t)=>s.utilities.cine.stopClip(e,t)})};var he=n(5517);const Ie=new Map,Se=new Map;function ve({data:{viewportId:e,volumeInputArray:t},displaySetsMatchDetails:n,viewportMatchDetails:o}){Se.set(e,t);for(const e of t){const{volumeId:t}=e,n=a.cache.getVolume(t);if(!n)return;if(!Ie.has(t)){const{metadata:e}=n;Ie.set(t,e.SeriesInstanceUID)}}const r=new Set;Se.forEach(((e,t)=>{e.forEach((e=>{const{volumeId:t}=e;r.add(t)}))}));const i=new Set;if(o.forEach((e=>{const{displaySetsInfo:t}=e;t.forEach((({displaySetInstanceUID:e})=>{i.add(e)}))})),r.size!==i.size)return;const s=Array.from(Ie.keys()).slice().map((e=>a.cache.getVolume(e))),l=[];s.forEach((e=>{const t=e.getImageLoadRequests();if(!t.length||!t[0]||!t[0].imageId)return;const n=function(e){const t=e.length-1,n=Math.floor(e.length/2);let o=n,r=n;const i=[{imageId:e[n],imageIdIndex:n}],a={currentPositionDownToMinimum:!1,currentPositionUpToMaximum:!1};for(0===n?a.currentPositionDownToMinimum=!0:n===t&&(a.currentPositionUpToMaximum=!0);!a.currentPositionDownToMinimum||!a.currentPositionUpToMaximum;)a.currentPositionDownToMinimum||(o--,i.push({imageId:e[o],imageIdIndex:o}),0===o&&(a.currentPositionDownToMinimum=!0)),a.currentPositionUpToMaximum||(r++,i.push({imageId:e[r],imageIdIndex:r}),r===t&&(a.currentPositionUpToMaximum=!0));return i}(t.map((e=>e.imageId))).map((({imageId:e})=>t.find((t=>t.imageId===e))));l.push(n)}));const c=(0,he.compact)((0,he.flatten)((0,he.zip)(...l))),d=[];c.forEach((e=>{const{imageId:t}=e;l.forEach((e=>{const n=e.find((e=>e.imageId===t));n&&d.push(n)}))}));const m=a.Enums.RequestType.Prefetch;d.forEach((({callLoadImage:e,additionalDetails:t,imageId:n,imageIdIndex:o,options:r})=>{const i=e.bind(null,n,o,r);a.imageLoadPoolManager.addRequest(i,m,t,0)})),Ie.clear();const p=new Map(Se);return Se.clear(),p}const fe=new Map,ye=new Map;function we({data:{viewportId:e,volumeInputArray:t},displaySetsMatchDetails:n}){ye.set(e,t);for(const e of t){const{volumeId:t}=e,n=a.cache.getVolume(t);if(!n)return void console.log("interleaveNthLoader::No volume, can't load it");if(!fe.has(t)){const{metadata:e}=n;fe.set(t,e.SeriesInstanceUID)}}const o=function(e){if(!e||!e.length)return[];if(1===e.length)return e[0];console.time("interleave");const t=[...e],n=[];for(let e=0;t.length>0;e++)for(const o of t)e>=o.length?t.splice(t.indexOf(o),1):n.push(o[e]);return console.timeEnd("interleave"),n}(Array.from(fe.keys()).slice().map((e=>a.cache.getVolume(e))).map((e=>e.getImageLoadRequests())).filter((e=>e?.[0]?.imageId)).map((e=>function(e){const t=[[],[],[],[],[]],n=e.length/2-3,o=n+6;for(let r=0;r<e.length;r++)r<2||r>e.length-4||r>n&&r<o?t[0].push(e[r]):r%7==2?t[1].push(e[r]):r%7==5?t[2].push(e[r]):t[r%2+3].push(e[r]);return[...t[0],...t[1],...t[2],...t[3],...t[4]]}(e)))),r=a.Enums.RequestType.Prefetch;o.forEach((({callLoadImage:e,additionalDetails:t,imageId:n,imageIdIndex:o,options:i})=>{const s=e.bind(null,n,o,i);a.imageLoadPoolManager.addRequest(s,r,t,0)})),fe.clear();const i=new Map(ye);return ye.clear(),i}const Te=new Map,Ee=new Map;function De({data:{viewportId:e,volumeInputArray:t},displaySetsMatchDetails:n,viewportMatchDetails:o}){Ee.set(e,t);for(const e of t){const{volumeId:t}=e,n=a.cache.getVolume(t);if(!n)return;if(!Te.has(t)){const{metadata:e}=n;Te.set(t,e.SeriesInstanceUID)}}const r=[],i=new Set;Array.from(o.values()).forEach((e=>{const{displaySetsInfo:t}=e;let n=0;t.forEach((({displaySetInstanceUID:e,displaySetOptions:t})=>{t?.options?.skipLoading||(n++,i.add(e))})),n&&r.push(e)}));const s=new Set;Ee.forEach(((e,t)=>{e.forEach((e=>{const{volumeId:t}=e;s.add(t)}))}));const l=new Set;if(o.forEach((e=>{const{displaySetsInfo:t}=e;t.forEach((({displaySetInstanceUID:e})=>{l.add(e)}))})),s.size!==l.size)return;const c=Array.from(Te.keys()).slice().map((e=>a.cache.getVolume(e))),d=[];c.forEach((e=>{const t=e.getImageLoadRequests();t.length&&t[0]&&t[0].imageId&&d.push(t.reverse())}));const m=(0,he.compact)((0,he.flatten)((0,he.zip)(...d))),p=[];m.forEach((e=>{const{imageId:t}=e;d.forEach((e=>{const n=e.find((e=>e.imageId===t));n&&p.push(n)}))}));const u=a.Enums.RequestType.Prefetch;p.forEach((({callLoadImage:e,additionalDetails:t,imageId:n,imageIdIndex:o,options:r})=>{const i=e.bind(null,n,o,r);a.imageLoadPoolManager.addRequest(i,u,t,0)})),Te.clear