dicomweb-proxy
Version:
A proxy to translate between dicomweb and dimse
2 lines • 90.6 kB
JavaScript
/*! For license information please see 3166.bundle.d6de67b5c48861d87b61.js.LICENSE.txt */
(self.webpackChunk=self.webpackChunk||[]).push([[3166],{59874:(e,t,n)=>{"use strict";n.d(t,{fX:()=>s,X6:()=>ta,f_:()=>na,ql:()=>ea,QX:()=>Zn,_$:()=>c});var a={};n.r(a),n.d(a,{fillSegmentation:()=>et,generateSegmentation:()=>Je,generateToolState:()=>Ze});var r={};n.r(r),n.d(r,{createFromDICOMSegBuffer:()=>xn,generateLabelMaps2DFrom3D:()=>cn,generateSegmentation:()=>sn,generateToolState:()=>Mn});var i={};n.r(i),n.d(i,{generateToolState:()=>vn});var o={};n.r(o),n.d(o,{generateContourSetsFromLabelmap:()=>kn,generateRTSSFromAnnotations:()=>Ln,generateRTSSFromSegmentations:()=>Vn});var s={};n.r(s),n.d(s,{s:()=>Ee});var c={};n.r(c),n.d(c,{vk:()=>ra});var u=n(5842);const d=e=>Array.isArray(e)?e:[e],l=e=>t=>t.ConceptNameCodeSequence.CodeMeaning===e;var m=n(81429);const{TID1500:g,addAccessors:f}=u.BF,{StructuredReport:p}=u.h4,{Normalizer:h}=u.z8,{TID1500MeasurementReport:S,TID1501MeasurementGroup:I}=g,{DicomMetaDictionary:T}=u.p,O={CodingSchemeDesignator:"DCM",CodeValue:"121071"},D={CodingSchemeDesignator:"SCT",CodeValue:"363698007"},y={CodingSchemeDesignator:"SRT",CodeValue:"G-C0E3"},R=(e,t,n)=>{const{ConceptNameCodeSequence:a}=e;if(!a)return;const{CodingSchemeDesignator:r,CodeValue:i}=a;return r==t.CodingSchemeDesignator&&i==t.CodeValue||n&&r==n.CodingSchemeDesignator&&i==n.CodeValue};function C(e,t,n){const a=t[e],r=E.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[e];if(!(a&&a.data&&a.data.length&&r))return;const i=a.data.map((e=>function(e,t,n){const a=n.getTID300RepresentationArguments(e);return a.ReferencedSOPSequence=t,new n.TID300Representation(a)}(e,n,r)));return new I(i)}class E{static getSetupMeasurementData(e){const{ContentSequence:t}=e,n=d(t),a=n.find((e=>R(e,O))),r=n.filter((e=>R(e,D,y)))||[],i=n.find((e=>"NUM"===e.ValueType)),o=d(i.ContentSequence).find((e=>"SCOORD"===e.ValueType)),{ReferencedSOPSequence:s}=o.ContentSequence,{ReferencedSOPInstanceUID:c,ReferencedFrameNumber:u}=s,l={sopInstanceUid:c,frameIndex:u||1,complete:!0,finding:a?f(a.ConceptCodeSequence):void 0,findingSites:r.map((e=>f(e.ConceptCodeSequence)))};l.finding&&(l.description=l.finding.CodeMeaning);const m=l.findingSites&&l.findingSites[0];return m&&(l.location=m[0]&&m[0].CodeMeaning||m.CodeMeaning),{defaultState:l,findingGroup:a,findingSiteGroups:r,NUMGroup:i,SCOORDGroup:o,ReferencedSOPSequence:s,ReferencedSOPInstanceUID:c,ReferencedFrameNumber:u}}static generateReport(e,t,n){let a=[];const r=Object.keys(e)[0];if(!r)throw new Error("No measurements provided.");const i=t.get("generalSeriesModule",r),{studyInstanceUID:o,seriesInstanceUID:s}=i;Object.keys(e).forEach((n=>{const r=t.get("sopCommonModule",n),i=t.get("frameNumber",n),o=e[n],s=Object.keys(o),c={ReferencedSOPClassUID:r.sopClassUID,ReferencedSOPInstanceUID:r.sopInstanceUID};h.isMultiframeSOPClassUID(r.sopClassUID)&&(c.ReferencedFrameNumber=i);const u=[];s.forEach((e=>{const t=C(e,o,c);t&&u.push(t)})),a=a.concat(u)}));const c=new S({TID1501MeasurementGroups:a},n),u=new Uint8Array(2);u[1]=1;const d={StudyInstanceUID:o,SeriesInstanceUID:s},l={FileMetaInformationVersion:{Value:[u.buffer],vr:"OB"},TransferSyntaxUID:{Value:["1.2.840.10008.1.2.1"],vr:"UI"},ImplementationClassUID:{Value:[T.uid()],vr:"UI"},ImplementationVersionName:{Value:["dcmjs"],vr:"SH"}};d._meta=l,d._vrMap={PixelData:"OW"};const m=new p([d]),g=c.contentItem(d);return m.dataset=Object.assign(m.dataset,g),m.dataset._meta=l,m.dataset.SpecificCharacterSet="ISO_IR 192",m}static generateToolState(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("1500"!==e.ContentTemplateSequence.TemplateIdentifier)throw new Error("This package can currently only interpret DICOM SR TID 1500");const n=d(e.ContentSequence).find(l("Imaging Measurements")),a=d(n.ContentSequence).filter(l("Measurement Group")),r={},i=E.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE,o=[];return Object.keys(i).forEach((e=>{o.push(i[e]),r[e]=[]})),a.forEach((n=>{const a=d(n.ContentSequence).find((e=>"Tracking Identifier"===e.ConceptNameCodeSequence.CodeMeaning)).TextValue,i=t.getToolClass?t.getToolClass(n,e,o):o.find((e=>e.isValidCornerstoneTrackingIdentifier(a)));if(i){const e=i.getMeasurementData(n);console.log(`=== ${i.toolType} ===`),console.log(e),r[i.toolType].push(e)}})),r}static registerTool(e){E.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[e.utilityToolType]=e,E.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[e.toolType]=e,E.MEASUREMENT_BY_TOOLTYPE[e.toolType]=e.utilityToolType}}E.MEASUREMENT_BY_TOOLTYPE={},E.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE={},E.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE={};var N="cornerstoneTools@^4.0.0";const{Length:A}=u.BF.TID300,M="Length";class x{static getMeasurementData(e){const{defaultState:t,NUMGroup:n,SCOORDGroup:a}=E.getSetupMeasurementData(e),r={...t,length:n.MeasuredValueSequence.NumericValue,toolType:x.toolType,handles:{start:{},end:{},textBox:{hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}};return[r.handles.start.x,r.handles.start.y,r.handles.end.x,r.handles.end.y]=a.GraphicData,r}static getTID300RepresentationArguments(e){const{handles:t,finding:n,findingSites:a}=e;return{point1:t.start,point2:t.end,distance:e.length,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:Length",finding:n,findingSites:a||[]}}}x.toolType=M,x.utilityToolType=M,x.TID300Representation=A,x.isValidCornerstoneTrackingIdentifier=e=>{if(!e.includes(":"))return!1;const[t,n]=e.split(":");return t===N&&n===M},E.registerTool(x);const{Polyline:P}=u.BF.TID300;class _{static getMeasurementData(e){const{defaultState:t,SCOORDGroup:n,NUMGroup:a}=E.getSetupMeasurementData(e),r={...t,toolType:_.toolType,handles:{points:[],textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}},cachedStats:{area:a?a.MeasuredValueSequence.NumericValue:0},color:void 0,invalidated:!0},{GraphicData:i}=n;for(let e=0;e<i.length;e+=2)r.handles.points.push({x:i[e],y:i[e+1]});return r}static getTID300RepresentationArguments(e){const{handles:t,finding:n,findingSites:a,cachedStats:r={}}=e,{points:i}=t,{area:o=0,perimeter:s=0}=r;return{points:i,area:o,perimeter:s,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:FreehandRoi",finding:n,findingSites:a||[]}}}_.toolType="FreehandRoi",_.utilityToolType="FreehandRoi",_.TID300Representation=P,_.isValidCornerstoneTrackingIdentifier=e=>{if(!e.includes(":"))return!1;const[t,n]=e.split(":");return t===N&&n===_.toolType},E.registerTool(_);const{Bidirectional:v}=u.BF.TID300,w="Bidirectional";class b{static getMeasurementData(e){const{ContentSequence:t}=e,n=d(t).find((e=>"121071"===e.ConceptNameCodeSequence.CodeValue)),a=d(t).filter((e=>"G-C0E3"===e.ConceptNameCodeSequence.CodeValue)),r=d(t).find((e=>"Long Axis"===e.ConceptNameCodeSequence.CodeMeaning)),i=d(r.ContentSequence).find((e=>"SCOORD"===e.ValueType)),o=d(t).find((e=>"Short Axis"===e.ConceptNameCodeSequence.CodeMeaning)),s=d(o.ContentSequence).find((e=>"SCOORD"===e.ValueType)),{ReferencedSOPSequence:c}=i.ContentSequence,{ReferencedSOPInstanceUID:u,ReferencedFrameNumber:l}=c,m=String(r.MeasuredValueSequence.NumericValue),g=String(o.MeasuredValueSequence.NumericValue),f=Math.max(i.GraphicData[0],i.GraphicData[2],s.GraphicData[0],s.GraphicData[2]),p=Math.max(i.GraphicData[1],i.GraphicData[3],s.GraphicData[1],s.GraphicData[3]);return{sopInstanceUid:u,frameIndex:l||1,toolType:b.toolType,active:!1,handles:{start:{x:i.GraphicData[0],y:i.GraphicData[1],drawnIndependently:!1,allowedOutsideImage:!1,active:!1,highlight:!1,index:0},end:{x:i.GraphicData[2],y:i.GraphicData[3],drawnIndependently:!1,allowedOutsideImage:!1,active:!1,highlight:!1,index:1},perpendicularStart:{x:s.GraphicData[0],y:s.GraphicData[1],drawnIndependently:!1,allowedOutsideImage:!1,active:!1,highlight:!1,index:2},perpendicularEnd:{x:s.GraphicData[2],y:s.GraphicData[3],drawnIndependently:!1,allowedOutsideImage:!1,active:!1,highlight:!1,index:3},textBox:{highlight:!1,hasMoved:!0,active:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0,x:f+10,y:p+10}},invalidated:!1,isCreating:!1,longestDiameter:m,shortestDiameter:g,toolName:"Bidirectional",visible:!0,finding:n?n.ConceptCodeSequence:void 0,findingSites:a.map((e=>e.ConceptCodeSequence))}}static getTID300RepresentationArguments(e){const{start:t,end:n,perpendicularStart:a,perpendicularEnd:r}=e.handles,{shortestDiameter:i,longestDiameter:o,finding:s,findingSites:c}=e;return{longAxis:{point1:t,point2:n},shortAxis:{point1:a,point2:r},longAxisLength:o,shortAxisLength:i,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:Bidirectional",finding:s,findingSites:c||[]}}}b.toolType=w,b.utilityToolType=w,b.TID300Representation=v,b.isValidCornerstoneTrackingIdentifier=e=>{if(!e.includes(":"))return!1;const[t,n]=e.split(":");return t===N&&n===w},E.registerTool(b);const{Ellipse:U}=u.BF.TID300,F="EllipticalRoi";class q{static getMeasurementData(e){const{defaultState:t,NUMGroup:n,SCOORDGroup:a}=E.getSetupMeasurementData(e),{GraphicData:r}=a,i=[{x:r[0],y:r[1]},{x:r[2],y:r[3]}],o=[{x:r[4],y:r[5]},{x:r[6],y:r[7]}],s=Math.sqrt(Math.pow(o[0].x-o[1].x,2)+Math.pow(o[0].y-o[1].y,2)),c=(o[1].x-o[0].x)/s,u=(o[1].y-o[0].y)/s,d=s/2,l={x:i[0].x+c*d,y:i[0].y+u*d},m={x:i[1].x-c*d,y:i[1].y-u*d};return{...t,toolType:q.toolType,active:!1,cachedStats:{area:n?n.MeasuredValueSequence.NumericValue:0},handles:{end:{x:l.x,y:l.y,highlight:!1,active:!1},initialRotation:0,start:{x:m.x,y:m.y,highlight:!1,active:!1},textBox:{hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}},invalidated:!0,visible:!0}}static getTID300RepresentationArguments(e){const{cachedStats:t={},handles:n,finding:a,findingSites:r}=e,{start:i,end:o}=n,{area:s}=t,c=Math.abs(i.x-o.x)/2,u=Math.abs(i.y-o.y)/2,d=[],l={x:(i.x+o.x)/2,y:(i.y+o.y)/2};c>u?(d.push({x:l.x-c,y:l.y}),d.push({x:l.x+c,y:l.y}),d.push({x:l.x,y:l.y-u}),d.push({x:l.x,y:l.y+u})):(d.push({x:l.x,y:l.y-u}),d.push({x:l.x,y:l.y+u}),d.push({x:l.x-c,y:l.y}),d.push({x:l.x+c,y:l.y}));return{area:s,points:d,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:EllipticalRoi",finding:a,findingSites:r||[]}}}q.toolType=F,q.utilityToolType=F,q.TID300Representation=U,q.isValidCornerstoneTrackingIdentifier=e=>{if(!e.includes(":"))return!1;const[t,n]=e.split(":");return t===N&&n===F},E.registerTool(q);const{Circle:G}=u.BF.TID300,V="CircleRoi";class L{static getMeasurementData(e){const{defaultState:t,NUMGroup:n,SCOORDGroup:a}=E.getSetupMeasurementData(e),{GraphicData:r}=a,i={x:r[0],y:r[1]},o={x:r[2],y:r[3]};return{...t,toolType:L.toolType,active:!1,cachedStats:{area:n?n.MeasuredValueSequence.NumericValue:0,radius:0,perimeter:0},handles:{end:{...o,highlight:!1,active:!1},initialRotation:0,start:{...i,highlight:!1,active:!1},textBox:{hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}},invalidated:!0,visible:!0}}static getTID300RepresentationArguments(e){const{cachedStats:t={},handles:n,finding:a,findingSites:r}=e,{start:i,end:o}=n,{area:s,radius:c}=t,u=2*Math.PI*c,d=[];d.push(i),d.push(o);return{area:s,perimeter:u,radius:c,points:d,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:CircleRoi",finding:a,findingSites:r||[]}}}L.toolType=V,L.utilityToolType=V,L.TID300Representation=G,L.isValidCornerstoneTrackingIdentifier=e=>{if(!e.includes(":"))return!1;const[t,n]=e.split(":");return t===N&&n===V},E.registerTool(L);const{Point:B}=u.BF.TID300,k="ArrowAnnotate",j="CORNERSTONEFREETEXT";class H{static getMeasurementData(e){const{defaultState:t,SCOORDGroup:n,findingGroup:a}=E.getSetupMeasurementData(e),r=a.ConceptCodeSequence.CodeMeaning,{GraphicData:i}=n;return{...t,toolType:H.toolType,active:!1,handles:{start:{x:i[0],y:i[1],highlight:!0,active:!1},end:{x:4==i.length?i[2]:i[0]+20,y:4==i.length?i[3]:i[1]+20,highlight:!0,active:!1},textBox:{hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}},invalidated:!0,text:r,visible:!0}}static getTID300RepresentationArguments(e){const t=[e.handles.start,e.handles.end],{findingSites:n}=e;let{finding:a}=e;const r={points:t,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:ArrowAnnotate",findingSites:n||[]};return a&&a.CodeValue===j||(a={CodeValue:j,CodingSchemeDesignator:"CST4",CodeMeaning:e.text}),r.finding=a,r}}H.toolType=k,H.utilityToolType=k,H.TID300Representation=B,H.isValidCornerstoneTrackingIdentifier=e=>{if(!e.includes(":"))return!1;const[t,n]=e.split(":");return t===N&&n===k},E.registerTool(H);const{CobbAngle:z}=u.BF.TID300,$="CobbAngle";class Y{static getMeasurementData(e){const{defaultState:t,NUMGroup:n,SCOORDGroup:a}=E.getSetupMeasurementData(e),r={...t,rAngle:n.MeasuredValueSequence.NumericValue,toolType:Y.toolType,handles:{start:{},end:{},start2:{highlight:!0,drawnIndependently:!0},end2:{highlight:!0,drawnIndependently:!0},textBox:{hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}};return[r.handles.start.x,r.handles.start.y,r.handles.end.x,r.handles.end.y,r.handles.start2.x,r.handles.start2.y,r.handles.end2.x,r.handles.end2.y]=a.GraphicData,r}static getTID300RepresentationArguments(e){const{handles:t,finding:n,findingSites:a}=e;return{point1:t.start,point2:t.end,point3:t.start2,point4:t.end2,rAngle:e.rAngle,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:CobbAngle",finding:n,findingSites:a||[]}}}Y.toolType=$,Y.utilityToolType=$,Y.TID300Representation=z,Y.isValidCornerstoneTrackingIdentifier=e=>{if(!e.includes(":"))return!1;const[t,n]=e.split(":");return t===N&&n===$},E.registerTool(Y);const{Angle:W}=u.BF.TID300,K="Angle";class X{static getMeasurementData(e){const{defaultState:t,NUMGroup:n,SCOORDGroup:a}=E.getSetupMeasurementData(e),r={...t,rAngle:n.MeasuredValueSequence.NumericValue,toolType:X.toolType,handles:{start:{},middle:{},end:{},textBox:{hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}};return[r.handles.start.x,r.handles.start.y,r.handles.middle.x,r.handles.middle.y,r.handles.middle.x,r.handles.middle.y,r.handles.end.x,r.handles.end.y]=a.GraphicData,r}static getTID300RepresentationArguments(e){const{handles:t,finding:n,findingSites:a}=e;return{point1:t.start,point2:t.middle,point3:t.middle,point4:t.end,rAngle:e.rAngle,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:Angle",finding:n,findingSites:a||[]}}}X.toolType=K,X.utilityToolType=K,X.TID300Representation=W,X.isValidCornerstoneTrackingIdentifier=e=>{if(!e.includes(":"))return!1;const[t,n]=e.split(":");return t===N&&n===K},E.registerTool(X);const{Polyline:Q}=u.BF.TID300;class J{static getMeasurementData(e){const{defaultState:t,SCOORDGroup:n,NUMGroup:a}=E.getSetupMeasurementData(e),r={...t,toolType:J.toolType,handles:{start:{},end:{},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0},initialRotation:0},cachedStats:{area:a?a.MeasuredValueSequence.NumericValue:0},color:void 0,invalidated:!0},i={};return[r.handles.start.x,r.handles.start.y,i.x,i.y,r.handles.end.x,r.handles.end.y]=n.GraphicData,r}static getTID300RepresentationArguments(e){const{finding:t,findingSites:n,cachedStats:a={},handles:r}=e,{start:i,end:o}=r,s=[i,{x:i.x,y:o.y},o,{x:o.x,y:i.y}],{area:c,perimeter:u}=a;return{points:s,area:c,perimeter:u,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:RectangleRoi",finding:t,findingSites:n||[]}}}J.toolType="RectangleRoi",J.utilityToolType="RectangleRoi",J.TID300Representation=Q,J.isValidCornerstoneTrackingIdentifier=e=>{if(!e.includes(":"))return!1;const[t,n]=e.split(":");return t===N&&n===J.toolType},E.registerTool(J);var Z=n(3293),ee=n.n(Z);const{DicomMessage:te,DicomMetaDictionary:ne}=u.p,{Normalizer:ae}=u.z8;function re(e,t,n){const a=[];if(t){const t=e[0].data.byteArray.buffer,n=te.readFile(t),r=ne.naturalizeDataset(n.dict);r._meta=ne.namifyDataset(n.meta),a.push(r)}else for(let t=0;t<e.length;t++){const n=e[t].data.byteArray.buffer,r=te.readFile(n),i=ne.naturalizeDataset(r.dict);i._meta=ne.namifyDataset(r.meta),a.push(i)}return n?.SpecificCharacterSet&&a.forEach((e=>e.SpecificCharacterSet=n.SpecificCharacterSet)),ae.normalizeToDataset(a)}const{rotateDirectionCosinesInPlane:ie,flipImageOrientationPatient:oe,flipMatrix2D:se,rotateMatrix902D:ce}=u.BF.orientation,{datasetToBlob:ue,BitArray:de,DicomMessage:le,DicomMetaDictionary:me}=u.BF,{Normalizer:ge}=u.z8,{Segmentation:fe}=u.h4,pe={generateSegmentation:function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{includeSliceSpacing:!0};const{toolState:a,segments:r}=t,i=e[0],o={x:i.columns,y:i.rows,z:e.length};o.xy=o.x*o.y;if(!function(e,t){let n=0;for(let e=0;e<t.length;e++)t[e]&&n++;return n}(0,r))throw new Error("No segments to export!");const s=i.imageId.includes("?frame"),c=function(e,t,n){const a=re(e,t);return new fe([a],n)}(e,s,n),{referencedFramesPerSegment:u,segmentIndicies:d}=function(e,t,n){const a=[],r=[];for(let e=0;e<n.length;e++)n[e]&&(a.push(e),r.push([]));for(let n=0;n<t.length;n++){const i=e[t[n].imageId];for(let e=0;e<a.length;e++){const t=a[e];i&&i.brush&&i.brush.data&&i.brush.data[t]&&i.brush.data[t].pixelData&&r[e].push(n)}}return{referencedFramesPerSegment:r,segmentIndicies:a}}(a,e,r);let l=0;for(let e=0;e<u.length;e++)l+=u[e].length;c.setNumberOfFrames(l);for(let t=0;t<d.length;t++){const n=d[t],i=u[t],s=i.map((e=>e+1)),l=r[n];c.addSegment(l,he(n,i,a,e,o),s)}c.bitPackPixelData();return ue(c.dataset)},generateToolState:function(e,t,n){const a=le.readFile(t),r=me.naturalizeDataset(a.dict);r._meta=me.namifyDataset(a.meta);const i=ge.normalizeToDataset([r]),o=n.get("imagePlaneModule",e[0]);o||console.warn("Insufficient metadata, imagePlaneModule missing.");const s=function(e){const t=[];t[0]=e,t[1]=oe.h(e),t[2]=oe.v(e);const n=ie(e,Math.PI/2);return t[3]=n,t[4]=oe.h(n),t[5]=oe.v(n),t[6]=ie(e,Math.PI),t[7]=ie(e,1.5*Math.PI),t}(Array.isArray(o.rowCosines)?[...o.rowCosines,...o.columnCosines]:[o.rowCosines.x,o.rowCosines.y,o.rowCosines.z,o.columnCosines.x,o.columnCosines.y,o.columnCosines.z]),c=i.SharedFunctionalGroupsSequence,d=c.PlaneOrientationSequence?c.PlaneOrientationSequence.ImageOrientationPatient:void 0,l=i.Columns*i.Rows,m=function(e){const t=[],n=e.SegmentSequence;if(Array.isArray(n))for(let e=0;e<n.length;e++)t.push(n[e]);else t.push(n);return{seriesInstanceUid:e.ReferencedSeriesSequence.SeriesInstanceUID,data:t}}(i),g=function(e){const t=e.SegmentationType;if("BINARY"===t)return de.unpack(e.PixelData);const n=new Uint8Array(e.PixelData),a=e.MaximumFractionalValue,r=void 0===n.find((e=>0!==e&&e!==a));if(!r)return void u.Rm.warn("This is a fractional segmentation, which is not currently supported.");return u.Rm.warn("This segmentation object is actually binary... processing as such."),n}(i),f=i.PerFrameFunctionalGroupsSequence,p={};let h=!0;for(let t=0;t<f.length;t++){const a=f[t],r=d||a.PlaneOrientationSequence.ImageOrientationPatient,o=Te(ee()(new Uint8Array(g.buffer,t*l,l),[i.Rows,i.Columns]),r,s);if(!o){console.warn("This segmentation object is not in-plane with the source data. Bailing out of IO. It'd be better to render this with vtkjs. "),h=!1;break}const u=a.SegmentIdentificationSequence.ReferencedSegmentNumber-1;let m;m=c.DerivationImageSequence&&c.DerivationImageSequence.SourceImageSequence?c.DerivationImageSequence.SourceImageSequence[t]:a.DerivationImageSequence.SourceImageSequence;Se(p,Ie(m,e,n),u,o)}if(!h)return;return{toolState:p,segMetadata:m}}};function he(e,t,n,a,r){const i=new Uint8Array(r.xy*t.length);let o=0;for(let r=0;r<t.length;r++){const s=n[a[t[r]].imageId].brush.data[e].pixelData;for(let e=0;e<s.length;e++)i[o]=s[e],o++}return i}function Se(e,t,n,a){e[t]?e[t].brush?e[t].brush.data||(e[t].brush.data=[]):(e[t].brush={},e[t].brush.data=[]):(e[t]={},e[t].brush={},e[t].brush.data=[]),e[t].brush.data[n]={};const r=e[t].brush.data[n];r.pixelData=new Uint8Array(a.data.length);const i=r.pixelData;for(let e=0;e<i.length;e++)a.data[e]?i[e]=1:i[e]=0}function Ie(e,t,n){const{ReferencedSOPInstanceUID:a,ReferencedFrameNumber:r}=e;return r?function(e,t,n,a){const r=n.find((n=>{const r=a.get("sopCommonModule",n);if(!r)return;const i=Number(n.split("frame=")[1]);return r.sopInstanceUID===e&&i===t-1}));return r}(a,r,t,n):function(e,t,n){return t.find((t=>{const a=n.get("sopCommonModule",t);if(a)return a.sopInstanceUID===e}))}(a,t,n)}function Te(e,t,n){return De(t,n[0])?e:De(t,n[1])?se.v(e):De(t,n[2])?se.h(e):De(t,n[3])?ce(e):De(t,n[4])?se.h(ce(e)):De(t,n[5])?se.v(ce(e)):De(t,n[6])?ce(ce(e)):De(t,n[7])?ce(ce(ce(e))):void 0}const Oe=1e-5;function De(e,t){return Math.abs(e[0]-t[0])<Oe&&Math.abs(e[1]-t[1])<Oe&&Math.abs(e[2]-t[2])<Oe&&Math.abs(e[3]-t[3])<Oe&&Math.abs(e[4]-t[4])<Oe&&Math.abs(e[5]-t[5])<Oe}const{nearlyEqual:ye}=u.BF.orientation;function Re(e,t,n){if(e.length!==t.length)return!1;for(let a=0;a<e.length;++a)if(!ye(e[a],t[a],n))return!1;return!0}function Ce(e,t,n,a){const{SharedFunctionalGroupsSequence:r,PerFrameFunctionalGroupsSequence:i}=e,o=r.PlaneOrientationSequence?r.PlaneOrientationSequence.ImageOrientationPatient:void 0,s=i[0],c=o||s.PlaneOrientationSequence.ImageOrientationPatient;return t.some((e=>Re(c,e,a)))?"Planar":function(e,t,n){const a=Math.abs(e[0]*t[0]+e[1]*t[1]+e[2]*t[2]),r=Math.abs(e[3]*t[3]+e[4]*t[4]+e[5]*t[5]);return(a<n||Math.abs(a-1)<n)&&(r<n||Math.abs(r-1)<n)}(c,t[0],a)&&n.includes(e.Rows)&&n.includes(e.Columns)?"Perpendicular":"Oblique"}var Ee;!function(e){e.SEGMENTATION_LOAD_PROGRESS="CORNERSTONE_ADAPTER_SEGMENTATION_LOAD_PROGRESS"}(Ee||(Ee={}));const{rotateDirectionCosinesInPlane:Ne,flipImageOrientationPatient:Ae,flipMatrix2D:Me,rotateMatrix902D:xe}=u.BF.orientation,{BitArray:Pe,DicomMessage:_e,DicomMetaDictionary:ve}=u.p,{Normalizer:we}=u.z8,{Segmentation:be}=u.h4,{encode:Ue,decode:Fe}=u.BF.compression,qe={includeSliceSpacing:!0,rleEncode:!1};function Ge(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const a=Object.assign({},qe,n),r=Array.isArray(t)?t:[t];let i=0;const o=[];for(let e=0;e<r.length;e++){const t=r[e],{labelmaps2D:n,metadata:a}=t,s=[];for(let e=1;e<a.length;e++)a[e]&&(s[e]=[]);for(let e=0;e<n.length;e++){const t=n[e];if(n[e]){const{segmentsOnLabelmap:n}=t;n.forEach((t=>{0!==t&&(s[t].push(e),i++)}))}}o[e]=s}e.setNumberOfFrames(i);for(let t=0;t<r.length;t++){const n=o[t],a=r[t],{metadata:i}=a;for(let t=1;t<n.length;t++){const r=n[t];if(r){const n=r.map((e=>e+1)),o=i[t],s=Ve(a,r);e.addSegmentFromLabelmap(o,s,t,n)}}}if(a.rleEncode){const t=Ue(e.dataset.PixelData,i,e.dataset.Rows,e.dataset.Columns);e.assignToDataset({BitsAllocated:"8",BitsStored:"8",HighBit:"7",SegmentationType:"FRACTIONAL",SegmentationFractionalType:"PROBABILITY",MaximumFractionalValue:"255"}),e.dataset._meta.TransferSyntaxUID={Value:["1.2.840.10008.1.2.5"],vr:"UI"},e.dataset.SpecificCharacterSet="ISO_IR 192",e.dataset._vrMap.PixelData="OB",e.dataset.PixelData=t}else e.bitPackPixelData();return e}function Ve(e,t){const{labelmaps2D:n}=e,a=[];for(let e=0;e<t.length;e++){const r=t[e];a.push(n[r].pixelData)}return a}function Le(e,t,n,a,r,i){let o;if(!e)return o;const{FrameOfReferenceUID:s,PerFrameFunctionalGroupsSequence:c,SourceImageSequence:u,ReferencedSeriesSequence:d}=e;if(!c||0===c.length)return o;const l=c[t];if(!l)return o;let m;if(l.DerivationImageSequence){let e=l.DerivationImageSequence;Array.isArray(e)&&(e=0!==e.length?e[0]:void 0),e&&(m=e.SourceImageSequence,Array.isArray(m)&&(m=0!==m.length?m[0]:void 0))}else u&&0!==u.length&&(console.warn("DerivationImageSequence not present, using SourceImageSequence assuming SEG has the same geometry as the source image."),m=u[t]);if(m&&(o=function(e,t){const{ReferencedSOPInstanceUID:n,ReferencedFrameNumber:a}=e,r=t[n];if(!r)return void console.warn(`No imageId found for SOPInstanceUID: ${n}`);if(void 0!==a)return r.includes("frames/")?r.replace(/frames\/\d+/,`frames/${a}`):r.includes("frame=")?r.replace(/frame=\d+/,"frame="+(a-1)):r.includes("wadors:")?`${r}/frames/${a}`:`${r}?frame=${a-1}`;return r}(m,i)),void 0===o&&d){o=function(e,t,n,a,r,i){if(!e||!n.PlanePositionSequence?.[0]?.ImagePositionPatient)return;const o=n.PlanePositionSequence[0].ImagePositionPatient;for(let n of a){const a=r.get("instance",n);if(!a)continue;const s=ze(a);if(a.ImagePositionPatient&&a.FrameOfReferenceUID===t&&a.SeriesInstanceUID===e)if(s){const e=r.get("imagePlaneModule",n)?.imagePositionPatient;if(e&&Re(o,e,i))return n}else if(Re(o,a.ImagePositionPatient,i))return n}return}((Array.isArray(d)?d[0]:d).SeriesInstanceUID,s,l,n,a,r)}return o}function Be(e,t,n,a,r,i,o,s,c,u,d,l){const{SharedFunctionalGroupsSequence:m,PerFrameFunctionalGroupsSequence:g,Rows:f,Columns:p}=r,h=m.PlaneOrientationSequence?m.PlaneOrientationSequence.ImageOrientationPatient:void 0,S=p*f,I=S*i.length*u.BYTES_PER_ELEMENT;let T=1,O=0,D=n[O].slice(0),y=structuredClone(t[O]),R=r.SegmentSequence.length;for(let d=1;d<=R;++d){for(let m=0,R=g.length;m<R;++m){const R=g[m],C=ke(r,m);if(void 0===C)throw new Error("Could not retrieve the segment index. Aborting segmentation loading.");if(C!==d)continue;const E=h||R.PlaneOrientationSequence.ImageOrientationPatient,N=Ke(a,m*S,S),A=Ye(ee()(N,[f,p]),E,o,c);if(!A)throw new Error("Individual SEG frames are out of plane with respect to the first SEG frame. This is not yet supported. Aborting segmentation loading.");const M=Le(r,m,i,s,c,l);if(!M){console.warn("Image not present in stack, can't import frame : "+m+".");continue}const x=s.get("instance",M);if(f!==x.Rows||p!==x.Columns)throw new Error("Individual SEG frames have different geometry dimensions (Rows and Columns) respect to the source image reference frame. This is not yet supported. Aborting segmentation loading. ");const P=i.findIndex((e=>e===M)),_=new u(D,S*P*u.BYTES_PER_ELEMENT,S),v=A.data;let w=!1;for(let e=0,a=A.data.length;e<a;++e)if(v[e]){if(0!==_[e]){O++,O>=T&&(n[O]=new ArrayBuffer(I),t[O]=[],T++),D=n[O].slice(0),y=structuredClone(t[O]),m=0;break}_[e]=C,w=!0}w&&(y[P]||(y[P]=[]),y[P].push(C),e[P]||(e[P]=[]),e[P].push(C))}n[O]=D.slice(0),t[O]=structuredClone(y),O=0,D=n[O].slice(0),y=structuredClone(t[O])}}const ke=(e,t)=>{const{PerFrameFunctionalGroupsSequence:n,SharedFunctionalGroupsSequence:a}=e,r=n[t];return r&&r.SegmentIdentificationSequence?r.SegmentIdentificationSequence.ReferencedSegmentNumber:a.SegmentIdentificationSequence?a.SegmentIdentificationSequence.ReferencedSegmentNumber:void 0};function je(e,t,n,a,r,i,o,s,c,u,d,l,m,g,f){const{SharedFunctionalGroupsSequence:p,PerFrameFunctionalGroupsSequence:h,Rows:S,Columns:I}=r,T=p.PlaneOrientationSequence?p.PlaneOrientationSequence.ImageOrientationPatient:void 0,O=I*S;let D=0;const y=h.length,R=Math.ceil(y/10),C=f&&g;let E=!1;return new Promise((t=>{!function p(){for(let t=Math.min(D+R,y);D<t;++D){const t=h[D],g=T||t.PlaneOrientationSequence.ImageOrientationPatient,f=Ke(a,D*O,O),p=Ye(ee()(f,[S,I]),g,o,c);if(!p)throw new Error("Individual SEG frames are out of plane with respect to the first SEG frame. This is not yet supported. Aborting segmentation loading.");const y=ke(r,D);if(void 0===y)throw new Error("Could not retrieve the segment index. Aborting segmentation loading.");d.has(y)||d.set(y,{});const R=Le(r,D,i,s,c,l);if(!R){console.warn("Image not present in stack, can't import frame : "+D+".");continue}const C=m.metadata[R];if(S!==C.Rows||I!==C.Columns)throw new Error("Individual SEG frames have different geometry dimensions (Rows and Columns) respect to the source image reference frame. This is not yet supported. Aborting segmentation loading. ");const N=m.indices[R],A=O*N*u.BYTES_PER_ELEMENT,M=new u(n[0],A,O),x=p.data,P=[];for(let t=0,n=p.data.length;t<n;++t)if(x[t]){for(let e=t;e<n;++e)x[e]&&(E||0===M[e]||(E=!0),M[e]=y,P.push(e));e[N]||(e[N]=[]),e[N].push(y);break}const _=d.get(y);_[N]=P,d.set(y,_)}if(C){const e=Math.round(D/y*100);f(g,Ee.SEGMENTATION_LOAD_PROGRESS,{percentComplete:e})}D<y?setTimeout(p,0):t(E)}()}))}function He(e,t){const n=e.SegmentationType;let a;if(a=Array.isArray(e.PixelData)?e.PixelData[0]:e.PixelData,void 0===a&&u.Rm.error("This segmentation pixelData is undefined."),"BINARY"===n)return function(e,t){for(var n=new Uint8Array(e),a=[],r=8*t,i=Math.ceil(8*n.length/r),o=0;o<i;o++){var s=o*r,c=Math.min(s+r,8*n.length),u=Math.floor(s/8),d=Math.ceil(c/8),l=n.slice(u,d),m=Pe.unpack(l);a.push(m)}return a}(a,t.maxBytesPerChunk);const r=new Uint8Array(a),i=e.MaximumFractionalValue;return void 0===r.find((e=>0!==e&&e!==i))?(u.Rm.warn("This segmentation object is actually binary... processing as such."),r):void 0}function ze(e){return e&&e.NumberOfFrames>1}function $e(e){const t=[];t[0]=e,t[1]=Ae.h(e),t[2]=Ae.v(e);const n=Ne(e,Math.PI/2);return t[3]=n,t[4]=Ae.h(n),t[5]=Ae.v(n),t[6]=Ne(e,Math.PI),t[7]=Ne(e,1.5*Math.PI),t}function Ye(e,t,n,a){return Re(t,n[0],a)?e:Re(t,n[1],a)?Me.v(e):Re(t,n[2],a)?Me.h(e):Re(t,n[3],a)?xe(e):Re(t,n[4],a)?xe(Me.h(e)):Re(t,n[5],a)?xe(Me.v(e)):Re(t,n[6],a)?xe(xe(e)):Re(t,n[7],a)?xe(xe(xe(e))):void 0}function We(e,t){const n=e.SegmentSequence;let a=[];return a=Array.isArray(n)?[void 0,...n]:[void 0,n],{seriesInstanceUid:t,data:a}}function Ke(e,t,n){const a=function(e,t,n){var a=e.reduce(((e,t)=>e+t.length),0);if(t<0||t+n>a)throw new Error("Offset and length out of bounds");var r=0,i=t;for(;i>=e[r].length;)i-=e[r].length,r++;var o=r,s=i+n;for(;s>e[o].length;)s-=e[o].length,o++;return{start:{chunkIndex:r,offset:i},end:{chunkIndex:o,offset:s}}}(e,t,n);if(a.start.chunkIndex===a.end.chunkIndex)return new Uint8Array(e[a.start.chunkIndex].buffer,a.start.offset,n);{let t=new Uint8Array(n),r=0;for(let n=a.start.chunkIndex;n<=a.end.chunkIndex;n++){let i=n===a.start.chunkIndex?a.start.offset:0,o=n===a.end.chunkIndex?a.end.offset:e[n].length;t.set(new Uint8Array(e[n].buffer,i,o-i),r),r+=o-i}return t}}function Xe(e,t,n,a){let r=0,i=0,o=0,s=0,c=0,u=0,d=0;for(const[l,m]of Object.entries(e)){const e=Number(l);if(!m||0===m.length)continue;const g=a[e],f=n.get("imagePlaneModule",g);if(!f){console.debug("Missing imagePlaneModule metadata for centroid calculation");continue}const{imagePositionPatient:p,rowCosines:h,columnCosines:S,rowPixelSpacing:I,columnPixelSpacing:T}=f;for(const n of m){const a=Math.floor(n/t.Rows),l=n%t.Rows;r+=l,i+=a,o+=e;s+=p[0]+l*h[0]*T+a*S[0]*I,c+=p[1]+l*h[1]*T+a*S[1]*I,u+=p[2]+l*h[2]*T+a*S[2]*I,d++}}return{image:{x:Math.floor(r/d),y:Math.floor(i/d),z:Math.floor(o/d)},world:{x:s/d,y:c/d,z:u/d},count:d}}const Qe={generateSegmentation:function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return Ge(function(e,t,n){const a=re(e,t);return new be([a],n)}(e,ze(e[0]),n),t,n)},generateToolState:async function(e,t,n,a){const{skipOverlapping:r=!1,tolerance:i=.001,TypedArrayConstructor:o=Uint8Array,maxBytesPerChunk:s=199e6,eventTarget:c=null,triggerEvent:u=null}=a,d=_e.readFile(t),l=ve.naturalizeDataset(d.dict);l._meta=ve.namifyDataset(d.meta);const m=we.normalizeToDataset([l]),g=n.get("imagePlaneModule",e[0]),f=n.get("generalSeriesModule",e[0]).seriesInstanceUID;g||console.warn("Insufficient metadata, imagePlaneModule missing.");const p=$e(Array.isArray(g.rowCosines)?[...g.rowCosines,...g.columnCosines]:[g.rowCosines.x,g.rowCosines.y,g.rowCosines.z,g.columnCosines.x,g.columnCosines.y,g.columnCosines.z]),h=m.Columns*m.Rows,S=We(m,f);let I,T;if("1.2.840.10008.1.2.5"===m._meta.TransferSyntaxUID.Value[0]){const e=Array.isArray(m.PixelData)?m.PixelData:[m.PixelData];if(I=Fe(e,m.Rows,m.Columns),1===m.BitsStored)return void console.warn("No implementation for rle + bitbacking.");T=[I]}else if(T=He(m,{maxBytesPerChunk:s}),!T)throw new Error("Fractional segmentations are not yet supported");const O=Ce(m,p,[g.rows,g.columns,e.length],i),D=e.reduce(((e,t)=>{const{sopInstanceUID:a}=n.get("generalImageModule",t);return e[a]=t,e}),{});let y,R=!1;switch(r||(R=function(e,t,n,a,r,i,o,s){const{SharedFunctionalGroupsSequence:c,PerFrameFunctionalGroupsSequence:u,SegmentSequence:d,Rows:l,Columns:m}=t;if(d.length<2)return!1;const g=c.PlaneOrientationSequence?c.PlaneOrientationSequence.ImageOrientationPatient:void 0,f=m*l,p=u.length;let h=new Map;for(let e=0;e<p;++e){if(void 0===ke(t,e)){console.warn("Could not retrieve the segment index for frame segment "+e+", skipping this frame.");continue}const a=Le(t,e,n,r,i,s);if(!a){console.warn("Image not present in stack, can't import frame : "+e+".");continue}const o=n.findIndex((e=>e===a));if(h.has(o)){let t=h.get(o);t.includes(e)||(t.push(e),h.set(o,t))}else h.set(o,[e])}for(let[,t]of h.entries()){let n=new o(f).fill(0);for(let r=0;r<t.length;++r){const o=t[r],s=u[o],c=g||s.PlaneOrientationSequence.ImageOrientationPatient,d=Ke(e,o*f,f),p=Ye(ee()(d,[l,m]),c,a,i);if(!p){console.warn("Individual SEG frames are out of plane with respect to the first SEG frame, this is not yet supported, skipping this frame.");continue}const h=p.data;for(let e=0,t=h.length;e<t;++e)if(0!==h[e]&&(n[e]++,n[e]>1))return!0}}return!1}(T,m,e,p,n,i,o,D)),O){case"Planar":y=R?Be:je;break;case"Perpendicular":throw new Error("Segmentations orthogonal to the acquisition plane of the source data are not yet supported.");case"Oblique":throw new Error("Segmentations oblique to the acquisition plane of the source data are not yet supported.")}const C=[];C[0]=[];const E=[],N=h*e.length*o.BYTES_PER_ELEMENT,A=[];A[0]=new ArrayBuffer(N);const M=e.reduce(((e,t,a)=>(e.indices[t]=a,e.metadata[t]=n.get("instance",t),e)),{indices:{},metadata:{}}),x=new Map,P=await y(E,C,A,T,m,e,p,n,i,o,x,D,M,c,u),_=new Map;return x.forEach(((t,a)=>{const r=Xe(t,m,n,e);_.set(a,r)})),{labelmapBufferArray:A,segMetadata:S,segmentsOnFrame:E,segmentsOnFrameArray:C,centroids:_,overlappingSegments:P}},fillSegmentation:Ge};function Je(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{includeSliceSpacing:!0},a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:4;return 4===a?Qe.generateSegmentation(e,t,n):3===a?pe.generateSegmentation(e,t,n):void console.warn(`No generateSegmentation adapter for cornerstone version ${a}, exiting.`)}function Ze(e,t,n){let a=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:.001,i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:4;return 4===i?Qe.generateToolState(e,t,n,a,r):3===i?pe.generateToolState(e,t,n):void console.warn(`No generateToolState adapter for cornerstone version ${i}, exiting.`)}function et(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{includeSliceSpacing:!0},a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:4;if(4===a)return Qe.fillSegmentation(e,t,n);console.warn(`No generateSegmentation adapter for cornerstone version ${a}, exiting.`)}const{DicomMessage:tt,DicomMetaDictionary:nt}=u.p,{Normalizer:at}=u.z8;function rt(e,t,n,a,r,i){let o;if(!e)return o;const{FrameOfReferenceUID:s,PerFrameFunctionalGroupsSequence:c,SourceImageSequence:u,ReferencedSeriesSequence:d}=e;if(!c||0===c.length)return o;const l=c[t];if(!l)return o;let m;if(l.DerivationImageSequence){let e=l.DerivationImageSequence;Array.isArray(e)&&(e=0!==e.length?e[0]:void 0),e&&(m=e.SourceImageSequence,Array.isArray(m)&&(m=0!==m.length?m[0]:void 0))}else u&&0!==u.length&&(console.warn("DerivationImageSequence not present, using SourceImageSequence assuming SEG has the same geometry as the source image."),m=u[t]);if(m&&(o=function(e,t){const{ReferencedSOPInstanceUID:n,ReferencedFrameNumber:a}=e;return a?function(e,t,n){const a=n[e];if(!a)return;const r=Number(a.split("frame=")[1]);return r===t-1?a:void 0}(n,a,t):t[n]}(m,i)),void 0===o&&d){o=function(e,t,n,a,r,i){if(void 0===e||void 0===n.PlanePositionSequence||void 0===n.PlanePositionSequence[0]||void 0===n.PlanePositionSequence[0].ImagePositionPatient)return;for(let o=0;o<a.length;++o){const s=r.get("instance",a[o]);if(void 0!==s&&void 0!==s.ImagePositionPatient&&s.FrameOfReferenceUID===t&&s.SeriesInstanceUID===e&&Re(n.PlanePositionSequence[0].ImagePositionPatient,s.ImagePositionPatient,i))return a[o]}}((Array.isArray(d)?d[0]:d).SeriesInstanceUID,s,l,n,a,r)}return o}const it={Length:x,FreehandRoi:_,Bidirectional:b,EllipticalRoi:q,CircleRoi:L,ArrowAnnotate:H,MeasurementReport:E,CobbAngle:Y,Angle:X,RectangleRoi:J},ot={Segmentation:a},st={ParametricMap:{generateToolState:async function(e,t,n){let a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:.001;const r=tt.readFile(t),i=nt.naturalizeDataset(r.dict);i._meta=nt.namifyDataset(r.meta);const o=at.normalizeToDataset([i]),s=n.get("imagePlaneModule",e[0]);s||console.warn("Insufficient metadata, imagePlaneModule missing.");const c=[Array.isArray(s.rowCosines)?[...s.rowCosines,...s.columnCosines]:[s.rowCosines.x,s.rowCosines.y,s.rowCosines.z,s.columnCosines.x,s.columnCosines.y,s.columnCosines.z]],d=function(e){let t,n;if(e.PixelData){t=(16===e.BitsAllocated?[Uint16Array,Int16Array]:[Uint32Array,Int32Array])[e.PixelRepresentation??0],n=e.PixelData}else e.FloatPixelData?(t=Float32Array,n=e.FloatPixelData):e.DoubleFloatPixelData&&(t=Float64Array,n=e.DoubleFloatPixelData);void 0===n&&u.Rm.error("This parametric map pixel data is undefined.");Array.isArray(n)&&(n=n[0]);return new t(n)}(o),l=Ce(o,c,[s.rows,s.columns,e.length],a),m=e.reduce(((e,t)=>{const{sopInstanceUID:a}=n.get("generalImageModule",t);return e[a]=t,e}),{});if("Planar"!==l){throw new Error(`Parametric maps ${{Perpendicular:"orthogonal",Oblique:"oblique"}[l]} to the acquisition plane of the source data are not yet supported.`)}const g=e.reduce(((e,t,a)=>(e.indices[t]=a,e.metadata[t]=n.get("instance",t),e)),{indices:{},metadata:{}});return await function(e,t,n,a,r,i,o){const s=new e.constructor(e.length),{PerFrameFunctionalGroupsSequence:c,Rows:u,Columns:d}=t,l=d*u,m=c.length;for(let c=0;c<m;c++){const m=new e.constructor(e.buffer,c*l,l),g=rt(t,c,n,a,r,i);if(!g){console.warn("Image not present in stack, can't import frame : "+c+".");continue}const f=o.metadata[g];if(u!==f.Rows||d!==f.Columns)throw new Error("Parametric map have different geometry dimensions (Rows and Columns) respect to the source image reference frame. This is not yet supported.");const p=l*o.indices[g]*s.BYTES_PER_ELEMENT;new s.constructor(s.buffer,p,l).set(m)}return s}(d,o,e,n,a,m,g),{pixelData:d}}}};var ct="Cornerstone3DTools@^0.1.0";const ut=["PatientName","PatientID","PatientBirthDate","PatientBirthTime","PatientID","IssuerOfPatientID","OtherPatientIDs","OtherPatientIDsSequence","PatientSex","PatientIdentityRemoved","DeidentificationMethodCodeSequence","StudyDate","StudyTime","StudyStatusID","StudyPriorityID","StudyInstanceUID","StudyDescription","AccessionNumber","StudyID","ReferringPhysicianName","BodyPartExamined","TimezoneOffsetFromUTC"];const dt={CodingSchemeDesignator:"CORNERSTONEJS",codeValues:{CORNERSTONEFREETEXT:"CORNERSTONEFREETEXT"}};var lt;const{TID1500:mt,addAccessors:gt}=u.BF,{StructuredReport:ft}=u.h4,{Normalizer:pt}=u.z8,{TID1500MeasurementReport:ht,TID1501MeasurementGroup:St}=mt,{DicomMetaDictionary:It}=u.p,Tt={CodingSchemeDesignator:"DCM",CodeValue:"121071"},Ot={CodingSchemeDesignator:"SCT",CodeValue:"363698007"},Dt={CodingSchemeDesignator:"SRT",CodeValue:"G-C0E3"};class yt{static getTID300ContentItem(e,t,n,a){const r=n.getTID300RepresentationArguments(e,a);r.ReferencedSOPSequence=t;return new n.TID300Representation(r)}static getMeasurementGroup(e,t,n,a){const r=t[e],i=this.measurementAdapterByToolType.get(e);if(!(r&&r.data&&r.data.length&&i))return;const o=r.data.map((e=>this.getTID300ContentItem(e,n,i,a)));return new St(o)}static getCornerstoneLabelFromDefaultState(e){const{findingSites:t=[],finding:n}=e,a=dt.codeValues.CORNERSTONEFREETEXT,r=t.find((e=>e.CodeValue===a));return r?r.CodeMeaning:n&&n.CodeValue===a?n.CodeMeaning:void 0}static generateDatasetMeta(){const e=new Uint8Array(2);e[1]=1;return{FileMetaInformationVersion:{Value:[e.buffer],vr:"OB"},TransferSyntaxUID:{Value:["1.2.840.10008.1.2.1"],vr:"UI"},ImplementationClassUID:{Value:[It.uid()],vr:"UI"},ImplementationVersionName:{Value:["dcmjs"],vr:"SH"}}}static getSetupMeasurementData(e,t,n,a){const{ContentSequence:r}=e,i=d(r),o=i.find((e=>this.codeValueMatch(e,Tt))),s=i.filter((e=>this.codeValueMatch(e,Ot,Dt)))||[],c=i.find((e=>"NUM"===e.ValueType)),u=d(c.ContentSequence).find((e=>"SCOORD"===e.ValueType)),{ReferencedSOPSequence:l}=u.ContentSequence,{ReferencedSOPInstanceUID:m,ReferencedFrameNumber:g}=l,f=t[m],p=n.get("imagePlaneModule",f),h=o?gt(o.ConceptCodeSequence):void 0,S=s.map((e=>gt(e.ConceptCodeSequence))),I={description:void 0,sopInstanceUid:m,annotation:{annotationUID:It.uid(),metadata:{toolName:a,referencedImageId:f,FrameOfReferenceUID:p.frameOfReferenceUID,label:""},data:void 0},finding:h,findingSites:S};return I.finding&&(I.description=I.finding.CodeMeaning),I.annotation.metadata.label=yt.getCornerstoneLabelFromDefaultState(I),{defaultState:I,NUMGroup:c,SCOORDGroup:u,ReferencedSOPSequence:l,ReferencedSOPInstanceUID:m,ReferencedFrameNumber:g}}static generateReport(e,t,n,a){let r=[];const i={},o=[],s=yt.generateDatasetMeta();Object.keys(e).forEach((a=>{const s=t.get("sopCommonModule",a),c=t.get("instance",a),{sopInstanceUID:u,sopClassUID:d}=s,{SeriesInstanceUID:l}=c;if(i[u]=l,!o.find((e=>e.SeriesInstanceUID===l))){const e=yt.generateDerivationSourceDataset(c);o.push(e)}const m=t.get("frameNumber",a),g=e[a],f=Object.keys(g),p={ReferencedSOPClassUID:d,ReferencedSOPInstanceUID:u,ReferencedFrameNumber:void 0};(c&&c.NumberOfFrames&&c.NumberOfFrames>1||pt.isMultiframeSOPClassUID(d))&&(p.ReferencedFrameNumber=m);const h=[];f.forEach((e=>{const t=this.getMeasurementGroup(e,g,p,n);t&&h.push(t)})),r=r.concat(h)}));const c=new ht({TID1501MeasurementGroups:r},a),u=new ft(o,a),d=c.contentItem(o,{...a,sopInstanceUIDsToSeriesInstanceUIDMap:i});return u.dataset=Object.assign(u.dataset,d),u.dataset._meta=s,u.SpecificCharacterSet="ISO_IR 192",u}static generateToolState(e,t,n,a,r){if("1500"!==e.ContentTemplateSequence.TemplateIdentifier)throw new Error("This package can currently only interpret DICOM SR TID 1500");const i=d(e.ContentSequence).find(l("Imaging Measurements")),o=d(i.ContentSequence).filter(l("Measurement Group")),s={};return o.forEach((i=>{try{const o=d(i.ContentSequence),c=o.find((e=>"Tracking Identifier"===e.ConceptNameCodeSequence.CodeMeaning)),{TextValue:u}=c,l=o.find((e=>"Tracking Unique Identifier"===e.ConceptNameCodeSequence.CodeMeaning)),m=l?.UID,g=r?.getToolClass?.(i,e,this.measurementAdapterByToolType)||this.getAdapterForTrackingIdentifier(u);if(g){const e=g.getMeasurementData(i,t,n,a,u);e.TrackingUniqueIdentifier=m,console.log(`=== ${g.toolType} ===`),console.log(e),s[g.toolType]||=[],s[g.toolType].push(e)}}catch(e){console.warn("Unable to generate tool state for",i,e)}})),s}static registerTool(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=e.toolType;if(this.measurementAdapterByToolType.has(n)){if(!t)throw new Error(`The registered tool name ${n} already exists in adapters, use a different toolType or use replace`);"function"==typeof t&&t(this.measurementAdapterByToolType.get(n))}this.measurementAdapterByToolType.set(e.toolType,e),this.measurementAdapterByTrackingIdentifier.set(e.trackingIdentifierTextValue,e)}static registerTrackingIdentifier(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];for(const t of n)this.measurementAdapterByTrackingIdentifier.set(t,e)}static getAdapterForTrackingIdentifier(e){const t=this.measurementAdapterByTrackingIdentifier.get(e);if(t)return t;for(const t of[...this.measurementAdapterByToolType.values()])if(t.isValidCornerstoneTrackingIdentifier(e))return this.measurementAdapterByTrackingIdentifier.set(e,t),t}}(lt=yt).CORNERSTONE_3D_TAG=ct,lt.measurementAdapterByToolType=new Map,lt.measurementAdapterByTrackingIdentifier=new Map,lt.codeValueMatch=(e,t,n)=>{const{ConceptNameCodeSequence:a}=e;if(!a)return;const{CodingSchemeDesignator:r,CodeValue:i}=a;return r==t.CodingSchemeDesignator&&i==t.CodeValue||n&&r==n.CodingSchemeDesignator&&i==n.CodeValue},lt.generateDerivationSourceDataset=e=>{lt.generateDatasetMeta();return function(e){const t={_meta:e._meta,_vrMap:e._vrMap};for(const n of ut){const a=e[n];void 0!==a&&(t[n]=a)}return t}(e)};class Rt{static init(e,t,n){if(this.toolType=e,Rt.toolType)throw new Error(`Base adapter tool type set to ${this.toolType} while setting ${e}`);if(this.parentType=n?.parentType,this.trackingIdentifiers=new Set,this.TID300Representation=t,this.parentType){this.trackingIdentifierTextValue=`${ct}:${this.parentType}:${this.toolType}`;const e=`${ct}:${this.toolType}`;this.trackingIdentifiers.add(e)}else this.trackingIdentifierTextValue=`${ct}:${e}`;this.trackingIdentifiers.add(this.trackingIdentifierTextValue),yt.registerTool(this)}static registerLegacy(){this.trackingIdentifiers.add(`cornerstoneTools@^4.0.0:${this.toolType}`)}static registerSubType(e,t,n){const a=Object.create(e);return a.init(t,e.TID300Representation,{parentType:e.parentType||e.toolType,replace:n}),a}static isValidCornerstoneTrackingIdentifier(e){return!!this.trackingIdentifiers.has(e)||!!e.includes(":")&&e.startsWith(this.trackingIdentifierTextValue)}static getMeasurementData(e,t,n,a,r){const{defaultState:i,ReferencedFrameNumber:o}=yt.getSetupMeasurementData(e,t,a,this.toolType);return i.annotation.data={cachedStats:{},frameNumber:o,seriesLevel:r?.indexOf(":Series")>0},i}static getTID300RepresentationArguments(e,t){const{data:n,metadata:a}=e,{finding:r,findingSites:i}=e,{referencedImageId:o}=a;if(!o)throw new Error("Probe.getTID300RepresentationArguments: referencedImageId is not defined");const{handles:{points:s=[]}}=n;return{points:s.map((e=>{const n=t(o,e);return{x:n[0],y:n[1]}})),trackingIdentifierTextValue:this.trackingIdentifierTextValue,findingSites:i||[],finding:r}}}var Ct;const{Point:Et}=u.BF.TID300,{codeValues:Nt}=dt;class At extends Rt{static getMeasurementData(e,t,n,a,r){const{defaultState:i,SCOORDGroup:o,ReferencedFrameNumber:s}=yt.getSetupMeasurementData(e,t,a,At.toolType),c=i.annotation.metadata.referencedImageId,u=i.annotation.metadata.label,{GraphicData:d}=o,l=[];for(let e=0;e<d.length;e+=2){const t=n(c,[d[e],d[e+1]]);l.push(t)}if(1===l.length){const e=a.get("imagePixelModule",c);let t=10,r=10;if(e){const{columns:n,rows:a}=e;t=n/10,r=a/10}const i=n(c,[d[0]+t,d[1]+r]);l.push(i)}const m=i;return m.annotation.data={text:u,handles:{arrowFirst:!0,points:[l[0],l[1]],activeHandleIndex:0,textBox:{hasMoved:!1}},frameNumber:s},m}static getTID300RepresentationArguments(e,t){const{data:n,metadata:a,findingSites:r}=e;let{finding:i}=e;const{referencedImageId:o}=a;if(!o)throw new Error("ArrowAnnotate.getTID300RepresentationArguments: referencedImageId is not defined");const{points:s,arrowFirst:c}=n.handles;let u,d;c?(u=s[0],d=s[1]):(u=s[1],d=s[0]);const l=t(o,u),m=t(o,d),g={points:[{x:l[0],y:l[1]},{x:m[0],y:m[1]}],trackingIdentifierTextValue:this.trackingIdentifierTextValue,findingSites:r||[],finding:i};return i&&i.CodeValue===Nt.CORNERSTONEFREETEXT||(i={CodeValue:Nt.CORNERSTONEFREETEXT,CodingSchemeDesignator:dt.CodingSchemeDesignator,CodeMeaning:n.text}),g}}var Mt;(Ct=At).init("ArrowAnnotate",Et),Ct.registerLegacy();const{Bidirectional:xt}=u.BF.TID300;class Pt extends Rt{static getMeasurementData(e,t,n,a){const{defaultState:r,ReferencedFrameNumber:i}=yt.getSetupMeasurementData(e,t,a,Pt.toolType),o=r.annotation.metadata.referencedImageId,{ContentSequence:s}=e,c=d(s).find((e=>"Long Axis"===e.ConceptNameCodeSequence.CodeMeaning)),u=d(c.ContentSequence).find((e=>"SCOORD"===e.ValueType)),l=d(s).find((e=>"Short Axis"===e.ConceptNameCodeSequence.CodeMeaning)),m=d(l.ContentSequence).find((e=>"SCOORD"===e.ValueType)),g=[];[u,m].forEach((e=>{const{GraphicData:t}=e;for(let e=0;e<t.length;e+=2){const a=n(o,[t[e],t[e+1]]);g.push(a)}}));const f=r;return f.annotation.data={handles:{points:[g[0],g[1],g[2],g[3]],activeHandleIndex:0,textBox:{hasMoved:!1}},cachedStats:{[`imageId:${o}`]:{length:c.MeasuredValueSequence.NumericValue,width:l.MeasuredValueSequence.NumericValue}},frameNumber:i},f}static getTID300RepresentationArguments(e,t){const{data:n,finding:a,findingSites:r,metadata:i}=e,{cachedStats:o={},handles:s}=n,{referencedImageId:c}=i;if(!c)throw new Error("Bidirectional.getTID300RepresentationArguments: referencedImageId is not defined");const{length:u,width:d}=o[`imageId:${c}`]||{},{points:l}=s,m=[l[0],l[1]],g=[l[2],l[3]];let f,p;Math.sqrt(Math.pow(m[0][0]-m[1][0],2)+Math.pow(m[0][1]-m[1][1],2)+Math.pow(m[0][2]-m[1][2],2))>Math.sqrt(Math.pow(g[0][0]-g[1][0],2)+Math.pow(g[0][1]-g[1][1],2)+Math.pow(g[0][2]-g[1][2],2))?(f=m,p=g):(f=g,p=m);const h=t(c,f[0]),S=t(c,f[1]),I=t(c,p[0]),T=t(c,p[1]);return{longAxis:{point1:{x:h[0],y:h[1]},point2:{x:S[0],y:S[1]}},shortAxis:{point1:{x:I[0],y:I[1]},point2:{x:T[0],y:T[1]}},longAxisLength:u,shortAxisLength:d,trackingIdentifierTextValue:this.trackingIdentifierTextValue,finding:a,findingSites:r||[]}}}var _t;(Mt=Pt).init("Bidirectional",xt),Mt.registerLegacy();const{CobbAngle:vt}=u.BF.TID300;class wt extends Rt{static getMeasurementData(e,t,n,a){const{defaultState:r,NUMGroup:i,SCOORDGroup:o,ReferencedFrameNumber:s}=yt.getSetupMeasurementData(e,t,a,wt.toolType),c=r.annotation.metadata.referencedImageId,{GraphicData:u}=o,d=[];for(let e=0;e<u.length;e+=2){const t=n(c,[u[e],u[e+1]]);d.push(t)}const l=r;return l.annotation.data={handles:{points:[d[0],d[1],d[3]],activeHandleIndex:0,textBox:{hasMoved:!1}},cachedStats:{[`imageId:${c}`]:{angle:i?i.MeasuredValueSequence.NumericValue:null}},frameNumber:s},l}static getTID300RepresentationArguments(e,t){const{data:n,finding:a,findingSites:r,metadata:i}=e,{cachedStats:o={},handles:s}=n,{referencedImageId:c}=i;if(!c)throw new Error("Angle.getTID300RepresentationArguments: referencedImageId is not defined");const u=t(c,s.points[0]),d=t(c,s.points[1]),l=t(c,s.points[2]),m={x:u[0],y:u[1]},g={x:d[0],y:d[1]},f=g,p={x:l[0],y:l[1]},{angle:h}=o[`imageId:${c}`]||{};return{point1:m,point2:g,point3:f,point4:p,rAngle:h,trackingIdentifierTextValue:this.trackingIdentifierTextValue,finding:a,findingSites:r||[]}}}var bt;(_t=wt).init("Angle",vt),_t.registerLegacy();const{CobbAngle:Ut}=u.BF.TID300;class Ft extends Rt{static getMea