UNPKG

modified-dicom-pacs

Version:

A modified version of DICOM PACS implementation

2 lines 82.5 kB
/*! For license information please see 117.bundle.f625454f3e1aa757efb9.js.LICENSE.txt */ (globalThis.webpackChunk=globalThis.webpackChunk||[]).push([[117,483],{25271:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const o=async function(e,t,n,o=!1,i=!1){for(const t of n){const n=e.getViewport(t);if(!n)throw new Error(`Viewport with Id ${t} does not exist`);if(!n.addImages)return void console.warn(`Viewport with Id ${t} does not have addImages. Cannot add image segmentation to this viewport.`)}const r=n.map((async n=>e.getViewport(n).addImages(t,o,i)));await Promise.all(r)}},74260:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var o=n(6203);const i=async function(e,t,n,i=!1,r=!1){for(const t of n){const n=e.getViewport(t);if(!n)throw new Error(`Viewport with Id ${t} does not exist`);if(!(n instanceof o.A))return void console.warn(`Viewport with Id ${t} is not a BaseVolumeViewport. Cannot add volume to this viewport.`)}const a=n.map((async n=>{const o=e.getViewport(n);await o.addVolumes(t,i,r)}));await Promise.all(a)}},78988:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});const o=Symbol("DefaultSettings"),i=Symbol("RuntimeSettings"),r=Symbol("ObjectSettingsMap"),a=Symbol("Dictionary");class s{constructor(e){const t=Object.create(e instanceof s&&a in e?e[a]:null);Object.seal(Object.defineProperty(this,a,{value:t}))}set(e,t){return d(this[a],e,t,null)}get(e){return function(e,t){return e[t]}(this[a],e)}unset(e){return function(e,t){if(t.endsWith(".")){let n=0;const o=t,i=o.slice(0,-1),r=0===i.length;for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r||t.startsWith(o)||t===i)&&(delete e[t],++n);return n>0}return delete e[t]}(this[a],e+"")}forEach(e){l(this[a],e)}extend(){return new s(this)}import(e){c(e)&&Object.keys(e).forEach((t=>{d(this[a],t,e[t],null)}))}dump(){const e={};return l(this[a],((t,n)=>{void 0!==n&&u(e,t,n)})),e}static assert(e){return e instanceof s?e:s.getRuntimeSettings()}static getDefaultSettings(e=null){let t=s[o];if(t instanceof s||(t=new s,s[o]=t),e){const n={};return t.forEach((o=>{if(o.startsWith(e)){const i=o.split(`${e}.`)[1];n[i]=t.get(o)}})),n}return t}static getRuntimeSettings(){let e=s[i];return e instanceof s||(e=new s(s.getDefaultSettings()),s[i]=e),e}static getObjectSettings(e,t){let n=null;if(e instanceof s)n=e;else if("object"==typeof e&&null!==e){let o=s[r];o instanceof WeakMap||(o=new WeakMap,s[r]=o),n=o.get(e),n instanceof s||(n=new s(s.assert(s.getObjectSettings(t))),o.set(e,n))}return n}static extendRuntimeSettings(){return s.getRuntimeSettings().extend()}}function l(e,t){for(const n in e)t(n,e[n])}function d(e,t,n,o){return!!function(e){let t,n,o;if("string"!=typeof e||(t=e.length-1)<0)return!1;o=-1;for(;(n=e.indexOf(".",o+1))>=0;){if(n-o<2||n===t)return!1;o=n}return!0}(t)&&(c(n)?function(e,t,n,o){let i;if(o.has(n))return d(e,t,null,o);o.add(n),i=0;for(const r in n)Object.prototype.hasOwnProperty.call(n,r)&&(d(e,0===r.length?t:`${t}.${r}`,n[r],o)||++i);return o.delete(n),0===i}(e,t,n,o instanceof WeakSet?o:new WeakSet):(e[t]=n,!0))}function c(e){if("object"==typeof e&&null!==e){const t=Object.getPrototypeOf(e);if(t===Object.prototype||null===t)return!0}return!1}function u(e,t,n){const o=t.indexOf(".");if(o>=0){const i=t.slice(0,o);let r=e[i];if("object"!=typeof r||null===r){const t=r;r={},void 0!==t&&(r[""]=t),e[i]=r}u(r,t.slice(o+1,t.length),n)}else e[t]=n}s.getDefaultSettings().set("useCursors",!0)},88903:(e,t,n)=>{"use strict";n.d(t,{EPSILON:()=>r,MPR_CAMERA_VALUES:()=>a.A,RENDERING_DEFAULTS:()=>i,VIEWPORT_PRESETS:()=>s.A});n(21301);const o={MINIMUM_SLAB_THICKNESS:.05,MAXIMUM_RAY_DISTANCE:1e6};Object.freeze(o);const i=o,r=.001;var a=n(99753),s=n(59845);n(61507)},15453:(e,t,n)=>{"use strict";var o;n.d(t,{A:()=>i}),function(e){e.Interaction="interaction",e.Thumbnail="thumbnail",e.Prefetch="prefetch",e.Compute="compute"}(o||(o={}));const i=o},17702:(e,t,n)=>{"use strict";var o;n.d(t,{A:()=>i}),function(e){e.NO_DATA="noData",e.LOADING="loading",e.PRE_RENDER="preRender",e.RESIZE="resize",e.RENDERED="rendered"}(o||(o={}));const i=o},50002:(e,t,n)=>{"use strict";n.d(t,{BlendModes:()=>c,CalibrationTypes:()=>y,ContourType:()=>p,DynamicOperatorType:()=>I,Events:()=>o.A,GeometryType:()=>m,ImageQualityStatus:()=>E.A,InterpolationType:()=>a.A,MetadataModules:()=>b.A,OrientationAxis:()=>h.A,RequestType:()=>i.A,SharedArrayBufferModes:()=>g.A,VOILUTFunctionType:()=>w.A,VideoEnums:()=>C,ViewportStatus:()=>T.A,ViewportType:()=>r.A});var o=n(11731),i=n(15453),r=n(21432),a=n(67342),s=n(16265);const{BlendMode:l}=s.Ay;var d;!function(e){e[e.COMPOSITE=0]="COMPOSITE",e[e.MAXIMUM_INTENSITY_BLEND=1]="MAXIMUM_INTENSITY_BLEND",e[e.MINIMUM_INTENSITY_BLEND=2]="MINIMUM_INTENSITY_BLEND",e[e.AVERAGE_INTENSITY_BLEND=3]="AVERAGE_INTENSITY_BLEND"}(d||(d={}));const c=d;var u,h=n(45919),g=n(38698);!function(e){e.CONTOUR="contour",e.SURFACE="Surface"}(u||(u={}));const m=u;var f;!function(e){e.CLOSED_PLANAR="CLOSED_PLANAR",e.OPEN_PLANAR="OPEN_PLANAR"}(f||(f={}));const p=f;var v,w=n(15381);!function(e){e.SUM="SUM",e.AVERAGE="AVERAGE",e.SUBTRACT="SUBTRACT"}(v||(v={}));const I=v;var A;!function(e){e.NOT_APPLICABLE="",e.ERMF="ERMF",e.USER="User",e.PROJECTION="Proj",e.REGION="Region",e.ERROR="Error",e.UNCALIBRATED="Uncalibrated"}(A||(A={}));const y=A;var T=n(17702),E=n(89426),C=n(49465),b=n(29354)},29870:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>i,b1:()=>r,yj:()=>a,zb:()=>s});var o=n(49184);function i(e){if(!e)return;const{viewportUid:t,renderingEngineUid:n}=e.dataset;return r(t,n)}function r(e,t){if(!t||!e)return;const n=(0,o.Ay)(t);if(!n||n.hasBeenDestroyed)return;const i=n.getViewport(e);if(!i)return;const r=i.getFrameOfReferenceUID();return{viewport:i,renderingEngine:n,viewportId:e,renderingEngineId:t,FrameOfReferenceUID:r}}function a(e){const t=(0,o.qO)();for(let n=0;n<t.length;n++){const o=t[n];if(o.getViewport(e))return r(e,o.id)}}function s(){const e=[];return(0,o.qO)().forEach((t=>{t.getViewports().forEach((({element:t})=>{e.push(i(t))}))})),e}},79220:(e,t,n)=>{"use strict";n.r(t),n.d(t,{cancelLoadAll:()=>T,cancelLoadImage:()=>A,cancelLoadImages:()=>y,createAndCacheDerivedImage:()=>v,createAndCacheDerivedImages:()=>w,createAndCacheDerivedSegmentationImage:()=>x,createAndCacheDerivedSegmentationImages:()=>S,createAndCacheLocalImage:()=>I,loadAndCacheImage:()=>f,loadAndCacheImages:()=>p,loadImage:()=>m,registerImageLoader:()=>E,registerUnknownImageLoader:()=>C,unregisterAllImageLoaders:()=>b});var o=n(25534),i=n(13320),r=n(11731),a=n(51884),s=n(35678),l=n(775),d=n(92136);const c={};let u;function h(e,t){const n=e.indexOf(":"),o=e.substring(0,n),i=c[o];if(null==i){if(void 0!==u)return u(e);throw new Error("loadImageFromImageLoader: no image loader for imageId")}const l=i(e,t);return l.promise.then((function(e){(0,s.triggerEvent)(a.A,r.A.IMAGE_LOADED,{image:e})}),(function(t){const n={imageId:e,error:t};(0,s.triggerEvent)(a.A,r.A.IMAGE_LOAD_FAILED,n)})),l}function g(e,t){if(t.ignoreCache)return h(e,t);let n=o.A.getImageLoadObject(e);if(void 0!==n)return n;const r=o.A.getVolumeContainingImageId(e);if(r?.volume?.loadStatus?.loaded){const{volume:t,imageIdIndex:o}=r;return t instanceof i.QV&&(n=t.convertToCornerstoneImage(e,o)),n}const a=o.A.getCachedImageBasedOnImageURI(e);return a?(n=a.imageLoadObject,n):(n=h(e,t),n)}function m(e,t={priority:0,requestType:"prefetch"}){if(void 0===e)throw new Error("loadImage: parameter imageId must not be undefined");return g(e,t).promise}function f(e,t={priority:0,requestType:"prefetch"}){if(void 0===e)throw new Error("loadAndCacheImage: parameter imageId must not be undefined");const n=g(e,t);return o.A.getImageLoadObject(e)||o.A.putImageLoadObject(e,n).catch((e=>{console.warn(e)})),n.promise}function p(e,t={priority:0,requestType:"prefetch"}){if(!e||0===e.length)throw new Error("loadAndCacheImages: parameter imageIds must be list of image Ids");return e.map((e=>f(e,t)))}function v(e,t={},n=!1){if(void 0===e)throw new Error("createAndCacheDerivedImage: parameter imageId must not be undefined");void 0===t.imageId&&(t.imageId=`derived:${(0,s.uuidv4)()}`);const{imageId:i,skipCreateBuffer:r,onCacheAdd:a}=t,l=d.metaData.get("imagePlaneModule",e),c=l.rows*l.columns,{TypedArrayConstructor:u}=(0,s.getBufferConfiguration)(t.targetBufferType,c),h=new u(r?1:c),g=i;["imagePixelModule","imagePlaneModule","generalSeriesModule"].forEach((t=>{s.genericMetadataProvider.add(g,{type:t,metadata:d.metaData.get(t,e)})}));const m=I({scalarData:h,onCacheAdd:a,skipCreateBuffer:r},i,!0),f={promise:Promise.resolve(m)};return n||o.A.putImageLoadObject(g,f),f.promise}function w(e,t={}){if(0===e?.length)throw new Error("createAndCacheDerivedImages: parameter imageIds must be list of image Ids");const n=[],o=e.map((e=>{const o={imageId:t.getDerivedImageId?.(e)||`derived:${(0,s.uuidv4)()}`,...t};return n.push(o.imageId),v(e,o)}));return{imageIds:n,promises:o}}function I(e,t,n=!1){const i=d.metaData.get("imagePlaneModule",t),r=i.rows*i.columns,a={imageId:t,intercept:0,windowCenter:0,windowWidth:0,color:!1,numComps:1,slope:1,minPixelValue:0,maxPixelValue:255,voiLUTFunction:void 0,rows:i.rows,columns:i.columns,getCanvas:void 0,height:i.rows,width:i.columns,rgba:void 0,columnPixelSpacing:i.columnPixelSpacing,rowPixelSpacing:i.rowPixelSpacing,invert:!1};if(e.scalarData){const t=e.scalarData;if(!(t instanceof Uint8Array||t instanceof Float32Array||t instanceof Uint16Array||t instanceof Int16Array))throw new Error("To use createLocalVolume you should pass scalarData of type Uint8Array, Uint16Array, Int16Array or Float32Array");a.sizeInBytes=t.byteLength,a.getPixelData=()=>t}else if(!0!==e.skipCreateBuffer){const{numBytes:t,TypedArrayConstructor:n}=(0,s.getBufferConfiguration)(e.targetBufferType,r),o=new n(r);a.sizeInBytes=t,a.getPixelData=()=>o}e.onCacheAdd?.(a);const l={promise:Promise.resolve(a)};return n||o.A.putImageLoadObject(a.imageId,l),a}function A(e){l.A.filterRequests((({additionalDetails:t})=>!t.imageId||t.imageId!==e));const t=o.A.getImageLoadObject(e);t&&t.cancelFn()}function y(e){e.forEach((e=>A(e)))}function T(){const e=l.A.getRequestPool();Object.keys(e).forEach((t=>{const n=e[t];Object.keys(n).forEach((e=>{const t=n[e].pop().additionalDetails,{imageId:i,volumeId:r}=t;let a;i?a=o.A.getImageLoadObject(i):r&&(a=o.A.getVolumeLoadObject(r)),a&&a.cancel()})),l.A.clearRequestStack(t)}))}function E(e,t){c[e]=t}function C(e){const t=u;return u=e,t}function b(){Object.keys(c).forEach((e=>delete c[e])),u=void 0}function S(e,t={targetBufferType:"Uint8Array"}){return w(e,t)}function x(e,t={targetBufferType:"Uint8Array"}){return v(e,t)}},82041:(e,t,n)=>{"use strict";n.r(t),n.d(t,{createAndCacheDerivedSegmentationVolume:()=>D,createAndCacheDerivedVolume:()=>y,createAndCacheVolume:()=>A,createAndCacheVolumeFromImages:()=>E,createLocalSegmentationVolume:()=>_,createLocalVolume:()=>T,getUnknownVolumeLoaderSchema:()=>x,getVolumeLoaderSchemes:()=>b,loadVolume:()=>I,registerUnknownVolumeLoader:()=>S,registerVolumeLoader:()=>C});n(3622);var o=n(51250),i=n(45128),r=n(77076),a=n(25534),s=n(11731),l=n(51884),d=n(13292),c=n(48463),u=n.n(c),h=n(35678),g=n(71702),m=n(51631);function f(e){const{dimensions:t,metadata:n,spacing:r,direction:a,origin:s}=e,{PhotometricInterpretation:l}=n;let d=1;"RGB"===l&&(d=3);const c=o.Ay.newInstance(),u={numberOfComponents:d};if(c.setDimensions(t),c.setSpacing(r),c.setDirection(a),c.setOrigin(s),e.isDynamicVolume()){!function(e,t,n){t.forEach(((t,o)=>{const r=i.Ay.newInstance({name:`timePoint-${o}`,values:t,...n});e.getPointData().addArray(r)})),e.getPointData().setActiveScalars("timePoint-0")}(c,e.getScalarDataArrays(),u)}else{!function(e,t,n){const o=i.Ay.newInstance({name:"Pixels",values:t,...n});e.getPointData().setScalars(o)}(c,e.getScalarData(),u)}return c}const p={};let v;function w(e,t){const n=e.indexOf(":"),o=e.substring(0,n);let i=p[o];if(null==i){if(null==v||"function"!=typeof v)throw new Error(`No volume loader for scheme ${o} has been registered`);i=v}const r=i(e,t);return(0,m.setupCacheOptimizationEventListener)(e),r.promise.then((function(e){(0,d.A)(l.A,s.A.VOLUME_LOADED,{volume:e})}),(function(t){const n={volumeId:e,error:t};(0,d.A)(l.A,s.A.VOLUME_LOADED_FAILED,n)})),r}function I(e,t={imageIds:[]}){if(void 0===e)throw new Error("loadVolume: parameter volumeId must not be undefined");let n=a.A.getVolumeLoadObject(e);return void 0!==n?n.promise:(n=w(e,t),n.promise.then((e=>(e.imageData=f(e),e))))}async function A(e,t){if(void 0===e)throw new Error("createAndCacheVolume: parameter volumeId must not be undefined");let n=a.A.getVolumeLoadObject(e);return void 0!==n||(n=w(e,t),n.promise.then((e=>{e.imageData=f(e)})),a.A.putVolumeLoadObject(e,n).catch((e=>{throw e}))),n.promise}async function y(e,t){const n=a.A.getVolume(e);if(!n)throw new Error(`Cannot created derived volume: Referenced volume with id ${e} does not exist.`);let{volumeId:s}=t;const{targetBuffer:l}=t;void 0===s&&(s=(0,h.uuidv4)());const{metadata:d,dimensions:c,spacing:g,origin:m,direction:f}=n,p=n.getScalarData().length,{volumeScalarData:v,numBytes:w}=P(l,p),I=i.Ay.newInstance({name:"Pixels",numberOfComponents:1,values:v}),A=o.Ay.newInstance();A.setDimensions(c),A.setSpacing(g),A.setDirection(f),A.setOrigin(m),A.getPointData().setScalars(I);const y=new r.Q({volumeId:s,metadata:u()(d),dimensions:[c[0],c[1],c[2]],spacing:g,origin:m,direction:f,imageData:A,scalarData:v,sizeInBytes:w,imageIds:[],referencedVolumeId:e}),T={promise:Promise.resolve(y)};return await a.A.putVolumeLoadObject(s,T),y}function T(e,t,n=!1){const{metadata:l,dimensions:d,spacing:c,origin:g,direction:m,targetBuffer:f}=e;let{scalarData:p}=e;const v=["Uint8Array","Float32Array","Uint16Array","Int16Array"],w=d[0]*d[1]*d[2];if(!p||!v.includes(p.constructor.name)){if(!f?.type||!v.includes(f.type))throw new Error("createLocalVolume: parameter scalarData must be provided and must be either Uint8Array, Float32Array, Uint16Array or Int16Array");({volumeScalarData:p}=P(f,w))}void 0===t&&(t=(0,h.uuidv4)());const I=a.A.getVolume(t);if(I)return I;const A=p?p.buffer.byteLength:4*w;if(!a.A.isCacheable(A))throw new Error(s.A.CACHE_SIZE_EXCEEDED);const y=i.Ay.newInstance({name:"Pixels",numberOfComponents:1,values:p}),T=o.Ay.newInstance();T.setDimensions(d),T.setSpacing(c),T.setDirection(m),T.setOrigin(g),T.getPointData().setScalars(y);const E=new r.Q({volumeId:t,metadata:u()(l),dimensions:[d[0],d[1],d[2]],spacing:c,origin:g,direction:m,imageData:T,scalarData:p,sizeInBytes:A,referencedImageIds:e.referencedImageIds||[],referencedVolumeId:e.referencedVolumeId,imageIds:e.imageIds||[]});if(n)return E;const C={promise:Promise.resolve(E)};return a.A.putVolumeLoadObject(t,C),E}async function E(e,t,n={}){const{preventCache:o=!1}=n;if(void 0===t)throw new Error("createAndCacheVolumeFromImages: parameter imageIds must not be undefined");if(void 0===e)throw new Error("createAndCacheVolumeFromImages: parameter volumeId must not be undefined");const i=a.A.getVolume(e);if(i)return Promise.resolve(i);const s=(0,h.generateVolumePropsFromImageIds)(t,e),l=s.imageIds.map(((e,t)=>a.A.getImageLoadObject(e).promise.then((e=>{const n=e.getPixelData(),o=t*e.rows*e.columns;s.scalarData.set(n,o)}))));await Promise.all(l);const d=new r.Q({...s,referencedImageIds:t,...n});(0,m.performCacheOptimizationForVolume)(d);const c={promise:Promise.resolve(d)};return o||a.A.putVolumeLoadObject(e,c),c.promise}function C(e,t){p[e]=t}function b(){return Object.keys(p)}function S(e){const t=v;return v=e,t}function x(){return v.name}async function D(e,t={}){return y(e,{...t,targetBuffer:{type:"Uint8Array"}})}async function _(e,t,n=!1){return e.scalarData||(e.scalarData=new Uint8Array(e.dimensions[0]*e.dimensions[1]*e.dimensions[2])),T(e,t,n)}function P(e,t){const{useNorm16Texture:n}=(0,g.D0)().rendering,{TypedArrayConstructor:o,numBytes:i}=(0,h.getBufferConfiguration)(e?.type,t,{use16BitTexture:n,isVolumeBuffer:!0});if(!a.A.isCacheable(i))throw new Error(s.A.CACHE_SIZE_EXCEEDED);let r;if(e?.sharedArrayBuffer){r=new o(new SharedArrayBuffer(i))}else r=new o(t);return{volumeScalarData:r,numBytes:i}}},55692:(e,t,n)=>{"use strict";n.r(t),n.d(t,{addProvider:()=>i,get:()=>s,removeAllProviders:()=>a,removeProvider:()=>r});const o=[];function i(e,t=0){let n;for(n=0;n<o.length&&!(o[n].priority<=t);n++);o.splice(n,0,{priority:t,provider:e})}function r(e){for(let t=0;t<o.length;t++)if(o[t].provider===e){o.splice(t,1);break}}function a(){for(;o.length>0;)o.pop()}function s(e,...t){for(let n=0;n<o.length;n++){const i=o[n].provider(e,...t);if(void 0!==i)return i}}},775:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var o=n(79927),i=n(15453);const r=new o.R("imageLoadPool");r.grabDelay=0,r.setMaxSimultaneousRequests(i.A.Interaction,1e3),r.setMaxSimultaneousRequests(i.A.Thumbnail,1e3),r.setMaxSimultaneousRequests(i.A.Prefetch,1e3);const a=r},79927:(e,t,n)=>{"use strict";n.d(t,{R:()=>r});var o=n(15453),i=n(35678);class r{constructor(e){this.numRequests={interaction:0,thumbnail:0,prefetch:0,compute:0},this.id=e||(0,i.uuidv4)(),this.requestPool={interaction:{0:[]},thumbnail:{0:[]},prefetch:{0:[]},compute:{0:[]}},this.grabDelay=5,this.awake=!1,this.numRequests={interaction:0,thumbnail:0,prefetch:0,compute:0},this.maxNumRequests={interaction:6,thumbnail:6,prefetch:5,compute:1e3}}setMaxSimultaneousRequests(e,t){this.maxNumRequests[e]=t}getMaxSimultaneousRequests(e){return this.maxNumRequests[e]}destroy(){this.timeoutHandle&&window.clearTimeout(this.timeoutHandle)}addRequest(e,t,n,o=0){const i={requestFn:e,type:t,additionalDetails:n};void 0===this.requestPool[t][o]&&(this.requestPool[t][o]=[]),this.requestPool[t][o].push(i),this.startGrabbing()}filterRequests(e){Object.keys(this.requestPool).forEach((t=>{const n=this.requestPool[t];Object.keys(n).forEach((t=>{n[t]=n[t].filter((t=>e(t)))}))}))}clearRequestStack(e){if(!this.requestPool[e])throw new Error(`No category for the type ${e} found`);this.requestPool[e]={0:[]}}sendRequests(e){const t=this.maxNumRequests[e]-this.numRequests[e];let n=0;for(let o=0;o<t;o++){const t=this.getNextRequest(e);if(null===t)return!1;if(t){let o;this.numRequests[e]++,this.awake=!0;try{o=t.requestFn()}catch(e){console.warn("sendRequest failed",e)}o?.finally?o.finally((()=>{this.numRequests[e]--,this.startAgain()})):(this.numRequests[e]--,n++)}}return n&&this.startAgain(),!0}getNextRequest(e){const t=this.getSortedPriorityGroups(e);for(const n of t)if(this.requestPool[e][n].length)return this.requestPool[e][n].shift();return null}startGrabbing(){const e=this.sendRequests(o.A.Interaction),t=this.sendRequests(o.A.Thumbnail),n=this.sendRequests(o.A.Prefetch),i=this.sendRequests(o.A.Compute);e||t||n||i||(this.awake=!1)}startAgain(){this.awake&&(void 0!==this.grabDelay?this.timeoutHandle||(this.timeoutHandle=window.setTimeout((()=>{this.timeoutHandle=null,this.startGrabbing()}),this.grabDelay)):this.startGrabbing())}getSortedPriorityGroups(e){return Object.keys(this.requestPool[e]).map(Number).filter((t=>this.requestPool[e][t].length)).sort(((e,t)=>e-t))}getRequestPool(){return this.requestPool}}},13292:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var o=n(51884);function i(e=o.A,t,n=null){if(!t)throw new Error("Event type was not defined");const i=new CustomEvent(t,{detail:n,cancelable:!0});return e.dispatchEvent(i)}},61874:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var o=n(99178),i=n(50002),r=n(79927);const a=class{constructor(){this.workerRegistry={},this.workerPoolManager=new r.R("webworker")}registerWorker(e,t,n={}){const{maxWorkerInstances:i=1,overwrite:r=!1,autoTerminateOnIdle:a={enabled:!1,idleTimeThreshold:3e3}}=n;if(this.workerRegistry[e]&&!r)return void console.warn(`Worker type '${e}' is already registered...`);r&&this.workerRegistry[e]?.idleCheckIntervalId&&clearInterval(this.workerRegistry[e].idleCheckIntervalId);const s={workerFn:null,instances:[],loadCounters:[],lastActiveTime:[],nativeWorkers:[],autoTerminateOnIdle:a.enabled,idleCheckIntervalId:null,idleTimeThreshold:a.idleTimeThreshold};s.loadCounters=Array(i).fill(0),s.lastActiveTime=Array(i).fill(null);for(let e=0;e<i;e++){const e=t();s.instances.push(o.LV(e)),s.nativeWorkers.push(e),s.workerFn=t}this.workerRegistry[e]=s}getNextWorkerAPI(e){const t=this.workerRegistry[e];if(!t)return console.error(`Worker type '${e}' is not registered.`),null;const n=t.instances.filter((e=>null!==e));let i=0,r=t.loadCounters[0]||0;for(let e=1;e<n.length;e++){const n=t.loadCounters[e]||0;n<r&&(i=e,r=n)}if(null===t.instances[i]){const e=t.workerFn();t.instances[i]=o.LV(e),t.nativeWorkers[i]=e}return t.loadCounters[i]+=1,{api:t.instances[i],index:i}}executeTask(e,t,n={},{requestType:r=i.RequestType.Compute,priority:a=0,options:s={},callbacks:l=[]}={}){return new Promise(((i,d)=>{this.workerPoolManager.addRequest((async()=>{const{api:r,index:a}=this.getNextWorkerAPI(e);if(!r){const t=new Error(`No available worker instance for '${e}'`);return console.error(t),void d(t)}try{let s=[];l.length&&(s=l.map((e=>o.BX(e))));const d=this.workerRegistry[e];d.processing=!0;const c=await r[t](n,...s);d.processing=!1,d.lastActiveTime[a]=Date.now(),d.autoTerminateOnIdle&&!d.idleCheckIntervalId&&d.idleTimeThreshold&&(d.idleCheckIntervalId=setInterval((()=>{this.terminateIdleWorkers(e,d.idleTimeThreshold)}),d.idleTimeThreshold)),i(c)}catch(n){console.error(`Error executing method '${t}' on worker '${e}':`,n),d(n)}finally{this.workerRegistry[e].loadCounters[a]--}}),r,s,a)}))}terminateIdleWorkers(e,t){const n=this.workerRegistry[e];if(n.processing)return;const o=Date.now();n.instances.forEach(((i,r)=>{const a=n.lastActiveTime[r];!(null!==a&&n.loadCounters[r]>0)&&o-a>t&&this.terminateWorkerInstance(e,r)}))}terminate(e){const t=this.workerRegistry[e];t?t.instances.forEach(((t,n)=>{this.terminateWorkerInstance(e,n)})):console.error(`Worker type '${e}' is not registered.`)}terminateWorkerInstance(e,t){const n=this.workerRegistry[e],i=n.instances[t];null!==i&&(i[o.A2](),n.nativeWorkers[t].terminate(),n.instances[t]=null,n.lastActiveTime[t]=null)}}},79697:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var o=n(61738),i=n(92136);const r="viewport-element";function a(e,t){if(o.wk.svgNodeCache[e])return o.wk.svgNodeCache[e][t]?o.wk.svgNodeCache[e][t].domRef:void 0}function s(e,t,n,i){if(!o.wk.svgNodeCache[t])return null;o.wk.svgNodeCache[t][i]={touched:!0,domRef:n},e.appendChild(n)}function l(e,t){o.wk.svgNodeCache[e]&&o.wk.svgNodeCache[e][t]&&(o.wk.svgNodeCache[e][t].touched=!0)}function d(e,t){o.wk.svgNodeCache[t]&&Object.keys(o.wk.svgNodeCache[t]).forEach((n=>{const i=o.wk.svgNodeCache[t][n];!i.touched&&i.domRef&&(e.removeChild(i.domRef),delete o.wk.svgNodeCache[t][n])}))}const c=function(e){const t=(0,i.getEnabledElement)(e),{viewportId:n,renderingEngineId:c}=t,u=`${n}:${c}`,h=function(e){const t=`.${r}`,n=e.querySelector(t);return n.querySelector(":scope > .svg-layer")}(e);return Object.keys(o.wk.svgNodeCache[u]).forEach((e=>{o.wk.svgNodeCache[u][e].touched=!1})),{svgLayerElement:h,svgNodeCacheForCanvas:o.wk.svgNodeCache,getSvgNode:a.bind(this,u),appendNode:s.bind(this,h,u),setNodeTouched:l.bind(this,u),clearUntouched:d.bind(this,h,u)}};const u=function(e,t){const n=c(e);t(n),n.clearUntouched()}},12468:(e,t,n)=>{"use strict";var o;n.d(t,{A:()=>i}),function(e){e.Active="Active",e.Passive="Passive",e.Enabled="Enabled",e.Disabled="Disabled"}(o||(o={}));const i=o},39371:(e,t,n)=>{"use strict";n.d(t,{segmentation:()=>i,utilities:()=>o});n(35373),n(61738),n(55965),n(42375),n(2746);var o=n(74119),i=(n(32916),n(40969),n(45238),n(63421));n(81848),n(65043),n(84901)},35837:(e,t,n)=>{"use strict";n.d(t,{getState:()=>o.A,style:()=>i.A});var o=n(70692),i=(n(80456),n(31862))},45238:(e,t,n)=>{"use strict";n.d(t,{config:()=>o,state:()=>i});var o=n(35837),i=(n(48428),n(42351),n(38296));n(21009),n(22581),n(16122)},27630:(e,t,n)=>{"use strict";n.d(t,{A:()=>I});var o=n(61738),i=n(84901),r=n(51008),a=n.n(r),s=n(48463),l=n.n(s),d=n(92136),c=n(32916),u=n(40233);const{Active:h,Passive:g,Enabled:m,Disabled:f}=i.ToolModes,p=[{mouseButton:i.MouseBindings.Primary}];class v{constructor(e){this.viewportsInfo=[],this.toolOptions={},this.currentActivePrimaryToolName=null,this.prevActivePrimaryToolName=null,this.restoreToolOptions={},this._toolInstances={},this.id=e}getViewportIds(){return this.viewportsInfo.map((({viewportId:e})=>e))}getViewportsInfo(){return this.viewportsInfo.slice()}getToolInstance(e){const t=this._toolInstances[e];if(t)return t;console.warn(`'${e}' is not registered with this toolGroup (${this.id}).`)}getToolInstances(){return this._toolInstances}hasTool(e){return!!this._toolInstances[e]}addTool(e,t={}){const n=o.wk.tools[e],i=void 0!==e&&""!==e,r=this.toolOptions[e];if(!i)return void console.warn("Tool with configuration did not produce a toolName: ",t);if(!n)return void console.warn(`'${e}' is not registered with the library. You need to use cornerstoneTools.addTool to register it.`);if(r)return void console.warn(`'${e}' is already registered for ToolGroup ${this.id}.`);const{toolClass:a}=n,s=new a({name:e,toolGroupId:this.id,configuration:t});this._toolInstances[e]=s}addToolInstance(e,t,n={}){let i=o.wk.tools[e]?.toolClass;if(!i){const n=o.wk.tools[t].toolClass;class r extends n{}r.toolName=e,i=r,o.wk.tools[e]={toolClass:r}}this.addTool(i.toolName,n)}addViewport(e,t){if("string"!=typeof e)throw new Error("viewportId must be defined and be a string");const n=(0,d.getRenderingEngines)();if(!t&&n.length>1)throw new Error("You must specify a renderingEngineId when there are multiple rendering engines.");const o=t||n[0].id;this.viewportsInfo.some((({viewportId:t})=>t===e))||this.viewportsInfo.push({viewportId:e,renderingEngineId:o});const r=this.getActivePrimaryMouseButtonTool();d.Settings.getRuntimeSettings().get("useCursors")&&this.setViewportsCursorByToolName(r);const a={toolGroupId:this.id,viewportId:e,renderingEngineId:o};(0,d.triggerEvent)(d.eventTarget,i.Events.TOOLGROUP_VIEWPORT_ADDED,a)}removeViewports(e,t){const n=[];if(this.viewportsInfo.forEach(((o,i)=>{let r=!1;o.renderingEngineId===e&&(r=!0,t&&o.viewportId!==t&&(r=!1)),r&&n.push(i)})),n.length)for(let e=n.length-1;e>=0;e--)this.viewportsInfo.splice(n[e],1);const o={toolGroupId:this.id,viewportId:t,renderingEngineId:e};(0,d.triggerEvent)(d.eventTarget,i.Events.TOOLGROUP_VIEWPORT_REMOVED,o)}setActiveStrategy(e,t){const n=this._toolInstances[e];void 0!==n?n.setActiveStrategy(t):console.warn(`Tool ${e} not added to toolGroup, can't set tool configuration.`)}setToolMode(e,t,n={}){e?t!==i.ToolModes.Active?t!==i.ToolModes.Passive?t!==i.ToolModes.Enabled?t!==i.ToolModes.Disabled?console.warn("setToolMode: mode must be defined"):this.setToolDisabled(e):this.setToolEnabled(e):this.setToolPassive(e):this.setToolActive(e,n||this.restoreToolOptions[e]):console.warn("setToolMode: toolName must be defined")}setToolActive(e,t={}){const n=this._toolInstances[e];if(void 0===n)return void console.warn(`Tool ${e} not added to toolGroup, can't set tool mode.`);if(!n)return void console.warn(`'${e}' instance ${n} is not registered with this toolGroup, can't set tool mode.`);const o={bindings:[...this.toolOptions[e]?this.toolOptions[e].bindings:[],...t.bindings?t.bindings:[]].reduce(((e,t)=>{const n=void 0!==t.numTouchPoints,o=void 0!==t.mouseButton;return e.some((e=>w(e,t)))||!n&&!o||e.push(t),e}),[]),mode:h};this.toolOptions[e]=o,this._toolInstances[e].mode=h;const r=d.Settings.getRuntimeSettings().get("useCursors");if(this._hasMousePrimaryButtonBinding(t)&&r)this.setViewportsCursorByToolName(e);else{if(!this.getActivePrimaryMouseButtonTool()&&r){const e=c.MouseCursor.getDefinedCursor("default");this._setCursorForViewports(e)}}this._hasMousePrimaryButtonBinding(t)&&(null===this.prevActivePrimaryToolName?this.prevActivePrimaryToolName=e:this.prevActivePrimaryToolName=this.currentActivePrimaryToolName,this.currentActivePrimaryToolName=e),"function"==typeof n.onSetToolActive&&n.onSetToolActive(),this._renderViewports();const a={toolGroupId:this.id,toolName:e,toolBindingsOptions:t};(0,d.triggerEvent)(d.eventTarget,i.Events.TOOL_ACTIVATED,a),this._triggerToolModeChangedEvent(e,h,t)}setToolPassive(e,t){const n=this._toolInstances[e];if(void 0===n)return void console.warn(`Tool ${e} not added to toolGroup, can't set tool mode.`);const o=this.getToolOptions(e),i=Object.assign({bindings:o?o.bindings:[]},o,{mode:g}),r=Array.isArray(t?.removeAllBindings)?t.removeAllBindings:this.getDefaultPrimaryBindings();i.bindings=i.bindings.filter((e=>!0!==t?.removeAllBindings&&!r.some((t=>w(e,t)))));let a=g;0!==i.bindings.length&&(a=h,i.mode=a),this.toolOptions[e]=i,n.mode=a,"function"==typeof n.onSetToolPassive&&n.onSetToolPassive(),this._renderViewports(),this._triggerToolModeChangedEvent(e,g)}setToolEnabled(e){const t=this._toolInstances[e];if(void 0===t)return void console.warn(`Tool ${e} not added to toolGroup, can't set tool mode.`);const n={bindings:[],mode:m};this.toolOptions[e]=n,t.mode=m,"function"==typeof t.onSetToolEnabled&&t.onSetToolEnabled(),this._renderViewports(),this._triggerToolModeChangedEvent(e,m)}setToolDisabled(e){const t=this._toolInstances[e];if(void 0===t)return void console.warn(`Tool ${e} not added to toolGroup, can't set tool mode.`);const n={bindings:[],mode:f};this.restoreToolOptions[e]=this.toolOptions[e],this.toolOptions[e]=n,t.mode=f,"function"==typeof t.onSetToolDisabled&&t.onSetToolDisabled(),this._renderViewports(),this._triggerToolModeChangedEvent(e,f)}getToolOptions(e){const t=this.toolOptions[e];if(void 0!==t)return t}getActivePrimaryMouseButtonTool(){return Object.keys(this.toolOptions).find((e=>{const t=this.toolOptions[e];return t.mode===h&&this._hasMousePrimaryButtonBinding(t)}))}setViewportsCursorByToolName(e,t){const n=this._getCursor(e,t);this._setCursorForViewports(n)}_getCursor(e,t){let n,o;return t&&(n=`${e}.${t}`,o=c.SVGMouseCursor.getDefinedCursor(n,!0),o)?o:(n=`${e}`,o=c.SVGMouseCursor.getDefinedCursor(n,!0),o||(n=e,o=c.SVGMouseCursor.getDefinedCursor(n,!0),o||c.MouseCursor.getDefinedCursor("default")))}_setCursorForViewports(e){this.viewportsInfo.forEach((({renderingEngineId:t,viewportId:n})=>{const o=(0,d.getEnabledElementByIds)(n,t);if(!o)return;const{viewport:i}=o;(0,u.initElementCursor)(i.element,e)}))}setToolConfiguration(e,t,n){const o=this._toolInstances[e];if(void 0===o)return console.warn(`Tool ${e} not present, can't set tool configuration.`),!1;let i;return i=n?t:Object.assign(o.configuration,t),o.configuration=i,"function"==typeof o.onSetToolConfiguration&&o.onSetToolConfiguration(),this._renderViewports(),!0}getDefaultMousePrimary(){return i.MouseBindings.Primary}getDefaultPrimaryBindings(){return p}getToolConfiguration(e,t){if(void 0===this._toolInstances[e])return void console.warn(`Tool ${e} not present, can't set tool configuration.`);const n=a()(this._toolInstances[e].configuration,t)||this._toolInstances[e].configuration;return l()(n)}getPrevActivePrimaryToolName(){return this.prevActivePrimaryToolName}clone(e,t=null){let n=o.dU.getToolGroup(e);return n?(console.warn(`ToolGroup ${e} already exists`),n):(n=o.dU.createToolGroup(e),t=t??(()=>!0),Object.keys(this._toolInstances).filter(t).forEach((e=>{const t=this._toolInstances[e],o=this.toolOptions[e],i=t.mode;n.addTool(e),n.setToolMode(e,i,{bindings:o.bindings??[]})})),n)}_hasMousePrimaryButtonBinding(e){const t=this.getDefaultPrimaryBindings();return e?.bindings?.some((e=>t.some((t=>w(e,t)))))}_renderViewports(){this.viewportsInfo.forEach((({renderingEngineId:e,viewportId:t})=>{(0,d.getRenderingEngine)(e).renderViewport(t)}))}_triggerToolModeChangedEvent(e,t,n){const o={toolGroupId:this.id,toolName:e,mode:t,toolBindingsOptions:n};(0,d.triggerEvent)(d.eventTarget,i.Events.TOOL_MODE_CHANGED,o)}}function w(e,t){return e.mouseButton===t.mouseButton&&(e.numTouchPoints===t.numTouchPoints&&e.modifierKey===t.modifierKey)}const I=function(e){if(o.wk.toolGroups.some((t=>t.id===e)))return void console.warn(`'${e}' already exists.`);const t=new v(e);return o.wk.toolGroups.push(t),t}},648:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});var o=n(61738),i=n(59755);const r=function(){const e=[...o.wk.toolGroups];for(const t of e)(0,i.A)(t.id);o.wk.toolGroups=[]}},59755:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var o=n(61738),i=n(63421),r=n(49521);const a=function(e){const t=o.wk.toolGroups.findIndex((t=>t.id===e));t>-1&&(r.px.removeToolGroup(e),(0,i.removeSegmentationsFromToolGroup)(e),o.wk.toolGroups.splice(t,1))}},3193:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var o=n(61738);const i=function(){return o.wk.toolGroups}},29697:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var o=n(61738);const i=function(e){return o.wk.toolGroups.find((t=>t.id===e))}},64109:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var o=n(61738),i=n(84901);const r=[i.ToolModes.Active,i.ToolModes.Passive,i.ToolModes.Enabled];const a=function(e){return o.wk.toolGroups.filter((({toolOptions:t})=>{const n=Object.keys(t);for(let o=0;o<n.length;o++)if(e===n[o]&&t[e]&&r.includes(t[e].mode))return!0;return!1}))}},50720:(e,t,n)=>{"use strict";n.d(t,{A:()=>C});var o=n(44753),i=n(92136),r=n(24592),a=n(74119),s=n(96214),l=n(21090),d=n(38296),c=n(48428),u=n(21009),h=n(54177),g=n(2746),m=n(61738),f=n(84901),p=n(90252),v=n(21954),w=n(10910),I=n(40233),A=n(23072);const{transformWorldToIndex:y}=i.utilities;class T extends s.EC{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{preventHandleOutsideImage:!1,getTextLines:E}}){super(e,t),this.isPointNearTool=(e,t,n,o)=>{const r=(0,i.getEnabledElement)(e),{viewport:a}=r,{data:s}=t,{points:l}=s.handles;let d=a.worldToCanvas(l[0]),c=a.worldToCanvas(l[1]),u={start:{x:d[0],y:d[1]},end:{x:c[0],y:c[1]}},h=v.distanceToPoint([u.start.x,u.start.y],[u.end.x,u.end.y],[n[0],n[1]]);return h<=o||(d=a.worldToCanvas(l[2]),c=a.worldToCanvas(l[3]),u={start:{x:d[0],y:d[1]},end:{x:c[0],y:c[1]}},h=v.distanceToPoint([u.start.x,u.start.y],[u.end.x,u.end.y],[n[0],n[1]]),h<=o)},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:o}=n;t.highlighted=!0;const r=(0,p.getViewportIdsWithToolToRender)(o,this.getToolName());this.editData={annotation:t,viewportIdsToRender:r,movingTextBox:!1},this._activateModify(o);const a=(0,i.getEnabledElement)(o),{renderingEngine:s}=a;(0,A.A)(s,r),(0,I.hideElementCursor)(o),e.preventDefault()},this.handleSelectedCallback=(e,t,n)=>{const o=e.detail,{element:r}=o,a=t.data;t.highlighted=!0;let s,l=!1;n.worldPosition?l=!0:s=a.handles.points.findIndex((e=>e===n));const d=(0,p.getViewportIdsWithToolToRender)(r,this.getToolName());(0,I.hideElementCursor)(r),this.editData={annotation:t,viewportIdsToRender:d,handleIndex:s,movingTextBox:l},this._activateModify(r);const c=(0,i.getEnabledElement)(r),{renderingEngine:u}=c;(0,A.A)(u,d),e.preventDefault()},this._endCallback=e=>{const t=e.detail,{element:n}=t,{annotation:r,viewportIdsToRender:a,newAnnotation:s,hasMoved:l}=this.editData,{data:c}=r;if(s&&!l)return;c.handles.activeHandleIndex=null,this._deactivateModify(n),this._deactivateDraw(n),(0,I.resetElementCursor)(n);const{renderingEngine:u}=(0,i.getEnabledElement)(n);if(void 0!==this.editData.handleIndex){const{points:e}=c.handles,t=o.eR.distance(e[0],e[1]);if(o.eR.distance(e[2],e[3])>t){const t=[[...e[2]],[...e[3]]],n=[...e[0]],i=[...e[1]],r=o.Zc.create();o.Zc.set(r,t[1][0]-t[0][0],t[1][1]-t[1][0]);const a=o.Zc.create();o.Zc.set(a,-r[1],r[0]);const s=o.Zc.create();let l;o.Zc.set(s,i[0]-n[0],i[1]-n[0]),l=o.Zc.dot(s,a)>0?[n,i]:[i,n],c.handles.points=[t[0],t[1],l[0],l[1]]}}this.isHandleOutsideImage&&this.configuration.preventHandleOutsideImage&&(0,d.removeAnnotation)(r.annotationUID),(0,A.A)(u,a),s&&(0,h.dZ)(r),this.editData=null,this.isDrawing=!1},this._dragDrawCallback=e=>{this.isDrawing=!0;const t=e.detail,{currentPoints:n,element:r}=t,a=(0,i.getEnabledElement)(r),{renderingEngine:s,viewport:l}=a,{worldToCanvas:d}=l,{annotation:c,viewportIdsToRender:u,handleIndex:h}=this.editData,{data:g}=c,m=n.world;g.handles.points[h]=[...m];const f=g.handles.points.map(d),p={start:{x:f[0][0],y:f[0][1]},end:{x:f[1][0],y:f[1][1]}},v=(f[2][0],f[2][1],f[3][0],f[3][1],o.Zc.distance(f[0],f[1])/3),w=p.start.x-p.end.x,I=p.start.y-p.end.y,y=Math.sqrt(w*w+I*I),T=w/y,E=I/y,C=(p.start.x+p.end.x)/2,b=(p.start.y+p.end.y)/2,S=C+v*E,x=b-v*T,D=C-v*E,_=b+v*T;g.handles.points[2]=l.canvasToWorld([S,x]),g.handles.points[3]=l.canvasToWorld([D,_]),c.invalidated=!0,(0,A.A)(s,u),this.editData.hasMoved=!0},this._dragModifyCallback=e=>{this.isDrawing=!0;const t=e.detail,{element:n}=t,o=(0,i.getEnabledElement)(n),{renderingEngine:r}=o,{annotation:a,viewportIdsToRender:s,handleIndex:l,movingTextBox:d}=this.editData,{data:c}=a;if(d){const{deltaPoints:e}=t,n=e.world,{textBox:o}=c.handles,{worldPosition:i}=o;i[0]+=n[0],i[1]+=n[1],i[2]+=n[2],o.hasMoved=!0}else if(void 0===l){const{deltaPoints:e}=t,n=e.world;c.handles.points.forEach((e=>{e[0]+=n[0],e[1]+=n[1],e[2]+=n[2]})),a.invalidated=!0}else this._dragModifyHandle(e),a.invalidated=!0;(0,A.A)(r,s)},this._dragModifyHandle=e=>{const t=e.detail,{currentPoints:n,element:r}=t,a=(0,i.getEnabledElement)(r),{viewport:s}=a,{annotation:l,handleIndex:d}=this.editData,{data:c}=l,u=n.world,h=[s.worldToCanvas(c.handles.points[0]),s.worldToCanvas(c.handles.points[1]),s.worldToCanvas(c.handles.points[2]),s.worldToCanvas(c.handles.points[3])],g={start:{x:h[0][0],y:h[0][1]},end:{x:h[1][0],y:h[1][1]}},m={start:{x:h[2][0],y:h[2][1]},end:{x:h[3][0],y:h[3][1]}},f=[...u],p=s.worldToCanvas(f);if(0===d||1===d){const e=h[0===d?1:0],t=o.Zc.set(o.Zc.create(),p[0]-e[0],p[1]-e[1]),n=o.Zc.set(o.Zc.create(),h[d][0]-e[0],h[d][1]-e[1]);o.Zc.normalize(t,t),o.Zc.normalize(n,n);const i={start:{x:e[0],y:e[1]},end:{x:p[0],y:p[1]}};if(this._movingLongAxisWouldPutItThroughShortAxis(i,m))return;const r=e,a=this._getSignedAngle(n,t);let l=h[2][0],u=h[2][1],g=h[3][0],v=h[3][1];l-=r[0],u-=r[1],g-=r[0],v-=r[1];const w=l*Math.cos(a)-u*Math.sin(a),I=l*Math.sin(a)+u*Math.cos(a),A=g*Math.cos(a)-v*Math.sin(a),y=g*Math.sin(a)+v*Math.cos(a);l=w+r[0],u=I+r[1],g=A+r[0],v=y+r[1];const T=s.canvasToWorld([l,u]),E=s.canvasToWorld([g,v]);c.handles.points[d]=f,c.handles.points[2]=T,c.handles.points[3]=E}else{const e=2===d?3:2,t={longLineSegment:{start:g.start,end:g.end},shortLineSegment:{start:m.start,end:m.end}},n=o.Zc.subtract(o.Zc.create(),[t.longLineSegment.end.x,t.longLineSegment.end.y],[t.longLineSegment.start.x,t.longLineSegment.start.y]),i=o.Zc.normalize(o.Zc.create(),n),r=o.Zc.subtract(o.Zc.create(),[p[0],p[1]],[h[d][0],h[d][1]]),a=o.Zc.length(r),l=this._getSignedAngle(i,r),u=Math.cos(l)*a,w=o.Zc.scaleAndAdd(o.Zc.create(),[h[e][0],h[e][1]],i,u);if(this._movingLongAxisWouldPutItThroughShortAxis({start:{x:p[0],y:p[1]},end:{x:w[0],y:w[1]}},{start:{x:t.longLineSegment.start.x,y:t.longLineSegment.start.y},end:{x:t.longLineSegment.end.x,y:t.longLineSegment.end.y}}))return;if(!v.intersectLine([p[0],p[1]],[w[0],w[1]],[g.start.x,g.start.y],[g.end.x,g.end.y]))return;c.handles.points[e]=s.canvasToWorld(w),c.handles.points[d]=f}},this.cancel=e=>{if(this.isDrawing){this.isDrawing=!1,this._deactivateDraw(e),this._deactivateModify(e),(0,I.resetElementCursor)(e);const{annotation:t,viewportIdsToRender:n,newAnnotation:o}=this.editData,{data:r}=t;t.highlighted=!1,r.handles.activeHandleIndex=null;const{renderingEngine:a}=(0,i.getEnabledElement)(e);return(0,A.A)(a,n),o&&(0,h.dZ)(t),this.editData=null,t.annotationUID}},this._activateDraw=e=>{m.wk.isInteractingWithTool=!0,e.addEventListener(f.Events.MOUSE_UP,this._endCallback),e.addEventListener(f.Events.MOUSE_DRAG,this._dragDrawCallback),e.addEventListener(f.Events.MOUSE_MOVE,this._dragDrawCallback),e.addEventListener(f.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(f.Events.TOUCH_TAP,this._endCallback),e.addEventListener(f.Events.TOUCH_END,this._endCallback),e.addEventListener(f.Events.TOUCH_DRAG,this._dragDrawCallback)},this._deactivateDraw=e=>{m.wk.isInteractingWithTool=!1,e.removeEventListener(f.Events.MOUSE_UP,this._endCallback),e.removeEventListener(f.Events.MOUSE_DRAG,this._dragDrawCallback),e.removeEventListener(f.Events.MOUSE_MOVE,this._dragDrawCallback),e.removeEventListener(f.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(f.Events.TOUCH_TAP,this._endCallback),e.removeEventListener(f.Events.TOUCH_END,this._endCallback),e.removeEventListener(f.Events.TOUCH_DRAG,this._dragDrawCallback)},this._activateModify=e=>{m.wk.isInteractingWithTool=!0,e.addEventListener(f.Events.MOUSE_UP,this._endCallback),e.addEventListener(f.Events.MOUSE_DRAG,this._dragModifyCallback),e.addEventListener(f.Events.MOUSE_CLICK,this._endCallback),e.addEventListener(f.Events.TOUCH_END,this._endCallback),e.addEventListener(f.Events.TOUCH_DRAG,this._dragModifyCallback),e.addEventListener(f.Events.TOUCH_TAP,this._endCallback)},this._deactivateModify=e=>{m.wk.isInteractingWithTool=!1,e.removeEventListener(f.Events.MOUSE_UP,this._endCallback),e.removeEventListener(f.Events.MOUSE_DRAG,this._dragModifyCallback),e.removeEventListener(f.Events.MOUSE_CLICK,this._endCallback),e.removeEventListener(f.Events.TOUCH_END,this._endCallback),e.removeEventListener(f.Events.TOUCH_DRAG,this._dragModifyCallback),e.removeEventListener(f.Events.TOUCH_TAP,this._endCallback)},this.renderAnnotation=(e,t)=>{let n=!0;const{viewport:o}=e,{element:i}=o;let r=(0,d.getAnnotations)(this.getToolName(),i);if(!r?.length)return n;if(r=this.filterInteractableAnnotationsForElement(i,r),!r?.length)return n;const a=this.getTargetId(o),s=o.getRenderingEngine(),l={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let i=0;i<r.length;i++){const d=r[i],{annotationUID:h,data:m}=d,{points:f,activeHandleIndex:p}=m.handles,v=f.map((e=>o.worldToCanvas(e)));l.annotationUID=h;const{color:I,lineWidth:A,lineDash:y,shadow:T}=this.getAnnotationStyle({annotation:d,styleSpecifier:l});if(m.cachedStats[a]&&null!=m.cachedStats[a].unit?d.invalidated&&this._throttledCalculateCachedStats(d,s,e):(m.cachedStats[a]={length:null,width:null,unit:null},this._calculateCachedStats(d,s,e)),!o.getRenderingEngine())return console.warn("Rendering Engine has been destroyed"),n;let E;if(!(0,u.isAnnotationVisible)(h))continue;if((0,c.isAnnotationLocked)(d)||this.editData||null===p||(E=[v[p]]),E){const e="0";(0,g.drawHandles)(t,h,e,E,{color:I})}const C=`${h}-line-1`,b=`${h}-line-2`,S="0";(0,g.drawLine)(t,h,S,v[0],v[1],{color:I,lineDash:y,lineWidth:A,shadow:T},C);const x="1";(0,g.drawLine)(t,h,x,v[2],v[3],{color:I,lineDash:y,lineWidth:A,shadow:T},b),n=!0;const D=this.getLinkedTextBoxStyle(l,d);if(!D.visibility){m.handles.textBox={hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}};continue}const _=this.configuration.getTextLines(m,a);if(!_||0===_.length)continue;let P;m.handles.textBox.hasMoved||(P=(0,w.getTextBoxCoordsCanvas)(v),m.handles.textBox.worldPosition=o.canvasToWorld(P));const O=o.worldToCanvas(m.handles.textBox.worldPosition),R="1",M=(0,g.drawLinkedTextBox)(t,h,R,_,O,v,{},D),{x:k,y:N,width:L,height:B}=M;m.handles.textBox.worldBoundingBox={topLeft:o.canvasToWorld([k,N]),topRight:o.canvasToWorld([k+L,N]),bottomLeft:o.canvasToWorld([k,N+B]),bottomRight:o.canvasToWorld([k+L,N+B])}}return n},this._movingLongAxisWouldPutItThroughShortAxis=(e,t)=>{const n=o.Zc.create();o.Zc.set(n,t.end.x-t.start.x,t.end.y-t.start.y),o.Zc.normalize(n,n);const i={start:{x:t.start.x-10*n[0],y:t.start.y-10*n[1]},end:{x:t.end.x+10*n[0],y:t.end.y+10*n[1]}};return!v.intersectLine([i.start.x,i.start.y],[i.end.x,i.end.y],[e.start.x,e.start.y],[e.end.x,e.end.y])},this._calculateCachedStats=(e,t,n)=>{const{data:o}=e,{element:i}=n.viewport,a=o.handles.points[0],s=o.handles.points[1],l=o.handles.points[2],d=o.handles.points[3],{cachedStats:c}=o,u=Object.keys(c);for(let e=0;e<u.length;e++){const n=u[e],o=this.getTargetIdImage(n,t);if(!o)continue;const{imageData:i,dimensions:h}=o,g=y(i,a),m=y(i,s),f=y(i,l),p=y(i,d),v=[g,m],w=[f,p],{scale:I,units:A}=(0,r.Op)(o,v),{scale:T,units:E}=(0,r.Op)(o,w),C=this._calculateLength(a,s)/I,b=this._calculateLength(l,d)/T,S=C>b?C:b,x=C>b?b:C,D=C>b?A:E,_=C>b?E:A;this._isInsideVolume(g,m,f,p,h)?this.isHandleOutsideImage=!1:this.isHandleOutsideImage=!0,c[n]={length:S,width:x,unit:A,lengthUnit:D,widthUnit:_}}return e.invalidated=!1,(0,h.XF)(e,i),c},this._isInsideVolume=(e,t,n,o,r)=>i.utilities.indexWithinDimensions(e,r)&&i.utilities.indexWithinDimensions(t,r)&&i.utilities.indexWithinDimensions(n,r)&&i.utilities.indexWithinDimensions(o,r),this._getSignedAngle=(e,t)=>Math.atan2(e[0]*t[1]-e[1]*t[0],e[0]*t[0]+e[1]*t[1]),this._throttledCalculateCachedStats=(0,l.A)(this._calculateCachedStats,100,{trailing:!0})}addNewAnnotation(e){const t=e.detail,{currentPoints:n,element:o}=t,r=n.world,a=(0,i.getEnabledElement)(o),{viewport:s,renderingEngine:l}=a;this.isDrawing=!0;const c=s.getCamera(),{viewPlaneNormal:u,viewUp:h}=c,g=this.getReferencedImageId(s,r,u,h),m=s.getFrameOfReferenceUID(),f={highlighted:!0,invalidated:!0,metadata:{toolName:this.getToolName(),viewPlaneNormal:[...u],viewUp:[...h],FrameOfReferenceUID:m,referencedImageId:g},data:{handles:{points:[[...r],[...r],[...r],[...r]],textBox:{hasMoved:!1,worldPosition:[0,0,0],worldBoundingBox:{topLeft:[0,0,0],topRight:[0,0,0],bottomLeft:[0,0,0],bottomRight:[0,0,0]}},activeHandleIndex:null},label:"",cachedStats:{}}};(0,d.addAnnotation)(f,o);const v=(0,p.getViewportIdsWithToolToRender)(o,this.getToolName());return this.editData={annotation:f,viewportIdsToRender:v,handleIndex:1,movingTextBox:!1,newAnnotation:!0,hasMoved:!1},this._activateDraw(o),(0,I.hideElementCursor)(o),e.preventDefault(),(0,A.A)(l,v),f}_calculateLength(e,t){const n=e[0]-t[0],o=e[1]-t[1],i=e[2]-t[2];return Math.sqrt(n*n+o*o+i*i)}}function E(e,t){const{cachedStats:n,label:o}=e,{length:i,width:r,unit:s,lengthUnit:l,widthUnit:d}=n[t],c=[];return o&&c.push(o),void 0===i||c.push(`L: ${(0,a.roundNumber)(i)} ${l||s}`,`W: ${(0,a.roundNumber)(r)} ${d||s}`),c}T.toolName="Bidirectional";const C=T},39244:(e,t,n)=>{"use strict";n.d(t,{A:()=>k});var o=n(92136),i=n(44753),r=n(24592),a=n(74119),s=n(73047),l=n(84797),d=n(21090),c=n(90252),u=n(23072),h=n(14695),g=n(1344),m=n(30911),f=n(90511),p=n(72702),v=n(11585),w=n(54177),I=n(2746),A=n(10910),y=n(56634),T=n(75403),E=n(97022),C=n(73801),b=n(83112),S=n(53891),x=n(76840),D=n(84901);const{pointCanProjectOnLine:_}=s.polyline,{EPSILON:P}=o.CONSTANTS,O=1-P;class R extends x.A{constructor(e={},t={supportedInteractionTypes:["Mouse","Touch"],configuration:{shadow:!0,preventHandleOutsideImage:!1,contourHoleAdditionModifierKey:D.KeyboardBindings.Shift,alwaysRenderOpenContourHandles:{enabled:!1,radius:2},allowOpenContours:!0,closeContourProximity:10,checkCanvasEditFallbackProximity:6,makeClockWise:!0,subPixelResolution:4,smoothing:{smoothOnAdd:!1,smoothOnEdit:!1,knotsRatioPercentageOnAdd:40,knotsRatioPercentageOnEdit:40},interpolation:{enabled:!1,onInterpolationComplete:null},decimate:{enabled:!1,epsilon:.1},calculateStats:!0,getTextLines:M,statsCalculator:b.BasicStatsCalculator}}){super(e,t),this.isDrawing=!1,this.isEditingClosed=!1,this.isEditingOpen=!1,this.addNewAnnotation=e=>{const t=e.detail,{element:n}=t,i=(0,o.getEnabledElement)(n),{renderingEngine:r}=i,a=this.createAnnotation(e);this.addAnnotation(a,n);const s=(0,c.getViewportIdsWithToolToRender)(n,this.getToolName());return this.activateDraw(e,a,s),e.preventDefault(),(0,u.A)(r,s),a},this.handleSelectedCallback=(e,t,n)=>{const o=e.detail,{element:i}=o,r=(0,c.getViewportIdsWithToolToRender)(i,this.getToolName());this.activateOpenContourEndEdit(e,t,r,n)},this.toolSelectedCallback=(e,t)=>{const n=e.detail,{element:o}=n,i=(0,c.getViewportIdsWithToolToRender)(o,this.getToolName());t.data.contour.closed?this.activateClosedContourEdit(e,t,i):this.activateOpenContourEdit(e,t,i),e.preventDefault()},this.isPointNearTool=(e,t,n,i)=>{const r=(0,o.getEnabledElement)(e),{viewport:a}=r,{polyline:s}=t.data.contour;let l=a.worldToCanvas(s[0]);for(let e=1;e<s.length;e++){const t=l,o=a.worldToCanvas(s[e]);if(_(n,t,o,i))return!0;l=o}if(!t.data.contour.closed)return!1;const d=a.worldToCanvas(s[0]),c=a.worldToCanvas(s[s.length-1]);return _(n,d,c,i)},this.cancel=e=>{const t=this.isDrawing,n=this.isEditingOpen,o=this.isEditingClosed;t?this.cancelDrawing(e):n?this.cancelOpenContourEdit(e):o&&this.cancelClosedContourEdit(e)},this._calculateCachedStats=(e,t,n,l)=>{const{data:d}=e,{cachedStats:c}=d,{polyline:u,closed:h}=d.contour,g=Object.keys(c);for(let l=0;l<g.length;l++){const m=g[l],f=this.getTargetIdImage(m,n);if(!f)continue;const{imageData:p,metadata:v}=f,w=u.map((e=>t.worldToCanvas(e))),I=w[0],A=t.canvasToWorld(I),b=t.canvasToWorld([I[0]+1,I[1]]),x=t.canvasToWorld([I[0],I[1]+1]),D=i.eR.distance(A,b),_=i.eR.distance(A,x),P=o.utilities.transformWorldToIndex(p,u[0]);P[0]=Math.floor(P[0]),P[1]=Math.floor(P[1]),P[2]=Math.floor(P[2]);let O=P[0],R=P[0],M=P[1],k=P[1],N=P[2],L=P[2];for(let e=1;e<u.length;e++){const t=o.utilities.transformWorldToIndex(p,u[e]);t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),O=Math.min(O,t[0]),R=Math.max(R,t[0]),M=Math.min(M,t[1]),k=Math.max(k,t[1]),N=Math.min(N,t[2]),L=Math.max(L,t[2])}const B=o.utilities.transformWorldToIndex(p,u[1]);B[0]=Math.floor(B[0]),B[1]=Math.floor(B[1]),B[2]=Math.floor(B[2]);const{scale:V,areaUnits:U}=(0,r.Op)(f,(()=>{const e=d.contour.polyline,n=e.length,i=new Array(n);for(let o=0;o<n;o++)i[o]=t.worldToCanvas(e[o]);const{maxX:r,maxY:s,minX:l,minY:c}=a.math.polyline.getAABB(i),u=t.canvasToWorld([l,c]),h=o.utilities.transformWorldToIndex(p,u),g=t.canvasToWorld([r,s]);return[h,o.utilities.transformWorldToIndex(p,g)]}));let W=s.polyline.getArea(w)/V/V;W*=D*_;const G=.01*(R-O),j=.01*(k-M),F=.01*(L-N);O=Math.floor(O-G),R=Math.ceil(R+G),M=Math.floor(M-j),k=Math.ceil(k+j),N=Math.floor(N-F),L=Math.ceil(L+F);const $=[[O,R],[M,k],[N,L]],q=p.indexToWorld([R,k,L]),H=t.worldToCanvas(q);let Z=0,z=[],X=0;const Y=(0,T.A)(p,((e,n)=>{let o=!0;const i=t.worldToCanvas(e);return i[1]!=Z&&(X=0,Z=i[1],z=(0,y.getLineSegmentIntersectionsCoordinates)(w,i,[H[0],i[1]]),z.sort((function(e,t){return e[0]===t[0]?0:e[0]<t[0]?-1:1}))),z.length&&i[0]>z[0][0]&&(z.shift(),X++),X%2==0&&(o=!1),o}),this.configuration.statsCalculator.statsCallback,$),K={isPreScaled:(0,E.u)(t,m),isSuvScaled:this.isSuvScaled(t,m,e.metadata.refer